{"_id":"valita-server","_rev":"39-e74a4299b712a33abee8bdc1bcf2eae8","name":"valita-server","dist-tags":{"latest":"1.2.4"},"versions":{"1.0.6":{"name":"valita-server","version":"1.0.6","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.0.6","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"0670c528f92b94ec0596947a454f948832713187","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.0.6.tgz","fileCount":64,"integrity":"sha512-PkAu9omdNn2zts+7IQwgk5dkBPmXE5S284CyNZ419RrJ8r6yhNEdER0S7qFua78bK093K4MYKCWPrMvuH919uw==","signatures":[{"sig":"MEQCIDMmVH14O0/WoovHxpUHST5nIj3UPiK9dLhN4KuntGjXAiBLodL9rBH/WoP6QEaCZcWCQ1FT4d34C+iKymtkqdACNw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97469},"main":"index.js","gitHead":"4d37a727de6b491d35002c9d985204a4160f122a","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc","hotbun":"bun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"node --inspect=9229 -r ts-node/register ./example/bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12","pino":"^10.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.0.6_1763820723456_0.30059119546872837","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"valita-server","version":"1.0.9","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.0.9","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"53f46dd91f6c63ae63273c739422c1bb174a08ee","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.0.9.tgz","fileCount":64,"integrity":"sha512-+tqGTGxaknROM41UBLDR3aHTPqehrIM/hLuuY0/amOpI1U3m0PwopK8KoLK+ZUhHD6O15Qlj8ky5c776nJWtBQ==","signatures":[{"sig":"MEQCIF5jDVhxiTN2DesGqoYUemM3tQEiRQ6CpKni4qjO0l2AAiB0iLPcVR+curtLX+tAI43KxXmXJpaLxnXlhQg4jtM9pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100762},"main":"index.js","gitHead":"8699e3b78e6c76093b5599ef9f357180ff7e66b4","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc","hotbun":"bun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"node --inspect=9229 -r ts-node/register ./example/bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12","batch-stdout":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.0.9_1763899556994_0.6960133277771334","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"valita-server","version":"1.1.0","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.1.0","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"dc8f04a9fcfef6b92092d3a0e3034d429441b89e","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.1.0.tgz","fileCount":64,"integrity":"sha512-1r0co3ugyKlpkREQoZYHDq7vf+6RvmmzITWTLLi1v1XuR/LcofslXWiRacH2vii6X0+K3HXNcFExw6JbJIHpIw==","signatures":[{"sig":"MEUCIQC2/VM4+99vxq6Ujo0PUhOqwwy/NdIuMiVZP4B7MlrZ8gIgFA3FOux8TqdIMcHAF4JphxvZgNwQymhaUbUvY7xOK1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100765},"main":"index.js","gitHead":"8324f32d5b9347a524fa88ee2e649d0c267f8df3","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc","hotbun":"bun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"node --inspect=9229 -r ts-node/register ./example/bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12","batch-stdout":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.1.0_1763930760562_0.34301334560280283","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"valita-server","version":"1.1.1","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.1.1","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"2a84072874371cb08a5e5cfadda37b90661c6280","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.1.1.tgz","fileCount":64,"integrity":"sha512-cGNnWM7+apS+q2B9G9eMeMQkOTFc29GlOtSOOi6GV7ePnlOCsi2pYhPUpjpE6t06i+4EJs8TYgKx3GTLrKlCpw==","signatures":[{"sig":"MEUCIQDqv5pcqzqvsKYjI1UjYrDX0ZEAoVll5GPckvZQHRJjawIgSrjqyyUPuQ/IaffXYpssZpwFPd3uiX9gi2W2uYWsptw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102344},"main":"index.js","gitHead":"ec17622177c2a9805a8248f2a3a09c8a2b6681e4","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc","hotbun":"bun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"node --inspect=9229 -r ts-node/register ./example/bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12","batch-stdout":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.1.1_1764016855775_0.14059483617042812","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"valita-server","version":"1.2.0","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.2.0","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"a5016a6945a781e42651f400c7b35fa1e84e34a1","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.2.0.tgz","fileCount":70,"integrity":"sha512-gOo7ZpOK4GNGZoJ1XDnE9YHU8JneBttKNv08a+UTgFpEG+TA/211mWXJBCbgJ4jQGg4ExPTlNCl3Drj0AYgdhQ==","signatures":[{"sig":"MEUCIE0OS/p8Hy2Qh0zZ3BYCFHv9FvpIqaYEowdilRufcmFnAiEAw57/Ouo/uGU0yUnhbzkH/lHbdcFk3aYkxGcdMiFVbEs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDV9m6dMjLpumukH9HXlXIhuUaabxei3O20xNQwu8lCUwIhAJO0tPKPopqqMynx2GqGUJAHQ8Bx2vmRPZp/xvWQVruF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111160},"main":"index.js","gitHead":"960455541e08f490637df8bb6fd4b24750b3f0c1","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc -p tsconfig.build.json","hotbun":"bun --inspect=127.0.0.1:6499/hotbun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"node --inspect=9229 -r ts-node/register ./example/bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12","batch-stdout":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.2.0_1790509764633_0.8990044023489765","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"valita-server","version":"1.2.1","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.2.1","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"7f66aa963341f8f57b46f148a436b3c0f6ebb48b","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.2.1.tgz","fileCount":70,"integrity":"sha512-jaboTHLEhdqLIn5fkSDQKCADpkZeV4bgrRceAxwRQRanepfnbBOjBIV2UNdsSTjwX8v1MZuQvFKz494fs3rxZw==","signatures":[{"sig":"MEQCIHOrSVfqZJ0E90h1X8jIk5hNx7JxVp9zJeOzNUf2eVkiAiBxUo2Eb4GMGYKqm+JzjjRhtVEcpBcN1MA5/ONHQKsFFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC+WjKI8um7Wef35UD2jeKkp2Q9oROmxK4H0Ht7Mg9CNAIhANtC9xXG5RfdCsGRUDDW8DKd/GmhYQCrO6aWDyhgxA4Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113752},"main":"index.js","gitHead":"709ded2a73bfc0da0db0a65f5ddb620387cd1306","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc -p tsconfig.build.json","hotbun":"bun --inspect=127.0.0.1:6499/hotbun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"node --inspect=9229 -r ts-node/register ./example/bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.1.12","batch-stdout":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.2.1_1790551412316_0.5462714676338893","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"valita-server","version":"1.2.2","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.2.2","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"7f44f80e29f000cddfb8b035370fa2df16d38faa","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.2.2.tgz","fileCount":70,"integrity":"sha512-488B1OglaU+WrUZ7RTK5nSAQLZKxidd9Nn4KTUwroj062sW9LuUF4RPVKtaLCloie6cQScC0XsMQtwRVYSTm5Q==","signatures":[{"sig":"MEYCIQCDdiZ1sv2RwaGVpwoWr7zCCax3FeK+HU9fJ5Nqn+wcWwIhALojoSo2251xoGTx7yq1POBcnoWVy5eoivDDfJ642cqx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCID1g0LquZgw4fCrV28lLXjIPFK/0pahGX9fsFlvw2h/xAiEA66XhgpuTjOODcEYeRM31M6kQra8DU2zzAQab/7y/I9U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120648},"main":"index.js","gitHead":"d5e314e68bd57b21334f6cb14757ad0960137faa","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc -p tsconfig.build.json","hotbun":"bun --inspect=127.0.0.1:6499/hotbun --hot ./example/valita-bookstore/bookstore.app.ts","example-server":"tsx ./example/valita-bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","example-serverless":"serverless offline start --stage dev -c ./example/valita-bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.6.0","batch-stdout":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.2.2_1790598493995_0.11977321679487107","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"valita-server","version":"1.2.3","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"author":{"name":"OkayestDev"},"license":"MIT","_id":"valita-server@1.2.3","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"homepage":"https://github.com/OkayestDev/valita#readme","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"311d03e63e56c53b2cef648a9b71bda899a826f4","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.2.3.tgz","fileCount":81,"integrity":"sha512-sN5BVYddNyufFP14dC7h4+Iscb2Ik2aw0mPe3E0doo+PufUppns8A61PtlCCFNmrUkTEkTgEzJmTa41l4APXDw==","signatures":[{"sig":"MEQCIB3ns+ZTbJTpuqBO73SYCKSnl2tKJUoxaYcX4DzzHdiNAiAIqV76v8ANybUaYm1olv0puPotm+B1KwiaeV5TNhr9Dg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH0+YJDgi8g4KYBpeNEHwLKOC1BGq7RFqWUnERwuzBpnAiB/ZUoitGduQRRfOveQPDfsK2HxoijzHP6QbYxVlbeN5Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167362},"main":"index.js","gitHead":"3781290b21773bbdef4af58206b69300687d1db3","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc -p tsconfig.build.json","hotbun":"bun --inspect=127.0.0.1:6499/hotbun --hot ./example/valita-bookstore/bookstore.app.ts","test-suite":"npm run test && npm run test:integration","example-server":"tsx ./example/valita-bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","test:integration":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles --testPathPattern=integration\\.test\\.ts --testPathIgnorePatterns=/node_modules/","example-serverless":"serverless offline start --stage dev -c ./example/valita-bookstore/serverless.yml"},"_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.6.0","batch-stdout":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"tmp":"tmp/valita-server_1.2.3_1790601019071_0.8533504254712987","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"_id":"valita-server@1.2.4","bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"dist":{"shasum":"fcf1cfa7549c3b34bca3490a655196d6db8ca6ca","tarball":"https://registry.npmjs.org/valita-server/-/valita-server-1.2.4.tgz","fileCount":81,"integrity":"sha512-hKwpCE2ui1Ftvi/CC2+zrSrbRN606loEJYsInI9f4PZWIFtjBgGOEaa+BLQ8HX5PI59lvgLoa9dBY9lnSz1DMQ==","signatures":[{"sig":"MEYCIQDqZ6n70SCb7sNDcIJ1LZrDE77+gAFXkM/ynENIqMC1YQIhAItwXc5QHfSp4Mww/DM73AuMDxKZZxeMO6qKQghjlT9w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEuSanUqihPzr4fagWMS40p4gHxXIp5olcjZ5Yeab5knAiAZodFCiDeeGwkY0FG3YtLZe/6qy5iO2DGkpyKvfbfRsg=="}],"unpackedSize":169052},"main":"index.js","name":"valita-server","author":{"name":"OkayestDev"},"gitHead":"3781290b21773bbdef4af58206b69300687d1db3","license":"MIT","scripts":{"lint":"eslint . --ext .ts","test":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles","build":"tsc -p tsconfig.build.json","hotbun":"bun --inspect=127.0.0.1:6499/hotbun --hot ./example/valita-bookstore/bookstore.app.ts","test-suite":"npm run test && npm run test:integration","example-server":"tsx ./example/valita-bookstore/bookstore.app.ts","publish:latest":"npm run build && npm publish --access public","test:integration":"node --inspect=9229 ./node_modules/jest/bin/jest.js --runInBand --detectOpenHandles --testPathPattern=integration\\.test\\.ts --testPathIgnorePatterns=/node_modules/","example-serverless":"serverless offline start --stage dev -c ./example/valita-bookstore/serverless.yml"},"version":"1.2.4","_npmUser":{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"},"homepage":"https://github.com/OkayestDev/valita#readme","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"_npmVersion":"10.9.2","description":"express-like api framework with built-in zod schema validation","directories":{},"maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.6.0","batch-stdout":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^9.12.0","express":"^5.1.0","ts-jest":"^29.4.5","ts-node":"^10.9.2","prettier":"^3.6.2","serverless":"^4.23.0","typescript":"^5.6.3","@types/jest":"^29.5.14","@types/node":"^22.5.4","@types/express":"^5.0.5","@types/aws-lambda":"^8.10.157","serverless-offline":"^14.4.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/valita-server_1.2.4_1790604163951_0.4332405724438566"}}},"time":{"created":"2025-11-11T10:27:15.174Z","modified":"2026-09-28T14:02:44.322Z","0.0.1":"2025-11-11T10:27:15.495Z","0.0.2":"2025-11-11T13:45:05.054Z","0.0.3":"2025-11-11T13:52:01.107Z","0.0.4":"2025-11-11T19:26:28.011Z","0.0.5":"2025-11-11T19:39:22.005Z","0.0.6":"2025-11-12T12:21:05.608Z","0.0.7":"2025-11-13T14:32:21.339Z","1.0.0":"2025-11-14T12:56:11.425Z","1.0.1":"2025-11-14T13:29:29.731Z","1.0.2":"2025-11-19T14:07:20.900Z","1.0.3":"2025-11-20T22:42:43.571Z","1.0.4":"2025-11-21T10:24:20.563Z","1.0.5":"2025-11-21T10:38:04.733Z","1.0.6":"2025-11-22T14:12:03.639Z","1.0.7":"2025-11-23T11:59:13.283Z","1.0.8":"2025-11-23T12:03:33.000Z","1.0.9":"2025-11-23T12:05:57.186Z","1.1.0":"2025-11-23T20:46:00.775Z","1.1.1":"2025-11-24T20:40:55.995Z","1.2.0":"2026-09-27T11:49:24.711Z","1.2.1":"2026-09-27T23:23:32.393Z","1.2.2":"2026-09-28T12:28:14.091Z","1.2.3":"2026-09-28T13:10:19.151Z","1.2.4":"2026-09-28T14:02:44.055Z"},"bugs":{"url":"https://github.com/OkayestDev/valita/issues"},"author":{"name":"OkayestDev"},"license":"MIT","homepage":"https://github.com/OkayestDev/valita#readme","keywords":["api","lambda","http","zod","validation","express","framework","rest","restful","router"],"repository":{"url":"git+https://github.com/OkayestDev/valita.git","type":"git"},"description":"express-like api framework with built-in zod schema validation","maintainers":[{"name":"sirkylerichardson","email":"richardson.a.kyle.95@gmail.com"}],"readme":"# Valita\n\nValita is a minimal, composable HTTP toolkit for Node.js and AWS Lambda. It gives you an Express-like routing API with first-class Zod validation, predictable request/response shapes.\n\n## Features\n\n- **Routing primitives** — Register `get`, `post`, `put`, `del`, and `options` routes with familiar path patterns and Express-style params (`/books/:id`).\n- **OPTIONS routes** — `options` registers an `OPTIONS` route for one path. Set `optionsHandler` on `createServer` or `createLambda` to answer `OPTIONS` requests when no `options` route matches.\n- **Middleware pipeline** — Chain any number of middleware functions before your controller. Each middleware can short-circuit by returning a response or continue by returning `undefined`.\n- **Schema validation** — Attach Zod schemas to `params`, `query`, `body`, `headers`, and `cookies`. Requests are validated automatically and fail with consistent `400` responses.\n- **File uploads** — `multipart/form-data` is parsed in the Node and Lambda adapters. Text fields stay on `request.body`. Files are on `request.files`.\n- **Server + Lambda adapters** — Use `createServer` for Node’s `http` module or `createLambda` for AWS Lambda/API Gateway — same routes, same handlers.\n- **Typed contracts** — `Request`, `Response`, `Schema`, `ControllerFn`, `MiddlewareFn`, and `UploadedFile` types ship with the library so your editor sees the same shapes Valita expects.\n\n## Installation\n\n```bash\nnpm install valita-server zod\n# or\nyarn add valita-server zod\n```\n\n## Quick Start (Node HTTP Server)\n\n```ts\n// src/app.ts\nimport { createServer, get, log } from \"valita-server\";\nimport { z } from \"zod\";\n\n// Register routes by importing the file once at startup.\nget(\n    \"/hello/:name\",\n    {\n        params: z.object({ name: z.string().min(1) }),\n        query: z.object({ excited: z.coerce.boolean() }),\n    },\n    (req) => ({\n        status: 200,\n        body: {\n            greeting: `Hello ${req.params.name}${req.query.excited ? \"!\" : \".\"}`,\n        },\n    }),\n);\n\nconst server = createServer({\n    errorHandler: (err) => {\n        console.error(\"Unhandled error\", err);\n        return {\n            status: 500,\n            body: { message: \"Internal server error\" },\n        };\n    },\n    enableRequestLogging: true,\n    enableResponseLogging: true,\n    loggerFn: log.info,\n});\n\nserver.listen(3000, () => {\n    console.log(\"Server listening on http://localhost:3000\");\n});\n```\n\n> **Tip:** Routes are stored in-process. Import your `routes/*.ts` modules before calling `createServer`/`createLambda` to ensure everything is registered.\n\n## Middleware Pipeline\n\nMiddleware are functions that receive the request and either return a `Response` (to short-circuit) or `undefined` to pass control to the next middleware or controller.\n\n```ts\nimport { get, Request } from \"valita-server\";\n\nfunction authMiddleware(req: Request) {\n    if (!req.headers.authorization) {\n        return {\n            status: 401,\n            body: { message: \"Unauthorized\" },\n        };\n    }\n}\n\nget(\"/secure\", authMiddleware, (req) => ({\n    status: 200,\n    body: { user: req.headers.authorization },\n}));\n```\n\n## Request Validation with Zod\n\nAttach a schema object anywhere in the middleware chain. Valita merges the pieces into a Zod object and validates the request before hitting your controller.\n\n```ts\nimport { get } from \"valita-server\";\nimport { z } from \"zod\";\n\nconst bookSchema = {\n    params: z.object({ id: z.coerce.number().int().positive() }),\n    query: z.object({ include: z.enum([\"reviews\", \"author\"]).optional() }),\n};\n\nget(\"/books/:id\", bookSchema, (req) => ({\n    status: 200,\n    body: { id: req.params.id, include: req.query.include },\n}));\n```\n\nIf validation fails, Valita throws a `ValidationError` that is translated into:\n\n```json\n{\n    \"status\": 400,\n    \"body\": {\n        \"message\": \"Validation failed\",\n        \"error\": { \"...\": \"zod-formatted error details\" }\n    }\n}\n```\n\nYou can catch and report these errors differently by providing a custom `errorHandler` (see below).\n\n## File Uploads\n\nSend `multipart/form-data`. Valita reads the body in the adapter before your route runs, so a middleware does not have to touch the raw stream. Text fields are strings on `request.body`. Each file is on `request.files`, keyed by its field name:\n\n```ts\nimport { post, UploadedFile } from \"valita-server\";\n\nfunction oneFile(file: UploadedFile | UploadedFile[] | undefined) {\n    if (!file) {\n        return undefined;\n    }\n    return Array.isArray(file) ? file[0] : file;\n}\n\npost(\"/books/:id/cover\", (req) => {\n    const cover = oneFile(req.files.cover);\n    if (!cover) {\n        return { status: 400, body: { message: \"Cover file is required\" } };\n    }\n    return {\n        status: 201,\n        body: {\n            filename: cover.filename,\n            mediaType: cover.mediaType,\n            size: cover.data.length,\n        },\n    };\n});\n```\n\n`UploadedFile` is `{ filename, mediaType, data }`, and `data` is a `Buffer`. A repeated field name becomes an array, the same way repeated query keys do. A Zod `body` schema still validates the text fields. `caption` on the bookstore cover route is an optional string.\n\n```bash\ncurl -X POST \"http://localhost:3000/books/1/cover?userId=123\" \\\n  -F \"caption=Front cover\" \\\n  -F \"cover=@cover.png;type=image/png\"\n```\n\nBodies are limited to 10 MB by default. Set `maxBodyBytes` on `createServer` or `createLambda` to change that. A larger body returns `413` and `{ \"message\": \"Request body too large\" }`.\n\nOther body errors:\n\n- Invalid JSON returns `400` and `{ \"message\": \"Invalid JSON body\" }`.\n- A malformed multipart body returns `400` and `{ \"message\": \"Invalid multipart body\" }` (or a more specific message, such as a missing boundary).\n\n`JsonBodyError`, `MultipartError`, and `PayloadTooLargeError` are exported. A custom `errorHandler` replaces the default, so it has to map those errors if you want these status codes.\n\nThe parser is a single-level `multipart/form-data` reader. Parts are separated by CRLF and the boundary. It does not expand nested multiparts or `filename*` encoding. On Lambda, API Gateway must pass the body through with `isBase64Encoded: true`. The API Gateway payload limit is 6 MB, which is below Valita's default body limit.\n\n## AWS Lambda Handler\n\nUse the same routes and controllers with the Lambda adapter:\n\n```ts\n// lambda.ts\nrequire(\"./routes/book.routes\"); // registers routes once\n\nimport { createLambda } from \"valita-server\";\n\nexport const handler = createLambda({});\n```\n\nDeploy it behind API Gateway and Valita will translate the event into the same request object your controllers expect.\n\n## Error Handling & Logging Options\n\nBoth `createServer` and `createLambda` accept an optional `Options` object:\n\n- `errorHandler?: (err: Error) => Response` — Return a custom response for uncaught errors. If omitted, Valita sends a `500` or `400` for `ValidationError`.\n- `enableRequestLogging?: boolean` — When `true`, every request is passed to `logRequest(path, data)`.\n- `enableResponseLogging?: boolean` — When `true`, every response is passed to `logResponse(path, response)`.\n- `loggingFn?: LoggerFn` — Override the logging function used by both `logRequest` and `logResponse` (defaults to `console.log`).\n- `optionsHandler?: OptionsHandler` — Fallback for `OPTIONS` requests that do not match an `options` route. It receives the `Request` and returns a `Response` or `Promise<Response>`. If omitted, Valita responds with `404` and `{ message: \"No OPTIONS route provided and no options handler set\" }`. See [OPTIONS routes](#options-routes).\n- `maxBodyBytes?: number` — Maximum request body size in bytes. Defaults to 10 MB. A larger body returns `413`.\n\n## OPTIONS routes\n\nRegister a path with `options`, the same way you register `get` or `post`. Middleware and Zod schemas work on that route too.\n\n```ts\nimport { options } from \"valita-server\";\n\noptions(\"/books/:id\", (req) => ({\n    status: 204,\n    headers: {\n        \"Access-Control-Allow-Origin\": \"*\",\n        \"Access-Control-Allow-Methods\": \"GET, OPTIONS\",\n    },\n}));\n```\n\nAn `OPTIONS` request that does not match an `options` route is passed to `optionsHandler` when you set it on `createServer` or `createLambda`. A typical use is answering CORS preflights for every other path:\n\n```ts\nimport { createServer } from \"valita-server\";\n\ncreateServer({\n    optionsHandler: (req) => ({\n        status: 204,\n        headers: {\n            \"Access-Control-Allow-Origin\": req.headers.origin ?? \"*\",\n            \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS\",\n            \"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n        },\n    }),\n}).listen(3000);\n```\n\nThe handler can be async. If no `options` route matches and `optionsHandler` is omitted, Valita responds with `404` and `{ message: \"No OPTIONS route provided and no options handler set\" }`.\n\n## Example: Bookstore API\n\nThe repository ships with a runnable example under `example/bookstore` that demonstrates:\n\n- Registering routes with middleware and schemas\n- Serving the same routes via a local HTTP server (`bookstore.app.ts`)\n- Uploading a book cover with `POST /books/:id/cover` (`upload-cover.controller.ts`)\n- Answering unmatched `OPTIONS` requests with `optionsHandler` when no `options` route matches (`bookstore.app.ts`)\n- Exporting the same logic as an AWS Lambda handler (`bookstore-lambda.ts`)\n\n### Try it locally\n\n```bash\nnpm install\nts-node example/valita-bookstore/bookstore.app.ts\n# Visit http://localhost:3000/books?userId=123\n```\n\nWith the example server running, upload the sample cover:\n\n```powershell\npowershell -ExecutionPolicy Bypass -File .\\example\\valita-bookstore\\file-upload.ps1\n```\n\nThat posts `example/valita-bookstore/cover.png` to `POST /books/1/cover?userId=123` and checks for a `201`. Pass `-FilePath` to send a different file.\n\n### Try it with Serverless Offline\n\n```bash\nnpm install\nnpm run example-serverless\n```\n\nThen send requests to the endpoints exposed in `example/valita-bookstore/serverless.yml`.\n\n### Logging\n\nValita uses [batch-stdout](https://www.npmjs.com/package/batch-stdout?activeTab=readme) for logging by default. If providing a custom logging function, I highly recommend avoiding using console/process.stdout as logging is quite expensive (can cut throughput in half if using request & response logging).\nValita exposes it's batch-stdout logger.\n\n```ts\nimport { log, createServer } from \"valita-server\";\n\nfunction loggingFn(message: string, obj: any) {\n    log.info(message, obj);\n}\n\ncreateServer({\n    loggingFn,\n}).listen(3000);\n```\n\n### Benchmark vs Express.js\n\nRan benchmark through [autocannon script](./example/autocannon.ps1). Not an exact science, but gives an idea of Valita vs Express\n\n#### Valita\n\n![Valita Benchmark Results](./example/valita-benchmark.png)\n\n#### Express\n\n![Express Benchmark Results](./example/express-benchmark.png)\n\n## Contributing\n\n1. Clone the repo and install dependencies (`npm install`).\n2. Run the test suite (`npm test`).\n3. Format/lint as needed (`npm run lint`).\n\nIssues and pull requests are welcome!\n\n## License\n\nMIT © OkayestDev\n","readmeFilename":"README.md"}