{"_id":"@mauroandre/velojs","_rev":"58-bd26f00b059b3797d9b87d7ce0390d05","name":"@mauroandre/velojs","dist-tags":{"latest":"0.0.58"},"versions":{"0.0.1":{"name":"@mauroandre/velojs","version":"0.0.1","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.1","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"fe4c27bf30bfcafd51c569000f40ea3e8f448622","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.1.tgz","fileCount":16,"integrity":"sha512-91UC93dK/xZLIbGaXg/Bo8jTC44uKR5IwBWdo1Oo33hemxN9OQyrlDnZU0bnzpnSpDPQ2swbFPsrcxqvJYvzpA==","signatures":[{"sig":"MEYCIQCknyCNwAGfdiKYMlrCUxW7T1I14UCj7E1/YMQbm6YijwIhAIDEeaTk94urDfAlvw8sZVpGv7D15dMKokdNSEsKefG7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101495},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"},"./vite":{"types":"./src/vite.ts","import":"./src/vite.ts"},"./hooks":{"types":"./src/hooks.tsx","import":"./src/hooks.tsx"},"./client":{"types":"./src/client.tsx","import":"./src/client.tsx"},"./config":{"types":"./src/config.ts","import":"./src/config.ts"},"./cookie":{"types":"./src/cookie.ts","import":"./src/cookie.ts"},"./server":{"types":"./src/server.tsx","import":"./src/server.tsx"},"./factory":{"types":"./src/factory.ts","import":"./src/factory.ts"}},"gitHead":"2a7b78bd35d8802c4972f86a44bc06cac102c9a4","scripts":{"test":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"11.6.2","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"24.13.0","dependencies":{"tsx":"^4.19.0","hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"typesVersions":{"*":{"vite":["./src/vite.ts"],"hooks":["./src/hooks.tsx"],"client":["./src/client.tsx"],"config":["./src/config.ts"],"cookie":["./src/cookie.ts"],"server":["./src/server.tsx"],"factory":["./src/factory.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.1_1775390550579_0.9139247510356703","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@mauroandre/velojs","version":"0.0.2","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.2","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"a9b369142981f2de1eb8907bfa3b379332645410","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.2.tgz","fileCount":16,"integrity":"sha512-imPUxTcp+lWxiPBSNc39jzo2eR8NreL+Xpd+Vwd8vi7KfHa8AbD3f1dg24PsJsmNufkuGUR+MJorzBMVHYHUqA==","signatures":[{"sig":"MEUCIBA4XbXi1OzxfOsh5pYTGaZ/PVrtS7qsxENgz3UK+jYrAiEA4lwe4yBAvvlBbhQq9Ce0hvOBczjnr62VaUN+K4DOiXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101493},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"},"./vite":{"types":"./src/vite.ts","import":"./src/vite.ts"},"./hooks":{"types":"./src/hooks.tsx","import":"./src/hooks.tsx"},"./client":{"types":"./src/client.tsx","import":"./src/client.tsx"},"./config":{"types":"./src/config.ts","import":"./src/config.ts"},"./cookie":{"types":"./src/cookie.ts","import":"./src/cookie.ts"},"./server":{"types":"./src/server.tsx","import":"./src/server.tsx"},"./factory":{"types":"./src/factory.ts","import":"./src/factory.ts"}},"gitHead":"2a7b78bd35d8802c4972f86a44bc06cac102c9a4","scripts":{"test":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"11.6.2","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"24.13.0","dependencies":{"tsx":"^4.19.0","hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"typesVersions":{"*":{"vite":["./src/vite.ts"],"hooks":["./src/hooks.tsx"],"client":["./src/client.tsx"],"config":["./src/config.ts"],"cookie":["./src/cookie.ts"],"server":["./src/server.tsx"],"factory":["./src/factory.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.2_1775390637973_0.12017032554459894","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@mauroandre/velojs","version":"0.0.3","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.3","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"67c61bcb084915df1f491647c891d732563b7da2","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.3.tgz","fileCount":16,"integrity":"sha512-IxlZ8PHitVed1HqztZNwCcTgys6qBL/uICO2lq6DCbRxs7sGirBnzFf8ptFwVtPMn6f+N3xonmIPsEeZgjVqtA==","signatures":[{"sig":"MEYCIQDZ6izthIuXkzfGKHROrwf1wE0wbgA2G5EScXQbXHWwDAIhANPGs694Z85/9sIY2B6PAaFF5XMmc04NjjSkRudKrwp8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101628},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"},"./vite":{"types":"./src/vite.ts","import":"./src/vite.ts"},"./hooks":{"types":"./src/hooks.tsx","import":"./src/hooks.tsx"},"./client":{"types":"./src/client.tsx","import":"./src/client.tsx"},"./config":{"types":"./src/config.ts","import":"./src/config.ts"},"./cookie":{"types":"./src/cookie.ts","import":"./src/cookie.ts"},"./server":{"types":"./src/server.tsx","import":"./src/server.tsx"},"./factory":{"types":"./src/factory.ts","import":"./src/factory.ts"}},"gitHead":"2a7b78bd35d8802c4972f86a44bc06cac102c9a4","scripts":{"test":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"11.6.2","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"24.13.0","dependencies":{"tsx":"^4.19.0","hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"typesVersions":{"*":{"vite":["./src/vite.ts"],"hooks":["./src/hooks.tsx"],"client":["./src/client.tsx"],"config":["./src/config.ts"],"cookie":["./src/cookie.ts"],"server":["./src/server.tsx"],"factory":["./src/factory.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.3_1775391721656_0.1828259983929197","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@mauroandre/velojs","version":"0.0.4","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.4","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"3bb323be2cd394b25d1e1f1dd1809e9ac0a77396","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.4.tgz","fileCount":16,"integrity":"sha512-+6xidUCkJja2LgXJDfXpmRNaE7BncklQ5iyLAKMS7b5svUMlzGTIMT3ZcnlC22rdYOL1PCL4rqQe3n36g98p9w==","signatures":[{"sig":"MEUCIC1wAaORcoSbMFJPBpkCjqDF2CoiALpDfOOpMe8KRU7eAiEAiMFIbUMsJcGC9/mFdzzathbY7vFxf8gfXEL2qTjVuoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101948},"main":"./src/index.ts","type":"module","types":"./src/index.ts","exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"},"./vite":{"types":"./src/vite.ts","import":"./src/vite.ts"},"./hooks":{"types":"./src/hooks.tsx","import":"./src/hooks.tsx"},"./client":{"types":"./src/client.tsx","import":"./src/client.tsx"},"./config":{"types":"./src/config.ts","import":"./src/config.ts"},"./cookie":{"types":"./src/cookie.ts","import":"./src/cookie.ts"},"./server":{"types":"./src/server.tsx","import":"./src/server.tsx"},"./factory":{"types":"./src/factory.ts","import":"./src/factory.ts"}},"gitHead":"7681cd9ad6bcda78ecc60e9735c29a98c3b3e2a3","scripts":{"test":"vitest run","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"tsx":"^4.19.0","hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"typesVersions":{"*":{"vite":["./src/vite.ts"],"hooks":["./src/hooks.tsx"],"client":["./src/client.tsx"],"config":["./src/config.ts"],"cookie":["./src/cookie.ts"],"server":["./src/server.tsx"],"factory":["./src/factory.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.4_1775392375206_0.617243422847426","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@mauroandre/velojs","version":"0.0.5","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.5","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"cd031c8f6b88cb15416783f694912d769f3b2d9c","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.5.tgz","fileCount":28,"integrity":"sha512-CvuNDBdyNYg33vfl666DKSIGr3ZIWAKtCdvUI8xscqo+jVuKnoC7sh20TrU5UFNuR8xUFI3MVWsuoHxDfRx1tg==","signatures":[{"sig":"MEYCIQDrorgNJJgRckkWKzyg+URMMvkgepZVDpCNRBemNfoVQQIhAIuKIAmnnHXvSosAiABrHso8OcCKjhlP9L5ctV7iGLiX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72216},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"c04cb390026f08b13ab865ee0ae63217b52eaa53","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.5_1775395794551_0.4692359894594822","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@mauroandre/velojs","version":"0.0.6","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.6","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"5f2a25798925b81bbebbfcde43d92ac79a7dfd87","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.6.tgz","fileCount":28,"integrity":"sha512-LYd3soCxvOYUsHVJErt0aW4xyp3jtKu4pFcLfVx6/fTjDNpqrSvUv6G27QL7F6WLCRVfaUOUSeBVEnVDgoKevQ==","signatures":[{"sig":"MEQCIEq2YP1EYxo09aAHWYx2Y6PUgDcvWBSi94/WNn+dcyBEAiAVPNvdc7PEiVchSP2pSXkj29noOdgkr6A636/ZpFri3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72475},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"516e168d5ec0c0cbc7e76bcf8b5fa3e65d5e3d9f","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.6_1775396844139_0.595196223601457","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@mauroandre/velojs","version":"0.0.7","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.7","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"edc400cac49a295a4b9e25af0db5286a42db7113","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.7.tgz","fileCount":28,"integrity":"sha512-YX18pZVKX28NlLe4rlkznOTakq1jl5P39IdaFPKGVmcjEx1qwPm0byhdK4uveUfW0CdDxCOqdEBAZQ1MDdH5qQ==","signatures":[{"sig":"MEQCIEFp9/wICg/Th5QpUeB6Jl87rNSal/y/F0U/+fCq+Jv3AiAOJOr3GLdUf65SceT4aFO+mWKt98OgBhqsaIRkJ+IUPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72404},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"0d2f2e133dab465c5289808fcac6510adaa54463","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.7_1775400817882_0.38694048320475294","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@mauroandre/velojs","version":"0.0.8","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.8","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"ea3ee044bb097466b6e72d496dfa281b1f7ad15e","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.8.tgz","fileCount":30,"integrity":"sha512-jaxzwkIabEZ/uMpPCSCsvkUfStL7Htu+h89mB0na38jr3HLHhjQyat91iUz4KbvCas2S8zokHD3SYyXhMLYgOg==","signatures":[{"sig":"MEQCIEUgAB3nnHo+v2ufx8ivbBmJrBoSVsYEo5OKutCukGOHAiBt9DpaPn5XG/iccK8D67UyhxnZ/qg9NqDKXKd6cSzHqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75681},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"29a556a99ccb538f1e173ecdb96d31b4c268a1fa","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.8_1775841603976_0.01294259557624411","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@mauroandre/velojs","version":"0.0.9","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.9","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"544468e3083905787666a667742ef0aa4fd07c26","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.9.tgz","fileCount":30,"integrity":"sha512-GwDgVECW7Gi5lWBB3PAeVfLlWzrDsGJTdC9WAgut8yR2pQAbquR1FRGpJWgudyF5xXK8mq4ISk5HmdIaUrkypg==","signatures":[{"sig":"MEUCIQDQMBVM7PZ2AGnNuZPfe/C8TzduTDacoACpPpB67PACUgIgSCl6m5eSTGU76wx3v6xFLrfbFDlQpIHTEA94lX3SKhA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75789},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"758cd471000b88573c6438f026418adc321a4825","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.9_1775849196386_0.011015078186182636","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@mauroandre/velojs","version":"0.0.10","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.10","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"f1ae4f96255d768fe4ca79ec01af767503557c85","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.10.tgz","fileCount":30,"integrity":"sha512-j1QgPzmaPWHD2U5/H3z9KIDD+zFPFFzSfaDSzU+OOh9HWm+JQu8yHfo+YTFUYLq1nqMnI3kK3yfhsqjUAkD8+w==","signatures":[{"sig":"MEQCIBx0LlTwTtcjfYe577f6oGPLDQMiR7tsU3ba9qbGZ1x4AiBLSa/Pbalz23JuEjF+EYwEsl+lUz5nUFoOkSRt94FXbA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75944},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"799c0b11f6f8863601ea84b1bcc2cba61c0fd7db","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.10_1775850188234_0.20866833571899868","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"@mauroandre/velojs","version":"0.0.11","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.11","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"c68117bc9849eb8892a0bad5a444065df66f7271","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.11.tgz","fileCount":30,"integrity":"sha512-G3P1uOc1Nnw4EFqZByVsjBUi1Z+PxW1Cv5KgH3yQeEr6Yq7m6d/6yUh3U/jmK6hEJZuxOnoBiUybDC1TQb9lcg==","signatures":[{"sig":"MEQCICtJybM9ipArEDv7Z3FnK5VXQuKLN1eVpDtUaWkpYvKzAiA8jCmTq5LSFuT7FM88vgEEqoHh19FX8hAiPLnOICxXhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75980},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"0f57718b126f2f45685eb24f701bf957c57330a2","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.11_1775850700115_0.1208444517884315","host":"s3://npm-registry-packages-npm-production"}},"0.0.12":{"name":"@mauroandre/velojs","version":"0.0.12","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.12","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"3ace11cd458139300c80568c20e86f59233b8281","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.12.tgz","fileCount":30,"integrity":"sha512-8TR256c2e8MrI6KoiMg+8pZUAzcv58FIgtGAQmVPteJvF2CZ107FhXa4q0VjmP36MWirRsyOh/KmaWAqEPOINg==","signatures":[{"sig":"MEUCIQDrUe9yNL0eLj6ri3y3OzBuM85qgxjP/M/WcfiIuqSVCgIgJ98IXg554DdqkShVePZbkYZnCrlr8JESH9bCL1NURf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76020},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"e6ac5ab6bdfc9f35ffb79fc186e30c063844a93f","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.12_1775852809538_0.47706935725511723","host":"s3://npm-registry-packages-npm-production"}},"0.0.13":{"name":"@mauroandre/velojs","version":"0.0.13","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.13","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"823012175815adb132a83252e12eb65fad9d6d75","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.13.tgz","fileCount":30,"integrity":"sha512-GpB1T6UoaTlPiBXi7h7+x76UYWjV62Rxxja+VnxEn3XaIU5KlwDh8sTFPKhpToE2/1ijdtwvoh9yPN57rr0irg==","signatures":[{"sig":"MEUCIByEeE+FRSiNzX6cunCEYYFO36sBvSgzVh9FGmgxOdFUAiEArCQ9pPXqDoNYsG4s9uLf5U0kMqjQBsyMVZyBS8efmNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76362},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"859ae798693b98b34864512c6c90ab071fbdce80","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.13_1776108650997_0.3904090652274219","host":"s3://npm-registry-packages-npm-production"}},"0.0.14":{"name":"@mauroandre/velojs","version":"0.0.14","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.14","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"bf204c1290b2468e32c284b9adc3cf350314a492","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.14.tgz","fileCount":30,"integrity":"sha512-RySzjyzokdJO8ElkRB0gWjeSN/xPFrzdT9HSfec4w+uFYyOdoSE3B2pfgSABcHeQ1lYe2qviliz5594TIMP1bg==","signatures":[{"sig":"MEUCIQDkoCVE2lkx/XBQ5AJPadmb58I2GBX+9ed2QsMZJOTKQwIgIkNdlPIq9rbiXj5PZKWEk4Y3fNzqv8VTQgZyOGdDm1w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80816},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"bddd6ca1f387fdef8c2efaa793f082269175cb1d","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.14_1776290319871_0.9545893506263701","host":"s3://npm-registry-packages-npm-production"}},"0.0.15":{"name":"@mauroandre/velojs","version":"0.0.15","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.15","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"b645859eaf7f384436200a61561a9b9077825a29","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.15.tgz","fileCount":30,"integrity":"sha512-4QPC4vSJrtRbkS/SLbzm3HroRFL7UNinwS7ZBtmYL3++fwfsl9dWbdcrXva5kMgnmvykAqbiqWay/ZXKKBdkWg==","signatures":[{"sig":"MEQCIEeIcn99L+aq+ZxZ1vp1SND2YoObu7O+pYJLUkIrAHrNAiAF47JlObQFXyuFzZblgZQ3We1a5zxbmyXhDstUxDEEcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80941},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"481e2398e8ba8e4814a6ad1da18beacfeb87dd30","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.15_1776291273697_0.9087971526417344","host":"s3://npm-registry-packages-npm-production"}},"0.0.16":{"name":"@mauroandre/velojs","version":"0.0.16","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.16","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"6c923b41f00d09bd02d6fb80f97c872026f79b09","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.16.tgz","fileCount":30,"integrity":"sha512-vJFvoNVqUqQC0g/Nd65BYPIWtDu1EVsqZG3sFAZHsUPiHHPJCZgopDvDQ8KBtAlFTKTZmtYF3npXA2bhzNSnsQ==","signatures":[{"sig":"MEUCIQCTbrBguJxDZ5vnyLxIBE1ypOPntZggU6BiZl77I2FC7QIga+E1MzTNl+wB8/vzUgVhlvt/Pw+vHVchxM+9knqDkiY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81028},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"e97f9f2d7b9726b6bd684205d6ec3fafb3fcc4c0","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.16_1776293587226_0.7733818863977884","host":"s3://npm-registry-packages-npm-production"}},"0.0.17":{"name":"@mauroandre/velojs","version":"0.0.17","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.17","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"937a8c5d1d3d22db328cdd50e309cf4dfc2821a1","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.17.tgz","fileCount":30,"integrity":"sha512-svGNBTrEORSBg9PVdZdGa3MUaHyOod/m1ouY7DBySkGzNZKdqoRvFtT9//gxVZ65cAk/1KWV4qmSnwSwlL7AnA==","signatures":[{"sig":"MEUCICp54ilRx2LohZ0qG/sO5lpk5y67zlmeKSyZulstP8lgAiEA2maGeDCdg3xO7a7Xgtvi6Fd88HxuAEhcHZOufuGMt7w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81051},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"18368f910ce94853d9b798ce6719fc17151f0523","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.17_1776299536946_0.2886065749080653","host":"s3://npm-registry-packages-npm-production"}},"0.0.18":{"name":"@mauroandre/velojs","version":"0.0.18","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.18","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"b72a0ea0eda9acef02a5831bdfa125cf00387673","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.18.tgz","fileCount":30,"integrity":"sha512-4iltsllnSQ3OD1xHX2B/pMPQpZlSDmToGQiBu0Gwq5SmzAZC1B/ykcxXt/6us51UXPKmR2RtGd47tFz9ekTO+w==","signatures":[{"sig":"MEYCIQD8t0N3FkvL2Pzls6k+BRClybbi9a+yLeIbL2ppfJUZdQIhAOdSk8ap03yAyM9oeHFR+9pedGBAo9Inr03I/8YvbfsE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81219},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"d7d7e47c03c4b80ecf1024c7b1d84f5c28c91269","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.18_1776301202799_0.6607911029568676","host":"s3://npm-registry-packages-npm-production"}},"0.0.19":{"name":"@mauroandre/velojs","version":"0.0.19","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.19","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"81cd0be7ff2528464310d3e7da3c20dfaa61abee","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.19.tgz","fileCount":32,"integrity":"sha512-dWXJxgXWDERuydSKLH0MDvyVrLu1wavwhHkoT+Mbpm654xfJqFMFkmCC7PanPw33oRoq6vScY72tadJmRPq8hQ==","signatures":[{"sig":"MEUCIQCZOmkNlNdOqH6mdkw1xAffLC/4/taHRExO1g0Jq0EvLQIgDthsqv10M9CtMAuCoLr77R4y5k8sidzxdaw2N97oiFg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97393},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"052e1057141da5f687c995f2973afb6f08c02296","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.19_1776514956394_0.08766467707102255","host":"s3://npm-registry-packages-npm-production"}},"0.0.20":{"name":"@mauroandre/velojs","version":"0.0.20","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.20","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"9bf6bbec9fd23da752adfb6532543aeb9b03cbab","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.20.tgz","fileCount":32,"integrity":"sha512-otepOPQtCcJvvkcL4G+YcWO1oNc4YM54gkD+dfLC+TnIeXdRQRQhx/uCEeLbIVuq8CDS6TfOcgkeKSBFtd0aCQ==","signatures":[{"sig":"MEUCIQCd8cgoioUg3Qa3KtrPXYJIGPsekhZ9Lm/DHDBvXGM+1gIgFZGVxl0xLcYCSz+fZ2/lmAD3/1zY1nE355N/B/0a1dw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105522},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"47e312ecede451d9c60b63ac9702948fb8f1e6da","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.20_1776599993317_0.02364208970933679","host":"s3://npm-registry-packages-npm-production"}},"0.0.21":{"name":"@mauroandre/velojs","version":"0.0.21","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.21","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"629d2f3d081ddfe88fd9e13a4e760eee0c4378b0","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.21.tgz","fileCount":32,"integrity":"sha512-ftpqmN6Q1bPyLnXgNNnD0utYFtoM0gxEBp/ffnHwE2CqMKlTfM5Jro9RbVgskmHqCKGkyPSAhIhKuSVRc1gWTQ==","signatures":[{"sig":"MEYCIQCdd3c8E1qHhsDTNkrqwoJa1rfe05RyWxpRPeUzdbxBhwIhAPprhPzqlZMJkIr+cSKRMfXlqs65JLqObadjjS+iuRz/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106534},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"02f73655a761d6954a764de7ddd89b023d25c6ae","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.21_1776603335384_0.7066645767683881","host":"s3://npm-registry-packages-npm-production"}},"0.0.22":{"name":"@mauroandre/velojs","version":"0.0.22","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.22","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"a80b77334393456e37bdb97e42ca0e77af64e65e","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.22.tgz","fileCount":32,"integrity":"sha512-/zhNmu3yF9rt8SBt8cUIaBYdK6fh1+B2Ur+mm/mOmlLkIMjt4O/W5O+KQieGLo7EbJkFwbADv5NRt23zomryLA==","signatures":[{"sig":"MEYCIQDJvCVRlq+NPjju+I9w532DKj5jFwQVZ/qpgnjfF6WHRAIhAOLqoF2OXu/Ys1HrGvCjzzg8qFKcxLcjK9d7N+byNR7v","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112255},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"}},"gitHead":"00f29d33feaa59427fc4d82ea309a9d50640773b","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.22_1776743238765_0.3105495862004539","host":"s3://npm-registry-packages-npm-production"}},"0.0.23":{"name":"@mauroandre/velojs","version":"0.0.23","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.23","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"16e80efab08c1b7174f6a5854dcf3f5f8a769650","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.23.tgz","fileCount":42,"integrity":"sha512-yrV+f3Ns3b1gADxloQzwL2yyuO6sw7EhwqFkHEOYIfdS4rakl7HLZdAEx2y+RZPuriICQpUunXfrVPwC9FdX9A==","signatures":[{"sig":"MEQCIEn/QITT36JnisV9M2Tt3yLbw7tjPskuLkzkNJSYAFBkAiAgB2EQCDppem/1ZlIPduwLhRoBBkwBp5K0P5bjwLmOXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142600},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"d70344e070e7b2547f63345d067201c3da7b6e24","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.23_1776750277375_0.824151666407043","host":"s3://npm-registry-packages-npm-production"}},"0.0.24":{"name":"@mauroandre/velojs","version":"0.0.24","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.24","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"4d8269262e1852805e8f85b0d9087144b4e5a118","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.24.tgz","fileCount":42,"integrity":"sha512-Tzq1qcfA6BNcZIGassvdwzMkwgn9Pb5Fv1ysbDxBZ3sJiASpOYZbuRgDisOR1LalDvDqY8TaUauuB/Vz2dX01w==","signatures":[{"sig":"MEUCIQCfeB7DQ/G+rEqlgHU+LxUQcizfVA3vj/LKy3gJhkUNzQIgdBUiGbPsBHwvc2CATno4BLS0NkpbRj9bs0Uu9hibeqM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142556},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"d5b5bf8dc388cc561083e17ca62749733d8c0c39","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.24_1776751626784_0.5463728659523941","host":"s3://npm-registry-packages-npm-production"}},"0.0.25":{"name":"@mauroandre/velojs","version":"0.0.25","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.25","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"7474fdd0771e09da9378e0333d390380b15bfff2","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.25.tgz","fileCount":42,"integrity":"sha512-ZqA38soG/XMXhVvEeEDj+4EHrdy40kfGmdOVgRShBzSdacOPIeghdVPhXRHK0+P6qTCalS53y4EnStDFz6JKJA==","signatures":[{"sig":"MEQCICjDtuo3JYIHr7lJESNsgmB/xaPu5TXnHL+0DZV6ZznhAiAfsF0sQyjcm7ueZfPtsw72qzjrwmD/echaa1C63oZcvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142621},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"1e7c2a11a997c4ab293300fd50dbf17c496d9a5f","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.25_1776792397342_0.34170019570938215","host":"s3://npm-registry-packages-npm-production"}},"0.0.26":{"name":"@mauroandre/velojs","version":"0.0.26","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.26","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"c9a61ff0614e8b27809309dcb6c0b4f2a73ac311","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.26.tgz","fileCount":42,"integrity":"sha512-+yzqvi9z7kyzUtP0SgSWyK35Xt4sSRd5GmIC8hn7i/wjAfeGuxZDV6RNeJWbEtuOLPSAyVh4XRXQonwiCZymAw==","signatures":[{"sig":"MEUCIQCE4ugFC2uzqDbYBLVilozOTlRMISmXOYxZ3EbnQEkgsQIgDs1j3aHW2IQpH3MIrXDf1/2nJd0Mi0ainB1KBCe8z34=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149725},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"fb95c7f330383a6011ca1f21f6b0e5a1cd683263","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.26_1776959293586_0.49116298983581186","host":"s3://npm-registry-packages-npm-production"}},"0.0.27":{"name":"@mauroandre/velojs","version":"0.0.27","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.27","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"3bc4d11cc819b9bbc66a1b4f79af775ce5b815d0","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.27.tgz","fileCount":45,"integrity":"sha512-ElPcLvbvA+7Lr4x3KnuuhvddZTh2Ohg1q7dd5Coyv6Kk75H8jVs8BB4XcgZVc0kwlbL4bfN6NDAvNoKX8326Kg==","signatures":[{"sig":"MEUCIFHZIRTslgjN/+W2fCumNU1jYnt2/ZECsXU98TnXahRCAiEAvrmNyDxLE0YOZnG021WvWqTFPkJ7rY/EwkAOyab4zeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177922},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"0052258d02f8ac9189dc4cd8541f89bd719dfd5c","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.27_1776985450665_0.3771117733223375","host":"s3://npm-registry-packages-npm-production"}},"0.0.28":{"name":"@mauroandre/velojs","version":"0.0.28","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.28","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"0a0909d8922ec096d65f33a42dc9707172acf352","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.28.tgz","fileCount":45,"integrity":"sha512-VfkRXQg/+TH/7ZVrjXZ7pbPj9f4EGsfnUWliqruLxqB00b4fpGzp3Mi5i4i1nV/gqP7WY6nE7Vaz9QWATxPC4Q==","signatures":[{"sig":"MEUCIQC7i7sEFQXSAgZk0udA4a3BtXL9cmYKqBa4hFKwIX9RQAIgJr8b7LYk4dllSV4Moxpg6eAuv2swwceFi3o3Kz7kArE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179100},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"56474d0edea389e2d3bfa29db6210f49201d0ecd","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.7","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.28_1776994676119_0.2263027414239671","host":"s3://npm-registry-packages-npm-production"}},"0.0.29":{"name":"@mauroandre/velojs","version":"0.0.29","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.29","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"7ec45b593eb9d646cf9fb96ef282e3841720ef82","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.29.tgz","fileCount":45,"integrity":"sha512-b6XlgKWBUOIjVq5Mu8lbZLEExNFikWHpA8tQBf8zT8eMm8sO+B/fY/PBfOhYru0X0IYEtHtBWGYLTf05gTTM7A==","signatures":[{"sig":"MEQCIAPPisyjz1JTJa9YdYlqBvFUCi/OMaWaYB2ZYrhJ79DzAiB6BRlMrcuONsKq5qXyi+ktwVdofz3jO34awKdpbjXmbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179677},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"ac0752d373d0727ae6eb69b5125cb76b7796be0e","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.29_1780936978291_0.5133308541684503","host":"s3://npm-registry-packages-npm-production"}},"0.0.30":{"name":"@mauroandre/velojs","version":"0.0.30","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.30","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"5ac2e73573326cfb50793092b5a423297c6842ae","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.30.tgz","fileCount":45,"integrity":"sha512-crj9lxIWbmtXUbY2sjAy40824rdDCV2Ijh8P4i/9+u2kAvHDDkiWVJ2l1/3jgHefU1dKc9D+vz0AlrplOSpysA==","signatures":[{"sig":"MEQCIEGJOWWULfcav8zH+7BIt7u6ME/PHeeyfWq3okCF9LbpAiBt4Op5AWZD8AH/PO8jQ5Xbvm1mOMO74faFApX9aWw86g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179778},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"9468fa67a95ef938f343ddec1a43bb3fa7881862","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.30_1781748922611_0.6113988270572914","host":"s3://npm-registry-packages-npm-production"}},"0.0.31":{"name":"@mauroandre/velojs","version":"0.0.31","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.31","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"29d5255deceda492af80c7588fcc4c22cab2c188","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.31.tgz","fileCount":45,"integrity":"sha512-mahw+aNubvh/H/ZpttGvjDCx9j1PpHDaH2VWUIG0RGXDNfsfZy9cqagaZe3aZWRLazda/ERDP6KMCdVq52jcIw==","signatures":[{"sig":"MEYCIQC7T7wmzfhDSGd/Vo24jvT982F/Kbal8sIx6m4G1pzpxgIhAPWf3aX4C5kI4SYaEwhiAtyXn0w3+GO5IoeUfpYuXssi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181814},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"63c664d3d288a3155adef7ea0a4774ead17be5bc","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.31_1781755079713_0.2572854920883747","host":"s3://npm-registry-packages-npm-production"}},"0.0.32":{"name":"@mauroandre/velojs","version":"0.0.32","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.32","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"ca9a5b2f0aa920bceaaed949ef5d88cc7b9343e0","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.32.tgz","fileCount":45,"integrity":"sha512-FUKDlul6eRkM5/uLExUgblf+ODJvLiskFzpEqfHust1rcegatbhPGyqrogDmmKtdk8brhr0tzFfXkqIjIFzc0Q==","signatures":[{"sig":"MEUCIQDiYGujSB6MeXjKjNDL1rhDolz5ZjBI5x69Tqn+JfLjXQIgUaRN9E+Jttw84kVnbCKGA2FiH5achD1iuyRniPEOLtI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183141},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"707f4c187bb56bb9a38e9f777a914923eda8ad63","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.32_1782139404365_0.7133203306989981","host":"s3://npm-registry-packages-npm-production"}},"0.0.33":{"name":"@mauroandre/velojs","version":"0.0.33","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.33","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"4929d4eafa974e0c0d38b9f4a56faabbd26eaefd","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.33.tgz","fileCount":45,"integrity":"sha512-t6THhsy4PTw7HSHpKoOyjiA4vJw77IukQqIrELVeq8ZcE3VikgtQk+WpRk1WkTMkP8GXnT5i9rnZJZr4i9ZSdw==","signatures":[{"sig":"MEUCIHHapCdPRyx140REjdw2tQNCTH1KA0Jklf48bfcRE3kTAiEAoAKsohpLE6a8bazuy/pfDShkyheuNKTs5XgSfvKLt+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183412},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"77e52746345bfbc7097499f8252e8929c8ddf0ec","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.33_1782143492756_0.3942450700871225","host":"s3://npm-registry-packages-npm-production"}},"0.0.34":{"name":"@mauroandre/velojs","version":"0.0.34","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.34","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"2a437bf63023b18df5f3dac6838a8d0ab9cbb41a","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.34.tgz","fileCount":45,"integrity":"sha512-CDOD9XZHeU/KfSxIZAv5PtaHujM+FbeCZA2b9fnBv2k4yxgAqQxvz97bz46viH5e695MmNNM5XWWr0h0tknxug==","signatures":[{"sig":"MEYCIQDb6bYHXNx8c7VjA874PYto7M6Q0GNGkxXRhP2iHIgwRwIhAMksrQyTRZyXZ/tT7P2g1yqc1DLHrZMBMoPprlqft3/b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183259},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"d99411f88471b570208c6b46edc66fc20c850d13","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.34_1782148762479_0.6034057753512871","host":"s3://npm-registry-packages-npm-production"}},"0.0.35":{"name":"@mauroandre/velojs","version":"0.0.35","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.35","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"b56b4176cdcf013a49ecbfaa77a74e570cc6b1aa","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.35.tgz","fileCount":45,"integrity":"sha512-bvf7lewNeNAdJiHT7D1rkHrflBnTYdKI7zkP8KUEOBy82fcSZsnqyw3UrOXmFzR80WXvKPme4IL7FKDHwqrnow==","signatures":[{"sig":"MEUCIQCH0PHLoFeapb/zXPjuPFz9pVhCUNbi38xdRkdZY+fT+AIgbplAC1CkvFOx8VdiwyfLMxgomnOZiM8Lgl10080LgvM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183930},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"68ecb867723ce5437b26e42ea1ef91d2b06adf72","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.35_1782151027957_0.6176397318977316","host":"s3://npm-registry-packages-npm-production"}},"0.0.36":{"name":"@mauroandre/velojs","version":"0.0.36","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.36","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"7244682c3de59df41163024b688146eb7e19d831","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.36.tgz","fileCount":45,"integrity":"sha512-Xt92i0+Op46x3KdVv1HflKzddC6RzeA7VDCSoEOH8e98f/2j7Tcen92JesXsu4Z2O6HU1iUzO9RyjhCHdxD/eA==","signatures":[{"sig":"MEUCIQCCQoODgOhoPgkBa+8YTcEiS4wiVIlBHW0dkb2g3YrZXgIgP+DHj9vswDHyrFaQ+RuNP+fltqXQ4FJONTEMNvtfbiY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":184379},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"5aa25f6b3a140e6c9de342c113c608e5bebd3ab5","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.22.3","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.36_1782153673454_0.6194365783588338","host":"s3://npm-registry-packages-npm-production"}},"0.0.37":{"name":"@mauroandre/velojs","version":"0.0.37","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.37","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"13852257cae87e5133490e1d03f35fa3d1b1ec5d","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.37.tgz","fileCount":47,"integrity":"sha512-5LwDfSQ1Z4n2kQGKDlh+sLwpEg4/iPI/JbY0pHLy5+n+f6EKuPM/yDBO8FBFRqBKUrOSZoYEGW2E5fyJLoiDKQ==","signatures":[{"sig":"MEUCIQCU76o9MMthk5E3IzTj6u+vgmhcmrsGw0MTrxFF1pBClQIgNYsirZg5K8faeVhaGWKQMv/hZ28Xwjv2uWtnJIEw1Po=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190483},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"9f8d23f457ca304fa1a37b2c61807959de092d3b","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.37_1784073618678_0.11015116773984213","host":"s3://npm-registry-packages-npm-production"}},"0.0.38":{"name":"@mauroandre/velojs","version":"0.0.38","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.38","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"3ce729be2ff4d8e1a6d9a1d7995aa0260f93c07d","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.38.tgz","fileCount":66,"integrity":"sha512-5WfNWgxr9CRjrbKLBox7YDsOxXu5SvVhrJXXZsutkHrHWAw4iOLvBLUsdysjUik0gWRneXWwkrADAOdklnKj8A==","signatures":[{"sig":"MEQCIDbsG3wCNTWIf3q70Mo+q4rt4Kp+ntcFj3asrhp7aLvtAiAUMAgAmQs2ovZ2JKF2doXcrxq3Ojijrha2QUQ+vtYdyg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":333292},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"1bba2e177076df21fe7e047565b58b2216054d6a","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.38_1784212171562_0.023049857576067145","host":"s3://npm-registry-packages-npm-production"}},"0.0.39":{"name":"@mauroandre/velojs","version":"0.0.39","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.39","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"806f41f99c9daf431567b2560060a887bd1bed7c","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.39.tgz","fileCount":69,"integrity":"sha512-Oi6kerddkO6P/1PE5FDs4JZU/ac6LwiR+Lp+cbSeU2bmBYlQyNeUcAwfQD3K/5wen/hovA1bMgm85vHJw7pRjQ==","signatures":[{"sig":"MEUCIQDAuWBLVoJAZ8XlTGI+EwecPMue9Ut1IocpqaUyAk4IPgIgKBIsG9vyvCkbYEP7OWZD3mMgm8DnG7igKA5S1z3TkKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":345447},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"5d066fee23cb3c9b24d66e6b04a4ec630bc5e175","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.39_1786307001750_0.4366820396394411","host":"s3://npm-registry-packages-npm-production"}},"0.0.40":{"name":"@mauroandre/velojs","version":"0.0.40","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.40","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"cc9a0f27e10cae1764b3f3f1d155a409c0e1d247","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.40.tgz","fileCount":71,"integrity":"sha512-cdXEDVMqDFN0blVjvYbClAyGMRwxSCw3GqrRF1KLKoukQSGn8ixnJO5QLbZArvXKxHN9O/uukidIDxTAveYyMg==","signatures":[{"sig":"MEUCIQCLzAhol8768FCpyz7M3jRO6hnbMIGiGjYUvSbHCrVAcgIgE66P+AcFVWOeKgDh8aScT7H5M8icBrNs9fbniIkrz/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363383},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"9bc4f095dadb924d3d0fdb98a50d61220604b71b","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.40_1786313132263_0.7880035864812791","host":"s3://npm-registry-packages-npm-production"}},"0.0.41":{"name":"@mauroandre/velojs","version":"0.0.41","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.41","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"466138c444866ddbd7bdcee1a003891cf1b21460","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.41.tgz","fileCount":71,"integrity":"sha512-HEvbPWGbJ+3yZY8yfj0jeGsWYznm0oHsxIxfiQ2voRR+pPhtHydXj+VA5rcwJ/Os+ho11o4iHubK0M07Wpn1uQ==","signatures":[{"sig":"MEQCIG8RFn+wZfHU8NF57/G7lSDgl/acGK1UOVRirjnRpnI6AiBcl9wRdUcnCvCzNAms5LOhgI8AOOXezxwdyNdV+M2AwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":365136},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"dd21b59ef7ebd31fc1c5db8c0e63ac3f7db9e920","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.41_1786314137627_0.588269822560491","host":"s3://npm-registry-packages-npm-production"}},"0.0.42":{"name":"@mauroandre/velojs","version":"0.0.42","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.42","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"82fbe447e9b210946dd3ff737402da3ff6cfc4aa","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.42.tgz","fileCount":71,"integrity":"sha512-pUt3fE2bLxVqva1if//LEOfLi9SurRGF3RtCUEzuoY7AbOi3M+J26X7duyvo8AmwLyZ6pkUojgZUKQGBB+Hotg==","signatures":[{"sig":"MEUCIQDBQg/cRLNNPhke4nDwFDvnzPMbL6tXYeKm+IZQKsS71gIgAQNs/fOmE81qtVXEiFoBqSQjfEojGnd0/6ooxhv8bJQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":365101},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"8831775ea90a7ce0a99022d1b0b06c8a1234d3b1","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.42_1786315566768_0.03593889634992253","host":"s3://npm-registry-packages-npm-production"}},"0.0.43":{"name":"@mauroandre/velojs","version":"0.0.43","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.43","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"944e346c732d7d7c5f34583399283dfcf3ba829e","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.43.tgz","fileCount":71,"integrity":"sha512-bQHf8fCHl+y3/qFRmDhBLZdajiJaaMo/KTUgzeYBxpznjW8hYHDpGn1T2nqCDLvWXNcVkuO/pyqPFH/RBsDlQg==","signatures":[{"sig":"MEMCIEKqKitWMD8rvD4JFc/0Qjn3xf8+SD3zLdaKNBAnhy60Ah8ptpbRccujOb1h/cX/OX0QLDYCu1yq/+gXAgORAjxR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":365165},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"0865541bac82929e7a2354a6b79a6d67dc766c01","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.1","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.43_1786316237052_0.3374845501316146","host":"s3://npm-registry-packages-npm-production"}},"0.0.44":{"name":"@mauroandre/velojs","version":"0.0.44","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.44","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"1506ed97874e7d05a276bebc4192b1d97918734a","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.44.tgz","fileCount":71,"integrity":"sha512-/61QtjRZ0F9gkaiqfK/gdFFr7FbSvd4+qCJXScjNGFFAvNa/m/k1VRSnxnvB9csG/zOa4EXE9tme1O4sI6gtRA==","signatures":[{"sig":"MEUCIHdxbfaOHGAs7dNANSWeeYbNFIQdBPgkI1BJdsXWtlWsAiEAyH8NdWR08DsnHRZvdYwIBwRQtMyVzQtW/4ZL7XPSxls=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":366548},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"c9e9f69cfcb3a196a6fd1c80a0899835612cb2a5","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.44_1787002179134_0.3029844245016957","host":"s3://npm-registry-packages-npm-production"}},"0.0.45":{"name":"@mauroandre/velojs","version":"0.0.45","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.45","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"6131f9bf087e08c0073dfc214c22b29bdeceafc3","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.45.tgz","fileCount":71,"integrity":"sha512-JgC1n2LIbNVR3q99gWoSwG1Gc/HH1TMIGN2qOmo1l7H4llJ0LP9/K82xRx2h0iPJZisCcgbTJdZnveF1pyCiQA==","signatures":[{"sig":"MEQCICHHqtCa4xZvEOuwJfJxPLt97Cl7AnPEaORfYc6owpxsAiAp5nzKtpzU0Yg8JcEv4CvjoDIRUkLu96MQJSmoNus1qQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":367213},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"8507ce0e5160284caca1750891ec6af943d85520","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.45_1787075953662_0.5793543105556025","host":"s3://npm-registry-packages-npm-production"}},"0.0.46":{"name":"@mauroandre/velojs","version":"0.0.46","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.46","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"7c2ca6f7a49e420e322da60dad08f51c45cf461b","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.46.tgz","fileCount":71,"integrity":"sha512-gpMncIqHO477Q2nn3tX9ayNgB17sxC5UM6p9TKEdGetd530pW1hMpJo4qgWDmKHAcMVISBmWsapgllEuU4KvtQ==","signatures":[{"sig":"MEUCIQD49bRp7syvBtBTWwQ3Dzfeqm973L9eU9KD/Elkof3g6AIgLwuAVTE9SC63HV/5A+GGbv2QLrIs6wTFrAdOBR+bzZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":367136},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"ea26f39605aa244a409942057ce4fe987aadc7cc","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.46_1787148692667_0.7508011136447532","host":"s3://npm-registry-packages-npm-production"}},"0.0.47":{"name":"@mauroandre/velojs","version":"0.0.47","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.47","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"f8c14a009125cf4838512bd67afac45246591118","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.47.tgz","fileCount":71,"integrity":"sha512-7Z0LI3mycbE/Mp1arcS+IwOT2tmFo33xbD8Tgi38mANkFSKauboOTrxLynNh4HITOokFcSh5q4CoX3LxwEnZJA==","signatures":[{"sig":"MEUCICzy1vygybKEMjY2fq/2ZEF6sKiixUm4nelKaW8m/8CSAiEA/DAdhvGKV8AE2uYvorDi2u0K9WwrCMs7LYvzGlguMDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369116},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"2adf739509a10f6d343867dcaecf35293d83b686","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.47_1787330833171_0.8873979977755992","host":"s3://npm-registry-packages-npm-production"}},"0.0.48":{"name":"@mauroandre/velojs","version":"0.0.48","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.48","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"f8454b0352a5d962cb6f2c31ce9b6801497d4cc4","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.48.tgz","fileCount":71,"integrity":"sha512-yoLw8euq8F/Su1NsQ526PTYQSY5tOOu3WeZbmhnAles9InOQ4bKuYINFqBMSXF0cYnAz4tSjmEwDnjN8aokxeQ==","signatures":[{"sig":"MEUCIQC7GLb2DmBAdqtRKICKsjTJg6ziudP5FuUUPdg/EdZdCwIgTNVWEoRa+a5eV3TGlyQOgnv6/hzfw5kGWMZaN+LWGQs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369822},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"e508228777186566fe3d83c9241e1644cb16bb40","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.48_1788176072758_0.03728559811966203","host":"s3://npm-registry-packages-npm-production"}},"0.0.49":{"name":"@mauroandre/velojs","version":"0.0.49","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.49","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"acdec794ca1f6e0b9ffe256c0d86fb34095b26cf","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.49.tgz","fileCount":71,"integrity":"sha512-vc+AhHkjxNkyk2dHUCurNQOlj1G2u4AlvVJH4e964wuPb+i4viNPfJdi43KIEDT4jsiwh3cHM0mgHZDu7eoPfg==","signatures":[{"sig":"MEYCIQDdEZKh54NAkGX6fXg5H8U506nRdd6h7ACOpRYMtRgBJQIhAJ/Ri20MZ5XtiEMedr3BqRLse0Ky7NYXAhFFywwjt2oB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":369834},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"7cab315abdff8947bbcc13dd9e20414c89762042","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.49_1788178545374_0.2994327676297466","host":"s3://npm-registry-packages-npm-production"}},"0.0.50":{"name":"@mauroandre/velojs","version":"0.0.50","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.50","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"4ed178a5b1196361b963245ecfbf5a0417854f71","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.50.tgz","fileCount":71,"integrity":"sha512-h27+6EzmsMaF59XUHLTFHd/snk2o4UV9j6CZCEumPS/RXeiCL0sCZzcDCZSvUThLK3fWuySAnkK2r9EbAwutsQ==","signatures":[{"sig":"MEQCIE+R1Bu+gc6/QgMffk++6bGz+AdgVev3ZgPVrAvGqwkhAiBYHt07L+49OcPi855WKNxZlAYEZb2BEfJEveWjv9Sekw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371875},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"66c4d3294260bb8fe0cb57d10b7ac0d5e26d60d5","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.50_1788692153488_0.14934029629684198","host":"s3://npm-registry-packages-npm-production"}},"0.0.51":{"name":"@mauroandre/velojs","version":"0.0.51","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.51","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"751639a33cb2befe80fb2c20ef0e66454610e9a4","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.51.tgz","fileCount":71,"integrity":"sha512-Yd+OC4NZqNRPLDCB2vjAW4/5TEii/Kb7Z2v3B3zxoZxaZthqdMP5tOyQOidfzycLR7t+4vYXe+XKncy97b404A==","signatures":[{"sig":"MEUCIFG4LykxgJyJFWwbIXYmSe/AVbgtvOYEC7Y0KFtIICjCAiEAgK+Yy7xhbn70zXRVlALxmWRyFjyQCsnJkKg+9cZrO1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374953},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"4c0af6a2bf5c4b7a1dabe54ddceafa87255ba3a0","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.51_1789104904090_0.04719874597505935","host":"s3://npm-registry-packages-npm-production"}},"0.0.52":{"name":"@mauroandre/velojs","version":"0.0.52","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.52","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"7c95f9316f212b301511abd78a85a4b9a00a46c6","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.52.tgz","fileCount":72,"integrity":"sha512-VwOJF2Wu4GOnH0gLSHNgOIMBGGaBEldFiUbv4cEllWxQlRVNRdjmjsmELO3/j8GeaEYqMRoIhwO9MUUf4KQvzA==","signatures":[{"sig":"MEUCIQDtNKTN7YxK6RuGLgeVhQ1MkwWUPcdicHQQ64q/fPPoOQIgS0Rf9D/U1IMU9VTqeLhb5Jk05EhPMLpml61JoPiymSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":382269},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"e8e38b21592ae09b83d6740845694125b153fe3f","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.52_1789111842625_0.6787816226483847","host":"s3://npm-registry-packages-npm-production"}},"0.0.53":{"name":"@mauroandre/velojs","version":"0.0.53","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.53","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"5e87807bbfc7ac1828c0fde46e070505153f6817","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.53.tgz","fileCount":72,"integrity":"sha512-zl7DphPVtnk6wTHPDcZKWyVgGCrcRcwt2qmorKO0pSWPLUERGEDCOBYpqAhLoE4q9DrZ97yf+UJApWqZmQpOTg==","signatures":[{"sig":"MEQCIDLXNaTjQyNreghisPt15B/k0k/mrcFOg7hTzTCWQjv0AiBxIAaxc6GmGvopV4nHLnICKECPpIdi1soUBPbB+YKyHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCpKElJ5cv3JqRSmSDDeTm3DxINZdiOuqAX3bidt7yDEwIhAO0oztf+ckCirrv+ModgoygxVP2y2espCFWRpZG4hyZW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390645},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"65975e827ea07fadd6b768a43933124ee61514a3","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.3","yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","@types/ws":"^8.18.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.53_1790144086146_0.7482901682931673","host":"s3://npm-registry-packages-npm-production"}},"0.0.54":{"name":"@mauroandre/velojs","version":"0.0.54","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.54","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"262995f86b5ec09c7084a06534c9f72faea2a915","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.54.tgz","fileCount":72,"integrity":"sha512-QSERzBpBCdVOGMa9vpfMa2TVHOHUfbu3tPpmezTgtLl0ljvYS2puZmebyfQVz/CVxkWuh0WSFXyDsyiUaPtKFg==","signatures":[{"sig":"MEQCIDPobFYGwqHqnJZhjKMaL/kSwXPzfMk1/17wCi4pS6AgAiAu+wto61R7DFG0mFDkzFvAxWh5hC9sZzm6Ra10N32j9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDADWMIB/BNncfFcT14cnPq/9j0e7oFQ25jut8Np4CczAIgFWXZWmbm8bPmjVuHNx9nikOANkrS7McZ8WbBW0xlEHY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":396720},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"1018ec0ccf867b64df786d8077e4ede9ec7a67ad","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.3","yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","@types/ws":"^8.18.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.54_1790188767516_0.9655724646636412","host":"s3://npm-registry-packages-npm-production"}},"0.0.55":{"name":"@mauroandre/velojs","version":"0.0.55","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.55","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"02eb4e703b72ef42f8f64e21b36335b9ce40944b","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.55.tgz","fileCount":72,"integrity":"sha512-pmGA+Vnzx6eRaHOCrsREm8MjsuDebD2pWxHQ0Gtaho1rV1wPjXWte4jyPr4xZUXqzWmSYJAU59aoE5l5gpfoRw==","signatures":[{"sig":"MEUCIEd+9CeLYyEKJbtZMX3wDB7anwNtRgIdGzS7iyROk0jSAiEAxtLC9BfRFtNiPRb4GNGVdbaa9IGbfoEAmb4NpLcA5r4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDwbhs+Ky5XT7wUReN2LsGy+/Csv/qGZwUW6XbgSxK9cgIhANBy872xQXjheNIzrp8Auu622nc4ZiFMnYKci2ihJ0dy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":400286},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"b6a899291b43d99f093a87a507ad914d2fc9b05f","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.3","yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","@types/ws":"^8.18.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.55_1790709347440_0.4116764690814634","host":"s3://npm-registry-packages-npm-production"}},"0.0.56":{"name":"@mauroandre/velojs","version":"0.0.56","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.56","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"0ce9396bfc7689a67525e30e373594159e425322","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.56.tgz","fileCount":77,"integrity":"sha512-p7djuAAI+5wd7oXA5t310jGN88l4vQ/t7vQLfX4flAY0Ex1KlizbNEUvf14LQuEVUWnD8ctAi4xJp8XuKYz2oA==","signatures":[{"sig":"MEUCIQC1uWeKdmhlUOoCBXgVd62K5uS66cBQ1NoIQLDTGkv2GQIgBcCho4R/ABF1ahWzsZvl1RlKAbWw8yux+vms9kjvoY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIA0y7anfEYxR8wbjG7Wfz9a5ZN66mkqsfZ2lDwO1zBXcAiA4qZCpWw1M1MqIuLHa86ju0hEqke4yoYRx2ijCLFtEqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":497425},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"44e964cecdaa928e6651ad4d5ff1d220d5e29408","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"10.9.8","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"22.23.2","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.3","yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","@types/ws":"^8.18.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.56_1790771002188_0.1704517343990246","host":"s3://npm-registry-packages-npm-production"}},"0.0.57":{"name":"@mauroandre/velojs","version":"0.0.57","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"author":{"name":"Mauro André Silva"},"license":"MIT","_id":"@mauroandre/velojs@0.0.57","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"homepage":"https://github.com/mauro-andre/velojs#readme","bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"bin":{"velojs":"bin/velojs.js"},"dist":{"shasum":"965404daee094364a157db793839a1e114735f9a","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.57.tgz","fileCount":77,"integrity":"sha512-POk5ZOoDnVqIuAhTtvAnwK4unFlijSaZIx81GlUKvQ4jgFGT7BW/RDj9WZ+2VVHcDD2CNq/aSoHXAexayrNQbw==","signatures":[{"sig":"MEUCIQChoFcMXpeggbwqXFncaTtX5paqiOFXtPzT5aswfRcUYAIgMnG+DrvjtUQ5NsjmkVgbNV/mg3etAn6Ib6tuu+vQLVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526058},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"40e5d650e645a9f60adf8ee8d661a66f91ca22df","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com","approver":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}},"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"11.19.0","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"_nodeVersion":"24.21.0","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.3","yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","@types/ws":"^8.18.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"tmp":"tmp/velojs_0.0.57_1790961955236_0.010653606782334402","host":"s3://npm-registry-packages-npm-production"}},"0.0.58":{"_id":"@mauroandre/velojs@0.0.58","bin":{"velojs":"bin/velojs.js"},"bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"dist":{"shasum":"2695a10c6e10a042109f6a3d45bba371f08090e6","tarball":"https://registry.npmjs.org/@mauroandre/velojs/-/velojs-0.0.58.tgz","integrity":"sha512-AA4Db34QDHuhWj1VFDjJc34zQtbnGPoCdmHebZeGAtK+ycIJiDER96Z2+fC11KbVh6QNxNU+ZG8xDh9djVZV9A==","fileCount":77,"unpackedSize":530052,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGu72EQcalX/sBp6pUXkkk2ceSq1cio2JxQ+PtHeNmjEAiEAwIpaJM4IwSOb1iriBiA87Y0Tg6c9ZtgrpfH9VhGWSGI="}]},"main":"./dist/index.js","name":"@mauroandre/velojs","type":"module","types":"./dist/index.d.ts","author":{"name":"Mauro André Silva"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vite":{"types":"./dist/vite.d.ts","import":"./dist/vite.js"},"./hooks":{"types":"./dist/hooks.d.ts","import":"./dist/hooks.js"},"./client":{"types":"./dist/client.d.ts","import":"./dist/client.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./cookie":{"types":"./dist/cookie.d.ts","import":"./dist/cookie.js"},"./events":{"types":"./dist/events.d.ts","import":"./dist/events.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"},"./factory":{"types":"./dist/factory.d.ts","import":"./dist/factory.js"},"./sockets":{"types":"./dist/sockets.d.ts","import":"./dist/sockets.js"},"./testing":{"types":"./dist/testing/index.d.ts","import":"./dist/testing/index.js"}},"gitHead":"634cea12ae773086a37b34e4c5fc7a0c56d6e9be","license":"MIT","scripts":{"test":"vitest run","build":"vite build --config vite.build.config.ts && tsc --declaration --emitDeclarationOnly --outDir dist --noEmit false --rootDir src","prepack":"npm run build:agent","typecheck":"tsc --noEmit && tsc --noEmit -p tsconfig.test.json","test:watch":"vitest","build:agent":"vite-node scripts/build-skills.cli.ts"},"version":"0.0.58","_npmUser":{"name":"mauroandre","email":"eng.mauroandre@gmail.com","approver":{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}},"homepage":"https://github.com/mauro-andre/velojs#readme","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"_npmVersion":"11.19.0","description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","directories":{},"maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"hono":"^4.12.0","vite":"^7.3.0 || ^8.0.0","preact":"^10.29.0","@babel/types":"^7.28.5","@babel/parser":"^7.28.5","@hono/node-ws":"^1.3.0","wouter-preact":"^3.9.0","@babel/traverse":"^7.28.5","@preact/signals":"^2.8.0","@babel/generator":"^7.28.5","@hono/node-server":"^1.19.0","@preact/preset-vite":"^2.10.0","@hono/vite-dev-server":"^0.25.0","preact-render-to-string":"^6.6.0"},"devDependencies":{"ws":"^8.21.3","yaml":"^2.9.0","jsdom":"^29.0.2","vitest":"^3.2.1","@types/ws":"^8.18.1","typescript":"^6.0.2","@types/node":"^25.5.2","@types/babel__traverse":"^7.28.0","@testing-library/preact":"^3.2.4","@types/babel__generator":"^7.27.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/velojs_0.0.58_1791063124027_0.8435939333741285"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-05T12:02:30.500Z","modified":"2026-10-03T21:32:04.243Z","0.0.1":"2026-04-05T12:02:30.734Z","0.0.2":"2026-04-05T12:03:58.129Z","0.0.3":"2026-04-05T12:22:01.829Z","0.0.4":"2026-04-05T12:32:55.346Z","0.0.5":"2026-04-05T13:29:54.714Z","0.0.6":"2026-04-05T13:47:24.331Z","0.0.7":"2026-04-05T14:53:38.035Z","0.0.8":"2026-04-10T17:20:04.440Z","0.0.9":"2026-04-10T19:26:36.548Z","0.0.10":"2026-04-10T19:43:08.362Z","0.0.11":"2026-04-10T19:51:40.264Z","0.0.12":"2026-04-10T20:26:49.680Z","0.0.13":"2026-04-13T19:30:51.155Z","0.0.14":"2026-04-15T21:58:40.020Z","0.0.15":"2026-04-15T22:14:33.859Z","0.0.16":"2026-04-15T22:53:07.406Z","0.0.17":"2026-04-16T00:32:17.100Z","0.0.18":"2026-04-16T01:00:02.975Z","0.0.19":"2026-04-18T12:22:36.546Z","0.0.20":"2026-04-19T11:59:53.446Z","0.0.21":"2026-04-19T12:55:35.532Z","0.0.22":"2026-04-21T03:47:18.912Z","0.0.23":"2026-04-21T05:44:37.540Z","0.0.24":"2026-04-21T06:07:06.976Z","0.0.25":"2026-04-21T17:26:37.484Z","0.0.26":"2026-04-23T15:48:13.723Z","0.0.27":"2026-04-23T23:04:10.810Z","0.0.28":"2026-04-24T01:37:56.261Z","0.0.29":"2026-06-08T16:42:58.430Z","0.0.30":"2026-06-18T02:15:22.813Z","0.0.31":"2026-06-18T03:57:59.855Z","0.0.32":"2026-06-22T14:43:24.496Z","0.0.33":"2026-06-22T15:51:32.890Z","0.0.34":"2026-06-22T17:19:22.658Z","0.0.35":"2026-06-22T17:57:08.097Z","0.0.36":"2026-06-22T18:41:13.609Z","0.0.37":"2026-07-15T00:00:18.821Z","0.0.38":"2026-07-16T14:29:31.717Z","0.0.39":"2026-08-09T20:23:21.907Z","0.0.40":"2026-08-09T22:05:32.507Z","0.0.41":"2026-08-09T22:22:17.785Z","0.0.42":"2026-08-09T22:46:06.924Z","0.0.43":"2026-08-09T22:57:17.173Z","0.0.44":"2026-08-17T21:29:39.275Z","0.0.45":"2026-08-18T17:59:13.790Z","0.0.46":"2026-08-19T14:11:32.875Z","0.0.47":"2026-08-21T16:47:13.316Z","0.0.48":"2026-08-31T11:34:32.898Z","0.0.49":"2026-08-31T12:15:45.526Z","0.0.50":"2026-09-06T10:55:53.635Z","0.0.51":"2026-09-11T05:35:04.234Z","0.0.52":"2026-09-11T07:30:42.785Z","0.0.53":"2026-09-23T06:14:46.245Z","0.0.54":"2026-09-23T18:39:27.599Z","0.0.55":"2026-09-29T19:15:47.590Z","0.0.56":"2026-09-30T12:23:22.331Z","0.0.57":"2026-10-02T17:25:55.338Z","0.0.58":"2026-10-03T21:32:04.139Z"},"bugs":{"url":"https://github.com/mauro-andre/velojs/issues"},"author":{"name":"Mauro André Silva"},"license":"MIT","homepage":"https://github.com/mauro-andre/velojs#readme","keywords":["framework","fullstack","hono","preact","vite","ssr","typescript"],"repository":{"url":"git+https://github.com/mauro-andre/velojs.git","type":"git"},"description":"Fullstack web framework built on Hono + Preact with Vite-powered AST transforms","maintainers":[{"name":"mauroandre","email":"eng.mauroandre@gmail.com"}],"readme":"# VeloJS\n\nFullstack web framework with SSR, hydration, and file-based conventions.\n\n- **Server**: Hono (web framework) + Preact SSR\n- **Client**: Preact + @preact/signals + wouter-preact\n- **Build**: Vite with custom plugin (Babel AST transforms)\n\n---\n\n## Getting Started\n\n### Create a new project\n\n```bash\nnpx @mauroandre/velojs init my-app\ncd my-app\nnpm install\nnpx velojs dev\n```\n\n### Project structure\n\n```\nmy-app/\n├── app/\n│   ├── routes.tsx        # Route definitions (export default)\n│   ├── server.tsx        # Server init (DB connections, custom routes, etc)\n│   ├── client.tsx        # Client init (global CSS, etc)\n│   ├── client-root.tsx   # Root component (<html>, <head>, <body>)\n│   └── pages/            # Pages, layouts, modules\n├── vite.config.ts\n├── tsconfig.json\n└── package.json\n```\n\n### vite.config.ts\n\n```typescript\nimport { defineConfig } from \"vite\";\nimport { veloPlugin } from \"@mauroandre/velojs/vite\";\n\nexport default defineConfig({\n    plugins: [veloPlugin()],\n});\n```\n\n### package.json scripts\n\n```json\n{\n    \"scripts\": {\n        \"dev\": \"velojs dev\",\n        \"build\": \"velojs build\",\n        \"build:static\": \"velojs build --static\",\n        \"start\": \"velojs start\"\n    }\n}\n```\n\n### app/client-root.tsx — Root component\n\nThe root component renders the HTML shell. It must accept `children` and include `<Scripts />`.\n\n```tsx\nimport type { ComponentChildren } from \"preact\";\nimport { Scripts } from \"@mauroandre/velojs\";\n\nexport const Component = ({ children }: { children?: ComponentChildren }) => (\n    <html lang=\"en\">\n        <head>\n            <meta charset=\"UTF-8\" />\n            <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n            <title>My App</title>\n            <Scripts />\n        </head>\n        <body>{children}</body>\n    </html>\n);\n```\n\n### app/client.tsx — Client entry\n\nRuns on the client only. Use it to import global CSS, initialize client-side libraries, or set up global components like toasts.\n\n```typescript\n// Import global styles\nimport \"./styles/global.css\";\n\n// Optional: set up global client-side features\n// import { initAnalytics } from \"./modules/analytics.js\";\n// initAnalytics();\n```\n\n### app/server.tsx — Server entry\n\nRuns on the server only. Use it to connect to databases, create indexes, register custom API routes, start background jobs, and set up WebSocket handlers.\n\n```typescript\nimport type { Hono } from \"hono\";\nimport { addRoutes, onServer } from \"@mauroandre/velojs/server\";\n\n// Connect to database\nimport { connectDB } from \"../db/engine.js\";\nawait connectDB();\n\n// Create indexes\nimport { getDB } from \"../db/engine.js\";\nconst db = getDB();\nawait db.collection(\"users\").createIndex({ email: 1 }, { unique: true });\n\n// Register custom API routes\naddRoutes((app: Hono) => {\n    app.get(\"/api/health\", (c) => c.json({ ok: true }));\n});\n\n// Start background jobs\nconst { runCleanup } = await import(\"./modules/cleanup.js\");\nsetInterval(() => runCleanup().catch(console.error), 60_000);\n```\n\n### app/routes.tsx — Route definitions\n\n```typescript\nimport type { AppRoutes } from \"@mauroandre/velojs\";\nimport * as Root from \"./client-root.js\";\nimport * as Home from \"./pages/Home.js\";\n\nexport default [\n    {\n        module: Root,\n        isRoot: true,\n        children: [\n            { path: \"/\", module: Home },\n        ],\n    },\n] satisfies AppRoutes;\n```\n\n### app/pages/Home.tsx — First page\n\n```typescript\nimport type { LoaderArgs } from \"@mauroandre/velojs\";\nimport { useLoader } from \"@mauroandre/velojs/hooks\";\n\nexport const loader = async ({ c }: LoaderArgs) => {\n    return { message: \"Hello, VeloJS!\" };\n};\n\nexport const Component = () => {\n    const { data } = useLoader<{ message: string }>();\n    return <h1>{data.value?.message}</h1>;\n};\n```\n\n### Run\n\n```bash\nnpm run dev     # http://localhost:3000\n```\n\nTo expose the dev server beyond loopback — a VPS behind a reverse proxy, an app reached by hostname — set `HOST=0.0.0.0`, in the shell or in the project's `.env`; no `--host` flag by hand. The security trade-off: a broad bind in dev (`0.0.0.0`, `::`, or `--host` with no value) turns Vite's Host check off, so a request whose `Host` header carries that domain is served instead of 403'd — the DNS-rebinding protection you get on loopback is consciously given up. Stay on localhost unless you are behind a proxy; a `server.allowedHosts` declared in `vite.config.ts` still pins the allowed list.\n\n### Configuration\n\n```typescript\nveloPlugin({\n    appDirectory: \"./app\",      // default\n    routesFile: \"routes.tsx\",   // default\n    serverInit: \"server.tsx\",   // default\n    clientInit: \"client.tsx\",   // default\n    hostname: \"127.0.0.1\",      // bind interface, dev and production (the HOST env wins)\n});\n```\n\n---\n\n## Routes\n\nRoutes are defined in `app/routes.tsx` as a tree structure. Each node can have a `module` (component + loader + actions), `children` (nested routes), and `middlewares`.\n\n```typescript\n// app/routes.tsx\nimport type { AppRoutes } from \"@mauroandre/velojs\";\nimport * as Root from \"./client-root.js\";\nimport * as AuthLayout from \"./auth/Layout.js\";\nimport * as Login from \"./auth/Login.js\";\nimport * as AdminLayout from \"./admin/Layout.js\";\nimport * as Dashboard from \"./admin/Dashboard.js\";\nimport * as Users from \"./admin/Users.js\";\nimport * as UserDetail from \"./admin/UserDetail.js\";\nimport { authMiddleware } from \"./modules/auth/auth.middleware.js\";\n\nexport default [\n    {\n        module: Root,\n        isRoot: true,\n        children: [\n            // Public routes\n            {\n                module: AuthLayout,\n                children: [\n                    { path: \"/login\", module: Login },\n                ],\n            },\n            // Authenticated routes\n            {\n                module: AdminLayout,\n                middlewares: [authMiddleware],\n                children: [\n                    { path: \"/\", module: Dashboard },\n                    { path: \"/users\", module: Users },\n                    { path: \"/users/:id\", module: UserDetail },\n                ],\n            },\n        ],\n    },\n] satisfies AppRoutes;\n```\n\n### Component nesting\n\nRoutes with `children` act as **layouts**. Their `Component` receives `children` and wraps nested routes. VeloJS renders the full hierarchy from root to leaf:\n\n```\nGET /users/123 renders:\n\nRoot (isRoot — <html>, <head>, <body>)\n  └─ AdminLayout (sidebar, nav)\n       └─ UserDetail (page content)\n```\n\n```typescript\n// app/client-root.tsx — Root component\nimport { Scripts } from \"@mauroandre/velojs\";\n\nexport const Component = ({ children }: { children: any }) => (\n    <html>\n        <head><Scripts /></head>\n        <body>{children}</body>\n    </html>\n);\n\n// app/admin/Layout.tsx — Layout component\nexport const Component = ({ children }: { children: any }) => (\n    <div class={css.layout}>\n        <nav class={css.sidebar}>...</nav>\n        <main class={css.content}>{children}</main>\n    </div>\n);\n\n// app/admin/UserDetail.tsx — Page component (leaf, no children)\nexport const Component = () => {\n    const { data } = useLoader<User>();\n    return <div>{data.value?.name}</div>;\n};\n```\n\nEvery layout and page can have its own `loader`. On a request, **all loaders in the hierarchy run in parallel** — Root loader + AdminLayout loader + UserDetail loader all execute at the same time.\n\n### Route Node Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `path` | `string` | URL path segment. Supports `:params` (e.g., `/users/:id`). |\n| `module` | `RouteModule` | Module with `Component`, `loader`, `action_*` |\n| `children` | `RouteNode[]` | Nested routes (module acts as layout) |\n| `middlewares` | `MiddlewareHandler[]` | Hono middlewares (server-only, inherited by children) |\n| `isRoot` | `boolean` | Marks the root node (renders `<html>`, `<head>`, `<body>`) |\n\n### Path resolution\n\nPaths are **relative segments** that concatenate with parent paths:\n\n```\nRoot (no path)\n  └─ AdminLayout (no path)\n       ├─ Dashboard    → path: \"/\"           → fullPath: \"/\"\n       ├─ Users        → path: \"/users\"      → fullPath: \"/users\"\n       └─ UserDetail   → path: \"/users/:id\"  → fullPath: \"/users/:id\"\n```\n\nNodes without `path` don't add a segment — they're pure layout wrappers. The Vite plugin parses `routes.tsx` at build-time and calculates both `fullPath` (absolute) and `path` (relative segment), injecting them into each module's `metadata` export.\n\n### Shared layouts, different paths\n\nYou can reuse the same layout for different route groups:\n\n```typescript\nexport default [\n    {\n        module: Root,\n        isRoot: true,\n        children: [\n            // Public pages — same layout, no auth\n            {\n                module: PublicLayout,\n                children: [\n                    { path: \"/\", module: Home },\n                    { path: \"/about\", module: About },\n                ],\n            },\n            // Dashboard — same root, different layout + auth\n            {\n                path: \"/dashboard\",\n                module: DashboardLayout,\n                middlewares: [authMiddleware],\n                children: [\n                    { path: \"/\", module: Overview },\n                    { path: \"/settings\", module: Settings },\n                ],\n            },\n        ],\n    },\n] satisfies AppRoutes;\n```\n\n---\n\n## Components\n\n### Conventions\n\n| Export | Purpose |\n|--------|---------|\n| `export const Component` | Preact component (required) |\n| `export const loader` | Server-side data loader |\n| `export const action_*` | Server-side actions (RPC) |\n\n### Example Page\n\n```typescript\n// app/admin/Users.tsx\nimport type { LoaderArgs, ActionArgs } from \"@mauroandre/velojs\";\nimport { useLoader } from \"@mauroandre/velojs/hooks\";\n\ninterface User { id: string; name: string; }\n\nexport const loader = async ({ params, query, c }: LoaderArgs) => {\n    const { getUsers } = await import(\"./user.service.js\");\n    return getUsers();\n};\n\nexport const action_delete = async ({\n    body,\n    c,\n}: ActionArgs<{ id: string }>) => {\n    const { deleteUser } = await import(\"./user.service.js\");\n    await deleteUser(body.id);\n    return { ok: true };\n};\n\nexport const Component = () => {\n    const { data, loading, refetch } = useLoader<User[]>();\n\n    if (loading.value) return <div>Loading...</div>;\n\n    return (\n        <ul>\n            {data.value?.map((u) => (\n                <li key={u.id}>\n                    {u.name}\n                    <button onClick={async () => {\n                        await action_delete({ body: { id: u.id } });\n                        refetch();\n                    }}>Delete</button>\n                </li>\n            ))}\n        </ul>\n    );\n};\n```\n\n### Server-only imports\n\nLoaders and actions run on the server, but the **file itself** is also bundled for the client (the Vite plugin strips the loader body and transforms actions into fetch stubs). This means **top-level imports are included in the client bundle**.\n\nAlways use `await import()` inside loaders and actions for server-only code (database access, file system, secrets, etc.):\n\n```typescript\n// BAD — leaks server code into client bundle\nimport { getUsers } from \"./user.service.js\";\nimport { db } from \"../db/engine.js\";\n\nexport const loader = async () => {\n    return db.collection(\"users\").find().toArray();\n};\n\n// GOOD — dynamic import, only runs on server\nexport const loader = async () => {\n    const { getUsers } = await import(\"./user.service.js\");\n    return getUsers();\n};\n```\n\nThis is the most important convention in VeloJS. If you top-level import a module that uses Node.js APIs (fs, crypto, database drivers), the client build will fail or include unnecessary code.\n\n---\n\n## Loaders\n\nTwo patterns for consuming loader data:\n\n### `useLoader<T>()` — Component-level (SSR + SPA)\n\nUse for page-specific data. Supports SSR hydration and SPA navigation (auto-fetches on navigation).\n\n```typescript\nexport const Component = () => {\n    const { data, loading, refetch } = useLoader<MyType>();\n    // data: Signal<T | null>\n    // loading: Signal<boolean>\n    // refetch: () => void — manually re-fetch data\n};\n```\n\nWith dependencies (re-fetch when deps change):\n\n```typescript\nconst params = useParams<{ id: string }>();\nconst { data } = useLoader<User>([params.id]);\n```\n\n### `Loader<T>()` — Module-level (SSR only)\n\nUse for global/shared data loaded in a Layout and exported to child modules. Runs once on import — does **not** re-fetch on SPA navigation.\n\n```typescript\n// app/admin/Layout.tsx\nimport { Loader } from \"@mauroandre/velojs/hooks\";\n\nexport const { data: globalData } = Loader<GlobalType>();\n\nexport const Component = ({ children }) => (\n    <div>\n        <header>Hello, {globalData.value?.user.name}</header>\n        {children}\n    </div>\n);\n\n// app/admin/Home.tsx — import from Layout\nimport { globalData } from \"./Layout.js\";\n\nexport const Component = () => (\n    <div>Permissions: {globalData.value?.permissions.join(\", \")}</div>\n);\n```\n\n### Data Flow\n\n```\nSSR:\n    loader() → server runs all loaders in parallel\n    → injects window.__PAGE_DATA__ = { moduleId: data, ... }\n    → Loader()/useLoader() hydrate from __PAGE_DATA__\n\nSPA navigation:\n    useLoader() → fetch(currentPath?_data=1) → JSON { moduleId: data }\n    Loader() → returns null (no re-fetch)\n```\n\n---\n\n## Live Loader\n\nA page value that must **track server state over time** — a total another\nperson's request changes, data a background scheduler mutates — declares the\nchannels that keep it fresh. No extra component, no manual subscription: the\nmodule exports `channels` next to its `loader`.\nThe one-sentence model: the live loader keeps a page's state replica faithful to the server — the first payload arrives through the usual path (SSR, `__PAGE_DATA__`, the `?_data=1` refetch), and from then on every change is **addressed**, by the app's own rules, to the group of clients it concerns, **by duty or by interest**, each one receiving the state computed for its own scope.\n\n```tsx\n// app/expenses/Expenses.tsx\nexport const loader = async ({ c }: LoaderArgs) => {\n    const user = c.get(\"user\");\n    return {\n        teamTotal: await expensesService.teamTotal(user.teamId),\n        expenses: await expensesService.byTeam(user.teamId),\n    };\n};\nexport const channels = [\"teamExpenses\"];\n\nexport const Component = () => {\n    const { data, freshness } = useLoader();\n    return <h2 class={freshness.value}>Team: ${data.value?.teamTotal}</h2>;\n};\n```\n\n```ts\n// app/channels.ts — the app's channel map: name → partition resolver\nexport const channels = {\n    teamExpenses: {\n        // On subscribe the ctx is { user, params }: the principal materialized\n        // in c.get(\"user\") and the route params the connection declared. On\n        // emit it is the object the producer built, with the fields this scope\n        // consumes. Returns the partition key.\n        scope: ({ user }) => `team:${user.teamId}`,\n    },\n};\n```\n\n```ts\n// anywhere server-side: an action, server.tsx, a scheduler, a webhook\nimport { emit } from \"@mauroandre/velojs/server\";\n\nawait emit(\"teamExpenses\", { user: { teamId: 7 } });\n```\n\n### What happens\n\n- The framework derives one internal SSE route per declared channel —\n  `GET /_channel/{moduleId}/{channel}`, the same family as `/_action` and\n  `/_event` — inheriting the `middlewares` of the module's route node.\n- After hydration the client opens one connection per (module, channel) of the\n  rendered hierarchy (layout and page alike) and closes it on unmount. A\n  channel declared by both a layout and a page produces one connection per\n  module, each feeding its own module's data; a single `emit` reaches both.\n- Every new connection immediately receives the **current state**, computed by\n  re-executing the loader with that connection's own principal and route\n  params — so the pane never shows the SSR value while the server has already\n  moved on.\n- `emit(channel, ctx)` resolves the partition with the same `scope` — the\n  producer builds the same `{ user, params }` shape with the fields its scope\n  consumes — finds the connections in that partition and pushes a fresh\n  snapshot to each one: its loader re-executed with its own principal and route\n  params. Connections of other partitions receive nothing.\n- The snapshot **replaces** the module's loader data; the component re-renders\n  by itself. `useLoader()` and `Loader()` also expose `freshness` — `\"live\"`,\n  `\"stale\"` (connection closed/reconnecting/silent), `\"error\"` (the last\n  re-execution failed) — aggregated per page, plus `freshnessByChannel`, the\n  same states keyed by each of the module's channel names. They are data for\n  CSS to react to.\n\n### Routes with `:params` — the client declares, the server decides\n\nA channel declared in a module whose route has `:params` (`/projeto/:id`, a page\nor a layout) partitions per **resource**, and the loader re-executes with\n`params.id` filled — the connect snapshot and every emit.\n\n```tsx\n// app/projeto/Projeto.tsx — the route /projeto/:id\nexport const loader = async ({ params }: LoaderArgs) => ({\n    arquivos: await projetoService.arquivos(params.id),\n});\nexport const channels = [\"projetoArquivos\"];\n```\n\n```ts\n// app/channels.ts\nexport const channels = {\n    projetoArquivos: {\n        scope: ({ user, params }) => {\n            if (!params?.id) return null;\n            if (user && !podeVer(user, params.id)) return null;   // 403\n            return `projeto:${params.id}`;\n        },\n    },\n};\n```\n\n- The client **declares** the address it is already seeing: it extracts the\n  params the module's `fullPath` declares, matching as a **prefix** of the\n  pathname (a layout `/projeto/:id` covers `/projeto/7/sala` and extracts\n  `id=7`; the child's suffix takes no part) and sends them in `?_route=<json>`.\n  A catch-all (`/docs/*`) declares no `:` key — the connection travels by\n  principal.\n- The server **decides**: it validates the keys against the module's declared\n  path — a key the path does not declare rejects the subscription with **400** —\n  and the `scope` validates the policy (possession/permission), deriving the\n  key. `params` are never an authorization input: they are the declared route,\n  validated by shape and then by policy.\n- The internal `_route` key never reaches the loader's `query`: it is transport,\n  not page data.\n- The connection is **keyed by the extracted params**, not by the pathname:\n  `/projeto/7` → `/projeto/9` closes the connection and opens a new one (with a\n  snapshot on connect); `/projeto/7` → `/projeto/7/sala` does not reconnect.\n\n### Group lifecycle: `onGroupOpen` / `onGroupClose`\n\nA source with a **cost of life** — a filesystem watcher, a process, a\nsubscription to an external service — must not run forever for an empty group.\nThe first connection of a group (channel + partition) arms it and the last one\ndisarms it, by any cause (disconnect, idle, revalidation):\n\n```ts\nexport const channels = {\n    projetoArquivos: {\n        scope: ({ params }) => (params?.id ? `projeto:${params.id}` : null),\n        onGroupOpen: ({ params }) =>\n            watchers.armar(params.id, () => emit(\"projetoArquivos\", { params: { id: params.id } })),\n        onGroupClose: ({ partition }) => watchers.desarmar(),\n    },\n};\n```\n\n- A second connection of the same group fires nothing.\n- Both hooks may be async and are **awaited**: on open, before the connect\n  snapshot (the source is armed before the first data arrives); on close, before\n  the group is discarded. A hook that throws (or rejects) is logged loudly,\n  naming channel and partition, and the group continues — the cold-source\n  snapshot still arrives, only the live data waits for the fix.\n- The hook is infrastructure, not policy: it does not receive `user`.\n- The `params` of `onGroupOpen` belong to the connection that opened the group\n  and are identical across it **only when the partition derives from them** (a\n  watcher per resource). A channel partitioned by **principal**, declared in a\n  module with `:params`, mixes resources in one group: do not consume the\n  hook's params there.\n\n### Two ways to emit\n\n**Invalidation** — `emit(channel, ctx)` says *this partition changed*, without\nknowing the shape of the data: the runtime re-executes the loader per connection\nand pushes the snapshot. Use it when only the server knows the new value (a\nbackground job, another request).\n\n**Slice** — `emit(module, channel, ctx, slice)` says *here is the new value*: the\nproducer already holds it, so it travels as-is to the connections of that\n(module, channel) pair in the partition, and **no loader runs**. The slice is\ntyped as a `Partial` of what that module's loader returns, so `tsc` rejects an\nunknown key or a wrong value type.\n\n```ts\nimport { emit } from \"@mauroandre/velojs/server\";\nimport * as Expenses from \"../app/expenses/Expenses.js\";\n\n// invalidation: the runtime re-executes Expenses.loader per connection\nawait emit(\"teamExpenses\", { user: { teamId: 7 } });\n\n// slice: the value is already in hand — delivered as-is, no re-execution\nawait emit(Expenses, \"teamExpenses\", { user: { teamId: 7 } }, { teamTotal: 880 });\n```\n\nWhy the module, and not just the channel name? Because the same channel can be\ndeclared by a layout **and** by a page, each with its own loader and its own\n`Data` — a slice is the shape of exactly one of them, and it reaches only that\nmodule's connections. `emit(channel, ctx)` keeps reaching every module of the\nchannel.\n\n### The merge contract\n\n- **Snapshot replaces; slice merges.** A snapshot (connect or invalidation) is\nthe whole value of the module's data; a slice applies a **shallow** merge by\nkey on top of the current value.\n- The key sent is replaced by the **whole value** sent — lists travel whole\n  inside their key; there is no list diff. Keys not sent stay intact.\n- **Removal is explicit**: removing an item is re-sending the key with the new\n  whole list (without the item). An absent key never means \"remove\".\n- The merge happens **on arrival**, never at render: slices that land in the\n  same frame are applied together before the next render — none is lost — and\n  for the same key the last one in arrival order wins. A malformed payload keeps\n  the previous value.\n- The runtime merges blindly (it is JavaScript); shape safety comes from the\n  emit typing. A key that does not exist in the loader's `Data` only gets in\n  through a cast, and that is a usage error.\n\n### Bursts, log and revalidation\n\n- **Coalescing.** Invalidation emits are folded per (channel, partition): the\n  first opens a window, the emits inside it join, and closing the window fires\n  **one** re-execution round per connection — no invalidation is lost. The\n  default window is `50ms`; `registerChannels(map, { coalesceMs: 0 })` turns it\n  off (immediate), and a slice never waits for it (a slice is pushed directly).\n\n  The window decides what `await emit(…)` waits for: with it off (`0`, and the\n  test toolkit's default) the await resolves after the round was delivered;\n  with it open it resolves as soon as the gesture is registered — the log line\n  is out, the delivery comes later. Never assert a screen update right after\n  `await emit(…)` under the default window: await the arrival (`next()` /\n  `nextEvent()`) or wait for the effect.\n- **Emit log.** Every `emit`, in either mode, writes one `console.log` line at\n  the moment of the gesture:\n\n  ```\n  [velojs] emit kind=invalidate channel=\"teamExpenses\" partition=\"team:7\" connections=2 at=2026-09-30T12:00:00.000Z\n  ```\n\n  `connections` is the size of the group at that instant — before coalescing and\n  before revalidation — and the consolidated delivery writes no second line. An\n  emit whose `scope` resolves to nothing logs `partition=null connections=0`:\n  reaching nobody is exactly what the log is for.\n  `registerChannels(map, { logEmits: false })` silences it. In tests,\n  `createTestApp` registers with the window off and takes the same options in\n  `channelOptions`.\n- **Partition revalidation.** Before delivering anything, the runtime re-derives\n  each connection's partition by running the `scope` again with the ctx captured\n  at subscribe — the principal and the validated route params of that\n  connection. A connection whose partition moved — or whose scope now\n  returns `null` — is removed from the group and closed: the client sees the\n  connection closed (`freshness` goes `\"stale\"`) and receives none of that\n  emit's data. A `scope` that **throws** on re-derivation is treated the same\n  way — fail-closed, with the failure logged naming the channel — so a scope\n  that does I/O must handle its own failures. Only the partition is revalidated;\n  session expiry stays with the normal request pipeline.\n\n### Transport: heartbeat, idle timeout and the proxy\n\nAn SSE connection crosses infrastructure that was not built for it — proxies,\nload balancers, browsers with sleeping tabs. The channel answer is built for\nthat traffic, and its transport has exactly two clocks:\n\n- **Heartbeat** — an SSE comment (`: ping`) written through the write chain\nevery `heartbeatMs`. It keeps proxies and browsers from buffering or closing an\nidle stream, and it is pure transport: it generates no event in the client and\ndoes not count as a delivery — it touches neither freshness nor idle. The\ndefault is `20000` (20s), the same `DEFAULT_HEARTBEAT_MS` the `stream_*` SSE\nsurface uses — one transport ruler in the house. `0` disables it.\n- **Idle timeout** — a connection with **no deliveries** (snapshot or slice) for\n`idleMs` is closed by the server. The heartbeat does not reset it: idle is\nabout data, heartbeat is transport. A live but quiet page cycles by design —\nclose, `EventSource` reconnects by itself, snapshot on connect repairs the\nstate — and an abandoned page's resources are freed for good. The default is\n`300000` (5 min) in any registration without options; `0` disables it.\n\n```ts\n// app/channels.ts registration with explicit windows\nregisterChannels(channels, { idleMs: 60000, heartbeatMs: 15000 });\n```\n\nThe answer also carries `Cache-Control: no-store`: a proxy or the browser must\nnever serve a cached channel snapshot — a stale snapshot is exactly the illusion\nthe live loader exists to kill.\n\n**Behind a reverse proxy (the house recipe, Caddy).** SSE needs the proxy to\nflush immediately and never buffer the response, or the page goes silent even\nwith everything alive. In the Caddyfile, the reverse_proxy for the app needs\n`flush_interval -1` (flush as soon as data arrives — a negative value means\n\"immediately\", which is what SSE requires; a positive interval would batch\nchunks and delay every snapshot). Caddy passes the request through with\nstreaming by default and closes dead upstreams on its own probes — the\nheartbeat then does its part at 20s, and the idle timeout closes what nobody is\nreading anymore. If you put another proxy in front (nginx, a cloud LB), the\nsame two rules apply: no response buffering, and `X-Accel-Buffering: no` for\nnginx or the equivalent for the LB.\n\n### Inspecting the live channels\n\nWhen the incident happens, the server answers \"what is alive?\":\n\n```ts\n// anywhere server-side (an action, a guarded endpoint of your own)\nimport { inspectChannels } from \"@mauroandre/velojs/server\";\n\nconst report = inspectChannels();\n// {\n//   channels: [{\n//     channel: \"teamExpenses\",\n//     groups: [\n//       { moduleId: \"expenses/Layout\", partition: \"team:7\",\n//         connections: 1, lastDeliveryAt: \"2026-09-30T12:00:00.000Z\" },\n//       { moduleId: \"expenses/Expenses\", partition: \"team:7\",\n//         connections: 1, lastDeliveryAt: \"2026-09-30T12:00:01.104Z\" },\n//     ],\n//     connections: 2,\n//   }],\n//   openCoalesceWindows: [],\n//   totalConnections: 2,\n// }\n```\n\nPer channel, the groups are identified by the pair (moduleId, partition key) —\nin the incident you know which page/module holds every connection — each with\nits connection count and the timestamp of the last delivery; the coalescing\nwindows still open; the grand totals. `inspectChannels()` is always available:\nthe app decides how (and with what guard) to expose it.\n\nIn development there is a ready-made lens: `GET /_channel-inspect` answers the\nsame JSON in the browser. It exists **only in dev** — the map of channels and\npartitions is internal information, and it never ships in a production build.\n\n### The partition contract\n\n**Addressed, not broadcast.** A partition is not a filter applied after a broadcast. The `emit` is addressed: the runtime resolves the partition key and writes only to the connections of that group — a client outside the group never hears about the change, not even a byte. Two reasons make a partition matter, and they compose: **by duty** (authorization — the data belongs to that team, that family, that project; others must not see it) and **by interest** (relevance — the tab watching project 9 has nothing to wake up for when project 7 changes). The same `scope` serves both; the app decides which, or both at once.\n\nOn subscribe the `scope` receives `{ user, params }`. `user` is `c.get(\"user\")`\n— the house key, the same one the stream/socket channel resolvers use (a\nmiddleware that materializes the principal elsewhere should set it in `\"user\"`\ntoo) — and `params` are the route params the connection declared, already\nvalidated. Without an authenticated principal `user` is `undefined`: a public\nchannel ignores it (`() => \"all\"`), an authenticated one returns `null`, which\ndenies the subscription with 403; an app that does not materialize a principal\nat all (a network guard, e.g. loopback) writes `({ params }) => …`. On emit the\nsame scope receives the object the producer built, with the fields it consumes\n(`{ params: … }` or `{ user: … }`). A scope that **throws** on subscribe denies\nwith **403** and logs loudly, naming the channel.\nThe partition **never** derives from the query string or from any other client\ninput: `params` are the declared route — validated by shape — not a choice of\nsubject.\n\n### State or flow?\n\nTwo questions decide, every time:\n\n| Question | Answer | Tool |\n|---|---|---|\n| Is this a **value** or a **sequence**? | value — \"what is it now?\", replacement | `loader` + `channels` |\n| | sequence — \"what happened?\", accumulation (chat, log, progress) | `stream_*` / `socket_*` |\n| Does the change come from **someone else** or from **me**? | someone else / a background job | `loader` + `channels` |\n| | me, through my own action | `refetch()` after the action |\n\n### Guards\n\n- `channels` in a module **without** a `loader`: explicit error in the dev\n  server and in the build (\"nothing to synchronize\").\n- A channel **without an entry** in `app/channels.ts`: explicit error in the dev\n  server and in the build, naming the channel.\n- `emit()` on a channel with no entry in the map: throws immediately, naming\n  the channel. `emit()` on a valid channel with no subscribers is a no-op.\n- Route params with a key the module's path does **not** declare: the\n  subscription is rejected with **400**, naming the key — the client may only\n  declare what the route declares.\n- A `scope` that **throws** on subscribe: denied with **403** and logged\n  loudly, naming the channel.\n- `emit(module, channel, …)` on a module that does not declare that channel, or\n  that has no `loader`: throws immediately, naming both. A slice that is not an\n  object throws too.\n- `velojs build --static` with a module declaring `channels`: the channels are\n  **inert** (no server for SSE) — the client opens no connection, `freshness`\n  stays `\"live\"` and the build warns, naming the module.\n- A module outside the conventions (`.jsx`/`.js`, or outside `app/`) is the one\n  genuinely silent line: no transform, so the channel is simply inert.\n\n### Testing a live loader\n\n```ts\nimport { createTestApp } from \"@mauroandre/velojs/testing\";\nimport { emit } from \"@mauroandre/velojs/server\";\nimport { channels } from \"../app/channels.js\";\nimport * as Expenses from \"../app/expenses/Expenses.js\";\n\nconst app = await createTestApp({\n    routes,\n    channels,\n    getSessionCookie: async ({ user }) => ({ session: await sign(user) }),\n});\n\nconst sub = await app.as({ user: { teamId: 7 } }).channel(Expenses, \"teamExpenses\");\nawait sub.next({ timeoutMs: 1000 });     // snapshot on connect\nawait emit(\"teamExpenses\", { user: { teamId: 7 } });\nconst snapshot = await sub.next({ timeoutMs: 1000 });\nawait emit(Expenses, \"teamExpenses\", { user: { teamId: 7 } }, { teamTotal: 880 });\nconst slice = await sub.next({ timeoutMs: 1000 });\n\n// A route with `:params`: the connection declares them (validated for real).\nconst project = await app.channel(Project, \"projetoArquivos\", { params: { id: \"7\" } });\nexpect(await project.next({ timeoutMs: 1000 })).toEqual({ id: \"7\", files: [\"a.txt\"] });\n```\n\n`next()` returns the payload exactly as it travelled (a whole snapshot or a raw\nslice); `nextEvent()` returns the same arrivals discriminated —\n`{ type: \"snapshot\" | \"slice\", data }`. The toolkit registers the channels with\nthe coalescing window off, so `await emit(…)` is the delivery; a test that\nexercises the window passes it in `channelOptions` — a sibling of `channels`,\nwhich stays the map — and drives it with fake timers:\n\n```ts\nconst app = await createTestApp({\n    routes,\n    channels,                                    // the map\n    channelOptions: { coalesceMs: 20 },          // the registration options\n    getSessionCookie,\n});\n```\n\nThe same `channelOptions` accepts `idleMs` and `heartbeatMs` — both default to\n`0` in the toolkit (deterministic: no connection dies, no comment is written\nunless the test asks for it and advances fake timers through the window it\nmeant). `inspectChannels()` is process-wide and sees the test app's real\nchannels: subscribe, emit, inspect, close, inspect again — all without network.\nA test that exercises the idle timeout or the heartbeat arms the window\nexplicitly and drives it with fake timers; never assert freshness (in either\nsurface) without advancing the fake timers through the window.\n\n---\n\n## Actions\n\nServer-side functions callable from the client via RPC.\n\n### Definition\n\n```typescript\nexport const action_login = async ({\n    body,\n    c,\n}: ActionArgs<{ email: string; password: string }>) => {\n    const { authenticate } = await import(\"./auth.service.js\");\n    const token = await authenticate(body.email, body.password);\n\n    const { setCookie } = await import(\"@mauroandre/velojs/cookie\");\n    setCookie(c!, \"session\", token, { path: \"/\" });\n\n    return { ok: true };\n};\n```\n\n### Client-Side Behavior\n\nThe Vite plugin transforms action bodies into fetch stubs at build time:\n\n```typescript\n// Original (server)\nexport const action_login = async ({ body, c }: ActionArgs<LoginBody>) => {\n    // ... server logic\n};\n\n// Transformed (client)\nexport const action_login = async ({ body }: { body: LoginBody }) => {\n    return fetch(\"/_action/auth/Login/login\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(body),\n    }).then(r => r.json());\n};\n```\n\n**Error handling**: Actions do NOT throw on server errors. They resolve with `{ error: \"message\" }`. Always check `result.error` explicitly.\n\n### Shared actions in Layouts\n\nActions are tied to the module where they're declared — the route is always `/_action/{moduleId}/{actionName}`. Declare an action in a Layout and import it from any child module to share it across multiple pages.\n\n```typescript\n// app/admin/Layout.tsx — action declared once in the layout\nimport type { ActionArgs } from \"@mauroandre/velojs\";\n\nexport const action_logout = async ({ c }: ActionArgs) => {\n    const { deleteCookie } = await import(\"@mauroandre/velojs/cookie\");\n    deleteCookie(c!, \"session\");\n    return { ok: true };\n};\n\nexport const Component = ({ children }) => (/* layout with children */);\n```\n\n```typescript\n// app/admin/Dashboard.tsx — imports and uses the action from Layout\nimport { action_logout } from \"./Layout.js\";\n\nexport const Component = () => (\n    <button onClick={async () => {\n        await action_logout({});\n        window.location.href = \"/login\";\n    }}>Logout</button>\n);\n```\n\nThe client-side transform rewrites the import to fetch `/_action/admin/Layout/logout`, so the action always points to the correct URL regardless of where it's imported. Middlewares on the Layout apply automatically.\n\n---\n\n## Endpoints\n\nDeclarative HTTP endpoints for anything that isn't a page — webhooks, email-verification redirects, OAuth callbacks, health checks.\n\nDeclare them directly in `routes.tsx`:\n\n```tsx\nimport type { AppRoutes, EndpointHandler } from \"@mauroandre/velojs\";\nimport * as Home from \"./pages/Home.js\";\nimport { githubWebhook } from \"./webhooks/github.handler.js\";\n\nexport default [\n    { path: \"/\", module: Home },\n    { path: \"/api/github/webhook\", method: \"POST\", handler: githubWebhook },\n] satisfies AppRoutes;\n```\n\nThe handler gets `{ c, params, query }` and must return a `Response`:\n\n```ts\nimport type { EndpointHandler } from \"@mauroandre/velojs\";\n\nexport const githubWebhook: EndpointHandler = async ({ c }) => {\n    const body = await c.req.json();\n    // ...verify signature, process event...\n    return c.json({ ok: true });\n};\n```\n\nEndpoints inherit parent `middlewares` and can be nested inside grouping nodes. The Vite plugin strips endpoint objects (and their handler imports) from the client bundle, so server-only code never ships to the browser.\n\nBecause endpoints live in `routes.tsx`, the testing toolkit sees them automatically:\n\n```ts\nconst res = await app.post(\"/api/github/webhook\", { body: {...}, headers: {...} });\n```\n\nFull documentation: [site/docs/06-endpoints.md](./site/docs/06-endpoints.md).\n\n---\n\n## Event Streams\n\nPush real-time updates from server to client via Server-Sent Events (SSE). Live progress, notifications, metrics, log streaming, AI tokens — anything server → client.\n\nThree verbs: `emit`, `close`, `useEventStream`. The framework handles routing, types, listener management, snapshots, lifecycle, reconnection, and cleanup.\n\n### Shortest example\n\n```typescript\n// app/admin/Provision.tsx\nimport { createEventStream } from \"@mauroandre/velojs\";\nimport { useEventStream } from \"@mauroandre/velojs/hooks\";\n\nexport const stream_logs = createEventStream<string>();\n\nexport const Component = () => {\n    const { snapshot, data, closed } = useEventStream(stream_logs, { channel: sessionId });\n    const lines = [...(snapshot.value ?? []), ...(data.value ? [data.value] : [])];\n    return <pre>{lines.join(\"\\n\")}{closed.value && \"\\n[done]\"}</pre>;\n};\n```\n\n```typescript\n// app/admin/provision.service.ts\nimport { stream_logs } from \"./Provision.js\";\n\nexport async function provision(sessionId: string) {\n    try {\n        stream_logs.emit(sessionId, \"Connecting...\", { snapshot: true });\n        // ... real work\n        stream_logs.emit(sessionId, \"Worker ready.\", { snapshot: true });\n    } finally {\n        stream_logs.close(sessionId);\n    }\n}\n```\n\nOne line to declare, three verbs to use. Route at `/_event/admin/Provision/logs` is registered automatically. Middlewares inherited from parent route nodes.\n\n### Two ways to declare\n\n**Convention `stream_*`** (recommended) — for streams logically tied to a page/layout. Path derived from module ID, middlewares inherited.\n\n```typescript\nexport const stream_progress = createEventStream<DeployState>();\n```\n\n**Standalone** — for cross-cutting streams (global metrics, notifications). Pass `path` and (if needed) `middlewares` explicitly. Use `broadcast: true` for streams without channels.\n\n```typescript\nexport const containerMetrics = createEventStream<Metric[]>({\n    path: \"/api/metrics/containers\",\n    broadcast: true,\n    middlewares: [authMiddleware],\n});\n```\n\n### Three ways to emit\n\n**Reactive** — call `emit()` from anywhere when something happens. Most common:\n\n```typescript\nstream_logs.emit(sessionId, \"Line\", { snapshot: true });\n```\n\n**Source-driven** — pass a `source` function. Framework runs it only while subscribed (zero CPU when nobody is watching):\n\n```typescript\nimport { poll } from \"@mauroandre/velojs\";\n\nexport const stream_metrics = createEventStream<Metric[]>({\n    broadcast: true,\n    source: poll({\n        intervalMs: 3000,\n        tick: async (emit) => emit(await collectMetrics()),\n    }),\n});\n```\n\n**Stateful snapshot** — for state-machine patterns where each emit is the complete current state:\n\n```typescript\nconst deploys = new Map<string, DeployState>();\n\nexport const stream_deploy = createEventStream<DeployState>({\n    snapshot: (id) => deploys.get(id ?? \"\"),\n});\n```\n\n### Configuration\n\n| Option | Type | Description |\n|--------|------|-------------|\n| `path` | `string` | (Standalone) Explicit URL path |\n| `broadcast` | `boolean` | If true, every emit goes to all subscribers (no channels). Default: false |\n| `channel` | `(c) => string \\| null \\| Promise<...>` | Resolve channel ID. Sync or async. Return `null`/`undefined` to reject (403). Default: `?channel=...` |\n| `snapshot` | `(channel) => TSnapshot` | Returns current state on connect (state-machine pattern) |\n| `closeOn` | `(event) => boolean` | Closes SSE when matching event is sent (declarative) |\n| `source` | `(emit, { abortSignal }) => Promise<void>` | Stream-wide producer, only runs while subscribed |\n| `perChannelSource` | `(channelKey, emit, { abortSignal }) => Promise<void>` | Per-channel producer. Mutually exclusive with `source` |\n| `bufferSize` | `number` | Max entries kept in snapshot buffer per channel (FIFO). Default `Infinity` |\n| `retainMs` | `number` | Buffer retention after `close()`. Default `300000` (5 min) |\n| `heartbeatMs` | `number \\| false` | Heartbeat interval. Default `20000` (20s). `false` to disable |\n| `middlewares` | `MiddlewareHandler[]` | (Standalone) Hono middlewares for the SSE route |\n\n### Snapshot mechanisms\n\nTwo snapshot patterns for two cases:\n\n**Per-emit `{ snapshot: true }` — append pattern.** Framework keeps a buffer per channel. Late subscribers receive the array.\n\n```typescript\nstream_logs.emit(id, \"line 1\", { snapshot: true });\nstream_logs.emit(id, \"line 2\", { snapshot: true });\n// Late subscriber → snapshot.value = [\"line 1\", \"line 2\"]\n```\n\n**`snapshot: callback` config — replace pattern.** You return the latest state from your own data structure.\n\n```typescript\ncreateEventStream({ snapshot: (id) => deploys.get(id ?? \"\") });\n// Late subscriber → snapshot.value = the latest DeployState\n```\n\nBoth survive after `close()` for `retainMs` (default 5 min) so refresh-after-finish still shows final state.\n\n### Closing\n\nTwo ways, choose either or both:\n\n```typescript\n// Imperative — call from anywhere\nstream.close(channelId);\n\n// Declarative — predicate on event\ncreateEventStream({ closeOn: (s) => s.status === \"success\" });\n```\n\nAfter close, subsequent `emit()` to that channel is ignored with a warning.\n\n### `useEventStream` hook\n\n```typescript\nconst { data, snapshot, closed, error } = useEventStream(stream, {\n    channel: \"deploy-123\",  // optional\n    enabled: true,          // optional\n});\n```\n\n| Signal | Description |\n|--------|-------------|\n| `data` | Latest event received |\n| `snapshot` | Initial state on connect (buffer or callback) |\n| `closed` | `true` when server closed the stream |\n| `error` | Parse or connection error, if any |\n\nLifecycle is automatic: opens on mount, closes on unmount, re-opens when `channel` changes.\n\n**Reconnect is stale-while-revalidate.** When the connection re-opens — `channel`, `stream` or `enabled` changed — `data` and `snapshot` keep their previous values until the first event of the new connection overwrites them, the same choice the loader store makes (a refresh must not blank the screen). A channel switch therefore never paints an empty state; only `closed` and `error` reset, because a re-open is a fresh attempt. First mount still starts at `null` and fills in when the snapshot arrives. An app that wants to blank the view on a new channel can clear the signals itself when the channel changes.\n\n**Channel coming from loader data?** Pass `enabled` so the hook does not connect before the channel exists — the first render of a SPA navigation has `data = null`, and connecting with `channel: undefined` reaches the server without `?channel=`, which a resolver answers with `null` → 403 → a flash of `closed`:\n\n```tsx\nconst { data } = useLoader<{ id: string }>();\nconst channel = data.value?.id;\n\n// no connection until the loader resolves the channel\nconst { snapshot, closed } = useEventStream(stream_logs, {\n    // spread only when it exists — `exactOptionalPropertyTypes` (the repo's own\n    // tsconfig) rejects an explicit `undefined` in an optional property\n    ...(channel != null && { channel }),\n    enabled: channel != null,\n});\n```\n\n### `poll` helper\n\nFor interval-based polling sources. Wraps your tick function in a loop that respects the `AbortSignal`. Errors in tick are logged but don't stop the loop.\n\n```typescript\npoll({ intervalMs: 3000, tick: async (emit) => emit(await collect()) })\n```\n\n### Per-channel sources\n\nUse `perChannelSource` for resources that scale per channel (SSH connections, DB cursors, pub/sub topics). Invoked once per channel on first subscriber, aborted when the last subscriber of that channel leaves.\n\n```typescript\n// The client sends the composite key: useEventStream(stream_logs, { channel: `${worker}:${container}` })\nexport const stream_logs = createEventStream<string>({\n    channel: (c) => c.req.query(\"channel\") ?? \"\",\n    bufferSize: 500,\n    perChannelSource: async (key, emit, { abortSignal }) => {\n        const [worker, container] = key.split(\":\");\n        const conn = await ssh.connect(worker);\n        const stream = conn.exec(`podman logs -f ${container}`);\n        stream.on(\"data\", (d) => emit(d.toString(), { snapshot: true }));\n        abortSignal.addEventListener(\"abort\", () => { stream.close(); conn.end(); });\n    },\n});\n```\n\n> `c.req.param()` does **not** work in a `stream_*` resolver — convention streams mount at a static path (`/_event/{moduleId}/{name}`), so the page's `:params` are not in scope and it always returns empty. The channel travels as `?channel=`. (Params do work in a standalone stream given an explicit `path` containing `:segments`.)\n\nMutually exclusive with `source`.\n\n### Async channel resolver (auth + ownership)\n\nThe `channel` resolver can be async and reject the connection by returning `null`/`undefined`:\n\n```typescript\ncreateEventStream({\n    channel: async (c) => {\n        const user = c.get(\"user\");\n        const appId = c.req.query(\"channel\");\n        const app = await getApp({ id: appId });\n        if (app?.owner !== user.id) return null; // → 403\n        return appId;\n    },\n});\n```\n\nCombines auth and channel extraction in one place.\n\n### Buffer size limits\n\nCap memory usage of long-running log streams via FIFO ring:\n\n```typescript\ncreateEventStream<string>({ bufferSize: 500 });  // keep last 500 entries per channel\n```\n\nOnly affects emits with `{ snapshot: true }`.\n\n---\n\n## Sockets\n\nDeclarative WebSocket handlers, co-located with the page that needs bidirectional communication. Use for interactive terminals, collaborative editing, live cursors — anything where the client also sends messages.\n\nExport `socket_<name>` from a page or layout, and VeloJS registers a WebSocket route at `/_socket/{moduleId}/{name}` with middleware inheritance.\n\n### Shortest example\n\n```tsx\n// app/workers/WorkerTerminal.tsx\nimport type { SocketHandler } from \"@mauroandre/velojs\";\nimport { parseJson } from \"@mauroandre/velojs/sockets\";\nimport { useSocket } from \"@mauroandre/velojs/hooks\";\n\nexport const socket_terminal: SocketHandler = async ({\n    incoming, send, keepOpen, abortSignal, c, params,\n}) => {\n    const session = await createTerminal(params.workerId);\n    session.on(\"data\", (chunk) => send({ type: \"data\", data: chunk }));\n    abortSignal.addEventListener(\"abort\", () => session.destroy());\n    keepOpen();\n\n    for await (const msg of parseJson<{ type: string; data?: string; cols?: number; rows?: number }>(incoming)) {\n        if (msg.type === \"data\" && msg.data) session.write(msg.data);\n        if (msg.type === \"resize\") session.resize(msg.cols!, msg.rows!);\n    }\n};\n\nexport const Component = () => {\n    const { send, status } = useSocket(socket_terminal, { channel: workerId });\n    // ...\n};\n```\n\n### Handler args\n\n| Arg | Description |\n|---|---|\n| `incoming` | `AsyncIterable<string \\| Uint8Array>` — raw frames. Wrap with `parseJson<T>()` for JSON auto-parse. |\n| `send(msg)` | Send a frame. `string` / `Uint8Array` pass through; `object` → `JSON.stringify`. |\n| `close(code?, reason?)` | Server-initiated close. |\n| `keepOpen()` | Required for long-lived handlers. If you return without it, the socket closes. `for await (const m of incoming)` implicitly holds the handler. |\n| `abortSignal` | Fires on disconnect / `app.close()`. Register all cleanup here. |\n| `c`, `params`, `query` | Hono context, URL params, query. Auth via `c.get(\"user\")` from middleware. |\n\n### Middleware inheritance\n\nMiddleware runs **before** the WebSocket upgrade — an `authMiddleware` that rejects returns an HTTP error and the client never sees an open socket. Same `middlewares` array on parent route nodes as pages/actions/streams.\n\n### Client hook\n\n```ts\nconst { send, status, lastMessage, close } = useSocket(socket_terminal, {\n    channel: workerId,\n    onMessage: (msg) => { /* ... */ },\n});\n```\n\n- `status: Signal<\"connecting\" | \"open\" | \"closed\">` — reactive.\n- `lastMessage: Signal<string | Uint8Array | null>` — last frame received.\n- **Reconnect preserves `lastMessage`** — changing `stub.__path`, `channel` or `enabled` opens a new socket, but the previous frame stays until the first frame of the new one arrives (stale-while-revalidate, same as `useEventStream`); `status` restarts at `\"connecting\"` and `error` resets. Swapping the stub object with the same `__path` does not reconnect. Clear `lastMessage` yourself in `onOpen` if a channel switch must blank the view.\n- **Channel coming from loader data?** Pass `enabled: channel != null` so the socket only opens once the channel resolves — same reason as `useEventStream`.\n- **No auto-reconnect** — sockets are usually stateful (pty sessions, collaborative state); blind reconnect loses state silently. Re-mount or toggle `enabled` to reconnect.\n\n### Testing\n\n```ts\nconst ws = await app.socket(socket_terminal, {\n    user: { id: \"alice\" },\n    params: { workerId: \"w42\" },\n});\nws.send({ type: \"data\", data: \"ls\\n\" });\nconst reply = await ws.next({ timeoutMs: 500 });\nawait ws.close();\n```\n\n`app.socket()` invokes the handler in-memory and aborts on `app.close()`. **Middleware does NOT run** — pass `user` via options to shortcut `c.get(\"user\")`; test middleware via regular endpoint tests that use the same middleware.\n\nFull reference: [site/docs/12-sockets.md](./site/docs/12-sockets.md).\n\n---\n\n## Hooks\n\nAll hooks work in both SSR and client (via AsyncLocalStorage on server, wouter/DOM on client).\n\n| Hook | Description |\n|------|-------------|\n| `useLoader<T>(deps?)` | Loader data with SSR + SPA support. Returns `{ data, loading, refetch }` |\n| `Loader<T>()` | Module-level SSR-only loader. Returns `{ data, loading }` |\n| `useEventStream<T, S>(stream, opts?)` | Subscribe to a server-sent event stream. Returns `{ data, snapshot, closed, error }` |\n| `useParams<T>()` | Route parameters (e.g., `:id`) |\n| `useQuery<T>()` | Query string parameters |\n| `useNavigate()` | Programmatic navigation. Returns `navigate(path)` function |\n| `usePathname()` | Absolute pathname (unlike wouter's `useLocation` which is relative to nest context) |\n| `touch(signal)` | Force signal notification after nested property mutation |\n\n### touch\n\n```typescript\nconst items = useSignal<Item[]>([]);\n\n// Mutating nested properties doesn't trigger signal updates\nitems.value[0].checked = true;\n\n// touch() forces the update\ntouch(items);\n```\n\n---\n\n## Link Component\n\nNavigation with type-safe module references or string paths.\n\n```typescript\nimport { Link } from \"@mauroandre/velojs\";\nimport * as UserPage from \"./users/UserDetail.js\";\nimport * as LoginPage from \"./auth/Login.js\";\n\n// With route module (relative — uses metadata.path, works with wouter nest context)\n<Link to={UserPage} params={{ id: \"123\" }}>View</Link>\n\n// With route module (absolute — uses metadata.fullPath)\n<Link to={LoginPage} absolute>Login</Link>\n\n// With query string\n<Link to={UserPage} params={{ id: \"123\" }} search={{ tab: \"settings\" }}>\n    Settings\n</Link>\n\n// String path (relative to current nest context)\n<Link to=\"/users\">Users</Link>\n\n// String path with ~/ prefix (absolute — escapes nest context)\n<Link to=\"~/stacks\">Stacks</Link>\n<Link to={`~/stacks/apps/${appId}/edit`}>Edit App</Link>\n```\n\n### The `~/` prefix\n\nVeloJS uses wouter-preact for routing. When routes are nested (layouts wrapping children), wouter creates a **nest context** — relative paths resolve within the current layout's scope.\n\nThe `~/` prefix escapes the nest context and navigates from the root. Use it when navigating between sections:\n\n```typescript\n// Inside /master/workers layout, these behave differently:\n<Link to=\"/details\">   → resolves to /master/workers/details (relative)\n<Link to=\"~/stacks\">   → resolves to /stacks (absolute from root)\n```\n\n**When to use `~/`**: anytime you navigate to a route outside the current layout's scope. In practice, most cross-section links use `~/`.\n\n### Props\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `to` | `string \\| RouteModule` | Destination path or module. String paths support `~/` prefix for absolute navigation |\n| `params` | `Record<string, string>` | URL parameter substitution (`:id` → value) |\n| `search` | `Record<string, string>` | Query string parameters |\n| `absolute` | `boolean` | When using module reference: use `fullPath` instead of `path` (default: `false`) |\n\n---\n\n## Scripts Component\n\nInjects necessary scripts and styles in `<head>`.\n\n```tsx\nimport { Scripts } from \"@mauroandre/velojs\";\n\nexport const Component = ({ children }) => (\n    <html>\n        <head>\n            <Scripts />\n        </head>\n        <body>{children}</body>\n    </html>\n);\n```\n\n### Props\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `basePath` | `string` | `process.env.STATIC_BASE_URL \\|\\| \"\"` | Base path for static assets |\n| `favicon` | `string \\| false` | `\"/favicon.ico\"` | Favicon path, or `false` to disable |\n\n### Output\n\n**Development:**\n```html\n<link rel=\"icon\" href=\"/favicon.ico\" type=\"image/x-icon\" />\n<script type=\"module\" src=\"/@vite/client\"></script>\n<script type=\"module\" src=\"/__velo_client.js\"></script>\n```\n\n**Production:**\n```html\n<link rel=\"icon\" href=\"/favicon.ico\" type=\"image/x-icon\" />\n<link rel=\"stylesheet\" href=\"/client.a1b2c3.css\" />\n<script type=\"module\" src=\"/client.x9y8z7.js\"></script>\n```\n\nAsset filenames include a content hash for cache busting. The hash changes only when the file content changes.\n\n---\n\n## Middlewares\n\nServer-side only. Removed from client bundle at build time.\n\n### Creating a middleware\n\nUse `createMiddleware` from `velojs/factory` (wraps Hono's middleware):\n\n```typescript\n// app/modules/auth/auth.middleware.ts\nimport { createMiddleware } from \"@mauroandre/velojs/factory\";\nimport { getCookie } from \"@mauroandre/velojs/cookie\";\n\nexport const authMiddleware = createMiddleware(async (c, next) => {\n    const token = getCookie(c, \"session\");\n\n    if (!token) {\n        if (c.req.method === \"GET\") return c.redirect(\"/login\");\n        return c.json({ error: \"unauthorized\" }, 401);\n    }\n\n    // Set data on context — accessible in loaders and actions via c.get()\n    const user = await verifyToken(token);\n    c.set(\"user\", user);\n\n    await next();\n});\n```\n\n### Using in routes\n\nAdd `middlewares` to any route node. All children inherit the middleware:\n\n```typescript\n// app/routes.tsx\nimport { authMiddleware } from \"./modules/auth/auth.middleware.js\";\nimport { masterMiddleware } from \"./modules/auth/master.middleware.js\";\n\nexport default [\n    {\n        module: Root,\n        isRoot: true,\n        children: [\n            // Public routes — no middleware\n            { path: \"/login\", module: AuthLayout, children: [{ module: Login }] },\n\n            // Authenticated routes\n            {\n                module: AdminLayout,\n                middlewares: [authMiddleware],\n                children: [\n                    { path: \"/\", module: Dashboard },     // authMiddleware applies\n                    { path: \"/stacks\", module: Stacks },  // authMiddleware applies\n\n                    // Admin-only routes — both middlewares apply\n                    {\n                        path: \"/master\",\n                        module: MasterLayout,\n                        middlewares: [masterMiddleware],\n                        children: [\n                            { path: \"/workers\", module: Workers },  // auth + master\n                            { path: \"/settings\", module: Settings },// auth + master\n                        ],\n                    },\n                ],\n            },\n        ],\n    },\n] satisfies AppRoutes;\n```\n\n### Inheritance\n\nMiddlewares accumulate from parent to child and apply to **every nested route**, including:\n\n- **Page routes** (GET) — when loading a page\n- **Action routes** (POST `/_action/...`) — when calling a server action\n- **Data fetches** (GET with `?_data=1`) — during SPA navigation\n\nIn the example above, `/master/workers` runs `authMiddleware` first, then `masterMiddleware`. The same applies when calling `action_*` functions from any page under `MasterLayout` — both middlewares run before the action executes.\n\n```typescript\n// This action, defined in app/master/Workers.tsx, is registered as\n// POST /_action/master/Workers/delete\n// with authMiddleware + masterMiddleware applied.\nexport const action_delete = async ({ body, c }: ActionArgs<{ id: string }>) => {\n    const user = c!.get(\"user\"); // set by authMiddleware\n    // ...\n};\n```\n\nA middleware on a Layout guards everything underneath it — pages, loaders, and actions — with no extra wiring.\n\n### Accessing middleware data in loaders and actions\n\nUse Hono's `c.get()` / `c.set()`:\n\n```typescript\n// Middleware sets data\nc.set(\"user\", { id: \"123\", name: \"Mauro\", role: \"master\" });\n\n// Loader reads it\nexport const loader = async ({ c }: LoaderArgs) => {\n    const user = c.get(\"user\");\n    return { greeting: `Hello, ${user.name}` };\n};\n\n// Action reads it\nexport const action_save = async ({ body, c }: ActionArgs<{ name: string }>) => {\n    const user = c!.get(\"user\");\n    // ...\n};\n```\n\n---\n\n## Server API\n\n### `addRoutes(fn)`\n\nRegister custom Hono routes before page/action routes. Call in `app/server.tsx`. Use this for REST APIs, SSE streams, file uploads, webhooks, and any custom HTTP endpoints.\n\n```typescript\n// app/server.tsx\nimport { addRoutes } from \"@mauroandre/velojs/server\";\nimport type { Hono } from \"hono\";\n\naddRoutes((app: Hono) => {\n    // REST API\n    app.get(\"/api/health\", (c) => c.json({ ok: true }));\n\n    app.post(\"/api/upload\", async (c) => {\n        const body = await c.req.parseBody();\n        const file = body.file;\n        // ...\n        return c.json({ ok: true });\n    });\n\n    // Middleware for a group of routes\n    app.use(\"/api/admin/*\", async (c, next) => {\n        const token = c.req.header(\"Authorization\");\n        if (!token) return c.json({ error: \"Unauthorized\" }, 401);\n        await next();\n    });\n});\n```\n\n### Server-Sent Events (SSE)\n\nUse Hono's `streamSSE` for real-time server-to-client communication.\n\n```typescript\nimport { addRoutes } from \"@mauroandre/velojs/server\";\n\naddRoutes((app) => {\n    app.get(\"/api/events\", async (c) => {\n        const { streamSSE } = await import(\"hono/streaming\");\n\n        return streamSSE(c, async (stream) => {\n            // Send snapshot on connect\n            await stream.writeSSE({ event: \"snapshot\", data: JSON.stringify({ count: 0 }) });\n\n            // Subscribe to updates\n            const unsubscribe = subscribe((data) => {\n                stream.writeSSE({ event: \"update\", data: JSON.stringify(data) });\n            });\n\n            // Cleanup on disconnect\n            stream.onAbort(() => { unsubscribe(); });\n\n            // Keep stream open\n            await new Promise<void>(() => {});\n        });\n    });\n});\n```\n\nClient-side consumption with `EventSource`:\n\n```typescript\nuseEffect(() => {\n    const es = new EventSource(\"/api/events\");\n\n    es.addEventListener(\"snapshot\", (e) => {\n        state.value = JSON.parse(e.data);\n    });\n\n    es.addEventListener(\"update\", (e) => {\n        state.value = JSON.parse(e.data);\n    });\n\n    return () => es.close();\n}, []);\n```\n\n### SSE with polling (live metrics)\n\n```typescript\naddRoutes((app) => {\n    app.get(\"/api/metrics/live\", async (c) => {\n        const { streamSSE } = await import(\"hono/streaming\");\n\n        return streamSSE(c, async (stream) => {\n            let running = true;\n            stream.onAbort(() => { running = false; });\n\n            while (running) {\n                const metrics = await collectMetrics();\n                await stream.writeSSE({ data: JSON.stringify(metrics) });\n                await new Promise((r) => setTimeout(r, 3000));\n            }\n        });\n    });\n});\n```\n\n### `onServer(fn)`\n\nAccess the underlying Node.js HTTP server. Useful for WebSocket handlers.\n\n```typescript\nimport { onServer } from \"@mauroandre/velojs/server\";\n\nonServer((httpServer) => {\n    const { WebSocketServer } = await import(\"ws\");\n    const wss = new WebSocketServer({ noServer: true });\n\n    httpServer.on(\"upgrade\", (req, socket, head) => {\n        const url = new URL(req.url!, `http://${req.headers.host}`);\n\n        if (url.pathname === \"/ws\") {\n            wss.handleUpgrade(req, socket, head, (ws) => {\n                ws.on(\"message\", (raw) => {\n                    const msg = JSON.parse(raw.toString());\n                    // Handle message\n                });\n\n                ws.on(\"close\", () => {\n                    // Cleanup\n                });\n            });\n        }\n    });\n});\n```\n\nCallbacks queue until the server starts. If called after startup, executes immediately.\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `PORT` | `3000` | Server port. Overrides the `port` set in `defineConfig` |\n| `HOST` | — | Bind interface, in dev and production. Overrides `defineConfig`'s `hostname`; in dev an explicit `--host`/`server.host` still wins |\n| `NODE_ENV` | — | Set automatically by `velojs start`. Enables static file serving |\n| `STATIC_BASE_URL` | `\"\"` | CDN/bucket prefix for static assets |\n\n---\n\n## Vite Plugin Architecture\n\n`veloPlugin()` returns 6 plugins:\n\n| Plugin | Purpose |\n|--------|---------|\n| `velo:config` | Build config (client/server modes, aliases, defines) |\n| `velo:transform` | AST transforms (metadata injection, action stubs, loader removal) |\n| `velo:static-url` | Rewrites CSS `url(/path)` to `url(STATIC_BASE_URL/path)` at build time |\n| `@preact/preset-vite` | Preact JSX support |\n| `@hono/vite-dev-server` | Dev server with SSR |\n| `velo:ws-bridge` | Exposes Vite's HTTP server for WebSocket handlers in dev mode |\n\n### AST Transformations\n\nApplied during Vite's `transform` hook to files in `appDirectory`:\n\n| # | Transform | When | What it does |\n|---|-----------|------|-------------|\n| 1 | `removeMiddlewares` | Client only | Removes every `middlewares` property and the imports only it referenced |\n| 2 | `removeEndpointRoutes` | Client only | Strips `handler:` endpoint nodes from `routes.tsx` |\n| 3 | `injectMetadata` | Server + Client | Adds `export const metadata = { moduleId, fullPath, path }` |\n| 4 | `transformLoaderFunctions` | Server + Client | Injects moduleId: `useLoader()` → `useLoader(\"moduleId\")` |\n| 5 | `transformActionsForClient` | Client only | Replaces action body with `fetch()` stub |\n| 6 | `transformStreamsForClient` | Client only | `stream_*` → `{ __isVeloEventStream, __path }` stub |\n| 7 | `transformSocketsForClient` | Client only | `socket_*` → `{ __isVeloSocket, __path }` stub |\n| 8 | `removeLoaders` | Client only | Removes `export const loader` entirely |\n| 9 | `pruneClientOnlyImports` | Client only | Drops imports left unreferenced by the strips above |\n\nOnly `.ts`/`.tsx` files inside `appDirectory` are transformed — a `.jsx`/`.js` page, or one outside it, is not touched at all.\n\n### Build Process\n\n```bash\nvelojs build\n# 1. vite build              → dist/client/ (client.[hash].js, client.[hash].css, .vite/manifest.json)\n# 2. vite build --mode server → dist/server.js (SSR entry)\n```\n\n### Virtual Modules\n\n| Module | Purpose |\n|--------|---------|\n| `virtual:velo/server-entry` | Server entry — imports `server.tsx` + routes, calls `startServer()` |\n| `virtual:velo/client-entry` | Client entry — imports `client.tsx` + routes, calls `startClient()` |\n| `/__velo_client.js` | Alias for client entry (used in dev) |\n\n### Hot Reload\n\nWhen `routes.tsx` changes, the plugin rebuilds the fullPath map and triggers a full page reload (not partial HMR).\n\n---\n\n## Request Isolation\n\nVeloJS uses Node's `AsyncLocalStorage` to isolate data per request. Each SSR render runs in its own storage context, preventing data leaks between concurrent requests.\n\nHooks (`useParams`, `useQuery`, `usePathname`, `Loader`, `useLoader`) access this storage on the server via `globalThis.__veloServerData`.\n\n---\n\n## Testing\n\nVeloJS ships a backend testing toolkit at `@mauroandre/velojs/testing`. Spin up the app in memory, fire HTTP requests against the ","readmeFilename":"README.md"}