{"_id":"@bunnio/rest-full","_rev":"9-5a33da43df9ce4e3efd623757c15dcc5","name":"@bunnio/rest-full","dist-tags":{"latest":"0.0.2-rc.9"},"versions":{"0.0.1":{"name":"@bunnio/rest-full","version":"0.0.1","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.1","gitHead":"d795977dd2a7e24c75cfe148ebd105e4363a5e36","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-tBR+Mnts5vcnX2ARnCdfmH6pugFffWPNL3HnPrPE3yNVshi70JVgDK4TDpBNrtMw42RE/Vmxt20Vrps5mIvk1w==","shasum":"6d51ebc723adeec476d6353c1863c48b49fc0b59","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.1.tgz","fileCount":46,"unpackedSize":281191,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDkQRGZfHl6YLz7ELx3gQxAL5y5w6xlIrop7XxT5PHgAIhAPULWGK8Od/Mu1SW4BLXWpqZMLnaQZwZ3xcpzDnuOqJO"}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.1_1710978787700_0.9530302632591208"},"_hasShrinkwrap":false},"0.0.2-rc.0":{"name":"@bunnio/rest-full","version":"0.0.2-rc.0","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.0","gitHead":"47cd038a5b2fd6a0ec83223a0cb0d40e49a95e83","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-yPVTbhf8/Xay2mdoBaicbdwozraj+O7d0raFUtCmLEKIUM/MY3pY8grV4nnuG28VbQp1WqKDFp+uebbGYaRcHg==","shasum":"32df41c1bb857857420f3423ae34b70ec08e7448","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.0.tgz","fileCount":46,"unpackedSize":288750,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEv0H8qDS/bD+8zpMImCmV7YjLFfr5dRQdziTsu0KzCJAiEAimTtm6YVXtQtjYUN4V8eohVcNxWZDNsxhsA615PCLd8="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.0_1711150185433_0.8909430116925174"},"_hasShrinkwrap":false},"0.0.2-rc.1":{"name":"@bunnio/rest-full","version":"0.0.2-rc.1","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.1","gitHead":"2295559f7ac8c215e12e5cd8e889aebfb577cf09","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-JdMUXGXb/4J6sCUT3yjDa/F+7f7O788t9uPZ43sEiR36wb0NlXCYJC4+bhPuQ8iVFW9vWLTGSB0TcaNaFyEd9A==","shasum":"3dc22221373df473daff542f9345808e71f0e24b","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.1.tgz","fileCount":46,"unpackedSize":301501,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICOJGuAEmBkAH3tH2SsU8/msyZyX8bLVdTvnp/d0CBzYAiEAn+VXrbjmOT9gfh98H0IwkvXXFEpeYbV2eCnFtEQrtO8="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.1_1711156857972_0.33742751802820115"},"_hasShrinkwrap":false},"0.0.2-rc.2":{"name":"@bunnio/rest-full","version":"0.0.2-rc.2","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.2","gitHead":"69e72124193d0269799ffbf7a179ccfbde623a53","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-DKIYbtdq/7SILZeNO0njacP/yLgQ0zecKx3UsNY1ePat9CLYSgyrlwbVFX0MN/dNjC30uX49wqB3rsdWASCJng==","shasum":"28e47e652fabcd88d7bb1231fde597bd991db979","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.2.tgz","fileCount":46,"unpackedSize":301501,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5JAfcM6J/y+3E0zRuONnH3snFr59LhbgYRaOCQB7JPwIgBT8Bd23bluZkXFr9mt7YuhM/ygYYEuicK9/1qpO6qpk="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.2_1711157267793_0.9642125855386656"},"_hasShrinkwrap":false},"0.0.2-rc.3":{"name":"@bunnio/rest-full","version":"0.0.2-rc.3","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.3","gitHead":"fcd70f5e0e2a7a71f4a77b9c512abffe8f16bd98","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-UcyEsdSc10Zc16BsO0zXbqbdyl546n7johRmRou7bQXgU4ZikS1EvdOjlQq+bU3ygK5EGnytfBEK16oxyeG/QA==","shasum":"48929e196b88314e2b5e20462fea091d3d48fea5","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.3.tgz","fileCount":46,"unpackedSize":301575,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG/ib2l+R61g+0P76CelwRA+CbrJWHr05ZQ726qZJmmyAiEAi69aSPT1mniWBBkz5EX3rEXnTAIrpie49rS++gEtdQg="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.3_1711158774540_0.4908955191338591"},"_hasShrinkwrap":false},"0.0.2-rc.4":{"name":"@bunnio/rest-full","version":"0.0.2-rc.4","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.4","gitHead":"487d524d8904b707dffe9472333c2eab7f3ce4bd","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-w4HNGD9PnafP4WnPgX/2PiN1z6S/95IaHmieUFUnRbpwL3Y3zjWJCh3JoNsmZgmxA4FxnCKlMVm3GPzT/RVszA==","shasum":"4728d4b28491de38c3ede1d231236bfd5c060627","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.4.tgz","fileCount":52,"unpackedSize":6744226,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDl3KQS4TgBsbD6RTSPUS8Pjp4RXjC2ghPcBrpzoM1HSQIhAIoBoTpcxpDm8QR0wuvXWxC5dxDeumK56d/+DvkVFF7/"}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.4_1711160878097_0.19273593231104957"},"_hasShrinkwrap":false},"0.0.2-rc.5":{"name":"@bunnio/rest-full","version":"0.0.2-rc.5","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.5","gitHead":"bf2be91b1604d156e9f4de6d8b2a0e4c79988fe4","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-eOSbhJSh6d8e/ankreplNj2vS65ikFApdrDfA8TaVCdCM7bH8bglpaxYukdkJR8Zju4+9Ux519DB6bQpX1VKEw==","shasum":"66c1fa064af2da3b96102da69a469268615a1a85","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.5.tgz","fileCount":54,"unpackedSize":6804381,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICRTOpCLv37kP/h438LOeEqmxAlJXVsqHKqXE+cWbB2tAiEAoGkdnfcNc9yzScXbyW+UmwkeAaQ86zBUrk+2B+ydrqs="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.5_1711162861755_0.743459552358215"},"_hasShrinkwrap":false},"0.0.2-rc.6":{"name":"@bunnio/rest-full","version":"0.0.2-rc.6","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.6","gitHead":"32d02839591bc19df26d86538beeb720844e7ed0","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-i36iOA37MtbOafqbnK0dwFLoKbPGzncxIcNMg531XsZgXGzjtScokFxFIcOXGnmgOT+C57KuhO5on4INwWwjyg==","shasum":"11a6c7c2a1f2578d0406741863ec7a2707a1bfa3","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.6.tgz","fileCount":54,"unpackedSize":6804634,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCd+z0xdHte0bkwT2dbBu6Tf8TII/hDIF6PgvmNU16tKgIhAK7yfVS4K4I3qepCzAUL8J35h3v+eEkfpoVkcsDY9k1T"}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.6_1711164235144_0.22436659409181225"},"_hasShrinkwrap":false},"0.0.2-rc.8":{"name":"@bunnio/rest-full","version":"0.0.2-rc.8","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.8","gitHead":"8e524c1f221e452c05d7656be0d3eb18a400a7fa","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-Yfrs7A91EUTOMuFQSZNu+QWDUljbtZoNWKkzuMjqxZkYlfhKGwL/2NleSir/uNuw/UK9E4eUTxhMVq7fEabFDQ==","shasum":"5d65d18c5ab9914312932d1db417efa57f84c475","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.8.tgz","fileCount":56,"unpackedSize":6840507,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG+CRAG5zuBBOdZyhH3grbqfVYlYrJuOkw7wEnrOMEd7AiAFRavxYtTArONw9gVxQLj84hNe6UhCs7flN102S33Aww=="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.8_1711204152807_0.9484226385399361"},"_hasShrinkwrap":false},"0.0.2-rc.9":{"name":"@bunnio/rest-full","version":"0.0.2-rc.9","description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","main":"index.ts","scripts":{"build":"tsc","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"keywords":["rest","openapi","axios"],"author":{"name":"Boldizsar Pal"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"homepage":"https://github.com/BoldizsarP/rest-full#readme","devDependencies":{"ts-node":"^10.9.2","typescript":"^5.4.2"},"dependencies":{"@bunnio/type-guardian":"^0.0.8-rc.14","axios":"^1.6.8","zod":"^3.22.4"},"_id":"@bunnio/rest-full@0.0.2-rc.9","gitHead":"2a5ca370eda47ced2ff4c309020e211030b984c2","_nodeVersion":"21.6.2","_npmVersion":"10.2.4","dist":{"integrity":"sha512-uBS/3ZcFD2oLQvBZx5Tw7ucm9VFJ6RFFzd2dshUcLRcnzBcnzXLgePJdIAp8UKioktR2N60lcA970+CQnNankg==","shasum":"754cad15fe9f7c3157363930559833ccde48e2c4","tarball":"https://registry.npmjs.org/@bunnio/rest-full/-/rest-full-0.0.2-rc.9.tgz","fileCount":56,"unpackedSize":6841340,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFNR7mrDde2vtaTMNbNjFvy4bvP0IKjHbs1ApyXmgl4lAiBWHphBPJTUlweIjlXP0nhedTVBXU9oAMmUW1g88M++kA=="}]},"_npmUser":{"name":"0baltazar0","email":"palboldizsar@gmail.com"},"directories":{},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/rest-full_0.0.2-rc.9_1711205210700_0.114575560426742"},"_hasShrinkwrap":false}},"time":{"created":"2024-03-20T23:53:07.584Z","0.0.1":"2024-03-20T23:53:07.902Z","modified":"2024-03-23T14:46:51.866Z","0.0.2-rc.0":"2024-03-22T23:29:45.643Z","0.0.2-rc.1":"2024-03-23T01:20:58.145Z","0.0.2-rc.2":"2024-03-23T01:27:47.991Z","0.0.2-rc.3":"2024-03-23T01:52:54.754Z","0.0.2-rc.4":"2024-03-23T02:27:58.392Z","0.0.2-rc.5":"2024-03-23T03:01:02.061Z","0.0.2-rc.6":"2024-03-23T03:23:55.425Z","0.0.2-rc.8":"2024-03-23T14:29:13.110Z","0.0.2-rc.9":"2024-03-23T14:46:51.013Z"},"maintainers":[{"name":"0baltazar0","email":"palboldizsar@gmail.com"}],"description":"Class oriented wrapper for @bunnio/type-guardian, that enables creating and managing openapi endpoints as a single class object","homepage":"https://github.com/BoldizsarP/rest-full#readme","keywords":["rest","openapi","axios"],"repository":{"type":"git","url":"git+https://github.com/BoldizsarP/rest-full.git"},"author":{"name":"Boldizsar Pal"},"bugs":{"url":"https://github.com/BoldizsarP/rest-full/issues"},"license":"GPL-3.0-or-later","readme":"# rest-full\n\nA Class oriented wrapper for the [@bunnio/type-guardian](https://www.npmjs.com/package/@bunnio/type-guardian)!, that enables the user to customize, and independently manage openapi endpoint (structures).\n\n# CONSIDER AS _whatever comes before pre alpha_ VERSION\n\n# USAGE\n\n> After using type-guardian, with full generation, navigate to a generated folder\n\nImport the three shapes that were generated previously\n\n```ts\n// You may rename these objects it however you want it\nimport { paths as InterfacePaths } from \"./YourOpenapiSource.interface\";\nimport { paths as ZodPath } from \"./YourOpenapiSource.zod\";\nimport { lookupJson } from \"./YourOpenapiSource.lookup\";\n```\n\nCreate the RequestPool by using these shapes\n\n```ts\n// You must supply the \"InterfacePaths\" as a template type, to enable proper typing.\nconst QP = new RequestPool<typeof ZodPath, InterfacePaths, typeof lookupJson>(\n  ZodPath,\n  lookupJson\n);\n```\n\nOnce initialized, you can call every path, that is defined in the original openapi, by calling the **request** function.\n\n```ts\nconst response = qp.request(\n  \"/image/{image_id}\", // path in openapi\n  \"put\", // method defined in path\n  \"application/json\", // body type if applicable or undefined <alias BodyKey>\n  {}, // the actual body content or undefined <alias Content>\n  {\n    path: { image_id: \"RandomStringId\" },\n  }, // every allowed <parameter> specified under <parameters> in openapi\n  { validate: { requestBody: true } } // optional settings see below\n);\n```\n\nAlternatively you can retrieve the zod types, for each OperationObject by calling **getPathZod**.\n\n```ts\n// Path conforms to the OperationObject type defined inside Descriptor<T>,\n// You can see it in details in file dist/types.d.ts\ninterface OperationObject: {\n        requestBody?: Descriptor<ZodSchema>[\"requestBody\"];\n        responses: Descriptor<ZodSchema>[\"responses\"];\n        parameters?: Descriptor<ZodSchema>[\"parameters\"];\n    };\nconst operationObjectZod = qp.getPathZod(\"/image/with_files\", \"post\");\n```\n\nYou can then use these zod schemas to further build your forms or other data submissions.\n\nExample\n\n```ts\nimport { useForm } from \"react-hook-form\";\ntype BodyZod = z.infer<(typeof fullZod)[\"requestBody\"][\"application/json\"]>;\nconst register = useForm<BodyZod>();\n```\n\n## Initialization (in details)\n\nThis package provides a class that expects 3 shaped values\n\n(Openapi.interface,Openapi.zod,Openapi.lookup provided by [@bunnio/type-guardian](https://www.npmjs.com/package/@bunnio/type-guardian)!)\n\n![Alt Text](./documentation/images/TGFormatExample.jpg)\n\nand provides a pre typed interface to properly use said Openapi specification.\n\nThe default **RequestPool** object is written for Axios, but you can easily change it to your preferred HTTP client.\n\nAn example initialization (same as above)\n\n```ts\nimport { RequestPool } from \"@bunnio/rest-full/dist/RequestPool\";\nimport { paths as ZodPath } from \"./YourOpenapiSource.zod\";\nimport { lookupJson } from \"./YourOpenapiSource.lookup\";\nimport { paths as InterfacePaths } from \"./YourOpenapiSource.interface\";\nconst qp = new RequestPool<typeof ZodPath, InterfacePaths, typeof lookupJson>(\n  ZodPath,\n  lookupJson\n);\n```\n\nthe **RequestPool** instance will be a pre-typed interface according to your specification.\n\nYou can use it as as:\n\n```ts\nconst response = qp.request(\n  \"/image/{image_id}\", // path in openapi\n  \"put\", // method defined in path\n  \"application/json\", // body type if applicable or undefined <alias BodyKey>\n  {}, // the actual body content or undefined <alias Content>\n  {\n    path: { image_id: \"RandomStringId\" },\n  }, // every allowed <parameter> specified under <parameters> in openapi\n  { validate: { requestBody: true } } // optional settings see below\n);\n```\n\nWatch the magic happen:\n![Alt Text](./documentation/gifs/ShowcaseTypeHints.gif)\n\n## Path and method\n\nThe path and method will be key combinations available in your specification.\n\n## BodyKey and Content\n\nBodyKey and Content are defined by what is allowed in the openapi specification.\nThe default implementation of **RequestPool** can only parse application/json and multipart/form-data, but let's you submit any shape.\n\nIf any other body shape is supplied, **RequestPool** will throw an error during execution.\n\nTo facilitate other parsers you may use the settings object during initialization:\n\n```ts\nconst qp = new RequestPool<typeof ZodPath, InterfacePaths, typeof lookupJson>(\n  ZodPath,\n  lookupJson,\n  {additionalBodyParser:{\"multipart/mixed\":(\n        path, //: P,\n        method, //: M,\n        bodyKey, //: BodyKey,\n        requestContent, //: Content,\n        context, //: Context\n        )=>{...your parser here}}}\n);\n```\n\nYou must adhere to the format, every additional type must be matched with a parser function that has the standard inputs (provided by **RequestPool**)\n\n- path,method, bodyKey, and requestContent are directly passed from original \"request\" call\n- context is defined in two segments\n- - The mandatory context supplied by the **RequestPool**\n- - The optional context that can be initialized by **contextMaker** in the settings\n\nThe bodyParser is expected to fill out the appropriate fields in the **context**, see more at the **RequestPool.request and Context**\n\n## Parameters\n\nThe parameters shape is matching to what is provided by the [type-guardian](https://www.npmjs.com/package/@bunnio/type-guardian)! interface parser.\n\n```ts\ninterface Example {\n  parameters: { path: { image_id: string } };\n}\n```\n\nEach parameter object may contain **any or none** of the following groups: **path,query,header**,~~cookies~~.\n\n```ts\ninterface Example {\n  parameters?: {\n    query: {\n      search_id?: components[\"schemas\"][\"StringQueryBody\"];\n      mode_id?: components[\"schemas\"][\"StringQueryMode\"];\n      search_profile?: components[\"schemas\"][\"BoolQueryBody\"];\n      mode_profile?: components[\"schemas\"][\"BoolQueryMode\"];\n      search_filename?: components[\"schemas\"][\"StringQueryBody\"];\n      mode_filename?: components[\"schemas\"][\"StringQueryMode\"];\n      search_format?: components[\"schemas\"][\"StringQueryBody\"];\n      mode_format?: components[\"schemas\"][\"StringQueryMode\"];\n      search_created_at?: components[\"schemas\"][\"DateQueryBody\"];\n      mode_created_at?: components[\"schemas\"][\"DateQueryMode\"];\n      search_user_id?: components[\"schemas\"][\"StringQueryBody\"];\n      mode_user_id?: components[\"schemas\"][\"StringQueryMode\"];\n      search_group_id?: components[\"schemas\"][\"StringQueryBody\"];\n      mode_group_id?: components[\"schemas\"][\"StringQueryMode\"];\n    };\n  };\n}\n```\n\nAs of now, cookies are not handled regardless if required or provided\n\nThe parameters are parsed based on the specification, with respect to their specified style and explode settings.\n\n```ts\nconst mode = parameter.style ?? \"simple\"; // As default\nconst explode = parameter.explode ?? false; // As default\n```\n\nUnparsable parameters will throw an error, please refer to either openapi specification, or the src/parameter-tools files\n\nA Path error example:\n\n```ts\nthrow Error(\n  `Path style must be one of \"simple\" | \"label\" | \"matrix\"! is ${mode}`\n);\n```\n\nParameters are expected to be **string compatbile, or simple objects**, **content type is not yet supported**\n\n## Additional settings\n\n### Validator\n\nThe zod validators may be called via specifying which validators you want to use in the _validate_ object.\n\n![Alt Text](./documentation/images/ValidatorExample.jpg)\n\nThe _validate_ object can only contain values that are provided in the previous steps, the type hints should help you call any available validators\n\nValidators are run before the context gets built, and are strictly called only for values/keys that were submitted.\n\nIn general it's better practise to use validators BEFORE calling request, see **Zod integration**\n\n### Expected Result Type\n\nThe value expectedResultType may contain which content-type you expect,\n\n_such as **application/json**, **multipart/form-data**_,\n\n...if multiple content type is defined in the responses object of the operation.\n\nThis is only used to set the proper response content-type.\n\nDefault is **application/json**.\n\n## Responses\n\nThe response shape is based on the **method type**, and **responses defined** in the openapi.\n\nBy default\n\n```ts\ntype GetKeys = Pick<PathObject, \"get\" | \"options\" | \"head\">; //-> expects 200 first but checks 201 if available\ntype PutKeys = Pick<PathObject, \"delete\" | \"patch\" | \"put\">; //-> expects 200 first but checks 201 if available\ntype PostKeys = Pick<PathObject, \"post\">; //->expects 201 first but checks 200 if available\n```\n\nthe current implementation of response type **can not** distuingish between supported and not supported response types.\n\nDefintions like:\n\n![Alt Text](./documentation/images/ResponseShapeExample1.jpg)\n\nwith content:\n\n![Alt Text](./documentation/images/ResponseShapeExample2.jpg)\n\nwill translate to:\n\n![Alt Text](./documentation/images/ResponseShapeExample3.jpg)\n\n**Axios decodes json response by default**, but any other expected response **must be decoded by the programmer**\n\n_I am currently working on a standardized approach, to enable response parsing, but for now, be aware of this limitation_\n\n# RequestPool.request and Context\n\nEvery time a **request** is called, the function creates a context, which then gets filled with every information the request may need.\n\n## Setting up context\n\nThe context shape can be extended via specifing **contextMaker** in the _constructor_ settings.\n\nRegardless of the supplied shape, the context must contain elements like,\n\n```ts\ntype context<Body> = {\n  requestData: Body & { url: string };\n  queryParameterChain: string[];\n  headers: [string, string][];\n  lookup: {\n    path: DeepReadonly<PathObject>;\n    rootSecurity?: DeepReadonly<YAMLDocumentStructure[\"security\"]>;\n    OperationObject: DeepReadonly<OperationObject>;\n  };\n  method: keyof Pick<\n    PathObject,\n    \"get\" | \"delete\" | \"options\" | \"patch\" | \"post\" | \"put\" | \"trace\" | \"head\"\n  >;\n};\n```\n\nhowever, the **contextMaker gets all this information**, so you only need to append with whatever extra information you might want\n\n```ts\n{contextMaker?: (starter: DefaultContext<Body>) => Context;}\n```\n\n## Context building\n\nA context is created at the beginning of the request.\n\n- **bodyParsers** are expected to fill out **context.requestData.data** (requestData extends AxiosRequestConfig)\n- **path parameters** are updating the **context.requestData.url**, /image/{image_id}-> /image/123123\n- **query parameters** are pushing their \\[key, value\\] pairs to **context.queryParameterChain**\n- **headers** are being defined as \\[key, value\\] pairs in **context.headers**\n- security functions have no designated **context** fields, they are expected to fill out their respective headers or query parameters, or data fields\n\n## Context Execution\n\nThe actual axios request is created in the _execute_ function, which relies only on **context**.\n\n```ts\nfunction execute<\n   ...\n  >(\n    context: Context\n  ): AxiosPromise<ResponseFinder<Responses, M>[ExpectedResType]>{...}\n```\n\nBecause of this, by the time the _execute_ function gets called the **context** has to be fully built.\n\nAfter the execution the **context** is considered consumed, and will be thrown away.\n\n# Security\n\n_Global security term means site wide security, defined at root level, local security means security defined at OperationObject_\n\nThere is **no default behaviour** for security, but there are **two hooks provided** for the security operations.\n\n```ts\nclass RequestPool {\n  constructor(\n    // {...},\n    settings?: {\n      //{...},\n      globalSecurityHandler?: (\n        security: DeepReadonly<SecuritySchema>,\n        scopes: DeepReadonly<string[]>,\n        name: string,\n        fullSecurity: DeepReadonly<SecurityRequirements>,\n        context: Context\n      ) => void;\n      lookupSecurityHandler?: (\n        security: DeepReadonly<SecuritySchema>,\n        scopes: DeepReadonly<string[]>,\n        name: string,\n        fullSecurity: DeepReadonly<SecurityRequirements>,\n        context: Context\n      ) => void;\n    }\n  ){...};\n}\n```\n\n## Global security\n\nThe **RequestPool** \\(constructor parameter\\) _options_ may contain a **globalSecurityHandler**, which then will be called for **every security** defined in the **openapi root security object**.\n\nWith each call, you only get **one security schema**, but you can see the other keys defined in the fullSecurity object.\n\n```ts\nfunction globalSecurityHandler (\n        security: DeepReadonly<SecuritySchema>,\n        scopes: DeepReadonly<string[]>,\n        name: string,\n        fullSecurity: DeepReadonly<SecurityRequirements>,\n        context: Context\n      ) => {};\n```\n\nTo understand **\"&\"** and **\"|\"** behaviors and expectations in openapi security, please refer to the openapi specification.\n\n**SecuritySchema, and SecurityRequirements are exact values from the lookUpJson**, which is direct _translations_ of the original openapi.\n\n```ts\n// See more at @bunnio/type-guardian/dist/yaml-tools/securitySchemes/interface.d.ts\nexport type SecuritySchema =\n  | BasicAuth\n  | BearerAuth\n  | ApiAuth\n  | OauthAuth\n  | OIDCAuth;\nexport type SecurityRequirements = {\n  [key: string]: string[];\n} & ExtraYamlStuff;\n```\n\nIt is expected of the programmer to fill out the required **context** fields when handling security.\n\n## Local security\n\nLocal security works exactly as global security does.\n\n```ts\nfunction lookupSecurityHandler(\n  security: DeepReadonly<SecuritySchema>,\n  scopes: DeepReadonly<string[]>,\n  name: string,\n  fullSecurity: DeepReadonly<SecurityRequirements>,\n  context: Context\n) {}\n```\n\n## Priority\n\nIf global security is defined, those keys get called first.\n\nLocal security keys are called last, so you may overwrite or delete any security set previously via global security.\n\n## Best practices\n\nSince **RequestPool** calls the **contextCreator** and the **security tools** **on demand**, it is best if you use these handlers to connect your security information with any other state manager you may use.\n\nIf your security measures do not change often it might be best to use the **contextCreator** or **defaultSettings** to always ensure your api key/bearer token is set.\n\nOtherwise its better to expose a function in your security flow,that can always access the latest security tokens and then supply it as a security handler\n\nIf your schema does not explicitly describe a security, but you still want to supply, both **defaultSettings** and **contextCreator** are/can be callable, so you can _just put your security tokens_ in the **context** on every context creation.\n\n# Zod integration\n\nZod schemas are pre built via [type-guardian](https://www.npmjs.com/package/@bunnio/type-guardian)!\n\n![Alt Text](./documentation/images/ZodSample.jpg)\n\nThe **RequestPool** currently supports 2+1 Zod Schema retriever.\n\n- getBodyZod\n- **getPathZod**\n- getParameterZod\n\nit is highly recommended that you use **getPathZod**, as it retrieves the full zod specification and you can cherry pick which objects you want to use.\n\n[type-guardian](https://www.npmjs.com/package/@bunnio/type-guardian)! keeps a very simple structure for defining zod schemas\n\n## requestBody\n\nOne of the values retrieved by **getPathZod** can be _requestBodies_ if applicable.\nIn _requestBodies_ you can expect to find every schema defined in you openapi as\n\\[_mediaType_\\]:**ZodSchema**\n\nThis also means that you may need to break up the zod definitions, for example if you are sending _multipart/form-data_\n\n_This might get fixed/supported better in a future release_\n\n**You can use z.infer to make typing easier**\n\n```ts\nconst fullZod = qp.getPathZod(\"/image/with_files\", \"post\");\ntype ZodStuff = z.infer<(typeof fullZod)[\"requestBody\"][\"multipart/form-data\"]>;\n```\n\n## parameters\n\nParameters match their interface counterparts, and are slightly different than your openapi definitions.\n\nParameters are aggregated into four categories\n\n- **query**\n- **path**\n- **headers**\n- ~~cookies~~\n- - cookies are available but the request will disregard it for now\n\nEach category is a _key_->**ZodSchema** pair, that you can use to parse the parameter\n\n![Alt Text](./documentation/images/ZodSample2.jpg)\n\n# Additional settings, tools available\n\n## YamlNavigator\n\nA yaml navigator is included in the **RequestPool**.\n\nThis class ensures, that every _lookUp_ entry passed through the layers are the actual component, and not just a $ref,\n\n_...at least at root level_\n\n## silentError (default false)\n\nYou can silence _some_ errors by setting silentError to true.\n\nThis mostly affects zod lookups, when the zod validator is not found.\n\nSilent errors will still log, but not throw an actual error\n\n## strictEncoding (default false)\n\nMultipart/\\* requests may have an additional encoding parameter at the schema level.\n\nThis can ensure that all keys are encoded appropriately\n\nThe current behaviour is that top level components that are simple string type, or simple string arrays, with format:binary are expected to be files\n\nAny other field is expected to be json\n\nif strictEncoding is set to true, this must be also specified in the encoding section of the openapi\n\n## warnOnCookies (default false)\n\nWhether to omit a console log stating that cookies are not supported, when cookies are encountered\n\n## throwOnSecurityMissing (default true)\n\nWhether to throw an error if a security is defined in the openapi, but the actual specification (in components) was not found, thus it wasn't executed\n\n## defaultSettings\n\nEither a const settings that gets used at every context creation for the value requestData, or a function that returns an **AxiosRequestConfig or something** that extends AxiosRequestConfig\n","readmeFilename":"readme.md"}