{"_id":"react-form-ctl","_rev":"56-66a5a242a8bc5a6615c07a1897fad03f","name":"react-form-ctl","dist-tags":{"latest":"2.0.1"},"versions":{"1.0.19":{"name":"react-form-ctl","version":"1.0.19","description":"A way of validating forms, inspired by Angular's FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^27.0.6","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"gitHead":"a6d3468bb5676da391fda68eb661368c67b552af","_id":"react-form-ctl@1.0.19","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-zhO/lTsyRdvV/dtodlwY2Hq/LqMPBJgwJo5ug3yUBX3YfvBvAmDltDhdkI+x+LhUKgsXp/0YPXC67+bDL2CRDw==","shasum":"a34718645f7ec62066030921be9a58cacd40f315","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.0.19.tgz","fileCount":15,"unpackedSize":35073,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhGo5tCRA9TVsSAnZWagAARlgP/0GfzHNin8u4zRCk/O6n\nL+X+qIgdEW9XyA/21RBURRGcHxnEXVzfvn/qHyW87T7UEnpO8vXFc0Wd/ktp\nAyWE9WUGk/KB/lBGtI7hCYW5ikuiwQIGydmdGzv1iLZ+ahwenTb2AW7he/kx\nHECAr/mddQb+Rvi7OUKqTAAwivvXq9EkTbtEvK9P+ow/0/1RSR5bJHmUOSCx\njtbVPV6KXRrXQuBB/TRuOdy/4ib2Md7WQCoeulogPLCp417QrR3KCy/jySm+\n9YPRzCrSvthh2qNivYEyCHhNdp55S6+VDDRmeYQziXT0+xDcA8QgtAkvXmkk\n1JO0vdEQqJBi2TayR/2inLkgCDHENhTWFDT0WHm6H/BuUAAMewRRB8F51PnP\nQa/voDq9wpKDg148ZKRgmtqSBFd631Jaz6dDTC/PjJowMvyGMvDPsY6/tt/T\nXweoWZBUVhtkotNbqQjgwAFfvg4WcVM086daIgolaptQPy5VcSowOWFxcPam\nRX6H3o2wdVkM8KcYHvLsg9gJ0OkSmizDGDIjGWRTKc0et0q0bZOMVR8flc8L\n/q9AuRqC7vUNpGPcE57p2ecLppjzBmasqONCqSsHh2NDhfNOVQzSS88XXx2l\nC6Gp9ZMkOFNeWohyjypBeNsw4TJhKtZ70pmmHyJHtU/QT2W62GXcpxX384hQ\nkLt0\r\n=F4Ss\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGTLunc63QIvvMam2NZhx2OpLHxZslyu4HLfE8MHBt/7AiEAi5C+/NQASZ7NjbEqWAYh23K81ZFUd5lrzZzYQXWS2JY="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.0.19_1629130349083_0.6290213369892899"},"_hasShrinkwrap":false},"1.0.21":{"name":"react-form-ctl","version":"1.0.21","description":"A way of validating forms, inspired by Angular's FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^27.0.6","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"gitHead":"74f8528c807bfc2a92f0502b4fa94a3bfe9229f1","_id":"react-form-ctl@1.0.21","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-/etomNNBsJ4HngDmO1bhPTDL5zr57MGxsodDnvJ6KHbAxM9tE9I8bOzJqPqJUiQRuTARkWtSsIwciIrVVIKy5A==","shasum":"900b32d384bb925f6ff4b2275cb8a264c8375132","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.0.21.tgz","fileCount":15,"unpackedSize":35107,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhHfp3CRA9TVsSAnZWagAAmvQQAJK1VfVi/plW8UNGws85\nvuq/NzK/RiAGdBt4FkLluRZe8OP5Jg1iO+ZGhqZ+Tlj4+LgQIho431RIqBH6\nPMQDPnMjI3a5NVQ9/jogiKCQtl8W1Bspe3geSmWW/xkzIZSmUD0W0q3Fp/P1\nGANnU4Vd6omf21q/k4G2QZOFhKfb/84mBa1WDVW+klgL8ZXyCyj7mroF5F+1\ncrzAB1g+vKTFd3jncPHMcnQtPlKrIEQhnpaatVAl2LSRJfQAFFQGo3dYNqAo\nihi8OTcLtSVU4X9tV0VgGrNAf7uBCiganCJX03l2JuQCBEpnZgF/YSL8ZJAw\nQQnbHgymiI6fZ8k0g1TEl+hlIx+w0ECBzYK0VlabMPq2WaSvT3nkhtU1CXhi\nh/6t82f8k3mAr4FkZccnxAfGEzv2nKbP+WSbKlq0UiscmjgUrzgtexrFIlfR\nH+aFkFcie6eXamgIBPjvvoqqcKgJsj3yOG4m54OLVcMYNZJ1xamlwx6HYVFy\nJu6Y1GRoWFlzgMn+EYzlw9tFOnxa5t1W6oOjI2f56Nwjf3og0y24tCY8+RR9\nORoKA8Q+PoYj1SbqsCLARVh1eWRZ0DVJmd8+OjC0CV8IQ/FAjlQiCKI88HOI\nVFVn7yuOn2RlhkkBBjyoJIIey2aHIcbXicIMgw+zj9Cufn0HSWd+mHAT6R5R\nwmjp\r\n=6M1a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3Zf3YePKOYJV/lrN4fm11x4+fh1BpUUZQKGUnifO76wIgObq2ac3h91iaMkQTlMHO1u1Kwsk/dCdGIXuMxLKQJ8I="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.0.21_1629354615426_0.03467833046612778"},"_hasShrinkwrap":false},"1.0.22":{"name":"react-form-ctl","version":"1.0.22","description":"A way of validating forms, inspired by Angular's FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^27.0.6","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"gitHead":"f46f9262c9c05c9ba04b0a442a47b1ef00dee492","_id":"react-form-ctl@1.0.22","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-VBhhZ898POpoT8Z69Xo1sAgbJ/0Aw6bwSJGQCJMae08VslZjSoUZvIVe3MaWY46JTD1wl/fOqcIFiE9v/GJqHg==","shasum":"31393da98e7560c510e6548fb72930af6e40f923","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.0.22.tgz","fileCount":15,"unpackedSize":46118,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhI3ugCRA9TVsSAnZWagAAXwYP/AmuZx8Jf9fqrnJR+aK+\nV7xejPbPRFgDOX4x2JrW0dchY0OQlkjJGN0/YJYu5YQnk3gu1uv//oIedJ17\nfshZ6Nlp6Gaeh5wfulJgFxw2+Q9R6BFRoYNfRe4mgzW+VaO0+JGiQZVl/jmQ\nFzSmmaqt28Tcu9X0ErSU03KxHHfOtyZfTbRp/suWRhwSq8QiSkfoErlemSdj\nnixflpZOsb7l+zIIhKH7PEyV6wBROQsLkMiZhgvapUE8sv+gAX/n63B+FaR+\n1Uv+7g1P2SBcOV6ZITBBeo8U9EpKSERSikUL6uoI6ZvGZgMTUzDDobdavRdv\nvrkYj3mmWPGOPyDyEaqa+ETZ/hRwYWjzM4WJdFPZb/kwZ+x64k2X9/AJMbws\n3F7p3maviQYzBxiRCiBnrxkQq11jAYfQFe3NUJYHk6JyGccczhrZwxi57OBg\n4dFVdllk+IF1B398Eg+ISv6eJiIW0qMqSZjwy2503KolAP6suvawU3RpKv0d\nH8HZnHAzD8F75IGfVgP1zn6FI4+Lt+0HA3dYzPEn2kLLgJRBgEb+YOVgWBx+\nz+9JTBS95rlppGJUVwRoWR1SLckVcEC998E86QGCQz2RsdKPqXZiRSPFR32f\nrPEgVxf9WPiqaWge87gogL+z8BjrrZSK5fybClVvxjWzWbiaU+6B+u18WIdo\nRGqz\r\n=y6Bp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJztlVnLwvUWspThIrmUbTAEAEzo/g8ckwsBEbGHIaoAIgVOi9bunw/mlH9Dl+e4mq+0kfazzlQECcOb1VILcP4Lg="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.0.22_1629715360011_0.26590388278843924"},"_hasShrinkwrap":false},"1.1.2":{"name":"react-form-ctl","version":"1.1.2","description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^27.0.6","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"gitHead":"fd1fec90798da4d47e6f1cb2bfbf03a8666ec1b2","_id":"react-form-ctl@1.1.2","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-/3zAqvaKogp+6FjZ4XlHXfmuQXsCBbxUXskGxpvGLUCo3iNWKdCvIng95SbqWw7VG+aIzxCAsiFkMkUprrYj1g==","shasum":"291454a549aa8aea7569e795351c9daac0acc663","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.1.2.tgz","fileCount":27,"unpackedSize":65617,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhJ3KECRA9TVsSAnZWagAA7VMP/3eqT/e/GX71P6TTXNMW\nRe96Y5Ux0KyT164LQ24PKMwh7ZNqjxM9oiXoWpZf51Pla9MUrFp4CJEvEDEA\nz58ZWEng0AXpojFkQo9srtCI2Ohzh1ZshqeB5abCFcql2vEoqfcyjR60uuco\njbGgXrKOXEAEL1SV/XU/3jyylzD5SwVECqPjDJAwJdCRI44x/S8/NatmGzgk\no8lZLfNuj9RGE/Jo6CG8raPF46LYGnRhbtzYeYP/yexKpJ2tW+eAMUX3xqSr\n00mdCh+4IEQ2eNpipSFZ8Be3zGGMOLTH2w5YOnbupNdzW8DkJi4yS0wy4ic/\nvfKaQK2guLfN0EorZJbgYUNVc4J7ass0vhPrPb+lIUtp7R+08NtyGFNZ6cty\ns43hWaGEtHLcZwxgJlDmyGDDxnOtxjKhjaNa4Lw989QZB43wUADCnDMLwvPi\nN9tAA9+l+oIiuXxfn657opcD5owjgF/DWdMqi/+xcr8Zx3BImGNL00+LQfBO\nmd2249UseRPcPfDRm1ND0fDCYZD1tynvY+nc+e7yrwYvPKQ8Gb3vlSLEC33N\nvJ0Vbo5fIUYaBFL33HjyVhkk+cPtAbuq1340osj2HLd7iPUiXEFOtJikxkRj\nOhkGDhtXbDngh3fVDVJ1/uqvhmADR1rcoZEJP2aXo5YAQtVJTqkKbfUcoNfB\nbEPg\r\n=vk3u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDzSt5BgD8ewzf1qxkYnqmA/3gKUWYmW3uws9RKPrJu3AiBZiXTlIr9MSGdQ1OMkWnKExY+PRtOXsSndVea9Zl9JMg=="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.1.2_1629975171785_0.48652466602270406"},"_hasShrinkwrap":false},"1.1.4":{"name":"react-form-ctl","version":"1.1.4","description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^26.6.0","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"gitHead":"1a32485d84cfcf79f51f566f5ad74554f6aa9d1d","_id":"react-form-ctl@1.1.4","_nodeVersion":"14.15.1","_npmVersion":"6.14.8","dist":{"integrity":"sha512-KosJ6tKgc5F+D16g/spJG+K4mJYRjn0zM5lh1rB6lblgJUN8YEtIeSziX2xBf59oSULqSJDpQQh1pWbhWGq1HQ==","shasum":"36c1126647a632323c5474b6bf4f99de525ce2b1","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.1.4.tgz","fileCount":27,"unpackedSize":66775,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhL6h/CRA9TVsSAnZWagAAOCkP/jsABHWCSy9ZZ7IKTJBw\nH8kfejVs8Xfmai+R4yO41hdwYVvz4qVWTmW6f/qnV1l5kJHGzciKi8VSJIYc\nOhuBqkHRSYg8di2I6qes+LEb4AnAWyE48q1qXI4LK8AdAaTJNZlvjN+0EquR\nZcqPmgW8etlVuXCGkgWPhD3XZpAZDhcyNlfYvYQ0nKNZUPnmzlbyP4r9xirh\n/8LlsbuW4NZ4xGeWJvDsTBykaSO2aBlmpmagte+sEfo0sIjbWUcsn+6OTA3/\nKQe2+aPX2QHUE0vN/6GSZi3TOt4LXRbLoZY2l4Gi9sGiQBvckFbK5F3iuUAd\nWM7eCYUUoWQ+7m6xgOQAPjGo8h/ONTZ0PmP4aoQWJTNa7PSOVIWI1ZPaAIC8\nIfLbYOaMPGHkZsAfHbMtCPNhBMG/1/OQa4pHq7hcdyMwDH1j8Ju2nAKcnQOC\n1BnImkLg17fS7y9FwLAUsLj5bJjmQXxqWyD8BBExdlFIImG08bmcDQcBAo58\nANF2K8Kg2kYWyEjcUiAIYVFD9lF+GWoLKAxQNKD64jtElKguk+1a+CAzaKVM\nWjvnjYB6uccm0PaqgrG8Mq13WS7GznkpIEjdHk9IyZ1PgiV7puhDoBgZNExS\npmIpkY0YykzayqSp7Q4snlhJjzq/lPgfT5HzLe4huW1+1+3QImbHoHYHNbLb\nBgZD\r\n=toPh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDc4OMS5HVYRF5ZZzJGutHN2dHWlVm6RDUVtqqxOKqN7QIhAOaLmd56+nl5AzDsNAG7OzKt33XNCA06QK+jgbDu5rQh"}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.1.4_1630513278919_0.7334506464918165"},"_hasShrinkwrap":false},"1.1.6":{"name":"react-form-ctl","version":"1.1.6","description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^26.6.0","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"types":"./dist/index.d.ts","gitHead":"aa64ffdb395eccedf832f93d07e635779a93206f","_id":"react-form-ctl@1.1.6","_nodeVersion":"14.15.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-dDJ+LNX6/V/g61B21A++U4RDzAKP18E6wWkMJnEQPlIaKnS90qI+j3cgM6iqnI7oQyJfivweyRLQj4saEiPqog==","shasum":"05b37b9c33a966a5c613b5829001d294a2500005","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.1.6.tgz","fileCount":15,"unpackedSize":42326,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHJZ6avwdvGiqzIrmQn0cRLd9cSFI+PzJTd4huEjuJEpAiEAy7rb6DX+Tbf0qzYqH6v+M30Ma7zoUOqKtYJv2+Bo+xg="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.1.6_1634723487452_0.9274521534718438"},"_hasShrinkwrap":false},"1.1.7":{"name":"react-form-ctl","version":"1.1.7","description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^26.6.0","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"types":"./dist/index.d.ts","gitHead":"1c5497ad251d24d297517caf8e13170839538792","_id":"react-form-ctl@1.1.7","_nodeVersion":"14.15.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-zh1Yx6zmnQb4Jp1S1a7MzeSCTb0Z/kY9q4Hnosd97WNPUnPrYa1aqETz60Zsyw2TxL/h7NIDNnOOvEHHH4vpSg==","shasum":"914478b0b475fc1b31146f18726053a17923faa3","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-1.1.7.tgz","fileCount":15,"unpackedSize":43009,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh24UeCRA9TVsSAnZWagAAvk4QAIfNC+GLyvWg3nO17H1q\nsnozExHWijPoqU/DWKYsEcEMnZOL42eCdaYcH2CqnWzjSRt7OoBCRdLchktO\nW8hRiM/MT0tw8YOkOrdRIdHaCXHos+YSzdYDnUo3UwvOt9RMxJJQswhj+wma\nUb0zaywFYvrVPFcT7gH9mj2txxETfRdolPAn/3aeUhgM4OsV2lxZh0UpqZWf\nW3BZq/nqsw/wCRfUqwoC5v/JUf6v7L7RbimRukAn+FDJE5GmvTwTopdRsfJo\nKk0uGOMEZUnPK+97D77tic86AyBXPq7noWX5b4BiZCww2gB2SRz6uqfypX/3\nPiToeUYjr7CLsEp9snQV+s4D7PcueKTIiYLmctZvCO6Uht5+eXgJ2UKuR0UJ\nWaw8n4jIeqsI/UB7dNcvFYibhPAav5jQvoXVokOlC6DDdJrdXOEeXsHUS9ar\n0k2gPTjD4F1AOdRVOHZIkADFRfZ2Dr/Hu6PkEjDIwlN9zTEsF34IToEgzJ/A\nn3zHqbqpywK+hEczVU2udr//3l3jpOya/T5xhT+ieg2pkTFk9eIhXXhJh5uG\nt0YpfG3t+2VELJBSdWVAPfx3ddCYyFgsJmOMbtI+Vc8A9yAaKI303yylPFB5\npqOwbMwJPvm9NIJUPGZnO9H+e3NT4adxETYxRyVnIxn0LmLAE2ZiIglOpLkT\np+aA\r\n=/Orr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICsaipKzyI8BLLlFc4CQd6Jr5CsemY/kkair6ed8m3KwAiEAnvnkJIr4GyHlx9w2A3aWr2dCcYubJdRemQ3RUTUuSjc="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_1.1.7_1635411704722_0.6875542478328205"},"_hasShrinkwrap":false},"2.0.0":{"name":"react-form-ctl","version":"2.0.0","description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","babel-jest":"^26.6.0","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","rewire":"^5.0.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"types":"./dist/index.d.ts","gitHead":"30e4eb3d59a7a4e635ae631ea1f3b611ef5d9232","_id":"react-form-ctl@2.0.0","_nodeVersion":"14.15.1","_npmVersion":"8.1.0","dist":{"integrity":"sha512-YnYw6IjfrE6UF9hZiwaLMvGNTsz+fLsYDVyvkHvSlJhxIW+zy73CBsO3k1YuAzGChSYjo7Qv2cYv3A/1PBuQhw==","shasum":"6ef6af7b5ec7361b1c576bd5262b0925085ee7a7","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-2.0.0.tgz","fileCount":15,"unpackedSize":45516,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiDnF3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7DQ/+OW9eqGsdx9ZDnXHUEWVFf0bNDYbPmov80y+Co/Bs2tWC1fdA\r\nGu4OJRUoVVG2b/6BHL78WLJq/+3LZ5Dv3cO17uBjsJGaD89ixuFxrgcVJLzw\r\n6cWoNL56+u7o5ydJwpL11eLZnHYmNWCwej7l9fDwpPrYNaEJrq01b7worEmX\r\nVwjFsDgJsk+YYPUT1mjCxqIOXxz0uEa3Kh1iOARVVcQsh8XF/z6cvSRJn2z0\r\nSfcdCah3ZO1HRO/MSqteyEVS+GTH00BxbjAvxn4KO1cf+UgWHjnb5cSnfTQH\r\n9fTI+1HipV74Mc3WjT0r4Ka6JXoTnzSnnfnwdIBmOlyu4JwAJsFIzBm4ddtH\r\n/ARAz0xPly2idkTKH8069uJCLkFHHpWaxCPKqLLcQJX+E7ut5hfwtsaEsU+u\r\nmGJQETdLAkAzKNlxPHHMWXf3aUiT39LHYyjysyYUwTGKX1ILWblCO8Rf+CKp\r\n8eFO/rGrKuOKHPcFMxsQ5zaANjN7elPbM8sxuzTYmNNkU6lBTCLHFCkz4QfA\r\n3zBWVbw9MloxZqUnz/cL8IhjhvVFZeByKbRokdZUDIVA/rFdIm8ZfIaUPyT5\r\nAxBZgIjkENJAp0QoIpjs3fzWcmondvyLAYOQ9gxO3KRII3KejdfgwuyMNpfU\r\nLF0D7Tc/CS9zlbQUJaT2WAphuwvkM5p3L2E=\r\n=vFaE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIApc0Jiq1UD89fnoAebAIaPARyxLLfmq1c+V0ZsGpXOaAiEAsjgP3dTMAzb3f37+6tOk6lpwompWSaVgzeBHVSLWB8E="}]},"_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"directories":{},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_2.0.0_1645113719750_0.35839696161785506"},"_hasShrinkwrap":false},"2.0.1":{"name":"react-form-ctl","version":"2.0.1","description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","main":"dist/index.js","scripts":{"build":"tsc","format":"prettier --write .","test":"prettier --check . && eslint . && jest --coverage","prepublishOnly":"npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"keywords":["react","forms","validation"],"author":{"name":"Maurice el-Banna"},"license":"MIT","bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"homepage":"https://github.com/MauriceNino/react-form-ctl#readme","peerDependencies":{"react":"*"},"devDependencies":{"@types/chai":"^4.2.21","@types/chai-enzyme":"^0.6.8","@types/enzyme":"^3.10.9","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.24","@types/react":"*","@types/rewire":"^2.5.28","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","babel-jest":"^26.6.0","chai":"^4.3.4","chai-enzyme":"^1.0.0-beta.1","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","eslint":"^8.11.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","eslint-plugin-react":"^7.29.4","eslint-plugin-react-hooks":"^4.3.0","jest":"^27.0.6","prettier":"2.3.2","react":"^16.14.0","react-dom":"^16.14.0","ts-jest":"^27.0.4","ts-node":"^10.2.0","typescript":"^4.3.5"},"gitHead":"ddee4f642cb273b73072d757cf08891f897fe18c","_id":"react-form-ctl@2.0.1","_nodeVersion":"12.18.3","_npmVersion":"6.14.6","_npmUser":{"name":"mauricenino","email":"mauriceprivat98@gmail.com"},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"dist":{"integrity":"sha512-+hSNzr8PYKHStnZeNWrB+8208A0AGwtzpp2JdWdlUNFbLJ/tIRqprRtnr3NdtdD0/PJkqfv1Nf7AwLhOmdIFrA==","shasum":"6fdb7d3087f9aece3923978c1d015f3d88ee7792","tarball":"https://registry.npmjs.org/react-form-ctl/-/react-form-ctl-2.0.1.tgz","fileCount":17,"unpackedSize":48480,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBi4RDlIbilUmD1VKn+u1cstS5LmdwNgeEEJrBaGAyLWAiAqeZ79OynUXRFLEI82CrB9rS9lQh6FMrfJ+UqUrFXhyQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiXnutACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrygRAAlCqPM8PEzpKoiT0YixbfWJdYJ6jNDC+FhPq4fj6O4zkIKEHo\r\n/pdI+XADKwAI3Jk2AtGieOz5y3GPB0bMmfIyFIS7rMrkIrc+vwOl3nEfW/7K\r\njLlWRZqh0NH1reTkejYqQLx84z8Jy+TrF9Nrp4MpQyUCuaf7/wXT6Tkf+Wsv\r\nbN0B6dB8Vm3H+bX3zdC3LizCU6THoUxNlJPUwOB9NPd52OvtgMs3bGT4WFEc\r\nJEufq1mDhzYuwyRxFVMQE4e4w0tln4n06DlTQfNnGqRDaFz/mKx9rbTg2JUH\r\nLpsomMmlZ4U0j/c3ONoFhwmdm7dxFy44EnTp5CK3/6oecGVot99JOsGrIo8c\r\nyEVIZGGeP9LJZvu9+V1PQ5goWpU/CZ/Cmbh+Py5Lkbp8ux5t7kkxNmtcKQUJ\r\nQd3b4uil/W30doaYoaQpnZoBaVv9jVMI2AwyfuJ3H5R16u4Xt+FM/1E9VwlV\r\nVgnVV4oBJvGAqbwr8M4AjodSfkfYnVCfuPK1H/fNkxiTCp66V50haptYs7XN\r\nAC3vn42Lx17EHep2v98RQ5mcZAWUzwLlcFPjGPqmu5POjamW9RhkzRYb4xFW\r\n4urrFOXKi8FSbCkTAqKRATnwrUNncpb0s+KRdR1FkZHCfuCTW6nYM3cjzQQn\r\n/xNk5kiWLNI/vzzcHAU08HLpe3+C2ycNFaQ=\r\n=8Sez\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-ctl_2.0.1_1650359213130_0.38265408677603396"},"_hasShrinkwrap":false}},"time":{"created":"2021-08-12T14:06:03.750Z","1.0.0":"2021-08-12T14:06:03.909Z","modified":"2022-05-14T11:09:56.209Z","1.0.1":"2021-08-12T14:09:39.752Z","1.0.2":"2021-08-12T14:11:09.873Z","1.0.3":"2021-08-12T15:13:57.606Z","1.0.4":"2021-08-12T17:08:43.594Z","1.0.5":"2021-08-12T17:09:09.975Z","1.0.6":"2021-08-12T17:28:01.755Z","1.0.7":"2021-08-12T18:03:36.421Z","1.0.8":"2021-08-12T18:10:46.193Z","1.0.9":"2021-08-13T12:32:23.496Z","1.0.10":"2021-08-13T12:51:17.389Z","1.0.11":"2021-08-13T20:10:43.005Z","1.0.12":"2021-08-14T00:22:54.636Z","1.0.13":"2021-08-16T12:31:56.483Z","1.0.14":"2021-08-16T14:29:40.383Z","1.0.15":"2021-08-16T14:56:17.190Z","1.0.16":"2021-08-16T15:26:55.345Z","1.0.17":"2021-08-16T15:33:10.542Z","1.0.18":"2021-08-16T15:48:28.898Z","1.0.19":"2021-08-16T16:12:29.211Z","1.0.20":"2021-08-19T06:20:39.882Z","1.0.21":"2021-08-19T06:30:15.625Z","1.0.22":"2021-08-23T10:42:40.206Z","1.1.0":"2021-08-26T10:52:00.511Z","1.1.2":"2021-08-26T10:52:52.167Z","1.1.3":"2021-09-01T15:24:14.677Z","1.1.4":"2021-09-01T16:21:19.106Z","1.1.5":"2021-10-20T09:48:31.742Z","1.1.6":"2021-10-20T09:51:27.627Z","1.1.7":"2021-10-28T09:01:44.873Z","2.0.0":"2022-02-17T16:01:59.912Z","2.0.1":"2022-04-19T09:06:53.318Z"},"maintainers":[{"name":"mauricenino","email":"mauriceprivat98@gmail.com"}],"description":"A react hook for validating forms and keeping track of state, inspired by Angulars FormControl","homepage":"https://github.com/MauriceNino/react-form-ctl#readme","keywords":["react","forms","validation"],"repository":{"type":"git","url":"git+https://github.com/MauriceNino/react-form-ctl.git"},"author":{"name":"Maurice el-Banna"},"bugs":{"url":"https://github.com/MauriceNino/react-form-ctl/issues"},"license":"MIT","readme":"\n<!-- markdownlint-disable -->\n<h1 align=\"center\">React Form Ctl</h1>\n<div align=\"center\">\n  <a href=\"LICENSE.md\" target=\"_blank\">\n    <img src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT License\">\n  </a>\n  <a href=\"https://www.npmjs.com/package/react-form-ctl\" target=\"_blank\">\n    <img src=\"https://img.shields.io/npm/v/react-form-ctl.svg?style=flat\" alt=\"npm version\">\n  </a>\n  <a href=\"https://drone.mauz.io/MauriceNino/react-form-ctl\" target=\"_blank\">\n    <img src=\"https://drone.mauz.io/api/badges/MauriceNino/react-form-ctl/status.svg\" alt=\"Build Status\">\n  </a>\n</div>\n\n<br/>\n\n<p align=\"center\">\n    React Form Ctl is a <b>simple</b> and <b>type-safe</b> way to handle form values and validation with both React and React Native. \n    <br/>\n    It is inspired by Angulars <code>FormControl</code> and/or <code>FormBuilder</code>\n    </br>\n    </br>\n    You can view a live demo of it using <a href=\"https://codesandbox.io/s/keen-wind-ipdmb?file=/src/App.tsx\">this CodeSandbox link</a>\n</p>\n\n# \n<!-- markdownlint-enable -->\n\n## Why use react-form-ctl?\n\n- No runtime dependencies, only requires React as a peer dependency\n- Fully type-safe\n- Localization ready (i18n)\n- Simple API that will be familiar to Angular developers and easy to learn for\nReact developers\n- All state handling is done for you\n\n## Installation\n\n```sh\nnpm install react-form-ctl\n\n# or\n\nyarn add react-form-ctl\n```\n\n## Basic Usage\n\nA quick example can be as easy as implementing a hook with some initial data and\nspreading the given properties onto a input element:\n\n```tsx\nimport {useFormControl} from 'react-form-ctl';\n\n// Inside component\nconst {controls} = useFormControl<FormData>({\n    name: ['John'],\n    // ...\n});\n\nreturn <>\n    <input\n        type=\"text\"\n        {...controls.name.inputProps()}\n    />\n\n    {/* ... */}\n</>\n```\n\nThere are a number of input helpers available:\n\n- `inputProps` -> for HTML `input`s\n- `numberInputProps` -> for HTML `input`s of type number\n- `checkboxProps` -> for HTML checkbox `input`s\n- `rnInputProps` -> for React Native `TextInput`s\n- `rnNumberInputProps` -> for React Native `TextInput`s of type number\n\nAlthough if you want more granular control, you can do all the state changing by\nyourself, using the exposed properties:\n\n```tsx\nimport {useFormControl, Validators} from 'react-form-ctl';\n\n// Inside component\nconst {controls} = useFormControl<FormData>({\n    name: ['John', [Validators.required, Validators.minLength(3)]],\n    // ...\n});\n\nreturn <>\n    <input\n        type=\"text\"\n        value={controls.name.value}\n        onChange={(e) => controls.name.setValue(e.target.value)}\n        onBlur={() => controls.name.markTouched()}\n    />\n\n    {/* ... */}\n</>\n```\n\n## Error Handling\n\nIn case you want to write a more specific error message for different errors, it\nis recommended to supply a Map with your error messages like in the following\nexample. Note that this will only be applied to the first error supplied by the\nfirst failing Validator.\n\nThis Error-Map is also a good chance to bring your localized form data in.\n\n```tsx\nimport {useFormControl, extError, Validators, ErrorMappings} from 'react-form-ctl';\n\nconst {controls} = useFormControl<FormData>({\n    name: ['John', [Validators.required, Validators.minLength(5)]],\n    // ...\n});\n\nconst errorMap: ErrorMappings = {\n    required: () => 'Field is required',\n    minLength: ({length, expectedLength}) => `Minimum Length: ${length}/${expectedLength}`,\n    default: () => 'Unknown error' // Default mapping fires, when no mapping is given for another error\n                    // If no default mapping is set, a runtime exception may be thrown for unknown exceptions\n};\n\nreturn <>\n    {/* input field */}\n\n    {/* Check if the property contains errors (invalid) \n        + also check if the property has been modified (edited or touched) */}\n    { controls.name.invalid && (controls.name.touched || controls.name.dirty) && <div>\n        {extError(errorMap, controls.name.error)}\n    </div>}\n</>\n```\n\nAlternatively, you can also get all errors manually and implement your own error\nhandling like so:\n\n```tsx\nimport {useFormControl, Validators} from 'react-form-ctl';\n\nconst {controls} = useFormControl<FormData>({\n    name: ['John', [Validators.required, Validators.minLength(5)]],\n    // ...\n});\n\nreturn <>\n    {/* input field */}\n\n    { controls.name.errors?.required && <div>\n        Field is required\n    </div>}\n    { controls.name.errors?.minLength && <div>\n        Minimum Length: {controls.name.errors.minLength.length}/{controls.name.errors.minLength.expectedLength}\n    </div>}\n</>\n```\n\n## Validators\n\nThere are a number of Validators already included:\n\n- required\n- requiredTrue\n- minLength\n- maxLength\n- numeric\n- min\n- max\n- regex\n- if (can execute validators based on a condition)\n\nIf you need more validation types (email, phone number, ...), we recommend using\nthe [Validator.js](https://github.com/validatorjs/validator.js) library.\nCheck their documentation for more information about the available validators.\n\n```sh\nnpm i validator && npm i -D @types/validator\n\n# or\n\nyarn add validator && yarn add -D @types/validator\n```\n\nYou can then implement your own validators and pass them to the Validators array:\n\n```tsx\nimport {useFormControl, Validators, InternalState} from 'react-form-ctl';\nimport isEmail from 'validator/lib/isEmail';\n\n// A simple custom validator\nconst nameNotBlacklisted = Validators.create((value: string) => {\n    if(['Max', 'Anna'].includes(value)) {\n        return {\n            name: 'nameNotBlacklisted',\n            found: value\n        };\n    }\n});\n\n// You can also create parametrized custom validators\nconst isExactAge = Validators.createParametrized((age: number) => {\n    return Validators.create((value: number) => {\n        if (value !== age) {\n            return {\n                name: 'isExactAge',\n                expected: age\n            };\n        }\n    });\n});\n\n// You can also check against other form values in your validator\nconst passwordRepeatMatches = Validators.create(\n    (passwordRepeat: string, state: InternalState<FormData>) => {\n        if (passwordRepeat !== state.password.value) {\n            return {\n                name: 'passwordRepeatMatches',\n                expected: passwordRepeat\n            };\n        }\n    });\n\n// You can use the Validator.js library to write your own custom validators\nconst validateEmail = Validators.create((email: string) => {\n    if (!isEmail(email)) {\n        return {\n            name: 'validateEmail',\n        };\n    }\n});\n\n// You can use the \"if\" Validator to create conditional Validators\nconst isSomethingTrue = ...;\nconst requiredIfCondition = Validators.if(() => isSomethingTrue, [Validators.required])\n\n// Then use them like other validators inside your Validators array\nconst {controls} = useFormControl<FormData>({\n    name: ['John', [nameNotBlacklisted]],\n    age: [21, [isExactAge(42), requiredIfCondition]],\n    password: [''],\n    passwordRepeat: ['', [passwordRepeatMatches]],\n    email: ['test@example.com', [validateEmail]]\n    // ...\n}, [isSomethingTrue]); // Needs to pass dependency array, because of the \"if\" validator\n\n// Don't forget to also write custom error handlers if you want\nconst errorMap: ErrorMappings = {\n    nameNotBlacklisted: ({found}) => `Name is blacklisted: ${found}`,\n    isExactAge: ({expected}) => `Expected age of ${expected}`,\n    passwordRepeatMatches: () => `Password does not match`,\n    validateEmail: () => `Email invalid`,\n    default: () => 'Unknown error'\n};\n```\n\n## API Reference\n\nYou will get back an object containing information about the general state of\nthe form and also a more detailed information about each form field:\n\n```ts\ntype State = {\n    controls: {\n        [FieldName: string]: { // For each passed field, you get an entry \n                               // in this object with detailed information about it\n\n            // properties are described down below\n        }\n    };\n    value: FormData; // Get the input data as an object\n    setValue: (value: FormData) => void; // Update the whole form state at once\n    reset: () => void; // Reset the form to the initial values\n\n    valid: boolean; // If the form passed all Validators\n    invalid: boolean; // The opposite of the above\n\n    touched: boolean; // If the form data was set once\n    dirty: boolean; // If the form data was updated once\n    tod: boolean; // Shorthand for touched || dirty\n}\n```\n\nFor each passed field, you will get back the following:\n\n```ts\ntype FieldState = {\n    value: FieldType; // The value of the field\n    setValue: (value: FieldType) => void; // Callback to set the value of the field\n    resetValue: (value: FieldType) => void; // Callback to set the value of the field and setting touched = false & dirty = false\n\n    valid: boolean; // If the value passes all Validators\n    invalid: boolean; // The opposite of the above\n\n    touched: boolean; // If the value was set once\n    markTouched: (value?: boolean) => void; // Set the value to a desired touched state (if no parameter is given, it is set to touched = true)\n    dirty: boolean; // If the value was updated once\n    markDirty: (value?: boolean) => void; // Set the value to a desired dirty state (if no parameter is given, it is set to dirty = true)\n    touchedOrDirty: boolean; // Shorthand for touched || dirty\n\n    error?: { \n        name: string; // name of the error (e.g. 'required')\n        // more custom error properties\n    };\n    errors?: {\n        [ErrorName: string]: { // the property name is the name of the error (e.g. required)\n            name: string; // name of the error (e.g. 'required')\n            // more custom error properties\n        }\n    };\n}\n```\n\n## dirty vs touched\n\nDirty means that the value of a property has updated once.\nTouched means that the input element has been focused once.\n\nA common use-case for those properties is error-handling. An error for a value\nshould mostly only be shown, if the value is invalid AND was already changed\nonce, or the input field has been focused and unfocused again. To implement this,\nyou would have to write:\n\n```ts\nif (somefield.invalid && (somefield.touched || somefield.dirty)) { /* ... */ }\n```\n\nBecause this is so common, `react-form-ctl` has implemented a small shortcut for\nthat:\n\n```ts\nif (somefield.invalid && somefield.touchedOrDirty) { /* ... */ }\n```\n","readmeFilename":"README.md"}