{"_id":"@nestjsx/crud","_rev":"65-0dc8a0fc5b819bf8fd0eb1f572cfa59f","name":"@nestjsx/crud","dist-tags":{"latest":"5.0.0-alpha.3"},"versions":{"0.1.0":{"name":"@nestjsx/crud","version":"0.1.0","description":"Nest CRUD for RESTful APIs","main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/zMotivat0r/nest-crud/issues"},"keywords":["typescript","typeorm","nest","rest","restful","api","crud","factory"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.0.0"},"homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@0.1.0","_npmVersion":"5.6.0","_nodeVersion":"9.11.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-uxkL7TWar99jPgzquDlb5yitvQDG/nWI+j3uFN2cEg55g6JweqfJ354UUxbtjGnSKvStF4sEWpJgUQcJ8AK4HQ==","shasum":"3fe1478a0498c8c7f61b0e9c6e436165293cbd23","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.0.tgz","fileCount":18,"unpackedSize":16137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/90JCRA9TVsSAnZWagAAcuYQAIr9T7253uUomUkPrwX0\nXtB44qDOBw33lkAO68Km6PD7c8BlgGbK1xmJu7BHBhTFrKAjgwIX2eVOBTCt\nzT9dcXYLPGQ7rlen3R2mHDxQ9F9B0HuZ9ezvNZ8CC8eD8fKCTvQl51+MZtt+\nfdWGKXJYZqh4zr9BM5NdsgleY6htVVGDUdnscuY0/+kdmJeDBUJVG2ICQwKk\nEw6i73Dz8czAe3xQhG/VZX0GmKN3gu8kYTi7YZn5Wm2Gj1DkIXcbnU4mTsEP\na4UkqLEhLJmhqy6tdIiVAztx5wtOvW07pAVomOp9NjJd37rmc0MxgFDohLV3\nfxhcIeI9M+qV8TZaP1Z6lS14WVumdq4vT6SFi2ZxvCYKChHx6FmPBEkUxYZp\ngewHNxBxPT31w7B+DbcvnLufkinnLTiKU0BB2bDJcY9eyRkI/yea0LFhzLHK\ndOoCvd+jILrKE6Q8uVQ+ghLMjouBwplHiIkRkzuy1I6LZHMRVOeh8j2rfLwD\nIeEEI1rsvw4tSTaRYbVMALxnJouBHhQPKgiHPY18v3+6iMDNzn9LbiY66QoU\nmfWmxEGWWA55hLiwJy7C5fIv60WP5O4UGNElQPv2lNnS+dOcm+4It8bosiWh\nL5S3SdbyBBg52bP3JBvnHlRcjEv0WAo2YGBkC5S3Zc5ftoBfU1HqMjJ3kygC\nn+TS\r\n=W6cq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPBKypIiLSajkV5VHz1OtnnwyrgKBrqZyvqw3zu0SyBAIhAJa8aW/UMV3X2ZwO+5Hjk7oscGyBbs5ZC+qwHrsrrvYg"}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.0_1526717704684_0.2945171142519263"},"_hasShrinkwrap":false},"0.1.1":{"name":"@nestjsx/crud","version":"0.1.1","description":"Nest CRUD for RESTful APIs","scripts":{"dep:check":"npm-check","dep:update":"npm-check -u","lint":"tslint --project .","test":"jest --verbose --coverage --config ./jest.json","test:e2e":"jest --verbose --config ./test/jest-e2e.json","test:all":"npm run test && npm run test:e2e","coverage":"jest --verbose --coverage --config ./jest.json --coverageReporters=text-lcov | coveralls","clean":"cd build && rm -rf `ls | grep -v \"LICENSE\\|package.json\\|README.md\"`","build":"npm run clean && node_modules/.bin/tsc","prepublish":"npm run build","publish":"cd build && npm publish --access public"},"dependencies":{"@nestjs/common":"^5.0.0","@nestjs/core":"^5.0.0","@nestjs/testing":"^5.0.0","@nestjs/typeorm":"^3.0.0","reflect-metadata":"^0.1.12","rxjs":"^6.0.0","typeorm":"^0.2.6"},"devDependencies":{"@types/jest":"^22.2.3","@types/node":"^10.1.1","@types/supertest":"^2.0.4","coveralls":"^3.0.1","jest":"^22.4.4","npm-install-peers":"^1.2.1","supertest":"^3.0.0","ts-jest":"^22.4.5","tslint":"^5.10.0","typescript":"^2.8.3"},"gitHead":"c29892e165489ab50460a5458304c8769e05ce6d","_id":"@nestjsx/crud@0.1.1","_npmVersion":"5.6.0","_nodeVersion":"9.11.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-gCZ6QaGngajNuo/MhTujfxY1atxB1sdu4iu8r+mx49zZIRXeWZahPSnfAyT5F0lVun9gXLcbJ76QbvaG5peS8w==","shasum":"61ad4f0a746be1fb58f4f75dc67cd3de22b6bdf6","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.1.tgz","fileCount":38,"unpackedSize":33402,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/+VaCRA9TVsSAnZWagAAAl8P/A3ek+e4WtFA5FpwbeHQ\nfLCvhiN1LBIRBMbYq2ORwk4xYDR0tgBQY3JAKkUYzcC8S4tOwDHWDKv9AIL6\nAeygQbzV9ftuSOpC4n0KP9gbv6CVJiOAxyK1NpCT2PCdtcTZqgdrYM6E6Yed\nt2rKXZ6K8g3yD9ZGbMUM/sB895j/rMpzlVn+l1w/2F4IYrqfmR5S3TlJ/MKO\n0XMutlixQXi7rodOt5BE1oPbhBUsJG0Iig6ezMUQB0QmzefavtXFkfaosqzS\nwSz+mxY5Hy20gq6InTDDGt9mYa/LtBxNlEU6hiVkf+unSRkLyg5yssRBHSBL\nXXuBpae+Nmbh8FyKGLDTYdg9jQoRoZPTxV/CUZbkjD/I8TJPe+VDhJCEt/0B\ntkYY/JGKi6K5kYeU6MF5+15re7aGO9wSoR4Tr8ToDe0QM3WAXRJUkwdRJgfe\nVHTiRjMAa1o6zyJdsEjKNK9LHUrghV+u/4jzAEMW4g8NEzcqBbNUzYFgvXPX\n7Px/rdV/sJ5PDKnGJlQfrl505fRMMuw97INcKN/2VtI5CI1WQZejFz8m1g3b\n1B5qQIyE94aoLeAq460Mbv4YtaoTFTDVLLlYnYfJcZKsJxDEqsw9gZSlPFfu\nFqVMhmzzxNooMmbNPr89ZT6Ib32PwyM7AU2dqa4i8zgx8ZQLoxZIHcYHwkNX\n9Tm6\r\n=Wc8H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvF0JDedLsdc/SqVeH3sl/Jlsk3ZqfqJgAtN22dziCkwIgZ9Bmpj/ZgMGBQDq1cMS7hK958CQgeg07Fh0F/76Opao="}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.1_1526719833373_0.18241336058530333"},"_hasShrinkwrap":false},"0.1.2":{"name":"@nestjsx/crud","version":"0.1.2","description":"Nest CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/zMotivat0r/nest-crud/issues"},"keywords":["typescript","typeorm","nest","rest","restful","api","crud","factory"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.0.0"},"homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@0.1.2","_npmVersion":"5.6.0","_nodeVersion":"9.11.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-NHmx4DhNfzXP3WFzbAxGoZ6K+TnyIU7dUcwZoUFo01xFIPM3VYSnFlFIaxnNKdR1DKGDLoZfazkJBKMWOKd6fw==","shasum":"5805633138c415b64c4aa0709c8318514627d792","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.2.tgz","fileCount":18,"unpackedSize":16112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/+YfCRA9TVsSAnZWagAAmX0QAIxGWhhEhzQZfw/CWKhm\noP2GPvM6AoRKvoXgM60fMF/M4Xb7gTgF/jsQTK9s12DznNtWJjAqCQuk1/Xh\nKe839Pd0pLNnFGebCZTLbK1KjRCcksX8wP+kVSelrYFP5hRycG4CnyjCrRtz\nyaP4ZxRX0eFcCIr8lx9AjC3GBrDbcTf6LEqPSvGKXl+PBp2Rl8hccEUmG0J0\n0FMPgWkKSpVFIycLAHAB0QbNQxeMWfgTLQhYA8ofpwvUtVf507udP4Ud/O0e\n4MKIKPKJu0x5KxcB1Dd83TbwFgZsbTKJi7BjKLv32OqKiUja+K93UlGJ+xUy\nsvHrKpKao22alxHyQzFx++BNXbdLvHG2b6EjU5viGrTg/s+77RZEXATAI4tD\nF++z+ByWY5C9XJUxF5fUR8lMNUPv1ev8yf8kQbXm88jM7oBtHGNxx7TB0Aac\nOhR0YGuPiU0yQBGxsbgKe8c2TpWwCOZCHpn3EyMgCGYUfKbiOIi/ggokX++H\n/PzPgHVKEReBbzzNUvdDJrkCZD+H3HxeUYMwO1vCcLTjMx+erCKTwp7P5WQ0\n9er0eVLL5uJeECCGInpcaGzRXNe0g3WgZLgAnNDZJvATZfEK2dg2gXkCAwqJ\nuNhcuu8my+fbBbVAWWuPAwqO5VDQVnZtngzlWaxPgNvjHfRSvpGUO6IMfXJM\n9VYR\r\n=7BaO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOB6XURIt1dFPXqluAoJk3fBo7Uy4vxAxVcKdRfSdQrAIgEmki+MLl6ZxL/ZsjtMndDpVc+Z58s20puQ0aVZMgy2o="}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.2_1526720029804_0.5410686388516881"},"_hasShrinkwrap":false},"0.1.3":{"name":"@nestjsx/crud","version":"0.1.3","description":"Nest CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/zMotivat0r/nest-crud/issues"},"keywords":["typescript","typeorm","nest","rest","restful","api","crud","factory"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.0.0"},"homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@0.1.3","_npmVersion":"5.6.0","_nodeVersion":"9.11.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-C+Alv+Bh8PK5+ggi5FKaJYuofcibn4GbqWXWhnD9EzrrX1U+wf9m/da9JFiO1cEbI8GzUMf0VFhTijGBywBoGQ==","shasum":"ec3548938846bfe222b4aeb699fff3506176f2c0","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.3.tgz","fileCount":18,"unpackedSize":16532,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbAAY5CRA9TVsSAnZWagAAoeQQAKK5N6OV7dmgPVf8y+TI\nIc7yHSBLf26O9oAz5MMDfza9/D6EuNRO+QPNFcXknZ6lDFAja/79frUJ0pO0\nAEXf3QtkLC4MrC1Qj/+kOgtpZpvKg7EFlOaVkGJ9wMGhSfc2xKW42st8m9fa\n7q7D7JpynFFhz0LJiaw1LKpdt5NX/Bfyt/T+wQAUn87hiJvJMWdWoHQLeVVD\nknLOAXPqe20KR+yPt7FHHHt2rbmIBNWuoTPr7DIIy4Az/ZLo0jObW7nZ3457\nQwqKvhy2eX5bgpps+4nT9AA6M3CY+8Cx00rLF4tqy6gGpoa5Sg9/kF0GZQPl\nMQD1k/yZrmEpA7nHL7tFTAfBtyhuEv03bluVtXrZhSOsrvklUkr8Vg7Agx4a\naxCTJ/CzUwViTV5YwFu/CrJFxOCVihFO9ZqqCp6gBd2xhNElfT3NXeDKTt82\nGPPjQrmgtRk/YuHivfQRcJff083XtINThxIxhVhDqNRzD6nrailr95/+I5zw\nlPIh5KKdK9H2CR9IdOXhK1nDUTVDx4VCUQA94b7CTgmTi0Dg4sy11geOi2Pj\nt4TOu1jaBEQ1CLTU7x8439j6vp20DXK952ReeC05PzscA6fUZ4Bh+OpUysVq\ni4pOv6+v8pnudV21KVfY7YyG2bibKDHUBxGk6zeoATSwXxqS4tDGC1PzJrX2\nmVjd\r\n=TwtY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFamjSsVtoTSyua/Z1IROJlvmgljKvGwlW2s6Q1bhWGNAiBPjJwBEv3Z5LHAybKLez1jI7XVsxVsxuboP1VsLZLOsQ=="}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.3_1526728248576_0.5074428766482426"},"_hasShrinkwrap":false},"0.1.4":{"name":"@nestjsx/crud","version":"0.1.4","description":"Nest CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/zMotivat0r/nest-crud/issues"},"keywords":["typescript","typeorm","nest","rest","restful","api","crud","factory"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.0.0"},"homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@0.1.4","_npmVersion":"5.6.0","_nodeVersion":"9.11.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-JZRY6eCbf1wFOwKjh70tx4jSwjPyugzzD0zwKglaY8OnN+xqgp4reW2P4UHsNbK8MHGbWfZ/d7TpT+TWFGf8LA==","shasum":"047815f13251344794745c15304b870c11ec2da3","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.4.tgz","fileCount":18,"unpackedSize":17284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbAGScCRA9TVsSAnZWagAAX18QAI2G0kjstMx12+G9AE7H\nOsXKc5KXIJcsT2yy89e2fyFhJ5SuLb2lLvIkpRtGt7lCoZRzzmbt25/1wm50\nefKHUEgawRwmj9ZrcadCbeYiiV31XfckJficAWfKaQwZhTyukEocFf9/FyqO\nc7LjdFpE51YjXVvncjJl9lw+hr6rmq6mOKRqss93JCozWZvgOqYTTW2cUdcb\nn7SeUEJEhvQ6xCqZeXosrmI5J8myUdvqCSlMJCusfA2E+9LSP1pumLm2CEV4\n47JNPt7drAOWVOMBX0YKtG4M0rG66WhxaYRFmAmDreaG60Zhkrp/Cima835T\nWNRaZLZgZFmxezyzmObJkjR/nl9AgbUiM5xSUZqxYjbH+egJYiuBpD4CNql/\nRUAATkGTpL9ZMotTrTOY3rBlsVH3FY7uGVVHTL1vjfhMYhWuxwLYwUScccrJ\n+cmT0yT8yrEC56NUD6Lm03qp0s7OIwUREjhqTymxIjvrQRKCeVm1aey5t/m7\nQhz5BPynp6cZnAHiEvK1aDZTcPc84+ln2DY5CxMR5vpqt9HICtpu42bdKuPC\nTT6YkseV9sDPAxHqQHxl+7baG/MN2AAegnE/rPPClVhYpoePmSWrK3DgvlFn\ngaFYp+lPJJRAQcCq7DfcPtKEKoqdnvaBvLv4m87bb+8DP6/9808k1sErPr0+\npBm8\r\n=0QQg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDI0xlFkvozosrr5MA1FEd0yN3YGXcgVyxB36n3Js+RaQIhAIGUXWzPmM1tfItLicjQR2xPflsJiM1UrYnl9wZy6jvi"}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.4_1526752411041_0.14780618516684485"},"_hasShrinkwrap":false},"0.1.5":{"name":"@nestjsx/crud","version":"0.1.5","description":"Nest CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/zMotivat0r/nest-crud/issues"},"keywords":["typescript","typeorm","nest","rest","restful","api","crud","factory"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.0.0"},"homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@0.1.5","_npmVersion":"5.6.0","_nodeVersion":"9.11.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-iZBBbR/GGBSZy50GfblTJNRfoAmSKsw+iJDIfdb5wlmVx2LqwXS/K5GC8POKWwBE20gr3xCSo8YH9vIouhqSLg==","shasum":"3ca5cb441b60c40e32ac7339f2eaf414bfca211e","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.5.tgz","fileCount":18,"unpackedSize":17539,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbBQXkCRA9TVsSAnZWagAA39gP+gM8KPKpPu/7wQR3cGOg\nfTLk6LTg8RfWsrN0Ob6Qq0j9arBEFNttLjXnbtV662BQSimUYV3Q8zBhfHt9\nOBnEHp2gWfEioGYh3TGwXxQvQiTam0z9JJv3BHM3mYSQa4cvuZ5OwPovDCK7\notmwzUzwbyJ70eu+wIjhpCqYjNVXH1a4rGYU+xHTE7iWJ2nPNi3aZll3Eqvt\nt9wXBgImsKOJjl6UiyXMYxIAPpWGDNOBQlf7jiQ00FgbucXxIudKl77HRdfh\nr1cxnSiLCXg9665uQVjKdWzSf9Su7Vroglt3EfxyskBgF/LgVT2cbHYE4l3N\n06u18HlNE1GCZIKqli/g2PvpY9L3gdKtyIx7zxpEDiRRITaYxzaRTQuBVdy1\nQO8Uft4Y3JeJRMWBCMCBo/qvRvZuVnv+XvWVQXTguFXgIuvvQpcU1tqu1Gif\nP4IqlMz39vJp2gUrcb3S+wg5mx3Q4zvrPJ58ZClBzS54Iaj4O0/fhUOhBvnH\nxLmixIT3PJGCztvolk+4cGYzkzbGLKrc2IkH5HFIlhjx7NIu8VQwz9ogegat\nQ1VzZzMoJmLuQEqBcs2uYLVgKOzZo3YOlNED1XwVMbDtLQ2NYAC2qz2ZOmq/\nqWQFmGmtTiUbfTjGGV3+NPG4+JsTDs3ZERJYV5/dcdRUb9vcT2r1VEx3GF+v\no7xD\r\n=MlpR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDRyNjfUX5YaCZuV0aXhsgqrCrVsBezw2uW7JXofqcmqAiAzrvcie+LOS41mMOm/IEMZKD6mfb8vcjMUQq2NpipXEg=="}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.5_1527055842458_0.9935247703781516"},"_hasShrinkwrap":false},"0.1.6":{"name":"@nestjsx/crud","version":"0.1.6","description":"Nest CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/zMotivat0r/nest-crud/issues"},"keywords":["typescript","typeorm","nest","rest","restful","api","crud","factory"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.0.0"},"homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@0.1.6","_npmVersion":"6.1.0","_nodeVersion":"10.2.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-ZMdaZreJ+2PBshcGUuhbux+eK+zN5Madm3pGkean/BRuMDr90dwyF+UB+KWO7fUPdUwc78MeK6gMMtiFgPvshw==","shasum":"7ef5b74dcbebb1b7943bc2bb201c72911e16a0a2","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-0.1.6.tgz","fileCount":18,"unpackedSize":17556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDVkvCRA9TVsSAnZWagAAWCcP/RSihQ4dRegkdjDmIyaD\nhkiovGN4waH3i1UWPFFpEi96Cbd0W+I7/eXQKIEQa5OIjtRcLTUCn5q5cP2z\nlWR2xwGqgIMOYDBM/ofq0Rm/1apy0RmlMmfgzHdRIFVtMx0XG4BeLecbDI1L\n+RIres2ruJz55ugxnQ6DZwk5UN4vofMXBF7au1Ndk6r3wnubD44eCvbonYz5\nH96hnKcjXa3lyDxQVucm2+qNxPpb0SAg/Hbl79vrwVtrFn6Urh9mVWQbLKT8\nc88/pENNzgk2RmV07f6j2i0U+NX6rZa5NQCUkB14VjxD/dFRSkNKyFaTfamE\noYOBrrsarYjXYbUQRK02EgX7T+Xb9UDMWK6hPfyFapAlHTsuT7m5jA3JWcLt\n+G67/vmIMeuKXmh0dJhnE3TtrKzFZWgHdoVU8qcMeEZh/unpADSF4moWGIKo\nRn5LcrAQxKxxUOMTUr7RlaLLLW/rXiOusHxviqn78c4YJmdIVgZeTqHy4QB4\n8Z0UVjAY6o6oRXA7FqZtSbWRCG0baBflaLl6bj+LfG81EPy2ilnRioPyY7jV\nMBOt32EIIBKmFl7awfGthHCyvAiFkldpbbZ+BHwq9tDJ+KX6Xxsz4Lyn8B2+\nW3+IMepx58YBbGG3Vxkh6/E2oTJgCLvzVDCF18ib78x11FS82ks7/uquKxYl\n/nNj\r\n=KLEs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAIOwQuPxGtwj5zKHtqm9+HtUvXv5KvjRx4PmkVHB41TAiAXg+qzs0UCXwM5QrHkr+BGpGq58rJ1emXPm2NSDPCOFw=="}]},"maintainers":[{"name":"nestjscore","email":"admin@kamilmysliwiec.com"},{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_0.1.6_1527601453750_0.9424694358733932"},"_hasShrinkwrap":false},"1.0.0":{"name":"@nestjsx/crud","version":"1.0.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.4.1"},"readme":"[![Build Status](https://travis-ci.org/zMotivat0r/nest-crud.svg?branch=master)](https://travis-ci.org/zMotivat0r/nest-crud)\n[![Coverage Status](https://img.shields.io/coveralls/github/zMotivat0r/nest-crud.svg)](https://coveralls.io/github/zMotivat0r/nest-crud?branch=master&&service=github)\n[![GitHub license](https://img.shields.io/github/license/zMotivat0r/nest-crud.svg)](https://github.com/zMotivat0r/nest-crud/blob/master/LICENSE)\n\n## Nest CRUD controllers and services\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services in Nest applications. It can be used with TypeORM repositories for now, but Mongoose and additional functionality will be available soon.\n\n## API Methods and Endpoints\n\nAssume you've created some CRUD controller with the route `@Controller('cats')`. In that case, Nest will create endpoints as follows:\n\n#### `GET /cats`\n\nRes Data: _array of entities; an empty array_\n<br>Res Code: _200_\n\n#### `GET /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Res Data: _entity object_\n<br>Res Code: _200; 400; 404_\n\n#### `POST /cats`\n\nReq Body: _entity object_\n<br>Res Data: _entity object_\n<br>Res Code: _201; 400_\n\n#### `PUT /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Req Body: _entity object_\n<br>Res Data: _entity object_\n<br>Res Code: _201; 400; 404_\n\n#### `DELETE /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Res Data: _empty_\n<br>Res Code: _200; 400; 404_\n\n## Using with TypeORM\n\n#### 1. Install\n\n```bash\nnpm i @nestjsx/crud typeorm @nestjs/typeorm --save\n```\n\n#### 2. Create TypeORM Entity\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Cat {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n#### 3. Create Service\n\n```typescript\nimport { CrudTypeOrmService } from '@nestjsx/crud/typeorm';\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Cat } from './cat.entity';\n\n@Injectable()\nexport class CatsCrudService extends CrudTypeOrmService<Cat> {\n  constructor(\n    @InjectRepository(Cat) private readonly repository: Repository<Cat>,\n  ) {\n    super(repository);\n  }\n}\n```\n\n#### 4. Create Controller\n\n```typescript\nimport { CrudController } from '@nestjsx/crud';\nimport { Controller } from '@nestjs/common';\nimport { Cat } from './cat.entity';\nimport { CatsCrudService } from './cats-crud.service';\n\n@Controller('cats')\nexport class CatsCrudController extends CrudController<Cat> {\n  constructor(private readonly catsCrudService: CatsCrudService) {\n    super(catsCrudService);\n  }\n}\n```\n\n#### 5. Connect everything in your Module\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { TypeOrmModule } from '@nestjs/typeorm';\nimport { Cat } from './cat.entity';\nimport { CatsCrudService } from './cats-crud.service';\nimport { CatsCrudController } from './cats-crud.controller';\n\n@Module({\n  imports: [TypeOrmModule.forFeature([Cat])],\n  providers: [CatsCrudService],\n  controllers: [CatsCrudController],\n})\nexport class CatsModule {}\n```\n\n## Tests\n\n```bash\nnpm run test\nnpm run test:e2e\n```\n\n## Roadmap\n\n* [x] CRUD for TypeORM\n* [ ] CRUD for Mongoose\n* [ ] Expose as Dynamic Module\n* [ ] Swagger integration\n* [ ] Working with relations (extending CRUD)\n\n## Thanks\n\nThis was inspired by [nestjs-generic-crud](https://github.com/xavism/nestjs-generic-crud)\n\n## License\n\nMIT\n","readmeFilename":"README.md","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.0.0","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-2lIke30JOl1cPr34F3fkgJVBvZt8Ik8qFu2HKnN/+Fn5G6CSJeBLZH/BIcIitOIPFdGjCYvVGhSo6HKwiwRumQ==","shasum":"180421b5d40bea0447cb16a385fe37c9e6d58aee","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.0.0.tgz","fileCount":84,"unpackedSize":81647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcCtbFCRA9TVsSAnZWagAATtwP/3guFpmnTbCu3MHlnGez\na6ipGj3EOVPDrMRsjWnrbDbMxXCGrlPD+d5LcF1mk70kk0xFVcPuyG4aJpiw\nYfbPL6VSR2XKX2RTpcKcOEAWab5KQ09wDrnUIXj86VJ4lZT+EaZruAwLRSGm\n0fFQZJbxSUYxYZETJp+DO5BBU4BevnQaRb3Ytqnfi6aiungJBcbrxLgs3hZP\nWsXG+9zPbBXvaF2CGnpQfj/iZz1sGvrAhmUpAJzOo0e4uG3fXdSVTiJlqYGz\nMnSvo6m7txjQXWGrm2DGta47AuknApbCmnudEdGyQ4/EufU+URLk7wuENyxr\nbYouy7vbUdKyL48sHG5hYFOujaVSWhFL8BGAUtefwTlkKTFmln0lbl1VYTlQ\nIi4Pyeo1Sj1itMVwgX6bV3rZ9dIAAyakdGH6JCHFVL0m2s8rG2FSQ0kRvgcY\nMlBe4fpoFcmQSlrrqyVmjnmSOlmPKuoUI7fZof4sPnKz/WipeVK5Bs5rv1fD\nmw7x/ANzRE1I7+ot8qPc4TkFlbhAZhD6kJQHRha95CUdL70oqmnFgzEyLcYm\nKfxO7T9JHTnBTYicdZrNxbvGJIWcpRqUuxZ58MM7Sikz+tEUhEVRqlsCc4SC\nY4W84KJ+dboMt8kZUgPQDmRdusNR3GpDifAfc1vUYESQxtCDVT6QO++WdyAl\ng1a0\r\n=3qoV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB64gB9qc3Z/nTR+ZtGbpcxRlNoBIOixgf0D+ViwDp2jAiEAyysu+i8Qr7fsgu3pidK9cbWg5Ab3fCAxVe4IBOB2MwU="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.0.0_1544214212320_0.49680992394880086"},"_hasShrinkwrap":false},"1.0.1":{"name":"@nestjsx/crud","version":"1.0.1","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.4.1"},"readme":"[![Build Status](https://travis-ci.org/zMotivat0r/nest-crud.svg?branch=master)](https://travis-ci.org/zMotivat0r/nest-crud)\n[![Coverage Status](https://img.shields.io/coveralls/github/zMotivat0r/nest-crud.svg)](https://coveralls.io/github/zMotivat0r/nest-crud?branch=master&&service=github)\n[![GitHub license](https://img.shields.io/github/license/zMotivat0r/nest-crud.svg)](https://github.com/zMotivat0r/nest-crud/blob/master/LICENSE)\n\n## Nest CRUD controllers and services\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services in Nest applications. It can be used with TypeORM repositories for now, but Mongoose and additional functionality will be available soon.\n\n## API Methods and Endpoints\n\nAssume you've created some CRUD controller with the route `@Controller('cats')`. In that case, Nest will create endpoints as follows:\n\n#### `GET /cats`\n\nRes Data: _array of entities; an empty array_\n<br>Res Code: _200_\n\n#### `GET /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Res Data: _entity object_\n<br>Res Code: _200; 400; 404_\n\n#### `POST /cats`\n\nReq Body: _entity object_\n<br>Res Data: _entity object_\n<br>Res Code: _201; 400_\n\n#### `PUT /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Req Body: _entity object_\n<br>Res Data: _entity object_\n<br>Res Code: _201; 400; 404_\n\n#### `DELETE /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Res Data: _empty_\n<br>Res Code: _200; 400; 404_\n\n## Using with TypeORM\n\n#### 1. Install\n\n```bash\nnpm i @nestjsx/crud typeorm @nestjs/typeorm --save\n```\n\n#### 2. Create TypeORM Entity\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Cat {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n#### 3. Create Service\n\n```typescript\nimport { CrudTypeOrmService } from '@nestjsx/crud/typeorm';\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Cat } from './cat.entity';\n\n@Injectable()\nexport class CatsCrudService extends CrudTypeOrmService<Cat> {\n  constructor(\n    @InjectRepository(Cat) private readonly repository: Repository<Cat>,\n  ) {\n    super(repository);\n  }\n}\n```\n\n#### 4. Create Controller\n\n```typescript\nimport { CrudController } from '@nestjsx/crud';\nimport { Controller } from '@nestjs/common';\nimport { Cat } from './cat.entity';\nimport { CatsCrudService } from './cats-crud.service';\n\n@Controller('cats')\nexport class CatsCrudController extends CrudController<Cat> {\n  constructor(private readonly catsCrudService: CatsCrudService) {\n    super(catsCrudService);\n  }\n}\n```\n\n#### 5. Connect everything in your Module\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { TypeOrmModule } from '@nestjs/typeorm';\nimport { Cat } from './cat.entity';\nimport { CatsCrudService } from './cats-crud.service';\nimport { CatsCrudController } from './cats-crud.controller';\n\n@Module({\n  imports: [TypeOrmModule.forFeature([Cat])],\n  providers: [CatsCrudService],\n  controllers: [CatsCrudController],\n})\nexport class CatsModule {}\n```\n\n## Tests\n\n```bash\nnpm run test\nnpm run test:e2e\n```\n\n## Roadmap\n\n* [x] CRUD for TypeORM\n* [ ] CRUD for Mongoose\n* [ ] Expose as Dynamic Module\n* [ ] Swagger integration\n* [ ] Working with relations (extending CRUD)\n\n## Thanks\n\nThis was inspired by [nestjs-generic-crud](https://github.com/xavism/nestjs-generic-crud)\n\n## License\n\nMIT\n","readmeFilename":"README.md","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.0.1","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-UlKdkCJj1LwiMX4GerFi7KcIvsmyrxra0LytgqXRPBp+JYq0U4aWC2vvwwvTLNhv3iSIbWGuI3fIKdoC4oL8rg==","shasum":"0494eeca1ed2d24087c8359f031efafd83330cc6","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.0.1.tgz","fileCount":84,"unpackedSize":81627,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcCtlvCRA9TVsSAnZWagAActcQAJeRdGxehnOqpdWYy9ze\nkG7mDZ+b+6X5yieT0rbGd9pst2JdrYKatMBwr52TOAhbEqWZkE1HsA3b54Yf\nmtmIIvG1J361rVY5gxD/QJLYJQPOkmMCtzMK5nugFlts7mUe+AHyYp40b9WK\nG5hTfhEeHz1s8yO2zKn9CE9KT6LLbCW5wLlC/7KqW9KHLOKwfV2iktHC26pW\ntC/cuewr66lvNze+dXLa1lMz+diiE23p7yqqtlRsSch62c6BUlbrUabdRmgA\nT0+0sJsgSfDyfBGmgzFuXdGMdLIKfI882mXfHtPJG8X/3+Sf2ZkqetudpGBN\nytGHWNzrRdvzuqLpM4tsRbnBXV6cdldS71fZw5JMuonMylYx4tURhY/gGIMI\ncKgrbo5eU/sCVzyIReiTDx97j72R1NcTkhwpFPd3P9uv/ENHDKmJJrcG+kGx\njGocYnaxbKjcxJvPug7SISL41CY2IqQEYnQ7jEXJ8v/TNMuv2BXNmclbvdQJ\n5Y8CU1dGfjoZxWfByx37CPax9LbuaIcGOZvvSU9jGpf0DdbJocSeEcbHQDP1\nZo+I2R1w3C0D+U7aLwdeTH5HHFcL9m9Sw+TzKlk82FsNfSM0UWO74phYZP9/\nl8QFtCbYFh/ormvtvNDzXAzyrAfMwQvqW+O1oFyROY57LNGpZthROnkLA2yF\nQ4Lx\r\n=qN6W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDviCO/xE+X9iyJOOHTxwwuc1/Q7nqSRr/Xt6g9+2boUgIhANiW5AKOXHqHG7K10oXUQGO23ycyqmQpgy2A2C7bq+n6"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.0.1_1544214895118_0.9890599537596325"},"_hasShrinkwrap":false},"1.0.2":{"name":"@nestjsx/crud","version":"1.0.2","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.4.1"},"readme":"[![Build Status](https://travis-ci.org/zMotivat0r/nest-crud.svg?branch=master)](https://travis-ci.org/zMotivat0r/nest-crud)\n[![Coverage Status](https://img.shields.io/coveralls/github/zMotivat0r/nest-crud.svg)](https://coveralls.io/github/zMotivat0r/nest-crud?branch=master&&service=github)\n[![GitHub license](https://img.shields.io/github/license/zMotivat0r/nest-crud.svg)](https://github.com/zMotivat0r/nest-crud/blob/master/LICENSE)\n\n## Nest CRUD controllers and services\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services in Nest applications. It can be used with TypeORM repositories for now, but Mongoose and additional functionality will be available soon.\n\n## API Methods and Endpoints\n\nAssume you've created some CRUD controller with the route `@Controller('cats')`. In that case, Nest will create endpoints as follows:\n\n#### `GET /cats`\n\nRes Data: _array of entities; an empty array_\n<br>Res Code: _200_\n\n#### `GET /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Res Data: _entity object_\n<br>Res Code: _200; 400; 404_\n\n#### `POST /cats`\n\nReq Body: _entity object_\n<br>Res Data: _entity object_\n<br>Res Code: _201; 400_\n\n#### `PUT /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Req Body: _entity object_\n<br>Res Data: _entity object_\n<br>Res Code: _201; 400; 404_\n\n#### `DELETE /cats/:id`\n\nReq Params: `:id` - _entity id_\n<br>Res Data: _empty_\n<br>Res Code: _200; 400; 404_\n\n## Using with TypeORM\n\n#### 1. Install\n\n```bash\nnpm i @nestjsx/crud typeorm @nestjs/typeorm --save\n```\n\n#### 2. Create TypeORM Entity\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Cat {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n#### 3. Create Service\n\n```typescript\nimport { CrudTypeOrmService } from '@nestjsx/crud/typeorm';\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { Repository } from 'typeorm';\nimport { Cat } from './cat.entity';\n\n@Injectable()\nexport class CatsCrudService extends CrudTypeOrmService<Cat> {\n  constructor(\n    @InjectRepository(Cat) private readonly repository: Repository<Cat>,\n  ) {\n    super(repository);\n  }\n}\n```\n\n#### 4. Create Controller\n\n```typescript\nimport { CrudController } from '@nestjsx/crud';\nimport { Controller } from '@nestjs/common';\nimport { Cat } from './cat.entity';\nimport { CatsCrudService } from './cats-crud.service';\n\n@Controller('cats')\nexport class CatsCrudController extends CrudController<Cat> {\n  constructor(private readonly catsCrudService: CatsCrudService) {\n    super(catsCrudService);\n  }\n}\n```\n\n#### 5. Connect everything in your Module\n\n```typescript\nimport { Module } from '@nestjs/common';\nimport { TypeOrmModule } from '@nestjs/typeorm';\nimport { Cat } from './cat.entity';\nimport { CatsCrudService } from './cats-crud.service';\nimport { CatsCrudController } from './cats-crud.controller';\n\n@Module({\n  imports: [TypeOrmModule.forFeature([Cat])],\n  providers: [CatsCrudService],\n  controllers: [CatsCrudController],\n})\nexport class CatsModule {}\n```\n\n## Tests\n\n```bash\nnpm run test\nnpm run test:e2e\n```\n\n## Roadmap\n\n* [x] CRUD for TypeORM\n* [ ] CRUD for Mongoose\n* [ ] Expose as Dynamic Module\n* [ ] Swagger integration\n* [ ] Working with relations (extending CRUD)\n\n## Thanks\n\nThis was inspired by [nestjs-generic-crud](https://github.com/xavism/nestjs-generic-crud)\n\n## License\n\nMIT\n","readmeFilename":"README.md","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.0.2","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-Nm+m+7VJhwtTIby4SN8C8LpGsZRf0Uc0mqytemunH2OhN4//3Zbnnb63XtXzV+QymPe2ffOiTQSWWAfB4QcLOA==","shasum":"814705d121d4633f9b8f61b45bd52697a89be92f","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.0.2.tgz","fileCount":84,"unpackedSize":81647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcCtonCRA9TVsSAnZWagAAnuQP/1n4W4blPmZv+KXi/41q\nHcOQaAsbIGluXfrb4BGR87qcRNz69TkBiALb7rNYMiCfkkqoXongfTlbP5Da\nrmbQQ+dUdtl00ZXbraKBQNjxO8NdPrcL6PrDkEe0nDmtgCG8IOtlKlP6Yq3l\nREqNWuamD/UZD/FM/fMIYLKRJEmYlDAPf5ZEp8GItapSerE0qiM9Ff/xAucP\nO+75XAiEKCt5wL52VA7j1zBcbkAjHtvYkt8bOYo5ktYA5frxQQJWHvXMdgii\nH8lfEUml9hfELtkDvIsM6dpK0CluzSnyEKLD38jGIdblfDk/YSpefuGzDj8z\nSpNsYm2gFGeshrBhQWbwqxUtE9liSEPhrVhd9p6ZtfzSg8gXfGImbPsnWwho\ns81wDuBYODnmVU2HbkWEHWDiFGVx9dxcepbdIqdvVe+anHoWUXT+uNJIeEn6\nB/HrsFk3hFzoHrytrJkItVvI59vh+LoV5EC43CWDyWCF/yldb00mh0Bin69Y\ntmTYAGmrD8mo8shPoikdcmCrhH11L85Aq3TNl5eg2mBe5tu+GscAKP0C7T3V\nyg6qS2RdBfha3xcWCNNtK6qMBnLBxsDvj8826AgODZnlres2z2GJZrqDU1Z2\nXLa0ln3XlafyURW2mA26G52FaBrV0Rn4mpaHQw2lsyte9UccEaYuXWnE5gNw\ntUpq\r\n=Ez94\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEySER7Vgrplp0rYc+HDt9kprPHi+N3erN72BYuGlGcYAiEAgzgLA5I6YkxD/Sm/f9/r/cuK/oBMtnLKJnV1ubtJP8k="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.0.2_1544215079187_0.40959784450689396"},"_hasShrinkwrap":false},"1.0.3":{"name":"@nestjsx/crud","version":"1.0.3","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^5.4.1"},"readme":"<!-- [![Build Status](https://travis-ci.org/zMotivat0r/nest-crud.svg?branch=master)](https://travis-ci.org/zMotivat0r/nest-crud)\n[![Coverage Status](https://img.shields.io/coveralls/github/zMotivat0r/nest-crud.svg)](https://coveralls.io/github/zMotivat0r/nest-crud?branch=master&&service=github) -->\n\n<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Validation](#validation)\n  - [IntelliSense](#intellisense)\n  - [Method Override](#method-override)\n  - [Restful Options merge](#restfuloptions-merge)\n  - [Path Filter](#path-filter)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [Warning](#warning)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud@next @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints Examples\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | empty array  \n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{...}, {...}, ...]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) (alias `skip`) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n**_Notice:_** `id` field always persists in relational objects.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {}\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse. Let's dive in some details.\n\n### Validation\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations, that could be saved/updated as nested objects\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController implements CrudController<HeroesService, Hero> {\n  constructor(service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController implements CrudController<HeroesService, Hero> {\n  constructor(service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Method Override\n\nList of composed base methods:\n\n```typescript\ngetManyBase(\n  @Param() params: ObjectLiteral,\n  @Query() query: RestfulParamsDto,\n): Promise<T[]>;\n\ngetOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n  @Query() query: RestfulParamsDto,\n): Promise<T>;\n\ncreateOneBase(\n  @Param() params: ObjectLiteral,\n  @Body() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @Param() params: ObjectLiteral,\n  @Body() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n  @Body() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n): Promise<void>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport { Crud, CrudController, Override, RestfulParamsDto } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController implements CrudController<HeroesService, Hero> {\n  constructor(service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(@Param() params, @Query() query: RestfulParamsDto) {\n    // do some stuff\n    return this.base.getManyBase(params, query);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff() {\n    // do some stuff\n  }\n\n}\n```\n\n### Restful Options merge\n\n```typescript\n...\nimport { Crud, CrudController, RestfulOptions } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController implements CrudController<HeroesService, Hero> {\n  options: RestfulOptions = {};\n\n  constructor(service: HeroesService) {}\n}\n```\n\nController can accept optioanl `options` parameter and it's the same object as [Restful Options](#restful-options). It's very useful when you have one `RepositoryService` and several controllers.\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Path Filter\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud, CrudController, RestfulOptions } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('/company/:companyId/users')\nexport class UsersController implements CrudController<UsersService, User> {\n  paramsFilter = ['companyId'];\n\n  constructor(service: UsersService) {}\n}\n```\n\nA property `paramsFilter` is designed fo that purpose.\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field. If not, you can do mapping, like this:\n\n```typescript\n...\nimport { Crud, CrudController, RestfulOptions } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('/company/:company/users')\nexport class UsersController implements CrudController<UsersService, User> {\n  paramsFilter = {\n    company: 'companyId'\n  };\n\n  constructor(service: UsersService) {}\n}\n```\n\nWhere `company` - name of the URL param, and `companyId` - name of the entity field.\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController, RestfulOptions } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { FEAUTURE_NAME_METADATA, ACTION_NAME_METADATA } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = this.reflector.get<string>(FEAUTURE_NAME_METADATA, controller);\n    const action = this.reflector.get<string>(ACTION_NAME_METADATA, handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git && cd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\nIN PROGRESS\n\n## Warning\n\n**USE IN PRODUCTION ON YOUR OWN RISK**. This package hasn't been properly fully tested yet.\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.0.3","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-RD6FA3KYOL8FiHjWyX+tNUD9+kngi88QQ9lX/aNgMi0h6GNqCsAR/8A7JKanf0WChZvbmDc54NJ56gYv5QKTPw==","shasum":"47fc94305ccaf35e5be6c2dfe26bfd094ef14172","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.0.3.tgz","fileCount":87,"unpackedSize":120820,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcFCDmCRA9TVsSAnZWagAAVD0P+gPbeYw4xBRQLYNIQ6qt\nI2+aKTB5zrU30Nv2MzlSIQd1FAQS2BRpPmucJEydJ9vAx/c8sxbfAmZNjtYR\nNQWDdg+TmHFOxbiuCIYEtGORlAtknU0CEN1oKWufnu1dlSzlPBT1UESeD/oH\nA7iR+2qhZ9uudHk8xU71sM4AWyo8CFRoT1c59dmKbzA1cEyo7c2yTlWZooC0\nQN+LVIdIHdhdN8T90h24Gl/4GMFJ6bXxjnHmr5benivK04SXe/21y27BPGzs\nVGWAjBxnpPo9wj2rAv3wirVoxp2kDdzzOaIX9tTAgW+4O4ieMCFPUnGf2L00\ncBYBKJwY9YCeQNpMxAtDFr5s/4VHi9Fx9aEhgso+3es7kTX5AhVWuJ8s1Tse\nNtT1esK/0RT4iOwTy+JTqn9x3AfSXO6WNe5Hs6gRGLEWu2dkrPND6VfMbMz3\nOMzKV8oOIRffrqrOrhC3Y9Dw4COwTneri2AdkTUfaFATR92dfmsLizzpDgGi\nfAdZAHkLTwz7UhwB+5fEtSwaa7ZQRr0Xqr3gYQ3O25y15Ln3Not2emounWfw\n8ofuCgnLlQGSNWp0GunLiw9AJjTR+bbQa614tONNOicydxW530nZrk+nyk9o\nNMcdnbEvtrcAPjrW+/nR0eTtXnyaJYNK8rUxI/uGJ49EQunf5lxYV2+NUl+0\ncaDS\r\n=SRtB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVTlOdtRK1j/GqEB2Y4I8mvPYcPat6oANom5bAmdJutAIgW6pVhppLQHfz6UNHPTwteSFowbKASqw6kz3xYbE7qUU="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.0.3_1544823013132_0.4306898955830758"},"_hasShrinkwrap":false},"1.1.0":{"name":"@nestjsx/crud","version":"1.1.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.1.0","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-qR7o+wjnhXoYvV6VspLP7lzzf43II8yNpm3S974sfO3MUU6PuECdfG9yBPgmFX/YueljoZlt+ul3guFzPXbZ+w==","shasum":"7444318f33fde07747e6f9b55e62aca7d25533b6","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.1.0.tgz","fileCount":87,"unpackedSize":121443,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcF5PrCRA9TVsSAnZWagAABcoP/RBCzaWDs+rVrU3jzume\nQSKs/+0br4gMv8uIQbMeYkplA/PL5550Sy+auDV5Jg8j+9HYDDI4ke/MNf6a\nvMCiRt/uzuig/Cm1Fve+k8whF4sPxAVZzDDgNrHTcZglwdZBOd+3vDrpIfq5\ndfm184dVX7qO8k6/0JVCxWTL4xpSugAuB9Z6WksZXA2WRRrnv3pEv6vYUEmC\nm5tYwSDJ291/zD4lSy1dE5QnGruzjpJXtIXJxw69qbKgTAXnXNEro8ofgnp0\na4tGTZYXA5IRrlrFwuxCo565f87SwcVlkUnADvsfMSaXa/ZyjGNdEbCCwLVt\n7a4A3AiNcACitOKkfHumX3tZa25P4auQ75VPfmAsndDHPn645dRfvGmfF+CE\nFSRD6crCmmq+d0ye3krpHNcOWogtAWdnOw2us8+ofu3pmjfQVElTRxbtkE6b\nZksoTdHQPZoOXV1L7/PjaCVazT6b8GhvFJAxA+KEmdxz3lX9WbkDaUtnb7Vo\n3GlfoSjSbuJwQCm34ZRLUym2NVP/177YAjcE0n1Hkaq/S/7KaYRHQ2cT6hlr\nF0qHF0Km3wtx4nIo1MTAPIV57Vsg+WXkIM2+VpVn+z+WT+ZMOBCJzcZdqjPf\nm5TxtctW8FhFucsGDfRLMbtcsXPHNvtWRqnbRew/Xz6I6f4ZW2v4bPtbSjiN\nnT6s\r\n=YCS4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCH2Ff8/aatQ0AsHlep8bQTN0UqjfOe7x35Y3ywwk1dQAIgdd0cNCLbtjtpHWRHxwNwp5gwu7J66B2pPpDul/YiAbM="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.1.0_1545049066730_0.08461664540176783"},"_hasShrinkwrap":false},"1.1.1":{"name":"@nestjsx/crud","version":"1.1.1","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.1.1","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-AM0e0mtKtlJ0WA8Nj5IHOx1j7Lzn4nVz5QoraZkix7/RFa/+QJTBqKSQUlvIyZgsxXpeJKpIzhVM2XTr2CA5dQ==","shasum":"a8a4ba3498a28df9d4ebfae08a4b9e4b8e20b218","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.1.1.tgz","fileCount":87,"unpackedSize":121438,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcF5aYCRA9TVsSAnZWagAAB40P/AnoRVPCt9N6nULOlRVO\nZ5ri8I7Sf49lNYCb437qRpmnw4yG+s6+FHrPd5P6UyWBvNL/nr1oddhUCAKm\nIhrtA0UKrvfQI9d6s0dcwT1ZDWhfcKiYKQ/4wVVdkNC+lEt5xuRJOggR1rVx\nnFJCecTzoMu++dZPD+giKHCrct5VYB6K6fdF6p4TpdZi4kttTAdv47SfcOHo\n/woq/1bljQ50NoLNEybbQuKDW6JMOBKMYuIO9raumAN1rZnNWKAFxXVmz03m\n66QkZsv6HCgDuDM+o2qGsNjhdI24cL7qTVti/ewrqp/TfFsJCdeK5eUo5Hiw\n7ALw/yFtJ4OLc5jydibfY/Jl6SBQ2zAs3c3xSAxq9UAuMKBBp2dWQ4Wauu4j\nO0GuS5X468ZrjkXmqOJoVvcSSL8BwpZPwh4FnblwhNpfPciTUZ7Qr5LcKiAb\nng49hFEZljVwosKS5pQciHkp1mRF9cVq4HlRXr9Z1lmvd0kIvmO3AoNM47L9\nkKjdWAjVI8NDgETTTyWf6zEdA6aQooVMqpoLHYpcyQFJBr7+Izb0cxIK0vRW\nnERRgRAsDocPnyCPKsxbGVGXoxuzEagNi8656qYRnDqBTAJwMGzjIGUldtwj\nf/DjNb3VZ2Zv7U0B1wtNP87dUEBFH7o/u2Jb6kvHIKs2lPxpRBiCZxmlUSl+\npgdk\r\n=PBuN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDko21cyWIm8UHfWPOkAK1w+hlFaYsL8QMGl2Bk+wGFtAIgObysmm++uOclUXH8ty2iv3ijIsxyh+6ciw8J7DensNg="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.1.1_1545049751368_0.7258466949464815"},"_hasShrinkwrap":false},"1.1.2":{"name":"@nestjsx/crud","version":"1.1.2","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/zMotivat0r/nest-crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/zMotivat0r/nest-crud#readme","_id":"@nestjsx/crud@1.1.2","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-K7nBDSJ9HwCz1TLW9oi7KDgj1stawRnEezQtYdfhvEZKdBNxJV2JXo+ezhhwosf8QjNi6LwklztRiw7WBz/Zqw==","shasum":"564923dbf5cda2e841868719b145a05dbb3724e6","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.1.2.tgz","fileCount":87,"unpackedSize":121372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcF5eYCRA9TVsSAnZWagAAP8wP/iDbtvHgyzwjkYSprvYW\nGxHK3pX+W35WadTIugl/nsxuz+48ieYjxAFor9XTd0iFeIy3lOdyCGBSi6rA\n87Bwyfb5was499xOTYlo2QPLU/jySr2vDjbpSV9/m7lYmxliGxI3pU0btbHv\nHyXh/d8u7oFJ8eZI7E0WMXceKxdOkF3NHbjd3Sk6pDDzfIbo1bZ20XDrtOPT\nTugy3+HdV81keJcQX4lp8gaB52njIU7GKZExTZjgWoXAnLNb2meA3Xjs9Bj+\nDfjI746Jpn2peblJutfPrpZTU6lWoNna8WJJUl/SNe1HjwMySGwdPOeTVAeu\nagLFso4//LsdE0C9UfcYy3vDwHcpqd0B+gQAFFsABHq7X+9nGDmvdZUVY2V8\nQ3iSOQ14SJDcjD2Tv/fRUE/Qh4JUaJqMrm8lF//7+rZ6OTk+uBMahQ8SqMTT\nHzA7I3f+hMQHjAiZB1N5jGG+epMyvIKFbbqyd2nTmVT8X/iLNZ3eqZTIzPaH\nNJfLDkxEy7v5gt7FAAar38rdWdZZPi3sagDQkYPA+khI03dsL8D4N6Z1tyty\nS6OHyY0SUo1E1BPcMIs+jm//jsDTu92J5P6tbeCQnct+DEeN891ovS8yakja\nmkBQZ1r6ESq5Y6Knm57YVw4MsjJuSqdVSgIkTyj60CyZoMq24Wj54odjSWfE\nNapb\r\n=EqEb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBNtRK/IVomyLgr+wmnQ4jhBu4XrLCKglrSa0yvJWiqAAiEA9Xwju5JPDoAQvuBLLS/tENskqNefiPytKl7KfIRYrRg="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.1.2_1545050007430_0.17347457471468086"},"_hasShrinkwrap":false},"1.1.3":{"name":"@nestjsx/crud","version":"1.1.3","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@1.1.3","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-pVKYr4lyNX8chL0ulSTK8hA6jf+/58RpT/Em2foPNLp0NmuxPcieIST3ACarA6BuJiavBCLbov9qNeRN6b6f6Q==","shasum":"10780e767f8b95b1eeddda73aebcad9628de7c15","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-1.1.3.tgz","fileCount":87,"unpackedSize":121315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcF9QHCRA9TVsSAnZWagAABvEP/12bBweQkfkRQC2X57CH\ntfT9ECXTLE8Hyg9tkReeWEq3CkpQMYU0COl964heNN/zWJTwg7KTrGs7p/T9\nQBmsWZqrhFR8ll7BareOuJYgUaROeswrGtqxvEDxJ7s85N/lC9xju8T907EH\nlEIcNecY+d5b+CpIV0nzWil9oBmWoUbWgx6PacxA8e5Ul8Nfg6Copc9f7xib\nYSJmdLCGSyJqlLppFbvBZYoUJ1z2dI7PyUy+EBbONDmlMjtaLN/RJC7Gy6YB\nOwYsUXvZPdUYs/qjT59D4oG2AW1ditlooL/V54DmrioL3APZYN2nAvgO5KUg\ne0jWwFUkBNOTR94OJ9jZaaGDlSUlSzcXUN1TEDdFWHTE3xtD/gaLUNV5jjRM\nugOBSkOCOfRTZQ86+sO3KP2Mk0/ViDbauehp+4UAi8OjheuCnJ5afI6Q2kgo\naj8kz8kh03O6+oIpqUQgLiNKzTn/B4gdivRCQM+PFghnwDDCKlIyxjF0erOk\n8FC5fMaz2Aikbqs6nVyb/QhjC1g9O3lmF0dPAevTpwwq/YE/M6L3XKz4xr0Y\nL3C7N4ZIJOxr194xLykg3ChQpl4gkwzy/4ppK1kXLhsx8c0lQk3oktaQBVst\n2VPnXgAFcWpNU7BHY6+g/Be8G4vNA/c3DhbgRUH/4UA39eU6yqLhueWtZZlf\nZitZ\r\n=7s1S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHoj8ObrrGUDozQukAizchc5tkdMUx7CIbT2VOdkQa1VAiA21TMpVyb+AN+Le2AfWGwOiAx/R7PyHGG4F94T6RnccQ=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_1.1.3_1545065478562_0.2722423960725562"},"_hasShrinkwrap":false},"2.0.0":{"name":"@nestjsx/crud","version":"2.0.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@2.0.0","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-0ubhZv5qzhP1RuM3JEXKz1nMn2SNaqrzfDUbgckKKv3q7N5+H5AhWvPv9B9oHV/TRP6a5XRBkj2BwiqD6Z/Czg==","shasum":"e7240b58da86e44a84025aa31fc635bcd2530af2","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-2.0.0.tgz","fileCount":90,"unpackedSize":133341,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcIjK8CRA9TVsSAnZWagAA6GMP/1FFJOGeC6neA7Z4XkuC\nJxW25x1SpJ1nE9h37MyamNXjC78+YZ9PEXza+MhsKj60HaflZb+mtgZTKK1L\nTbcHjPuSebVMz/ngyLzYW1GdFp6BVA7kmPD6vjoLIkU/h0Q26NjAkRFAEhU1\nfmxQotsQbjmxhXUxjbh5l5BhxMa5PyrzFPMfpeJhp2r1wCwUwBHHChb5lIM1\nNZKHlT3A1C++0kk8mzuUFyHvh6X+C7m/wBmGRFwpGGnxa4U7Koo0/6Samu4Q\nKb4bl9VXNnKDhj0Y7gPbhGBqcK51L4QLNWvJKU6Em1h2hLRu8ZPwCfLFFoOS\nHQwlaqF96vPZVfCVIhzGalVAX0V18br7r0sk+J7BrHkidbGw7oQJyTz+BmGa\nNHPNT04to5f9BxeGGWSjiYeKCcSrab0OTe1FjmmjxG/rXbnnC/7XruZvTyqh\nPHorhl2CNTfonehRtyIPITka/Jv4apUFT1WVKH4oKbGAV3THNQzHgBM27D4D\ncn0C+N23Eu9JVe88/KDGWeb+bEOYz4w23wKyzd733QrYP2IGMaZ7WjdDnH1m\nxyk1CuN4UuJWFs5B92ZglJfBdCJtlsp410MQnhBrmpnoD2o8xSMqWqIyvFlB\nzzc/Wmbuh8vwwWG+6GZWjYVkG9iTrdBGWTMe/wdXbLXSRYfd3obZw5jaVPJK\nJGqZ\r\n=s2Zf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHMsz3j35mj922fvRlp1B7rIeIwhnAoOz0G3IUQ/ql6KAiAWYdW4+5rGZJqKVvVDNHXAmEYIc18rjK+EXunbaubU8g=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_2.0.0_1545745083470_0.4681801439233526"},"_hasShrinkwrap":false},"2.1.0":{"name":"@nestjsx/crud","version":"2.1.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@2.1.0","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-VSHtkgbKkrNVM1vixIquO/155QjL1wYWTG2aZmUvOjlrZJeeqedHYTHMHBETHLFVuuvQiG7EHyqDYj9TJr4sSw==","shasum":"09e2c62e6e67b13978235e8ed0b07c00ffffa4c1","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-2.1.0.tgz","fileCount":90,"unpackedSize":111691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcSvRXCRA9TVsSAnZWagAAPAsP/iTpZOHGRTsOqzHlarSo\nN2HwCJ22XfPScuaFQsAL0j+ppwgJoaiFzeY/Do1LQbsHD4mSZrpZEt8qT/Kh\nnc1gbl3uBALBegVuve33O3TYGcuum3y9/5EkIQJvGcMMQBV25U5aEqvObLcB\nmBDDw2QygVJTqE5XCHtB/kG+J7GG7cDJhF49VM7U+IV8TZ/pGU1s2yyg8KB0\nSpLdK/WC0dyO/OHJ+EPY0jrD1XeUzRNZ4PsoVKzCO4e8sj8I/iQdr+3MLPlw\nuIgKp4EHdNScRIf35yvzl/wVim3OIJduzpxQyQRFdKQlDq9fKsz3uYbzC9q0\nYrdJpQBf6B16alQXdB8cZ31PoVs4e1nNLWyHBcJh3wMZddWCy9vZEqOxvM0q\nmmoPDgX4EHBdZBsvLJGq3aNsY3loCeoOZx2fOqALQRJIElKORT7AAYorLIxe\nsayz+/9HfYqv2cidXF8nci0BwfOxzz7GwkLW9tnjvHmvS0Yclnk2inVOtooF\nUYiEQaqaq7STCgv4opaK1wknHzt3Z6K/Z3EECPZWbCMufe7mAbm5Cbr8UMQD\nPZgidSl/YqswaTJMX1/zZoSYH2cpAv1MDH3lZ4+eX4OKHIThaZxYiVCfwIJO\nt7+9/hjxhhV6+61R91EkVIpcexOq4yE0rO85voqjFFW9ujI6J3s2B5s11YpA\nklFh\r\n=20CQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFb0fB8WGyEwfOQcX00ghXGTDYrv9vF5GTwMDPH7+3VSAiBKmfzbvk/SpISW/gSXq2FSLHjxioPEWPbb8S+YM4WbtQ=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_2.1.0_1548416087062_0.43812975932107556"},"_hasShrinkwrap":false},"2.1.1":{"name":"@nestjsx/crud","version":"2.1.1","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@2.1.1","_npmVersion":"6.4.0","_nodeVersion":"8.12.0","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-XCNu0BnVdT/az8ng59NmAae/J7DrdSsonaArkKXMiYQ+B6SAgvN3/rmeybO5Y8WTYOh1UmpESjqh0xriL6UXFQ==","shasum":"db21d34d56ef055953033669d671a6ae4cf2ff69","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-2.1.1.tgz","fileCount":90,"unpackedSize":136867,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcTtNDCRA9TVsSAnZWagAAXewP+wWQEtXiZEzgF+g4qeCY\nCCNgaNWLOr1B6uY2Vgb25pJFLsw99t0BP9tH8jbn7jvzmqA1Gx1I0V30ZwQr\npATZ2P9mdGz918oQVrEp6ZqXqYnn0704tVDprFBL5IFE9MO0zXzM5V2cLOhP\nf54PhdRpdxwtGiQoAHZJYQAPzzoBFg/hYjq7pR2Kzexkry6Lf/jkr2FOugNd\n6xraN/AC+8LVO9t+xTsb8NA+x4DZwL279fcKMgcUEKAT8ihNFJXhOMa5La6M\n5Hg9jxkCjUHrqhurA+xjpo2YAN4VnW2jB+5clc5YesKER9FV54MX9LKXd75/\nztXVItV5nqTakAY3kOdakXXdezwpnXLlCzBEEwXILEyi3HHPg5bR6Kdpma78\n65VQfNFdqxfeN6Z8ASA0mLCCxBDO2Lds4nWNfGY1T5JvTsGvMrDyyXRGtvtC\nlsT5qiAVuYPgymRW9ncv2vED4wX4h8sWSf8SbA76fPmrpJqQdQs+AL2YGZN0\nPnW6huWoZkk22k5ZwoPSIJC89kMMjGvt6GkCFVgIz+r1X6mllii0ppEOKt+/\nbVBlhQLtXFF+fVPRr6JjN8sHsGgTNU1UtzywseaYbZ3AD1uQAew6Zk1/DRD1\ni1VAq4XguN1h1K8ac8JxCmejbQ+CBOJOd+uTdwlx7j0neMxZbW299SVQE4s7\nzFid\r\n=E9Zl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBda4pkgYH35rEN9S5pj0D3xjvTYVTLRiy9ujhaNSfsHAiEA/Oidb4S4+ARggRoJ8lYwAGBj2wbFiU+44WmYpAzlLec="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_2.1.1_1548669762310_0.7787177904870863"},"_hasShrinkwrap":false},"3.0.0-rc.1":{"name":"@nestjsx/crud","version":"3.0.0-rc.1","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","readme":"<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\"><img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Coverage\" /></a>\n  <a href=\"https://travis-ci.org/nestjsx/crud\"><img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg?branch=master\" alt=\"Build\" /></a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, joins, nested joins, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Swagger](#swagger)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Restful Options merge](#restful-options-merge)\n  - [Path Filter](#path-filter)\n  - [Validation](#validation)\n  - [IntelliSense](#intellisense)\n  - [Method Override](#method-override)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud --save\nnpm i @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | empty array  \n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{ \"name\": \"Batman\" }, { \"name\": \"Batgirl\" }]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Swagger\n\n[Swagger](https://docs.nestjs.com/recipes/swagger) support is present out of the box, including [Query Parameters](#query-parameters) and [Path Filter](#path-filter).\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](#join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n> ?join=**relation1**||**field11**,**field12**,...&join=**relation1**.**nested**||**field21**,**field22**,...&join=...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n> ?join=**relation1**&join=**relation1**.**nested**&join=**relation1**.**nested**.**deepnested**\n\n**_Notice:_** `id` field always persists in relational objects. To use nested relations, the parent level **MUST** be set before the child level like example above.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {},\n    'company.projects': {}\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse. `@Crud()` decorator accepts two arguments - Entity class and `CrudOptions` object. Let's dive in some details.\n\n### Restful Options merge\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  options: {\n    // RestfulOptions goes here\n  }\n})\n@Controller('heroes')\nexport class HeroesCrudController {\n  constructor(public service: HeroesService) {}\n}\n```\n\n`CrudOptions` object may have `options` parameter which is the same object as [Restful Options](#restful-options).\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Path Filter\n\n`CrudOptions` object may have `params` parameter that will be used for auto filtering by URL path parameters.\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: ['companyId']\n})\n@Controller('/company/:companyId/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field. If not, you can do mapping, like this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: {\n    company: 'companyId'\n  }\n})\n@Controller('/company/:company/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nWhere `company` is the name of the URL param, and `companyId` is the name of the entity field.\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Validation\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations, that could be saved/updated as nested objects\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\nYou can pass you custom validation options here:\n\n```typescript\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  validation: {\n    validationError: {\n      target: false,\n      value: false\n    }\n  }\n})\n@Controller('heroes')\n...\n```\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud implements CrudController<HeroesService, Hero> {\n  constructor(public service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud implements CrudController<HeroesService, Hero> {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Method Override\n\nList of composed base methods:\n\n```typescript\ngetManyBase(\n  @Param() params: ObjectLiteral,\n  @Query() query: RestfulParamsDto,\n): Promise<T[]>;\n\ngetOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n  @Query() query: RestfulParamsDto,\n): Promise<T>;\n\ncreateOneBase(\n  @Param() params: ObjectLiteral,\n  @Body() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @Param() params: ObjectLiteral,\n  @Body() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n  @Body() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n): Promise<void>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport {\n  Crud,\n  CrudController,\n  Override,\n  RestfulParamsDto\n} from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud implements CrudController<HeroesService, Hero> {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(@Param() params, @Query() query: RestfulParamsDto) {\n    // do some stuff\n    return this.base.getManyBase(params, query);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff() {\n    // do some stuff\n  }\n\n}\n```\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Reflector } from '@nestjs/core';\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { getFeature, getAction } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  constructor(private reflector: Reflector) {}\n\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = getFeature(controller);\n    const action = getAction(handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git\ncd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\n```shell\ndocker-compose up -d\nnpm run test:e2e\n```\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.0.0-rc.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-NQuJX92RXgNzyQeBhuWNexhlSHc3erxlbUzJ/mv2WzYGQpXwqkBE/PkvLJDo+RY9FVozfhgkJc1F7yxPuv5wrw==","shasum":"371bb7f776ccc5972685dfeba1fb134adda51ce3","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.0.0-rc.1.tgz","fileCount":135,"unpackedSize":159209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckqoaCRA9TVsSAnZWagAA/LoP/j0gfKb9veUdVahPfdOu\n+50hxOxYTf53WDRNGUKoztE53rkW9D3IVbF32XvlqWwuilH1c+Ct5lsTQeU8\nxAdpje0J/NHC80TuvjQPtdCXboNIjKc7x++MqcqvYVv1pra9d/bXrj1vF3oc\ncwbuBHowC8orbtw/hm1Xe/613ZC5piT4C4RJeZYAe2+tckH76at9zfVbBApM\nVjvWBqlYh5JJOw5W9SDe3do2EXwqo4qxo/fI6a8LyNo6gyReekg8nItl7Yni\ng2yyvzQdzwITPTMoclzA1XWqSe9boXmHJrcaIscaS1xpDq1FfOLU0JVmAm9Y\nYGAv+xhEq40niGhxV2xNl+BIlNlN+AzfB/HJVmrS//ouTZRtohOneCEKqyHk\nodj+T3GQfP7t2mbSxUs39QQfq+0czWDWjKkV9O1Q2pyJCLvLcTxFZWiOIJWk\nIsGp++itp++xW/OlzrATtz5QW6sB8yqB4Dx4ZseDGWFrS+yVY9bqIbBEE/EX\ng8mLj8V6JCXvHTAWJ2fhUCkLS8UNn6NOZ7fhs7i4R2xNN3JJ7P+Ukm4S6eIb\nr3rff6TsIqpEJRXK/H6o3LZoR0Z37SBw4CTqkcWBYxYDppQu995t2H7dPDrM\n9TcXpZZZSPtt157JmMnO2TKwDpIqRt59etivr/51Yj3Y2ooF0OQCTSncfvx+\nxL7L\r\n=qlrX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBp3uDTbfyT6Z637KUxncOYnbfw9khs5CGCtjRuRJX4bAiEA1LmFREWkADW1KB0s50+wwN1WglE4+tNECTk00fxByJE="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.0.0-rc.1_1553115673734_0.27676606896454015"},"_hasShrinkwrap":false},"3.0.0-rc.2":{"name":"@nestjsx/crud","version":"3.0.0-rc.2","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","readme":"<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\"><img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Coverage\" /></a>\n  <a href=\"https://travis-ci.org/nestjsx/crud\"><img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg?branch=master\" alt=\"Build\" /></a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, joins, nested joins, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Swagger](#swagger)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Restful Options merge](#restful-options-merge)\n  - [Path Filter](#path-filter)\n  - [Validation](#validation)\n  - [IntelliSense](#intellisense)\n  - [Method Override](#method-override)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud --save\nnpm i @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | empty array  \n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{ \"name\": \"Batman\" }, { \"name\": \"Batgirl\" }]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - entity id  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Swagger\n\n[Swagger](https://docs.nestjs.com/recipes/swagger) support is present out of the box, including [Query Parameters](#query-parameters) and [Path Filter](#path-filter).\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](#join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n> ?join=**relation1**||**field11**,**field12**,...&join=**relation1**.**nested**||**field21**,**field22**,...&join=...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n> ?join=**relation1**&join=**relation1**.**nested**&join=**relation1**.**nested**.**deepnested**\n\n**_Notice:_** `id` field always persists in relational objects. To use nested relations, the parent level **MUST** be set before the child level like example above.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {},\n    'company.projects': {}\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse. `@Crud()` decorator accepts two arguments - Entity class and `CrudOptions` object. Let's dive in some details.\n\n### Restful Options merge\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  options: {\n    // RestfulOptions goes here\n  }\n})\n@Controller('heroes')\nexport class HeroesCrudController {\n  constructor(public service: HeroesService) {}\n}\n```\n\n`CrudOptions` object may have `options` parameter which is the same object as [Restful Options](#restful-options).\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Path Filter\n\n`CrudOptions` object may have `params` parameter that will be used for auto filtering by URL path parameters.\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: ['companyId']\n})\n@Controller('/company/:companyId/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field. If not, you can do mapping, like this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: {\n    company: 'companyId'\n  }\n})\n@Controller('/company/:company/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nWhere `company` is the name of the URL param, and `companyId` is the name of the entity field.\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Validation\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations, that could be saved/updated as nested objects\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\nYou can pass you custom validation options here:\n\n```typescript\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  validation: {\n    validationError: {\n      target: false,\n      value: false\n    }\n  }\n})\n@Controller('heroes')\n...\n```\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud implements CrudController<HeroesService, Hero> {\n  constructor(public service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud implements CrudController<HeroesService, Hero> {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Method Override\n\nList of composed base methods:\n\n```typescript\ngetManyBase(\n  @Param() params: ObjectLiteral,\n  @Query() query: RestfulParamsDto,\n): Promise<T[]>;\n\ngetOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n  @Query() query: RestfulParamsDto,\n): Promise<T>;\n\ncreateOneBase(\n  @Param() params: ObjectLiteral,\n  @Body() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @Param() params: ObjectLiteral,\n  @Body() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n  @Body() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @Param('id') id: number,\n  @Param() params: ObjectLiteral,\n): Promise<void>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport {\n  Crud,\n  CrudController,\n  Override,\n  RestfulParamsDto\n} from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud implements CrudController<HeroesService, Hero> {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(@Param() params, @Query() query: RestfulParamsDto) {\n    // do some stuff\n    return this.base.getManyBase(params, query);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff() {\n    // do some stuff\n  }\n\n}\n```\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Reflector } from '@nestjs/core';\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { getFeature, getAction } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  constructor(private reflector: Reflector) {}\n\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = getFeature(controller);\n    const action = getAction(handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git\ncd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\n```shell\ndocker-compose up -d\nnpm run test:e2e\n```\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.0.0-rc.2","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-iB16e0tViXYHPand/WGlJZyN2hk76rl6kNbNEK0AtqNjXWC8rbgYTVLvGeSIgYwIGp46wrBWS1HIwr8ZCe1P/Q==","shasum":"83e195562ccb0bb94f2c0c4447980d8109926d24","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.0.0-rc.2.tgz","fileCount":135,"unpackedSize":175844,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJclR/LCRA9TVsSAnZWagAAA7wP/jTSHy27z0YmgZ+v8KUP\nTzNuKKCJ26737/wVuCCwuoWYFmw7uPNQ/QWw5VIk0MYQ7I18MkM8U7dm81Q8\nKF7/D+I6QSBne68VBSBFXi8kH1U4MpJ01pqLB5OU9H7Zj1x5ZbrFb1NMUeKS\njkaJODI29RX0ZbE9v82tXm1+uV7YZ2U99J/Pu1Y3/q5HMRPriuGGG8XncMzk\n6e7Uswtdi0GPMjIT915ELIuVRbyswqtBHJzGxsm/xUsxworF3IEzEub/+v/o\nEHbyrITj+OPoRAJWty6u9A1AVpJSycQccISzUl+c3r8It1Y4T71rbsGT4Xlm\nq9IbQWxJP1w1PIcjxf3VHDCTESY+k9D+ufgRXbc7kVhczRYGSEmBa63LzQGt\nAMZjh6SoVo9kou9uCJRWo/IVZx+Oq2KVUXxpxx1ShROF9O6aE1sifaiOdzWo\nd3I3BK2LlKBqf8L0RsUNw6Z/eV3dGx0ZTTszTuuh6qrLUK7iV9H7DZuzlX4P\nMS/vhsat19q0jbby5cbe4foRvRe/ri0+FkaxkouuHkVs1beabPcdwjXfeHw9\n25kmesizAq/tjKjW1RtSAM1XV7pLCUKXxDD1N2jvJCO2SscS+eHG1uBS5ea1\nFTKm56QSHBBmx2O1CicCPV67HiZlXyhLxX/QrogUrdWAYrzG534td3OfhFgg\nQ/h0\r\n=m3ce\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHCOcQ2Ddj/GrketrOrXEg0yvL1IaxRIFPiLZps9FGLRAiEAs14PpArDsIrEcNg6PKVMXq/ZsM2vnlWZzmUq82iZ/1Q="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.0.0-rc.2_1553276874445_0.3618869912688587"},"_hasShrinkwrap":false},"3.0.0":{"name":"@nestjsx/crud","version":"3.0.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-ZJ4lKcDVA1T0WTYZGlKgMjLj/oE3kpt46sC9BE23OV2rC6p3RvkNypejbKAoWVI6S1UPFrZ91HJ+dw8SFkbAag==","shasum":"78bfe94735c117a3cbbe6baae2320b96171d072a","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.0.0.tgz","fileCount":135,"unpackedSize":177916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJclUjqCRA9TVsSAnZWagAAcGoP/3zKrEaA5Ui0bp2LITfQ\n4HgYledr2eZoyngbb6eS7r+FHI9BxmTFLGicX5Ox+9WMo/jPNfI/1TBkUiad\nWF954I8Cop4rJt4iOpM/oxVLuQX3xfamCsl96v7/Uje4eKxHOuO/C7V/UVJA\nKaUM7a8rCEWalvw1OMaPDw7FjJ1VSKHawNyw/0o77sfvm8fe4Qljq8+bQ++N\nDO5fHJSb01ReG7K84m4L/fosHUQzSezfQyJIMTVOs3D9OmUpICntxp2MO0by\nF42xSvw/0V+k/GiG82h46Sax8bePT4gXMhYGYoo1I8XtoJlaqiCn+ROTU/Me\nxvrora6Y72uG8dRecAH9lkqYX2hozSZld0Dp+vaALY8g2v67dhYOZVVQ5eMM\nombIR6sbg7FDuTJycssrEAyjjhyv9/Un6oaNR2jBZ5kjEQ7cuVQ4XiBSx/Km\nH/FFQqkR+NDsetNfAzCatPiVrQOE21ThNj20pxBraDtwYBQDOofVWKWxjD5A\n2JnsPRwdHtmOqnXBACwwxgC6qXL4HCvUOohg90zEKCJSkpy6qpGoUrModI8k\n6UJsKrLcIuX3rUARxiD8EWBmi+I7+ZwdSpV7kTSI8kXXNaXZp0HZJpLI7bki\n4hAtntll2QMelzexAIwP69FoCV6++rWQr5v97wH6syfjJm/F/S/kByqR0SgP\nj6QX\r\n=L9k1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYZ7OYUuFAAZG3sIjr36kPAtw66KoZ1Ly3VkPtlpf/QwIgAeGQq2hT5jMivFhYcf6bgK+kBGNoqZWmjdAWD05BlhE="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.0.0_1553287401612_0.7887076866621501"},"_hasShrinkwrap":false},"3.1.0":{"name":"@nestjsx/crud","version":"3.1.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.1.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-5Bbg6e8hPRL45A7FGl1TBRDM8X9+Q/ll3bk2i8HKQvGMXJPx9Ey+Yy/UH5XR70ZUX5TsAAd7M1JQIqaTcteShQ==","shasum":"6c7818272f1eaedbe4be8733048b8511decd80ef","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.1.0.tgz","fileCount":138,"unpackedSize":184182,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJclpvZCRA9TVsSAnZWagAAs7QP/AzlGL9g4IIRnbQOLrJR\nh3xIQUy9gk2ASuNSjxEA0zu63Kwfoe89wqvdqpzbGMH8KE48YWZO7S42iORa\nM7PySpOic6EvYazwQ5VlNj3hUX1gKIRDWwOKAhcnvWLJ/PZ45Q7NBTTzrpPh\nZzNrLrHzgT0rxEunyycgu2xunWfMxg7U+M7LkapMP2CXi/WTgMcEiFrQof1X\n++/aqSfXgoEDSSv/mzbPjaadm68GNsF9c78iIvmTSJ04BDl6nQ35SaDEvets\n9Hm6uD37wiJI5Gi1JVStS/44zf3y0H7NAF/y7gui2x6YWWp6MX5FdYoNnVSH\n3rcoz/kgVQDzd69xUqkKqe0zP1C4WQJbBnp3ZvJeqWwatexFjLmMu5Ngzi5d\nL1J6hpxjjWh3/4nu6lb0+mQfxoA+hwiRAB8SIvduxI7C79dK0em1KlYOyoND\n3r6PkufzNQL/Rh9M6dZVL/3R9kSqyOC3z+LurJwy+Dh5RPOUpYYRTv35zWi5\nNLuWh9uisOPupWXLfiTtZGmwTn7E7JBjL4W1UWLtRxnAq0528VJQVUovRL6g\n5yEi5eWQQQTlkdkgENFQ+cR5vJkBKEvJW8ZyuiZVXTP/yOivkM6aNzUTllPF\nvfYVtUWntFP+gz1T395J2T5ZP2S9zqztClPiiMfd6JTNsQ6ApYENWYs8qDvs\nOA/Y\r\n=04tT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFDm0B5VwLyMoTusRG7In0BhCqUIZSDIj2r3KeCl84YTAiEAu1Wj0j2ONJKnQizN4Mh8x6v3EvIGn2/Vqa0giSHz/4o="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.1.0_1553374168356_0.015184655472751052"},"_hasShrinkwrap":false},"3.2.0-beta.0":{"name":"@nestjsx/crud","version":"3.2.0-beta.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","readme":"<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\"><img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg?branch=master\" alt=\"Build\" /></a>\n  <a href=\"https://travis-ci.org/nestjsx/crud\"><img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Coverage\" /></a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, joins, nested joins, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Swagger](#swagger)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Restful Options](#options-restful)\n  - [Routes Options](#routes-options)\n  - [Params Options](#params-options)\n  - [Validation Options](#validation-options)\n  - [IntelliSense](#intellisense)\n  - [Method Override](#method-override)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud --save\nnpm i @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | pagination object with data\n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{ \"name\": \"Batman\" }, { \"name\": \"Batgirl\" }]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Swagger\n\n[Swagger](https://docs.nestjs.com/recipes/swagger) support is present out of the box, including [Query Parameters](#query-parameters) and [Path Filter](#path-filter).\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](#join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n> ?join=**relation**&filter=**relation**.**field**||**condition**||**value**\n\n**_Notice:_** Using nested filter shall join relation first.\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n> ?join=**relation1**||**field11**,**field12**,...&join=**relation1**.**nested**||**field21**,**field22**,...&join=...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n> ?join=**relation1**&join=**relation1**.**nested**&join=**relation1**.**nested**.**deepnested**\n\n**_Notice:_** `id` field always persists in relational objects. To use nested relations, the parent level **MUST** be set before the child level like example above.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {},\n    'company.projects': {\n      persist: ['status']\n    },\n    'users.projects.tasks': {\n      exclude: ['description'],\n    },\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse.\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  // CrudOptions goes here\n})\n@Controller('heroes')\nexport class HeroesCrudController {\n  constructor(public service: HeroesService) {}\n}\n```\n\n`@Crud()` decorator accepts two arguments - Entity class and `CrudOptions` object. All fields here are optional as well. Let's dive in some details.\n\n### Crud Options\n\n- [**`options`**](#options-restful)\n- [**`routes`**](#routes-options)\n- [**`params`**](#params-options)\n- [**`validation`**](#validaton-options)\n\n### Options (restful)\n\nThis option has the same structure as as [Restful Options](#restful-options).\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Routes Options\n\nThis object may have `exclude` and `only` arrays of route names which must be excluded or only which ones must be created accordingly.\n\n```typescript\n{\n  routes: {\n    only: ['getManyBase'];\n  }\n}\n```\n\n```typescript\n{\n  routes: {\n    exclude: ['createManyBase'];\n  }\n}\n```\n\n**_Notice:_** If both are present, then `exclude` will be ignored.\n\nAlso, routes options object may have some options for each particular route:\n\n```typescript\n{\n  routes: {\n    getManyBase: {\n      interceptors: [],\n    },\n    getOneBase: {\n      interceptors: [],\n    },\n    createOneBase: {\n      interceptors: [],\n    },\n    createManyBase: {\n      interceptors: [],\n    },\n    updateOneBase: {\n      interceptors: [],\n      allowParamsOverride: true\n    },\n    deleteOneBase: {\n      interceptors: [],\n      returnDeleted: true\n    },\n  }\n}\n```\n\n`interceptors` - an array of your custom interceptors  \n`allowParamsOverride` - whether or not to allow body data be overriten by the URL params on PATH request. Default: `false`  \n`returnDeleted` - whether or not an entity object should be returned in the response body on DELETE request. Default: `false`\n\n### Params Options\n\n`CrudOptions` object may have `params` parameter that will be used for validation sake of you URL params and for defining a slug param (if it differs from `id` that is used by default).\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: {\n    companyId: 'number'\n  }\n})\n@Controller('/company/:companyId/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field.\n\nIf you don't want to use numeric `id` (by default) and, say, you use some unique field, e.g. it's called `slug` and it's a UUID string - in that case need to add this:\n\n```typescript\n{\n  params: {\n    slug: 'uuid';\n  }\n}\n```\n\nOr if your slug/id is just another random unique string, then:\n\n```typescript\n{\n  params: {\n    id: 'string';\n  }\n}\n```\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` (or another field that you defined) of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Validation Options\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\nYou can pass you custom validation options here:\n\n```typescript\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  validation: {\n    validationError: {\n      target: false,\n      value: false\n    }\n  }\n})\n@Controller('heroes')\n...\n```\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Method Override\n\nList of composed base methods:\n\n```typescript\ngetManyBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<GetManyDefaultResponse<T> | T[]>;\n\ngetOneBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<T>;\n\ncreateOneBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n): Promise<void | T>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport {\n  Crud,\n  CrudController,\n  Override,\n  RestfulParamsDto,\n  ParsedQuery,\n  ParsedParams,\n  ParsedOptions\n} from '@nestjsx/crud';\n\n@Crud(Hero, {})\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n    return this.base.getManyBase(query, options);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n  }\n\n  @Override()\n  createOne(\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  ) {\n    return this.base.createOneBase(params, body);\n  }\n\n  @Override()\n  createMany(\n    @ParsedBody() body: EntitiesBulk<Hero>, // validation is working ^_^\n    @ParsedParams() params,\n    ) {\n    return this.base.createManyBase(params, body);\n  }\n\n  @Override('updateOneBase')\n  coolFunction() {\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  } {\n    return this.base.updateOneBase(params, body);\n  }\n\n  @Override()\n  async deleteOne(\n    @ParsedParams() params,\n  ) {\n    return this.base.deleteOneBase(params);\n  }\n\n}\n```\n\n**_Notice:_** new custom route decorators were created to simplify process: `@ParsedQuery()`, `@ParsedParams`, `@ParsedBody()`, and`@ParsedOptions()`. But you still can add your param decorators to any of the methods, e.g. `@Param()`, `@Session()`, etc. Or any of your own cutom route decorators.\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Reflector } from '@nestjs/core';\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { getFeature, getAction } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  constructor(private reflector: Reflector) {}\n\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = getFeature(controller);\n    const action = getAction(handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git\ncd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\n```shell\ndocker-compose up -d\nnpm run test:e2e\n```\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.2.0-beta.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-QFpZ6ivUKG6QcDP9wnGb770mY8kipj2QRmtQupk2gRvDfILUTtyTQQWAHnYXZU+bPUdGTE71s8G0LLWmjd8zJQ==","shasum":"3737742a1c85cbba60ceca9a00d1aa2d257b8be8","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.2.0-beta.0.tgz","fileCount":141,"unpackedSize":187575,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmQvRCRA9TVsSAnZWagAA+KMQAIirkDV8qxgFJ6zJk6aN\ngAaMR9f9cxmTzVIESPSjStkSO3hABoPJYnblI99xosagHXP5g6duUTC5ofYw\ndj7jRgmSjXeoCoCfI9DROjnIMYhmCqEYx1VoBNewa19WxneNsqcIoFbAscbd\nx+4eLUrBeHIgTXfI7l88x/P/tiEcDtfFdGddWjgK+rWwXgE0P4x+eQurgMS0\nEQ1TpZo2VsY7tWXOlJM+hfDeDAzqAq8OxC/jD+MIexa7PPWhX1CfWvkcM2t5\nAHljM2yo4KCKMapBgZPWZytIGi7/Cd+4UZvGVOZt4THpYMQ2g0TbEEw3JXV7\nZlRNanW7GxxVXftDFq0O9yE9UKDtf1W4ZNziG60x2fe9jLeEewD4CRE2N7B8\nRzXhcoYwFNToNrK8u3WcFZBOEkp2nzzOFfrndP2NJoBnD7smRvD2ipW2oTEs\nujTW8UWj0dL3dUR9ljP9yQihpE3sd9jPLowg3x4hlt6gFHapQ/QdLziaPrT6\nxUXHDHmxzOU0Y5+VcPbB1b97F96vOr4BI1W7FAHtYpyzuhi/2ZHlxHDAh59e\nyZKSp//B67jMIDLeI6M7WJ+wXaXswSaDVYrPc+cTGCOND4/o7qNpY2lflLWQ\nkLXsyyxn+BRnuukYXZsUFyg6VqIAv4h8aBlb+4SuzrZQH19ZLmzaU1+FJ+8/\n5Q+2\r\n=xgjk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUIoSFteVhrnqqNITldyd7dBmgty8Py4uPHcbnSHW5cgIhAKrgtsjIvlCwBX9eof4fvRVviRZgGWfvj0qCbmJ98vdU"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.2.0-beta.0_1553533904700_0.6393879269480096"},"_hasShrinkwrap":false},"3.2.0-beta.1":{"name":"@nestjsx/crud","version":"3.2.0-beta.1","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","readme":"<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\"><img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg?branch=master\" alt=\"Build\" /></a>\n  <a href=\"https://travis-ci.org/nestjsx/crud\"><img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Coverage\" /></a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, joins, nested joins, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Swagger](#swagger)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Restful Options](#options-restful)\n  - [Routes Options](#routes-options)\n  - [Params Options](#params-options)\n  - [Validation Options](#validation-options)\n  - [IntelliSense](#intellisense)\n  - [Method Override](#method-override)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud --save\nnpm i @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | pagination object with data\n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{ \"name\": \"Batman\" }, { \"name\": \"Batgirl\" }]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Swagger\n\n[Swagger](https://docs.nestjs.com/recipes/swagger) support is present out of the box, including [Query Parameters](#query-parameters) and [Path Filter](#path-filter).\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](#join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n> ?join=**relation**&filter=**relation**.**field**||**condition**||**value**\n\n**_Notice:_** Using nested filter shall join relation first.\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n> ?join=**relation1**||**field11**,**field12**,...&join=**relation1**.**nested**||**field21**,**field22**,...&join=...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n> ?join=**relation1**&join=**relation1**.**nested**&join=**relation1**.**nested**.**deepnested**\n\n**_Notice:_** `id` field always persists in relational objects. To use nested relations, the parent level **MUST** be set before the child level like example above.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {},\n    'company.projects': {\n      persist: ['status']\n    },\n    'users.projects.tasks': {\n      exclude: ['description'],\n    },\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse.\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  // CrudOptions goes here\n})\n@Controller('heroes')\nexport class HeroesCrudController {\n  constructor(public service: HeroesService) {}\n}\n```\n\n`@Crud()` decorator accepts two arguments - Entity class and `CrudOptions` object. All fields here are optional as well. Let's dive in some details.\n\n### Crud Options\n\n- [**`options`**](#options-restful)\n- [**`routes`**](#routes-options)\n- [**`params`**](#params-options)\n- [**`validation`**](#validaton-options)\n\n### Options (restful)\n\nThis option has the same structure as as [Restful Options](#restful-options).\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Routes Options\n\nThis object may have `exclude` and `only` arrays of route names which must be excluded or only which ones must be created accordingly.\n\n```typescript\n{\n  routes: {\n    only: ['getManyBase'];\n  }\n}\n```\n\n```typescript\n{\n  routes: {\n    exclude: ['createManyBase'];\n  }\n}\n```\n\n**_Notice:_** If both are present, then `exclude` will be ignored.\n\nAlso, routes options object may have some options for each particular route:\n\n```typescript\n{\n  routes: {\n    getManyBase: {\n      interceptors: [],\n    },\n    getOneBase: {\n      interceptors: [],\n    },\n    createOneBase: {\n      interceptors: [],\n    },\n    createManyBase: {\n      interceptors: [],\n    },\n    updateOneBase: {\n      interceptors: [],\n      allowParamsOverride: true\n    },\n    deleteOneBase: {\n      interceptors: [],\n      returnDeleted: true\n    },\n  }\n}\n```\n\n`interceptors` - an array of your custom interceptors  \n`allowParamsOverride` - whether or not to allow body data be overriten by the URL params on PATH request. Default: `false`  \n`returnDeleted` - whether or not an entity object should be returned in the response body on DELETE request. Default: `false`\n\n### Params Options\n\n`CrudOptions` object may have `params` parameter that will be used for validation sake of you URL params and for defining a slug param (if it differs from `id` that is used by default).\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: {\n    companyId: 'number'\n  }\n})\n@Controller('/company/:companyId/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field.\n\nIf you don't want to use numeric `id` (by default) and, say, you use some unique field, e.g. it's called `slug` and it's a UUID string - in that case need to add this:\n\n```typescript\n{\n  params: {\n    slug: 'uuid';\n  }\n}\n```\n\nOr if your slug/id is just another random unique string, then:\n\n```typescript\n{\n  params: {\n    id: 'string';\n  }\n}\n```\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` (or another field that you defined) of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Validation Options\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\nYou can pass you custom validation options here:\n\n```typescript\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  validation: {\n    validationError: {\n      target: false,\n      value: false\n    }\n  }\n})\n@Controller('heroes')\n...\n```\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Method Override\n\nList of composed base methods:\n\n```typescript\ngetManyBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<GetManyDefaultResponse<T> | T[]>;\n\ngetOneBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<T>;\n\ncreateOneBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n): Promise<void | T>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport {\n  Crud,\n  CrudController,\n  Override,\n  RestfulParamsDto,\n  ParsedQuery,\n  ParsedParams,\n  ParsedOptions\n} from '@nestjsx/crud';\n\n@Crud(Hero, {})\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n    return this.base.getManyBase(query, options);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n  }\n\n  @Override()\n  createOne(\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  ) {\n    return this.base.createOneBase(params, body);\n  }\n\n  @Override()\n  createMany(\n    @ParsedBody() body: EntitiesBulk<Hero>, // validation is working ^_^\n    @ParsedParams() params,\n    ) {\n    return this.base.createManyBase(params, body);\n  }\n\n  @Override('updateOneBase')\n  coolFunction() {\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  } {\n    return this.base.updateOneBase(params, body);\n  }\n\n  @Override()\n  async deleteOne(\n    @ParsedParams() params,\n  ) {\n    return this.base.deleteOneBase(params);\n  }\n\n}\n```\n\n**_Notice:_** new custom route decorators were created to simplify process: `@ParsedQuery()`, `@ParsedParams`, `@ParsedBody()`, and`@ParsedOptions()`. But you still can add your param decorators to any of the methods, e.g. `@Param()`, `@Session()`, etc. Or any of your own cutom route decorators.\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Reflector } from '@nestjs/core';\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { getFeature, getAction } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  constructor(private reflector: Reflector) {}\n\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = getFeature(controller);\n    const action = getAction(handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git\ncd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\n```shell\ndocker-compose up -d\nnpm run test:e2e\n```\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.2.0-beta.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-7jmETdzBYoNHXjDAI5B5fOerFZ0V/E8tF9lNb/NLpTMVecQwrcSgE1TQWpsZinIEt16TJujnU31bjju4B0TnZQ==","shasum":"bcf6c921588edfa9eff0ac024f4f0d981425a4c0","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.2.0-beta.1.tgz","fileCount":141,"unpackedSize":188014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmdYuCRA9TVsSAnZWagAA4XMP/iwpv0IPkk6HATGQiqIT\nlyuCa9LuOVwXMlBgXzececj3bzU/Y1D+Ag7Ymnw6NAsSweVLESgPJv6j1500\nRrAgTE/trVDyf3X9Rb8DJ3B8kbuGAR+9mUBpC0iXj0PQncj/LGrP1zCwEThQ\n61tusPKy4zLB7UZsY2dJmbrF8QsejYPwSz/2KGehGEAT2IXlvECP934YiNhk\n+TohrAtTBly5sn4U6/sEp6PWGDQZA1lk5gVu5u64zDXbbWzO71hFdUbFcl7b\n7pv/R0Q6agwcRCYo9qB4Blww+RCXxJiwzNr/7RnaTuweiGQ/V/dBZlbzAqX0\nhI7JLCrkFHSPouFXficVRe8n2cx8mlV1eNYF8NWA5mIKynGnUUndBFHzsm7N\nbkxyMz0HxNuuUV+jWmDZ3Zw713mhKwtl8+KVlKzfKoehlRKwd4iBUPYG9J8z\ne5EOwBSdNb1Qyn+On94nTOWFlPojowoke/yDWaplHmMgBS2wiqb6Yv4jPlec\nkMPUCdCz7vok66T5pfIP5eU51xJd/Kw6mOKBzDkfgiSiiMXI68ELPzFz/62S\n1x2gkiIQgtcrLabEFWKHitq9R6pFHCYjc5qE8ZfmLuNroz0Omir2aX4vRJuv\nl2OmsZxMOB6+edAtLYik5N4cYzDU8L0UBqOhN7xvwvbmOaz7GL00XKfGVbM2\n5Il9\r\n=O3X8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+ANXiLtzIGQxKO5gKmxv99UdOU8Zu3005pEUoqf+6lgIhALfCrvq5hHa77OoTDW568jjE1Q6tjks58dhmIy1u2mdN"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.2.0-beta.1_1553585709495_0.886188660783358"},"_hasShrinkwrap":false},"3.2.0-beta.2":{"name":"@nestjsx/crud","version":"3.2.0-beta.2","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^6","@nestjs/core":"^6","@nestjs/typeorm":"^6"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\"><img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg?branch=master\" alt=\"Build\" /></a>\n  <a href=\"https://travis-ci.org/nestjsx/crud\"><img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Coverage\" /></a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, joins, nested joins, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Swagger](#swagger)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Restful Options](#options-restful)\n  - [Routes Options](#routes-options)\n  - [Params Options](#params-options)\n  - [Validation Options](#validation-options)\n  - [IntelliSense](#intellisense)\n  - [Method Override](#method-override)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud --save\nnpm i @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | pagination object with data\n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{ \"name\": \"Batman\" }, { \"name\": \"Batgirl\" }]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Swagger\n\n[Swagger](https://docs.nestjs.com/recipes/swagger) support is present out of the box, including [Query Parameters](#query-parameters) and [Path Filter](#path-filter).\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](#join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n> ?join=**relation**&filter=**relation**.**field**||**condition**||**value**\n\n**_Notice:_** Using nested filter shall join relation first.\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n> ?join=**relation1**||**field11**,**field12**,...&join=**relation1**.**nested**||**field21**,**field22**,...&join=...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n> ?join=**relation1**&join=**relation1**.**nested**&join=**relation1**.**nested**.**deepnested**\n\n**_Notice:_** `id` field always persists in relational objects. To use nested relations, the parent level **MUST** be set before the child level like example above.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {},\n    'company.projects': {\n      persist: ['status']\n    },\n    'users.projects.tasks': {\n      exclude: ['description'],\n    },\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse.\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  // CrudOptions goes here\n})\n@Controller('heroes')\nexport class HeroesCrudController {\n  constructor(public service: HeroesService) {}\n}\n```\n\n`@Crud()` decorator accepts two arguments - Entity class and `CrudOptions` object. All fields here are optional as well. Let's dive in some details.\n\n### Crud Options\n\n- [**`options`**](#options-restful)\n- [**`routes`**](#routes-options)\n- [**`params`**](#params-options)\n- [**`validation`**](#validaton-options)\n\n### Options (restful)\n\nThis option has the same structure as as [Restful Options](#restful-options).\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Routes Options\n\nThis object may have `exclude` and `only` arrays of route names which must be excluded or only which ones must be created accordingly.\n\n```typescript\n{\n  routes: {\n    only: ['getManyBase'];\n  }\n}\n```\n\n```typescript\n{\n  routes: {\n    exclude: ['createManyBase'];\n  }\n}\n```\n\n**_Notice:_** If both are present, then `exclude` will be ignored.\n\nAlso, routes options object may have some options for each particular route:\n\n```typescript\n{\n  routes: {\n    getManyBase: {\n      interceptors: [],\n    },\n    getOneBase: {\n      interceptors: [],\n    },\n    createOneBase: {\n      interceptors: [],\n    },\n    createManyBase: {\n      interceptors: [],\n    },\n    updateOneBase: {\n      interceptors: [],\n      allowParamsOverride: true\n    },\n    deleteOneBase: {\n      interceptors: [],\n      returnDeleted: true\n    },\n  }\n}\n```\n\n`interceptors` - an array of your custom interceptors  \n`allowParamsOverride` - whether or not to allow body data be overriten by the URL params on PATH request. Default: `false`  \n`returnDeleted` - whether or not an entity object should be returned in the response body on DELETE request. Default: `false`\n\n### Params Options\n\n`CrudOptions` object may have `params` parameter that will be used for validation sake of you URL params and for defining a slug param (if it differs from `id` that is used by default).\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: {\n    companyId: 'number'\n  }\n})\n@Controller('/company/:companyId/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field.\n\nIf you don't want to use numeric `id` (by default) and, say, you use some unique field, e.g. it's called `slug` and it's a UUID string - in that case need to add this:\n\n```typescript\n{\n  params: {\n    slug: 'uuid';\n  }\n}\n```\n\nOr if your slug/id is just another random unique string, then:\n\n```typescript\n{\n  params: {\n    id: 'string';\n  }\n}\n```\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` (or another field that you defined) of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Validation Options\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\nYou can pass you custom validation options here:\n\n```typescript\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  validation: {\n    validationError: {\n      target: false,\n      value: false\n    }\n  }\n})\n@Controller('heroes')\n...\n```\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Method Override\n\nList of composed base methods:\n\n```typescript\ngetManyBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<GetManyDefaultResponse<T> | T[]>;\n\ngetOneBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<T>;\n\ncreateOneBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n): Promise<void | T>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport {\n  Crud,\n  CrudController,\n  Override,\n  RestfulParamsDto,\n  ParsedQuery,\n  ParsedParams,\n  ParsedOptions\n} from '@nestjsx/crud';\n\n@Crud(Hero, {})\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n    return this.base.getManyBase(query, options);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n  }\n\n  @Override()\n  createOne(\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  ) {\n    return this.base.createOneBase(params, body);\n  }\n\n  @Override()\n  createMany(\n    @ParsedBody() body: EntitiesBulk<Hero>, // validation is working ^_^\n    @ParsedParams() params,\n    ) {\n    return this.base.createManyBase(params, body);\n  }\n\n  @Override('updateOneBase')\n  coolFunction() {\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  } {\n    return this.base.updateOneBase(params, body);\n  }\n\n  @Override()\n  async deleteOne(\n    @ParsedParams() params,\n  ) {\n    return this.base.deleteOneBase(params);\n  }\n\n}\n```\n\n**_Notice:_** new custom route decorators were created to simplify process: `@ParsedQuery()`, `@ParsedParams`, `@ParsedBody()`, and`@ParsedOptions()`. But you still can add your param decorators to any of the methods, e.g. `@Param()`, `@Session()`, etc. Or any of your own cutom route decorators.\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Reflector } from '@nestjs/core';\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { getFeature, getAction } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  constructor(private reflector: Reflector) {}\n\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = getFeature(controller);\n    const action = getAction(handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git\ncd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\n```shell\ndocker-compose up -d\nnpm run test:e2e\n```\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.2.0-beta.2","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-x4jGmb3oM83e6Jc+ZP48h9DLuNeWrGyhcFAgaFV7qSFc5s8kL+53oh9BUPPGovmWhB0keqStA9pUQ4RNOy96PQ==","shasum":"27a04683f87146468d471caa26520db17e5d86b0","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.2.0-beta.2.tgz","fileCount":141,"unpackedSize":188255,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmgfICRA9TVsSAnZWagAAKbkP/1xA24EzKKZxP9D7AvKM\nsWpk2ApaLPG4w1cr0bxbx0CxPLtdsipj7zb3JUEIGQTMAxJq3DPBVkQyirFV\n9ZDWcl/iesY9e4b6h6dG4Afvxr9tCRnxM/1GlY5sWAURom7pivaSUoCzqnxd\n3b8xoLfGGoTNHJL8bIcRjb9VmAmKUN7pQtiAnb7VZLCtSJnyP3skzPe82tnm\n7IRHTgMkcz10GZpql53/dL6zNhNKFh+gBQWROUpt1uHwcLqAkqPJM0rUUvjT\nWsBs6CCXUU/zNgKZNPCgLldroZmI8dASiVCvJ8RV3jFhHyP4sZ+xdsmJiYtm\nSB/LbuR208cQgWeeCxflgY3/P5trvPzxblaAscG0+Lye5g3nv7GOith+H1Xs\nCeP/fwVp7+RiKqa6gc/kRjbqcLbiV2f1Gdheux7gDaZGkp2fOizNvpcqYzuT\nb8Rt5shGHR9nFKUOMW//rxv6zSvlO6a2/I311TU76DtlEz1T/CCs7sFrL6HF\nRK1vm0DJDvjNt/jDhPZjdwVZHPk+7oPjI25HZvB5uwYbnZ9j4C/2l1Uc9PX6\njN0uzl2jGirKMpWdYjMMJWMClVP6NErlSegJAiT+f/KpyCO/1F5CVw2Fdz79\n+/2xlmTPwcyKu5o3ciKVUZKXgY4cZMSjte1et8UQqXFgBg3JLkyZlJviz6yr\nkqX7\r\n=AIty\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICh5MGPyoZWwa6LMSpQbmhgdIzkC44j0WK+1XLj2vwpjAiEA/5dHTOHg1txoUEzuOwujtU47oPft2uETGn8zLm+rr4I="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.2.0-beta.2_1553598407890_0.3903744905866706"},"_hasShrinkwrap":false},"3.2.0":{"name":"@nestjsx/crud","version":"3.2.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^6","@nestjs/core":"^6","@nestjs/typeorm":"^6"},"homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.2.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-x8pgrp4oA6BHlsRKixr/V38nkKau8F8KzBK9ZovNi4MIECi1qr8dB2vCu75Hat+PzCvJTjAg1QtgFfLL+ePVrA==","shasum":"ca93eccdb5144886b50bc10e99db1886bfc02c4c","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.2.0.tgz","fileCount":141,"unpackedSize":188968,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmy4JCRA9TVsSAnZWagAAt34P/jJu9bIUUObqrSvOqEX3\nmwvi/oCw2TP5DNus3bfYRcPugFBNcTPDOIndz2M7kmfJ2qHS8L/BV8+uOp7G\nkNLwnLaguLwSOvv+baIugT8Yyv2GJyaoAkuWoG3SsEx+uQcPOr6rLwSo29jP\n7qMRTSBgjoXj9JZuO+ZvtBkKDFstnEESrMA5tEvrjoDVQ4h4kS1avAV1fxCV\nPKIsln27hMWlqAqg3lkfv8YABMxeafsXdO6q8cpmeN46nPcwQqD8bX3jXAA3\ncimfZJ/WdOtA09VsbdE0TOtHEH4Choc6p1e5lArZL6He4ajX8cOdZV07Zd24\nvnoO4RBnGesebHwwOJ9T0zJzO4hMqajk68xY4rnTwQDlTlPsV1Wmg0hU7dou\nXTuIB0/LcKHw1zP/VKQ4LUKqFibOxzTR53nP+so2MEH3F3xgbkZJtwv49zvo\nEi/CrKCeHzgJfK3KVKhKyJjVWfQhgud0CkGDDeVNcISjwH0VjThPTRDGz0ck\nklgR/S5RDerzmyEOGQPTCYneHlrvifW7YCOlp0OfEjazct4XfGJK2CkzQHlj\naY5j6Atqe7Wsc3fKAprn2q4t9InaB/OMAS49zexAV8nw1ADmAYghl58sW5SR\nzJKLNOzKR3CdxreVxqfCr0AdiZkTqZA+l91b4APdMpwCp4FbbYJ1Hz6ZNyuT\nGULt\r\n=b07a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC0gjUAtKB6H4af7BIMJComM0vpW2U0ooXjra8c70qijQIhAM+a9ASPufTUjCuoIna/sWrkcb2LMVU6B4SA2odMcRlU"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.2.0_1553673736781_0.9963991771439251"},"_hasShrinkwrap":false},"3.3.0-rc.0":{"name":"@nestjsx/crud","version":"3.3.0-rc.0","description":"NestJs CRUD for RESTful APIs","main":"index.js","types":"index.d.ts","repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"license":"MIT","peerDependencies":{"@nestjs/common":"^6","@nestjs/core":"^6","@nestjs/typeorm":"^6"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/nestjsx\" target=\"blank\"><img src=\"https://github.com/nestjsx/nestjsx/raw/master/img/logo.png\" width=\"160\" alt=\"Nestjsx Logo\" /></a>\n</p>\n<p align=\"center\">\n  A set of opinionated <a href=\"https://github.com/nestjs/nest\" target=\"blank\">NestJS</a> extensions and modules\n</p>\n<p align=\"center\">\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\"><img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg?branch=master\" alt=\"Build\" /></a>\n  <a href=\"https://travis-ci.org/nestjsx/crud\"><img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Coverage\" /></a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\"><img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" /></a>\n</p>\n\n# NestJs CRUD for RESTful APIs\n\n`@nestjsx/crud` has been designed for creating CRUD controllers and services for RESTful applications built with NestJs. It can be used with TypeORM repositories for now, but Mongoose functionality perhaps will be available in the future.\n\n## Features and merits\n\n- CRUD endpoints generation, based on a repository service and an entity.\n- Ability to generate CRUD endpoints with predefined path filter.\n- Composition of controller methods instead of inheritance (no tight coupling and less surprises)\n- Overriding controller methods with ease.\n- Request validation.\n- Query parameters parsing with filters, pagination, sorting, joins, nested joins, etc.\n- Super fast DB query building.\n- Additional handy decorators.\n\n## Table of Contents\n\n- [Install](#install)\n- [Getting Started](#getting-started)\n  - [Entity](#entity)\n  - [Service](#service)\n  - [Controller](#controller)\n- [API Endpoints](#api-endpoints)\n- [Swagger](#swagger)\n- [Query Parameters](#query-parameters)\n- [Repository Service](#repository-service)\n  - [Restful Options](#restful-options)\n- [Crud Controller](#crud-controller)\n  - [Restful Options](#options-restful)\n  - [Routes Options](#routes-options)\n  - [Params Options](#params-options)\n  - [Validation Options](#validation-options)\n  - [IntelliSense](#intellisense)\n  - [Routes Override](#routes-override)\n  - [Adding Routes](#adding-routes)\n  - [Additional Decorators](#additional-decorators)\n- [Example Project](#example-project)\n- [Contribution](#contribution)\n- [Tests](#tests)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm i @nestjsx/crud --save\nnpm i @nestjs/typeorm typeorm class-validator class-transformer --save\n```\n\n## Getting Started\n\n### Entity\n\nAssume you have some TypeORM enitity:\n\n```typescript\nimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity()\nexport class Hero {\n  @PrimaryGeneratedColumn() id: number;\n\n  @Column() name: string;\n}\n```\n\n### Service\n\nNext, let's create a [Repository Service](#repository-service) for it:\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { forTypeORM } from '@nestjsx/crud';\nimport RepositoryService = forTypeORM.RepositoryService;\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nJust like that!\n\n### Controller\n\nNext, let create a [Crud Controller](#crud-controller) that expose some RESTful endpoints for us:\n\n```typescript\nimport { Controller } from '@nestjs/common';\nimport { Crud } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\nimport { HeroesService } from './heroes.service';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nAnd that's it, no more inheritance and tight coupling. Let's see what happens here:\n\n```typescript\n@Crud(Hero)\n```\n\nWe pass our `Hero` entity as a `dto` for [Validation](#validation) purpose and inject `HeroesService`. After that, all you have to do is to hook up everything in your module. And after being done with these simple steps your application will expose these endpoints:\n\n## API Endpoints\n\n### Get Many Entities\n\n> `GET /heroes`  \n> `GET /heroes/:heroId/perks`\n\n_Result:_ array of entities | pagination object with data\n_Status Codes:_ 200\n\n### Get One Entity\n\n> `GET /heroes/:id`  \n> `GET /heroes/:heroId/perks:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_ entity object | error object  \n_Status Codes:_ 200 | 404\n\n### Create One Entity\n\n> `POST /heroes`  \n> `POST /heroes/:heroId/perks`\n\n_Request Body:_ entity object | entity object with nested (relational) objects  \n_Result:_ created entity object | error object  \n_Status Codes:_ 201 | 400\n\n### Create Many Entities\n\n> `POST /heroes/bulk`  \n> `POST /heroes/:heroId/perks/bulk`\n\n_Request Body:_ array of entity objects | array of entity objects with nested (relational) objects\n\n```json\n{\n  \"bulk\": [{ \"name\": \"Batman\" }, { \"name\": \"Batgirl\" }]\n}\n```\n\n_Result:_ array of created entitie | error object  \n_Status codes:_ 201 | 400\n\n### Update One Entity\n\n> `PATCH /heroes/:id`  \n> `PATCH /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Request Body:_ entity object (or partial) | entity object with nested (relational) objects (or partial)  \n_Result:_: updated partial entity object | error object  \n_Status codes:_ 200 | 400 | 404\n\n### Delete One Entity\n\n> `DELETE /heroes/:id`  \n> `DELETE /heroes/:heroId/perks/:id`\n\n_Request Params:_ `:id` - some entity field (slug)  \n_Result:_: empty | error object  \n_Status codes:_ 200 | 404\n\n## Swagger\n\n[Swagger](https://docs.nestjs.com/recipes/swagger) support is present out of the box, including [Query Parameters](#query-parameters) and [Path Filter](#path-filter).\n\n## Query Parameters\n\n`GET` endpoints that are generated by CRUD controller support some useful query parameters (all of them are _optional_):\n\n- [**`fields`**](#fields) - get selected fields in GET result\n- [**`filter`**](#filter) (alias: `filter[]`) - filter GET result by `AND` type of condition\n- [**`or`**](#or) (alias: `or[]`) - filter GET result by `OR` type of condition\n- [**`sort`**](#sort) (alias: `sort[]`) - sort GET result by some `field` in `ASC | DESC` order\n- [**`join`**](#join) (alias: `join[]`) - receive joined relational entities in GET result (with all or selected fields)\n- [**`limit`**](#limit) (alias `per_page`) - receive `N` amount of entities\n- [**`offset`**](#offset) - offset `N` amount of entities\n- [**`page`**](#page) - receive a portion of `limit` (`per_page`) entities (alternative to `offset`)\n- [**`cache`**](#cache) - reset cache (if was enabled) and receive entities from the DB\n\n### fields\n\nSelects fields that should be returned in the reponse body.\n\n_Syntax:_\n\n> ?fields=**field1**,**field2**,...\n\n_Example:_\n\n> ?fields=**email**,**name**\n\n### filter\n\nAdds fields request condition (multiple conditions) to you request.\n\n_Syntax:_\n\n> ?filter=**field**||**condition**||**value**\n\n> ?join=**relation**&filter=**relation**.**field**||**condition**||**value**\n\n**_Notice:_** Using nested filter shall join relation first.\n\n_Examples:_\n\n> ?filter=**name**||**eq**||**batman**\n\n> ?filter=**isVillain**||**eq**||**false**&filter=**city**||**eq**||**Arkham** (multiple filters are treated as a combination of `AND` type of conditions)\n\n> ?filter=**shots**||**in**||**12**,**26** (some conditions accept multiple values separated by commas)\n\n> ?filter=**power**||**isnull** (some conditions don't accept value)\n\n_Alias:_ `filter[]`\n\n### filter conditions\n\n(**condition** - `operator`):\n\n- **`eq`** (`=`, equal)\n- **`ne`** (`!=`, not equal)\n- **`gt`** (`>`, greater than)\n- **`lt`** (`<`, lower that)\n- **`gte`** (`>=`, greater than or equal)\n- **`lte`** (`<=`, lower than or equal)\n- **`starts`** (`LIKE val%`, starts with)\n- **`ends`** (`LIKE %val`, ends with)\n- **`cont`** (`LIKE %val%`, contains)\n- **`excl`** (`NOT LIKE %val%`, not contains)\n- **`in`** (`IN`, in range, **_accepts multiple values_**)\n- **`notin`** (`NOT IN`, not in range, **_accepts multiple values_**)\n- **`isnull`** (`IS NULL`, is NULL, **_doesn't accept value_**)\n- **`notnull`** (`IS NOT NULL`, not NULL, **_doesn't accept value_**)\n- **`between`** (`BETWEEN`, between, **_accepts two values_**)\n\n### or\n\nAdds `OR` conditions to the request.\n\n_Syntax:_\n\n> ?or=**field**||**condition**||**value**\n\nIt uses the same [filter conditions](#filter-conditions).\n\n_Rules and examples:_\n\n- If there is only **one** `or` present (without `filter`) then it will be interpreted as simple [filter](#filter):\n\n> ?or=**name**||**eq**||**batman**\n\n- If there are **multiple** `or` present (without `filter`) then it will be interpreted as a compination of `OR` conditions, as follows:  \n  `WHERE {or} OR {or} OR ...`\n\n> ?or=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If there are **one** `or` and **one** `filter` then it will be interpreted as `OR` condition, as follows:  \n  `WHERE {filter} OR {or}`\n\n> ?filter=**name**||**eq**||**batman**&or=**name**||**eq**||**joker**\n\n- If present **both** `or` and `filter` in any amount (**one** or **miltiple** each) then both interpreted as a combitation of `AND` conditions and compared with each other by `OR` condition, as follows:  \n  `WHERE ({filter} AND {filter} AND ...) OR ({or} AND {or} AND ...)`\n\n> ?filter=**type**||**eq**||**hero**&filter=**status**||**eq**||**alive**&or=**type**||**eq**||**villain**&or=**status**||**eq**||**dead**\n\n_Alias:_ `or[]`\n\n### sort\n\nAdds sort by field (by multiple fields) and order to query result.\n\n_Syntax:_\n\n> ?sort=**field**,**ASC|DESC**\n\n_Examples:_\n\n> ?sort=**name**,**ASC**\n\n> ?sort=**name**,**ASC**&sort=**id**,**DESC**\n\n_Alias:_ `sort[]`\n\n### join\n\nReceive joined relational objects in GET result (with all or selected fields). You can join as many relations as allowed in your [Restful Options](#restful-options).\n\n_Syntax:_\n\n> ?join=**relation**\n\n> ?join=**relation**||**field1**,**field2**,...\n\n> ?join=**relation1**||**field11**,**field12**,...&join=**relation1**.**nested**||**field21**,**field22**,...&join=...\n\n_Examples:_\n\n> ?join=**profile**\n\n> ?join=**profile**||**firstName**,**email**\n\n> ?join=**profile**||**firstName**,**email**&join=**notifications**||**content**&join=**tasks**\n\n> ?join=**relation1**&join=**relation1**.**nested**&join=**relation1**.**nested**.**deepnested**\n\n**_Notice:_** `id` field always persists in relational objects. To use nested relations, the parent level **MUST** be set before the child level like example above.\n\n_Alias:_ `join[]`\n\n### limit\n\nReceive `N` amount of entities.\n\n_Syntax:_\n\n> ?limit=**number**\n\n_Example:_\n\n> ?limit=**10**\n\n_Alias:_ `per_page`\n\n### offset\n\nOffset `N` amount of entities\n\n_Syntax:_\n\n> ?offset=**number**\n\n_Example:_\n\n> ?offset=**10**\n\n### page\n\nReceive a portion of `limit` (`per_page`) entities (alternative to `offset`). Will be applied if `limit` is set up.\n\n_Syntax:_\n\n> ?page=**number**\n\n_Example:_\n\n> ?page=**2**\n\n### cache\n\nReset cache (if was enabled) and receive entities from the DB.\n\n_Usage:_\n\n> ?cache=0\n\n## Repository Service\n\n`RepositoryService` is the main class where all DB operations related logic is in place.\n\n```typescript\nimport { Injectable } from '@nestjs/common';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { RepositoryService } from '@nestjsx/crud/typeorm';\nimport { RestfulOptions } from '@nestjsx/crud';\n\nimport { Hero } from './hero.entity';\n\n@Injectable()\nexport class HeroesService extends RepositoryService<Hero> {\n  protected options: RestfulOptions = {};\n\n  constructor(@InjectRepository(Hero) repo) {\n    super(repo);\n  }\n}\n```\n\nThis class can accept optional parameter called `options` that will be used as default options for `GET` requests. All fields inside that parameter are otional as well.\n\n### Restful Options\n\n- [**`allow`**](#allow-option)\n- [**`exclude`**](#exclude-option)\n- [**`persist`**](#persist-option)\n- [**`filter`**](#filter-option)\n- [**`join`**](#join-option)\n- [**`sort`**](#sort-option)\n- [**`limit`**](#limit-option)\n- [**`maxLimit`**](#maxlimit-option)\n- [**`cache`**](#cache-option)\n\n### allow option\n\nAn Array of [fields](#fields) that are allowed to receive in `GET` request. If empty or _undefined_ - allow all.\n\n```typescript\n{\n  allow: ['name', 'email'];\n}\n```\n\n### exclude option\n\nan Array of [fields](#fields) that will be excluded from the `GET` response (and not queried from the DB).\n\n```typescript\n{\n  exclude: ['accessToken'];\n}\n```\n\n### persist option\n\nAn Array of [fields](#fields) that will be always persisted in `GET` response\n\n```typescript\n{\n  persist: ['createdAt'];\n}\n```\n\n**_Notice:_** `id` field always persists automatically.\n\n### filter option\n\nAn Array of `filter` objects that will be merged (combined) with query [filter](#filter) if those are passed in `GET` request. If not - `filter` will be added to the DB query as a stand-alone condition.\n\nIf fultiple items are added, they will be interpreted as `AND` type of conditions.\n\n```typescript\n{\n  filter: [\n    {\n      field: 'deleted',\n      operator: 'ne',\n      value: true,\n    },\n  ];\n}\n```\n\n`operator` property is the same as [filter conditions](#filter-conditions).\n\n### join option\n\nAn Object of [relations](http://typeorm.io/#/relations) that allowed to be fetched by passing [join](#join) query parameter in `GET` requests.\n\n```typescript\n{\n  join: {\n    profile: {\n      persist: ['name']\n    },\n    tasks: {\n      allow: ['content'],\n    },\n    notifications: {\n      exclude: ['token']\n    },\n    company: {},\n    'company.projects': {\n      persist: ['status']\n    },\n    'users.projects.tasks': {\n      exclude: ['description'],\n    },\n  }\n}\n```\n\nEach key of `join` object must **strongly match** the name of the corresponding entity relation. If particular relation name **is not** present in this option, then user **will not be able** to [join](#join) it in `GET` request.\n\nEach relation option can have [allow](#allow-option), [exclude](#exclude-option) and [persist](#persist-option). All of them are optional as well.\n\n### sort option\n\nAn Array of `sort` objects that will be merged (combined) with query [sort](#sort) if those are passed in `GET` request. If not - `sort` will be added to the DB query as a stand-alone condition.\n\n```typescript\n{\n  sort: [\n    {\n      field: 'id',\n      order: 'DESC',\n    },\n  ];\n}\n```\n\n### limit option\n\nDefault [limit](#limit) that will be aplied to the DB query.\n\n```typescript\n{\n  limit: 25,\n}\n```\n\n### maxLimit option\n\nMax amount of results that can be queried in `GET` request.\n\n```typescript\n{\n  maxLimit: 100,\n}\n```\n\n**_Notice:_** **_it's strongly recommended to set up this option. Otherwise DB query will be executed without any LIMIT if no [limit](#limit) was passed in the query or if the [limit option](#limit-option) hasn't been set up_**.\n\n### cache option\n\nIf [Caching Results](http://typeorm.io/#/caching) is implemented on you project, then you can set up default `cache` in milliseconds for `GET` response data.\n\n```typescript\n{\n  cache: 2000,\n}\n```\n\n`Cache.id` strategy is based on a query that is built by a service, so if you change one of the query parameters in the next request, the result will be returned by DB and saved in the cache.\n\nCache can be [reseted](#cache) by using the query parameter in your `GET` requests.\n\n## Crud Controller\n\nOur newly generated working horse.\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  // CrudOptions goes here\n})\n@Controller('heroes')\nexport class HeroesCrudController {\n  constructor(public service: HeroesService) {}\n}\n```\n\n`@Crud()` decorator accepts two arguments - Entity class and `CrudOptions` object. All fields here are optional as well. Let's dive in some details.\n\n### Crud Options\n\n- [**`options`**](#options-restful)\n- [**`routes`**](#routes-options)\n- [**`params`**](#params-options)\n- [**`validation`**](#validaton-options)\n\n### Options (restful)\n\nThis option has the same structure as as [Restful Options](#restful-options).\n\n**_Notice:_** If you have this options set up in your `RepositoryService`, in that case they will be **merged**.\n\n### Routes Options\n\nThis object may have `exclude` and `only` arrays of route names which must be excluded or only which ones must be created accordingly.\n\n```typescript\n{\n  routes: {\n    only: ['getManyBase'];\n  }\n}\n```\n\n```typescript\n{\n  routes: {\n    exclude: ['createManyBase'];\n  }\n}\n```\n\n**_Notice:_** If both are present, then `exclude` will be ignored.\n\nAlso, routes options object may have some options for each particular route:\n\n```typescript\n{\n  routes: {\n    getManyBase: {\n      interceptors: [],\n      decorators: [],\n    },\n    getOneBase: {\n      interceptors: [],\n      decorators: [],\n    },\n    createOneBase: {\n      interceptors: [],\n      decorators: [],\n    },\n    createManyBase: {\n      interceptors: [],\n      decorators: [],\n    },\n    updateOneBase: {\n      interceptors: [],\n      decorators: [],\n      allowParamsOverride: true\n    },\n    deleteOneBase: {\n      interceptors: [],\n      decorators: [],\n      returnDeleted: true\n    },\n  }\n}\n```\n\n`interceptors` - an array of your custom interceptors  \n`decorators` - an array of your custom decorators\n`allowParamsOverride` - whether or not to allow body data be overriten by the URL params on PATH request. Default: `false`  \n`returnDeleted` - whether or not an entity object should be returned in the response body on DELETE request. Default: `false`\n\n**_Notice:_** `decorators` will not move from original ones to override ones\n\n### Params Options\n\n`CrudOptions` object may have `params` parameter that will be used for validation sake of you URL params and for defining a slug param (if it differs from `id` that is used by default).\n\nAssume, you have an entity `User` that belongs to some `Company` and has a field `companyId`. And you whant to create `UsersController` so that an admin could access users from his own Company only. Let's do this:\n\n```typescript\n...\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  params: {\n    companyId: 'number'\n  }\n})\n@Controller('/company/:companyId/users')\nexport class UsersCrud {\n  constructor(public service: UsersService) {}\n}\n```\n\nIn this example you're URL param name `companyId` should match the name of `User.companyId` field.\n\nIf you don't want to use numeric `id` (by default) and, say, you use some unique field, e.g. it's called `slug` and it's a UUID string - in that case need to add this:\n\n```typescript\n{\n  params: {\n    slug: 'uuid';\n  }\n}\n```\n\nOr if your slug/id is just another random unique string, then:\n\n```typescript\n{\n  params: {\n    id: 'string';\n  }\n}\n```\n\nAs you might guess, all request will add `companyId` to the DB queries alongside with the `:id` (or another field that you defined) of `GET`, `PATCH`, `DELETE` requests. On `POST` (both: one and bulk) requests, `companyId` will be added to the `dto` automatically.\n\nWhen you done with the controller, you'll need to add some logic to your `AuthGuard` or any other interface, where you do the authorization of a requester. You will need to match `companyId` URL param with the `user.companyId` entity that has been validated from the DB.\n\n### Validation Options\n\nRequest data validation is performed by using [class-validator](https://github.com/typestack/class-validator) package and [ValidationPipe](https://docs.nestjs.com/techniques/validation). If you don't use this approach in your project, then you can implementat request data validation on your own.\n\nWe distinguish request validation on `create` and `update` methods. This was achieved by using [validation groups](https://github.com/typestack/class-validator#validation-groups).\n\nLet's take a look at this example:\n\n```typescript\nimport { Entity, Column, JoinColumn, OneToOne } from 'typeorm';\nimport {\n  IsOptional,\n  IsString,\n  MaxLength,\n  IsNotEmpty,\n  IsEmail,\n  IsBoolean,\n  ValidateNested,\n} from 'class-validator';\nimport { Type } from 'class-transformer';\nimport { CrudValidate } from '@nestjsx/crud';\n\nimport { BaseEntity } from '../base-entity';\nimport { UserProfile } from '../users-profiles/user-profile.entity';\n\nconst { CREATE, UPDATE } = CrudValidate;\n\n@Entity('users')\nexport class User extends BaseEntity {\n  @IsOptional({ groups: [UPDATE] }) // validate on PATCH only\n  @IsNotEmpty({ groups: [CREATE] }) // validate on POST only\n  @IsString({ always: true }) // validate on both\n  @MaxLength(255, { always: true })\n  @IsEmail({ require_tld: false }, { always: true })\n  @Column({ type: 'varchar', length: 255, nullable: false, unique: true })\n  email: string;\n\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @IsBoolean({ always: true })\n  @Column({ type: 'boolean', default: true })\n  isActive: boolean;\n\n  @Column({ nullable: true })\n  profileId: number;\n\n  // validate relations\n  @IsOptional({ groups: [UPDATE] })\n  @IsNotEmpty({ groups: [CREATE] })\n  @ValidateNested({ always: true })\n  @Type((t) => UserProfile)\n  @OneToOne((type) => UserProfile, (p) => p.user, { cascade: true })\n  @JoinColumn()\n  profile: UserProfile;\n}\n```\n\nYou can import `CrudValidate` enum and set up validation rules for each field on firing of `POST`, `PATCH` requests or both of them.\n\nYou can pass you custom validation options here:\n\n```typescript\nimport { Crud } from '@nestjsx/crud';\n\n@Crud(Hero, {\n  validation: {\n    validationError: {\n      target: false,\n      value: false\n    }\n  }\n})\n@Controller('heroes')\n...\n```\n\n### IntelliSense\n\nPlease, keep in mind that we compose `HeroesController.prototype` by the logic inside our `@Crud()` class decorator. And there are some unpleasant but not very significant side effects of this approach.\n\nFirst, there is no IntelliSense on composed methods. That's why we need to use `CrudController` interface:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n}\n```\n\nThis will help to make sure that you're injecting proper [Repository Service](#repository-service).\n\nSecond, even after adding `CrudController` interface you still wouldn't see composed methods, accessible from `this` keyword, furthermore, you'll get a TS error. In order to solve this, I've couldn't came up with better idea than this:\n\n```typescript\n...\nimport { Crud, CrudController } from '@nestjsx/crud';\n\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n}\n```\n\n### Routes Override\n\nList of composed base routes methods:\n\n```typescript\ngetManyBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<GetManyDefaultResponse<T> | T[]>;\n\ngetOneBase(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n): Promise<T>;\n\ncreateOneBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ncreateManyBase(\n  @ParsedParams() params: FilterParamParsed[],\n  @ParsedBody() dto: EntitiesBulk<T>,\n): Promise<T[]>;\n\nupdateOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n  @ParsedBody() dto: T,\n): Promise<T>;\n\ndeleteOneBase(\n  @ParsedParams() params: FilterParamParsed[]\n): Promise<void | T>;\n```\n\nSince all composed methods have `Base` ending in their names, overriding those endpoints could be done in two ways:\n\n1. Attach `@Override()` decorator without any argument to the newly created method wich name doesn't contain `Base` ending. So if you want to override `getManyBase`, you need to create `getMany` method.\n\n2. Attach `@Override('getManyBase')` decorator with passed base method name as an argument if you want to override base method with a function that has a custom name.\n\n```typescript\n...\nimport {\n  Crud,\n  CrudController,\n  Override,\n  RestfulParamsDto,\n  ParsedQuery,\n  ParsedParams,\n  ParsedOptions\n} from '@nestjsx/crud';\n\n@Crud(Hero, {})\n@Controller('heroes')\nexport class HeroesCrud {\n  constructor(public service: HeroesService) {}\n\n  get base(): CrudController<HeroesService, Hero> {\n    return this;\n  }\n\n  @Override()\n  getMany(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n    return this.base.getManyBase(query, options);\n  }\n\n  @Override('getOneBase')\n  getOneAndDoStuff(\n    @ParsedQuery() query: RestfulParamsDto,\n    @ParsedOptions() options: CrudOptions,\n  ) {\n    // do some stuff\n  }\n\n  @Override()\n  createOne(\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  ) {\n    return this.base.createOneBase(params, body);\n  }\n\n  @Override()\n  createMany(\n    @ParsedBody() body: EntitiesBulk<Hero>, // validation is working ^_^\n    @ParsedParams() params,\n    ) {\n    return this.base.createManyBase(params, body);\n  }\n\n  @Override('updateOneBase')\n  coolFunction() {\n    @ParsedParams() params,\n    @ParsedBody() body: Hero,\n  } {\n    return this.base.updateOneBase(params, body);\n  }\n\n  @Override()\n  async deleteOne(\n    @ParsedParams() params,\n  ) {\n    return this.base.deleteOneBase(params);\n  }\n\n}\n```\n\n**_Notice:_** new custom route decorators were created to simplify process: `@ParsedQuery()`, `@ParsedParams`, `@ParsedBody()`, and `@ParsedOptions()`. But you still can add your param decorators to any of the methods, e.g. `@Param()`, `@Session()`, etc. Or any of your own cutom route decorators.\n\n### Adding Routes\n\nSometimes you might need to add a new route and to use `@ParsedQuery()`, `@ParsedParams`, `@ParsedOptions()` in it. You need to use `@UsePathInterceptors()` method decorator in order to do that:\n\n```typescript\n...\nimport { UsePathInterceptors } from '@nestjsx/crud';\n...\n\n@UsePathInterceptors()\n@Get('/export/list.xlsx')\nasync exportSome(\n  @ParsedQuery() query: RestfulParamsDto,\n  @ParsedOptions() options: CrudOptions,\n) {\n  // some logic\n}\n```\n\nBy default this decorator will parse `query` and `param`. But you can specify what you need to parse by passing the appropriate argument (`@UsePathInterceptors('query')` or `@UsePathInterceptors('param')`).\n\n### Additional Decorators\n\nThere are two additional decorators that come out of the box: `@Feature()` and `@Action()`:\n\n```typescript\n...\nimport { Feature, Crud, CrudController } from '@nestjsx/crud';\n\n@Feature('Heroes')\n@Crud(Hero)\n@Controller('heroes')\nexport class HeroesController {\n  constructor(public service: HeroesService) {}\n}\n```\n\nYou can use them with your [ACL](https://en.wikipedia.org/wiki/Access_control_list) implementation. `@Action()` will be applyed automaticaly on controller compoesd base methods. There is `CrudActions` enum that you can import and use:\n\n```typescript\nenum CrudActions {\n  ReadAll = 'Read-All',\n  ReadOne = 'Read-One',\n  CreateOne = 'Create-One',\n  CreateMany = 'Create-Many',\n  UpdateOne = 'Update-One',\n  DeleteOne = 'Delete-One',\n}\n```\n\n`ACLGuard` dummy example:\n\n```typescript\nimport { Reflector } from '@nestjs/core';\nimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';\nimport { getFeature, getAction } from '@nestjsx/crud';\n\n@Injectable()\nexport class ACLGuard implements CanActivate {\n  constructor(private reflector: Reflector) {}\n\n  canActivate(ctx: ExecutionContext): boolean {\n    const handler = ctx.getHandler();\n    const controller = ctx.getClass();\n\n    const feature = getFeature(controller);\n    const action = getAction(handler);\n\n    console.log(`${feature}-${action}`); // e.g. 'Heroes-Read-All'\n\n    return true;\n  }\n}\n```\n\n## Example Project\n\n[Here](https://github.com/nestjsx/crud/tree/master/restful/integration/typeorm) you can find an example project that uses `@nestjsx/crud` features. In order to run it and play with it, please do the following:\n\n1. If you're using [Visual Studio Code](https://code.visualstudio.com/) it's recommended to add this option to your [User Settings](https://code.visualstudio.com/docs/getstarted/settings):\n\n```json\n\"javascript.implicitProjectConfig.experimentalDecorators\": true\n```\n\nOr you can open `integration/typeorm` folder separately in the Visual Studio Code.\n\n2. Clone the project\n\n```shell\ngit clone https://github.com/nestjsx/crud.git\ncd crud/integration/typeorm\n```\n\n3. Install [Docker](https://docs.docker.com/install/) and [Docker Compose](https://docs.docker.com/compose/install/) if you haven't done it yet.\n\n4. Run Docker services:\n\n```shell\ndocker-compose up -d\n```\n\n5. Run application:\n\n```shell\nnpm run serve\n```\n\nServer should start on default port `3333`, you can override in `PORT` environment variable.\n\nIf you want to flush the DB data, run:\n\n```shell\nnpm run db:flush\n```\n\n## Contribution\n\nAny support is wellcome. Please open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n## Tests\n\n```shell\ndocker-compose up -d\nnpm run test:e2e\n```\n\n## License\n\n[MIT](https://github.com/nestjsx/nestjsx/blob/master/LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@3.3.0-rc.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"dist":{"integrity":"sha512-epY+3RnLu64Jq1MPA0Z0udDHlGRmLBe1YREy9C7FtfDiSrj+FOV+hvsVUJoMFSKVfrj2TThIZhb9cvIUIgvxnQ==","shasum":"02dddc3b565c606c374e716b15d3791ea67d7a09","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-3.3.0-rc.0.tgz","fileCount":141,"unpackedSize":192243,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnJHWCRA9TVsSAnZWagAAIUoP+wRwjixg6BGOnYfAdgJv\nWdJ82yi9zRPfAeiEQHui5w0H9iPZ8qL9IhF1assPIpVkW1BV4RNbvgFqYtzG\nMA2iahoBw3Ubjwg5kjVRGilnEtA2AoxZEyI2ZvolczWlAD3x2FqI1660NBbw\nszu+mNq8wDDHH5cKt6mXNqMthyV4DTzPzDUGCb9b6/erXHOarvGBmczxC5LO\nfhd7A3aazspOGlN9XT4tAo/1844TBtqc50oOhZ5CKFd3XqvBVwD1paP7DgUP\nUg0KiqCuqsHJPT932iMJNM9O5Z9/xoxIxtN72mZaowSxUT56QYrFhXli5e6n\nuOiNg8IbFD79eAUNLUBaJfOF/RtDVn09lDUeuY+gpRtv0MaIMdBOv+DBhYWr\nLGJlgtpJU7tHfGtKSggq+w0F+47cLdyv76UZt5vC1QrVM98JS6HlPNtFcXjj\n9ZDkWZO4HeBII880U5mrTHbSWlASgBK2eWJHajQ2iKBdz33j5oiyTHLp6mLp\nOeucnYMRaTU9ZDbpEklVKDSaRw1CbCB7kiCFEksmBef6xZ1a83GiNQgard+H\nLoI3c5Dhxxz/NaX0F9JtxG0Bt0H/D1F8EjjEPkgT9zxFQ406cuAMbGBAyKql\nrdnh7D7wllo5zeLdYTHvR/bFeDVvFEKtOZvfl/VkfI9lk/11l0E/JI5gKHG/\nikMp\r\n=BOxP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGcQCy/WPk179Kj4GqBnqGvflJKXXsKmETooQm9y4kCwIgcxx/wPBbxvEe1d9i1LHLI36p8Lfbdax6z/0sUwoCjO8="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_3.3.0-rc.0_1553764821343_0.7049457381914219"},"_hasShrinkwrap":false},"4.0.0-rc.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.0.0-rc.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.0.0-rc.1","@nestjsx/util":"^4.0.0-rc.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"cf59a91bfc82c5f739f3fb9d5f4a331309893b79","readme":"ERROR: No README data found!","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.0.0-rc.1","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.14.1/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-v7KCoMOzJpYQIUVp+t899tDmcaGmohLfoeocTrZ8o/x+NEot/F0cgM2IucSYs9+JBc7sHuvi94WLDfsnGTAr+w==","shasum":"5b46be2226b27fa24a3f1171b3c072538436f91a","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.0.0-rc.1.tgz","fileCount":111,"unpackedSize":86447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/mUwCRA9TVsSAnZWagAA6cUQAJR+59EDgq87yJM5XaxI\nzz5lEX6RSvbUE5KIXKfaz0ysQGiMBbTu2+A+3fmtwFlpO53L6FpuVtWCpcQh\n48p1W8Shr/HulxTGp1HKYpUydahLwTj2WEgebIk9iKd6/qiz126FDYs7BdSA\ngyf7P4zOb9iOAERSASd1GaKrnxY2UEXL/aiPCRzVqjtwA8xoZwQX+T6rye1S\n1vmmhhhyLeeIZtd8FBj8e7Tv9QmOseWLih2D30gEDabYQIOwrt7rh9Mnn/jP\ndhyqeYN0HQ2C1iTSIo8ZlR15KMAguD3ISSSzscYsbDmrF96DGCxglwGkrsRn\nazzXS4q2Y6/Xs8KTkmDg/7efDPJFmV5YgcpAuzPJtCDu6IvAU9SLZ0ynNpKF\nkAI9GtIZyRDBPTVWVO6T3x0Tizx7rnFI2OzeRC3s6iU6+GqkPdNgF0B1uTL8\nq5IEoORV8Ufja3Gd5idpJyYv9t0fNJ9pUmNWPOGpPQWvD4tFGlUNg5wdi5ds\nX0YFjjlxoBTzmKLBfk/Z5cKC2ZiYnDQ9xC6TVtD4ASwoDdJ5Jw3CbOhSYLag\n9XgmqhGQ2dRSBfy2leGt61jUBR9u7NRbxzrAFPd0YYbs8qWFbLlQf/GPUI4/\nELUyWsNonbgI2tqg8AXM/ieluT6Ds8p3/LffZX0y901vwa2YtGoa5nI3s68h\nYITi\r\n=fWqV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFrnJVG5+rI3peOT0jJKDGKtELQKzQrclquYOZUQRrnIAiBI6s94ro1mFS9d8I6MnQzZYhH48LSsQiXhXHVJKex0MA=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.0.0-rc.1_1560175919643_0.5131525764746454"},"_hasShrinkwrap":false},"4.0.0-rc.2":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.0.0-rc.2","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.0.0-rc.2","@nestjsx/util":"^4.0.0-rc.2","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"a9aeb5b01f8408d5f498f9514baa361a391a1575","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://greenkeeper.io/\">\n    <img src=\"https://badges.greenkeeper.io/nestjsx/crud.svg\" alt=\"Greenkeeper\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs]())\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs]())\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package wich provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internaly for handling and validating query/path params on a backend side ([docs]())\n\n## Documentation\n\nUse [Wiki](https://github.com/nestjsx/crud/wiki)\n\n## Roadmap\n\n- [x] TypeORM\n- [ ] Mongoose\n- [ ] Sequelize\n- [ ] JSON API standard\n\n## Support\n\nAny support is wellcome.\n\n### Contribution\n\nPlease open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n### Sponsorship\n\n<a href=\"https://opencollective.com/nestjsx/donate\" target=\"_blank\">\n  <img src=\"https://opencollective.com/nestjsx/donate/button@2x.png?color=blue\" width=200 />\n</a>\n\n## Tests\n\n```shell\ndocker-compose up -d\nyarn bootstrap\nyarn test\n```\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.0.0-rc.2","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.14.1/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-mG8UXPgha+kk4slPTQg8hz/S//Q+EVPbqMwthQIu+/DDP/S4uemcF20dRPsytYLH6H8wdWgd8K7qV0rW+m5EqQ==","shasum":"6ef9a1bfb2eee0c628655d7f18aea06244fc0588","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.0.0-rc.2.tgz","fileCount":111,"unpackedSize":90942,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/ncUCRA9TVsSAnZWagAA7ToP/RehSchFgQBxtpKObAds\nuHtZR4TwTyidJzsiND6Fi/CW+pF46n+oLtUr07Ykt5W77xXr+2KRm21tVDsU\nqAWUTT3QOehAq5Cdz/gsnr9GqUay90/UoeE8alg3AoO3U8Surzsvzdu8Yv4U\nqrDBAQCrIO4Jxpvt+HkDEHq+tPbx8p9K65wXMm1zw0P5IqyTj4padHPjttt5\nGWl2GycK4W+ZC/pOYk9TPneImBfzGq9C8jNsltYhWeZHenuWcPWf31Aeyact\nnMFMlrGPL9vuk+JsXlcAUB7yY2H/aHrr4ttbKUQjixXhuBeMee6gO4LQ6qct\n6LVThfw/D139t557CumDBH+ztssYlNV1SSt2GpBIKbKhNO48tSEz+UAdIKhl\n6AeRG/X+9qjGqXoeF633Ll8DQftYjikqU3bAqaC2WTIM5ReQttb8KRcjqOjZ\ncie0Gd51q/sSr+UjCBRttD+Ei+Vhh68ENrjiGrUI8jCmCu7ArfLX3S2KsVQK\nhRasaqOTSkI7DWlnZ9JRksOIBUiqswvqY64WPMg8ufoe2kBVCgaA3pPz8X4a\nEQUa9w00S4N7wC8H0L3QH5cMh6l//QboQB/agRwtKSLZUKxCkS7INdLBs18e\nCAhTyJVMGg2hXGE/VGfFBzXfnN2aFBRyBT6CRzfJparYQPBUSQZbMwr4mmnp\nqeYC\r\n=UCom\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBdBTpiZ5OSRCoRWK0vDM5ZEXDK6/Pwe8JAg2oBM+0JMAiBDoTUx7J+YArVpgkmETLPbxhg6nKZPF4nBMQs1TdqJNQ=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.0.0-rc.2_1560180499284_0.9899654476613708"},"_hasShrinkwrap":false},"4.0.0-rc.3":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.0.0-rc.3","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.0.0-rc.3","@nestjsx/util":"^4.0.0-rc.3","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"3f2a7d6c2d056102f49fb7d61d4ab4a37c005e30","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://greenkeeper.io/\">\n    <img src=\"https://badges.greenkeeper.io/nestjsx/crud.svg\" alt=\"Greenkeeper\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package wich provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internaly for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n\n## Documentation\n\n[Wiki](https://github.com/nestjsx/crud/wiki)\n\n## Support\n\nAny support is wellcome.  \nYou can give us a star, contribute or [donate](https://opencollective.com/nestjsx).\n\n### Contribution\n\nPlease open an [issue](https://github.com/nestjsx/crud/issues) or submit a [PR](https://github.com/nestjsx/crud/pulls) if you want to improve the functionality or help with testing edge cases.\n\n### Backers\n\n<a href=\"https://opencollective.com/nestjsx\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=1600\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.0.0-rc.3","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.14.1/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-dXpga1SWn8CqYjki2ff8YelXq0EgXfN8VnTaPkIenjeEcD+++y+j4Ub5/BjiZaSeWhwRfGv5UR2nFkatil/6AA==","shasum":"7acd6139f6a66e2effe611e3c7c344a08a297aaa","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.0.0-rc.3.tgz","fileCount":114,"unpackedSize":92784,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAQe7CRA9TVsSAnZWagAABkAP/jnqgdUdtMOt9hnBD1p2\nA4YfKH5wWFXnN94drX7VD+dVKqtroAbZ0YOj5JTM1tZw8iEscVpDi8H3GDTH\ncj27VH3Lf/BwU1TzgC0BuCbay1YrlXsGj1zz8iDftbIkUtbytJw2y/NG3KcK\n/D3KCpyyEfJctQeYbpmd3niuq8yxPnvTmVYAR1f97SMZsI+TddG0rjO3amdT\nAaCKpSzyuBednoD3KBtA8P2tKgdJOUL350D8RbeU+PD2bBJviCTs0/+mHmHQ\nbxSJPNdmWTkoMn2kwar45DAOfGArl3P2lyaus/xga2GzuYcZzd6ar28KJ/iU\n3b4dmOtVXhv7I6YDU2On8Z6+lqkbNev4+QFHct2P4ZZopUec81Kery8S4Btq\nQhjHw1scr7ECFwhRqGC9Leox3gC/qlPd+szYjNVGUgqJYxtuWf4UM5MSkGUB\nn97cv34q8/VQHruqDj0iRXGjhHQyU6xF4gH0TrgQrYQ2GKcwJHUb0/hmH7Ph\noFynK2gnw4L26jp1DxvTr8kxEz4vVFwlKgnTOxObe5Zs4fdxXq/Qs4eAnZxL\nURFLgCKsvFbW9mrCvGOohaGGVPgg2jMsOYHqcbZ1NOZKLcg/vrqVjvk5uQpH\nflfEyVmGY7QEv6Dmeqcq50/izT+EYRGtND0m6eSyrw12U0oaXlno4lI+4xIJ\nlRVE\r\n=5DTe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID8ct/484kl4iA/0IqiVwuCPuhGrXRkYJJNxfU/dTkYTAiEA3M7rmqxfvN8FH4QEsCVgIxD0fL2TujnrNI4mGfNhGiA="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.0.0-rc.3_1560348602994_0.22109102870608943"},"_hasShrinkwrap":false},"4.0.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.0.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.0.0","@nestjsx/util":"^4.0.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"35acb442c62cdebea7fd33f5c1e9cf1dec31d539","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.0.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.14.1/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-F6mfUH+6GkvKT+trrtcIx9PFmqw4qlyAFP3D+3hReC1/rVbwpua7e93gLxJaeDnXQMEyjumE+pcQhKoe+Bb0eQ==","shasum":"5ebf077724667f7e137e88d18eba5a3448ca6dd6","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.0.0.tgz","fileCount":114,"unpackedSize":92769,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdARJ6CRA9TVsSAnZWagAA0icP/06DN68WXY5kJtcw7pPR\nyls2N5a1AIvqj93spUpB4id8/1mW0necMuv1x30B/+gygh0/rNutAymsu3di\ntzV2sFkPQu9pmmHfwUoYBbKTnwJn0ir4p+Y8OSCK8av/nXjJm/LYyL4ou4Oo\nuq8EIAcbfK0FwTHDdPWt07xdszsV0f2AjZoKieldtNvoYgtjmEer90QK+GlU\nD4bxU8erjv0lA1rC/9keCnWxe9BD9v8lPr9jHmJdJHs64oXh+2nfPgP4ogVu\nBEAL1q2jEr1gN513beCF3Z3XrW2FZ8nu3A9UbxL2gDVPla5XdmQg7J/x91mc\n6Hv37sXH07kgxkW0UYVym3l3A06FyDaTMj1Vy+8bc6Qv4nuWBe98BV3DsgTu\nE9rAZgZlW8gx937Dy0qHu7Q63CVtxQba/MRZMTxxS1lrlZjTlZzHc7Gb5Zh3\nX9nN9Sl1j5Z00CW06f27Nv0YD7pSLGwlEfuRU/C7PGCwZs4gIhcF1mcVjql9\nllIcuBQlezDRri8G3B8K6uoHsV1fH5CvDddlTiQSi7S8902rbYho/dD/s9lW\nzxb0C8/2H1N5CVHIaY6L6gUagBnpTm2zvmkHdB3T8sA6AQBYiyYCeBY/aD5D\nyaY8kskG9t1oY+5Qt0m/UfA3NlsiSv4FbSIbzovYCVg1vES3CpSSSo1tGSdU\nFe9B\r\n=mOrr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHghG51VYKyCOApLGpp0uDfzTvAWBXj2bZA1Z+x5T/DgIhAN/7+rc88pyARK46Qb3zB8c16Z3h6viB9KLBqgQdCRpA"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.0.0_1560351353393_0.714689110960707"},"_hasShrinkwrap":false},"4.0.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.0.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.0.1","@nestjsx/util":"^4.0.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"df41e94663adcbfc13172bcae0973662235d50a2","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.0.1","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.14.1/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-MF/qzMTjXgs9zMJGf6SXNmtTwUxuHFX5BeMpCFOQ8+G3/7KZ3quBGdgX4a9VVp3sTnfULJuhikFoiwKZA+YrBw==","shasum":"d9315583a96f751975a1a58c2f73f24d7c027411","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.0.1.tgz","fileCount":114,"unpackedSize":95215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDMe+CRA9TVsSAnZWagAAZNQQAJJjZAgtu2RtkPmu6Dip\naT2HPIeGgXwOXX36TxwSZxJxit1844XjOr9doN4ALdP4AVyBD0a9VUjIEv+Z\n3vg+0Pj+U5rSALV8SVYFTIP977fXgxhARlIZFl2ZAs7Kui0HrVWexbdlXwv5\nr6XH9RBlwMU9kTlJTCZJ7YEPSCUYyUfnH32OeShlppJhgqUWBZqgco6c9y/o\ndbE9zR1gPrkycmSfUBGaf5oGMqezbKdy1W+/03zVVuQu7+0P6WqLdwZXKNDR\nTmRwuDVYKs7IrNgEb3XJ4kwPL7/YbHGOYI+1YaUqemsu3rxIW07tG+hlPfKz\n8IxjO+uCUkhexrnQseNAt55yJ3B3LnA664Edik9XiRDQsEOQ+7Zsxmtg3t2D\nXnt0jE8UGumS9a6six3l/CVPSxZTsHzVSoCuRiqMGZG8+b78SXugaPQ1E2t9\n5vEnP3vScZu5jFB0w/qUL+ewZujecQda472PITsOM251B2FGdE1gNkKP0jQ5\nAPcRDF8YNw7aNOx8JBkaEkMdc82mPGp8SNq9Hgnj16A7k7BETE+RLD4hxPkt\naeNYeE9VoWAosNC3N8sAB6yVLVOq0rIaVB8o87DKMtplsSQvA1Nr4Od4IEji\nC6b9IEuehIes8YhlKGjqOjJgp70S1dm+LQHVPyc1hTYARKP+eKSlkhtt+kzp\nej9P\r\n=0VXD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAIjtW7kwD8uWLG2DoSz6+tiLP6rI+VxU7aPWARdfv+rAiEAgTwY0FMQIHI6FcaSfErTcazppwxQa3mj/bQURyhR1MI="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.0.1_1561118653723_0.664266968874583"},"_hasShrinkwrap":false},"4.1.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.1.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.1.0","@nestjsx/util":"^4.1.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"da565a5d0b6f78d5919d30c67e220887283db87f","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.1.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.15.0/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-FkvYvFGCD+L75A8ssswevkHkwpolBDcw9KQRe7xfPXle/YPSUrAHdG78yY9bFNXFhCrwuZMIAN+fLknxZXQhyA==","shasum":"d6bc482f41d78fd3bc0284387dfa765d9057250c","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.1.0.tgz","fileCount":114,"unpackedSize":97173,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFNtfCRA9TVsSAnZWagAAO3gP/3jdZidPGsaHuXHFZHGM\nrbZfkhDRDuv/MIoOUS3fXAAJACYaabCzQo/ZNhv76QVtW0BUrqA+FUMssBsN\n2rNvaE6RsMX3LjCT1hN+Z0Gn64jwRmuTKUMCs0Rdeq/1okt6tIGKdWqZe7gM\nvxk1E6x56BcxtUWKuDI4YBZEN/sNZdl6iiXsDsxU64Ft16oa6oP3HZTdwel9\nV3BV6EnTU8chEEC/zaErXf7vmRWYkWJ284I/7KrhcDaEY0zHlkPH3MKfLMbJ\nuGUA077uzbWw7v7+RaWQiIBNUQperxml3rKTOGSYPyna9Q9Vf6ATAolWSXvH\n6B2bRqebQVhUjO04ZNw5YEq7IYJ24o0VGT7bSFjVLofv0jKA+MNVUxTUai2k\nWFbQx3m3IA82SlKG/mVO+9y9ivGgb1tpQqKy+dm/KXVTSUi0izz9uTlq5ZjI\nDBClXoCR1bl6rr2niRV/hlYsui8aehJOJAijpTDBT18gHzk74HuACLr+sJKE\nQd2q3P5Jkoxurcr+9cTAAr0g8AY/jpTi2fSVSujJRTcCJTdSerq4Aj5r9887\n/ZSQWrKDbq4gOLVBOxvfFYbBTySNFQ8BDQ8fa+RLfH0vicywpDVvwVJQ7Eln\nzxmp78g2U5JAhL8THJTxW/rfFDD/oNblk0PuodzBX5ErttIyOFW/XrE/emDi\n7DQM\r\n=E3NO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCf7j/andxVp+VCC3EgvSl9Fy/3X+M93agvWwXqFOw2CgIgFHcamctWoTkqgadE/B9yYHKVKs+MdpkcBn4TPqZrHBM="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.1.0_1561647967360_0.8274352387742088"},"_hasShrinkwrap":false},"4.2.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.2.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"prebuild":"npx rimraf ./lib","build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.2.0","@nestjsx/util":"^4.2.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"b1f092477fc2fb8945858bf4e39726cd5544c53a","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.2.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.0/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-PBh5rxoc3Ep7uS8cT4zoE71ZUptE9DBedEvXr9gy/uII/bTCfAEZGIe8UR0zxSHTovT+GtsfL+GNx9YjISBYnw==","shasum":"8cb94716f6f7eaa32ad72645056b386468ac71c7","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.2.0.tgz","fileCount":114,"unpackedSize":98417,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOsdLCRA9TVsSAnZWagAASR8P/ikrTPmbDut9xhgV00mf\nroYek7zlc1+vFX1ivMdYGyKn9JpUz8LXkLyBNBINF2mXv1EHMWtTRPhmPuGz\nKtxxZWJzwgXGfMgnWkZaCkTjhn8PWOo0ER7QcTl+aSrtGQTfLTcZW9AcVkoG\nhksajJu2sCpqofHL4Qwh6/xZt3JLM/Q8YJMT1WDRtRtZCapjqXf3lmDpM9tK\nAskJ/ZLuJCFwZuFOhnJjyRRLgTiJebBqs8dd+1t0oLtwsB61nUP0Qu6gIXy4\nHgF+lowzRD/kcuSvc4cdMMWuL45CZIGnM5/PpXhqOkl3uXGIEZgUT6buwb3R\nHb5aTb3PQ2ZXGJ2CXImrbU4op/r9Ya+ohohNDS/xCgvGOvGccTa4QWDBlJJ/\nGEAgCDyz3r/ZDo2l8Vr+cHVi5IAepm8SbgxMu9LfNxExRxocXyg900OqWJko\nCYtPR9mnfj3+QpQZ2bsmfw1Oow3uUF9BpmWDqHfJ/yfd6VWjOm4VjSqiHjPN\n4ecFl1Us9306oy9hwWN3zWyXtQ+7mCTcjaoD72I9VCR3eI2QqLIx5Ff913rL\naeeXfWes5LqRZwGYAKJmgmunaa63HULmYxfCGeF/F/CSdH18UqV0urGqOyZe\nyknAtp6hpCBosKqTaRu8wiRdO1GBoFCZ/GalSZGzVfkjL2JoLTB/cK44xZLq\nh3Sf\r\n=nuV2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5LvrcBuBx6PBAIycFQtZvOMhVKbWLpdx/MGxMhsJj/gIgO5gANKS5IspY52e8q1mIeql20MzsKc+7EhWZWXGJIac="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.2.0_1564133195159_0.5020551657714509"},"_hasShrinkwrap":false},"4.3.0-alpha.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-alpha.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-alpha.0","@nestjsx/util":"^4.3.0-alpha.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"883cef9fe7e8786002a30cbed0438ed967754ef7","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://renovatebot.com/\">\n    <img src=\"https://img.shields.io/badge/renovate-enabled-brightgreen.svg\" alt=\"Renovate\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n  <a href=\"#individuals\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/backers/badge.svg\" />\n  </a>\n  <a href=\"#organizations\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/sponsors/badge.svg\" />\n  </a> \n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package which provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internaly for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n\n## Documentation\n\n- [General Information](https://github.com/nestjsx/crud/wiki#why)\n- [CRUD Controllers](https://github.com/nestjsx/crud/wiki/Controllers#description)\n- [CRUD ORM Services](https://github.com/nestjsx/crud/wiki/Services#description)\n- [Handling Requests](https://github.com/nestjsx/crud/wiki/Requests#description)\n\n## Support\n\nAny support is welcome. At least you can give us a star.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/nestjsx/crud/graphs/contributors\"><img src=\"https://opencollective.com/nestjsx/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/nestjsx#backer)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/nestjsx#backers\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=890&button=false\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/nestjsx#sponsor)]\n\n<a href=\"https://opencollective.com/nestjsx/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/9/avatar.svg\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-alpha.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-JVe0Na72KM3H/rC2OG3FX86W1yGgUPfJhOwWryepztSTwl+bP5T6rQ0H+KAauqQTxPO7/bvR0cE+7tQpsmGaoQ==","shasum":"a483800e153b4ae6bd3b49e71d36ffdc20e9b220","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-alpha.0.tgz","fileCount":120,"unpackedSize":107613,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdoxfaCRA9TVsSAnZWagAA3CsP/jkZqls+Xu1gLazhyvmC\no24yKbJQDtm1+7UP7TSaavU49Lv+IZG+K9e59XnDQbEsbg69BbML7BDbQcNt\nmdoHEDE9adWLvGOU6E9IyiHk69gjaDvGFq3BCs+8Oy/dDriYe+niEtwvyd2N\nu+eH4fGN/17TzbmsiCrB+QJ1gr/2WkZK8mAkp7D0n3kVQC6wepEjLHWx4xoI\nUqSo4Xinc3RpqeAyI+0mrXJebwtd3jP7OEcsuQHzQC4H8lLvLCN4FZzZhrBQ\nkooYx984GTqISBC/U8SYd8VpPEj2PabHAWYFjYMp22HNy9oTf9Is6bZYgLfw\nUofQBdHw63OaCtTKCXDa0zhfi5FM6Nh0j5T+ewKvmKYCv3A+C7mYSiS1euNt\nsWOuAbnkw+bkr9t8Jr8QkqiAjn7F/DVx8EYNloANLeTVKXma43sNNINLcDsS\nO3vAhEAA+Yws4fhO6vBwy5vXv+W0h5GmQXLdb3UepiSJRJNy9sb7F5mk79LJ\n3CQG2yfj7YA4+UYbpAh4u/78sPCY/KiSh6TwgA2cIuuBN6B+PXlqlAYaWVjG\nlt/bCOA38TuP2lp5cY2h+p6J/c2Yuq81nGVCcNWFUbTA1Lqb5Z0wfcg9O1RY\nf56p8IkKoA9HkBejZ/p405d9yJ/KsQ2tFO5UgtwJelFGbKWo8JEq49+ImBoW\nZzid\r\n=JuIy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIClDxJkv958/JKWcaTYSFvCH0iA0M3X6fRKO+ZU5ugjfAiEAi2kRpaBrcnixeZa9lZJpciJ8plVndYemU8kbKeh4NT8="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-alpha.0_1570969562033_0.7791868291330231"},"_hasShrinkwrap":false},"4.3.0-4.3.0-beta.0.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-4.3.0-beta.0.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-4.3.0-beta.0.0","@nestjsx/util":"^4.3.0-4.3.0-beta.0.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"135ebcc8cb248448dd177500f301ea66bc230b0a","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-4.3.0-beta.0.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-IOXz70ZV7hNlpJBkBixlCjDP0B3sxaDftodM/GQyXg72+Ye6FPxJIEx3Gaexlz/U6/rz4/ClCE9e38SnqdSmzQ==","shasum":"00a8a8ff611455e426628c53bb8b81cef596ec3b","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-4.3.0-beta.0.0.tgz","fileCount":126,"unpackedSize":116503,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8xmbCRA9TVsSAnZWagAA4VQP/A1Sl2EvxKhvXBEjnkpa\nT3U59+ozTINdgNKXqo9+NrijymRYJb7eA9LU0+4RfV/DTZWU6hdZ6dbV9v0s\nafe+DC0o+yCR1h+ou1AUKs2BrY+2LO9i7eKokO2h+P3RPshIygYXPRKzuPIb\nmN78rmwNuD6Qfdt02fT8yNRPtxcTHjc+wgruxcPnuIxMHg84r4RPlSj+qva8\nFuhpG96Breu57HVzsyKnNIwqGzWBxn3dSWttlqCy9JgWcnDDkmNk5Ul/RNp+\n58OREXMhnzzZrUr+/KsvHouRUNcHCUhDaumhfJfxa3WqGE6+94XyK6aoXI92\nfSR3lMJfO9Ea/XFo1SfeyExf0aCN9Rsy1dT52ulBl3b51UikHSZ/i5pMmMoq\nar9+ZtlV2QGfMISXU7lo/nlnLWTFWrAdcbauVcP9pUfS7LV08NcEkpgeEdxt\nsNwF7lZfuz0Q3LZ/GaLt2XUQDKkjgkG8D7smQ+uYfBRFw2k/zGE2n//wOjlZ\nlHzuSSJRGXjuxLitE2fX24EAHJJt1+bstut0oESZ8wMfEa5E4jzbcTdTxr6Y\n6MPBVx+pZO461okekYUXOA27MAuk7Vk2YnrK/EqhDb4Y5Wkj5lwXT69XnmQJ\nMfC5LHfq6+9GYi3FvA4D8Tgbw1SeJa88eI6VqNyV6Kn2JJarF82lqoMHpug3\nagUU\r\n=Ywzu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEZugqmsHKVKnfZtlCnUeU3mR1unyHyFQavcKFc/MmDMAiADGnwKaLtseuuRBnowHWTO9UsGGpN7R85xBJDpm18pww=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-4.3.0-beta.0.0_1576212891094_0.10862552325840324"},"_hasShrinkwrap":false},"4.3.0-beta.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-beta.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-beta.0","@nestjsx/util":"^4.3.0-beta.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"f4e634dfd0d03473cec41b96a4b63caa118d7f13","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-beta.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-PMdXRjbNG2u5+xpZE4OZCfYZd2q6FrB3JsEdOrHt6JhLz4HMWCn0BnNmOZT02eKGbUJCE53Nxv/evcdUbOUGoA==","shasum":"5a258e653fb74d76afa804225b3bbf34b4c8dc46","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-beta.0.tgz","fileCount":126,"unpackedSize":116479,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8xoxCRA9TVsSAnZWagAAZ3EQAJg1PdEyQvAaIkm6zGiE\naW9zyBoWFlgaejAbkBKMJ3svEQlba0woXzcQKCVQRuNPlxjG0hXIpSh+Pant\nk6zgpW/Nl1OFo/sya2h0TbQRR+4r7CCJ/ANfMvrNbIPKZMZ2G5OQxakbc1lz\ncnXS1kV3LSuFrGzx6SIZ/5H7NYGxZsJlKbk25RRoIBRbSO+QKTV+0ggwIq5E\n6gbKMU2OkDRwBB5C+oKxpVZWx04KF4nft5Wj9YWczwHHjZR+c+9yjaKfmEg+\nTSUs6OOLQIb/09RlEfBf8Hj4TC+tFZw4R2ZS0msr8zliVOhg+gHtMLJEcGty\npDxCw00G6xcv8mxKUJL367C66doN4eq017GtECwSsL5EL2NpkF7E+r5Sp08Q\n056Uc5IXv4jSCZEy7BcWuQeTrBKvJYpbiVKZKFpc6SZ3nFzJRjK9g86i/eIm\ndJ/wsLIQ8y0Ce0JJ+OentbORg51W5Kh7rS5EktFHrufuVbLxPdpNlUyQ361e\nkER53b1u2wAyLcxqLcQ+iJWQVsr8q3W78i1GveKF3MsOZkQQrUVhmr4wg6VQ\nNme6JZHcfa6y+BjsnSDIY/1mwAOrlLUIIMgcUGfK+ntcSARllwEwn0CEogRW\nedKQ0tDts/xqnPRPBG2U925qUm7A/LTRiy46EaGpL0RsHP95LnRfZRLtjMuP\ne7aR\r\n=D6OV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDicYNFSNPkwh6qclgJlVZdaQJSkgZuxQPDPT8Tt+JwqgIgbMJRE62FWpzhNQVgrSgDsi03yZyNsBQ1EDUFVllGJfI="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-beta.0_1576213041060_0.1915925540332617"},"_hasShrinkwrap":false},"4.3.0-beta.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-beta.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-beta.1","@nestjsx/util":"^4.3.0-beta.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"ee2ba4506d0cc5c6d10631965a24f7665292195c","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://renovatebot.com/\">\n    <img src=\"https://img.shields.io/badge/renovate-enabled-brightgreen.svg\" alt=\"Renovate\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n  <a href=\"#individuals\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/backers/badge.svg\" />\n  </a>\n  <a href=\"#organizations\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/sponsors/badge.svg\" />\n  </a> \n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package which provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internally for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n\n## Documentation\n\n- [General Information](https://github.com/nestjsx/crud/wiki#why)\n- [CRUD Controllers](https://github.com/nestjsx/crud/wiki/Controllers#description)\n- [CRUD ORM Services](https://github.com/nestjsx/crud/wiki/Services#description)\n- [Handling Requests](https://github.com/nestjsx/crud/wiki/Requests#description)\n\n## Support\n\nAny support is welcome. At least you can give us a star.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/nestjsx/crud/graphs/contributors\"><img src=\"https://opencollective.com/nestjsx/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/nestjsx#backer)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/nestjsx#backers\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=890&button=false\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/nestjsx#sponsor)]\n\n<a href=\"https://opencollective.com/nestjsx/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/9/avatar.svg\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-beta.1","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-V6XEAy9P0W9PjVAW9aksM2lpb+tAmphpVGEv3Q9SZsnrPEUva9cx31kjOtaY5f7nTl4SQJhe/FOTiLzG9YpXqg==","shasum":"aa087bb9f0f4e146b74192a22371bae7174ac21d","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-beta.1.tgz","fileCount":138,"unpackedSize":137259,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+c7XCRA9TVsSAnZWagAAbjEP/21EmWTP3gTI/QfMDCD/\n4bP/fOTe5G2fkLt0MMQ5d9LxRMp8YwjG3iOggGtXb/cRZtHGy+K58rJ0WoOB\nHDU+CrMwuFlEMirIiupt8bWUTX8KP8XKW491Kw+BjFivbWdWVCIGG0PUpXf2\nmlw5lEhVVYWI/Vo2w0bV3jPpgcpMQHKhNCGcywyl3RktqLL3Gls6zChu8HKF\nrEBwSfumHGaiVlPglx/lJzK9mrekt/yXmXr5lwA8wQLOZKh3GKUxq4dcP5vH\nYqDWlsjzjD6G7QyJ/RHszEH9ncOe2IXfFWXelO9B1EYMy78JQ8++PdW/pcTp\nSkqnKsbbXBW/7GuF+konPOEcNEqqwJ0hgDF1djG4T1WE/7+GReIflnz7QuKw\ngMYHOHIMt22+y2HK51LuVy5HVRAjKqrtLCBw/plyRv4qd+UuOn2Lxr2zFVss\nZ+szJds2XV/jnHxNxz9tEVHfgGeaJeGJmpnY3f3BCJO8qMYzEAtjQSlkBQ92\n148zZSbm7N68LyObWAtE0gh+YA5FrZp46KLLeHD+tI/9KKKR3B3DvfSUaPIN\nuzT9/XCxLlietqnaS1tva6gv055IyyzNKDt7G1ghwM03Fs8pBQkMC+e2uUwV\ndE9RnKQjMZ8+wjjwTOWdQlEqgojcFQ3Sp2l2vIEsc+ekWoWkNZUO3CGc7+L/\nnDML\r\n=rb+D\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGbcMh0Nf0xTjNNFLAjXA4RFBcLhs55MzNzloM9lq5y/AiEA9vxTecCjrbDao8wIzRVOHL6wjXXgCzgZVlPERNxgxbs="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-beta.1_1576652503260_0.6925611588478637"},"_hasShrinkwrap":false},"4.3.0-beta.2":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-beta.2","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-beta.2","@nestjsx/util":"^4.3.0-beta.2","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"b5d2b9e1bb9e3466c30be952b3b5ab2fd9f8ea5f","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://renovatebot.com/\">\n    <img src=\"https://img.shields.io/badge/renovate-enabled-brightgreen.svg\" alt=\"Renovate\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n  <a href=\"#individuals\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/backers/badge.svg\" />\n  </a>\n  <a href=\"#organizations\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/sponsors/badge.svg\" />\n  </a> \n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package which provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internally for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n\n## Documentation\n\n- [General Information](https://github.com/nestjsx/crud/wiki#why)\n- [CRUD Controllers](https://github.com/nestjsx/crud/wiki/Controllers#description)\n- [CRUD ORM Services](https://github.com/nestjsx/crud/wiki/Services#description)\n- [Handling Requests](https://github.com/nestjsx/crud/wiki/Requests#description)\n\n## Support\n\nAny support is welcome. At least you can give us a star.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/nestjsx/crud/graphs/contributors\"><img src=\"https://opencollective.com/nestjsx/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/nestjsx#backer)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/nestjsx#backers\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=890&button=false\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/nestjsx#sponsor)]\n\n<a href=\"https://opencollective.com/nestjsx/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/9/avatar.svg\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-beta.2","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-PMc5U8N6LLJ8JyIUffW74ANXEXY/TNF2UDJc75xtjEEtkue0VsJa6uZRz6i2cfN5zqAy4Qcpghe9lclEfFv3RQ==","shasum":"b0ac7bac9f9031e96922e0a6536a28ae29005dad","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-beta.2.tgz","fileCount":138,"unpackedSize":137797,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+fB2CRA9TVsSAnZWagAAEKcP/1lyoq9BXojPDprrSvc0\nK/mUaqDsADcKMXF8anP5+qg63ja5q80b4yoYDV/wQhOGqYDoARO+dx7EnDBt\n8+HciNOq9JxXz2ZdpBv/tmvTQJ/wL5J9D0Q2U66kLHsNFLoEbP7aaVKKVYvV\n2TWlu/6ykO5W4lKHFImqch6oC27yBZooPZbH4cg41NvEsqsTXLjSv5Oh4bWt\nfhG3s1pYr69hMc1flxdQ7sDjppJOL/eW14f/OE0MzH8WYHOvfRbozY1hbv55\nMAqeS2OIBHHrxmQ5jnW3uu0reWv0O48Sr3FfRLGCjE536/QkX9pqZ2HFMK8N\nD1nMs1tOqT9i3yMvjab/NtDB+x7NYwG41eXmVypfyKbF0A5w2DkBKHT6r6YW\nthw0Vee9QlxNsfVqt5CCSCrUIA5qJOYZO8tjps/6v5ixm7NCJtknn9HV/Vv7\nFBwi3SUiO84/9n7LPqbdy/2dqlV9OgMdimExPKbr7Vfz/MaWO+t5IqRMM/B8\nuzZGs73B0mDBqW0H1I8sIjRW4z9OvGOjvwfAj19OtVOWseQjjWpyBWpTpKlc\n7CTj7gTFksVRhKAneIFXEVcy7lGhrTAUEFj8+PpIN5PM2rGkSsqO583dLeuA\n3eino4xOQtOjrEJQ4NqoUIKGZNxkd3qe1pu15/PgcSfg5sYFcjEbW5+5U4JN\nUNQ1\r\n=mV4u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB/pSU/vEujgrqTfeJ1nFHxxEOezbIlN0zkrMo2DNYplAiEAhX3Zu1V6ccxz8ChqvRsTHpcMGwBUE53O0PxkVUpbErI="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-beta.2_1576661110076_0.7689434211903261"},"_hasShrinkwrap":false},"4.3.0-beta.3":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-beta.3","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-beta.3","@nestjsx/util":"^4.3.0-beta.3","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"674957de720e0ff72e05aeac7d102b038da0bfa1","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://renovatebot.com/\">\n    <img src=\"https://img.shields.io/badge/renovate-enabled-brightgreen.svg\" alt=\"Renovate\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n  <a href=\"#individuals\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/backers/badge.svg\" />\n  </a>\n  <a href=\"#organizations\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/sponsors/badge.svg\" />\n  </a> \n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package which provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internally for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n\n## Documentation\n\n- [General Information](https://github.com/nestjsx/crud/wiki#why)\n- [CRUD Controllers](https://github.com/nestjsx/crud/wiki/Controllers#description)\n- [CRUD ORM Services](https://github.com/nestjsx/crud/wiki/Services#description)\n- [Handling Requests](https://github.com/nestjsx/crud/wiki/Requests#description)\n\n## Support\n\nAny support is welcome. At least you can give us a star.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/nestjsx/crud/graphs/contributors\"><img src=\"https://opencollective.com/nestjsx/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/nestjsx#backer)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/nestjsx#backers\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=890&button=false\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/nestjsx#sponsor)]\n\n<a href=\"https://opencollective.com/nestjsx/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/9/avatar.svg\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-beta.3","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-g5R/0fyg62Vp1gmnresWSxo6H/ABdG2jlvwvHRCS7gVzYcKnlZvHkUZdufnJ+/hrlJc/PPWBcMa3L9p3s8sBMA==","shasum":"38cef7948605f4f3c9e42cd9f037cfe74d2653e8","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-beta.3.tgz","fileCount":138,"unpackedSize":141745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+3wzCRA9TVsSAnZWagAAQioP/0rlmJUhfasunOHxLuil\nSiNhqRnYkPIP/UuiCch+96NStXeJdtdyXJJVDvn7NW+LA0EHgQrQcZ5ESAXx\nxz1NC/SQTM8eevXGnVZENCErQiWCGgQfIofcMkz+cR1stY5w4ZTKS0DAHb8g\nqvTKBKOiW2QEz5IG/ivFtJ/4B45ztNcophZWIXz+3MIW69wHiu2KKq4oBH35\ngW0z/3PkuOGqF7fO1b0fGE714j3ysV68FEBV3MXAJvjjn24eUSRbe5DtDCQO\nRzD1um8ya7MGS2okeiC5G1x8jhuLYRNPOVo6h009cBJdMoNCaN7wRbR13wir\nokfvjRwTwWaeGBnA0EhXeGX+v3k1MAB/HA/Dxv8sgBeb4is26QgIdixu7I5d\nXnXAodEaAUCFvU6hWAUB3FTdkoYCmaFJKg7G/7+61g60C3zKAmLtFFkJKwJ8\ne1QibF1uXbmoCh4AUYPOvKlIlVcjD6+EDGq6+ksGCIY40DnQdtctwp22ZYbm\nBQ06Svjwo/1hfEFa9TqYSPbi0qA2Dqi3wJqNqfEa54I4lnEhJj/YoSUHShjA\njTpW9IWdWEtpVCvDkcRDPsyZ4cqKcBsMOCyHws1/rB2x+T4R5nrmDlu9hgb+\nsJnxI/xBVxMBvUb1NZI7+4FsMTfZx0sHf06RvaXJrb2qRApnY5gOHOgKEjyR\nlWOY\r\n=7UGd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICFdnhwQnrp7nbh1p8Rzdv5o9S2Cb2tfvWzKTLi0eP5sAiAfBY63ZIowAgVF5SPitS3+dws0nBT+mxe+IuVQPYKRMg=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-beta.3_1576762418150_0.9805080343195207"},"_hasShrinkwrap":false},"4.3.0-beta.4":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0-beta.4","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0-beta.4","@nestjsx/util":"^4.3.0-beta.4","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"390bb8a030773fb634e5ec582a8eedd5f550ac56","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://travis-ci.org/nestjsx/crud.svg?branch=master\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://renovatebot.com/\">\n    <img src=\"https://img.shields.io/badge/renovate-enabled-brightgreen.svg\" alt=\"Renovate\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n  <a href=\"#individuals\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/backers/badge.svg\" />\n  </a>\n  <a href=\"#organizations\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/sponsors/badge.svg\" />\n  </a> \n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package which provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internally for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n\n## Documentation\n\n- [General Information](https://github.com/nestjsx/crud/wiki#why)\n- [CRUD Controllers](https://github.com/nestjsx/crud/wiki/Controllers#description)\n- [CRUD ORM Services](https://github.com/nestjsx/crud/wiki/Services#description)\n- [Handling Requests](https://github.com/nestjsx/crud/wiki/Requests#description)\n\n## Support\n\nAny support is welcome. At least you can give us a star.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/nestjsx/crud/graphs/contributors\"><img src=\"https://opencollective.com/nestjsx/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/nestjsx#backer)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/nestjsx#backers\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=890&button=false\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/nestjsx#sponsor)]\n\n<a href=\"https://opencollective.com/nestjsx/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/9/avatar.svg\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0-beta.4","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-WIAkMN95+023ZUABU/sG8PS04pJZZQ/UrxZEpk/FYxVVvpnJwQy5/F1XUZFCmcQuvqEIBrZTff0p1/XO0QsXSg==","shasum":"17cb43c5bdb6227851dcebbba3d329e3e3d37c5e","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0-beta.4.tgz","fileCount":138,"unpackedSize":144032,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd/fnfCRA9TVsSAnZWagAA258P/RtZn9Kjqbm3k+ASY7Jy\nPKWpgzy+1jqt3QbdcXP9FpqSirt4mBewiyY9Y/ahkApL/SeLAvV90eganuPM\npFr9kLUtGToKfYNKDE3bNLg9iCmTFgqB2Bh6xfxw1gM1i7gAe9sklExRa+h0\nST1OhJB21Wf8qAtP1wak6FjOx3w/GOroX7odgMQOiUnUDuufiOGxUd8G3HJ0\n1iIMtPjq2UCjhzkR4kdQOweTtrnT9v+3vcOrlJKcGIEHmG3NWxwL5yQ+B8Jk\n+W20IsnNmK9jH4Ri/9XkcmQw+olfy0t4SPWYn6votjuBNET/SfVqU4L/R1q0\nedkcEbNms7akbB5I3sRsdY9dULHk4kTyXhn+pkoml0D+ufgfQ5r6XP8gmKFh\nIYGgmdzUJ8WnC2LVeXd6oESafTTT4h1C7yf+q/NjvW2bVtx+4ENADTNFSvYX\ntmXByD7rasntOlk+3aOv09mwCHxANYT+krQbu+gD6773E9ud/TO6PE0PIow/\n2zz2x/QEkNcVhTI0Ud70VhDMWDlxZjLryEeP5f6d/63gHXfcCk/7mL9Y+oqb\nq1fXp1jhOO8DQSFENsjL1wn/4+/OtXqf1Lw2UH6FlODj6PLV0ryhoHNJQsz1\n4mOy17vWdSKi4uUBJydLZ/R+3YQiVEQQMXWtqImeeGlpc9+yJm4M8tlesLMx\nUHSF\r\n=iiB9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBPGtS3ZJl5ljjdMNcLwhix18p8fgQmWIUysom05I3UEAiAWEMom1eqgLll8yMrGJZ9d6dZS3S+upFE1pFUyzdb1eQ=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0-beta.4_1576925662734_0.3502049051419571"},"_hasShrinkwrap":false},"4.3.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.0","@nestjsx/util":"^4.3.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"91f180438c0728ccd9d8f07cea591fc7ef3f5475","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-Y8IMstk+vDCMZNX5mZDhO9yOAcday2nHXvOiIRG+CQpbL3ZisTppOEvJkSpBWC/l45LhsKYjCGJPyex9qh+oNQ==","shasum":"f1d6dc4a3128ba6ab90b95dcc34127ff2e2996e1","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.0.tgz","fileCount":138,"unpackedSize":144011,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd/nqgCRA9TVsSAnZWagAAXeoP/jh5o1cfZvpGJJf7HmRS\n269IFjn/jEX6mVAAo2S5xJo8abr5z7UjNYPnls9O3F/HK1RkHIZSoG7FVczB\nXse808+XiNGPSt9Th2A9kVVO8rtLB1mm4NI4p7Zf44EExUMaLrQn7ou8f3vm\n1XiPA5FRVDVF3fRHkqyEG7bYV1bJWCeMVznQheMrTwwediadd0EhrOR7aGWF\n4qMoliO+DZu66FDPdQWJ48UgjockvIaDZYw7lslaSyO4RUkaCc0vMrf/ckit\nxaWBt77o03L4WDEeIdzhiu6pjILqGxVsfRqenHOpR4Sm5h/OlG6QbBDkmB+6\n01oxqV/M6Y6HWd2rnSztY4WnbzTfumezU8jYXi1rzbGMfpIRWJ+V5G/qNdiD\nchupqj4Hs0UTsakERwyBwYBcCrF1gZJzIKe5NUdNKtG5ubz4J7pOrug4HMUR\nN+DOTIWMCIPoNmGoONmG7IZvDmzpZZzpX/7ozCAkxjNsG0UI8HtbAGTAPumf\n/7WgP75+wVmal7T7+u2Gpko9xkyeN9+g3F+/E2zVA3MOLkcRFJ+EXIRfKqFd\nNbw+M19+rRkCuaIP32w/c15p34OA/LVTbTosmRtPcnllmjJUf4laXDuakoW+\nLFT5lplgF4k5SIufZ1+erH4T11LrHEc0a/VgF7NmJb+xJI5toUDwqzotq5aQ\nwRIM\r\n=cyOr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGui7sCzGnUfxuBnoqyIf7WAa4JMYrHicXrfxv1r+RLpAiBx+oXljSRyIl3zzX2BIuf1uSIObOEkihEtBmNS3UHNDg=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.0_1576958623928_0.8897505793365601"},"_hasShrinkwrap":false},"4.3.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.1","@nestjsx/util":"^4.3.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"cb0d0dd6070f85670e6cd9605c1624ab19393033","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.1","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-/gJ3gwgxVE1lGfgfFKyK17Wc4ybWR+kxd0UQzD1PFia+WLJYoo/d26l5iHZoYJyycKnUvewZ703GA4HRiz7m4g==","shasum":"4e9138146a45d9f2c53c924aad646440c3ea4710","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.1.tgz","fileCount":138,"unpackedSize":144011,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeAKVbCRA9TVsSAnZWagAAI88P/1n7pe6mewweM8oWFmWW\nJ6bj5pE0Co6UklkvzlZ0vn2XxWLw1A2n3mw6tI2RybWebMA1YtVtFs2W0DXy\n4tJeNZ3celvZrM8IyT4Bf/N3Xykx0qWl5B4cTlVvDdOu9StGxcGffdPcpbRH\nH+yb08uY0UtNQocuMtaF2Go3vUKzvp9tji1pdcByvh577SMjvhI1XL3DPPpd\ncElPEZpazYdmXBeGNM1XDE/Uz8l/qbByfYUf5/Q/Cyzyzl93gUYQ6DP/hheX\n2fIkzFpJOOivymAb1EsF8cP5cmT4RvDzgZ7biUEcbUxf1o1lnpgOhKLrZfUd\nu1/b7MXe/T7Z2kTv6fRkskuBJCBL26rswO0injMr7aQGhn537JjA1lrdINnq\nGovlPD7vfTPd/rn+mj7c9wmp4q/oUsn/3KjUUXmKoGBGh3cZt0AXMtTKhDcz\nE/a4flMhlvEEk9kaUhPH8X0QvfJc80f+eEaFrb5NBy9tVU5DLBSF7mDvPeem\nvQ1TlNDFW6JpSzRgU71YLqGKTQO5cGCy/CZa4WVq7JuJk3BE0ZHYn1UhcZeM\ncpmWoIBM8nxpTfNsnv/dUFVbG8jW7/yVlH0DYeYx2azUDgZHFn5awVk8OcZm\niyNLiVabPVcFMQZ3K/aNoBnX7G8PHAOM0buO+B03WFaLc+VflWUx3Sqv+yOt\nCg10\r\n=iuRA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG0+Vj8nP7gi8z+3M991D96UKwfY2JSmNVqjEVMLc3zyAiEA9seI6SgTsHvXIbrOk6glDIAMBHUJPVkqYKziNW3VSHY="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.1_1577100634055_0.04899759439390072"},"_hasShrinkwrap":false},"4.3.2":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.2","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.2","@nestjsx/util":"^4.3.2","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"eb3e016d555d150ee594d3ac1dc90e926646fb65","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.2","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-ZU1wDTT0H5xTmnqK3e4DZRNb4UDz5unDn/J7vwr6ZqMlzCI/EG+HskBQzbgj0Uh/vjVInmWxKO5qraRlH49fBQ==","shasum":"cdeed56e615ca54ccd5607b5daff2b797cb727aa","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.2.tgz","fileCount":138,"unpackedSize":144011,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeALOzCRA9TVsSAnZWagAAMy4QAIDcGQopNLQ+hLXXxGUR\ncFxAUiozXdAACZSeQjS480N2XBeeXNblcvVgISrnXmYqwUg7nUHGw1xjO+iR\nMhr7Qn097npPQrm8Y/B+XLXpWo4jqoS+APJKzvkUm2sVJ0zEY6cvGAvDFH90\n6nYJfINRjDZQ55N6b5a2g8HiGYIZLtw9B7CtBf1ls9AYce7/jTm9s6luxP2C\ngBNPTlzOiEcXznAIHKsJae5PIGo+AljLGykpa0MFms5Ch3ajIgXHOY+Ea92c\nJ4iEMsMrtjfxghNzS1h/TOttnqsYFV4H3Hb3CDN7m7A8mVtd9YbTuaYSB2rA\npllZiDKbH+xpkJTCjdPGFlQ8QNRRwxZyd0fBIPmqysxA+O/v7Bf9sJoY583n\nqXIxz28nfwwQ91+ptHwsJVNeAHl5lK70RBXV24XTapuk6WwS30ayFEu4qXDI\nK2vebALv264FqC1/3XUaiGznRR4ftiWsiwEdayhAJwOMv0NflOdlAVvCSsAP\ngfZItNBKaxyqO7q+p29dlxj6GXddi63LzINXEDkqGTJDjLZPd7BojDqVqQG9\n79R9wx1YbQzaTGFH3GpRfpXFwTvSoK+It+CSNiTmGIWszj5ua86X/zQHv3sQ\nznO+uw8NRjtuf6BtSvnxIRLQHTBVfT9BaG4ixKbiqEsvXZ0vGHC9w8E5ZSu4\nzOHl\r\n=nErX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbrvzdQsycWbD7aQCwTgHpCVJ6vamvUGBHCmcDmy0MlAIhAP5xuvNNZ9qZC3tK2BqFvzjDRHDF9uIPq4N8LfcYR9z7"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.2_1577104307459_0.6587085684201313"},"_hasShrinkwrap":false},"4.3.3":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.3.3","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.3.3","@nestjsx/util":"^4.3.3","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"6a855756d79abe8c49c646b9a5dc354635bc380b","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.3.3","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-pc+Fx0h46PQzf8pvVOHiy2ybhtjq3IgEYr092CgiUlSRedhvvBWj1I4glkaBLToSV7cYbA4KgTipvaoJtjV1Kg==","shasum":"f3a292825769cdb3eb7c7712007a1993b29a120d","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.3.3.tgz","fileCount":138,"unpackedSize":144229,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeAMtiCRA9TVsSAnZWagAAal4P/i5unPDcYKznWhFswvz9\n5oqyn+djl0IIXw5Tpc8UgX52SIXCYglIetYd6DfjtS7pF8qTvWUprJevbY25\nX6EQ6gwojzL6uFuU6BatsAYkHG9AFvE4lXTgnKytBj3PC93rYtMdscswAMVs\ns5RRDmxzobLojowMjcx37aePBX0lF/MtzD6e+T01XSUrTmQtX08YiApdPo2H\n16+xqLfPe0vIkxrtpFiAEDis6MA5QiirGdBU0Tw1uu8qF9SgVt1SwdMweE7X\nkOP9dYklnYhjTB08pcPwIdvGYwMbuwwo0azvpL2KPSUKdZS7inP52OVWbkzq\nNcArU0B0hT1JTXETolWBXwt4VK8bfhJf7WnpAbX/HDPXUE54n2rHiQEelxVJ\n2FxGmfAPbL73wkTzK7x997C9bf88e6ES/9BO3JAMoXkNrCDQNzxL+y9P1g6J\nVJ3kdhYGnsnEtpfX5J98X5HGLPqHUgsAWKH62s01xyq3rDL4tiXzhfd1tqL0\ngvqiRZHLvSPQ9vqn+PZIy9lJJudsj7cKx9e7P4prKlZAjnVyf/otpilJN6O5\nERK+hI2Xlu9NeOgRGhIypkKs0Dw6alGFDEV5GmyjL8qmLJrIwgcq+VOPhUoC\nMagC4RjXiyw14JO6QNkt7tk3hxfGzKQCgzKOlpGF1B/hVge3eRblG8LhKJzQ\nBNdZ\r\n=7AZL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHCPw8FLuMunsPRI4e92iMRjYFAeU1bMshXa2k+rJQCdAiB3PjzfPfga5MYIrHXEMupSaJsUFnq+auJcFXz1entlEw=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.3.3_1577110370287_0.27266620597589775"},"_hasShrinkwrap":false},"4.4.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.4.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.4.0","@nestjsx/util":"^4.4.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"7a18f33304530f2218caf670b19e7b52760f1d1e","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.4.0","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-Zbn3yltYb04AlymW4UYi90XeuyM7SV7GtVBna13qFCQJaY7f6qZrOGRo2sW0TU1ayVmjxSLwiPf7Si9t0WbZ/A==","shasum":"ff723fab25de2596a858eedcc1bffd921d478ce8","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.4.0.tgz","fileCount":138,"unpackedSize":144843,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeBcwgCRA9TVsSAnZWagAAdToP/01VIV0KXlyJkC9kA/mj\nyWkvHkrbTrdaKQIqAqxj5WC4G7ex3cPaxFTOqBRQ7IpNuhAeMBdTrg83uQ4X\n/373xi8TnX+JFEFOTWwygYHaw8JPd6SQD60FQInFjIZ3rAy0JIhoKlGQejcU\nFxyUTSTy3X/7PVqLRBtyFQO+2OMg/NTTEAB85rcTUtrPTNRet2uT/mQXpJRU\nKe+gwOmA9i5toQU8yxipVO+HU7ONNu/6ObWGgnFOzunbsyBtQvD9h6Gy0+XI\n/+95p3UYFp8qBq9wkZKMwCA7jVrRYEWcYJsHVZ9p4ZEFUUQ5D/+PMEKlwJsP\ncAp9+UUpS1Pweg1Euy4H/jkzAKPHtaQQO0ibSA8rNm6ZX/X5HWAGG8kJzsTl\na0lCarEfJb8uy18ZMZrn9m29wf9R0cavWhYSnudZ+E1+n1876b4J3PQl8qSV\n3XBB0iQi/hkRRwKVHYn7bY9FSDrB4Mhz/gbsB9XgN6v7mpjpi45zCwdOyCOg\nHs9aw+pDFW8/pBYO44er1NWkl6sTgwiyGEVoe4+hbgkHlcGt5dQkndMT4tvm\ndDbh/JWDZK3DO2lMSBnfsvWjmuU52j2XemE/NRTOvWDb3lpHZMTKICqAp9g6\nTVjJyzt2HxtvzZUpxYgnUbmR9GYMyR0xvjNxEdCN/aogszYe2wELq4VEhOOG\nHyqo\r\n=PlWN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHM274iF3xfKYyrVs1E/muVq0tLKMzpeeQ6I3dPfc/rwAiBo2+guHXeqxokJLAzHsLsm8udK+3amDKP2OxWfuY2Mtg=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.4.0_1577438240290_0.8544059908528494"},"_hasShrinkwrap":false},"4.4.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.4.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.4.1","@nestjsx/util":"^4.4.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"e7086d4399a96fc399a7611e7514fef7f00a996b","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.4.1","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-uUOoG5RxHCt1FYBbuYhrSDSkqcRstytfi0II2sGf1zVksgGK+WbFEt7FvTuRpCJJ14IjGzFMblOMat61GISV+g==","shasum":"80ae97f9561e256d836963c811d3f797b5f89f80","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.4.1.tgz","fileCount":138,"unpackedSize":145287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeB11bCRA9TVsSAnZWagAAVzAP/AokCGwDW1ik1JcyVmIt\nuWot5iWh4MeGcNVIZ62F05lJHr04RH+tKfhJepgYUs3AXKkEbMY/fUgekx5y\nYyOJpfqTJmexlU28K/FzfdIQYl1ZiUECXBbrHNF/ttzbdtelRGmUj2hFHuLY\nAq/CL5sM8ZcehGBAuEvDIInxyLGlwitN3OWZCeMjrQKSCb28rcXNxpNiS8So\nalfMhr9qaDp4C/WBfsauSj9LT9N3O1h0lPQxr6hu5j4+n588WwvtN4PuoR22\n1yR1eMIrK1bCx8e/MwhKJvD+6OI8hX87A4ppN8KCG7uXxOaqEcGgERlKhFIQ\nhhvgvOQUNL6/f+sk8gn4tN6XycT6Yp1q2V4x2xJItv4TsIeXdROLHpJvyYHP\nziEVhFnyTuwOp8f2GrQzEPkZ8xnP1VHC7EKW8ZbkQJ7SFNkud8BvZxMe+Rp/\nloLYJqUEsVNDYfLYz2kjJBd1Z6ko5IiS3H49mNxcUCJmqGFraoQIep0DXs5+\n5ji7GfnCReoMcTZ19Z5wAsLJ01wR7PvppMbiriTBa1mtH8Dt+diEt9STbNie\n21/U3R1oUHbB4ymTXBBfEHRgmf3uZQjNy+vGEo8z5GJag9mMGcNpW9p1aRck\nPDTvcQuBi6EfBw4HF4BlOiSQhfH12LeC2YfM+I5v73Q/1UxRhI1mhwBTava2\n8w4v\r\n=kIi6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5C+rpsH393YrxiGc1heBmcdDi2sHatBNFPFg0skgNBAiBsbKebJL80I+yyb5oezbzdA5dRujQxrMpxytLKHHK2Rw=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.4.1_1577540955152_0.454589447488313"},"_hasShrinkwrap":false},"4.4.2":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.4.2","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.4.2","@nestjsx/util":"^4.4.2","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"855ce9ffbac2ac56b6fdf86dbb2cf4b725ac9109","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.4.2","_nodeVersion":"10.15.1","_npmVersion":"lerna/3.16.4/node@v10.15.1+x64 (linux)","dist":{"integrity":"sha512-G50GthflsmwKNIf8h4rdXJxk1p2j3jTnlYQuMdMeJlrlkLiuUiMdP6qKjgLwXV08obR/X60YbdxMkFW6nMkceA==","shasum":"b976089d1bf7c8a1153cebc413b9b12b5a890fbf","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.4.2.tgz","fileCount":138,"unpackedSize":147278,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJecRncCRA9TVsSAnZWagAAKiIP/1M8afneHWQYqH2FY99y\nSLd48SlCW+D8SUcCe/3tGIkbRaub/zg1T0gOyqK9Wmdvq86bAvbPSVF9Tyxn\nPrAtU1Fle7EStvcZwzFZaMXLuoxke+SGJquTM3wVleyLMk6VI53vNHsIM0sk\nHZffX6gVz74zAqDi3lDyE+d/O1fdyqgZ/3sqm654CRExpibMbvoj8wc12j+y\nHW2Nk3qny+AAPYdg2iGNibjblj8XVwkVSee/HC5HcJMq4wHqIQregNVkweYn\n2rAVamsehGPoMVPgU9r4Thh98XpDHTjfDOnBS6JLpIYT5nPvbpqqV5uxJH1Z\n8EjRWHSU8n6ynlP7ATkH+cOVS9H0g0doYS1d/mHgD2XdlKMo06ZJpPY55Uig\nkaTKnbmVjdoF9BXkokc6Fmg8QBV46DcyihV990iAumLcO6x7z9E4qYb8xKFU\nEWF+a43XWtuTGBIKHfVccNmIwPONIgx9hP2HeOLEYpwrhFkxURbXzKwGwhxb\ndfC9cbic/GBNOqSb8tsQDqEWjOiMoCjtEx/RXfb16A3CiWoLY/XtqmWoWFqS\nOB2R0Q54p+jFOJrBjj5RqB4VmtfQEdWC7iM2k3/F6gZzSfg6NqoPbU9M3COX\nl5mYXpXjetxusufxBYRM7jS1nvJWviw+Eranxe5XMNZg3Ht2VRLYWA4GbAfq\nbqp+\r\n=+T9i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoBehJ0d328pgdL5T+f5aWMStrpJ1zfGnfq3DO9k5MZQIgJDo77WyzJBVVk88taBCdgGgfXuyt9BLWII7G2vDRys4="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.4.2_1584470492238_0.9667823756010556"},"_hasShrinkwrap":false},"4.4.4":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.4.4","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.4.4","@nestjsx/util":"^4.4.4","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"6a19c87b13b64f4381c9d76f5c6035cbbf4f4df0","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.4.4","_nodeVersion":"13.12.0","_npmVersion":"lerna/3.16.4/node@v13.12.0+x64 (darwin)","dist":{"integrity":"sha512-roy9fVyHvnEHa0zcFXXGWfUJMP1PUQSOkiqQwp1Q+a2OMn9vqSrNDoVLiSv+R4PrfsBEj/xadS1kDcTjixcgtw==","shasum":"1aa261f612ffb09745d1895a5b09fc5d3beeec2d","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.4.4.tgz","fileCount":138,"unpackedSize":147266,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemwBLCRA9TVsSAnZWagAAImcP/AnDbIWOfMY7ihICa8Ic\n450nYKqlcbL3ksDT9pWgZWeod4GdHC93ekoNknBS2PuRiOtLRg9Z6wbTdLaD\nDRAS5UD7h49lior3QZY8prL5rtUpWAj+WZ9dOHjdxg6/SuzIsY1VSiRDaPaH\nz+T/jCMv5nDs2UphI/ezTcYpXW3af+lVDSznyHNtTPt/o1cxIg4D6k2YmTmP\nUcFA/DIF9fv+pIjIc4BD0zIdeEX9AdK+3hliZaHXG66U6UxLkea1lh+GSdXY\nb5gKScQmb6oRQUHRmHgtdbfNtbxNX+CZvizE3ADc13JgaRZql2+TNLtBHsNj\nlc/GZuIiq0/+MdAzly4b5Reo8OKwLsUGlFshWZ8bBv5FeFMBlDdc6VAaW3BU\nKWpIauu6QKRvle4tqsctTFQ0zO3/kyuhrY674Y/Bcly/7e0ERrQJ7yJ/p3dQ\nqTCwZhIJmFmGFCj7ccZl/unERQVpta3j+1vfGraa3Cx4LS3PnhvmjfhHRrQh\nPv7v313pVb0EXErudqD48aXLZwCM00WU+/+GegHTL+eC9+Wtz3D/s/tsRdwr\nFmQbjVe2jCerA2nci+FD5j2jRiaDg1oaue0gAO8iNR7Vhvw/BzCNd/uwi+uy\nyIzNP3ImYj+FPJmNSUobh1QyEl8WC7MU+5ur7DrmXqhnXwW1yPeQRiNxxYQd\n+D6s\r\n=mEe+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXOxB5GJDwGMxdfs9OWe8j0Sac++IMB2zLxodKS83RpQIgFqm4zN6MCzaU5LfO09RvqBMcN67C5aS0iUABUZkCHn8="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.4.4_1587216458755_0.6500761853851449"},"_hasShrinkwrap":false},"4.4.5":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.4.5","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.4.5","@nestjsx/util":"^4.4.5","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"f336657c371222e7c0c24cfb6263153982e7e878","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.4.5","_nodeVersion":"13.12.0","_npmVersion":"lerna/3.16.4/node@v13.12.0+x64 (darwin)","dist":{"integrity":"sha512-9Rptd7T4rOwdF1B+P7TTxH20XXBAKD667aSrk7flXxpDAnHfd+6kqCJndThtdaUew76qa8sUgRK5x7C2n7+ThQ==","shasum":"09e065e29becc694826e1c019de7309d5230b35c","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.4.5.tgz","fileCount":138,"unpackedSize":147266,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJem1BaCRA9TVsSAnZWagAAv5MQAIFVcThXRUgixdmvExkC\nNc4OwybeNEfjc6KCCRFl3SryRJK+Hy6pG8xqevxHhmrdSODzMHEUGNAjyB//\nSLQ1qtymn7LwJM384omvkQRsYKVV47jB1DIuyTrPOl0zB1hMu1dU0T7t5QlF\nyBZC4aCQQkfKODSuWphx5UIIfTG4Z2ki+1BhOPCmKSkzq2oxyR2ncjLpDrwS\nwCrslTGBLlrma9T/nAzd158OgZx78Sr2huYuvhGMkPSDi2qu/jEVIRbcOicB\n3ir/M26BthINw3NRF8h9f378au6MGQK3bhKagfRDbXLJFKLifeEGlCLLtKdM\nylcrNGfk0CLA+wj63WcZLhjzCAZmvNbEDhIW1m4bkrgdTHh6hTEdKpT+E3Ik\nsTrcf/XJhqw/VAi96V9Yoty1N+/VEtLoYbUYraVBzPfj7lq9AdRzdawqWfnB\n3CnbhAZOaKENFTXbjA/QKkSAfb0j6ZsohyMK30TubyRrSOuAGGa45UbTvaKZ\nLdF+1IhDQ3+mL/0SidjHLnkMSdtCOXkepezFinT9xNbyRvBJ2/yNZkcA4G5R\nWnDg3mRY60wqJGFXcGSg406CTTdbPIWs01KUHmpWJ81KTXp+fJYtRT7Ybdjs\njBh3wtJHKTAzxczBpn+XhtFfiVuZ5N6znakAJbneLJsJ7dLCHQJiAJneD8iw\n0Ubb\r\n=wVyN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIApH31MUQgkgaKw+Wtcgj+QrNDH60QfMoVzX6O8Zg5RxAiAeYmTi0LnB1ZHH506HRWZNgn3ytoQEerdgyYm5rMtfaQ=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.4.5_1587236954067_0.7135736754009134"},"_hasShrinkwrap":false},"4.5.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.5.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.5.0","@nestjsx/util":"^4.5.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"7ef9744013b4b690fad667ddff089dc9135454d2","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.5.0","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-uhHceUwLDvoD3FDYhxfjzioDMBkCxAAzJJQHZBFiwmlw9FCEHkograFWwZ8uv6SXBTRyMOveuPpRwaPXkwNYZw==","shasum":"3f6e1d964a80f6f13aded5504068c727f573148f","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.5.0.tgz","fileCount":138,"unpackedSize":147668,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeq7+FCRA9TVsSAnZWagAAmmcP/RSEtTzTUk4QVdY6Iuwr\nUvHTs4/LHzOG6Q7qBRNwzJ0rQM5t/+tWBwukcDRcZ+Uq7VZwGDPch44RGsvm\nGU1rqu0uoznUeGKn4b6lrJMvuZFayKx6w7ajohDkeRe33gFrZLVWnHka39yX\nhilylXTkcYozHUVn2xoKg150jZ4l2WF/7P65vRxq/rcBav0ljCasMoCwfPFV\nCDUVuAHtmmQ+l/tgpcVoTkbipoWe1fSOslr3DWRk5Ne1XaE5ymsBE9Vuiexu\ns+Lr0oD8yut5LN0Y+3JnMum3in9DDyqY+hycs6XFEM97MMh5f0Dal0yVxt1Z\nU5XDdI6WRg9ufGZ7eh+KFtIGQEHbs3YkuwYWnu1DG2zfO728f1LeTM64S5Kj\nsvssYe2/LM1gpYkVG1FQVkpMbWHffLHCcJy1XQV3VGUFq/MNCmov4GAVphVC\n0uCsERvb/iVxK9/iExf8XUMsXgbA72LISKqUHfEaX2m6JuMzWXsgWJza+T12\n6keQ/JIqdi1yLlzIp9xRONrmBFuCF+ca0g1n6BfMp73q5LqZmijHJ13ySbpT\nSMS3txlhPRWwLyHePgMASXLVFPEV0YCiEBeK6uw0cto6KCzyQ21ji3aUUoRs\n9fG1Wrkv/iQuylM8zHYDPP0NDf91+DLYsE+RZt0ADDqZQRMQ1NsvIIahtPYp\nNROR\r\n=rW5h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAia+HxPnGJrj25LtqPybHEOws46bd3mQL1K1Q7mvAYqAiEA/hir9OgkNMoVCs8DFPM1BDx+fl9yG5jQzb6lkfcpzgc="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.5.0_1588313988999_0.05197525690613469"},"_hasShrinkwrap":false},"4.6.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.6.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.6.0","@nestjsx/util":"^4.6.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"2fae2160b9517543e3c5740a5c19ef260cdd2e2b","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.6.0","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-SVQA8zYCrO3fno3g2918NmP3p10bzks9zwKIxW6OPOvKT3PHhWtWgStybuuAuN6v0qYiQ6K2AkQdin575mSkiw==","shasum":"d5de84136e64e91549db28cc4db6a70b51da97e4","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.6.0.tgz","fileCount":138,"unpackedSize":147688,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetEwrCRA9TVsSAnZWagAAXHgQAInzwln/fQLZeU4TX7wo\nfZ4xkpwqVoR4MOf6OTRUxRLpVjvsgm0wF81UccoRsAnpD6yy+jb+BImkkK8g\nwjF7nvsKVR7vwesNQOUSKSSqOlMBfRPO1N/DCmKiKHofwnoc2UXloQRRBaQ3\nUQxAWMKGqELphWu3scg+cACyM5BRcc53ZNy3XIVy0+eExJgzBhZBmXqyrdL8\nb7Lr8xmbuK9627IpN6h3w0BEqUvWZ2mqUcQxZKBeMmKNmf7NcJH1FfNsx6N3\nHxHx+YRWrzOQCX+N7con4rSv7nr97QLXmHUoBejv4WnPz87NsCl67Enb+6wm\n2v2CzhqDsRLoUXRzADzbpKVYa8ag6Ci8D+/os+azzCgigaTnujDCpqktNZEm\nUmJTZnwFt7atOAw57BnL6lUW9xHQevOpLRqTQphDN0wp3/T5zi4RBicoJc1A\nTj1zbjLEBUQONVozpv+6NEMl1fghtkGF+jbe7WJaIiU2K1sW35l51cUM0Xue\nCv/jJN1WReKC43uZylwGBrzxk19gMS/gc0sFR/AQnDIPAf9V0mUku+15UeYn\n3obWduGdH27Tt6pB5rKViEJT4+8BftdK4CZ9ScEsFCQGTHRaXgbcggVKthiZ\nhSjTm/DZcoIDkXCcYlavd5XUN3a8vCFpXwMVBajv9C92M+BBHVaX1rB2KkqI\nCOux\r\n=wAWQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICK6qJzk8q7ZAWEPe0YEDDnGJi3/3BJU//2QYz99J/MXAiEAz5GgYzpdYoMzcla0C3jE0DYPU8NEfjVLkCHko1Zi7Ho="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.6.0_1588874283229_0.09242289662251801"},"_hasShrinkwrap":false},"4.6.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.6.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.6.1","@nestjsx/util":"^4.6.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"651ee4eeaeefeada4d9eadbb828ea191164b6015","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.6.1","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-Sc17ExhOrOoQFi1odvVSPyL3nVEiE/bmd8UngZGRu20w62BTJ5zV9mTLs6nv2R6noY3tS97pVqB85Qez5thlMA==","shasum":"a0bd067564aae86201894bccf7547f17ddd92799","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.6.1.tgz","fileCount":138,"unpackedSize":147688,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetU4GCRA9TVsSAnZWagAAeH8P/iu9Knw0D2jMVfrFvjMP\na4x4m6ZmbbNDBJNyS9oYJr/HjvS0RlT5+vFCgYgxzX6OwkM/EUZ/rPqNebVq\nTzsvNXYGJQJwpNPP1C/UTGayD+FcfDvPr9xxRm9oQY6ND9t4QAUsDheWxHUi\nAp1lEgv+3s1G9MDRp30tXPXf74poms14SzKK6Imh5QHQ748n9GUc7cEnM7oZ\ndYhPiZlbluhK+cgmegh89lfEP6KDvDoaff7SprzdvdtMSFi3WTNvdeFM/iC+\nfBvwHWCRXBLIlWKxpScXDI3RcnTTMIN2kC64JqTVEQEklIiU4Zew0H9jPk6w\nYpsAAwW+SsYYtfHEBeMxWuc7GaS42jIelAUro2JnGzSipOobC52CbfGqSK9F\nouLUgwZL+gfw45jkkIopNyaBDjl7VA4Brkdf78QkxYpFTeuGg/1h8+z/ng9A\nMLBh0Hix5bvrsdx/4DP0JZdtqfYEXNUoXKnOb4QU0JoW2zKz45ud6Sgs5780\notMWLvk2a71u7I5fziM5J2g1tbz5W3Qt9PFd/FHl+Z1Niz2gPIr2BGM2WLt1\nqP/l/MODQ5DD+f5+AIVx+qtTiIO6WhXm1VoPOin2u0fJ34gZKJ0k6dA6Bga3\njeQuOpaYsMNaxTjU06N6uPkMZOs/LS6a63i/mnoceNHmkXOJP4b681TA9I/1\n+2Or\r\n=3Dcr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE3SfPwzc4d3zecOe+OITB9VIzjFXTQe+D8t2g4ZvOWKAiA+8ND5qw2Q24q1BNYUd8Y2fzsYkDjBy07/+tqijsTT0w=="}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.6.1_1588940294565_0.3229002111126964"},"_hasShrinkwrap":false},"4.6.2":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"4.6.2","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^4.6.2","@nestjsx/util":"^4.6.2","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"115ee2b5e315ea2869af886e4c2e3a5f7ad0b0e9","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@4.6.2","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-WWzPI7X2saxJ2No5vO4+zaSRP4CABqSM4NGVAE1VjGQ1ApdjDxj3dFu08Y7YSa5kz+vmrVRwh++Vh+xd9MixUQ==","shasum":"7b6c3e8642f44f6113e7d9945aa397bbda334b26","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-4.6.2.tgz","fileCount":138,"unpackedSize":147688,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJevY2SCRA9TVsSAnZWagAA0nsP/jHiODjtbnlETzuS+E0R\nAbp4U3asZhLU7KKi4Py0nLqPaqLP9b+Xy1ujEmqOueK0VCCxNyJ0n2fdxZYA\nRPeIYjzsofOT5xP9+D67HM3tvYtu2P1lvGefpb00f7lx92M2XBTLyNHXnl9T\nPnkWhspxpEwAnVyxNLj3LDw26hlqOOUj2z6vnnlpUCM2Cy7JYEjOBtIdwW5d\nLs4+eOmfJwdVXx7t9R6Q3tJcu0frTt25gRkGgP6KcwVxvnCLtwHWG0eKZ3uN\ncZwjsV7kQqnhtr9m7zL+n9ZFU80ZgC+WkdxHbEZF3vQREfofB8Rb8ET5b0J1\nrSr3rfpcRug8L6UuOuBLeqF5ScYTLAvRI8Gkz9mQl95W3YCCZkqqDqJKmnN5\na35ZQtmkppeHo/yoqt3DO0GAktn7MYg0dxipP2N3xNDw4xDwBTrvWBohd5sB\nn7pAfjUrX0wAMNCSoxzlZDuIKr2PiijEcKFdOkhL8YQRSBvJahqd9bjS2MzQ\nCwTeJAUQsxXUmk1liIJLEtJ/xVANbdj8lk1kTteGyOqsbUXc2Z4Ojv/yX+SW\ncjnrLyOa/EngQnheYh0IvTrV4dSkG1r8Uyy+AEqJ0a0VKoW3yN7BMmTYiHOd\naIuMxVA1RO9AsrbyKdfc79IN5Ng+7jfFSIJvVV71SDfp3H7Uivh9Fo4EMCzd\nw8A5\r\n=WnpY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD19SpmvCvhjHNhjtYBT8HXiGwYcwzQpyv/Eq/TMC71zAIhAJsBM3rTQqOyX2XDd3i9wmoByUFdNJNsnk5kaV67V8JZ"}]},"maintainers":[{"email":"mihon4ik@gmail.com","name":"zmotivat0r"}],"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_4.6.2_1589480849639_0.4629435374858466"},"_hasShrinkwrap":false},"5.0.0-alpha.0":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"5.0.0-alpha.0","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^5.0.0-alpha.0","@nestjsx/util":"^5.0.0-alpha.0","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"014ff6e70265b0920488128fc0e667a9ffa949a0","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@5.0.0-alpha.0","_nodeVersion":"14.15.1","_npmVersion":"lerna/3.16.4/node@v14.15.1+x64 (darwin)","dist":{"integrity":"sha512-Kw8xG0VwClapkaSfb0XhHJcQpvgS/3VGrCF36jrEZE+P3CHaokgkq4k8OhkwSRxrYK9uY3UHJOcUq258JTTrcw==","shasum":"92d19137ad4ba0cdd3a1ccefec49b9199d03474b","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-5.0.0-alpha.0.tgz","fileCount":138,"unpackedSize":154367,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgFuz0CRA9TVsSAnZWagAAPFgP+wW+CzDJ4nsk+pYJREN9\nQDex+ppRafBGLFSaXaZP5UK1S9ZDPo2jGskcXN619STBUOq843IAc19/ajY7\nav6VAz0cM6nhgRXCxK3/+5OR6gvLteAoivutEgFLiFmGGK35RzyVTaKIbpaV\nv2iN4LBAgqjr4HzUls+0n5QTJL6G5ohjd/GkMdLbPypDo//F/tagv7Y0JFhb\nxVglskHyF4GWjGSd9aFH3tWgZL7kBcSbD3KxkgKXUhf3s4mbPtUaHlIun6Gk\nHX6PnX8fw8VWy7G3icrw+uRTBC5i4OWro2ptF/o8uMUTN9/0obO+r+F1jZf2\nUc2+89yhDYJk5PaOm66IFESa4tU1geggxRHUYIbQF3fixGmXknJVkG0rwWuV\nYayThtjRET6DLIQ5wirz1CVEtPonU7INTXUc3P92QqPizqITA74tr0E2hBo6\nba8EKBTNJQSgLF2PiG/qbYlJJUd5AiFIU/pYjJpvBR8jkcjnCHM+YwBebRRY\n1LSbjljnJoj5/p8uw/YhJCN8SSNg1y1ZyZi30hcE6cZyCsuCWYp3rsLJT190\n8TbmGEmdsPqzJBKzSwzazMvtNDBW/HAwf7r2uNDkjp/3pZ+7ZLL/lyHcotHG\nlDVAeu/GPHqi1G1n7HSOIwLG1Og/sKpN0RQ/M/a1sRV9B5WB8FQYJCr5U4mh\nB2gb\r\n=iVAy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBUmbley6amn7s8svgylbwnEVzF+GQ7ub3paE69AtYgxAiEA4LjCVTp1TF9qx7/fiJoJTnFNvLvaaydW+JRz1xM+DUM="}]},"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"maintainers":[{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_5.0.0-alpha.0_1612115187837_0.017601115280359236"},"_hasShrinkwrap":false},"5.0.0-alpha.1":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"5.0.0-alpha.1","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^5.0.0-alpha.1","@nestjsx/util":"^5.0.0-alpha.1","deepmerge":"^3.2.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"fa949fcfc40b8f8733f393ef09eaf023f91678df","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@5.0.0-alpha.1","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-UBWND3zg9tasapGPErEH711915Ne2SHpU1JCn1Vw2xa5mXyA2/KFlR/yt7cjsZ3OJe6PneLqLtLvWIr2oonoow==","shasum":"2ff8a33eea6b91947660f24ebd14e64c6bc47dbe","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-5.0.0-alpha.1.tgz","fileCount":138,"unpackedSize":155651,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgHqfACRA9TVsSAnZWagAAvjsP/R11YLAsJVG2ZCBl1GpQ\nuDXoY0PtcZfbN2sVI4sCSzQW/EuS7hf72y2sxFaIDTeeuCZKYMXXOBCJn3Ya\n4YmgNf9VEm9COkOFjeS7BJViiaQLyxWwLmV5zSSWHf74AOXwXNVhmbY+raVm\nO8giAf5n4aUOkWjSc4DI6MjtyDmk6XxfOY2WauhlCKegxiSphui+KdcR5ihT\nZRDxxN2F3DKD867VLdUaKeEL19rDbuDbN/uVEQOUn2w5GeV/gwXcNPj6W6My\nuuswkVWmTdgyJD4Bd6tBclLcnQLVereegvCwPBRbcPmMmip/J09mROnfvLoS\ngJMigM6rFz1GUYmI20OZ+LZmlDy0pP4pXAc47RwfTjWza11/zlWwaDsUzdDW\n8X63NWgM1LF5oIYxt9b2jNE3gJYWdZDtg+VZTyx7h04xSk1z3Isd+0P1W2aF\nq8JSofT06JPcq8RBB4Oo4D2/o0Sj3MZNYsyFV2lw6MBNkD0drRNQRS6tqBYS\nDXhVzc175D1iIpATorS5uxovO+8RbjsrqtR88oKOK2UOrlD2fLbYrlsMfDfT\nG5n/e/JQh3C6Y62xdmNmpPCwuThuzwm9BevZ52QzK1N/FzIeg6utX8ZPT3fZ\nNcP/ECiIHEX31GjB5qQRkYCSHFFEx/ht1bthGgbPmDKFCFVoXM6cYvCEJBay\n+2IX\r\n=wxM4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDvQ3dHedcMc40BEylQA7PYOe6ZLQg+vd8beMy/DM2MvAiEA4RBmt5LLFKT3iKBLitzcOfWd1jihPXpZGIz3s0XYINo="}]},"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"maintainers":[{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_5.0.0-alpha.1_1612621759890_0.9671031474565022"},"_hasShrinkwrap":false},"5.0.0-alpha.2":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"5.0.0-alpha.2","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^5.0.0-alpha.2","@nestjsx/util":"^5.0.0-alpha.2","deepmerge":"^3.2.0","pluralize":"^8.0.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"788863715faa1c88bc1efe17b22b64532cbab420","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@5.0.0-alpha.2","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-paOSgWV8XknbIKs4OgRFb7Pabl6eIEkK1F9iTtrxPSnYPVfKnaNbnIoNwSahiTPpejeBz94B+C/VxWqUgpdr8Q==","shasum":"242323872e6c0978419b94022541fee70ff09b9e","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-5.0.0-alpha.2.tgz","fileCount":138,"unpackedSize":155678,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgI4bjCRA9TVsSAnZWagAAiQIP/iRww0PFi4wo4PYxi6e0\n+jBF4Gr3CvyegLxLTPSPBrDWjnlDdBOT4Ly2OEDutvu0pPUyQmzlNrrYH+dF\n1W3PgSTc3pGgzwlOBFiqYsXFK8cq/+i/ZxyDwOcwcmKElh+YOJG1vIcxEldf\ndwD9ud86alBOvkBpxnoaAErH6NUbjkuf6QYbomQlRe2hU8rf7HkafVYOZVmk\noR+RmhEFCC8aD/aEa9gBCB/GZfo10DoO196PJw0S0AcNZ4JjYJeRiuxEYabp\noXh8ptwMRGQsZ/LjcqF619kYLxleCDHYiyphaQ+FFZLm9kbryQvzMa3vPjCU\nzVensZLUOReaAvRaGt3HEdqd7wYH002nML4GV4wxH72Uvwaqxv22epyAhpHh\nq2v4/1GKXKc6of7Mek/Ex/5/ItOBNKODkxE/IMJBxn8y09eo7Ufh0ULxfWXE\nU2FrectJmaXnkb161UlJFQRE5g6nE3nVkvGY6pnWuEeAsfnAsOXpGGHlUSDc\nR7FcggZ5ixS5WobzT/m83vn5ciI84ugWVtRV+8O4WqWocwIvRDNfGxIwJfgD\nAaSixCuWiWJzSITFDwI6HZEDdobzz+3YhQcavatvTojoG/w0oqNp8/qXqEqj\n4ne9/BFD06dhfSouyB6ZTRzeadtX3xTXRelii0SuzpQ+0Zxk8IrVevpDDgyC\nc2sd\r\n=z+3i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9OcdFt8AivVVKJAAg3NH0KFIaVkVV8ifFDVVZNkSvGwIgYlJ2MN43F0EXqjtJNfrOXk+4HwxGJnJ3O83up+reRRM="}]},"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"maintainers":[{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_5.0.0-alpha.2_1612941027350_0.31411685880765416"},"_hasShrinkwrap":false},"5.0.0-alpha.3":{"name":"@nestjsx/crud","description":"NestJs CRUD for RESTful APIs","version":"5.0.0-alpha.3","license":"MIT","main":"lib/index.js","typings":"lib/index.d.ts","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"scripts":{"build":"npx tsc -b"},"dependencies":{"@nestjsx/crud-request":"^5.0.0-alpha.3","@nestjsx/util":"^5.0.0-alpha.3","deepmerge":"^3.2.0","pluralize":"^8.0.0"},"peerDependencies":{"class-transformer":"*","class-validator":"*"},"gitHead":"bbea082a3f0fc7c1be42a79164f41b8449ad2251","homepage":"https://github.com/nestjsx/crud#readme","_id":"@nestjsx/crud@5.0.0-alpha.3","_nodeVersion":"12.16.3","_npmVersion":"lerna/3.16.4/node@v12.16.3+x64 (darwin)","dist":{"integrity":"sha512-LPFtrrE4nGT1vvzM+IpA4CNazO67Tz8gc4lAfSjwujIeOHPGfj3vJKUlcU/ESRUW/t+bLOF3S1tY/N0GQ/SRyg==","shasum":"84d494ceb5b10135afe53c62ed2a0e8015522f8b","tarball":"https://registry.npmjs.org/@nestjsx/crud/-/crud-5.0.0-alpha.3.tgz","fileCount":138,"unpackedSize":156192,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJTrOCRA9TVsSAnZWagAAU7EQAJQ2NL5tYY8CVdnTCBkE\ngCM5MGwdubWQjcPHhfMF+mOmy/yEcceUhyGB8aJhKGzIwWL6PVq3HaspfeA0\niwNkJ4HfVF/WUTdMkw5zq/ix5p4tXePGIi4ah/00k7YM0BDexZyeBCFYbBXv\nmNFbxKuLth16pUw21gizAFPPKF8nRRJK5zZYGkrLeqgaVrHCI1v3r1tJQhKf\nqE330NZrnc3XfVD71PBy9664mninzrxZb8Vpnf/EW7waXJp3XtbD+6vC1muE\nRtEYCCmXE9z++pEKdsHsIAX6oCvD9Pe7LMVJrMLkB6vhvj7zmJM21YRsXYQa\njLh6RKNAdWVhzLshW6Ut0DGG0KFI3Ld4r+kAK0flQA0ISWXsWn7nbyxBxZtz\nwUM9Bf3at6ZERP4CBpy45PlkeKZWxc+oVdShmFPcZfA1+37rPp3Gld/nsjD6\nztqaU6BQdhn6VdupIK/YFSejsqE7LjyqmAM03xgClMjLBwRggpRjDKZ87LK8\nCfsc/r7hVaek6uwLPiJcGeK4qtq7e7HCS6X3G+TE3ZDoXDIeVmLa+EfTmDJh\nRLlXcn7vknsrplSI1RkBjiGMFGMVtKg9afDHJW1nEvwFVjHgvnOqNew2WCG6\n4gRpDfCYREQpkCENG9zdN37wPf8X447ZwXyT0BAqRKWYFCm7DQAgoew6nsRk\nMBl5\r\n=1TwB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8hdL547KEdLSuaSdlRVZRG2hVOQjAChrRhD+cRKzWUgIgeyAlmGIp7wjfwytU2uzTLclnWSsTvHsn9NqaYQJYAtk="}]},"_npmUser":{"name":"zmotivat0r","email":"mihon4ik@gmail.com"},"directories":{},"maintainers":[{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/crud_5.0.0-alpha.3_1613052622051_0.6827735743439738"},"_hasShrinkwrap":false}},"time":{"created":"2018-05-19T08:15:04.549Z","0.1.0":"2018-05-19T08:15:04.757Z","modified":"2022-04-06T08:12:24.023Z","0.1.1":"2018-05-19T08:50:33.499Z","0.1.2":"2018-05-19T08:53:50.026Z","0.1.3":"2018-05-19T11:10:48.824Z","0.1.4":"2018-05-19T17:53:31.107Z","0.1.5":"2018-05-23T06:10:43.859Z","0.1.6":"2018-05-29T13:44:13.874Z","1.0.0":"2018-12-07T20:23:32.491Z","1.0.1":"2018-12-07T20:34:55.287Z","1.0.2":"2018-12-07T20:37:59.302Z","1.0.3":"2018-12-14T21:30:13.619Z","1.1.0":"2018-12-17T12:17:46.873Z","1.1.1":"2018-12-17T12:29:11.546Z","1.1.2":"2018-12-17T12:33:27.550Z","1.1.3":"2018-12-17T16:51:18.714Z","2.0.0":"2018-12-25T13:38:03.612Z","2.1.0":"2019-01-25T11:34:47.175Z","2.1.1":"2019-01-28T10:02:42.414Z","3.0.0-rc.1":"2019-03-20T21:01:13.944Z","3.0.0-rc.2":"2019-03-22T17:47:54.614Z","3.0.0":"2019-03-22T20:43:21.781Z","3.1.0":"2019-03-23T20:49:28.500Z","3.2.0-beta.0":"2019-03-25T17:11:44.860Z","3.2.0-beta.1":"2019-03-26T07:35:09.656Z","3.2.0-beta.2":"2019-03-26T11:06:48.022Z","3.2.0":"2019-03-27T08:02:17.010Z","3.3.0-rc.0":"2019-03-28T09:20:21.551Z","4.0.0-rc.1":"2019-06-10T14:11:59.801Z","4.0.0-rc.2":"2019-06-10T15:28:19.402Z","4.0.0-rc.3":"2019-06-12T14:10:03.128Z","4.0.0":"2019-06-12T14:55:53.523Z","4.0.1":"2019-06-21T12:04:13.880Z","4.1.0":"2019-06-27T15:06:07.452Z","4.2.0":"2019-07-26T09:26:35.285Z","4.3.0-alpha.0":"2019-10-13T12:26:02.195Z","4.3.0-4.3.0-beta.0.0":"2019-12-13T04:54:51.282Z","4.3.0-beta.0":"2019-12-13T04:57:21.230Z","4.3.0-beta.1":"2019-12-18T07:01:43.445Z","4.3.0-beta.2":"2019-12-18T09:25:10.308Z","4.3.0-beta.3":"2019-12-19T13:33:38.945Z","4.3.0-beta.4":"2019-12-21T10:54:22.882Z","4.3.0":"2019-12-21T20:03:44.079Z","4.3.1":"2019-12-23T11:30:34.218Z","4.3.2":"2019-12-23T12:31:47.738Z","4.3.3":"2019-12-23T14:12:50.429Z","4.4.0":"2019-12-27T09:17:20.418Z","4.4.1":"2019-12-28T13:49:15.299Z","4.4.2":"2020-03-17T18:41:32.384Z","4.4.4":"2020-04-18T13:27:38.883Z","4.4.5":"2020-04-18T19:09:14.294Z","4.5.0":"2020-05-01T06:19:49.129Z","4.6.0":"2020-05-07T17:58:03.341Z","4.6.1":"2020-05-08T12:18:14.718Z","4.6.2":"2020-05-14T18:27:29.759Z","5.0.0-alpha.0":"2021-01-31T17:46:27.944Z","5.0.0-alpha.1":"2021-02-06T14:29:20.002Z","5.0.0-alpha.2":"2021-02-10T07:10:27.459Z","5.0.0-alpha.3":"2021-02-11T14:10:22.172Z"},"maintainers":[{"name":"zmotivat0r","email":"mihon4ik@gmail.com"}],"description":"NestJs CRUD for RESTful APIs","readme":"<div align=\"center\">\n  <h1>CRUD (@nestjsx/crud)</h1>\n</div>\n<div align=\"center\">\n  <strong>for RESTful APIs built with NestJs</strong>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://travis-ci.org/nestjsx/crud\">\n    <img src=\"https://github.com/nestjsx/crud/workflows/Tests/badge.svg\" alt=\"Build\" />\n  </a>\n  <a href=\"https://coveralls.io/github/nestjsx/crud?branch=master\">\n    <img src=\"https://coveralls.io/repos/github/nestjsx/crud/badge.svg\" alt=\"Coverage\" />\n  </a>\n  <a href=\"https://github.com/nestjsx/crud/blob/master/LICENSE\">\n    <img src=\"https://img.shields.io/github/license/nestjsx/crud.svg\" alt=\"License\" />\n  </a>\n  <a href=\"https://www.npmjs.com/package/@nestjsx/crud\">\n    <img src=\"https://img.shields.io/npm/v/@nestjsx/crud.svg\" alt=\"npm version\" />\n  </a>\n  <a href=\"https://www.npmjs.com/org/nestjsx\">\n    <img src=\"https://img.shields.io/npm/dm/@nestjsx/crud.svg\" alt=\"npm downloads\" />\n  </a>\n  <a href=\"https://npm.packagequality.com/#?package=@nestjsx%2Fcrud\">\n    <img src=\"https://npm.packagequality.com/shield/%40nestjsx%2Fcrud.svg\" alt=\"Package Quality\" />\n  </a>\n  <a href=\"https://renovatebot.com/\">\n    <img src=\"https://img.shields.io/badge/renovate-enabled-brightgreen.svg\" alt=\"Renovate\" />\n  </a>\n  <a href=\"http://makeapullrequest.com\">\n    <img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\" alt=\"PRs welcome\" />\n  </a>\n  <a href=\"https://github.com/marmelab/awesome-rest#nodejs\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-rest.svg?sanitize=true\" alt=\"Awesome REST\" />\n  </a>\n  <a href=\"https://github.com/juliandavidmr/awesome-nestjs#components--libraries\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/awesome-nest.svg?sanitize=true\" alt=\"Awesome Nest\" />\n  </a>\n  <a href=\"https://github.com/nestjs/nest\">\n    <img src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/nest-powered.svg?sanitize=true\" alt=\"Nest Powered\" />\n  </a>\n  <a href=\"#individuals\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/backers/badge.svg\" />\n  </a>\n  <a href=\"#organizations\" alt=\"Sponsors on Open Collective\">\n    <img src=\"https://opencollective.com/nestjsx/sponsors/badge.svg\" />\n  </a> \n</div>\n\n<div align=\"center\">\n  <sub>Built by\n  <a href=\"https://twitter.com/MichaelYali\">@MichaelYali</a> and\n  <a href=\"https://github.com/nestjsx/crud/graphs/contributors\">\n    Contributors\n  </a>\n</div>\n\n<br />\n\nWe believe that everyone who's working with NestJs and building some RESTful services and especially some CRUD functionality will find `@nestjsx/crud` microframework very useful.\n\n## Features\n\n<img align=\"right\" src=\"https://raw.githubusercontent.com/nestjsx/crud/master/img/crud-usage2.png\" alt=\"CRUD usage\" />\n\n- Super easy to install and start using the full-featured controllers and services :point_right:\n\n- DB and service agnostic extendable CRUD controllers\n\n- Reach query parsing with filtering, pagination, sorting, relations, nested relations, cache, etc.\n\n- Framework agnostic package with query builder for a frontend usage\n\n- Query, path params and DTOs validation included\n\n- Overriding controller methods with ease\n\n- Tiny config (including globally)\n\n- Additional helper decorators\n\n- Swagger documentation\n\n## Install\n\n```shell\nnpm i @nestjsx/crud class-transformer class-validator\n```\n\n## Packages\n\n- [**@nestjsx/crud**](https://www.npmjs.com/package/@nestjsx/crud) - core package which provides `@Crud()` decorator for endpoints generation, global configuration, validation, helper decorators ([docs](https://github.com/nestjsx/crud/wiki/Controllers#description))\n- [**@nestjsx/crud-request**](https://www.npmjs.com/package/@nestjsx/crud-request) - request builder/parser package which provides `RequestQueryBuilder` class for a frontend usage and `RequestQueryParser` that is being used internally for handling and validating query/path params on a backend side ([docs](https://github.com/nestjsx/crud/wiki/Requests#frontend-usage))\n- [**@nestjsx/crud-typeorm**](https://www.npmjs.com/package/@nestjsx/crud-typeorm) - TypeORM package which provides base `TypeOrmCrudService` with methods for CRUD database operations ([docs](https://github.com/nestjsx/crud/wiki/ServiceTypeorm))\n\n## Documentation\n\n- [General Information](https://github.com/nestjsx/crud/wiki#why)\n- [CRUD Controllers](https://github.com/nestjsx/crud/wiki/Controllers#description)\n- [CRUD ORM Services](https://github.com/nestjsx/crud/wiki/Services#description)\n- [Handling Requests](https://github.com/nestjsx/crud/wiki/Requests#description)\n\n## Support\n\nAny support is welcome. At least you can give us a star.\n\n## Contributors\n\n### Code Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/nestjsx/crud/graphs/contributors\"><img src=\"https://opencollective.com/nestjsx/contributors.svg?width=890&button=false\" /></a>\n\n### Financial Contributors\n\nBecome a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/nestjsx#backer)]\n\n#### Individuals\n\n<a href=\"https://opencollective.com/nestjsx#backers\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/backers.svg?width=890&button=false\"></a>\n\n#### Organizations\n\nSupport this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/nestjsx#sponsor)]\n\n<a href=\"https://opencollective.com/nestjsx/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/nestjsx/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/nestjsx/sponsor/9/avatar.svg\"></a>\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md","homepage":"https://github.com/nestjsx/crud#readme","keywords":["typescript","typeorm","nest","nestjs","rest","restful","api","crud","crud-generator","backend","frameworks"],"repository":{"type":"git","url":"git+https://github.com/nestjsx/crud.git"},"author":{"name":"Michael Yali","email":"mihon4ik@gmail.com"},"bugs":{"url":"https://github.com/nestjsx/crud/issues"},"license":"MIT"}