{"_id":"perfect-payload","_rev":"40-a9fc435dfafc05417dee218cad500a2c","name":"perfect-payload","dist-tags":{"beta":"2.0.0-beta.4","latest":"2.0.0"},"versions":{"1.0.0":{"name":"perfect-payload","version":"1.0.0","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"c16ef0e9110906fef6cd9dfaae4eeb31c1afb1db","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.0.tgz","fileCount":4,"integrity":"sha512-yiYl/B/H6X5UMmfKl1JT600NR9jYbxF0A+B4vsYQZFxAdy0+MfAtvljdB00EbG78T3Uu4TWikT77h/0TaiUbQw==","signatures":[{"sig":"MEQCIAoddZ1hEUr2Yqk0gIZeeYd/OCit91ku4hm1OkLADpO1AiAT/DAMWEFor3nL/1B7OVEhYo+ISVqfLq/59oRpX52sgQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":932},"main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.0_1725197347247_0.6576531510066508","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"perfect-payload","version":"1.0.1","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"a959be10f3427fa599525d2033aeee0d2bd8f0d8","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.1.tgz","fileCount":5,"integrity":"sha512-dF5af9KJuG6/rFeB6vol2/zoIHYaoM3VzfSAWv3QQ3d1SyiFtmZnDdncp8zyBxfH3eRmXmm5oHc60E657Fi6/g==","signatures":[{"sig":"MEUCIQD31UnIhanX8CW31wNmxFmbHkENIEgzNsMKuh411pQYoAIga6n8EWO+4TYQa1qe0PsvacunYNeQH6MHSagGGZykklA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":1189},"main":"index.js","type":"module","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.1_1725199532196_0.5811299255055615","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"perfect-payload","version":"1.0.2","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.2","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"3e373290057f22a868b5c9bed74b84243252ef3d","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.2.tgz","fileCount":5,"integrity":"sha512-2CkwrcA1MyeKVu3ySKpFRgZm8ZibHmAu3EFz515w4ACPt6aXoCsRJW4WRJSJFem3nZfGUe88bU+fG4w96aoM8g==","signatures":[{"sig":"MEYCIQCDyfSrUuSBsweaUVHWqn1vbemvWRwPHiw40f3HsezeAwIhALGnSmjjyh7ISFIoS/oFrVJZOvJF7wz0WLJDm0OzR4NA","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34393},"main":"index.js","type":"module","gitHead":"ff49478a426d8baad3dbee3970a37d5243021d1a","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.2_1725204702282_0.4797871636204132","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"perfect-payload","version":"1.0.3","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.3","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"cb64c6bb79a9351a5fcbda2b76d4df84388ac06e","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.3.tgz","fileCount":5,"integrity":"sha512-ETI3axzsiubadr/Wu3LSSZrMdZ6UwA7XeUdy1uTbCKDMHEfX3GPN9aZ1FiVVX56iKmcpJ3lrxB6Vuz/XscSGaQ==","signatures":[{"sig":"MEUCIA4r3FP4Avz+AFAb/jBXQgcvP8oswkxc/2R2P/FRDTXEAiEAiqopw+pT+wPxFK4UGf48yqjNy9n/a4qNBO4YOTkPmug=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34395},"main":"index.js","type":"module","gitHead":"ff49478a426d8baad3dbee3970a37d5243021d1a","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.3_1725204922647_0.4422246994284986","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"perfect-payload","version":"1.0.4","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.4","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"d86c01cc123fc9e336b0df13f1ee2df9b360b6b1","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.4.tgz","fileCount":6,"integrity":"sha512-SD9INUasDGkN3O45nzE2nMfvHwsWT6RfXe+bLS99h/kkJAIyyLAxws2amOhdpc48qR3Y5LQhjNSKAFdT23FekQ==","signatures":[{"sig":"MEUCIFEa/bRgOjCueqk+2Ft7OkNjgeNEK7ALsYKDCaD7Bd7/AiEA5A3TiM7KuphNAfckIDpmcEFWPbKCmZvYkM/09ds7mF8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35486},"main":"index.js","type":"module","gitHead":"6d68798f71bba12a021184b7521f8800493b87d0","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.4_1725206678098_0.9360184860975918","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"perfect-payload","version":"1.0.5","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.5","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"0cf0da8dcf6f8c15775cfd31cc64f443e6e794a6","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.5.tgz","fileCount":5,"integrity":"sha512-XAS0zD6rqtcjZNDWaRED56i2glBHg9nx1Yh+Kl4szkTnxuPWoulu4ZMPbyMNBbCsUf4gq8dJz4PFzTUZSF0jmg==","signatures":[{"sig":"MEYCIQDhmv8bBwsKbkKbCoYjHigDSRh5sO8Cx+Wpzc0cwFLcPAIhAKIIos9u4g9Pu5X7ro+eWtf6Q09acOHPI+gpYCOUAZbK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35344},"main":"index.js","type":"module","gitHead":"3c71e43364271573bed120490d124d528136060e","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.5_1725206831763_0.7053661598711274","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"perfect-payload","version":"1.0.6","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.6","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"8273a41ab7341c9f5bcdd2966bdd063f8fa5a432","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.6.tgz","fileCount":5,"integrity":"sha512-7rtF7c3hklSPlboX1lpcqCvrANdsDkwL3NoLzYfnqPK4RoAr7IiWJjrDYUHukIViONA0hQpJvbi82ILkyYQmYg==","signatures":[{"sig":"MEQCIExwrNVBYJHVqPvh3qz6aFY7aAf9q2tYLhwJHcJj5BYEAiBoRnq2cC7acnGUbRXnqEAcWNP5YYPMvL8AjuUjfNoT3Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35576},"main":"index.js","type":"module","gitHead":"1579d78012ce61c1cf6d117e92b7fa13c1a4362a","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"JSON Data Validation","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.6_1725556606658_0.12466337291794227","host":"s3://npm-registry-packages"}},"1.0.7":{"name":"perfect-payload","version":"1.0.7","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.7","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"1cf6d5f5bae1c36f95ff410b15be622e3767dee7","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.7.tgz","fileCount":5,"integrity":"sha512-EWDKAPhwd+B41v2tjM69ggO4uQKpaWqL+gdC9LhOjkpbXAUFc2GTcEG/hOUBK506w8ZRblN1aAs7fHO3R+E8+A==","signatures":[{"sig":"MEUCIF2x/VzZlD8bsvTqfXRGbR0OfsRJJxds19P0HCu/7DuvAiEAvh7HngkMrkPn7RZIh4KkkiIf1ank+1vm9+9I2LxKyYU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32966},"main":"index.js","type":"module","gitHead":"33fc9fc576ef1f3e01dd630724addf67850b04be","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"rich json validator","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.7_1725635261114_0.46825056270210585","host":"s3://npm-registry-packages"}},"1.0.8":{"name":"perfect-payload","version":"1.0.8","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.8","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"25495a5bf0961ad8dfc948835abd599004fe7b1a","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.8.tgz","fileCount":5,"integrity":"sha512-fBYp0fv3E8lO7UDG+dkoK93Q4/3ezCICjfp97OVtHI+tBVVYS4cAnPReFRX1pe1pH8N32L4Y1n5TDRT2YW3XfQ==","signatures":[{"sig":"MEUCIG9grj8n9H31y6tKVcUdX7vjJWBIPXsiZuD1vrBEUNXhAiEAyE998NYycB/7b+IFxNCKFvj13bnwZ25jUahJe5rL3YI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":32994},"main":"index.js","type":"module","gitHead":"c25a166db7f58cfbd52db15fb95835e51822f29d","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"9.8.0","description":"rich json validator","directories":{},"_nodeVersion":"20.14.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.8_1725640817792_0.17035990174305238","host":"s3://npm-registry-packages"}},"1.0.9":{"name":"perfect-payload","version":"1.0.9","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.0.9","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"e0aaf7806a9b2aa574197973e9a59bf470a16144","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.0.9.tgz","fileCount":5,"integrity":"sha512-o0D+gsheSoU0sBvHMAEw1cZKUL+rOhx4zCElAQgpwyQduMDMVueA+X7+6Q2+p+IT4xec/dNucRrf8nDwGX/+yQ==","signatures":[{"sig":"MEYCIQDZ0FTq/BuCjhsuBzRXzZwcvYqLHp/KLFYzOUGECypn5QIhAI0rZdYBkJ/k9D/36DxwZBZ4fKExluNVSmB6h0aAUhPB","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":33586},"main":"index.js","type":"module","gitHead":"5eb6f6992fd0c073fdc0230dc4e0ac034c874bd9","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"10.9.0","description":"rich json validator","directories":{},"_nodeVersion":"22.11.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.0.9_1735453551566_0.14198544627847776","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"perfect-payload","version":"1.1.0","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.1.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"8556bdbf18bd3dac2bab296a444b134b1f9789ff","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.1.0.tgz","fileCount":5,"integrity":"sha512-VXXfGtHi6m72KTk94uxs4H73e1clthrC4fQPB9bSPkcI7woY8++O1IsLmmSPZK6tALTOQEGxOF7UECBMhohYoA==","signatures":[{"sig":"MEUCIQCYnZqsLD5TV70zXhmA0isF1f9jxaoxmPP6z25X7NaL5QIgAgGhYrLiX0dWactb6hfGsQYuBlGlK/XUm/1ipBQyZ/8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34012},"main":"index.js","type":"module","gitHead":"a4d4ec13cf2e6da1e4da45d409ff02c951b26d34","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"10.9.0","description":"rich json validator","directories":{},"_nodeVersion":"22.11.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.1.0_1735455380712_0.5677541060682296","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"perfect-payload","version":"1.1.1","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.1.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"3d169f69498045c5e4b7945ae2da6f9727fb0542","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.1.1.tgz","fileCount":5,"integrity":"sha512-zvc+CfIZhJPMYq49krEQrTAbg+zXp1w8KWbFdXsd7SOjDVUi7ZN7QSrza0ZwcEqwohZo7dz8NM3K/L/vf0dQHw==","signatures":[{"sig":"MEQCIDaMAOPhBJ80KNSu+XktixEpO6VrUeLKIEIAeSiI4Mm2AiBz+JmRTTnG/a6vzXQ+qBd+jZvpldrGJN0QewjvLpBHJw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34048},"main":"index.js","type":"module","gitHead":"c0394d4e29c0591c0ec16d62c7f35dfee2f267bc","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"10.9.0","description":"rich json validator","directories":{},"_nodeVersion":"22.11.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.1.1_1735456639926_0.4998793872459084","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"perfect-payload","version":"1.1.2","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.1.2","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"f6069f6fc8ea1184af235253c641b2ec44a81f37","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.1.2.tgz","fileCount":5,"integrity":"sha512-bwQOP97LMAGuw8FZi1PO9r5/1WAHn+XwgOu/W6iB2ULccsLbfNSHYqR486iGA1MHP2vDufyzyMg0slZkH9o/9w==","signatures":[{"sig":"MEYCIQCeIbeaapVGONraTrE+c6JFhF88+FWc7jLkcepx2hRopgIhAPdbuBY79P8V+VBP4ifcADntNPf9bPlbaqU76cullEsa","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34061},"main":"index.js","type":"module","gitHead":"3bd4f77e2d4e86b78820829724db37927ec5daf2","scripts":{"test":"jest"},"_npmUser":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"10.9.0","description":"rich json validator","directories":{},"_nodeVersion":"22.11.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.1.2_1735457529988_0.3193286283641077","host":"s3://npm-registry-packages-npm-production"}},"1.2.0-beta.0":{"name":"perfect-payload","version":"1.2.0-beta.0","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"581af72c2da59f16fb1a5a6b4a74fa8f92d93da0","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.0-beta.0.tgz","fileCount":6,"integrity":"sha512-gJVDH0yA+CcbXSSfwKB91I1RBkjrG/VR0J0bal1RuMunxRkIl+hT1eoYtM2Rsqpa8wRPZaOCzGcelwKDVElnlw==","signatures":[{"sig":"MEUCIGkMw3bFXYAwZa02ZijA4/NYohZHDys9Kpjmppcxu2v5AiEA1Iu5dsjNSOygGFlJcd48drHIJLpZP9TR5ADxvFWZmm4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76550},"main":"index.js","type":"module","gitHead":"000f040bcca4e6fee1428d02af6fe35cbbb50641","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"rich json validator","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.0-beta.0_1789390282846_0.08417963207707868","host":"s3://npm-registry-packages-npm-production"}},"1.2.0-beta.1":{"name":"perfect-payload","version":"1.2.0-beta.1","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.0-beta.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"9f7f8543ce6430598166331325734e536baa964b","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.0-beta.1.tgz","fileCount":6,"integrity":"sha512-2Iv6qSpFffYXk8eOgqwAKrP7R+uehZ30yfDV/JcXtpWp4Dr6Rzd3ZWJkGdACajEa0GrHGdwarVIy1H4rsFOlPQ==","signatures":[{"sig":"MEQCIHTP24sWK84eZAu7eDnZ5d36a1OsA6px1gO1qiuK51rWAiAt9NtSvFTeZl9JI9HaLsQKTs40aspO1HSER/JAqDlVDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.0-beta.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76613},"main":"index.js","type":"module","gitHead":"383368bd6f5589eb109ae58b9a14a12674e1d855","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"rich json validator","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.0-beta.1_1789451183254_0.18482653510532043","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"perfect-payload","version":"1.2.0","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"a262aace54e0ad1bec6b9f6c2485084c0add4c47","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.0.tgz","fileCount":6,"integrity":"sha512-G+tE2QGK5qJZFD01PNxIgCOmNPaU8aiHn2cS+6sbpZsfOyqixzi6PKUMa16c5F2x3s6sx02S7dt7q8cJ6CIfwg==","signatures":[{"sig":"MEYCIQCLo4VpMGYW6YMgOaB5TM22jNzms3Nc0aVp+YxLnMYQ5gIhAM6eyUMKsfFmvSsG0FCnK8vzPm60xmfcEijjBAh4RUn/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76603},"main":"index.js","type":"module","gitHead":"1878b5826ff7213ee5e5626fce4973525bdc4bcd","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"rich json validator","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.0_1789452355214_0.44659570084549594","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"perfect-payload","version":"1.2.1","keywords":["validation","payload","api","data","request-body","response","express","validate"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"b6013cc0b290d0d0d033225052649e9d928d918d","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.1.tgz","fileCount":6,"integrity":"sha512-fhD8NmxFH+Q4B1+AyvE9RgmEWzK6ZSiSnVq1RnMGrjDyTLM+FbIX4v8JjdK2caLW+xjPtXRCgnFNnkgZWTSl4g==","signatures":[{"sig":"MEYCIQC9tGsAZFmpGc49krKaIhfuliCYBSJh59vBAmQqViMegAIhAK3gEix63Voumcb6CH1EDGMsEackRGc4icF6dg7DHmla","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76157},"main":"index.js","type":"module","gitHead":"da3d858362ad70f3a84f29e80b092144c2eed963","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"rich json validator","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.1_1789455246622_0.6565877449138049","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"perfect-payload","version":"1.2.2","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.2","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"1e0a782c8de6bdacf0aa4baa61bc0524e86f423f","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.2.tgz","fileCount":6,"integrity":"sha512-RkwpcPCrxO1IAeWKy6U1aVs0VV92OPBhNR7SJdpNTPuCgAwuqhsO5I/dn2SSztSoyLF0/duzRuoM8NOi+lsV6A==","signatures":[{"sig":"MEQCID6fSBziEG0kk8/kWBJetjwash5A6QJNI8q+U/UeHIrMAiA+LuktFSTGRyhLz4bAuPUXIbA6B9KIuQ5ZqrvVt39OXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76492},"main":"index.js","type":"module","gitHead":"d8baabeb03da879fd06771840317d546f8cff7ab","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.2_1789458373224_0.9551252323899686","host":"s3://npm-registry-packages-npm-production"}},"1.2.2-beta.0":{"name":"perfect-payload","version":"1.2.2-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.2-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"12203014e2d7e825d03f2f88a8ebf7231feb54c2","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.2-beta.0.tgz","fileCount":6,"integrity":"sha512-GHhxLV0wTcDg3hjb7NA3WE1vCA9mTOeMEl5nlEOsnZo5CdIKfsKSxw+OyRFdpij9QN/XBgPgWnJ/POFbAZhAig==","signatures":[{"sig":"MEUCIBXTzrOsoo2RlIDkEmCU5PVCLubZa5HJJFaoAyVtrwBxAiEAlXuDYOlZIXSLe0PJBvnU7dDqTJ2ZYuFwpFw4/xnivAI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.2-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82816},"main":"index.js","type":"module","gitHead":"8db515406aa462b226ee7e34ead5ce05bf2e8c2d","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.2-beta.0_1789462560415_0.3879741537063355","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"perfect-payload","version":"1.2.3","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.2.3","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"0857b94b837d928db1b0a7ae679b71bde1b61d75","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.2.3.tgz","fileCount":6,"integrity":"sha512-mxX5PkLeeQkk/lDlMh68mg/kZTKukc92ozbht7hUPbJ/P/AKpjYx0tfS6Reh/kFDFNNXiluwFPBvcbw/yx3RNg==","signatures":[{"sig":"MEUCIQDgyTq4reCIb1kOwbn4RbxRj1kRKKlgYeE9sZWlyhGKXAIgDn37kaUcaER4lwfUH2KTcazVlF1RH+bMBT1U2m8oyMU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":82809},"main":"index.js","type":"module","gitHead":"5837f35e570a970c1bf63a5e5d1500362cf01c38","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.2.3_1789464660644_0.9448025476648656","host":"s3://npm-registry-packages-npm-production"}},"1.3.0-beta.2":{"name":"perfect-payload","version":"1.3.0-beta.2","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.3.0-beta.2","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"de76275b742eda79531ee2b3e2b9904b33b9cd27","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.3.0-beta.2.tgz","fileCount":6,"integrity":"sha512-xC1P5/RSWRvOB/SBaKDenx4/v8ffhAvPnKPv/O5Cmpukn6COMvIdy1adCeGEUlCbFeY4sJxKM/5XmURsl6TSDQ==","signatures":[{"sig":"MEYCIQDjTaM1ZzmVyltJ/ZDnXPTVHmqELUUOb4KksyPshm7YfQIhAOlo33yJC6FNnbbuHFhzOQ+rdM/Pdm6M4Ib3YGseruwi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.3.0-beta.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85716},"main":"index.js","type":"module","gitHead":"4c86669c636c3f47eeb18869dbe94c8fd90551ff","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.3.0-beta.2_1789542626502_0.16272841255920634","host":"s3://npm-registry-packages-npm-production"}},"1.4.0-beta.0":{"name":"perfect-payload","version":"1.4.0-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.4.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"1c2dd4593d46e6ff7724426f4d2ce9f33418e913","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.4.0-beta.0.tgz","fileCount":6,"integrity":"sha512-mhAwtOA1XB/6hQkqPGv9d/ei3P/XzsC62YKuFk7yFQ4GUqror25UGIQ9QnVt4hei7CeN6XoKYRG9l4xClMkjdg==","signatures":[{"sig":"MEYCIQCTUGjFsN69GDp0aKMAsBAXx2ADegSo2ywWefe8+xnuCAIhANfvebTlsn7QA63Q7yjdwiOBLdMN9mKDxQ70KdLh8faj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.4.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92928},"main":"index.js","type":"module","gitHead":"1aee6cfd9f86d33b7362421dba96b99b093f809f","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.4.0-beta.0_1789549750919_0.7975880441390855","host":"s3://npm-registry-packages-npm-production"}},"1.5.0-beta.0":{"name":"perfect-payload","version":"1.5.0-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.5.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"bddc5e7a3d3bdb3534f5a9089245a01ed96c536a","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.5.0-beta.0.tgz","fileCount":6,"integrity":"sha512-Ku9ALrHdqOU+VYmVTXMJDscK/QZbKkyqXD3cXErbqQWdZAawAaPeNlTI8ZX+AHboUkkr4IMCqX+1X1Zqz9QG7w==","signatures":[{"sig":"MEUCIHfqu9JF4hATnDueoOnSmSt4tzwfRJBrBkfM6TAzpJdcAiEAxVxmwu2Oi0tbZ94DSp7poe0c3Jd/J1zKZcOnQuweaDM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.5.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98179},"main":"index.js","type":"module","gitHead":"e7c581d24d71795697b4afd6bfe79027428bd172","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.5.0-beta.0_1789587811191_0.34819794614783883","host":"s3://npm-registry-packages-npm-production"}},"1.5.0-beta.1":{"name":"perfect-payload","version":"1.5.0-beta.1","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.5.0-beta.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"eb59a2703e649c558d42810b350664a601c64d7b","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.5.0-beta.1.tgz","fileCount":4,"integrity":"sha512-lCTswRTtteOzC7ZTz2+VXVoAcJ6qGAowoKAqSZLAalKU6xX6TaQJLKALn87YQJRqYQGTd9rVX1Q6eGp0w/U6Bg==","signatures":[{"sig":"MEYCIQCbDKZKM4be8QKS6rWCzdgOHOgWCi0FxQXIAihromhgqAIhAK99IL1DrrGrfvnzS54DK9Fh0czso5V6scDwZWL+mRQp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.5.0-beta.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":88344},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"bd2fedda8b95239c36c8ac48fb55264e7df70433","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.5.0-beta.1_1789590116379_0.45599105681686813","host":"s3://npm-registry-packages-npm-production"}},"1.6.0-beta.0":{"name":"perfect-payload","version":"1.6.0-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.6.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"f1a6d9fdfa04d619656ba79137989f7c12ffec55","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.6.0-beta.0.tgz","fileCount":4,"integrity":"sha512-/NBpcpa7S0FlR+8Jf9QR2gav413+3c4GUnrLBuIhPw+7dUvttiuB802IFqWK/pEV3uE/IYjb5MNsqB148fZCSQ==","signatures":[{"sig":"MEYCIQCXJDhCBslRG6Ues43ehzxC1Kjqga4QKabFSMEPvEOWZgIhAIKVvhTMEVoawyGGuCrg7v2Pv8ImA7iTa8WsXyHCXHr1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.6.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":99518},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"de643a15eae7418429d6e8a33da305ba6627d043","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.6.0-beta.0_1789632687636_0.8123690472976897","host":"s3://npm-registry-packages-npm-production"}},"1.7.0-beta.0":{"name":"perfect-payload","version":"1.7.0-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.7.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"f3c6579f6bf6edb55fea6a5399f43c2f318340a9","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.7.0-beta.0.tgz","fileCount":4,"integrity":"sha512-6bN7CTkhqBQrVkKCqQ1t3rxVasXIkGmdjLB/SHaQ39RdVMxvlLsisxHN+XShTRmt+GWxtQfelkVYLQuHFboiAA==","signatures":[{"sig":"MEUCIQDyZ7qDogpgqhSayok5Z98ANdwzRT2q233OttFfnxWpxQIgPcVxADfKM1+6XvjjAhndUkKFVZrizP07hse+xZM6uyc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.7.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":109981},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"1e24afeba1cda7903d50af65993828e11d0737ae","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.7.0-beta.0_1789661278455_0.046332628897556516","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"perfect-payload","version":"1.3.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.3.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"9c1f5e4d38c7253cb6c527dcf40248fec776df4c","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.3.0.tgz","fileCount":6,"integrity":"sha512-sbGcvoHy2yKs6nLf7SP/Aa7jgJ4Rz9biNdcFVkjP4OUHv7O4VhRcewzkD2w7rSdKFe40AmQwRbA0RvLWjcOhrw==","signatures":[{"sig":"MEUCIQDPEl4a+VIGGug9/aeoGVta7FYBv4jkVEDACw7hU/BO3wIgS5akFV7S9G1zTF9AdUAJLgDs5sBpOmL2NBLMrczoNkg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85709},"main":"index.js","type":"module","gitHead":"2460b41350855e0d4d03ebfd7db615b67da0a090","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.3.0_1789661918664_0.7239666282544448","host":"s3://npm-registry-packages-npm-production"}},"1.7.0-beta.1":{"name":"perfect-payload","version":"1.7.0-beta.1","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.7.0-beta.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"cae941aa117658054d4a8feafba2af2c5f27259c","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.7.0-beta.1.tgz","fileCount":4,"integrity":"sha512-dhiXAHmDDGo8QQa3BU1Tfx7/mD+5ts1QyIbOC5wRtrBjpbUVGyfuXo54D0xgKQ05OFa48SoziRcVyCIbl82vRA==","signatures":[{"sig":"MEUCIQC4LoDzd8iDi9gucvOkPkgAc3kewu4aoKpUFiZWIM9EiQIgJD3Rq0WrrSxW6dkQbljpdZ+GpZ23kBIlsbWmJi2/TY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.7.0-beta.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":110161},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"54379108fff3017a68b1d867897217f389646e14","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.7.0-beta.1_1789667897648_0.9718540639703364","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"perfect-payload","version":"1.4.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.4.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"79ae2a41e00f08ec011489dc5fc71dd78ee58313","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.4.0.tgz","fileCount":6,"integrity":"sha512-563cqT/cUdRGNFfbh9HPXtHr3l9g9JUIH8F5NeINh4GbP/65SocArGZGtKeSGo5th1wQu66QPX8UXuWO6Rugrw==","signatures":[{"sig":"MEUCIQCRPFpmI3OMoQ2NXu3+hR0X0YiC7Zkn2YC4tNZBGy/ygQIgJbBw6tdY/DSAVVfH0BNPje+CT3W5zTimPuJjDUOS3N8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92921},"main":"index.js","type":"module","gitHead":"54b868298bd6790ced40d407eecebb298741c79c","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.4.0_1789745324053_0.8617314113627446","host":"s3://npm-registry-packages-npm-production"}},"1.8.0-beta.0":{"name":"perfect-payload","version":"1.8.0-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.8.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"297faf333f5a2ac13c9026e23aa8039169ad8a3a","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.8.0-beta.0.tgz","fileCount":7,"integrity":"sha512-vTDHFoh1azB/vYgO+B8sDoCfWdZf+kdM+we8GFFdJSn4E/cIrTlARbejuYDi1yFxZa9Z50UWdKRYQZclblk/gw==","signatures":[{"sig":"MEUCIDEb2L2zr+I/+C7CllFdsr+aYxjroXTCpFVXfHCzUTidAiEAjL59542JntQZsejfZrmOyry+q4mldgS0u90MLADwajw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.8.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129062},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","exports":{".":"./index.js","./express":"./express.js","./fastify":"./fastify.js"},"gitHead":"2531f380cb3bcd271a3ab272f28408b9b4028878","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.8.0-beta.0_1789842611599_0.8596323814258533","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.0":{"name":"perfect-payload","version":"2.0.0-beta.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@2.0.0-beta.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"71596d38e532c773e5f6eec8eb5aa385693a6364","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-2.0.0-beta.0.tgz","fileCount":3,"integrity":"sha512-ahLfNbRDSpo3yr6zDfpQsK+HyAaFgErJ0aEceYq67ywqzu3UeDMA8Nb/8GwHaeCA5igtj2wKjr0gghRsGZn3+w==","signatures":[{"sig":"MEYCIQCGpbtrgLLxgUS97p11fJDZuPqc28laa4d3aVASCjvOiQIhAIa6p5hKmjckaITOlCQ3Ul1RCrQ4oHHTzIxgQNuht0n/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@2.0.0-beta.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63801},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./fastify":{"types":"./dist/fastify.d.ts","import":"./dist/fastify.js"}},"gitHead":"b05d37dd2ff9eb51ec51a3a8db27ed018aa616b5","scripts":{"test":"jest","build":"tsc","test:types":"tsc type-test.ts --noEmit --strict --module NodeNext --moduleResolution NodeNext --target ES2022 --ignoreConfig --skipLibCheck"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","express":"^5.2.1","fastify":"^5.12.5","babel-jest":"^29.7.0","typescript":"^7.0.2","@babel/core":"^7.25.2","@types/node":"^26.6.2","@types/express":"^5.0.6","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_2.0.0-beta.0_1789843389785_0.7431606774161204","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"perfect-payload","version":"1.5.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.5.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"2d321596aef6e72fa967ad138c89ec1c536a2337","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.5.0.tgz","fileCount":4,"integrity":"sha512-MEXagoOUlQBU4G6HJ1jwFKwgF9Q3v1JgvF0XSD0vBbO9j3zXpxDXpXyrQqDG5MmLcjV3GGVNp328BEK54LrYVA==","signatures":[{"sig":"MEUCIQC+nMsvWGHpcZpNO1RXvHSuYpbaLOWpNg5MpSdjmeW7DQIgTa7RDUuPribinuuBXMhaUd0gEHLT78E1bBHvM1Zw9Ic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":88337},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"dfa70934738ea08fa63e2809ababcc03cae55d45","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.5.0_1789881373049_0.4179875738049057","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.1":{"name":"perfect-payload","version":"2.0.0-beta.1","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@2.0.0-beta.1","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"f0693227da497d3daf906552912bf4486a961fbe","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-2.0.0-beta.1.tgz","fileCount":21,"integrity":"sha512-X4Dqro0PZ+Kl5SvyVyyg9YKfxkK9bSW02GsvwTyXBgG9x7w9Nd6FbxdU1e3HeiFlSj4/qBvUUZ+NFdx16uUNbw==","signatures":[{"sig":"MEUCIQDZOrxLa6LIXWwxcbTkU+OMEjBRAZEmhh03iJdV7eTuMAIgV8DhXisfDwmIV2GUVSoFouYpjr/quCqyz+Facb4sONo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@2.0.0-beta.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":146897},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js"},"./fastify":{"types":"./dist/fastify.d.ts","import":"./dist/fastify.js"}},"gitHead":"ae455e790e70f5bf649f68576c6e93c30602e9d7","scripts":{"test":"jest","build":"tsc","test:types":"tsc type-test.ts --noEmit --strict --module NodeNext --moduleResolution NodeNext --target ES2022 --ignoreConfig --skipLibCheck"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","express":"^5.2.1","fastify":"^5.12.5","babel-jest":"^29.7.0","typescript":"^7.0.2","@babel/core":"^7.25.2","@types/node":"^26.6.2","@types/express":"^5.0.6","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_2.0.0-beta.1_1789893081879_0.9234328764817359","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.2":{"name":"perfect-payload","version":"2.0.0-beta.2","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@2.0.0-beta.2","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"e4b37171d5e46eda89b40f9f6ef739a8ad5d5448","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-2.0.0-beta.2.tgz","fileCount":21,"integrity":"sha512-dlg7Vx6Yuhim+RtQJILh3WZ1Xo4kHtBJMKp8DumGSlk4x0aLJf7X0XLkqFmwF7gBdJf5KgSQ0LhK7A4gNVISWQ==","signatures":[{"sig":"MEYCIQCbRrD3FjcA0MetJ5kYXuCZ/WvAO48M3o/7wZVZwskDjAIhAMawolGeKX+hw3upsSyU/bxg0RVCKLhrIWkk3xXxxPeG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@2.0.0-beta.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":147009},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js","default":"./dist/express.js"},"./fastify":{"types":"./dist/fastify.d.ts","import":"./dist/fastify.js","default":"./dist/fastify.js"}},"gitHead":"21969282a673abe802df3ad08a20b6cc514d770b","scripts":{"test":"jest","build":"tsc","test:types":"tsc type-test.ts --noEmit --strict --module NodeNext --moduleResolution NodeNext --target ES2022 --ignoreConfig --skipLibCheck"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","express":"^5.2.1","fastify":"^5.12.5","babel-jest":"^29.7.0","typescript":"^7.0.2","@babel/core":"^7.25.2","@types/node":"^26.6.2","@types/express":"^5.0.6","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_2.0.0-beta.2_1789907483428_0.7549635318616306","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.3":{"name":"perfect-payload","version":"2.0.0-beta.3","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@2.0.0-beta.3","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"1daeb5063827a93b1142c355997de67a333fe780","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-2.0.0-beta.3.tgz","fileCount":21,"integrity":"sha512-QCn5oZCejvS1l2l/5/kxq/JHIrhOXiCOdkiZwDNqonmDn2XlKT05OTt+mU0YsAmJBwNHpx6w0cNRpSKaCmu5MQ==","signatures":[{"sig":"MEYCIQD8shj8YD3yObrvKrHxmq83r8cmMQ1fB/9Aqq4NwLRo8gIhAPgXOUgABz8vlwhM0diVzXNiuCTtGrSiBm1yrEeAoYw+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@2.0.0-beta.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":147172},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js","default":"./dist/express.js"},"./fastify":{"types":"./dist/fastify.d.ts","import":"./dist/fastify.js","default":"./dist/fastify.js"}},"gitHead":"8c7a249f5747f6f540a32a37ea331662659d3a2f","scripts":{"test":"jest","build":"tsc","test:types":"tsc type-test.ts --noEmit --strict --module NodeNext --moduleResolution NodeNext --target ES2022 --ignoreConfig --skipLibCheck"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","express":"^5.2.1","fastify":"^5.12.5","babel-jest":"^29.7.0","typescript":"^7.0.2","@babel/core":"^7.25.2","@types/node":"^26.6.2","@types/express":"^5.0.6","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_2.0.0-beta.3_1790005366320_0.9584537306747241","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"perfect-payload","version":"1.6.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.6.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"7f35e6c91e54a95727babb7c90dbf72b24721857","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.6.0.tgz","fileCount":4,"integrity":"sha512-W9rApA3amLN7ZaUzUxBUY+aefzr9hPsd5d2U3g0buaeYWuPqw6AcEBOdApuAS8KXBZtrS3jU99LgpAxXD99jwQ==","signatures":[{"sig":"MEUCIQDcVhbJ5YThkFDqOFFEI2BuZguh/Myk1P2rSigKVJAhMAIgKlSjD435cC1ca9kYFWabvKpnzP9sL0WZ1nw7Hkk27YU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":99511},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"c73987cca0dcdef97e3a7ad06132189803508fee","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.6.0_1790007160276_0.1172313992486067","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"perfect-payload","version":"1.7.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.7.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"fffc0a30319c01af9e7554309385e2e28a6251f6","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.7.0.tgz","fileCount":4,"integrity":"sha512-M2zLVum4VpQG3+gbNmlzC2SFb0nXzl79kr29Qi5p3WBBBj6rLsq6jMJ6U3LmOZd9EZG6ZdpIm/JdG9s50Vd+Lg==","signatures":[{"sig":"MEUCIQCwnl9p8tMtllwk7aCN0ex8xMAMZ1kp5uZSww017WjvIAIgYGFBFtDr9+6E/kObXeP0bBRIg3rOk5PX6t+pGJOKuP4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":110154},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","gitHead":"c190aea0f606b70f108a44082562f8a8cb6895db","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.7.0_1790276319966_0.19292630191808424","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.4":{"name":"perfect-payload","version":"2.0.0-beta.4","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@2.0.0-beta.4","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"1b49db66e2930c9e65c514298919026b5551ddea","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-2.0.0-beta.4.tgz","fileCount":21,"integrity":"sha512-2xxgiBWGdf1ooYzOnc+S8/63IBEoh+EAfKt7VXQzTi618b5s0eMTtE22BggA88Z9oU6N+MjK3fzupSPzvpv/tQ==","signatures":[{"sig":"MEYCIQCVu1kXjdwT5kaMQpCCjQj4kDYHdS5Ww2wssBX6B7ncUQIhAO5UrF4zMlYulUj3UtysUpNxoz963vFpetn6jp14Qd5i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@2.0.0-beta.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":147923},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js","default":"./dist/express.js"},"./fastify":{"types":"./dist/fastify.d.ts","import":"./dist/fastify.js","default":"./dist/fastify.js"}},"gitHead":"0e94fd8813e06e0f7d9acc13dfd57a27d0f8e57c","scripts":{"test":"jest","build":"tsc","test:types":"tsc type-test.ts --noEmit --strict --module NodeNext --moduleResolution NodeNext --target ES2022 --ignoreConfig --skipLibCheck"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","express":"^5.2.1","fastify":"^5.12.5","babel-jest":"^29.7.0","typescript":"^7.0.2","@babel/core":"^7.25.2","@types/node":"^26.6.2","@types/express":"^5.0.6","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_2.0.0-beta.4_1790446579872_0.9014653633999481","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"perfect-payload","version":"1.8.0","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"author":{"name":"Kiran Poojary"},"license":"ISC","_id":"perfect-payload@1.8.0","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"c9e5f4b69e6c806db9286e6e9088c2c8d0e65104","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-1.8.0.tgz","fileCount":7,"integrity":"sha512-v3u2TZ0+mzEIIUsA4F5Zz0jYWfvTaDGqm6d5rsglA1Dppk3rANbC1wFpUvYBV/TxF/AqPEHRpKfOwTGVcrJF5Q==","signatures":[{"sig":"MEUCIE9htwB/MOhSIfiP0c2erCgOmmDMR9ArTKrJz0Bp9TDbAiEAsyAkUY0tvDl/sVHFYHesYySS3YyUbpjZZZ270DLrDQo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129055},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"index.js","type":"module","exports":{".":"./index.js","./express":"./express.js","./fastify":"./fastify.js"},"gitHead":"6d1b6882037183b77ee1d434dd98378af7c5e931","scripts":{"test":"jest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"}},"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","babel-jest":"^29.7.0","@babel/core":"^7.25.2","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"tmp":"tmp/perfect-payload_1.8.0_1790451179848_0.34820247595671683","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"_id":"perfect-payload@2.0.0","bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"dist":{"shasum":"84865a1a555ea753f38369786e3778d17446881e","tarball":"https://registry.npmjs.org/perfect-payload/-/perfect-payload-2.0.0.tgz","integrity":"sha512-LmCRH7ylxCl+w1qv3W2fKaHoa9fXtLeN1BS16ouwa7Uzzw5jdqYsxDoz7K+wpSu0JalfP6kAA3YfKi/5I9QamQ==","fileCount":21,"unpackedSize":153044,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/perfect-payload@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBUr0WEHE9WfQLU4m30Fmk3WE3Yr0SP48zpXHn4gzqhYAiEAokaTqhkObQWVqRYDPgbN4Uhl9PSwrsVlAR7LxXExS0s="}]},"jest":{"testPathIgnorePatterns":["/node_modules/","/test.js","/testingV1.js"]},"main":"./dist/index.js","name":"perfect-payload","type":"module","types":"./dist/index.d.ts","author":{"name":"Kiran Poojary"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./express":{"types":"./dist/express.d.ts","import":"./dist/express.js","default":"./dist/express.js"},"./fastify":{"types":"./dist/fastify.d.ts","import":"./dist/fastify.js","default":"./dist/fastify.js"}},"gitHead":"9812de47706171b3ed9f07e6fed1f206b04f8c36","license":"ISC","scripts":{"test":"jest","build":"tsc","test:types":"tsc type-test.ts --noEmit --strict --module NodeNext --moduleResolution NodeNext --target ES2022 --ignoreConfig --skipLibCheck"},"version":"2.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ffe39cef-12a1-4b02-b034-ac4a04b4fa25"},"approver":{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}},"homepage":"https://github.com/kiranpoojary/perfect-payload#readme","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"_npmVersion":"11.19.1","description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","directories":{},"maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","devDependencies":{"jest":"^29.7.0","express":"^5.2.1","fastify":"^5.12.5","babel-jest":"^29.7.0","typescript":"^7.0.2","@babel/core":"^7.25.2","@types/node":"^26.6.2","@types/express":"^5.0.6","@babel/preset-env":"^7.25.4"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/perfect-payload_2.0.0_1790495894974_0.5157986515630546"},"_hasShrinkwrap":false}},"time":{"created":"2024-09-01T13:29:07.246Z","modified":"2026-09-27T07:58:15.380Z","1.0.0":"2024-09-01T13:29:07.395Z","1.0.1":"2024-09-01T14:05:32.440Z","1.0.2":"2024-09-01T15:31:42.502Z","1.0.3":"2024-09-01T15:35:22.799Z","1.0.4":"2024-09-01T16:04:38.272Z","1.0.5":"2024-09-01T16:07:11.887Z","1.0.6":"2024-09-05T17:16:46.821Z","1.0.7":"2024-09-06T15:07:41.258Z","1.0.8":"2024-09-06T16:40:17.973Z","1.0.9":"2024-12-29T06:25:51.749Z","1.1.0":"2024-12-29T06:56:20.879Z","1.1.1":"2024-12-29T07:17:20.131Z","1.1.2":"2024-12-29T07:32:10.169Z","1.2.0-beta.0":"2026-09-14T12:51:22.931Z","1.2.0-beta.1":"2026-09-15T05:46:23.322Z","1.2.0":"2026-09-15T06:05:55.320Z","1.2.1":"2026-09-15T06:54:06.733Z","1.2.2":"2026-09-15T07:46:13.306Z","1.2.2-beta.0":"2026-09-15T08:56:00.488Z","1.2.3":"2026-09-15T09:31:00.746Z","1.3.0-beta.2":"2026-09-16T07:10:26.590Z","1.4.0-beta.0":"2026-09-16T09:09:11.005Z","1.5.0-beta.0":"2026-09-16T19:43:31.272Z","1.5.0-beta.1":"2026-09-16T20:21:56.461Z","1.6.0-beta.0":"2026-09-17T08:11:27.744Z","1.7.0-beta.0":"2026-09-17T16:07:58.559Z","1.3.0":"2026-09-17T16:18:38.773Z","1.7.0-beta.1":"2026-09-17T17:58:17.732Z","1.4.0":"2026-09-18T15:28:44.151Z","1.8.0-beta.0":"2026-09-19T18:30:11.686Z","2.0.0-beta.0":"2026-09-19T18:43:09.880Z","1.5.0":"2026-09-20T05:16:13.134Z","2.0.0-beta.1":"2026-09-20T08:31:21.954Z","2.0.0-beta.2":"2026-09-20T12:31:23.511Z","2.0.0-beta.3":"2026-09-21T15:42:46.404Z","1.6.0":"2026-09-21T16:12:40.342Z","1.7.0":"2026-09-24T18:58:40.052Z","2.0.0-beta.4":"2026-09-26T18:16:19.964Z","1.8.0":"2026-09-26T19:32:59.949Z","2.0.0":"2026-09-27T07:58:15.073Z"},"bugs":{"url":"https://github.com/kiranpoojary/perfect-payload/issues"},"author":{"name":"Kiran Poojary"},"license":"ISC","homepage":"https://github.com/kiranpoojary/perfect-payload#readme","keywords":["payload-validation","request-validation","nodejs-validation","javascript-validation","api-validation","object-validation","json-validation","schema-validation","express-validation","fastify-validation","validator","payload","api","data","request-body","express"],"repository":{"url":"git+https://github.com/kiranpoojary/perfect-payload.git","type":"git"},"description":"Lightweight JSON payload validation library with structured errors, nested validation, field paths, and customizable validation rules.","maintainers":[{"name":"kiranpoojary","email":"kiranpoojary483@gmail.com"}],"readme":"# perfect-payload\n\nA lightweight JavaScript library for validating, transforming, and sanitizing API and JSON payloads. `perfect-payload` provides structured validation errors, exact nested field paths, synchronous and asynchronous custom validation, transformations, nested object/array validation, unknown-field handling, and ready-to-use Express and Fastify integrations. The package is designed to stay simple and lightweight, with no Express or Fastify runtime dependency.\n\n## Highlights\n\n- Lightweight, rule-based payload validation\n- TypeScript-first package with built-in declarations — no separate `@types/perfect-payload`\n- Structured errors with stable machine-readable error codes\n- Exact nested paths such as `profile.email` and `products[1].quantity`\n- Recursive `objectAttr` and `elementConstraints` validation\n- Array constraints with `minItems` and `maxItems`\n- Built-in `trim`, `lowercase`, and `uppercase` transformations\n- Custom synchronous `transform(value, payload)`\n- Array-element transforms with `transform(value, index, payload)`\n- Deterministic validation precedence independent of rule-property order\n- Synchronous custom validators with `perfectPayload()`\n- Synchronous or asynchronous custom validators with `perfectPayloadAsync()`\n- Configurable unknown-field handling: `strip`, `allow`, or `reject`\n- Optional simplified errors with `prettyErrors`\n- Express middleware integration\n- Fastify hook integration\n- Validate `headers`, `params`, `query`, and `body`\n- Aggregated validation errors across request sources\n- Framework-aware error paths such as `body.email` and `params.userId`\n- Transformed values returned through `validatedPayload`\n- Original input payload/request data is not mutated\n- Zero Express or Fastify runtime dependency\n- Legacy `perfectPayloadV1()` retained during the migration period\n\n## Quick Links\n\n- [Installation](#installation)\n- [Basic Usage](#basic-usage)\n- [Public API](#public-api)\n- [TypeScript](#typescript)\n- [Options](#options)\n- [Pretty Errors](#prettyerrors)\n- [Express Integration](#express-integration)\n- [Fastify Integration](#fastify-integration)\n- [Framework Request Validation](#framework-request-validation)\n- [Unknown Field Handling](#unknown-field-handling)\n- [Synchronous vs Asynchronous Validation](#synchronous-vs-asynchronous-validation)\n- [Validation Rules](#validation-rules)\n- [Validation Precedence](#validation-precedence)\n- [Array Size and Nested Validation](#array-size-and-nested-validation)\n- [Transformations and Sanitization](#transformations-and-sanitization)\n- [Custom Validators](#customvalidator)\n- [Asynchronous Validation](#asynchronous-validation)\n- [Error Codes](#error-codes)\n- [Custom Error Messages](#custom-error-messages)\n- [Nested Objects and Array Field Paths](#nested-objects-and-array-field-paths)\n- [Examples and Usage](#examples-and-usage)\n- [Legacy API](#legacy-api)\n\n## What's New in v2.0.0\n\nv2.0.0 establishes the stable TypeScript-first architecture for `perfect-payload` while keeping the package lightweight and framework-independent.\n\nMajor v2 additions and hardening include:\n\n- Built-in TypeScript declarations generated from the source — no separate `@types/perfect-payload` package.\n- Public validation types such as `ValidationRules` and `ValidationOptions`.\n- Structured validation errors with stable `path`, `code`, and `message` fields.\n- `prettyErrors` for consumers that prefer a simple string array.\n- Recursive unknown-field handling with `strip`, `allow`, and `reject`.\n- Exact nested and indexed paths across `objectAttr` and `elementConstraints`.\n- Synchronous transforms with a complete root-payload context.\n- Array-element transforms with `(value, index, payload)`.\n- Deterministic validation precedence that does not depend on the order in which rule properties are written.\n- `perfectPayloadAsync()` with async `customValidator` support and sync-error pruning.\n- Lightweight Express and Fastify adapters for `headers`, `params`, `query`, and `body`.\n- Framework-aware generated error paths/messages while preserving custom error messages exactly as configured.\n- Legacy `perfectPayloadV1()` retained during the migration period.\n\n## Express Integration\n\n`perfect-payload` provides a lightweight Express adapter so request validation can be added directly as middleware. Express is **not** installed as a dependency of `perfect-payload`.\n\n### Import\n\n```js\nimport { validatePayload, validatePayloadAsync } from \"perfect-payload/express\";\n```\n\n### Validate Request Body\n\nUse `validatePayload()` when your validation rules are synchronous.\n\n```js\nimport express from \"express\";\nimport { validatePayload } from \"perfect-payload/express\";\nconst app = express();\napp.use(express.json());\nconst userRules = {\n  email: {\n    mandatory: true,\n    type: \"email\",\n    trim: true,\n    lowercase: true,\n  },\n  age: {\n    mandatory: true,\n    type: \"number\",\n    min: 18,\n  },\n};\napp.post(\n  \"/users\",\n  validatePayload({\n    rule: {\n      body: userRules,\n    },\n  }),\n  (req, res) => {\n    const user = req.validatedPayload.body;\n    res.json({\n      message: \"User created\",\n      user,\n    });\n  },\n);\n```\n\nWhen validation succeeds, the middleware calls `next()` and makes the processed payload available at:\n\n```js\nreq.validatedPayload;\n```\n\nFor the example above:\n\n```js\nreq.validatedPayload = {\n  body: {\n    email: \"kiran@example.com\",\n    age: 29,\n  },\n};\n```\n\nThe original `req.body` is not mutated.\n\n### Validate Multiple Request Sources\n\nThe adapter can validate `headers`, `params`, `query`, and `body` together.\n\n```js\napp.post(\n  \"/users/:userId\",\n  validatePayload({\n    rule: {\n      headers: {\n        authorization: {\n          mandatory: true,\n          type: \"string\",\n        },\n      },\n      params: {\n        userId: {\n          mandatory: true,\n          type: \"string\",\n        },\n      },\n      query: {\n        notify: {\n          type: \"boolean\",\n        },\n      },\n      body: {\n        email: {\n          mandatory: true,\n          type: \"email\",\n          trim: true,\n          lowercase: true,\n        },\n      },\n    },\n  }),\n  (req, res) => {\n    const { headers, params, query, body } = req.validatedPayload;\n    res.json({\n      headers,\n      params,\n      query,\n      body,\n    });\n  },\n);\n```\n\nOnly request sources configured inside `rule` are included in `req.validatedPayload`.\n\n### Validation Errors\n\nAll configured request sources are validated and their errors are aggregated.\n\nStructured error paths include the request source:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"body.email\",\n      code: \"INVALID_EMAIL\",\n      message: \"Invalid email format for attribute body.email\"\n    }\n  ]\n}\n```\n\nFor framework-generated default errors, the request source is part of the generated field path/message. Custom messages such as `mandatoryError`, `typeError`, `regexError`, and `customValidatorError` are returned exactly as configured and are not prefixed or rewritten by the adapter.\n\n### Adapter Options\n\nCore options can be passed through the adapter using `options`:\n\n```js\nvalidatePayload({\n  rule: {\n    body: userRules,\n  },\n  options: {\n    unknownFields: \"reject\",\n    prettyErrors: false,\n    inValidPayloadResponse: {\n      statusCode: 422,\n      valid: false,\n      message: \"Request validation failed\",\n    },\n  },\n});\n```\n\n### Async Validation\n\nUse `validatePayloadAsync()` when the schema contains asynchronous `customValidator` functions.\n\n```js\nimport { validatePayloadAsync } from \"perfect-payload/express\";\napp.post(\n  \"/users\",\n  validatePayloadAsync({\n    rule: {\n      body: {\n        username: {\n          mandatory: true,\n          type: \"string\",\n          trim: true,\n          customValidator: async (value) => {\n            return await isUsernameAvailable(value);\n          },\n          customValidatorCode: \"USERNAME_TAKEN\",\n          customValidatorError: \"Username is already taken\",\n        },\n      },\n    },\n  }),\n  (req, res) => {\n    res.json(req.validatedPayload.body);\n  },\n);\n```\n\nUse:\n\n- `validatePayload()` for synchronous validation.\n- `validatePayloadAsync()` when asynchronous `customValidator` functions are required.\n\nValidation failures are handled by the middleware automatically. Unexpected errors from validators, transformations, or configuration are passed to Express through `next(error)`.\n\n## Fastify Integration\n\n`perfect-payload` provides a lightweight Fastify adapter that can be used directly as a route hook. Fastify is **not** installed as a dependency of `perfect-payload`.\n\n### Import\n\n```js\nimport { validatePayload, validatePayloadAsync } from \"perfect-payload/fastify\";\n```\n\n### Validate Request Body\n\nUse the adapter as a Fastify `preValidation` hook:\n\n```js\nimport Fastify from \"fastify\";\nimport { validatePayload } from \"perfect-payload/fastify\";\nconst fastify = Fastify();\nconst userRules = {\n  email: {\n    mandatory: true,\n    type: \"email\",\n    trim: true,\n    lowercase: true,\n  },\n  age: {\n    mandatory: true,\n    type: \"number\",\n    min: 18,\n  },\n};\nfastify.post(\n  \"/users\",\n  {\n    preValidation: validatePayload({\n      rule: {\n        body: userRules,\n      },\n    }),\n  },\n  async (request, reply) => {\n    const user = request.validatedPayload.body;\n    return {\n      message: \"User created\",\n      user,\n    };\n  },\n);\n```\n\nWhen validation succeeds, the processed payload is available at:\n\n```js\nrequest.validatedPayload;\n```\n\nFor the example above:\n\n```js\nrequest.validatedPayload = {\n  body: {\n    email: \"kiran@example.com\",\n    age: 29,\n  },\n};\n```\n\nThe original `request.body` is not mutated.\n\n### Validate Multiple Request Sources\n\nThe adapter can validate `headers`, `params`, `query`, and `body` together.\n\n```js\nfastify.post(\n  \"/users/:userId\",\n  {\n    preValidation: validatePayload({\n      rule: {\n        headers: {\n          authorization: {\n            mandatory: true,\n            type: \"string\",\n          },\n        },\n        params: {\n          userId: {\n            mandatory: true,\n            type: \"string\",\n          },\n        },\n        query: {\n          notify: {\n            type: \"boolean\",\n          },\n        },\n        body: {\n          email: {\n            mandatory: true,\n            type: \"email\",\n            trim: true,\n            lowercase: true,\n          },\n        },\n      },\n    }),\n  },\n  async (request, reply) => {\n    const { headers, params, query, body } = request.validatedPayload;\n    return {\n      headers,\n      params,\n      query,\n      body,\n    };\n  },\n);\n```\n\nOnly request sources configured inside `rule` are included in `request.validatedPayload`.\n\n### Validation Errors\n\nAll configured request sources are validated and their errors are aggregated.\n\nStructured error paths include the request source:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"body.email\",\n      code: \"INVALID_EMAIL\",\n      message: \"Invalid email format for attribute body.email\"\n    }\n  ]\n}\n```\n\nFor framework-generated default errors, the request source is part of the generated field path/message. Custom messages such as `mandatoryError`, `typeError`, `regexError`, and `customValidatorError` are returned exactly as configured and are not prefixed or rewritten by the adapter.\n\n### Adapter Options\n\nCore options can be passed through the adapter using `options`:\n\n```js\nvalidatePayload({\n  rule: {\n    body: userRules,\n  },\n  options: {\n    unknownFields: \"reject\",\n    prettyErrors: false,\n    inValidPayloadResponse: {\n      statusCode: 422,\n      valid: false,\n      message: \"Request validation failed\",\n    },\n  },\n});\n```\n\n### Async Validation\n\nUse `validatePayloadAsync()` when the schema contains asynchronous `customValidator` functions.\n\n```js\nimport { validatePayloadAsync } from \"perfect-payload/fastify\";\nfastify.post(\n  \"/users\",\n  {\n    preValidation: validatePayloadAsync({\n      rule: {\n        body: {\n          username: {\n            mandatory: true,\n            type: \"string\",\n            trim: true,\n            customValidator: async (value) => {\n              return await isUsernameAvailable(value);\n            },\n            customValidatorCode: \"USERNAME_TAKEN\",\n            customValidatorError: \"Username is already taken\",\n          },\n        },\n      },\n    }),\n  },\n  async (request, reply) => {\n    return request.validatedPayload.body;\n  },\n);\n```\n\nUse:\n\n- `validatePayload()` for synchronous validation.\n- `validatePayloadAsync()` when asynchronous `customValidator` functions are required.\n\nValidation failures are handled by the hook automatically. Unexpected errors from validators, transformations, or configuration propagate through Fastify's normal error-handling lifecycle.\n\n### Framework-aware error paths\n\nStructured framework validation errors include the request source:\n\n```js\n{\n  path: \"body.email\",\n  code: \"INVALID_EMAIL\",\n  message: \"Invalid email format for attribute body.email\"\n}\n```\n\nGenerated default errors use source-aware paths such as:\n\n```text\nheaders.x-request-id\nparams.userId\nquery.page\nbody.email\n```\n\nA generated pretty error can therefore look like:\n\n```text\nCustom validation failed for attribute headers.x-test-id\n```\n\nCustom developer-defined messages are preserved exactly. For example:\n\n```js\ncustomValidatorError: \"Invalid x-request-id in headers\";\n```\n\nreturns:\n\n```text\nInvalid x-request-id in headers\n```\n\nThe framework adapter does not prepend `headers.`, `params.`, `query.`, or `body.` to a custom message.\n\n### `prettyErrors`\n\n`prettyErrors` provides a simplified string-error mode. Structured errors remain the default.\n\n```js\nconst result = perfectPayload(payload, rules, {\n  prettyErrors: true,\n});\n```\n\nWith `prettyErrors: true`, the `errors` array contains human-readable message strings instead of structured error objects. `prettyErrors` is also supported by `perfectPayloadAsync()` and the Express/Fastify integrations.\n\n### Error privacy\n\nDefault validation messages do not include submitted payload values. Schema constraints such as allowed enum values, minimums, maximums, and ranges may still appear in validation messages. Custom error messages are controlled by the application and are returned as configured.\n\n### Lightweight framework integrations\n\nExpress and Fastify are **not installed as dependencies of `perfect-payload`**. The framework integrations are thin adapters around the same validation\n\nengine used by:\n\n```js\nperfectPayload();\nperfectPayloadAsync();\n```\n\nThis keeps the package lightweight while allowing framework users to integrate validation without writing their own middleware or hooks.\n\n## Installation\n\n```bash\nnpm install perfect-payload\n```\n\n## Basic Usage\n\nUse `perfectPayload()` for all new implementations.\n\n```js\nimport { perfectPayload } from \"perfect-payload\";\nconst payload = {\n  name: \"Kiran\",\n  email: \"kiran@example.com\",\n  age: 29,\n};\nconst validationRules = {\n  name: {\n    mandatory: true,\n    type: \"string\",\n  },\n  email: {\n    mandatory: true,\n    type: \"email\",\n  },\n  age: {\n    mandatory: true,\n    type: \"number\",\n    min: 18,\n  },\n};\nconst result = perfectPayload(payload, validationRules);\nconsole.log(result);\n```\n\n### Valid Response\n\n```js\n{\n  statusCode: 200,\n  valid: true,\n  validatedPayload: {\n    name: \"Kiran\",\n    email: \"kiran@example.com\",\n    age: 29\n  }\n}\n```\n\nBy default, `validatedPayload` contains only fields defined in the validation schema. Extra payload fields are stripped unless `unknownFields` is explicitly configured as `\"allow\"` or `\"reject\"`. The original input payload is not mutated. (such as validatedBody, sanitisedData or parsedBody).\n\n### Invalid Response\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"email\",\n      code: \"INVALID_EMAIL\",\n      message: \"Invalid email format for attribute email\"\n    }\n  ]\n}\n```\n\nEach error returned by `perfectPayload()` contains:\n\n```js\n{\n  path: \"field.path\",\n  code: \"ERROR_CODE\",\n  message: \"Human readable validation message\"\n}\n```\n\n- `path` identifies the exact field that failed validation.\n- `code` provides a stable machine-readable validation error code.\n- `message` provides a human-readable description of the validation\n\nfailure.\n\n- Submitted payload values are not included in default error messages.\n\n## Public API\n\nFor v2 and all new implementations, both supported APIs use the same clean three-argument signature:\n\n```js\nperfectPayload(data, validationRules, options?)\nawait perfectPayloadAsync(data, validationRules, options?)\n```\n\nThe arguments are:\n\n| Argument          | Required | Description                                                                         |\n| ----------------- | -------- | ----------------------------------------------------------------------------------- |\n| `data`            | No       | Payload/object to validate. Defaults to`{}`.                                        |\n| `validationRules` | No       | Validation schema. Defaults to`{}`.                                                 |\n| `options`         | No       | API-level configuration such as unknown-field handling and custom response objects. |\n\nThe third argument is a single options object. You no longer need to pass separate positional arguments for custom valid and invalid responses. In TypeScript, this object is typed as `ValidationOptions`.\n\n### TypeScript\n\n`perfect-payload` ships its TypeScript declarations with the package. No separate `@types/perfect-payload` installation is required.\n\n```ts\nimport { perfectPayload, perfectPayloadAsync } from \"perfect-payload\";\nimport type {\n  ValidationOptions,\n  ValidationRules,\n  AttributeValidationRules,\n  ValidationValueType,\n  TransformFunction,\n  ArrayElementTransformFunction,\n  CustomValidator,\n  DependencyRule,\n  DependencyRules,\n} from \"perfect-payload\";\n```\n\nExample:\n\n```ts\nconst rules: ValidationRules = {\n  email: {\n    mandatory: true,\n    type: \"email\",\n    trim: true,\n    lowercase: true,\n  },\n};\nconst options: ValidationOptions = {\n  unknownFields: \"reject\",\n  prettyErrors: false,\n};\nconst result = perfectPayload(\n  {\n    email: \"  KIRAN@EXAMPLE.COM  \",\n  },\n  rules,\n  options,\n);\nif (result.valid === true) {\n  console.log(result.validatedPayload);\n} else {\n  console.log(result.errors);\n}\n```\n\n`prettyErrors: true` changes the error collection to strings, while the default structured mode returns objects containing `path`, `code`, and `message`. The runtime package remains the same for JavaScript and TypeScript consumers.\n\n### Options\n\nThe third argument uses the `ValidationOptions` type in TypeScript.\n\n```ts\ninterface ValidationOptions {\n  unknownFields?: \"strip\" | \"allow\" | \"reject\";\n  prettyErrors?: boolean;\n  validPayloadResponse?: {\n    statusCode: number;\n    valid: true;\n    [key: string]: unknown;\n  };\n  inValidPayloadResponse?: {\n    statusCode: number;\n    valid: false;\n    message: string;\n    [key: string]: unknown;\n  };\n}\n```\n\nAll properties are optional. The defaults are equivalent to:\n\n```js\n{\n  unknownFields: \"strip\",\n  prettyErrors: false,\n  validPayloadResponse: {\n    statusCode: 200,\n    valid: true,\n  },\n  inValidPayloadResponse: {\n    statusCode: 400,\n    valid: false,\n    message: \"One or more attribute values are invalid\",\n  },\n}\n```\n\nExample:\n\n```js\nconst result = perfectPayload(payload, validationRules, {\n  unknownFields: \"reject\",\n  prettyErrors: false,\n  validPayloadResponse: {\n    statusCode: 201,\n    valid: true,\n    message: \"Payload accepted\",\n  },\n  inValidPayloadResponse: {\n    statusCode: 422,\n    valid: false,\n    message: \"Payload validation failed\",\n  },\n});\n```\n\nThe same options object is supported by `perfectPayloadAsync()`:\n\n```js\nconst result = await perfectPayloadAsync(payload, validationRules, {\n  unknownFields: \"reject\",\n  prettyErrors: false,\n  inValidPayloadResponse: {\n    statusCode: 422,\n    valid: false,\n    message: \"Payload validation failed\",\n  },\n});\n```\n\n## Unknown Field Handling\n\n`unknownFields` controls what happens when the input payload contains a field that is not defined in the validation schema.\n\nSupported values:\n\n| Value      | Behavior                                                                                                |\n| ---------- | ------------------------------------------------------------------------------------------------------- |\n| `\"strip\"`  | Removes unknown fields from`validatedPayload`. This is the default and preserves the existing behavior. |\n| `\"allow\"`  | Preserves unknown fields in`validatedPayload`.                                                          |\n| `\"reject\"` | Rejects unknown fields with structured`UNKNOWN_FIELD` validation errors.                                |\n\n### `strip` — default\n\n```js\nconst payload = {\n  name: \"Kiran\",\n  role: \"developer\",\n};\nconst rules = {\n  name: {\n    type: \"string\",\n  },\n};\nconst result = perfectPayload(payload, rules);\n```\n\nResult:\n\n```js\n{\n  statusCode: 200,\n  valid: true,\n  validatedPayload: {\n    name: \"Kiran\"\n  }\n}\n```\n\n`role` is not part of the schema, so it is removed from `validatedPayload`.\n\nYou can also set the default behavior explicitly:\n\n```js\nperfectPayload(payload, rules, {\n  unknownFields: \"strip\",\n});\n```\n\n### `allow` — preserve unknown fields\n\n```js\nconst result = perfectPayload(payload, rules, {\n  unknownFields: \"allow\",\n});\n```\n\nResult:\n\n```js\n{\n  statusCode: 200,\n  valid: true,\n  validatedPayload: {\n    name: \"Kiran\",\n    role: \"developer\"\n  }\n}\n```\n\nSchema-defined fields are still validated normally. Unknown fields are simply preserved.\n\n### `reject` — reject unknown fields\n\n```js\nconst result = perfectPayload(payload, rules, {\n  unknownFields: \"reject\",\n});\n```\n\nResult:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"role\",\n      code: \"UNKNOWN_FIELD\",\n      message: \"Unknown field role is not allowed\"\n    }\n  ]\n}\n```\n\nUnknown-field errors use the same structured error format as all other validation errors.\n\n### Nested objects\n\nUnknown-field handling is recursive for schemas using `objectAttr`.\n\n```js\nconst payload = {\n  profile: {\n    city: \"Bengaluru\",\n    role: \"developer\",\n  },\n};\nconst rules = {\n  profile: {\n    type: \"object\",\n    objectAttr: {\n      city: {\n        type: \"string\",\n      },\n    },\n  },\n};\nconst result = perfectPayload(payload, rules, {\n  unknownFields: \"reject\",\n});\n```\n\nReturns:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"profile.role\",\n      code: \"UNKNOWN_FIELD\",\n      message: \"Unknown field profile.role is not allowed\"\n    }\n  ]\n}\n```\n\n### Arrays and deep paths\n\n`unknownFields` also applies recursively through `elementConstraints`. For an unknown field inside an array element, the error path includes\n\nthe array index:\n\n```js\n{\n  path: \"products[0].internalId\",\n  code: \"UNKNOWN_FIELD\",\n  message: \"Unknown field products[0].internalId is not allowed\"\n}\n```\n\nThis continues through deeply nested combinations of objects and arrays,\n\nfor example:\n\n```text\nprofile.teams[0].members[0].role\n```\n\n### Normal validation errors and unknown fields\n\nWith `\"reject\"`, unknown-field errors can be returned together with normal validation errors.\n\nFor example, an invalid email plus two unknown fields can produce:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"email\",\n      code: \"INVALID_EMAIL\",\n      message: \"Invalid email format for attribute email\"\n    },\n    {\n      path: \"role\",\n      code: \"UNKNOWN_FIELD\",\n      message: \"Unknown field role is not allowed\"\n    },\n    {\n      path: \"active\",\n      code: \"UNKNOWN_FIELD\",\n      message: \"Unknown field active is not allowed\"\n    }\n  ]\n}\n```\n\nWith `\"allow\"`, unknown fields do not create validation errors. Normal schema validation continues unchanged.\n\n### Async behavior\n\n`perfectPayloadAsync()` supports the same `unknownFields` option:\n\n```js\nconst result = await perfectPayloadAsync(payload, rules, {\n  unknownFields: \"reject\",\n});\n```\n\nUnknown-field checking is part of the synchronous validation phase. If `\"reject\"` finds an unknown field, asynchronous `customValidator` functions are not executed for that payload. This follows the normal two-phase contract of `perfectPayloadAsync()`.\n\n### Own properties only\n\nUnknown-field handling considers only the payload object's own enumerable properties. Enumerable properties inherited through the prototype chain are ignored.\n\n### Invalid option values\n\nOnly these values are accepted:\n\n```text\nstrip\nallow\nreject\n```\n\nAny other value throws a configuration error:\n\n```text\nperfect-payload:- unknownFields must be one of strip, allow, reject\n```\n\nThis is a configuration error, not a payload validation error.\n\n## Synchronous vs Asynchronous Validation\n\nFor normal synchronous validation, use `perfectPayload()`:\n\n```js\nimport { perfectPayload } from \"perfect-payload\";\nconst result = perfectPayload(payload, validationRules, options);\n```\n\nWhen any `customValidator` needs to perform asynchronous work, use `perfectPayloadAsync()` and `await` the result:\n\n```js\nimport { perfectPayloadAsync } from \"perfect-payload\";\nconst result = await perfectPayloadAsync(payload, validationRules, options);\n```\n\nThe public APIs are:\n\n```text\nperfectPayloadV1()                            legacy API; deprecated\nperfectPayload(data, rules, options?)         synchronous validation\nperfectPayloadAsync(data, rules, options?)    synchronous + asynchronous\ncustomValidator\n```\n\n`perfectPayload()` remains synchronous and intentionally rejects a `customValidator` that returns a Promise. This preserves the existing synchronous API contract. `perfectPayloadAsync()` first performs transformations and normal synchronous validation. If synchronous validation fails, the result is returned immediately and asynchronous validators are not executed. This avoids unnecessary asynchronous work for payloads that are already invalid.\n\n```text\ntransformations\n      ↓\nsynchronous validation\n      ↓\nsync errors? ── yes ──→ return validation errors\n      ↓ no\nasync customValidator\n      ↓\nreturn result\n```\n\n## Legacy API\n\n`perfectPayloadV1()` is still available for backward compatibility.\n\n```js\nimport { perfectPayloadV1 } from \"perfect-payload\";\n```\n\n`perfectPayloadV1()` is deprecated and will no longer be supported after March 31, 2027. Existing applications can continue using it during the migration period,\n\nbut all new implementations should use the current API:\n\n```js\nperfectPayload(data, validationRules, options?);\n```\n\nFor asynchronous custom validation:\n\n```js\nawait perfectPayloadAsync(data, validationRules, options?);\n```\n\nThe legacy API continues to return validation errors as:\n\n```js\nerrors: [\"email is invalid\"];\n```\n\nwhile the new `perfectPayload()` API returns structured errors:\n\n```js\nerrors: [\n  {\n    path: \"email\",\n    code: \"INVALID_EMAIL\",\n    message: \"Invalid email format for attribute email\",\n  },\n];\n```\n\nNote: If an inValidPayloadResponse is provided in the options, the system returns it alongside an automatically generated errors property. Do not include your own errors attribute inside the custom `options.inValidPayloadResponse` object.\n\n## Validation Rules\n\n`perfectPayload()` supports validation, nested-schema, custom-validation, and transformation rules.\n\n### `mandatory`\n\nMarks a field as required. An empty string is also treated as missing. Default: `false`, the field is not required.\n\n```js\nconst rules = {\n  name: {\n    mandatory: true,\n  },\n};\n```\n\n## Error code: `REQUIRED`\n\n### `allowNull`\n\nControls whether `null` values are accepted. Default: `true`, `null` values are allowed.\n\nExample:\n\n```js\nconst rules = {\n  name: {\n    allowNull: false,\n  },\n};\n```\n\n## Error code: `NULL_NOT_ALLOWED`\n\n### `allowEmptyObject`\n\nControls whether an empty object `{}` is accepted. Default: `true`, empty objects are allowed.\n\nExample:\n\n```js\nconst rules = {\n  address: {\n    type: \"object\",\n    allowEmptyObject: false,\n  },\n};\n```\n\n## Error code: `EMPTY_OBJECT_NOT_ALLOWED`\n\n### `allowEmptyArray`\n\nControls whether an empty array `[]` is accepted. Default: `true`, empty arrays are allowed.\n\nExample:\n\n```js\nconst rules = {\n  products: {\n    type: \"array\",\n    allowEmptyArray: false,\n  },\n};\n```\n\n## Error code: `EMPTY_ARRAY_NOT_ALLOWED`\n\n### `minItems`\n\nDefines the minimum number of items required in an array. Default: `Not applied when omitted.`\n\n```js\nconst rules = {\n  tags: {\n    type: \"array\",\n    minItems: 2,\n  },\n};\n```\n\nAn array with fewer than 2 items returns `MIN_ITEMS`.\n\n```js\n{\n  path: \"tags\",\n  code: \"MIN_ITEMS\",\n  message: \"Attribute tags must contain at least 2 item(s)\"\n}\n```\n\n## `minItems` is enforced even when `allowEmptyArray: true` is set. For example, `minItems: 2` still rejects `[]`. Error code: `MIN_ITEMS`\n\n### `maxItems`\n\nDefines the maximum number of items allowed in an array. Default: `Not applied when omitted`.\n\n```js\nconst rules = {\n  tags: {\n    type: \"array\",\n    maxItems: 5,\n  },\n};\n```\n\nAn array with more than 5 items returns `MAX_ITEMS`.\n\n```js\n{\n  path: \"tags\",\n  code: \"MAX_ITEMS\",\n  message: \"Attribute tags must contain at most 5 item(s)\"\n}\n```\n\n## `minItems` and `maxItems` can be used together. Error code: `MAX_ITEMS`\n\n### `type`\n\nValidates the expected data type.\n\nSupported values:\n\n```text\nnumber\nstring\nboolean\nemail\nurl\nenum\nuuid\nuuidv1\nuuidv3\nuuidv4\nuuidv5\nobjectId\narray\nobject\n```\n\nExample:\n\n```js\nconst rules = {\n  age: {\n    type: \"number\",\n  },\n  email: {\n    type: \"email\",\n  },\n  active: {\n    type: \"boolean\",\n  },\n};\n```\n\n### `enum`\n\nA specific set of allowed values (supports heterogeneous arrays)\n\n```js\ntype: \"enum\";\n```\n\nExample:\n\n```js\nconst rules = {\n  status: {\n    type: \"enum\",\n    enumValues: [\"active\", \"inactive\", \"blocked\", 1, 0],\n  },\n};\n```\n\n### `enumValues`\n\nUsed together with:\n\n```js\ntype: \"enum\";\n```\n\nExample:\n\n```js\nconst rules = {\n  status: {\n    type: \"enum\",\n    enumValues: [\"active\", \"inactive\", \"blocked\"],\n  },\n};\n```\n\nError code: `INVALID_ENUM`\n\nPossible error codes for types:\n\n```text\nINVALID_TYPE\nINVALID_EMAIL\nINVALID_URL\nINVALID_ENUM\nINVALID_UUID\nINVALID_UUID_V1\nINVALID_UUID_V3\nINVALID_UUID_V4\nINVALID_UUID_V5\nINVALID_OBJECT_ID\n```\n\n## For `type: \"number\"`, `NaN` is rejected as `INVALID_TYPE`.\n\n### `regex`\n\nValidates a value using a regular expression. Default: `Not applied when omitted.`\n\nExample:\n\n```js\nconst rules = {\n  employeeCode: {\n    type: \"string\",\n    regex: /[^1]{3}[0-9]{3}$/,\n  },\n};\n```\n\n## Error code: `REGEX_MISMATCH`\n\n### `minLength`\n\nDefines the minimum allowed string length. Default: `Not applied when omitted.`\n\nExample:\n\n```js\nconst rules = {\n  username: {\n    type: \"string\",\n    minLength: 5,\n  },\n};\n```\n\n## Error code: `MIN_LENGTH`\n\n### `maxLength`\n\nDefines the maximum allowed string length. Default: `Not applied when omitted.`\n\nExample:\n\n```js\nconst rules = {\n  username: {\n    type: \"string\",\n    maxLength: 20,\n  },\n};\n```\n\n## Error code: `MAX_LENGTH`\n\n### `preventDecimal`\n\nPrevents decimal numbers. Default: `false`; both integer and decimal numbers are allowed.\n\nExample:\n\n```js\nconst rules = {\n  quantity: {\n    type: \"number\",\n    preventDecimal: true,\n  },\n};\n```\n\n## Error code: `DECIMAL_NOT_ALLOWED`\n\n### `min`\n\nDefines the minimum allowed numeric value. Default: `Not applied when omitted.`\n\nExample:\n\n```js\nconst rules = {\n  age: {\n    type: \"number\",\n    min: 18,\n  },\n};\n```\n\n## Error code: `MIN_VALUE`\n\n### `max`\n\nDefines the maximum allowed numeric value. Default: `Not applied when omitted.`\n\nExample:\n\n```js\nconst rules = {\n  quantity: {\n    type: \"number\",\n    max: 100,\n  },\n};\n```\n\n## Error code: `MAX_VALUE`\n\n### `range`\n\nDefines the allowed numeric range. Default: `Not applied when omitted.`\n\nExample:\n\n```js\nconst rules = {\n  marks: {\n    type: \"number\",\n    range: \"0-100\",\n  },\n};\n```\n\n## Error code: `OUT_OF_RANGE`\n\n### `elementConstraints`\n\nValidates every item in an array.\n\nExample:\n\n```js\nconst rules = {\n  marks: {\n    type: \"array\",\n    elementConstraints: {\n      type: \"number\",\n      range: \"0-100\",\n    },\n  },\n};\n```\n\nExample error:\n\n```js\n{\n  path: \"marks[2]\",\n  code: \"OUT_OF_RANGE\",\n  message: \"Attribute marks[2] should have a value between 0 and 100\"\n}\n```\n\nArray-element transformations receive three arguments:\n\n```js\nconst rules = {\n  tags: {\n    type: \"array\",\n    elementConstraints: {\n      transform: (value, index, payload) => {\n        return String(value).trim().toLowerCase();\n      },\n      type: \"string\",\n    },\n  },\n};\n```\n\nFor an `elementConstraints` transform:\n\n- `value` is the current array element.\n- `index` is the zero-based index of that element.\n- `payload` is the complete root payload/source object currently being validated.\n\nThe same root `payload` object is provided even when `elementConstraints` is nested inside another object or array. When `elementConstraintsError` is explicitly provided, the error code is `INVALID_ARRAY_ELEMENT`.\n\nExample:\n\n```js\nconst rules = {\n  marks: {\n    type: \"array\",\n    elementConstraints: {\n      type: \"number\",\n    },\n    elementConstraintsError: \"Every marks element must be a number\",\n  },\n};\n```\n\n### `objectAttr`\n\nValidates fields inside a nested object.\n\nExample:\n\n```js\nconst rules = {\n  address: {\n    type: \"object\",\n    objectAttr: {\n      city: {\n        mandatory: true,\n        type: \"string\",\n      },\n      location: {\n        type: \"object\",\n        objectAttr: {\n          latitude: {\n            type: \"number\",\n          },\n          longitude: {\n            type: \"number\",\n          },\n        },\n      },\n    },\n  },\n};\n```\n\nNested errors include the complete field path:\n\n```js\n{\n  path: \"address.location.latitude\",\n  code: \"INVALID_TYPE\",\n  message:\n    \"Invalid type for attribute address.location.latitude, required number value\"\n}\n```\n\n---\n\n### `dependency`\n\nAllows validation rules to depend on another field.\n\nExample:\n\n```js\nconst rules = {\n  minSalary: {\n    type: \"number\",\n    dependency: {\n      maxSalary: {\n        setDependencyRule: (minSalary, maxSalary) => ({\n          type: \"number\",\n          min: minSalary + 1,\n          minError: \"maxSalary must be more than minSalary\",\n        }),\n      },\n    },\n  },\n};\n```\n\nExample error:\n\n```js\n{\n  path: \"maxSalary\",\n  code: \"MIN_VALUE\",\n  message:\n    \"maxSalary must be more than minSalary\"\n}\n```\n\n## Validation Precedence\n\nv2 uses a fixed validation order. The order in which properties are written inside a rule object does not change runtime behavior.\n\n```text\n1. mandatory / presence\n2. transformations\n   trim\n   lowercase\n   uppercase\n   transform\n3. allowNull\n4. type\n5. empty-container checks\n   allowEmptyObject\n   allowEmptyArray\n6. structural rules\n   objectAttr\n   elementConstraints\n   minItems\n   maxItems\n7. value constraints\n   regex\n   minLength\n   maxLength\n   preventDecimal\n   min\n   max\n   range\n8. dependency\n9. customValidator\n```\n\nFor a single field, once an earlier validation fails, later validations for that field are pruned.\n\nExamples:\n\n```text\nmandatory fails\n→ transform/type/customValidator do not run\ntype fails\n→ objectAttr/elementConstraints/regex/customValidator do not run\nregex fails\n→ customValidator does not run\n```\n\nThis behavior applies to the modern core API and therefore also to the Express and Fastify adapters. `perfectPayloadV1()` keeps its legacy behavior. `perfectPayloadAsync()` follows the same synchronous precedence first. Async custom validators run only when the synchronous phase completes without validation errors.\n\n## Array Size and Nested Validation\n\n`perfectPayload()` supports array size constraints and recursive validation of arrays and objects at multiple depths. Array indexes and nested object keys are preserved in structured error paths.\n\n### Array size constraints\n\nUse `minItems` and `maxItems` with `type: \"array\"`:\n\n```js\nconst rules = {\n  products: {\n    type: \"array\",\n    minItems: 1,\n    maxItems: 3,\n    elementConstraints: {\n      type: \"object\",\n      objectAttr: {\n        productId: { mandatory: true, type: \"string\" },\n        quantity: { mandatory: true, type: \"number\", min: 1 },\n      },\n    },\n  },\n};\n```\n\nIf the array is empty, `minItems` reports the array path itself:\n\n```js\n{\n  path: \"products\",\n  code: \"MIN_ITEMS\",\n  message: \"Attribute products must contain at least 1 item(s)\"\n}\n```\n\n### Arrays of objects\n\n`elementConstraints` can contain `objectAttr`, allowing every object in an array to use a nested schema. An invalid quantity in the second product is reported as:\n\n```text\nproducts[1].quantity\n```\n\n### Deeply nested arrays and objects\n\n`objectAttr` and `elementConstraints` can be combined recursively:\n\n```js\nconst rules = {\n  orders: {\n    type: \"array\",\n    minItems: 1,\n    maxItems: 2,\n    elementConstraints: {\n      type: \"object\",\n      objectAttr: {\n        orderId: { mandatory: true, type: \"string\" },\n        items: {\n          mandatory: true,\n          type: \"array\",\n          minItems: 1,\n          maxItems: 2,\n          elementConstraints: {\n            type: \"object\",\n            objectAttr: {\n              productId: { mandatory: true, type: \"string\" },\n              quantity: { mandatory: true, type: \"number\", min: 1 },\n            },\n          },\n        },\n      },\n    },\n  },\n};\n```\n\nA deep validation failure preserves the complete indexed path, for\n\nexample:\n\n```text\norders[1].items[2].quantity\n```\n\nArray constraints work at nested levels too. A nested array can report paths such as:\n\n```text\norders[1].items\n```\n\nNested arrays are supported and every array index is preserved:\n\n```text\nmatrix[1][1]\nmatrix[1][1][1]\n```\n\nTransformations applied inside nested objects or array elements are preserved in `validatedPayload`, while the original input remains unchanged.\n\n### Transformations and Sanitization\n\n`perfectPayload()` can transform a field before its remaining validation rules run. The transformed value is returned in `validatedPayload`, while the original input object is not mutated.\n\nSupported transformation rules:\n\n| Rule        | Purpose                                               |\n| ----------- | ----------------------------------------------------- |\n| `trim`      | Removes leading and trailing whitespace from strings. |\n| `lowercase` | Converts strings to lowercase.                        |\n| `uppercase` | Converts strings to uppercase.                        |\n| `transform` | Runs a custom synchronous transformation function.    |\n\nThe v2 validation flow is deterministic and does not depend on the order in which rule properties are written:\n\n```text\nmandatory / presence\n        ↓\ntrim\n        ↓\nlowercase\n        ↓\nuppercase\n        ↓\ntransform\n        ↓\nallowNull\n        ↓\ntype\n        ↓\nempty-container checks\n        ↓\nstructural validation\n        ↓\nvalue constraints\n        ↓\ndependency\n        ↓\ncustomValidator\n        ↓\nvalidatedPayload\n```\n\nIf `mandatory` fails, transformations and all later rules for that field are skipped.\n\n#### `trim`\n\n```js\nconst payload = {\n  name: \"   Kiran Poojary   \",\n};\nconst rules = {\n  name: {\n    type: \"string\",\n    trim: true,\n  },\n};\nconst result = perfectPayload(payload, rules);\nconsole.log(result.validatedPayload.name);\n// \"Kiran Poojary\"\nconsole.log(payload.name);\n// \"   Kiran Poojary   \"\n```\n\n`trim` applies only to string values. Non-string values are left unchanged.\n\n#### `lowercase`\n\n```js\nconst rules = {\n  email: {\n    trim: true,\n    lowercase: true,\n    type: \"email\",\n  },\n};\n```\n\nFor `\"  KIRAN@EXAMPLE.COM  \"`, the validated value becomes `\"kiran@example.com\"`.\n\n#### `uppercase`\n\n```js\nconst rules = {\n  countryCode: {\n    type: \"string\",\n    uppercase: true,\n  },\n};\n```\n\nFor `\"in\"`, the validated value becomes `\"IN\"`. `lowercase: true` and `uppercase: true` cannot be enabled together for the same field. Doing so throws a schema configuration error.\n\n#### `transform`\n\nUse `transform` when the built-in string transformations are not enough.\n\n```js\nconst rules = {\n  phone: {\n    type: \"string\",\n    transform: (value) => String(value).replace(/\\s+/g, \"\"),\n  },\n};\n```\n\nFor `\"98765 43210\"`, the validated value becomes `\"9876543210\"`.\n\nA normal transformer receives two arguments:\n\n```js\ntransform: (value, payload) => {\n  return value;\n};\n```\n\n- `value` is the field value after the built-in transformations have run.\n- `payload` is the **complete root payload/source object currently being validated**.\n\nFor direct core usage, `payload` is the complete `data` object passed to `perfectPayload()` or `perfectPayloadAsync()`. For framework adapters, the transform receives the complete request source being validated:\n\n```text\nbody rule    → request.body\nheaders rule → request.headers\nparams rule  → request.params\nquery rule   → request.query\n```\n\nThis root-payload contract is preserved inside nested `objectAttr` and `elementConstraints` validation.\n\nExample cross-field transformation:\n\n```js\nconst payload = {\n  amount: 100,\n  multiplier: 2,\n};\nconst rules = {\n  amount: {\n    transform: (value, payload) => value * payload.multiplier,\n    type: \"number\",\n  },\n  multiplier: {\n    type: \"number\",\n  },\n};\nconst result = perfectPayload(payload, rules);\nconsole.log(result.validatedPayload.amount);\n// 200\n```\n\nA custom transformer may also change the data type before validation:\n\n```js\nconst rules = {\n  quantity: {\n    transform: (value) => Number(value),\n    type: \"number\",\n    min: 1,\n    max: 100,\n  },\n};\n```\n\nFor `elementConstraints`, the callback additionally receives the zero-based array index:\n\n```js\nelementConstraints: {\n  transform: (value, index, payload) => {\n    return String(value).trim();\n  },\n  type: \"string\",\n}\n```\n\nThe transformed value is validated by the normal validation rules and is also the value received by `customValidator`. Transformed nested/array values are preserved in `validatedPayload`. Missing optional fields are not transformed. An input value of `null` is not passed to transformation functions; null handling remains controlled by `allowNull`. **Important:** `transform` is synchronous. A non-function transformer, an `async` transformer, a transformer that returns a Promise, or a transformer that returns `undefined` is not supported and throws an error. Returning `null`, `\"\"`, `0`, or `false` is allowed; the transformed value is then processed by the remaining validation rules. Exceptions thrown inside the transformer propagate to the caller.\n\nFor example, returning `undefined` throws:\n\n```text\nperfect-payload:- transform must not return undefined for attribute username\n```\n\n### `customValidator`\n\nDefines custom validation logic when the built-in rules are not enough.\n\nThe validator receives:\n\n```js\ncustomValidator: (value, payload) => {\n  return true;\n};\n```\n\n- `value` is the field value after transformations have been applied.\n- `payload` is the current payload/object being validated.\n- Return `true` to pass.\n- Any value other than `true` fails validation.\n- Exceptions thrown by the validator propagate to the caller.\n\nFor nested validation, `payload` means the current nested object rather than the root request body.\n\n#### Synchronous custom validator\n\nUse a synchronous validator with `perfectPayload()`:\n\n```js\nconst rules = {\n  username: {\n    mandatory: true,\n    type: \"string\",\n    trim: true,\n    customValidator: (value) => {\n      return !value.toLowerCase().includes(\"admin\");\n    },\n    customValidatorCode: \"RESERVED_USERNAME\",\n    customValidatorError: \"Username cannot contain admin\",\n  },\n};\nconst result = perfectPayload({ username: \"  admin_kiran  \" }, rules);\n```\n\nA failure returns:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"username\",\n      code: \"RESERVED_USERNAME\",\n      message: \"Username cannot contain admin\"\n    }\n  ]\n}\n```\n\nThe current payload/object can be used for cross-field validation:\n\n```js\nconst rules = {\n  limit: {\n    type: \"number\",\n  },\n  amount: {\n    type: \"number\",\n    customValidator: (value, payload) => {\n      return value <= payload.limit;\n    },\n    customValidatorCode: \"LIMIT_EXCEEDED\",\n    customValidatorError: \"Amount cannot exceed limit\",\n  },\n};\n```\n\nIf `customValidatorCode` and `customValidatorError` are omitted, the\n\ndefault error is:\n\n```js\n{\n  path: \"username\",\n  code: \"CUSTOM_VALIDATION_FAILED\",\n  message: \"Custom validation failed for attribute username\"\n}\n```\n\n`customValidator` works recursively inside `objectAttr` and `elementConstraints`. Structured errors preserve the corresponding nested and array paths. When using `perfectPayload()`, `customValidator` must remain synchronous. A Promise-returning validator throws:\n\n```text\nperfect-payload:- customValidator must be synchronous for attribute\nusername\n```\n\nFor asynchronous custom validation, use `perfectPayloadAsync()`.\n\n## Asynchronous Validation\n\n`perfectPayloadAsync()` supports both synchronous and asynchronous `customValidator` functions without changing the behavior of `perfectPayload()`.\n\n```js\nimport { perfectPayloadAsync } from \"perfect-payload\";\nconst rules = {\n  username: {\n    mandatory: true,\n    type: \"string\",\n    trim: true,\n    customValidator: async (value) => {\n      const available = await checkUsernameAvailability(value);\n      return available;\n    },\n    customValidatorCode: \"USERNAME_TAKEN\",\n    customValidatorError: \"Username is already taken\",\n  },\n};\nconst result = await perfectPayloadAsync(\n  {\n    username: \"  kiran  \",\n  },\n  rules,\n);\n```\n\nOn success, transformations are preserved:\n\n```js\n{\n  statusCode: 200,\n  valid: true,\n  validatedPayload: {\n    username: \"kiran\"\n  }\n}\n```\n\nOn asynchronous validation failure:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"username\",\n      code: \"USERNAME_TAKEN\",\n      message: \"Username is already taken\"\n    }\n  ]\n}\n```\n\n### Async validator contract\n\nFor `perfectPayloadAsync()`:\n\n```text\ntrue             → pass\nfalse            → validation failure\nanything != true → validation failure\nthrow            → exception propagates\nrejected Promise → rejection propagates\n```\n\nA normal synchronous validator is also valid when using the asynchronous\n\nAPI:\n\n```js\nconst rules = {\n  username: {\n    type: \"string\",\n    customValidator: (value) => value !== \"admin\",\n  },\n};\nconst result = await perfectPayloadAsync(payload, rules);\n```\n\nA configured `customValidator` must be a function. Otherwise an error is\n\nthrown:\n\n```text\nperfect-payload:- customValidator must be a function for attribute username\n```\n\n### Validation order\n\n`perfectPayloadAsync()` uses two phases:\n\n1. Run presence checks, transformations, and the normal deterministic synchronous validation pipeline.\n2. If phase 1 succeeds, run custom validators with `await`.\n\nIf any synchronous validation error exists, phase 2 is skipped and the synchronous validation result is returned immediately. This means an async `customValidator` is pruned when an earlier rule such as `type`, `regex`, or another synchronous constraint has already failed.\n\n### Nested async validation\n\nAsync custom validators work recursively inside `objectAttr`:\n\n```js\nconst rules = {\n  profile: {\n    type: \"object\",\n    objectAttr: {\n      username: {\n        type: \"string\",\n        trim: true,\n        customValidator: async (value) => {\n          return await isUsernameAvailable(value);\n        },\n        customValidatorCode: \"USERNAME_TAKEN\",\n        customValidatorError: \"Username is already taken\",\n      },\n    },\n  },\n};\n```\n\nA failure produces the complete path:\n\n```text\nprofile.username\n```\n\nThey also work inside `elementConstraints`:\n\n```js\nconst rules = {\n  usernames: {\n    type: \"array\",\n    elementConstraints: {\n      type: \"string\",\n      trim: true,\n      customValidator: async (value) => {\n        return await isUsernameAvailable(value);\n      },\n      customValidatorCode: \"USERNAME_TAKEN\",\n      customValidatorError: \"Username is already taken\",\n    },\n  },\n};\n```\n\nFor an invalid second element:\n\n```text\nusernames[1]\n```\n\nDeep combinations of objects and arrays preserve every level of the\n\npath:\n\n```text\nproducts[1].seller.username\nprofile.teams[1].members[1].username\n```\n\nDefault async custom-validation messages also use the final indexed\n\npath:\n\n```js\n{\n  path: \"users[1].username\",\n  code: \"CUSTOM_VALIDATION_FAILED\",\n  message: \"Custom validation failed for attribute users[1].username\"\n}\n```\n\n### Transform remains synchronous\n\n`perfectPayloadAsync()` makes custom validation asynchronous; it does not make `transform` asynchronous.\n\n`transform` must still be synchronous:\n\n```js\ntransform: (value, payload) => {\n  return value;\n};\n```\n\nAn async transformer or a transformer that returns a Promise is not supported.\n\n## Error Codes\n\n`perfectPayload()` currently exposes the following machine-readable\n\nvalidation error codes:\n\n```text\nREQUIRED\nNULL_NOT_ALLOWED\nEMPTY_OBJECT_NOT_ALLOWED\nEMPTY_ARRAY_NOT_ALLOWED\nMIN_ITEMS\nMAX_ITEMS\nINVALID_ARRAY_ELEMENT\nREGEX_MISMATCH\nINVALID_TYPE\nINVALID_EMAIL\nINVALID_URL\nINVALID_ENUM\nINVALID_UUID\nINVALID_UUID_V1\nINVALID_UUID_V3\nINVALID_UUID_V4\nINVALID_UUID_V5\nINVALID_OBJECT_ID\nMIN_LENGTH\nMAX_LENGTH\nDECIMAL_NOT_ALLOWED\nMIN_VALUE\nMAX_VALUE\nOUT_OF_RANGE\nCUSTOM_VALIDATION_FAILED\nUNKNOWN_FIELD\n```\n\nThese codes are designed for programmatic handling while `message` remains suitable for human-readable API responses.\n\nFor example:\n\n```js\nconst result = perfectPayload(payload, validationRules);\nif (!result.valid) {\n  const emailError = result.errors.find(\n    (error) => error.code === \"INVALID_EMAIL\",\n  );\n  if (emailError) {\n    // Handle invalid email\n  }\n}\n```\n\n## Custom Error Messages\n\nEvery validation rule can use its corresponding custom error message. Custom messages replace the default human-readable `message` while keeping the same structured error format:\n\n```js\n{\n  path: \"email\",\n  code: \"INVALID_EMAIL\",\n  message: \"Email address is invalid\"\n}\n```\n\nExample:\n\n```js\nconst rules = {\n  email: {\n    mandatory: true,\n    type: \"email\",\n    mandatoryError: \"Email is required\",\n    typeError: \"Email address is invalid\",\n  },\n};\n```\n\nIf `email` is missing:\n\n```js\n{\n  path: \"email\",\n  code: \"REQUIRED\",\n  message: \"Email is required\"\n}\n```\n\nIf `email` is present but invalid:\n\n```js\n{\n  path: \"email\",\n  code: \"INVALID_EMAIL\",\n  message: \"Email address is invalid\"\n}\n```\n\n### Supported Custom Error Properties\n\n| Validation Rule      | Custom Error Property     |\n| -------------------- | ------------------------- |\n| `mandatory`          | `mandatoryError`          |\n| `allowNull`          | `allowNullError`          |\n| `allowEmptyObject`   | `emptyObjectError`        |\n| `allowEmptyArray`    | `emptyArrayError`         |\n| `elementConstraints` | `elementConstraintsError` |\n| `regex`              | `regexError`              |\n| `type`               | `typeError`               |\n| `minLength`          | `minLengthError`          |\n| `maxLength`          | `maxLengthError`          |\n| `preventDecimal`     | `preventDecimalError`     |\n| `min`                | `minError`                |\n| `max`                | `maxError`                |\n| `range`              | `rangeError`              |\n\n### Example with Multiple Custom Errors\n\n```js\nconst payload = {\n  username: \"ab\",\n  age: 15,\n  score: 120,\n};\nconst rules = {\n  username: {\n    mandatory: true,\n    type: \"string\",\n    minLength: 3,\n    mandatoryError: \"Username is required\",\n    typeError: \"Username must be a string\",\n    minLengthError: \"Username must contain at least 3 characters\",\n  },\n  age: {\n    type: \"number\",\n    min: 18,\n    minError: \"Age must be at least 18\",\n  },\n  score: {\n    type: \"number\",\n    range: \"0-100\",\n    rangeError: \"Score must be between 0 and 100\",\n  },\n};\nconst result = perfectPayload(payload, rules);\n```\n\nExample result:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message:\n    \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"username\",\n      code: \"MIN_LENGTH\",\n      message:\n        \"Username must contain at least 3 characters\"\n    },\n    {\n      path: \"age\",\n      code: \"MIN_VALUE\",\n      message:\n        \"Age must be at least 18\"\n    },\n    {\n      path: \"score\",\n      code: \"OUT_OF_RANGE\",\n      message:\n        \"Score must be between 0 and 100\"\n    }\n  ]\n}\n```\n\n### Custom Messages and Error Codes\n\nCustom messages only replace the `message`. They do not change the validation error `code`.\n\nFor example:\n\n```js\nconst rules = {\n  age: {\n    type: \"number\",\n    min: 18,\n    minError: \"You must be 18 or older\",\n  },\n};\n```\n\nStill returns:\n\n```js\n{\n  path: \"age\",\n  code: \"MIN_VALUE\",\n  message: \"You must be 18 or older\"\n}\n```\n\nThis makes it possible to:\n\n- show custom messages to API consumers\n- use stable error codes in application logic\n- change user-facing wording without changing programmatic error\n\nhandling\n\n## Custom Response Objects\n\nCustom valid and invalid response objects are configured inside the optional third `options` argument.\n\n```js\nperfectPayload(data, validationRules, options?)\nawait perfectPayloadAsync(data, validationRules, options?)\n```\n\nThis keeps API-level configuration in one place and avoids positional `undefined` arguments.\n\n### Custom Valid Response\n\n```js\nconst result = perfectPayload(payload, validationRules, {\n  validPayloadResponse: {\n    statusCode: 201,\n    valid: true,\n    message: \"Payload validated successfully\",\n  },\n});\n```\n\nWhen validation succeeds, `validatedPayload` is automatically added:\n\n```js\n{\n  statusCode: 201,\n  valid: true,\n  message: \"Payload validated successfully\",\n  validatedPayload: {\n    name: \"Kiran\",\n    email: \"kiran@example.com\",\n    age: 29\n  }\n}\n```\n\n### Custom Invalid Response\n\n```js\nconst result = perfectPayload(payload, validationRules, {\n  inValidPayloadResponse: {\n    statusCode: 422,\n    valid: false,\n    message: \"Payload validation failed\",\n  },\n});\n```\n\nWhen validation fails, `errors` is automatically added:\n\n```js\n{\n  statusCode: 422,\n  valid: false,\n  message: \"Payload validation failed\",\n  errors: [\n    {\n      path: \"email\",\n      code: \"INVALID_EMAIL\",\n      message: \"Invalid email format for attribute email\"\n    }\n  ]\n}\n```\n\n### Custom Valid and Invalid Responses Together\n\n```js\nconst result = perfectPayload(payload, validationRules, {\n  validPayloadResponse: {\n    statusCode: 201,\n    valid: true,\n    message: \"CUSTOM_VALID_RESPONSE\",\n  },\n  inValidPayloadResponse: {\n    statusCode: 422,\n    valid: false,\n    message: \"CUSTOM_INVALID_RESPONSE\",\n  },\n});\n```\n\nYou can combine response customization with other API options:\n\n```js\nconst result = perfectPayload(payload, validationRules, {\n  unknownFields: \"reject\",\n  validPayloadResponse: {\n    statusCode: 201,\n    valid: true,\n  },\n  inValidPayloadResponse: {\n    statusCode: 422,\n    valid: false,\n    message: \"Payload validation failed\",\n  },\n});\n```\n\nThe response object you provide is preserved while `perfectPayload()` automatically adds `validatedPayload` for successful validation or `errors` for failed validation. The same response options are supported by `perfectPayloadAsync()`.\n\n## Migrating to the v2 API\n\nThe v2 `perfectPayload()` and `perfectPayloadAsync()` APIs use one optional third argument for configuration:\n\n```js\nperfectPayload(data, validationRules, options?)\nperfectPayloadAsync(data, validationRules, options?)\n```\n\nCustom response objects now belong inside `options`.\n\nUse:\n\n```js\nperfectPayload(payload, rules, {\n  validPayloadResponse: customValidResponse,\n  inValidPayloadResponse: customInvalidResponse,\n});\n```\n\ninstead of passing custom response objects as separate positional arguments. This also makes it possible to combine response customization with `unknownFields` without placeholder arguments:\n\n```js\nperfectPayload(payload, rules, {\n  unknownFields: \"reject\",\n  inValidPayloadResponse: {\n    statusCode: 422,\n    valid: false,\n    message: \"Payload validation failed\",\n  },\n});\n```\n\n`perfectPayloadV1()` is unchanged and retains its legacy signature during its deprecation period.\n\n## Default Responses\n\nIf no custom response objects are provided, the default valid response is:\n\n```js\n{\n  statusCode: 200,\n  valid: true,\n  validatedPayload: {\n    // validated fields\n  }\n}\n```\n\nThe default invalid response is:\n\n```js\n{\n  statusCode: 400,\n  valid: false,\n  message: \"One or more attribute values are invalid\",\n  errors: [\n    {\n      path: \"field\",\n      code: \"ERROR_CODE\",\n      message: \"Validation error message\"\n    }\n  ]\n}\n```\n\n## Nested Objects and Array Field Paths\n\n`perfectPayload()` returns the exact location of a validation failure through the `path` property. This makes validation errors easier to map to API fields, forms, logs, and frontend components.\n\n### Top-Level Field\n\nFor a payload such as:\n\n```js\nconst payload = {\n  email: \"invalid-email\",\n};\n```\n\nAn error can be returned as:\n\n```js\n{\n  path: \"email\",\n  code: \"INVALID_EMAIL\",\n  message: \"Invalid email format for attribute email\"\n}\n```\n\n### Nested Object\n\nUse `objectAttr` to validate properties inside an object.\n\n```js\nconst payload = {\n  address: {\n    city: \"Bengaluru\",\n    location: {\n      latitude: \"12.9716\",\n      longitude: 77.5946,\n    },\n  },\n};\nconst rules = {\n  address: {\n    type: \"object\",\n    objectAttr: {\n      city: {\n        type: \"string\",\n      },\n      location: {\n        type: \"object\",\n        objectAttr: {\n          latitude: {\n            type: \"number\",\n          },\n          longitude: {\n            type: \"number\",\n          },\n        },\n      },\n    },\n  },\n};\nconst result = perfectPayload(payload, rules);\n```\n\nBecause `latitude` is a string instead of a number, the error contains its complete nested path:\n\n```js\n{\n  path: \"address.location.latitude\",\n  code: \"INVALID_TYPE\",\n  message:\n    \"Invalid type for attribute address.location.latitude, required number value\"\n}\n```\n\nNested paths use dot notation:\n\n```text\naddress.city\naddress.location.latitude\naddress.location.longitude\n```\n\n### Array Elements\n\nWhen `elementConstraints` validation fails, the array index is included in the error path.\n\n```js\nconst payload = {\n  marks: [50, 75, 150],\n};\nconst rules = {\n  marks: {\n    type: \"array\",\n    elementConstraints: {\n      type: \"number\",\n      range: \"0-100\",\n    },\n  },\n};\nconst result = perfectPayload(payload, rules);\n```\n\nThe invalid third element is reported as:\n\n```js\n{\n  path: \"marks[2]\",\n  code: \"OUT_OF_RANGE\",\n  message:\n    \"Attribute marks[2] should have a value between 0 and 100\"\n}\n```\n\nArray paths use zero-based indexes:\n\n```text\nmarks[0]\nmarks[1]\nmarks[2]\n```\n\nArray-level constraints such as `minItems` and `maxItems` report the path of the array itself. For nested arrays, the complete parent path is retained, for example `orders[1].items`.\n\n### Nested Fields Inside Arrays\n\nPaths can also identify fields inside array elements.\n\nFor example:\n\n```text\nproducts[0].quantity\nproducts[1].quantity\nproducts[2].price\n```\n\nThis provides enough information for consumers to identify the exact field that caused the validation error.\n\n### Why Structured Paths Are Useful\n\nInstead of parsing an error message to determine which field failed, applications can directly use:\n\n```js\nerror.path;\n```\n\nFor example:\n\n```js\nconst result = perfectPayload(payload, validationRules);\nif (!result.valid) {\n  result.errors.forEach((error) => {\n    console.log(error.path, error.code, error.message);\n  });\n}\n```\n\nA frontend can also map validation errors by path:\n\n```js\nconst fieldErrors = {};\nresult.errors.forEach((error) => {\n  fieldErrors[error.path] = error.message;\n});\n```\n\nResult:\n\n```js\n{\n  \"email\": \"Invalid email format for attribute email\",\n  \"address.location.latitude\": \"Invalid type for attribute address.location.latitude, required number value\",\n  \"marks[2]\": \"Attribute marks[2] should have a value between 0 and 100\"\n}\n```\n\n## Examples and Usage\n\n### Sample Validation Rule\n\nsample-1\n\n```js\n{\n  firstName: {\n    mandatory: true,\n    allowNull: false,\n    type: \"string\",\n    minLength: 3,\n    minLengthError: \"First name must have minimum 3 characters.\"\n  },\n  lastName: {\n    mandatory: false,\n    allowNull: true,\n    type: \"string\",\n  },\n  email: {\n    mandatory: true,\n    allowNull: false,\n    type: \"email\",\n  },\n  phone: {\n    mandatory: true,\n    allowNull: false,\n    type: \"string\",\n  },\n  age: {\n    mandatory: false,\n    type: \"number\",\n    min: 1,\n    max: 120,\n  },\n};\n```\n\nsample-2\n\n```js\n{\n  id: {\n    mandatory: true,\n    allowNull: true,\n    type: \"uuidv4\",\n  },\n  batchId: {\n    mandatory: true,\n    allowNull: true,\n    type: \"objectId\",\n  },\n  firstName: {\n    mandatory: true,\n    type: \"string\",\n    minLength: 3,\n  },\n  lastName: {\n    mandatory: false,\n    allowNull: true,\n    type: \"string\",\n  },\n  age: {\n    type: \"number\",\n    min: 0.1,\n    max: 120,\n  },\n  isAdult: {\n    type: \"boolean\",\n  },\n  totalWins: {\n    type: \"number\",\n    min: 0,\n    preventDecimal: true,\n  },\n  email: {\n    regex: /[^2]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/,\n  },\n  githubLink: {\n    type: \"url\",\n  },\n  accountStatus: {\n    type: \"enum\",\n    enumValues: [\"Active\", \"Inactive\", 200],\n  },\n  marks: {\n    range: \"0-100\",\n  },\n  allMarks: {\n    type: \"array\",\n    allowEmptyArray: false,\n    elementConstraints: {\n      type: \"number\",\n      allowNull: false,\n      range: \"0-100\",\n    },\n  },\n  totalScore: {\n    type: \"number\",\n    dependency: {\n      result: {\n        setDependencyRule: (totalScore, result) => {\n          return { mandatory: true, allowNull: false, type: \"string\" };\n        },\n      },\n    },\n  },\n  result: {\n    type: \"string\",\n    dependency: {\n      totalScore: {\n        setDependencyRule: (result, totalScore) => {\n          return { mandatory: true, allowNull: false, type: \"number\" };\n        },\n      },\n    },\n  },\n  minSalary: {\n    mandatory: true,\n    min: 1,\n    type: \"number\",\n    dependency: {\n      maxSalary: {\n        setDependencyRule: (minSalary, maxSalary) => {\n          return {\n            mandatory: true,\n            min: minSalary + 1,\n            minError: \"maxSalary must be more than minSalary\",\n          };\n        },\n      },\n    },\n  },\n  maxSalary: {\n    dependency: {\n      minSalary: {\n        setDependencyRule: (maxSalary, minSalary) => {\n          return {\n            mandatory: true,\n            max: maxSalary - 1,\n            maxError: \"minSalary must be less than maxSalary\",\n          };\n        },\n      },\n    },\n  },\n  address: {\n    mandatory: true,\n    type: \"object\",\n    allowEmptyObject: false,\n    objectAttr: {\n      country: { mandatory: true, type: \"string\" },\n      state: {\n        mandatory: true,\n        type: \"string\",\n      },\n      city: {},\n      zip: {\n        mandatory: true,\n        type: \"string\",\n      },\n      position: {\n        mandatory: true,\n        type: \"object\",\n        allowEmptyObject: false,\n        objectAttr: {\n          lattitude: { mandatory: true, type: \"number\" },\n          longitude: {\n            mandatory: true,\n            type: \"number\",\n          },\n        },\n      },\n    },\n  },\n}\n```\n\n### Usage\n\n#### Creating a route with payload validation middleware\n\n```js\n// validatePayload is the middleware that invokes perfectPayload()\nrouter.post(\n  \"/payload-validation\",\n  validatePayload({ rule: <your validation rule json object> }),\n  (req, res) => res.send(\"OK\")\n);\n```\n\n#### ES Modules middleware example\n\n```js\nimport { perfectPayload } from \"perfect-payload\";\nexport const validatePayload = ({ rule }) => {\n  return (req, res, next) => {\n    try {\n      const { statusCode, ...response } = perfectPayload(req?.body, rule);\n      if (+statusCode >= 200 && +statusCode <= 299) {\n        req.validatedBody = response?.validatedPayload;\n        next();\n      } else res.status(statusCode).json(response);\n    } catch (error) {\n      console.error(\"Error validating payload\", error);\n      res.status(500).json({ error: \"Internal Server Error\" });\n    }\n  };\n};\n```\n\n#### Async ES Modules middleware example\n\nWhen your schema contains an asynchronous `customValidator`, the middleware itself must be `async` and `perfectPayloadAsync()` must be awaited:\n\n```js\nimport { perfectPayloadAsync } from \"perfect-payload\";\nexport const validatePayloadAsync = ({ rule }) => {\n  return async (req, res, next) => {\n    try {\n      const { statusCode, ...response } = await perfectPayloadAsync(\n        req?.body,\n        rule,\n      );\n      if (+statusCode >= 200 && +statusCode <= 299) {\n        req.validatedBody = response?.validatedPayload;\n        next();\n      } else {\n        res.status(statusCode).json(response);\n      }\n    } catch (error) {\n      console.error(\"Error validating payload\", error);\n      res.status(500).json({ error: \"Internal Server Error\" });\n    }\n  };\n};\n```\n\nRoute usage:\n\n```js\nrouter.post(\n  \"/payload-validation\",\n  validatePayloadAsync({ rule: <your validation rule json object> }),\n  (req, res) => res.send(\"OK\"),\n);\n```\n\n#### CommonJS middleware example\n\n```js\nfunction validatePayload({ rule }) {\n  return async (req, res, next) => {\n    try {\n      const { perfectPayload } = await import(\"perfect-payload\");\n      const { statusCode, ...response } = perfectPayload(req?.body, rule);\n      if (+statusCode >= 200 && +statusCode <= 299) {\n        req.validatedBody = response?.validatedPayload;\n        next();\n      } else {\n        res.status(statusCode).json(response);\n      }\n    } catch (error) {\n      console.error(\"Error validating payload\", error);\n      res.status(500).json({ error: ","readmeFilename":"README.md"}