{"_id":"bro-framework","_rev":"27-ad1d063468b6bf95394a05a60fca0193","name":"bro-framework","dist-tags":{"latest":"3.0.6"},"versions":{"1.2.3":{"name":"bro-framework","version":"1.2.3","_id":"bro-framework@1.2.3","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"e344851c6535951a4dc97c79bc664915ffec9a05","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-1.2.3.tgz","fileCount":12,"integrity":"sha512-zZy1xbAog0XTt/h9DEJg1cv0xnRMxwezT3u1TjZX7QiVnvySir0LsLFCGAhfDle5IH3sIuonjTqlWKfYDklZ/A==","signatures":[{"sig":"MEQCIGCsggtfpHrZnp2Csun8LkbqDY3OEJc+S/sR/V28IadMAiAEpAdY8pbVoTb5iPIBZ6b5pg8QO5PjULAzcze+Ii2BUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39150},"main":"src/index.js","type":"module","types":"./src/index.d.ts","exports":{".":"./src/index.js"},"gitHead":"7848843cf667bca60be18aee7191424da50005b8","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_1.2.3_1788908216481_0.5071562001549279","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"bro-framework","version":"1.2.4","_id":"bro-framework@1.2.4","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"c05571a39c09d57bfcff23b233f0c9ac9661f9fe","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-1.2.4.tgz","fileCount":12,"integrity":"sha512-XaMpOSRMURBvnAw8OFHW1CUbozrJuSyJ0yBD42zumeVumltTiqsG5nmDiM8PT6mTo3IXt2p6R+bHM/+s6akC/Q==","signatures":[{"sig":"MEUCIFnMr5sdPFeuCUDndbHq8dfe89IHFzodUN7JxAt8uM3fAiEA1asJEKg8BykPA89VPcg7udXUP3c0gcBpFKgouINNCQY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39157},"main":"src/index.js","type":"module","types":"./src/index.d.ts","exports":{".":"./src/index.js"},"gitHead":"7848843cf667bca60be18aee7191424da50005b8","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_1.2.4_1788908912579_0.9110180409103259","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"bro-framework","version":"1.2.5","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"_id":"bro-framework@1.2.5","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"46798d7f6e1dcf0f752f2debb4be7a1d549a8b73","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-1.2.5.tgz","fileCount":12,"integrity":"sha512-Ygt6V6/hC+LYT+WL/zeT5zPiuiIpMDAIdi9ycuHIcMDIJNeNPIU9DByDCmMsDSUdZeBkXPLEVgFUMwDK9GjeDg==","signatures":[{"sig":"MEYCIQC+v2e1aGsXqW7cMVBEPLjKBm6lXEY8zTcWlfp1ainHxwIhAMyjWZqbGJ5N0JpY2JgkHsTDPoEACUxLCQsUYHccVe7c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39888},"main":"src/index.js","type":"module","types":"./src/index.d.ts","exports":{".":"./src/index.js"},"gitHead":"67ecb37d3d3f2108f8e85164b8b5188023999b05","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_1.2.5_1788909244506_0.9683943189938564","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"bro-framework","version":"1.2.6","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@1.2.6","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://github.com/medyass1ne/bro.js#readme","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"0e801336ddac01bcb7c8b1012e831da1332af1ba","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-1.2.6.tgz","fileCount":12,"integrity":"sha512-eZKwc7c8deKPSs/fARb1AiGkQVoAs8Eh420PP3LNCZfg3YPY5Tf8tR5JVhFj9A1Bjs3EyVey55Ly1x68YJC4FQ==","signatures":[{"sig":"MEYCIQDi/CO0fYYu/oPnoxSfNJUg3omG9hOrV0kUeXmr3W1viAIhAOkzibTqknRloTIk7Et5kreFO7ZG5D5HxN5b5vS7GlFu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40026},"main":"src/index.js","type":"module","types":"./src/index.d.ts","exports":{".":"./src/index.js"},"gitHead":"67ecb37d3d3f2108f8e85164b8b5188023999b05","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_1.2.6_1788909328499_0.2522391559337227","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"bro-framework","version":"1.2.7","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@1.2.7","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"10c3fd2435dbdb434cd71859d84adad7cfa70c44","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-1.2.7.tgz","fileCount":12,"integrity":"sha512-yCao+ATIeMAfG0iwHVdwva4/3DohrCpOkxvZJsEFuc2bYqjNy4QNpB0O0r9Zt17GCGcVQ5lOtj1y1GDhWSzHwg==","signatures":[{"sig":"MEQCIF5Mv3LNyKbfGcau6ENVSK3fjh4/Y0EMEvd6fijfU0diAiBwEkUQmiOwasGADbVWrZJbrU82GustxRDIuwzAWY+i0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40071},"main":"src/index.js","type":"module","types":"./src/index.d.ts","exports":{".":"./src/index.js"},"gitHead":"67ecb37d3d3f2108f8e85164b8b5188023999b05","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_1.2.7_1788909558918_0.9694770526730845","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"bro-framework","version":"1.2.8","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@1.2.8","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"c312b3ba1527ab4622460dca112e791d0aae1d4e","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-1.2.8.tgz","fileCount":12,"integrity":"sha512-ET62I91KsqZyKeinc8XUCZwzf1Xe9QYWcnT/MWqwVD3IegoKtS+c7IMXUKWYkuS+oYHkSOr3f9aT0PSpOAGeGA==","signatures":[{"sig":"MEUCIFjnkksWRVSICa+nNzwn7z63QKTxSt/azZR8wE/iIO8xAiEA1TlNPHBrAVnp6ewptB07/a/oS5o06mbPERAtiRaW/D4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40167},"main":"src/index.js","type":"module","types":"./src/index.d.ts","exports":{".":"./src/index.js"},"gitHead":"1be6a971507552c6b6bd7c286da6c0668b0f5555","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_1.2.8_1788977432150_0.29862369448155124","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"bro-framework","version":"2.0.0","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.0.0","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"8db97ac79235a80d34e43f37b7f0f92b415b3695","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.0.0.tgz","fileCount":12,"integrity":"sha512-YAg1UiYvcdSeGHaSWNSh5xyFnUJhSmXIQZ4RL/fOIbYRGXjBIEWorfWLElhA1GRuBaZKbRMMr7vKvICTe7HEUg==","signatures":[{"sig":"MEUCIFnWHc2ZGZb+G29MRaMWCmQHONY/4CEM/6eniIejFbBHAiEAhtqr+LM9Tm3SgImEg8Q7EGlyE82OhgwwACFuZYCt2L0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40780},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"94d8e373ee61c07e64b1260f0fb73442115cd2c5","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.0.0_1788987766825_0.1743388373795487","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"bro-framework","version":"2.0.1","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.0.1","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"dbcef938a19f8ab776050f630b77c7355a294307","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.0.1.tgz","fileCount":12,"integrity":"sha512-ehz/z3jZiPTD9tc0fOrPkW4Xv7yv0mwy3ei/XY5Dypaj6r7prL29bQC5IRDbQ0iZWUxid/4ng/H6JqarIvJFKA==","signatures":[{"sig":"MEUCIA6f997L0fEWIc9kVKfRsTYZk06NxD3fKxcsY9x0HfPZAiEAs/PCZz7EdmpIRgYpNJfxUV+l2NclrW512X6t2Wb63/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40858},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"892d9d88c193000405881d3b9e27868d673e1a9a","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.0.1_1788989353813_0.6525301728448398","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"bro-framework","version":"2.1.0","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.1.0","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"28d00aa98e829c0341d343b966313921ef7e40d5","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.1.0.tgz","fileCount":12,"integrity":"sha512-KUIovGYUSghI2mbFRJ9pIIw/U/EM1sE3KYwaVcJJBH9iqktlFbwemXJMBsxPTCTemnsrmiJQvYpcnpGSuyFnPA==","signatures":[{"sig":"MEUCIQCQqUY5nmIjI+GSYdPgEgAiJp6XJUmEOrzjRkag+OKQmQIgM4l/wQVRw5SJeaK/2Dr7ywDcukVLNV1SFWcWzlkKC5c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43296},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"b79e66f9a90b4ba767d820b238bb94e12d6407ff","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.1.0_1789145472602_0.4258433244038309","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"bro-framework","version":"2.2.0","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.2.0","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"cd5d3d8c17887ae2ca97c7b57a3fefad40ae81e6","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.2.0.tgz","fileCount":12,"integrity":"sha512-VFFj5rsaSR0kfZ3CCchFvfbrb6UKulgY3/miYFpct/fiot7bZvMBo3+MOS9Y/fQZykQg13yUfTRMc5BO93IQTg==","signatures":[{"sig":"MEUCIHlP8JqjE31xmdOP6OlIOnl7xmoTBoab2emU2Q6kSr//AiEApY0x2dI2IRxbp+mvCUczb8qfLrCK2hohQc9FeBwiyYw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":45917},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"9aed40900bcac67babbbd1b86fe52c1f32b6d9d1","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.2.0_1789147304902_0.8676212203886582","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"bro-framework","version":"2.2.1","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.2.1","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"f07e70b504030cc1b7f1c2529f16425070c9fce6","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.2.1.tgz","fileCount":12,"integrity":"sha512-wAs6gtxhxrNs7ETZ8PHCGw30iLN9Iw6vWk5Zyy2l06gA1u4pE3M1H+OSHoBH4hmQGJGrivVzVnhS5iyqvu8dQA==","signatures":[{"sig":"MEYCIQDnLrtclGqjWE8SQn0m4ndo2AS9bjWQBaTY2Io6ymQ2VQIhAIi5OT7Uv5TVAn+3TYvOQMtvGD4sAhCN7XTr6LMiC2ug","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47216},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"ca85d63d76bcb7e4075146857f916aeb14759fd0","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.2.1_1789172005860_0.19803992131270998","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"bro-framework","version":"2.2.2","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.2.2","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"96ced8c8fc19d9693eb7a0f852edb6f9b22a05f0","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.2.2.tgz","fileCount":12,"integrity":"sha512-DZy7vYNDA6ByRkpMePOMO2mwQnkYQXV/ajT+OZ4/u5dE/HotmPCpTJQ5Ymq9wK1pvOf0yzD3GhLVhZk42oHF0w==","signatures":[{"sig":"MEQCIG2+bAac3tRz4pN2xWw6QmvqjbS3gUrQ7r95n6q6n/NfAiASEBMq7dwlqXlpfCPquSLBTKRpgHXQLCao/JGdcDB52g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":48904},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"de7735a5c9e362164ad646accb65028b82f176ff","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.2.2_1789176637126_0.4894883568955002","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"bro-framework","version":"2.3.0","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.3.0","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"671bac89216d7f0d2ba297e466f7f9edb0c8ed76","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.3.0.tgz","fileCount":13,"integrity":"sha512-vEjfdFjc09/q4BMsk7L1+5h4qjIta5W+IArgnNgV6I7yV3joxt57DogptnK3P5ZTCVYhTgqtz5USJDIrSvv7vQ==","signatures":[{"sig":"MEYCIQCLvxOZB5vi4KB9VYbNLqyNMphiVcQO1cSbY0Zu1GMBiAIhANs9C5c3o9Pd+mH8fyuO91xsAcArRyHhgetwkiKy7Tqw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56271},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"1d26a940ffc9d948816fad3aa56f0e465b4b03f2","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.3.0_1789216199255_0.7012449836954262","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"bro-framework","version":"2.3.1","keywords":["bro","brojs","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.3.1","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"7424f45b320c72d8d17bac81786d0fb445531d99","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.3.1.tgz","fileCount":13,"integrity":"sha512-3xdXyHntaaw+hOqn145AOfBSZki+/lMGmglbrx0o+eHCrlRbUL/dGqMLZSGBuwZqZ86bHBqnUG1a9WGmuk0gvA==","signatures":[{"sig":"MEQCIAWu2szRcT8BCwmTCBi5QESmRjcOHfASE+RnqjtgtbBNAiAGQxvMWYLrY6lXf2ZhLjXwwaaNHE0Fy1r30JKot9yv/A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56117},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"e1a370ae338beaeff29d8cef3cf96178f2a7cbdf","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","dotenv":"^16.4.5","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.3.1_1789249798774_0.7608357023450676","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"bro-framework","version":"2.4.0","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.4.0","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"e4b1b721ee2baaa3009c0d4fdd9e6b48e940eeae","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.4.0.tgz","fileCount":13,"integrity":"sha512-efelOZ3aWQM3QIw7PLWpY5QoyqCMwYSvKeQczMZaDsaDv9faPFiSV9EJaiP8DtCOPGf60KWOjVS03IWyb8MwKg==","signatures":[{"sig":"MEUCICOwX5HSIZYgetXShLEeGwkvU8u9l/e6MyEHNOsjAHBYAiEAzIDPpeymech15enHYD8Ykg9u5nrXEy7/UqsuYwzcfqw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63428},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"594ee0ecb97001bf219f2310f74601f0516e79b7","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"ioredis-mock":"^8.13.1"},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.4.0_1789420488443_0.397695192026573","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"bro-framework","version":"2.4.1","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.4.1","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"86c58bd61f422cceafa8039b2111840a187d7852","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.4.1.tgz","fileCount":13,"integrity":"sha512-yRaJjHU3b+axPZ0eZr6fJQwqx0iodB/4EFWXPUhvzNr7InSvHR9LkpBIX1o2E+xjdPeDQ0SsVismJbWWET+QyA==","signatures":[{"sig":"MEYCIQCDW1dG3uW6eAfFst4YcGCYBVpWujhTFoAodUHmw4GJwwIhALZrj29ql1LevjmdRSU3lrN7adBuNJMXpTCkb/I7QwlV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68673},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"c5515128159d7ad45f2a56df8990f0bc8306bc1f","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"ioredis-mock":"^8.13.1"},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.4.1_1789421952784_0.738967916023243","host":"s3://npm-registry-packages-npm-production"}},"2.4.2":{"name":"bro-framework","version":"2.4.2","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.4.2","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"989673d9780dc5784ca4d4907eb12e0841160f18","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.4.2.tgz","fileCount":13,"integrity":"sha512-A+N2uGaLAsu1qF0XqQNWBy/BVAh6bSMMxDJifctBus+MN1g3hJjlOsQ0LRLqG6db6FSQ+vCiDatsMW/aWJ5v/w==","signatures":[{"sig":"MEUCIAoObRF7W0qLOG4LH2AXmBT+OBunOoerAP8rXK5ZJTtIAiEAr5ode5HSkHyQiDYbDHJ4tlqbIwX2nabsMsP8Ci85/Uk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69299},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","default":"./src/index.js"}},"gitHead":"b0cf71320aa2c0888b026630b0fc1e2058a5fb28","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"ioredis-mock":"^8.13.1"},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.4.2_1789423032886_0.7096422576880541","host":"s3://npm-registry-packages-npm-production"}},"2.4.3":{"name":"bro-framework","version":"2.4.3","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.4.3","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"e53665ee489c313cac3efb87d2ae0c9496fbcc54","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.4.3.tgz","fileCount":15,"integrity":"sha512-yqUZizrHaFg6bKfsRzZnH/V2npgR0T4QISlhq/9VwIQrdwr9gKJh2fL3dOhTq/4IatOKusEolKM5lQs9uQ/BjA==","signatures":[{"sig":"MEQCICrVUSo+KoLGkrw83BvNJqVhwu3579IRyxGHzX/cQYE4AiBwUrudVMIFqYCnJHvCJ0qi5WAqKyby3y4GzAYT/CPReg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79940},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js","require":"./src/index.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","default":"./src/next.js","require":"./src/next.js"}},"gitHead":"ca773e799558567ca37eeb918585e918857fbc53","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"ioredis-mock":"^8.13.1"},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.4.3_1789501282185_0.17965599354533857","host":"s3://npm-registry-packages-npm-production"}},"2.4.4":{"name":"bro-framework","version":"2.4.4","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.4.4","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"a8e6741464652942985113ba6cd1073bd0772bce","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.4.4.tgz","fileCount":15,"integrity":"sha512-5sfmiudb5YO0NBp8trMUa2F7QKEzu/ZIOm6cJLEFh8AcQPzMie9lfr+S89JeSG8F7N49sJLG2mHqTAxIMi7i5Q==","signatures":[{"sig":"MEUCIEIJxsx0VKTD32NBFMlM6HGUikPaRm1HXxm2LAv/BTGqAiEAmC3fUrrpWilHbV0mkh+cRr0su4SQ45gV+nT+lcHHY1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83873},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js","require":"./src/index.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","default":"./src/next.js","require":"./src/next.js"}},"gitHead":"5644774776e12a24977623c5641716309fd1f564","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"ioredis-mock":"^8.13.1"},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.4.4_1789584677176_0.6303077972306352","host":"s3://npm-registry-packages-npm-production"}},"2.4.5":{"name":"bro-framework","version":"2.4.5","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@2.4.5","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"7fa0d262d924fe90da597f0d92b8a1005bca1b69","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-2.4.5.tgz","fileCount":15,"integrity":"sha512-+i7xTHENvsfPiRPDtcaspvcWayIbQ41nMuj+HHqz2BMO1Vzz94Fo+AJXAOxo5WpUMVGlHjY5VedHgTquti4o3A==","signatures":[{"sig":"MEUCIQCDkP/mPzdlUQwavU6LcA+P2BAxWdwUzZG9X4EIMHT3hwIgZgUugqfqSJ3Ur0MfbsImYJuCOXRv1ROtYDMvx4WV8cE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85367},"main":"src/index.js","type":"module","types":"src/index.d.ts","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js","default":"./src/index.js","require":"./src/index.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","default":"./src/next.js","require":"./src/next.js"}},"gitHead":"5644774776e12a24977623c5641716309fd1f564","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"ioredis-mock":"^8.13.1"},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_2.4.5_1789585639741_0.012960071553221209","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"bro-framework","version":"3.0.0","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@3.0.0","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"0709f33d0f6d7e1200470974c1e51e4143879af6","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.0.tgz","fileCount":26,"integrity":"sha512-M3TgFtKlp6dYVWwLJ/fFH9QMvRs4MeeHDrNDdCeyYYNR/Vf80lfciLR8ErX/ZrFLVpHGgA9K4j6EfKkWOpdijw==","signatures":[{"sig":"MEUCIQDiX1d21sQjNgMQovOYJ/a5aEAlx0uRigxQBJ3TOrJN/QIgIq4r5FzMlKXHosbSy0eByK70WIT6ulSRZ066mDhGqlo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIATxjjRjsm/EtewgZqSeIMQpsgSj8zxKWsozK2U6hJ3LAiAb8B0hs4IILyI2+98Rnrqwl3v0pUsJbqOKWxurZonZkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":137541},"main":"src/index.js","type":"module","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"0ec0fe583ff75c00a346cba9fdb66937670ddec2","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_3.0.0_1789942001893_0.24893886168556523","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"bro-framework","version":"3.0.1","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@3.0.1","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"ecc7c5b2695a00327ae7b9c44d34def7381aa2ba","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.1.tgz","fileCount":26,"integrity":"sha512-vp36BSKnPx/Qmdn6KAY8Sg0389IZXJnHEV5/ug8Ut2yu+HSDaVcmuvcyhBSNWsoJzASEIiuSdCqawomoSBit8A==","signatures":[{"sig":"MEUCIQCWS2TCYtoc7DxI+qQQjcvHS4fGUPaeJwRCJqep+KtlYAIgHtJglchlzqqWbHUfzTV0CZ99AJaZJxoxjvSuQI/LHFo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHmNoFCsldpRL7jm9608NHxjXn0VzkuvlaQgPRHFEHXaAiEA4suRt52s4DoY7nNbjC4QdFcxAPwFNcziAP8dgDLDjBM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142396},"main":"src/index.js","type":"module","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"bb5d5869c3e51985175ce248e2aaba7fc610f820","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_3.0.1_1789944583810_0.34148243489075436","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"bro-framework","version":"3.0.2","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@3.0.2","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"7b26a84673e97f42cd442195189672c8092ae77f","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.2.tgz","fileCount":28,"integrity":"sha512-9Cd50jABATLk58KEgnRye17nME6Qyw+WzYRL0sfBSGUJqLoDjw4uDKbPdIzNXDuvx5CfQEIkqF9+1aGZsUV6YQ==","signatures":[{"sig":"MEUCIGo2gptkduJEsvre1vRj/LYlNSLfT3e/VVVivrdlarSEAiEAmPEK4pJoVwM9eeG/m1groBy1kctpNrx74XDFP2U6Cvg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCUpDKr5SlbPjtW096EfG/4d8csD2LT8gOXgobgZsYqYwIhANwbyc3qCSJKpQPcHdz9t/WbCuKWRM4lWJnkkHQ774nY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155549},"main":"src/index.js","type":"module","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"962ce5ecee051759cb2c5b6af64eb4e5696e86f9","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_3.0.2_1789946935718_0.9268067218948619","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"bro-framework","version":"3.0.3","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@3.0.3","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"96066e883b97ecc9388c589ef41a29d515f78537","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.3.tgz","fileCount":28,"integrity":"sha512-zN3gN/I0x0YO3svF2QQLbx240iGcUArmGEgQcCAryBJCKBsGaBbqdSScH0Uj27z8j+ZWANGmqBCh4KTP+tc2zw==","signatures":[{"sig":"MEQCIDHJWAa2WW4uC+0bHgDt7r70xkAsivRfp9Lra4mN+uhhAiBH3qGxzTVXH4WLpn8yJTmOVp9JnwAAkL5XQlCFtlg9jg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDBysP5macYDmv/rV3tPmS8BcZXDdG0oZDUyTcSnGvXgAIgAPBH0DlGMotWpXxvRexJ5SwED3jI6HM1vk5sNJUnwhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155779},"main":"src/index.js","type":"module","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"62409e481333a7c15618f2a8c4666668267f5226","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_3.0.3_1789947533615_0.2321643062556462","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"bro-framework","version":"3.0.4","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@3.0.4","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"2d54f33c2e7cb18eebb1f5c7ca96d849d1017f3d","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.4.tgz","fileCount":28,"integrity":"sha512-aiaENdVlHBzswaWUwf6u0tTdGA3tu6mqkfz/P2xUPJfy6DSZrHA1UPTgdE1KHXJlg6KXLZigE4UMpMLpawIAxQ==","signatures":[{"sig":"MEYCIQDZN9+IB4zlcV2UIMbGCdyc13krQdSYrZGulN6VqGnxrgIhALNH5zHZt8f/oiJr824We9F7ix4QzSvZUkQvOSCYkV1O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHTZxsxHLFXIvVQ7Dw6/gE/KH9NlTRP0JMevRS8dlLbxAiEA74c7k+tvdUvF/jH16/tVajlP1ALs1TLFxfxdtikVIfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156174},"main":"src/index.js","type":"module","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"a2cf2b30fd7c2d4db24a72ce40b0eeda795c6a65","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_3.0.4_1789948726883_0.5867421098879453","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"bro-framework","version":"3.0.5","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"author":{"name":"Yessindevs"},"license":"MIT","_id":"bro-framework@3.0.5","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"homepage":"https://brojs.yessindevs.me","bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"bin":{"bro":"bin/bro.js"},"dist":{"shasum":"b82d3e104be66512bea7d0c40e539136b81306ac","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.5.tgz","fileCount":28,"integrity":"sha512-Zf7JxMQ/E2ujC50RQOhsuoIOcFH5pV3lz7ALVn9rJcvdrxQD1qlvMewyueIoytpx2eKtR2rvryugBIoG9h2HEw==","signatures":[{"sig":"MEQCICcwmJ+np3SCCOjy42sqlRBx0cX9I8ofORxL3o96chtaAiBYJnI6Q/iv3+5LYkh4sIgI3lq8DJAuckGkw7m2EkC2fQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBj2n7MHREq1VBM0RbDwAsqtDIgokNLvYVStrXxEbOV+AiAUreW50OPaQyHVad2VgdDiDJABkCj62UkHuE+scoVUwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156256},"main":"src/index.js","type":"module","types":"src/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"fb4e4c65a3ac353c1e4842f943627c2345665982","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/bro-framework_3.0.5_1789950079928_0.43600963245426905","host":"s3://npm-registry-packages-npm-production"}},"3.0.6":{"_id":"bro-framework@3.0.6","bin":{"bro":"bin/bro.js"},"bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"dist":{"shasum":"17a712e6be76dda0c12d3409ac83c79e70dfbed4","tarball":"https://registry.npmjs.org/bro-framework/-/bro-framework-3.0.6.tgz","fileCount":28,"integrity":"sha512-MhutPS3vNTpREx61vE7RG0bdnq9ZtPnZGMvO4k6SSFFeZ0vz2B/6EbrXXgsVGW8cqpVZpvv9prlq+CA+TvVkEQ==","signatures":[{"sig":"MEQCIAOkPKODUa0thhuSfFSl5nDl7g8QOqq3PhEjr8y4Em8uAiApC0Y5PzP2cZNrVEv8Zbyr4Nh92n4OZCj9q+t7aHWuGw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDHSzhOpGX5aPetHgwMbJrHqi3wNbGt3i+Y8+IlNTQ+mAIgQBPeFoqwESzmZ5gAcifwLTS9v8HURBCLUw8/W1MXMnM="}],"unpackedSize":156238},"main":"src/index.js","name":"bro-framework","type":"module","types":"src/index.d.ts","author":{"name":"Yessindevs"},"engines":{"node":">=18.0.0"},"exports":{".":{"edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"node":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"default":{"types":"./src/index.d.ts","import":"./src/index.js","require":"./src/index.js"},"workerd":{"types":"./src/next.d.ts","import":"./src/edge.js"}},"./edge":{"types":"./src/next.d.ts","import":"./src/edge.js"},"./next":{"types":"./src/next.d.ts","import":"./src/next.js","require":"./src/next.js"},"./engine":{"import":"./src/engine.js"},"./package.json":"./package.json"},"gitHead":"13c55a64bdb2a97f587ebf6dd2d90d074bc129f7","license":"MIT","version":"3.0.6","_npmUser":{"name":"medyassine","email":"medy4ss1ne@gmail.com"},"homepage":"https://brojs.yessindevs.me","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"_npmVersion":"9.5.0","description":"The No-BS Backend Framework for Node.js","directories":{},"maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"_nodeVersion":"22.21.0","dependencies":{"tsx":"^4.23.13","zod":"^3.23.8","cors":"^2.8.6","redis":"^6.2.1","dotenv":"^16.4.5","helmet":"^8.3.0","multer":"^2.3.0","express":"^4.21.1","chokidar":"^5.0.0","node-cron":"^4.6.0","socket.io":"^4.8.3","jsonwebtoken":"^9.0.2","express-rate-limit":"^8.7.0","zod-to-json-schema":"^3.25.2","@socket.io/redis-adapter":"^8.3.0","@scalar/express-api-reference":"^0.10.18"},"_hasShrinkwrap":false,"devDependencies":{"next":"^16.3.5","typescript":"^7.0.2","@types/node":"^26.6.2","ioredis-mock":"^8.13.1"},"peerDependencies":{"next":">=13.0.0"},"peerDependenciesMeta":{"next":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bro-framework_3.0.6_1789975406769_0.35329722729216484"}}},"time":{"created":"2026-09-08T22:56:56.296Z","modified":"2026-09-21T07:23:27.035Z","1.2.3":"2026-09-08T22:56:56.613Z","1.2.4":"2026-09-08T23:08:32.718Z","1.2.5":"2026-09-08T23:14:04.635Z","1.2.6":"2026-09-08T23:15:28.638Z","1.2.7":"2026-09-08T23:19:19.051Z","1.2.8":"2026-09-09T18:10:32.294Z","2.0.0":"2026-09-09T21:02:46.984Z","2.0.1":"2026-09-09T21:29:13.961Z","2.1.0":"2026-09-11T16:51:12.795Z","2.2.0":"2026-09-11T17:21:45.024Z","2.2.1":"2026-09-12T00:13:25.996Z","2.2.2":"2026-09-12T01:30:37.270Z","2.3.0":"2026-09-12T12:29:59.386Z","2.3.1":"2026-09-12T21:49:58.917Z","2.4.0":"2026-09-14T21:14:48.613Z","2.4.1":"2026-09-14T21:39:13.028Z","2.4.2":"2026-09-14T21:57:13.069Z","2.4.3":"2026-09-15T19:41:22.322Z","2.4.4":"2026-09-16T18:51:17.311Z","2.4.5":"2026-09-16T19:07:19.915Z","3.0.0":"2026-09-20T22:06:41.995Z","3.0.1":"2026-09-20T22:49:43.898Z","3.0.2":"2026-09-20T23:28:55.810Z","3.0.3":"2026-09-20T23:38:53.707Z","3.0.4":"2026-09-20T23:58:46.969Z","3.0.5":"2026-09-21T00:21:20.018Z","3.0.6":"2026-09-21T07:23:26.882Z"},"bugs":{"url":"https://github.com/medyass1ne/bro.js/issues"},"author":{"name":"Yessindevs"},"license":"MIT","homepage":"https://brojs.yessindevs.me","keywords":["bro","brojs","bro.js","bro-framework","framework","backend","api","server","node","nodejs","express","rest","zero-config","zero-boilerplate","file-based-routing","auto-routing","zod","validation","jwt","authentication","auth","websocket","websockets","socket.io","realtime","openapi","swagger","scalar","docs","auto-docs","sdk","sdk-generator","rpc","trpc-alternative","express-alternative","cron","scheduler","background-tasks","file-upload","rate-limit","esm","ai-friendly","developer-experience","dx"],"repository":{"url":"git+https://github.com/medyass1ne/bro.js.git","type":"git"},"description":"The No-BS Backend Framework for Node.js","maintainers":[{"name":"medyassine","email":"medy4ss1ne@gmail.com"}],"readme":"<p align=\"center\">\r\n  <img src=\"https://brojs.yessindevs.me/bro.js.png\" alt=\"bro.js Logo\" width=\"256\" height=\"256\">\r\n  <h1 align=\"center\">bro.js</h1>\r\n  <p align=\"center\">\r\n    <strong>The zero-boilerplate Node.js framework that actually has your back.</strong>\r\n  </p>\r\n  <p align=\"center\">\r\n    <a href=\"https://www.npmjs.com/package/bro-framework\"><img src=\"https://img.shields.io/npm/v/bro-framework.svg?style=flat-square&color=e11d48\" alt=\"npm version\"></a>\r\n    <img src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square\" alt=\"License: MIT\">\r\n    <img src=\"https://img.shields.io/badge/Node.js-%3E%3D%2018-green.svg?style=flat-square\" alt=\"Node.js: >= 18\">\r\n    <img src=\"https://img.shields.io/badge/Architecture-Pure%20ESM-orange.svg?style=flat-square\" alt=\"Architecture: Pure ESM\">\r\n    <img src=\"https://img.shields.io/badge/Validation-Zod-3068b7.svg?style=flat-square\" alt=\"Validation: Zod\">\r\n    <img src=\"https://img.shields.io/badge/Realtime-Socket.io-black.svg?style=flat-square\" alt=\"Realtime: Socket.io\">\r\n    <img src=\"https://img.shields.io/badge/Engine-Express-eeeeee.svg?style=flat-square\" alt=\"Engine: Express\">\r\n  </p>\r\n  <p align=\"center\">\r\n    <a href=\"https://brojs.yessindevs.me\">Documentation Website</a>\r\n  </p>\r\n</p>\r\n\r\n---\r\n\r\n> Skip the boilerplate. bro.js gives you file-based routing, automatic Zod validation, JWT auth, and WebSockets right out of the box. Just write your business logic, return an object, and let the framework handle the rest.\r\n\r\n---\r\n\r\n## Table of Contents\r\n\r\n- [Getting Started](#getting-started)\r\n- [Configuration](#configuration)\r\n- [The Core Experience](#the-core-experience)\r\n- [Deep-Dive Features](#deep-dive-features)\r\n- [Route Reference](#route-reference)\r\n- [Context Reference](#context-reference)\r\n- [Architecture & Request Lifecycle](#architecture--request-lifecycle)\r\n- [Tech Stack Breakdown](#tech-stack-breakdown)\r\n- [CLI Reference](#cli-reference)\r\n- [Next.js App Router Integration](#nextjs-app-router-integration)\r\n- [Author & License](#author--license)\r\n\r\n---\r\n\r\n## Getting Started\r\n\r\nBootstrapping a new `bro.js` project is incredibly simple. We recommend using our official scaffolding tool to set everything up instantly (with your choice of JavaScript or TypeScript):\r\n\r\n```bash\r\nnpx create-bro-framework@latest my-api\r\ncd my-api\r\nnpm run dev\r\n```\r\n\r\nThat's it! Your zero-boilerplate backend is now running with hot-reloading enabled.\r\n\r\n## Configuration\r\n\r\nConfiguration lives in `bro.config.js`:\r\n\r\n```javascript\r\nimport { defineConfig } from 'bro-framework';\r\n\r\nexport default defineConfig({\r\n  server: { port: 5000, cors: true, helmet: true },\r\n  auth: {\r\n    jwtSecret: process.env.JWT_SECRET,\r\n    expiresIn: '7d',\r\n    apiKey: process.env.API_KEY\r\n  },\r\n  locale: { directory: './locale', defaultLocale: 'en' },\r\n  rateLimit: { windowMs: 15 * 60 * 1000, max: 100 },\r\n  docs: process.env.NODE_ENV !== 'production',\r\n  redisUrl: process.env.REDIS_URL,\r\n  db: async () => {\r\n    // Initialize database connection here\r\n  },\r\n  sockets: async (io, db) => {\r\n    // Setup Socket.IO event listeners here\r\n  },\r\n  onShutdown: async (db) => {\r\n    // Close application-owned database resources here.\r\n  }\r\n});\r\n```\r\n\r\n`cors: false` disables HTTP CORS middleware. Helmet is enabled by default and can be disabled with `helmet: false`. Redis is optional; when configured it powers distributed rate limiting, route caching, and Socket.IO scaling. In `NODE_ENV=test`, bro.js can inject `ioredis-mock`; install it in the consuming project's development dependencies.\r\n\r\n> **Production Security Note**: When deploying behind a reverse proxy (Nginx, AWS ALB, Vercel, Render), ensure your load balancer properly sets `X-Forwarded-For`. Rate limiting and trusted IP functionality relies on this proxy configuration.\r\n\r\n---\r\n\r\n## The Core Experience\r\n\r\nIn `bro.js`, everything you need is handed to you instantly. No setup, no middleware wrangling, no manual `req/res` handling. You define your route, set your validation, and return an object. \r\n\r\n`routes/posts/[id].post.js`:\r\n\r\n```javascript\r\nimport { defineRoute, z } from 'bro-framework';\r\n\r\nexport default defineRoute({\r\n  auth: true,\r\n  params: z.object({\r\n    id: z.string().uuid()\r\n  }),\r\n  body: z.object({\r\n    title: z.string().min(5),\r\n    content: z.string()\r\n  }),\r\n  query: z.object({\r\n    draft: z.coerce.boolean().default(false)\r\n  }),\r\n  response: z.object({\r\n    success: z.boolean(),\r\n    updated: z.number()\r\n  }),\r\n  handler: async ({ body, params, user, db, io }) => {\r\n    // 1. Data is already validated. user is already authenticated.\r\n    \r\n    // 2. Perform database operation using the injected Mongoose context\r\n    const post = await db.collection('posts').updateOne(\r\n      { _id: params.id },\r\n      { $set: { ...body, authorId: user.id } }\r\n    );\r\n    \r\n    // 3. Broadcast to all clients instantly using injected Socket.io\r\n    io.emit('post_updated', { postId: params.id, title: body.title });\r\n    \r\n    // 4. Return an object. bro.js handles the 200 JSON response.\r\n    return {\r\n      success: true,\r\n      updated: post.modifiedCount\r\n    };\r\n  }\r\n});\r\n```\r\n\r\nValidation schemas are flat and must be declared directly as `body`, `params`, and `query`. The deprecated nested `schema: { body, params, query }` form is rejected during route loading. The optional `response` schema documents the successful JSON response in OpenAPI; it does not runtime-validate handler output.\r\n\r\n---\r\n\r\n## Deep-Dive Features\r\n\r\n### File-Based Routing\r\nCreate a `.js` file in the `routes/` directory, and it automatically becomes an endpoint. We use Next.js-style bracket syntax for dynamic parameters. A file named `routes/users/[id].get.js` translates natively to a `GET /users/:id` Express route under the hood.\r\n\r\n### Bouncer-Grade Validation\r\nPowered by Zod. Attach a schema to `body`, `query`, or `params` directly in your route definition. If the client sends malformed data, `bro.js` automatically rejects the request with a structured `400 Bad Request` JSON payload *before* your handler ever executes. You never have to manually validate inputs again. You can also define a `response` schema to strongly type your OpenAPI documentation (strictly opt-in; arbitrary 200s work out of the box).\r\n\r\n### Zero-Config Auth (JWTs, RBAC, API Keys)\r\nAdd `auth: true` to your route config. `bro.js` will intercept the request, extract the `Authorization: Bearer <token>` header, verify the signature using your `jwtSecret`, and inject the decoded payload directly into `ctx.user`.\r\nYou can also use Role-Based Access Control by passing an array of roles (e.g. `auth: ['admin']`) or enforce service-to-service communication with `auth: 'api-key'`. API keys are read from `auth.apiKey` or `API_KEY` and support zero-downtime rotation with an array:\r\n\r\n```javascript\r\nauth: {\r\n  apiKey: ['current-key', 'next-key']\r\n}\r\n```\r\n\r\nClients send the selected key in the `x-api-key` header. API-key routes are represented as `apiKeyAuth` operations in OpenAPI.\r\n\r\n### Context Injection\r\nStop importing singleton database connections and socket instances into every file. Define your `db` and `sockets` setup once in `bro.config.js`. `bro.js` orchestrates the initialization and injects both instances directly into the `ctx` object for every request handler.\r\n\r\n### Redis Caching and Lifecycle\r\nSet `redisUrl` to enable distributed rate limiting, route caching, and Socket.IO pub/sub scaling. Add `cache: 60` to a route to cache its JSON response for 60 seconds. Cache keys include the request URL, resolved locale, and authorization/API-key identity; do not cache responses with dimensions that are not represented in the key.\r\n\r\nThe programmatic `createServer()` API returns `shutdown()`. It stops scheduled tasks, closes Socket.IO, closes Redis clients, runs the optional `onShutdown(db)` hook, and closes the HTTP server. The CLI calls it automatically on `SIGINT` and `SIGTERM`.\r\n\r\n### Zero-YAML Live Documentation\r\nIf you've ever hand-written OpenAPI YAML, you know the pain. `bro.js` parses your Zod schemas and automatically serves a stunning, interactive [Scalar](https://scalar.com/) API playground at `/docs`. It's highly secure: by default, these internal docs are disabled in production mode.\r\n\r\n### The Frontend SDK Generator\r\nTired of writing frontend `fetch` wrappers? Run `bro sdk`. The CLI parses your backend routes and compiles a JavaScript `bro-sdk.js` file. It includes token and locale headers, query serialization, URL-encoded dynamic parameters, and deep tree traversal (e.g., `api.users.id(\"123\").get()`). Configure it with `setBaseURL()`, `setTokenKey()`, and `setLocale()`.\r\n\r\n### Background Task Scheduler\r\nDon't spin up a separate worker server. Drop a JavaScript file anywhere in the `tasks/` folder, export a cron string (e.g., `\"0 0 * * *\"`), and an async handler. `bro.js` natively schedules it as a background worker with full access to your injected database and WebSocket contexts.\r\n\r\n### Zero-Boilerplate File Uploads\r\nAdd `upload: true` to a route. bro.js uses Multer to parse `multipart/form-data` and inject files into the context. Use `single`, `array`, or `fields` for explicit field handling:\r\n\r\n```javascript\r\nexport default defineRoute({\r\n  upload: {\r\n    single: 'avatar',\r\n    limits: { fileSize: 5 * 1024 * 1024 }\r\n  },\r\n  handler: ({ file }) => ({ name: file?.originalname })\r\n});\r\n```\r\n\r\n`ctx.file` is used by `single()`. `ctx.files` is an array for `array()` or a field-to-array object for `fields()`. Defaults include limits for file size, file count, fields, parts, and field size. Use `storage` for production disk/object-storage integration instead of retaining large buffers in memory.\r\n\r\n### File-Based Locale\r\nCreate a `locale/` folder with one translation file per locale, such as `locale/en.js` and `locale/fr.js`. Export a plain object from each file, then use `t()` in any route:\r\n\r\n```javascript\r\n// locale/fr.js\r\nexport default { welcome: 'Bienvenue, {name} !' };\r\n\r\n// routes/welcome.get.js\r\nexport default defineRoute({\r\n  handler: async ({ t }) => ({ message: t('welcome', { name: 'Sam' }) })\r\n});\r\n```\r\n\r\nThe locale is negotiated dynamically using RFC 9110 `Accept-Language` headers, supporting full region fallback and custom defaults, and the generated SDK can securely set it via `setLocale('fr')`.\r\n\r\n## Route Reference\r\n\r\n| Option | Type | Purpose |\r\n| :--- | :--- | :--- |\r\n| `auth` | `boolean \\| string[] \\| 'api-key'` | JWT, role, or API-key protection. |\r\n| `body` | Zod schema | Validates JSON request bodies. |\r\n| `params` | Zod schema | Validates URL parameters. |\r\n| `query` | Zod schema | Validates query-string values. |\r\n| `response` | Zod schema | Documents successful JSON output in OpenAPI. |\r\n| `cache` | number | Redis response-cache duration in seconds. |\r\n| `rateLimit` | `{ windowMs, max }` | Route-specific request limiting. |\r\n| `upload` | boolean or options | Enables Multer parsing and limits. |\r\n| `summary` | string | OpenAPI operation summary. |\r\n\r\nDynamic route files use bracket parameters such as `routes/users/[id].get.js`. Nested dynamic directories are supported. HTTP method suffixes are `get`, `post`, `put`, `delete`, `patch`, `options`, and `head`.\r\n\r\n## Context Reference\r\n\r\nHandlers receive:\r\n\r\n| Property | Description |\r\n| :--- | :--- |\r\n| `body` | Validated body data. |\r\n| `params` | Validated path parameters. |\r\n| `query` | Validated query data. |\r\n| `user` | Decoded JWT payload when JWT auth is used. |\r\n| `db` | Value returned by `config.db`. |\r\n| `io` | Socket.IO server instance. |\r\n| `redis` | Redis client when Redis is enabled or test mode is active. |\r\n| `file` | Single uploaded file from `upload.single()`. |\r\n| `files` | Array or field map from `array()`/`fields()`. |\r\n| `locale` | Resolved request locale. |\r\n| `t` | Translation function, `t(key, values)`. |\r\n| `jwt` | Configured JWT signing helper. |\r\n| `env` | Parsed environment data when configured, otherwise `process.env`. |\r\n\r\n## Testing\r\n\r\nFor Redis-backed integration tests without an external Redis server, install `ioredis-mock` in the consuming project and run with `NODE_ENV=test`. bro.js injects a mock Redis client and exercises cache, rate-limit, Socket.IO adapter, and shutdown paths.\r\n\r\n### Supertest + Vitest Recipe\r\n\r\nYou can programmatically bootstrap `bro.js` using `createServer` for blazing fast integration tests. Here's a complete `vitest` recipe:\r\n\r\n```javascript\r\nimport { describe, it, expect, beforeAll, afterAll } from 'vitest';\r\nimport request from 'supertest';\r\nimport path from 'path';\r\nimport { createServer } from 'bro-framework';\r\nimport config from '../bro.config.js';\r\n\r\ndescribe('API Tests', () => {\r\n  let app, shutdown;\r\n\r\n  beforeAll(async () => {\r\n    // 1. Initialize the server programmatically\r\n    const instance = await createServer(config, path.resolve('./routes'), null);\r\n    app = instance.app;\r\n    shutdown = instance.shutdown;\r\n  });\r\n\r\n  afterAll(async () => {\r\n    // 2. Cleanly teardown tasks, redis, and sockets\r\n    if (shutdown) await shutdown();\r\n  });\r\n\r\n  it('should return a 200 from the healthcheck', async () => {\r\n    const res = await request(app).get('/health/live');\r\n    expect(res.status).toBe(200);\r\n    expect(res.body.status).toBe('ok');\r\n  });\r\n});\r\n```\r\n\r\n---\r\n\r\n## Architecture & Request Lifecycle\r\n\r\n```text\r\n       [ Incoming HTTP Request ]\r\n                  │\r\n                  ▼\r\n         ( Express Engine )\r\n                  │\r\n                  ▼\r\n     [ CORS / JSON Pre-flight ]\r\n                  │\r\n                  ▼\r\n          ( Dev Logger )\r\n                  │\r\n                  ▼\r\n      [ Auth Guard (JWT Check) ] ──(Fail)──> 401 Unauthorized\r\n                  │\r\n                  ▼\r\n     [ Zod Bouncer Validation ] ───(Fail)──> 400 Bad Request\r\n                  │\r\n                  ▼\r\n         ( Route Handler )\r\n      ╭─────────────────────╮\r\n      │ Injects:            │\r\n      │ - ctx.body / params │\r\n      │ - ctx.user          │\r\n      │ - ctx.db            │\r\n      │ - ctx.io            │\r\n      │ - ctx.files         │\r\n      ╰─────────────────────╯\r\n                  │\r\n                  ▼\r\n      [ Auto JSON Formatter ] ─────(Fail)──> 500 Internal Error\r\n                  │\r\n                  ▼\r\n      [ Client JSON Response ]\r\n```\r\n\r\n---\r\n\r\n## Tech Stack Breakdown\r\n\r\n| Layer | Technology | Purpose |\r\n| :--- | :--- | :--- |\r\n| **Engine** | Node.js (Express) | High-performance, battle-tested HTTP abstraction layer. |\r\n| **Validation** | Zod | Bouncer-grade, strictly typed schema validation for payloads. |\r\n| **Authentication** | jsonwebtoken | Stateless, scalable security for protecting endpoints. |\r\n| **Realtime** | Socket.io | Bi-directional, event-driven WebSocket communication. |\r\n| **API Reference** | Scalar | Auto-generated, interactive Swagger/OpenAPI documentation. |\r\n| **Task Scheduler** | node-cron | Reliable internal background task orchestration. |\r\n| **File Parsing** | multer | Zero-boilerplate `multipart/form-data` file extraction. |\r\n| **Caching & Scaling** | Redis | Optional zero-config route caching, distributed rate-limiting, and WebSocket scaling. |\r\n| **Security** | Helmet | Auto-configured industry-standard HTTP security headers. |\r\n\r\n---\r\n\r\n## CLI Reference\r\n\r\n| Command | Description |\r\n| :--- | :--- |\r\n| `bro dev` | Development server featuring instant boot, visual CLI banner, and `chokidar`-powered hot module remapping. |\r\n| `bro start` &nbsp; | Production runner locked down for security. Features Graceful Shutdown APIs (with `onShutdown` DB teardown), suppressed internal logs, and isolated API docs. |\r\n| `bro init` | Automated workspace scaffolder. Generates configuration files and forcefully ensures your `package.json` respects `\"type\": \"module\"`. |\r\n| `bro sdk` | Route parser and browser client compiler. Generates your typed `bro-sdk.js` frontend SDK in one hit. |\r\n\r\n## Next.js App Router Integration\r\n\r\nYou can natively use `bro.js` syntax, Zod validation, and Authentication inside your Next.js API routes (`app/api/.../route.ts`)!\r\n\r\nFirst, create your factory instance (e.g., `lib/bro.ts`):\r\n```typescript\r\nimport { createBro } from 'bro-framework/next';\r\n\r\nexport const { defineRoute, z } = createBro({\r\n  auth: { apiKey: process.env.API_KEY }\r\n});\r\n```\r\n\r\nThen use it seamlessly in your route files:\r\n```typescript\r\nimport { defineRoute, z } from '@/lib/bro';\r\n\r\nexport const POST = defineRoute({\r\n  body: z.object({ name: z.string() }),\r\n  handler: async ({ body }) => {\r\n    return { success: true, hello: body.name };\r\n  }\r\n});\r\n```\r\n\r\n> **Capabilities & Limitations**: Because Next.js API routes are \"Serverless\" (meaning they sleep when not actively processing a request), features that require a constantly running server such as **WebSockets**, **Background Tasks (Cron)**, **Rate Limiting**, and **Auto-generated Docs** are strictly limited to the standalone `bro.js` framework and are not available in the Next.js adapter.\r\n\r\n---\r\n\r\n## Compatibility Table\r\n\r\n| bro.js Version | Node.js   | Next.js App Router | Express | Zod     |\r\n| :------------- | :-------- | :----------------- | :------ | :------ |\r\n| `>= 2.0.0`     | `>= 18.x` | `>= 13.4.x`        | `4.x`   | `3.x`   |\r\n\r\n---\r\n\r\n## Author & License\r\n\r\n- **Author**: Yass1n (@medyass1ne)\r\n- **License**: MIT\r\n","readmeFilename":"README.md"}