{"_id":"react-form-with-constraints","_rev":"99-4ef901b7bbb1a3037ff109692bd866de","name":"react-form-with-constraints","description":"Simple form validation for React","dist-tags":{"latest":"0.19.1","next":"0.19.0-beta.2"},"versions":{"0.2.2":{"name":"react-form-with-constraints","version":"0.2.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/ReactFormWithConstraints.git"},"main":"lib/index.js","types":"lib/index.d.ts","license":"MIT","scripts":{"clean":"del-cli build lib dist/*.js","preumd":"tsc","umd":"NODE_ENV=development browserify lib/index.js --external React --external ReactDOM --external PropTypes --standalone ReactFormWithConstraints --outfile dist/react-form-with-constraints.js","build":"webpack -d --env.development","build:watch":"webpack -d --env.development --watch","prepare":"tsc && npm run umd","prepublishOnly":"npm run test","pretest":"npm run clean && tsc || true","test":"node --trace-warnings node_modules/.bin/jest --no-cache","pretest:silent":"npm run pretest","test:silent":"node --trace-warnings node_modules/.bin/jest --no-cache --silent"},"dependencies":{"react":"latest","prop-types":"latest","react-dom":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","@types/react":"latest","@types/prop-types":"latest","@types/react-dom":"latest","browserify":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","enzyme":"latest","@types/enzyme":"latest","react-test-renderer":"latest"},"engines":{"node":"^6"},"gitHead":"3ffce98cca42985f2fd5a0f9a379c8ecfa2a6068","description":"Simple form validation for React in ~300 lines of code","bugs":{"url":"https://github.com/tkrotoff/ReactFormWithConstraints/issues"},"homepage":"https://github.com/tkrotoff/ReactFormWithConstraints#readme","_id":"react-form-with-constraints@0.2.2","_shasum":"290846fbf06078f955b44c9bac3e9232bdf4f9ef","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"shasum":"290846fbf06078f955b44c9bac3e9232bdf4f9ef","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.2.2.tgz","integrity":"sha512-ZUie+yIooU4iUI5zAAlpGiLutrVogUuQVDabkIpRHTkhwhGimtOMUsudh4oEfi7hmIeXTP1hrDMNoH+c6l2Asg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPDWRrQpW5LSfhqGhUsLvTQ718fr5i8hkkRcasb9tqMwIhAMQ9anlU4nkXaeqaaZvrCiqyTgZWaJvAepVmIdikdqXw"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.2.2.tgz_1495305275096_0.5326773547567427"},"directories":{}},"0.2.3":{"name":"react-form-with-constraints","version":"0.2.3","repository":{"type":"git","url":"git+https://github.com/tkrotoff/ReactFormWithConstraints.git"},"main":"lib/index.js","types":"lib/index.d.ts","license":"MIT","scripts":{"clean":"del-cli build lib dist/*.js","preumd":"tsc","umd":"NODE_ENV=development browserify lib/index.js --external React --external ReactDOM --external PropTypes --standalone ReactFormWithConstraints --outfile dist/react-form-with-constraints.js","build":"webpack -d --env.development","build:watch":"webpack -d --env.development --watch","prepare":"tsc && npm run umd","prepublishOnly":"npm run test","pretest":"npm run clean && tsc || true","test":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","pretest:silent":"npm run pretest","test:silent":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage --silent"},"dependencies":{"react":"latest","prop-types":"latest","react-dom":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","@types/react":"latest","@types/prop-types":"latest","@types/react-dom":"latest","browserify":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","enzyme":"latest","@types/enzyme":"latest","react-test-renderer":"latest"},"engines":{"node":"^6"},"gitHead":"799daab18921f57979c0cfedf12b828eafab55dd","description":"Simple form validation for React in ~300 lines of code","bugs":{"url":"https://github.com/tkrotoff/ReactFormWithConstraints/issues"},"homepage":"https://github.com/tkrotoff/ReactFormWithConstraints#readme","_id":"react-form-with-constraints@0.2.3","_shasum":"38729dae00e58c1446db972a9e78e8c499a960c0","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"shasum":"38729dae00e58c1446db972a9e78e8c499a960c0","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.2.3.tgz","integrity":"sha512-yx8U7GjT8BV1oLKwRV1c1yq9ceSgSzr4yUp1H66ZTzc44GWy2nfDP6LkhK1htPGET80o/FVRQ1qyh4vX9c2j1Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCZqc9ti4i/ThmLLqE4GwZMhdSVrt904O4ZQmcoMwI6UQIhAKH1WQrT1nE9n+QQvFc9O53YAaYXaGBn2nugiDFY1Ic9"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.2.3.tgz_1496059465846_0.5150424321182072"},"directories":{}},"0.3.1":{"name":"react-form-with-constraints","version":"0.3.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/ReactFormWithConstraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/*.js","preumd":"tsc","umd":"NODE_ENV=development browserify lib/index.js --external React --external ReactDOM --external PropTypes --standalone ReactFormWithConstraints --outfile dist/react-form-with-constraints.js","build":"webpack -d --env.development","build:watch":"webpack -d --env.development --watch","prepare":"npm run umd","prepublishOnly":"npm run test","pretest":"npm run clean && tsc || true","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"dependencies":{"react":"latest","@types/react":"latest","prop-types":"latest","@types/prop-types":"latest","react-dom":"latest","@types/react-dom":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","browserify":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","enzyme":"latest","@types/enzyme":"latest","react-test-renderer":"latest"},"gitHead":"a522f7b6f4f45152f3de32be1a63c1e92e7b546a","bugs":{"url":"https://github.com/tkrotoff/ReactFormWithConstraints/issues"},"homepage":"https://github.com/tkrotoff/ReactFormWithConstraints#readme","_id":"react-form-with-constraints@0.3.1","_shasum":"de5c265183c949cd2913cc749fe2974bccffc5c1","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"shasum":"de5c265183c949cd2913cc749fe2974bccffc5c1","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.3.1.tgz","integrity":"sha512-kEVHyALNzwfdlPOKbhKvFKF5nNUYi2QpCoVVv82CQdZGelDtKOOtCNGWrncvspII1UuMlhCMJI2G1/bORE/Xwg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBBrhKZWnxM1Kz++nOkkq74hZw4WIdh0z8LC92XPnYfwIgOmluLTVChPhU6uMSt9kgaPII8CNMWSVRxpLRBwjZNYQ="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.3.1.tgz_1497972315425_0.8489754314068705"},"directories":{}},"0.4.0":{"name":"react-form-with-constraints","version":"0.4.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/ReactFormWithConstraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/*.js","preumd":"tsc","umd":"NODE_ENV=development browserify lib/index.js --external React --external ReactDOM --external PropTypes --standalone ReactFormWithConstraints --outfile dist/react-form-with-constraints.js","build":"webpack -d --env.development","build:watch":"webpack -d --env.development --watch","prepare":"npm run umd","prepublishOnly":"npm run test","pretest":"npm run clean && tsc || true","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"dependencies":{"react":"latest","@types/react":"latest","prop-types":"latest","@types/prop-types":"latest","react-dom":"latest","@types/react-dom":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","browserify":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","enzyme":"latest","@types/enzyme":"latest","react-test-renderer":"latest"},"gitHead":"4da896ad08f37b8c31f4ca19db35905e8f9d7246","bugs":{"url":"https://github.com/tkrotoff/ReactFormWithConstraints/issues"},"homepage":"https://github.com/tkrotoff/ReactFormWithConstraints#readme","_id":"react-form-with-constraints@0.4.0","_shasum":"d293fc608223f875fa97b39cefc0a857cc977b9b","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"shasum":"d293fc608223f875fa97b39cefc0a857cc977b9b","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.4.0.tgz","integrity":"sha512-opST5+viOLI5oU9cqd9grLe1mFWsWDGOILP5TMLlUadQlKc9kuux7WQupP4+qFx1bs6deiHL4jAjV4k93RAcKA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDr5/uzspFeKIGh6/Id2+2GlFKF6EwMA6v5zQO2BOI/LAiBxbuCi80PctJOmdgIDQHHlUxcQaRd+Vl97gqReTAy/Fg=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.4.0.tgz_1498257200428_0.997804124141112"},"directories":{}},"0.4.1":{"name":"react-form-with-constraints","version":"0.4.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/ReactFormWithConstraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/*.js","preumd":"tsc","umd":"NODE_ENV=development browserify lib/index.js --external React --external ReactDOM --external PropTypes --standalone ReactFormWithConstraints --outfile dist/react-form-with-constraints.js","build":"webpack -d --env.development","build:watch":"webpack -d --env.development --watch","prepare":"npm run umd","prepublishOnly":"npm run test","pretest":"npm run clean && tsc || true","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"dependencies":{"react":"latest","@types/react":"latest","prop-types":"latest","@types/prop-types":"latest","react-dom":"latest","@types/react-dom":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","browserify":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","enzyme":"latest","@types/enzyme":"latest","react-test-renderer":"latest"},"gitHead":"7bba5baf8af2bcff93f615906d6323705259c054","bugs":{"url":"https://github.com/tkrotoff/ReactFormWithConstraints/issues"},"homepage":"https://github.com/tkrotoff/ReactFormWithConstraints#readme","_id":"react-form-with-constraints@0.4.1","_shasum":"4fe08652deb6b399d4fc98dd3627dc1e7686a159","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"shasum":"4fe08652deb6b399d4fc98dd3627dc1e7686a159","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.4.1.tgz","integrity":"sha512-WjsKaZe7RvCE5mv7IFvzth/rXXoRaTR8YRZmLMH+TFP22lvWhnn1rR3cJljGGmAgYhkDOaf2yWbFnyEsvvJSOA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjDQazvdyzBtTGv+gA8eEo+G0QsOFy1XvnO7LraLSbWAIgexDq6DmEJP3nlONOkiObT+rty0ck/20+E5iqnhaDP68="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.4.1.tgz_1502328357263_0.2760000955313444"},"directories":{}},"0.5.2":{"name":"react-form-with-constraints","version":"0.5.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/*.js coverage","dist":"webpack --config webpack.dist.config.ts","build":"webpack -d","build:watch":"webpack -d --watch","tsc":"tsc","prepublishOnly":"npm run clean && npm run build && npm run tsc && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","prop-types":">=15","react-dom":">=15"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"latest","@types/react":"latest","prop-types":"latest","@types/prop-types":"latest","react-dom":"latest","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"latest","@types/enzyme":"latest","react-test-renderer":"latest"},"gitHead":"903058a729a1f20059b2f161726e5c7dca243724","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.5.2","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-o9/NLr229Xr90iRgs+8cSyNoIozWdRLMxIPD0Krzpckl4L9B8mOItPxtmHvBGoWDmMw4xBP14CCLqzq3BC9KZg==","shasum":"ee44eaf8a5df78c7b46c6796c0d709eb6a76b782","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.5.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHo2Tf47hMT8K2R37Mx03Hr4HyId9L+yic1nX9VFsDqQIhAIrbTsBOJ/17+pPolWe+j96ODE2LQJgkrv4u+n/W2z4S"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.5.2.tgz_1505171257468_0.6757520048413426"},"directories":{}},"0.6.0-beta.1":{"name":"react-form-with-constraints","version":"0.6.0-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/*.js coverage","dist":"webpack --config webpack.dist.config.ts || true","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc":"tsc || true","prepublishOnly":"npm run clean && npm run build && npm run tsc && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","prop-types":">=15"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.1","@types/react":"latest","prop-types":"latest","@types/prop-types":"latest","react-dom":"^15.6.1","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.1"},"gitHead":"6cb8510b128d30c1f420780ffdf3b1c428c570ab","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.0-beta.1","_npmVersion":"5.3.0","_nodeVersion":"8.4.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-fcWg3Ak5qXDHyfifHKXDJkNaVtgvSYdMNTD8qvKn5uQmY6IOlyVOpy2oDYMrdYcIvLmK3RqbxFjFbDaYrh6SuQ==","shasum":"f0550bf87b21e64a9a38b7222879bca9a0d76595","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.0-beta.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFG/8r/p+VDOIdSpse/tkY74eD++QLgpseRPf7JYc5R/AiEA/huegRXzIJ+o1q1wIamA6ocSwnEOekx0iOPHRwwPWUc="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.0-beta.1.tgz_1506459976814_0.9320261254906654"},"directories":{}},"0.6.0-beta.2":{"name":"react-form-with-constraints","version":"0.6.0-beta.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist:webpack":"webpack -p --config webpack.dist.config.ts || true","dist:rollup":"rollup --config","dist":"npm run dist:rollup","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc":"tsc || true","prepublishOnly":"npm run clean && npm run build && npm run tsc && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","prop-types":">=15"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.2","@types/react":"latest","prop-types":"^15.6.0","@types/prop-types":"latest","react-dom":"^15.6.2","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.2"},"gitHead":"2232177681125109e7fd9c85ce5bcd09976bb939","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.0-beta.2","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-4z2XVWrsfufLPXBUuL1UDr82Krt38ApVc+RMp7cA4L80h9pPGH4ftxE5iB7Fb7my/NowfRKI2Mf/0h8EGO+WZA==","shasum":"f04678610aa23109ea9b85050ddf932e65a76d03","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.0-beta.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF1h1kJRww3MdEvmP3WZ0U2OA4Ikhctf6X6DBiIvs4+FAiEAw1xu8Ab49SyXfM8GLU86Sm6RgmBSX/DjNFXW4ZIsPJc="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.0-beta.2.tgz_1506529360916_0.9802498144563287"},"directories":{}},"0.6.0-beta.3":{"name":"react-form-with-constraints","version":"0.6.0-beta.3","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist:webpack":"webpack -p --config webpack.dist.config.ts || true","dist:rollup":"rollup --config","dist":"npm run dist:rollup","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc":"tsc || true","prepublishOnly":"npm run clean && npm run build && npm run tsc && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","prop-types":">=15"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.2","@types/react":"latest","prop-types":"^15.6.0","@types/prop-types":"latest","react-dom":"^15.6.2","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"github:ezolenko/rollup-plugin-typescript2","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","del-cli":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.2"},"gitHead":"967724955829bfe7c710a742defa032228ba4c92","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.0-beta.3","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-yfkOOBVA8401bCPxn833jk2McgpW62wJiscQkywZ06pOlvCR6bf246JI7X9dqi5ziWy3hpsK1LaIwsIsWGzmLg==","shasum":"32665e3b26ef9cf715ec68bfb5f17ca4f949762a","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.0-beta.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGQR6Gw6MuMIQpatsWdbjkDsT2VRSMv0ISMASQUzZdsYAiEA9EremrTwJCydLeyg/vVsyIE0D1c/LDo8AVsAmzxKKx8="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.0-beta.3.tgz_1506634595272_0.656587039353326"},"directories":{}},"0.6.0-beta.4":{"name":"react-form-with-constraints","version":"0.6.0-beta.4","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc":"tsc || true","prepublishOnly":"npm run clean && npm run build && npm run tsc && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","react-dom":">=15"},"dependencies":{"prop-types":"^15.6.0"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.2","@types/react":"latest","@types/prop-types":"latest","react-dom":"^15.6.2","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"github:ezolenko/rollup-plugin-typescript2","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.2"},"gitHead":"b6fa6426f722c460adbec5bfb9a954a74af332c8","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.0-beta.4","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-AgTvKW3n3QJJ4MFj9tSvLLsW8my7yx90cpMwqJZ0k8bBF3HosjVOW2wkB9yHzf4qjj8oa5Q26PWuFqPmt8s1pg==","shasum":"5d20166359aa259f883642052513c5a70242e361","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.0-beta.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBatHwOtbWHEiSeqZZBKSrKLvX59DwP+w3dlroHK30oKAiAYCrE5C+3G+Yx8AUyd+HBIQcPm/XWXfF1A8Xw4ypcUZA=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.0-beta.4.tgz_1506934996515_0.504680359037593"},"directories":{}},"0.6.0-beta.5":{"name":"react-form-with-constraints","version":"0.6.0-beta.5","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc:lib":"tsc --project tsconfig.lib.json || true","prepublishOnly":"npm run clean && npm run build && npm run tsc:lib && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","react-dom":">=15"},"dependencies":{"prop-types":"^15.6.0"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.2","@types/react":"latest","@types/prop-types":"latest","react-dom":"^15.6.2","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"github:ezolenko/rollup-plugin-typescript2","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.2"},"gitHead":"ff0003160d36004609f7ae509db945937ce4e5db","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.0-beta.5","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-JKAon4x1iFVTXw4qhU1zC8viAc9xf52iQiG1kCcqY5WWib5J/KsowNdjC3Nc7YV0Mp+fijFTQEKa3O2DKYFmqg==","shasum":"b9ef89b8700f4e75654239c7fcecab2bf3e916a2","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.0-beta.5.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCudN9TkQQ0B8SQFtpkZWPS9Qpa0hKYvAQf15BkrY05EQIhALkRdM5nUa2leP8YJ9Lo7o7XPQZ3eSqcEoPYAErPqpOC"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.0-beta.5.tgz_1506949533254_0.5093999530654401"},"directories":{}},"0.6.0":{"name":"react-form-with-constraints","version":"0.6.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc:lib":"tsc --project tsconfig.lib.json || true","prepublishOnly":"npm run clean && npm run build && npm run tsc:lib && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","react-dom":">=15"},"dependencies":{"prop-types":"^15.6.0"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.2","@types/react":"latest","@types/prop-types":"latest","react-dom":"^15.6.2","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"github:ezolenko/rollup-plugin-typescript2","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.2"},"gitHead":"2f43fb70c13107c726cfd3923ef3d339db3f98ba","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.0","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-mKg+1BIqc53It/ywneDxUJj3jEwwxRLBWEvLa1vMYibSsYlbbDKtkkPWf+oejdI7ftzhv9n/PXIgplQNL9zclg==","shasum":"f0ca0465dad282405a54f101840e864193ea2cc3","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQOEazZUO+NGRL/E4QQoA4OmyTeN7Wh1z12iycqDfIsgIhAI6yYxJlEtvErxkTQOco4vTX+2WpL2+DO+jrVyHbK1pX"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.0.tgz_1506955071252_0.5770989991724491"},"directories":{}},"0.6.1":{"name":"react-form-with-constraints","version":"0.6.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"webpack -d || true","build:watch":"webpack -d --watch","tsc:lib":"tsc --project tsconfig.lib.json || true","prepublishOnly":"npm run clean && npm run build && npm run tsc:lib && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true},"peerDependencies":{"react":">=15","react-dom":">=15"},"dependencies":{"prop-types":"^15.6.0","@types/prop-types":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"^15.6.2","@types/react":"latest","react-dom":"^15.6.2","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"github:ezolenko/rollup-plugin-typescript2","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"^2.9.1","@types/enzyme":"latest","react-test-renderer":"^15.6.2"},"gitHead":"7315c646ae8906888c7fefcdcadd8fcbd76c295c","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.1","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-vallxrBXZzDbAtWRfHJh3TD5j3LEZ6TcCsWgu6QabgSHjv4T0uWHP+GnHj5AQPFTjT2ZNQVraAAFmIbATWWVAw==","shasum":"e844b073c1bfb8602cb309d5a57526887b7792e0","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID6w4j+mikyo6cffPiBPzbdBm7MjUmMYfYf738Liop+RAiBzHlPFjcCnR6DxgavfeQ520ZC+/utiJq094zzAiJZeOA=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.1.tgz_1506979477879_0.3959381317254156"},"directories":{}},"0.6.2":{"name":"react-form-with-constraints","version":"0.6.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"cross-env NODE_ENV=development webpack -d || true","build:watch":"cross-env NODE_ENV=development webpack -d --watch","tsc:lib":"tsc --project tsconfig.lib.json || true","prepublishOnly":"npm run clean && npm run build && npm run tsc:lib && npm run dist","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"peerDependencies":{"react":">=15","react-dom":">=15"},"dependencies":{"prop-types":"latest","@types/prop-types":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"latest","@types/react":"latest","react-dom":"latest","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"latest","@types/enzyme":"latest","enzyme-adapter-react-16":"latest","@types/enzyme-adapter-react-16":"latest","react-test-renderer":"latest"},"gitHead":"577183c193f75a4f62e05b64a1804378aea5c71d","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.2","_npmVersion":"5.3.0","_nodeVersion":"8.6.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-KNpbrbLyLWkfT1DMtFI5QwTYpb3cfMMqyUxuUDTPPiDtqBl2ljoAWt9bLIRPrwpWg4rUdAIYTn7KPasDwtxl9g==","shasum":"f81557276b01556fa63bc554de0f8f94f90c4fb7","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEdcZ/rwCAgcBxLKOlW1B/2cnhKrdwpJIPOmJiPAqwpPAiEAlHloZBfEtlKL8WvCEVbJsklBlxFy1hV2dbdKUKn0I9U="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.2.tgz_1507796685302_0.32272245385684073"},"directories":{}},"0.6.3":{"name":"react-form-with-constraints","version":"0.6.3","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"cross-env NODE_ENV=development webpack -d || true","build:watch":"cross-env NODE_ENV=development webpack -d --watch","tsc":"tsc || true","tsc:lib":"tsc --project tsconfig.lib.json || true","prepublishOnly":"npm run clean && npm run tsc && npm run tsc:lib && npm run dist && npm run build","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"peerDependencies":{"react":">=15"},"dependencies":{"prop-types":"latest","@types/prop-types":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"latest","@types/react":"latest","react-dom":"latest","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"latest","@types/enzyme":"latest","enzyme-adapter-react-16":"latest","@types/enzyme-adapter-react-16":"latest","react-test-renderer":"latest"},"gitHead":"09a50e4b68573d5ccaefbd39bdf0fdfb23b75ff2","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.3","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-phzJob0/lZHMWlzMd19rFPGeceXFq066pmFdnIKLExAsteC9aciHJrmdxdvVC3GKntU2YzPWPCCK70nBfdAQ5w==","shasum":"fe4cf4fc2c7c0a1eb7ff9546a3eb5bb344855fcb","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHHBaqHLyc8zlD5aShX8dg9XGQQ3I43GOt2X46WpTu4PAiBkKfNfho+pm55UavyE8RhNhuLQH6U4TpUUBXoQQwAlNQ=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.3.tgz_1509760217046_0.8833917437586933"},"directories":{}},"0.6.4":{"name":"react-form-with-constraints","version":"0.6.4","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli build lib dist/* !dist/.gitkeep coverage .rpt2_cache","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","build":"cross-env NODE_ENV=development webpack -d || true","build:watch":"cross-env NODE_ENV=development webpack -d --watch","tsc":"tsc || true","tsc:lib":"tsc --project tsconfig.lib.json || true","prepublishOnly":"npm run clean && npm run tsc && npm run tsc:lib && npm run dist && npm run build","pretest":"npm run clean","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","precoverage":"npm run pretest","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage","tslint":"tslint --config tslint.json '**/*.ts{,x}' --exclude '**/node_modules/**' --exclude 'lib/**'"},"peerDependencies":{"react":">=15"},"dependencies":{"prop-types":"latest","@types/prop-types":"latest"},"devDependencies":{"typescript":"latest","tslint":"latest","tslint-react":"latest","react":"latest","@types/react":"latest","react-dom":"latest","@types/react-dom":"latest","ts-node":"latest","@types/node":"latest","mobx":"latest","mobx-react":"latest","mobx-react-devtools":"latest","babel-core":"latest","babel-preset-react":"latest","node-zopfli":"latest","node-gyp":"latest","webpack":"latest","@types/webpack":"latest","ts-loader":"latest","babel-loader":"latest","file-loader":"latest","zopfli-webpack-plugin":"latest","rollup":"latest","rollup-pluginutils":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-plugin-gzip":"latest","rollup-plugin-filesize":"latest","del-cli":"latest","cross-env":"latest","jest":"latest","@types/jest":"latest","ts-jest":"latest","enzyme":"latest","@types/enzyme":"latest","enzyme-adapter-react-16":"latest","@types/enzyme-adapter-react-16":"latest","react-test-renderer":"latest"},"gitHead":"2496a20eeabe44062a385691e3a97f1fda64bfb8","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.6.4","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-IaVKcktgdYFVpimjbDUBdPKAiMVyKg8KYhpYbgi00eiAo119LJaOOXeJRh9Xk2IgJUoXV9BIc+aaMjxHQHd6kA==","shasum":"4c6ca1f71c2980fe5b175d129692a7499a22c802","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.6.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDaK0LIzGWiEstdQEb4lUk5ebLXj2/mVGmIPRpUq11u+wIhALhCds2F7tHbz1tQvUlrmICt10/5C7wtBeUGpEQHPsB+"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.6.4.tgz_1510350288571_0.12120557622984052"},"directories":{}},"0.7.0-beta.1":{"name":"react-form-with-constraints","version":"0.7.0-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=15"},"dependencies":{"@types/prop-types":"latest","prop-types":"latest"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.7.0-beta.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-ZxKrDmIXgjbdsqbpE42PlKDQiIFp3deMaUu6NvNLbufhXVgRpIaeLgHDbeR7v6ZWK/xUwVA2+3cesWkTg3HwVQ==","shasum":"9c9d5766d915ab3b54d80ca079ea8a81df2826f3","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.7.0-beta.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCy7kbLhBvT4hPt/BGLg7jtZ+nNYzV5okU7npIcjr//cgIhAOL0pKRTLLaMZWNZysEgjIP9FycYEMLa+pf0yQoTaLse"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.7.0-beta.1.tgz_1511563218786_0.8503346440847963"},"directories":{}},"0.7.0-beta.2":{"name":"react-form-with-constraints","version":"0.7.0-beta.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=15"},"dependencies":{"@types/prop-types":"latest","prop-types":"latest"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.7.0-beta.2","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-mtFXtfzrMSgZfPUnSGRIzikYvxjdN+vZJw+fRvyEclrNBqwlGYUuz36hqn25sPwmiQQ3DrF4J2i5lIeHcM2Ouw==","shasum":"0f4a28e91c00f4297e02ca42a5ba4e9c18269088","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.7.0-beta.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCE0A46DEArpToPJDMxrZK0S7L+fFsPeIBd0+jLudES0gIhALUGNqLym8Uvus4kCKMjF5HoFe0gPMS2B1qDgBMm0ISd"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.7.0-beta.2.tgz_1511633427668_0.36383247352205217"},"directories":{}},"0.7.0-beta.3":{"name":"react-form-with-constraints","version":"0.7.0-beta.3","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=15"},"dependencies":{"@types/prop-types":"latest","prop-types":"latest"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.7.0-beta.3","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-OD9dkFMsgmM/oMnclyR+VH62Kd/I78WGBVxi5DgUG2KEv7ydU/DBbHsevB3Qd4bZKJpS9CAFbjTg4Mg36zIguw==","shasum":"02c0544c21161a747d51018b4c6b921f3790ce64","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.7.0-beta.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEIbx2+KpSP7P8f0c20JsNnabP0KG/BlokRjMHc7dAhSAiA7sHZMgyfrKfEgeUY7ZM9pBr12v99ybz8eKlnIhr+Aog=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.7.0-beta.3.tgz_1511634752813_0.11753929872065783"},"directories":{}},"0.7.0-beta.4":{"name":"react-form-with-constraints","version":"0.7.0-beta.4","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=15"},"dependencies":{"@types/prop-types":"latest","prop-types":"latest"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.7.0-beta.4","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-BfSEc928em7T8AE4Ca/yRXaxn7CIKXWsqFn2eM3Rg97GZapPuC/uwgnWI4fkGvNXZlmrbOF3T0XzdnsKv1XXmA==","shasum":"55b127821bad28be1108981ca6178f60d49e8a49","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.7.0-beta.4.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBuR9+xMQ0By8a7wH7iELt055Q6DlV2XUfDDb5HTWy2QIhAIb8mS4814GPegzMhNN+lvPo3BBOHRnkQoGuLrUrXjzg"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.7.0-beta.4.tgz_1511634986107_0.42858113651163876"},"directories":{}},"0.7.0":{"name":"react-form-with-constraints","version":"0.7.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=15"},"dependencies":{"@types/prop-types":"latest","prop-types":"latest"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.7.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.0","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-aEOCtNZWnJqR1adcPP1EMkraSJWm/UmptW5aoi4YIeXuZw+oK7kNpPnTygqJbrk2UVLzPerKl2V9stmMshi0lw==","shasum":"5f3b441b9233239fcc4d490d90428bf86eabc6d8","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.7.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB8bDsBVbPrWFPpZqT/Xe4sUawkKkMjBieUoT4kZQc/PAiEA4QyyXPWoK3F6F0pL/DtClTBqQqSYXhapB8Yg0g69vqY="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints-0.7.0.tgz_1511649644011_0.17842198978178203"},"directories":{}},"0.8.0-beta.1":{"name":"react-form-with-constraints","version":"0.8.0-beta.1","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/","src/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.1","dist":{"shasum":"1c8d10770ed57a7a7f5fe55a06ba56a5620550d7","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.1.tgz","fileCount":108,"unpackedSize":484530,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3k2VCRA9TVsSAnZWagAA+bYP/A9vKjFCMGc6o5WZl7os\nJfpQUkevJt8oZKV9uzesW+CjKGbwmpNMVunaSESeSoECPLCSowXHrn5BmfdW\ndaJgtRnU7cIabU6JdO3LtHe31+W9gYxaUx5fBjw11B8a/416b6NsE2Hw80+n\nHIVfFiQzr63UShdZL4JK0zf5WyYYtob9zOC2/2F+UXc9kepESw6tapNnP7C/\nlrHjmxUjFtZuCnwG02fqDXDLfN/Sf3x8Nwjnprzeks0Qytl1un/ORYj17Fer\nBtj25Rz9QRcJCKmdV4cL6ZkARSE3FNx5h7/PUMsTe7vhyYrjLLMcPKWkrByW\nRu10uscRW34+5VAQS5jR2UKPtaYxT6vJRCi8NSZ/KinqSgw403nMQ5UeVr9d\nugTW/zgZw68gbYx6RRcbrVV3vBXMgyAlKPI8mS/R6Wa7ugSHMK4O8qlFbAl9\nOiqlKBNIrKE4cLGiqx7JL8qy1GpaTJL5t3Po28eqWR1/0mSPW0p5A+RqVAxv\ns0vbjbe9iDuVUEamwwV9Wkuy+WB1Yi+oFBkT1NmmvOsGjBrtKESdsjy/cCNF\nDX127uxPhauazEjkbhwCL6JxQ8mgtQZdPgeKTlgBA6CDdeyRchRS4SjB/P5L\nOwdugmNWiIx1q8lrJeR3GRQMdVFv27DB0dGvt8cOWE3mbHlmWpMfRboS8EVj\nkEnp\r\n=x7PG\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-7zC6zmkHVemRjdhx4A9oGxu6E5cFOBpzFZma4qv3Q9zkke2YwPbBxX4jRzqp7+yztvaeaxwwBjczkxIJlHCPSw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBAYnPWc40nenU9Ug40hE3oUw0ugp7AL+xGJk8VRht2DAiEA65v0htcNxLoG1LwX6CJy4dnklWbU6gLFWhQkg0OD9A4="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.1_1524518293207_0.212883137550395"},"_hasShrinkwrap":false},"0.8.0-beta.2":{"name":"react-form-with-constraints","version":"0.8.0-beta.2","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/","src/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.2","dist":{"shasum":"0d2c02d1c2538c8b1e18f7c684c53081ddba9bec","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.2.tgz","fileCount":108,"unpackedSize":476334,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3lDyCRA9TVsSAnZWagAAY7MP/iseOF6PCCuw82iwKyuF\n/zxxFJkB0oJdAU40dx1GGdytLsPMycEmdg/krOMxCAI1LqGktqHkwM5UKwbB\nkPAH57Rc4FoQgYppHbGkZGvfSwGOnujIQbWB7ASF5Wr6w72lKYMhM7Yc5JZx\nBa4r7C8Kj1OpvzDi02WwlWmNENV4CiqqBrebVQ51n16TBNC9eqOPTT1viyaJ\nt75Hl/jXqcdBZkquUj4S+c3l+m4nwyx+zXxVEFF0qSR9uiSCj27cekeAN+n/\nKGd3ukMhb9yzOTxVf9UHTf2NPUrP7lFJ6lDnyO7Od+yc36fvs+Uq5jQTpEtr\nJ9zYnoGmKZUfTBzfPCtgoVPxzZTCLkd5HWAcOWoKFtxnoaHOiNKNMBU+WeMU\nRYqY89B+KS/p7mds5KNaiC7b9vvuYacgaMYYMX4kwGvx7WGoUenTHJf1A6Zt\n5/f9JToDTpCRagBSsUj1laNo2/eCUMnDZrJ1VWL+KCR0RAUWAQMqSwPV2eMd\nZieeR3B4n5Kw6OvFRdhRDTrd4H6rCOug7w8XX1yEF0iTxA/OjZ/t5bzEHJMc\n1GP4nQWIUQXh27bl/beOsCNW1QUdofQ3b81fY/D9CmUDFKloUf5xaQnxl9MM\nl1b3HNqEDPj3Jqpz7pz2BlMpxpSiKEBekLFEr9UesMDdGBtJmMVesBwsDpg8\nGwPd\r\n=UqjA\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-9o66J29pJSnW+3dlPYnMrfPrBrUu/zvo8NiGleGcOo45oj4mpp2kq62u7GY4ZU8L+GTBUfCd7ZZWboa49Lw98g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC+3hdxEa6LtLXbFJdeQq3P2R8Y6unYT0y3SZu+/JCTvAiAOtgHG7D8XQLcPMyx/St6XLE9qMrvLRPOTCWZEoHIkDg=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.2_1524519153837_0.3111792604181389"},"_hasShrinkwrap":false},"0.8.0-beta.3":{"name":"react-form-with-constraints","version":"0.8.0-beta.3","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.3","dist":{"shasum":"4b98500f86c79cc8e14a727c9a92578a7e31a8c3","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.3.tgz","fileCount":67,"unpackedSize":311137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3wdECRA9TVsSAnZWagAAMJEP/1uJEs57BXJTBMKavB8m\n496gBsgMwK3sxB6kMpY/omBTiTZVFPj0ZlnjysXMLeeeZdSbX3kK0jtprT/b\nsdb4SkpV6rSF/R5gpjEQ6oMLQti4sEu5dF1dbV5lwSSwd8EHkQMTJ+iAyf5Z\nImSf7Z1wbG6dO5B3Z99GSyLV1d3halhl+eeMAgbigI/aCIW20MaSf0xYMRXd\n+fybu8I7m4jsQqY30BFVJX6GBOfXqHNzfvbe/D4OUCM0WwKuV8p+TnzDryVa\nRoePVot269fv8Y5R+9oSWueapYahXpc998w8C7WkO9791xtYEBAg/vvAt5wn\ny0jbOUulPTzBqBRxd/IlnhGknDa2AvXngiGZWqwIkIAff4+VhiGLQrv/H9ZW\n7rUsUKcDvMFMYqDwUaX1nkkVI3kqF1rFDjyWvj+9cXNpS/pKe9jCFG0iuMQn\njYVSLD/uVEq6YOjYExN45SDvzqrMnlog6IIgc3hxbRNy4D9zCbf5nLxGxYFP\niPWZgrdOX5tj2wF3jJF3nAVF9LOtD4hbNwdIR1NdjrqoowjqDtvt0i0f2Avg\nFUv5ExKC3GQ7ZHYL6r0eLNatpEuFrvWr2yTUVv2zYfBJu32pnRndy6hDzOqV\nOvvODyf5HdjQMvgOMbsWqUQpob153w9luJr0E1ufTgAKxDYm3MoJhsrg7H4G\nKd19\r\n=al10\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-DLdW/IG5PTPNyemWt2OrKxCfNt5IUHXZyuJCrJjYrVvowqIfOp5rhGXWo62/kGVz4zdut0lNHiZCuLZ+ykb8gQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCASTdxwAZj1iUsGbiYqospmDO0bLbYsQtnF+ZPPh77wQIgDFx6GF6NdMBZdEmNhsJgB4FjJCNtXGLouyTy7refNCk="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.3_1524565828388_0.5385764981386745"},"_hasShrinkwrap":false},"0.8.0-beta.4":{"name":"react-form-with-constraints","version":"0.8.0-beta.4","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/","src/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.4","dist":{"shasum":"0eb07c8657050ca02f094477d6e4984b2661e833","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.4.tgz","fileCount":108,"unpackedSize":476334,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3winCRA9TVsSAnZWagAAtN4P/2yhkan4Ub3rG7ycUrUy\nAk+lhymiBf1wZPH996Yeq51spdLVkyEe6NuQwkRo4KdHgCKTxRF/OHBGpibS\nT3w7Ji+t6O01HqJbFEf/ePjJb69t6DJz6TqwYNy8XQUq8C0oc05DmZAQmFPt\nqWM+9qcK7JipeAu+euigstnyS+NwbdV9ZK61GzcDY8ToRDC5N08zEMELyEzT\nKsLJPfGbfViB5byQltlFL3t5D6LInNCffk59VhzZxocU/wJrH8eXWMly8QPc\nzC8CABhzF690s/eUJNiYeGViDv2L3GkYi5JMkXy2kd+mDuGSbOAMzwBMWZHQ\nmN8FDjEeF5ULe7JWnnSArzTZxdQpx/wwYN81yirZEkHGc5f7PDwokZBZsBp8\nyV9SjNUBoq9iEZeIqvPAwPAMhGjJE/zXHzuJdviewlreEHI6Ho1ItSeknL+h\nofKpAODkzbewBU6zTnPIh+h7Z4YlhRSkxN7NTNMuO8HjP4lnzEtu579fEeJq\n4abJyXvOPiXMxfEpebunfh0hlxrazc2+XfJNJR0g7moIvMgobWJaOQH6H4J1\nWBk4i7Qakr9OiZnDmFQ8MM6N8x4Q1ZSOdyp0TMQMQPVSUUX7/KbFn9+rLs0/\nWjlI1zYXCUj6umbhq+dcvmbp3rLN62LGE/krf5YA3+Ph4TszxkB53BDaB+H+\nhWKp\r\n=GPpA\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-L8DVyrmUBD760GodHw7fCpFVDARtMKAAntzAMs8G5O4KWhGCmZIPGxv3ds4r6ZPsf+fwcdbWwqTmslUQaZGVRA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICuB+8cEP1y67bT+dZjz79N+2kvL721m1dFJ1D1/l4MRAiEAz5D5FNAWDw0YUGEN5BDNGB8ZTcbhhQzYh+F0ejmZarw="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.4_1524566183569_0.5843502071509321"},"_hasShrinkwrap":false},"0.8.0-beta.5":{"name":"react-form-with-constraints","version":"0.8.0-beta.5","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.5","dist":{"shasum":"bfe8b3cc82ebf3bc54d36224d46a913c70306100","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.5.tgz","fileCount":48,"unpackedSize":259162,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3xG6CRA9TVsSAnZWagAAIJ4QAIX2YpPjlSiCErSnJFOo\nhibU2GooSadR8VQLMf/m2+W51Cgxqt7g2dDnYAyuosuUzjEASzZqaXqdf6Ay\n8JUBVT9AOD5PE3ulWFLYN4qCue9tjW7d75is/lqo7ndwDAlwCz8iMKEHJgdH\nGw6RDoGDRKWWl959Uu7vOfU//ozRHFVCv7rv2gJGa+aQzBt0be4EUAHGbfNY\n6RitqAstGVYwYA5SQJXhL3y5KBJTIwfeqWRvULLaZEFlVwcMapmeyYEqx5tv\nyhYHFpOMcSXUBlf0R+Bi/pZZBlJYVa1hEOm1a6U0TnqRyuvgx0hri+vg8a6g\nQkQ3X8EthERLOix8xVWTjycrJCZszv5wTMrmobIBzdcfutv0XfYA3dhNy5Py\nFLIkmLvYFSp3z4lbIxxxR18VgU5lVXp4uckCBv0NmzO+htMRQImy3SdweJ/l\n47r12m+c4YhpD4SmPemOGr59lzrgqz+wUF8Np/THlw1CZDiqKAqutgSix3eS\n7Jb3b+WH8xF71DRcM/eXUo7MUo4M2bzTm0w4Ar8EZf5fB/As80ew5O7JNEIv\nSYde5vfYRlRWc08fzB9by5hex4NhszEpljWPB6q+PuMiPkJEC1Wk8/Zm+J9m\n2rzNhN+0fC0SK40UT/YFbT4jGn1D/GsXKligfPNjinMsPrPmq20h1+aCQsvY\n4sIv\r\n=Og6J\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-sK9lYrEE4Q9/7/aggusYv1C0YldvLvChfndCDti3v73NNakx/yN69EGzTIcB0kxkco+IeM1nNzFHDG+78M/YIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtCbE5tzk5CsT0cX1rDx4JJgcBuKDm2/CHQI59grKdJQIhAKWb4d1+DxvnjJQBOxlXHcXXx01eEmVgMRrywIG2AzI7"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.5_1524568505924_0.45755838234523294"},"_hasShrinkwrap":false},"0.8.0-beta.6":{"name":"react-form-with-constraints","version":"0.8.0-beta.6","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.6","dist":{"shasum":"87003abed4f9ee32614f755e6b75c7269cfbbccb","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.6.tgz","fileCount":67,"unpackedSize":353263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa3xOCCRA9TVsSAnZWagAA6FUP+wTOYz8mg7/+zdCazjyb\nbHH+aNusR7i+M5zYuErNzXcpnn3apqrRXtSAupg2i7rvf1NkX9hHN6ZCqTui\n/QK1hLlCo9TFKN23xYQLC23wCi84Y2Tx6XFZcuK0BiXHvHQwTAWgoEcfTM3m\nrflhMWNhHdvLSHN6WMQWhPoKQQo0mSUXmkGwpAyYLl+78DHVba5yUDawbcF2\n1sJcAqZ5yTW6zKjc5EDCIMOo55GYMB5TVN3MQoHC265Hp2RDCuUgnmSMPRCM\n7SZUV7K0kIVACIXBAfZSeNu9eM26Ct0kvsRXjZJTT0LF5pcvBq7ImLTovFo7\nAHpAgdaxanrKbsOUU9+YJUiujetaV0Ngywn6YXXl3Y+jy2dUCtMPAJvveGJC\nQ/nYeAyXqJD/mTRrIeftlCr0mPc2ex99Pj5xf39V/GZTP13zVyCFSeE0tgOK\nQSuVut4JY6iLp0l4hJB7Mbd2BuoBMXp/CkvtLPONk+QnfOV3W7osem4CmCy5\nEq25+464ZKs/MWcWEaMQGfflLL6cRYzTRJVXxXnUuIHbOzu1tscaZs9/j1Zv\nrChyB73X8MwsTBKTGDeoSMU7TlAi8PQHmMIguzfwoV4cmJhvdt4o6+3Dx2yO\nYm5/InD4JQaLbh/q7HtEWaYssci7ODCkBnX8Z+xhDVt1OJumJ58T1yIZLqP0\nLXh6\r\n=Jp3x\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-JTrPbxcXLYg1GyEZfCR+OYT0icGbZ1xIL7RyL+FULR7syrdr8JiNfQWg9UbAVyrmRHIDu/pbVypBoS2rZq9r0A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHT06ut0uxNoH19YzOQyILWRnB+e11CFr/0HqOw/oZ8dAiBaxFdEeze8VJB63I6tOekrtO4FrVcUmebxOGScuGZQXQ=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.6_1524568962511_0.9794801144105698"},"_hasShrinkwrap":false},"0.8.0-beta.7":{"name":"react-form-with-constraints","version":"0.8.0-beta.7","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.7","dist":{"shasum":"d7dc5c91c17c75137af5a5d8f00b2785a090f71f","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.7.tgz","fileCount":48,"unpackedSize":259162,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa37UrCRA9TVsSAnZWagAAbIcP/A7jpPNA7xza0CKGo4b9\n5c0beygJ3Cv3IRlDFizq8lTI30YtU04Hn6+ol6EqFuABY4IqXUZIrRvs2fbV\ngzksPGroue3pzNIQG5tzugHbf+4O97TXvtzu9d2VczG3jUCj2gjCUSNDDJKx\n2lDarVNYSvZBK4JIETsLqv+S1J0iJFpxJtCeTcfae1b1yqlnEgOnbTjfwNzk\nt58BlhW00HVXqICyDdbUt37kRyL5QrCP+CE8je60KxP0UJYZ1E5jJ+TzGQq/\nZyfveISLq83sXbE85asatXgsMghRn7Wan8s0le9JSQJEb3mtUOmJEKbGhqI9\nQbjJVhtqHRYBJrJGiE4ZiW13DgaaPgHV7oE9+wGrmYAZyd28mc9unJqGh8GS\n0o5P/oYRixG2x7XtXu+c6HTJJLiO28vOXGcP61pD62C6v+X89qPoIkCZf8OF\nDhCXT1IIKgYqjKD7807B7uFYf2M5zPjJKHIDdhLPIvpfTlOpr/7wRxOzRd0/\nmQX3wk2d/qqxRignYBgLvDFEYpdUzxRKvzu07T6VqiLisBwM9Cigpk9lC0fq\nRJAJNvhkTnzMCf2hVjn0V0hmGW42/uwBmzC+ZW52BbT6pP6pVoriiEm5Mysx\nn+rVZ1AiCTmetVY2H4LExl9Avwn+5zzgO2aDLJBsS2noyr0M2p4ifBiMhDR9\nAuq8\r\n=if79\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-0AmPMnDbuG/2vnwaQO7FJctBZxpRYlAC3GRCvL9QQI9ity7cbjayaJteBLFyIz+EjdQXsvevnlYry4uhGN5yTQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGr6i/M+1D4my6txh7p0mFm2IUvsyQR+5pc44zXjh3vAIhANHeOwLmiwP+hZ/RKHE+xWjZDPz7ltZycKlErNOeEO50"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.7_1524610346565_0.1695116645321726"},"_hasShrinkwrap":false},"0.8.0-beta.8":{"name":"react-form-with-constraints","version":"0.8.0-beta.8","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.8","dist":{"shasum":"c6a5d3ea0371f97d5cd510cda69200bbba9d866e","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.8.tgz","fileCount":48,"unpackedSize":259119,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa4QCVCRA9TVsSAnZWagAA1DIP/iBS+IGLMDMUUt6C83FF\nrHEPnRD2ktAeIXTbITaJlDX9MvRrhv6abA6hydL6JOGvIcXTVW3rZ2WFgqho\niq1AcWr0qeijxXUygH28YI81iBp5vzzDWeZusudzFO51vJ57lGD3UcpZdLW6\n7jyc202ZFK/Zsg1B/Fzc8Tu33c4BHgKZUtTrch3nTSspZX1kFOsk6HIvNWpZ\nMPcWfQ//79PKLPT+zr2Jmg6FU9sQO+Emcz3yPuh2IFmY8jSdxBwRVtXAu0yF\niC6CMa/I5bEzsfmQRm9xvzOUsxjZOEbqitZB6ztNUYTnMFPbo5Su9lU+o/ph\nkYWZekbqJ4gnK5kSDrEUqUFI4cUmeqn2PS+KOtWIZxCA+xy0s0SnWrqRTtb2\ncKg/yvm+iVYy4A/pJY4B6IMrJIBUKo0HqZ/3n53cM4pyyQcSYUtnOtJcvJ+e\nnAhrFcduJsVsS9kam3yuVWSed//r4IYdVoJs5uCjz5fH5stEUzmMWCFWRArm\nW7MODDMZGzRV2nseUkDRFHXpQGdq7HcrFz1oMU/UOzVb2MwsoY+J1Z4mLuz7\n2+rqIv6YnkWFfHqO15VNqVtBjVLOZcxXScIecdzghqHNKh9gzQZwESzuK8Rb\n0A2+fc7EvPw2E05PQlkWFC3TsqtS7eWf5UzMtd2SwSlaVeXLp8qyvlaCnhIp\nWU6t\r\n=D+gr\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-4RGqP5QuaGVVrP4L+8Yp9kMLYbuKAOeZqexSjdtp+0iQsDwUWWfyYjFGSNqT59HoLwRrBFdHWrAI9kN3QwLHaA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFOOf+4u1P+tw0bZhfhMhVW+MzeRVJlDMks5kakT524nAiEAz5GXeEUh1KfS3uaWc8uMLPWmeri2sAZ/gZW3EmtgAns="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.8_1524695189429_0.16971498842417776"},"_hasShrinkwrap":false},"0.8.0-beta.9":{"name":"react-form-with-constraints","version":"0.8.0-beta.9","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0-beta.9","dist":{"shasum":"217603a1aa02b15e789bd2faf54ecc3375e1935f","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0-beta.9.tgz","fileCount":48,"unpackedSize":261650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa4g++CRA9TVsSAnZWagAALL4P/1erTEFXnIMwZAyjL+tG\n2DuDyW9pyY3RoSHJHLjAaezYMe82EXycnbpFayV4+urnP6iuUgucZOMrxNOb\nnWqi6BQyKBLU24FVFmDDOO0pE8CN3S1XvvoYi5yQTlelKfqPH0vHbDzxRjus\nIQ5wtte+mvSVmHreVGdXZHh+WWgWL1uwC8ILE8chIYFSniwzajyoi+L299NS\n+4Ck8HkPm5qrzI1yyKQe9F5KhqiJxOkLLKo9mqapd0ELmAy/ySss8YnULG1u\nerS8G+PZpIgvO1kTt/0WULRsAKhOR2NUEvZ7jhMyQLLQaYUcOPZ9WGUmy2uN\n/JJ1TwHp666DmIJNXBcOkdkvfielz4rrsSkj5Wz71bPZe65h63fc9Y9Rdb8f\nCKx+RFyQErU6aC+PTv9WarNIupou0aQIfJwAX39tuY+Y033ksW9HqLRmHlEb\n1vgMqPDAWJ/94l1YbRcT0Y6AffBsPuE6cPaW6sId+iPnurfidZ6/5PBqbims\nITXdpKZsXXN7LkgE1B5XCy8fWRKXUk8TMae114nz3pnftjWFfRIHpRogZrvn\nao9Ylp9ExZrhjUvQKdlcn7r8BFLH/MvznR1PQehiFmosIJPSIFHtQNVM8+YL\n/Q2dDbM+PKQmW4Ggt6j8vT8PXOWgj8D91XHD2PgrsEPwqaKTKR7RLpcdu2Op\nWklI\r\n=2l4Y\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-R+fffLWo6OyFW8ohlPP8TuN8ajblzW8m0SmgDoeknV8SJiwYxSm6iiy0Tv6Lil8HdyiZ4jcEdPzTDn8blIC5ZQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7BLFxZvMSkCCDQ3p8TVbnhse6c6MYPmop6MTDkd0nzAIgeRRwcoH8LBL6ASNGh/OZbGcFZLxrlPX7zrhpb3ns3QA="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0-beta.9_1524764605635_0.13443927603919748"},"_hasShrinkwrap":false},"0.8.0":{"name":"react-form-with-constraints","version":"0.8.0","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"rollup/rollup-plugin-strip","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.8.0","dist":{"shasum":"504a71b93f11548492d0d27aa8a61f26d1ad5411","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.8.0.tgz","fileCount":48,"unpackedSize":259112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa4iyGCRA9TVsSAnZWagAASeQQAJQxhMkEViYLf8YlTOEj\n0qMsvVDAA6NZNx4fLux8ycsyrfmj5Eh7nGZpPvd3K/N7/lZzov2TTPLIM4ub\nJcbTaA9oUoQ4tODzFjt2q0KY9yBI9BfoNf9CyK7Y7S/mo522EwBjZCed4NAC\n53YoHnHnm385CQpkltXdV3STUYnEFXergzQ6RTFfeA/rj9oVREDS+S3ZKNbs\n0u0pnPes4QlW1phnpDVnod5wJDIcr8Nr4WsDMXNkZ0B6MFhEbbJZl++WBC1R\nkliTSDTn50Oq6wWoOkjhHXursrfvXKNS7h9WdPwxf4teGaSFqS/PunouZvfi\n8J1QC8+8J4F+2MBL7SKNDW/29cCKQskPL0QFxNGSaMEP0Wp1HnBsjoEO06nq\nUfnty5kGIIele6I39T3XiDB2eGyz6zxqZEFJ7dtAyrdp8Uo7G1O13Npbv1dW\naX8uZd+Tr1qk5KwkH1snxrwGDfmcjOTWxiL27NLm5NAl6XaYRP3no3RF4loO\n7RW/NPJH0P2Lpt54qMycYF3QMCx2AQdto5+lM4Ki6ODORbaJmrwrO5OyG//R\nvxXKXKJd6/hJg5bRMcAht2sOblZcpQVhJvb++zx2kL6O8vVYp0ymEUyIwAE+\nHpcHIaPnkA34gkEN/EPzcdE2RzNmXR0Zre0wtXMWS/IGfRPwY29Xyt91eFpQ\nDw+h\r\n=fj9c\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-N6DAg+nQzMh4QdkUUx1+ruRIiDNVcJe/1a6nUrMdZBv38Cp3BLNs/ZbQWT841W6/pR9lhVC6g2Te6IDOMRJkQQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAm/+c3hnongjAcbryyEYtk7FWx78cqAGou9IWZB3C8hAiBpXF80/TlPvZancsRyz9o3o2c2U/GFIBIw98oTcQNkgg=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.8.0_1524771973658_0.8030497717118055"},"_hasShrinkwrap":false},"0.9.0-beta.1":{"name":"react-form-with-constraints","version":"0.9.0-beta.1","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.9.0-beta.1","dist":{"shasum":"c3ad146a3b6547c3e8f635a6985795155df9b94a","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.9.0-beta.1.tgz","fileCount":52,"unpackedSize":282452,"integrity":"sha512-jl2/cb2fcXe9stgCRVv4g6OMfOehFgpwzNpr13uD6FHuWHVzSrjXkDiMrFIOlBInFVr2qIIBElUtzdN8DznY9A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAHxTzql7H3YgltjyipAU+++2Z4RxakY8qhBDGhgHZ1JAiBeYDUsXe5opqpHQUJS6UwSv4IvrqHZylZlLaXa3iKTqw=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.9.0-beta.1_1530638911003_0.43078294330135836"},"_hasShrinkwrap":false},"0.9.1":{"name":"react-form-with-constraints","version":"0.9.1","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.9.1","dist":{"shasum":"eca24ba5fac6e6479ff85f2639039b023ebe367c","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.9.1.tgz","fileCount":52,"unpackedSize":282445,"integrity":"sha512-ulyVh88KmK2vOyxjV7TVLvfzke1hoCLhOjc0sDFnv8fRbxOMrdE8I1QM7g+NKLK3P776ZAG5ERhUPC5x4fg3uQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLS+Y3cEwi4oeu6tb+5gNcyVWkkdoyF7oONm4QFriguwIhAN966o+Aiz1s1jqAihbH5EqhMrFTvhylj42hLG7vZapK"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.9.1_1530831015750_0.2775890218655168"},"_hasShrinkwrap":false},"0.9.2":{"name":"react-form-with-constraints","version":"0.9.2","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib/index.js","types":"lib/index.d.ts","files":["dist/","lib/"],"scripts":{"clean":"del-cli lib dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.1"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"_id":"react-form-with-constraints@0.9.2","dist":{"shasum":"b40444cc5f8218fcddf8bb813ce45c4bd63e1088","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.9.2.tgz","fileCount":55,"unpackedSize":299535,"integrity":"sha512-Ail+pnvo5g1QN4MJTfgHQwuEcRRry/hoI7TGKFla8alTK6Bv/FfOY+uDlXatOMc2ZZAjkkQ3EcAhZ15Fc5qfLQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGFAl0NXjjpfg7XpaNjfPFly+Wzm81/LsK28Xw9QzChgAiBrNTbyxuPRF7BocxoCBtHeb2YNenfi1u5WSZS5eZBG6w=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.9.2_1531438560224_0.5288163040760794"},"_hasShrinkwrap":false},"0.9.3":{"name":"react-form-with-constraints","version":"0.9.3","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli lib dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"^2.9.2"},"gitHead":"1e9a57390ea5fb75472d7b0c208870abf2d97a93","_id":"react-form-with-constraints@0.9.3","dist":{"shasum":"f3988d1acbeedf1dbd357d7fb01260c11cf999d4","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.9.3.tgz","integrity":"sha512-y5iiRh4VTgF4kyGTKR5RphUeTo9DIgHaacmhOWu7NH2UMXZQEohvmkP+ZMh6qR3IicYEZBdhYOHUT8+w6xiMCA==","fileCount":56,"unpackedSize":306808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmD9VCRA9TVsSAnZWagAA/ygP/jsS2yXRxAjQXIRoAz2l\nXLMtT7h5RopgT4g4fwTVZZzlSJ941QI6RIhKCsm/Icv25WqlmYb3l1duw9y/\nx8ctEyDsCFDoLXQw+BMTNhRhOEigdxuxVbKuGFTugKMp3DwM7GL+vzTS0caR\nldc+k3tWLdsDkimyVRs7xRlGeB9DOoX2BA5rICXhwoaP48nAPT1rY/PEPN3Z\nZg2+eIo9uw6MMN5z9WUI4lzsKhzSajfYbtjbtabbXIUlzMFRpV2iEghc7hmq\nsFhPgEjojnUNGky22+FaO4yPVC4MpV340Kaix+10APykQvCuaTzZpw2rfK/0\nwV3wMQGvydshl5RAyyKJnENWJccU39B9RX+y1iJldfcYdLtxNx1GBLz699ZY\n+dhl4ZPeGA4pqqUp/dBwfEl+AXkOEquAmkpHr8bt6yU6BkApx1VbSa4MRFnj\nsFQMLTRf/3z5qxoYRvBy+fIkBK2+JRkjCiUpnDLilRao2Vk3V/jvieJnT712\nG0QHphGKxB0/n9xbq+PuGsy8X/Qzl8o7DsBHdAquP5+xS4JYYiqPU873zVjB\ndPBkbDoBcTtfxPU/JyHatlLV93NjI5A78QZWvvMk3dlZyqmgOFrVvi1jKHCV\nj/mwaKVOqZO7jhPIrPWhGEm0P51RYcc/Cuq6zIQtxVqtypgGr8Xzufmnp51R\njlUM\r\n=0WL4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG9c5pKR5YWAspG6VtCJ1kdHML34h0YLGHxSUiaV1c8qAiEArdMXy9Z6A1DIhLFfFoWo2f9O20PXg1lapidjF38lPO4="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.9.3_1536704340838_0.8571784586478395"},"_hasShrinkwrap":false},"0.10.0-beta.1":{"name":"react-form-with-constraints","version":"0.10.0-beta.1","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli lib dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"^1.4.0","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"^2.9.2"},"gitHead":"04800789b7d84c9acb6f1bf2c0da7a6620ec14be","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- Control HTML5 error messages: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://github.com/reactjs/reactjs.org/blob/d59c4f9116138e419812e44b0fdb56644c498d3e/content/docs/context.md) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply this.form.isValid();\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback`, similar API as [react-promise](https://github.com/capaj/react-promise)\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Should be called before to submit the `form`. Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields(...)`),\n    If you want to force re-validate all fields, use `validateFields()` without arguments.\n\n  - `isValid(): boolean` => should be called after `validateForm()` or `validateFields()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, `pattern`..., in this case a [recent browser](http://caniuse.com/#feat=forms) is needed,...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...or ignore them and rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\nreact-form-with-constraints needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [babel-polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE 11 and lower. See also [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\n## Notes\n\n- A [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or `disabled` input won't trigger any HTML5 form constraint like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required).\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.1","dist":{"shasum":"1d85fc8dd064b2384ce367456356fa5a8ab6085d","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.1.tgz","integrity":"sha512-lhirLgAjm0+FrbktA6XzoOVELxA+Se78YGmmeXscOdX2vSa7iJcarbSPfQv+IdH3qbQ59lsjf6Gg15HY5NFLnw==","fileCount":56,"unpackedSize":318800,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbmw6cCRA9TVsSAnZWagAAIUQP/AudzzWel3eyhUsyEqnw\n5v0xNFUA4eUNun0XmH6vCtxqwI5LysBhBLmS9oEfKsLQ5euRUqbk+4kKa21/\nb4r3K/bBqzOQOlDpEgOWXp/c9XLOm2auzWV4SHD6Ouwy1Pnu7a3K8to/UXq7\n7hBQpAR8RRxCDHqhmCdzcxmzU8FHhsPymEmV3gXRzOvRndDvbXUtFy+4C4XW\niHz59YB4vqOfxZyJdS6Twxzdn5iAkaEJ1ONXa5lIKQanWEvQEMMb1TZMDVVC\npjJ0YZHPESRqT8f04iAkC+DmiMl7ZnYBP/Akg6flw/2HaqpRRRkyszTsGo/q\nIIyjD8ezVZcNPBmu5dHFzYZXCD9Zg6tCtOXc/dO/yHXKFJqjkFLlCeaJqqju\n/vbDOWTc6yowl6YN1KABocTOQBBi3RqZ34fMUlW1NPqEQtfNV0FlrW9Ryi4f\ncBeAfaqE5kTvMut026KBph7J3dLXabPgCJ/RqmooZCrIN6NaU+WJJV4XcpsP\n0IffNidqnowkxeDuFNzv1BggswCqgqBjL95Mm2WV/6RLpQ0sc5/gFwyHilhO\nIBQfr82KLQz9xM4RrrOspvb/zZygXBLMN21dZ5XgGE98gO6Kc45qFpHe4N79\nHKaWIFvtd1fzUqw5rCzxbGZw0ohOuXdArSeJGXe+Qlu85wxdu0cgGULLGIki\nUi4s\r\n=fFnW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOila+P56xsFw+EnOxkAH2t0vTNOpMUSMDFlFlNR64kwIgQfCP3meKIh69lRLyX3s4xchvXhaSxtpkRxN+IDCKY+E="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.1_1536888475321_0.8880328222636182"},"_hasShrinkwrap":false},"0.10.0-beta.2":{"name":"react-form-with-constraints","version":"0.10.0-beta.2","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib/index.js","types":"lib/index.d.ts","scripts":{"clean":"del-cli lib dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"^2.9.2"},"gitHead":"3b9e2ec58e3a9a4c2e4be47ea1a0209ba1f36eba","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Other name for `validateFieldsWithoutFeedback()`, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.2","dist":{"shasum":"46848704328a4ca618179777ed0e0abcd6ea050d","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.2.tgz","integrity":"sha512-iKXpFi6vLiMiV9lXmFik8IUqUR+HzLNr2uRXKverQPxYh8+aJ2UK6escdHL2p+IfadkL+CriO32s/ndcLvANxQ==","fileCount":56,"unpackedSize":321913,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJboEYSCRA9TVsSAnZWagAARLYP/R4MgcIWcDbhP1Avd7EB\nU0p64EUxsRuV64mD1Xoq7faz1oQlokUXyuc1auOvzeUPIiZKCvDTW1r+bNML\n7T36sSeh8woKmHCgmuBx8cDire6uUKjw7RrsdLLRQFd687lpbDl36g/rkwv4\nydj2jO4GRzTxe8Efev8TMIlvj79+9em6t/7/CKYLctLaw9WblrVTS5bx8u1Q\nRCkxBTJ4ZhqF0OdUj42L/4U5QBz/KbIxeOmVPeZWi50q1Bpsw8EEv3YQjgeY\nSXl8lXVvAN3iWbc82WUVe4jPFefgcn7oSeJWsS1oba2OtNtDWB9FK5lsSVGA\n5C2kjzj2mmAQD2gUs9QqmXoZrLdivAkbpPHORfx13nCvb/n377WEhqp2M3mO\nMnZK840oJZftUPS46FvNRwUYJKBD44Xey2/nHv5wWeJh0VUElW1Eh1gwq4lS\niXhuwlno/6w8Z0mGWeV2jybj2dNP8ZJVZnDSzIjpYfRjTie+ic45ytMm2r89\nQwMKQHFPrmjG0svUGtIvuqPkjWOlc0GdQDHqWVsxF+NYjzPCnB5UfyrgAHAZ\nz003Y6wBzlxn4229pkZvt0Fgq/KkK4lZUXL8cUBMXo6erUIwaJ8w5LA/Op+P\ndGwFqOaivKtfbOLJierkLjmVHcRarRhj47QD90HE008jIi5ZS9b5+XzlCmSL\nvXJ/\r\n=P8u5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHtarORNLlb7Sy6m02mSGmhXOw6cYNyY9V1bktiaxa4JAiADd0VDeoVU2FmlmLS6WYaWoGEGHp6MHZh9cnmu9EWsAg=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.2_1537230354286_0.6788626149928081"},"_hasShrinkwrap":false},"0.10.0-beta.3":{"name":"react-form-with-constraints","version":"0.10.0-beta.3","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run build:es5 && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"^2.9.2"},"gitHead":"317dbf7a33647afbeac3609a7bbaeb67c25e31d1","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.3","dist":{"shasum":"b7bc8dd7143a963e966428f7f3daceed8e7a99cf","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.3.tgz","integrity":"sha512-7ADMa5YQPPPaNkTnIAO4YNLnUW5R5X6DEdb3hw6Te+2ZSKDUSXjZD+OXbCQItNuPcMDomjBeGflz0YMZPO3irQ==","fileCount":79,"unpackedSize":357910,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbu+IYCRA9TVsSAnZWagAAfskP/3wLHgo1zQhVFOKTIrh4\nwFQ+fOJr9KIZJX8VtwtGRlC4Eyv+c6lY85mcU4DrnHdMBBMwHl42kkZQfUr8\nEPKZoiDXFjAPGjpJFF4ZL1yNABwvjZw+1ABQEY9/t5Itd0KnN7h6JRWPdbA7\nMgnlfH7617Pl9QmoQj2CnfIerP72Rk6CHGSiRs0fvx3s++fyOK3hIpC+vYQP\nX0cHhBElZuRkFe+91ymfn7KZ13N8P/yHETZ4uU5WKTM9Ay3KukH/vJGYZPTp\n7uONIBEeTBR/0BCZ/O/YtvVkKQDLoqFPy8Z69Wfb5xWBYxdoSSzV9mKN35yn\nvkB7XX+/MCaKNCgqfAKxF0QAZGVY1T/wAnHyffurQNvwfBA0Rpnrdj8gB/B6\nR6TwTz7+dPzMW1dm4dJvgHZpp4HtFDWQv3vSErK2R7INeKhnShJzuLK1bD7f\nu9E+xJycJw1wi/PBAUlNPDxZNhGU75rpuzlTp2XO9knXw8IZCXrRgbf5kZl1\naanPRp7ua7zfxWhKZ/DpAAzUr7ZJjWaFsegmHHkuOttCp1Fz+ajkfZxMBm10\nXSIvSyYsMl1v7ZsOD65r1TRt+Yerld/vSMZUCSYRNcRbC/oB++th/8st2XDd\nUtJzf7Qg9cheWxalYOe/9rUCfg9fWW98WIM7Sees5Pp9Nj0cIcEsMA++fame\nZodt\r\n=PAhI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCrz1OSjK7Imi+GkrmxDDq1HQS7U9KjbJ1OdN0UntSi4gIgRQ9CynCbj96YPUe2bILcCahlnpV2MzAr/hf9FoB97eg="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.3_1539039767606_0.29147225098772966"},"_hasShrinkwrap":false},"0.10.0-beta.4":{"name":"react-form-with-constraints","version":"0.10.0-beta.4","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run build:es5 && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"d7c10b2160f94852daf6ad29a11367b4363d3262","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.4","dist":{"shasum":"08688341c96207e88b2ad2fadefbefd9a61617ce","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.4.tgz","integrity":"sha512-0/ExiMibNhqatZOxvo93GxY8Oi5nFpQCFsZkZS4aYw1b0kn99qjA9I9/49cvbKcgqoQbS3Wu1V4TfVzdhD1I6g==","fileCount":79,"unpackedSize":358025,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvn4NCRA9TVsSAnZWagAAJZUP+QGFwPbVaPd9tuEdO//o\nFA810X+eB6KChRs9evb1yorDw/A4eKdiMdZ9ThwA6eQbmvAWVG4GzVgO6YDo\n1/Gr0QIuxg1RXQg1uGrh/C/kn920bkubdZLFGPWSQe+jskikyY9bnYsB9Oxr\n3fNJcmT7lXY5gJtTzYClB6vU2f0HDK7fSGIZVU4be9J2CzUN07lpWSt2US3F\nYYAbtDI+V2+WIoIn29Qgw6hfaVjr35zivjAk3MYGTwDo1WByg8NFNf8/+0Jf\nqKxrLHJ3q3elauOmLVm2wLciDLwThiq6kUzc5P19n4lrjhfsYGui5kGm7G0F\nM4/7kmF0oLkAZWUoYy5NYoygCXUxbuuRKd8oOjQFiIYazdaJ+PQ2Xuq3p9hk\npO8rH0jD+HYLS4xqDwG5R/1e0xL/VW1N4++De7HaWKZVT1Pcf3w1kCyt6V2d\nsKA0eBSrCrJaOk32+cZdM4x/OTIlkYceCDZsBlWseVnXXXFlHPvrxVj+dwOF\n21x6FhFDm0dBfectNm6xnNpCDc+G5t8nQScKx9SENcaMMwAJRym6b0KVdrrI\nCmmnPdoi3dz3qU8j1jydA6Zf3/qT1v/f+40ZQONLHlRK9MYJrFz4uDSVki6z\nZISdJh9w8eAksMtARQkZ+JYaUA+6ivvWYnEjYrebldgvmb5fI13zgRiz4gHm\n41qz\r\n=HgkC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF7UBWw3FnObHWS3UzXE3sExj8KQ2D6NAHUNf+rSDj8LAiEAwOfMd+z1pEcTRTNCcSy803EOhlGXHa2jYwUCLDgJ8gM="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.4_1539210764505_0.4008064165801153"},"_hasShrinkwrap":false},"0.10.0-beta.5":{"name":"react-form-with-constraints","version":"0.10.0-beta.5","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run build:es5 && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"429d553d04bc3f74b677f12f11d3f2b0138c0b61","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.5","dist":{"shasum":"7f38b1c2e2b6acf056f46cc3033fb3f7c228d2e3","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.5.tgz","integrity":"sha512-G1C1SatF3PK242lbd6fY1AL4Z1IlnIZZL+XMuxWX6DQrI+wxi2n+A9dAftOTvi9E9abSqA10WBl40Apqlww0qg==","fileCount":79,"unpackedSize":359362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbwgVTCRA9TVsSAnZWagAA8WMP/jDMkIQgGYNLl4lMLDwi\nxndt2GgsDhZtktovCpApzNzPxQO3mSEoS+1NsKExWu7sCDmCsnBZVL2IGQxg\nlAsc7o7RnC1kKhKbj2SRmkC+ohc2wv+PcfLgfel1PvkpmogXCxSYCwwISGet\nAO8uqug5KaHw8BB+SKzVKtu/q0gQQHsUf8hIpSEPirc6oxYm4J1uFbfrlcKk\nf2yv6Z2tX+CrbJ1tgOfnz90iN+5/UxMGLk1ZWK8BWsDtVSYGydFjcxA3FJFB\n3sILE5kLDDazUb4x7fJ1duN1Fo5dsbhLn3aFc+H1FMJSNxg7zKMbcUkpHcJg\n9J1YsixWlYU6KLfEM/z4c4kshi5UXiTQHAnJenAVIA7AyLXmEX6NNSTVitix\nLBHShUTEUbBYGAZcHlho+vHapLzLSS8hf/S/2mjP/ywOsFq2l+lO6mLLZXLO\nUbEv0ModbnR1sHxA0RIHQg37wYaFKwS6IBcsvsqx7Zd6y/1KClXIjKU8qvla\nB4ead+TxpoZIjytz3ZPth/MZ02gnYw4JvWrrIpRYZ1yhSq2GgjXvyRlZcvLt\nZcunl9CS+fPVPvKTOruevwG0T6zCQqAXafUm+BivC8hXvbsEhC+tYuGVzlMX\n6+PZErG23Zx/a3FMMYxZRIBUCdY7hc6nmu53ep3jB9t20CbVH/PLd7BbBJ/W\n1NTS\r\n=VjYy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNht/7rPaBGqYxjNXZ7fdBx3NIMTnDImWuqT2Bh2pWPwIhAPQidpSreyoICsbuK4PNWWh4GuzjVtB9uucSCQU5PhN5"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.5_1539442002435_0.6433391438835092"},"_hasShrinkwrap":false},"0.10.0":{"name":"react-form-with-constraints","version":"0.10.0","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run build:es5 && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"429d553d04bc3f74b677f12f11d3f2b0138c0b61","_id":"react-form-with-constraints@0.10.0","dist":{"shasum":"71cc1a1739901d0f43aeab70e3bfcccb9fdd9e01","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0.tgz","integrity":"sha512-b3WGSWCaydSTSeDfyLcNaBpaccdoF+Mh/so9OA8ZqrjkBcNbHh9q+3Sy3MfGLlQAW/fv4mEIgT0ljHSIw4vK6g==","fileCount":79,"unpackedSize":359355,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbxkeMCRA9TVsSAnZWagAAj/oQAJImAjD8RFULcwW2JyPZ\nxUjgsqzGrCTzKGpkaN0bcOXbrjLcFAFr7jpCBP4ElKcl8HLDpShzYwi4ydaB\nfuTVv7LbM/HADhUyjLim24TdZJ+mobxeav9RtADtk1oBrwSCfVzEJfjj/pWV\n3PlFzHhvq2S8jc/z5nD8yFtJwrB61k1j77gxciPJmdCFg5Rkcj8FaswJfd1J\nGyNS8RtyAJcYq2mjVgd7rHK288MRfL7C3Uup+LFsC7Gpb5yTBo3/2fNgOYpr\nM8LRSP9GisUL/0qw2i3oO5oJMpD8nEsVDJbuv/rqslu8PE+qvMPE8/HPlOog\nCp+OCHtwm5CTqfWj6rNmj/lsGu+PmUH0KBdXPsCUHux6xN0cP3baQHP4h6J5\nNe8mDt53yT0Z/e7Ovobz8r6f+uOTcQOvgAad+F2FlvkKlbzKBahZPMVxm+qC\n/Grml2wgEiD2woefQdC2Gu2qE22jHGdwGmP4M5wZgZJ8w+NVX/XLmyrCYViY\nXhw9Kdz8E0SK7ICCufcKsykxb2NBJi6Lmrq3zvpZFdV/x9AeKUKwbWeENKHW\nQ+oqlDv8tHTJ2dJAH4EGvgqXYieiiTYd6rv02rfLHtL+7UYVo9Ffh+jeIY7e\nz9ApO46tMgEDO6iptn4sl0QAW6fPzAiSJIjIvJj8evvWWbn9URvY3kyN+RkP\n3GM9\r\n=tCaX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBT5MDIDrAZbehH6B+oaivkuDQSmbOpDQM7FruLWFCT5AiEAnCJYMLtMi1eybqWqesG2dPKXYcjZAQc7eIE0PUKfRHA="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0_1539721099640_0.41497592207598166"},"_hasShrinkwrap":false},"0.10.0-beta.6":{"name":"react-form-with-constraints","version":"0.10.0-beta.6","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run build:es5 && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"1662da222998224dd3e9321c75caf7174251dd45","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.6","dist":{"shasum":"bcb39667d6a26bf89a01530774a538585e6c6cd1","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.6.tgz","integrity":"sha512-gHrI4Ri6vrjrcqjdzcSunlkD6XujuX833SNieEqB78SpyNEazDRh65q6nJUNIQ1C+y3svzW+zzGeSKkmEyv2Rg==","fileCount":79,"unpackedSize":359362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbxklGCRA9TVsSAnZWagAASLMP/jDZOj0+b9qjtjaIuaxf\nv8plkYrC/nQnaoTxKEwaEbJtPD/LEVEdvJqoNRdYxiHHeZxa9/fKs+X6xBcR\nO4sORqJ/iC8pIrdnHQbt2dRvAtK3yvnfSp35xwIGUcHCRJpEPdSxaeabJlDG\nshHo/i4wR4qsXi7ohSriNXx7bLDAlQGvowFealjTaVbNeEv5RNmEuMHrupVq\nugraCRZ83njiHlzW3lMNUg9UR5tMecbLrru97v3FGBF2evlsQRCtsGcVCJdS\ndV7hRJ8p8pSh3QEXuwJqnk8yAcVnH03coUFpuFsTBhP7i7Opr42xAYTWUcAi\n5QtEFnWG5bTYpr27QvqcMoSl9OwJeqrzZU+yi4wCAY6aNtpidNKtvGr/yu0x\ntGGa8kpwJZ/knpK+QBvRa8MUS1kkc6vZhBiX2238j8sPYEJNOv9sLGHxyScp\n8FtRrTshAT8IglRRMVZqd9HzPg6F8Melt/9dBkSUpNPYY7P+l0QDvf9T5tEP\n0Ug8ZtPoIdnQz0mlBoECJIuTudqP2kS9R6zHTllq+4AmRFltojdralq1IiFO\naZnAgQbw7vXG/yDhha9md6ZtIUdU5XJ4Jt7GO+a3zoh1l6j25x67dFzYTl8M\nfNNgRM4trT6pXkRRSryArFdOq01ST8Kos022L8MnPiiDd8CRxcTZaLiQ3FwQ\nFUz3\r\n=59C4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDoCQgWcAquuWHlPv8U41FK/Tr1+9Yma4wgFuEg+9/moAiEAqbuMNMDHJT58oeLLxSb7t5E0/1HGQ7/CC3DOid5SxQ8="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.6_1539721541745_0.6542241728715608"},"_hasShrinkwrap":false},"0.10.0-beta.7":{"name":"react-form-with-constraints","version":"0.10.0-beta.7","repository":{"type":"git","url":"https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"npm run clean && npm run tsc && npm run build && npm run build:es5 && npm run dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"1662da222998224dd3e9321c75caf7174251dd45","readmeFilename":"README.md","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic example: https://codepen.io/tkrotoff/pen/BRGdqL\n\n  ![example-password](doc/example-password.png)\n\n- CodeSandbox Bootstrap 4 example: https://codesandbox.io/s/nkqrr17qqj\n- CodeSandbox Material-UI example: https://codesandbox.io/s/zx62rw4k64\n- CodeSandbox WizardForm example: https://codesandbox.io/s/my0ojyzq6p\n- CodeSandbox SignUp example: https://codesandbox.io/s/62qwozvm0k\n- CodeSandbox ClubMembers example: https://codesandbox.io/s/q8364yn60j\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\nOther examples inside [the examples directory](examples).\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/NoFramework/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, tells if the fields are valid\n\n  - `hasFeedbacks(): boolean` => tells if the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input type=\"email\" name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"username\">Username</label>\n<input name=\"username\" id=\"username\"\n       value={this.state.username} onChange={this.handleChange} />\n<FieldFeedbacks for=\"username\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","_id":"react-form-with-constraints@0.10.0-beta.7","dist":{"shasum":"bcc8bff758870677c7b88e5cd83cea9309ee525b","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.10.0-beta.7.tgz","integrity":"sha512-L6J1oZv/rXFy8SeDvAfJIrZJneqh6rZzr2gQV+r2S3pga4SAkZ33Ca2hcxvy8sjQKTVdIiTo9d4UdKJJkcVQGQ==","fileCount":79,"unpackedSize":359362,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbxkocCRA9TVsSAnZWagAA5aoQAJAu21UDNHIfoduUgiZF\nGQ+ncxSyqYg8yCyiYgZ8aTNl5JG0vZS7PapSx1KBjMSjd3spA/WLzSwAQexi\nOI9OW/s7d+DJUmaLvgvXalzmsZSwz0ucW3hsKExp2VFe5RcgpHo7YJx4dM1W\nm47R7bijy3bOvDHPHlPq0ZUXyxQ4i6uI/Lkv1bZdaQ9KgPXN3ONaDrxuitqz\ndY6/V1L3pFeUhN+wZDisS1XLFSBEA8Af43fS9+DPIObU491LWdNhe0TyEcGn\nuZMod1sTAFoEEQ8Re9bL+Pdverirk/Hb85P1RXiIve6uBzmf2RiWK591Wbp4\njoD/Gg6YOYhx1eyliJ29Ne8nZoysOZHdEKf41vOil5LR7DRmtrDv6cA2Rirb\nRi4zkDlK3Uon/OY3hDkIZpiTDCoU79ohS2ax0yQ7bziZ7AW3XlHksJu058iR\np9jOOo2rif6R1nCWw8yc0zAb/CD06ay3HzoE5KDGwmHMGAmQ2OGtHFSJkXWZ\nJ5PXgYCpkJIgezwm9bqV/FRS9GCDU0Fud05XPreIMDs2tP4q8zKKnGmATN7U\nGUKNoTFc3wz2J3lD/FcAMBztDO3hyv912Gd8gi8J+ei7tAWRJfLSh8hTPPYG\nKKtoWZR579v/2rtstxqfuQMRPZE8HaCekTfaWePzohRcqmckbUaPsM1a9Bl1\n8qyQ\r\n=kBkP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAvqVDh2yIWiZ/Irg0Iuy3B9B9Mv76KNq/ZhpXafYqDsAiEAsKUPHJtuMHS5YliApG/5X+AemhRc1aYcyna359S5aXo="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.10.0-beta.7_1539721755249_0.3139330762742547"},"_hasShrinkwrap":false},"0.11.0-beta.1":{"name":"react-form-with-constraints","version":"0.11.0-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"^0.68.2","rollup-plugin-filesize":"^5.0.1","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"099cadec10d813e58c419f94cec0ebb6a29f9655","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic Password example: https://codepen.io/tkrotoff/pen/BRGdqL ([CodeSandbox version](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Password))\n\n  ![example-password](doc/example-password.png)\n\n- [Bootstrap 4 example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Bootstrap4)\n- [Material-UI example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/MaterialUI)\n- [WizardForm example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/WizardForm)\n- [SignUp example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/SignUp)\n- [ClubMembers example](https://codesandbox.io/s/q8364yn60j)\n- [Password without state example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PasswordWithoutState)\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\n- Other examples from [the examples directory](examples):\n  - [Plain old React form validation example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PlainOldReact)\n  - [React with HTML5 constraint validation API example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/HTML5ConstraintValidationAPI)\n  - [Server-side rendering example](examples/ServerSideRendering)\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/PlainOldReact/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange = e => {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit = e => {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n    Might be renamed to `validateNonDirtyFieldsOnly()` or `validateFieldsNotDirtyOnly()` in the future?\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, indicates if the fields are valid\n\n  - `hasFeedbacks(): boolean` => indicates if any of the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input type=\"email\" name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange} />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.11.0-beta.1","_nodeVersion":"8.12.0","_npmVersion":"lerna/3.8.5/node@v8.12.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-BqXJVVJXiX6xE86KDaRBgOqCJQwbc7wRB0OK+j6JOj5WoVmnQLoujwk0/agJbVZAtSdJ1yPhPfFNcK/HtM015Q==","shasum":"d7c31a33c3169ec5a59041daaa9a3eab32694bab","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.11.0-beta.1.tgz","fileCount":79,"unpackedSize":357859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcML1CCRA9TVsSAnZWagAAmsgP/jpM7wW9FzcR4IM7fQha\nIXk/LJvRBh5LO5ZBZWlb2qYmvry6u8HT5rMVGtMqJYt76ZdBndpX/kk/RPzf\nH4O4Q4Miw0i4qYV6S53jf8lmENXmTr4f7G12VzKboh8jxVZURmetW7EkceMa\neTIvjiRw9gQWKB4MeNGyF5fDQScnlcY0USvGgR8h5lDxrOwrziFuplcQ7m0w\ngPklanNexnY1Z4SNKecAb2Xn0JB0C55HZHGNMiGl2qFsWu2jqqaphEu16ESh\ny9iKQnovgpiCJwsPtcymCq2I9+cZ07qLuSU2k9KQe+GHXvPdNqMwmTrHbEWn\nvJc9nzlaIEYVIcwmK12wUThIO7nA4pzAANoakMlUXDTYBB3HhQ2Ikt50mN14\n92z7+ELPEv/T1dv0thSHfeMfppyI89KeNO61nLlwuyNtV2LreK1SOzhoanuD\nN2gzS9FbtHH3vzLRDzhw6KZTQd0pwCRai1a4lcN5GstFGuJIYR32eO8fMUKl\nl7eo2/TXmQP/g+db51Q3QN4IvAmFdEqVx/fFaUlvD5Z2zZ1xDpXEATBBfcqc\ndWLamzxqslfUrtevZLt5c19FVVoC0HwKLiCjwBXyvHFDw43lzTv9CRbQTmQt\nOa+g9zvy66JFDoDHoo2e+lNM8vOPdOexm6oYkuxU3zssQY4WComfXFVNqrDw\n8au+\r\n=io2m\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIElP+8bAp51YL0KBD4g08E6YEVU4kVI4TCdzMvclI4zOAiEA6yPfjl+3RJSXNxwaOCErb5SS/Dp5JA8KZaB1V8ngO5o="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.11.0-beta.1_1546698049569_0.9952740391974775"},"_hasShrinkwrap":false},"0.11.0-beta.2":{"name":"react-form-with-constraints","version":"0.11.0-beta.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"^0.68.2","rollup-plugin-filesize":"^5.0.1","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"099cadec10d813e58c419f94cec0ebb6a29f9655","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js.gz?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic Password example: https://codepen.io/tkrotoff/pen/BRGdqL ([CodeSandbox version](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Password))\n\n  ![example-password](doc/example-password.png)\n\n- [Bootstrap 4 example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Bootstrap4)\n- [Material-UI example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/MaterialUI)\n- [WizardForm example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/WizardForm)\n- [SignUp example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/SignUp)\n- [ClubMembers example](https://codesandbox.io/s/q8364yn60j)\n- [Password without state example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PasswordWithoutState)\n\n- [React Native example](examples/ReactNative):\n\n  | iOS                                                   |                                                       Android |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\n- Other examples from [the examples directory](examples):\n  - [Plain old React form validation example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PlainOldReact)\n  - [React with HTML5 constraint validation API example](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/HTML5ConstraintValidationAPI)\n  - [Server-side rendering example](examples/ServerSideRendering)\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/PlainOldReact/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n```JSX\nclass MyForm extends React.Component {\n  async handleChange = e => {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await this.form.validateFields(target);\n\n    const fieldIsValid = fields.every(field => field.isValid());\n    if (fieldIsValid) console.log(`Field '${target.name}' is valid`);\n    else console.log(`Field '${target.name}' is invalid`);\n\n    if (this.form.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  async handleSubmit = e => {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await this.form.validateForm();\n\n    // or simply use this.form.isValid()\n    const formIsValid = fields.every(field => field.isValid());\n\n    if (formIsValid) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  render() {\n    return (\n      <FormWithConstraints\n        ref={formWithConstraints => this.form = formWithConstraints}\n        onSubmit={this.handleSubmit} noValidate\n      >\n        <input\n          name=\"username\"\n          onChange={this.handleChange}\n          required minLength={3}\n        />\n        <FieldFeedbacks for=\"username\">\n          <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n          <Async\n            promise={checkUsernameAvailability}\n            then={available => available ?\n              <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n              <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n            }\n          />\n          <FieldFeedback when=\"*\" />\n        </FieldFeedbacks>\n      </FormWithConstraints>\n    );\n  }\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n    Might be renamed to `validateNonDirtyFieldsOnly()` or `validateFieldsNotDirtyOnly()` in the future?\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, indicates if the fields are valid\n\n  - `hasFeedbacks(): boolean` => indicates if any of the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input type=\"email\" name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange} />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.11.0-beta.2","_nodeVersion":"8.12.0","_npmVersion":"lerna/3.8.5/node@v8.12.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-xK8BDNhO0dkOOtSdX6suGnBhQ3ksNzK9Fg4HUG2cWCR2XFvb5Q0gMwr/1cbA63ro+4D95Aed+Lsa0wjQht1BKA==","shasum":"b2d28257e7b5e0e027741ffa75f87cb7f5d2f0ba","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.11.0-beta.2.tgz","fileCount":79,"unpackedSize":357859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcMMuzCRA9TVsSAnZWagAAxGcP/1wM5/N1+cTMI5BtEcxN\nBkVzijVrYI4sOoDgC4YuH20fHL4Trj3gMNRW4FSkctanHWNQitF5NtpL9kDS\nCu4gOOgFurWbxEO4YqFM0N8oj/CLNsLt5z2BMjM52oen3WjdFZdydIZR6H5N\nfp/P9P1sGHn7yMh4DdFarIp8l/ogeAtB5bg4V0zEnaG3TKxeJvzE2d+1j75s\nIWfvBNaSooixr62ul0CLSO3yUI/DO4F/3Zf7CdbadBY//9ursvaCjSv/jzV5\ngTkKh0kBK7MOETorFzLS975Xc6iQF7PKh1COt8DE7F+Cber/Y9lHYkjlDiGp\n4bxVXmZRScO1n7gdMWPKPRRDB+hjV3KeXR+u/Y5L8jE7P0osGrX+JHzyEIh4\nZ3vdpfC5D2VK6XAkODfm5zNHBVcT9W8v5K9wnokFnCrczQaYC2bX72tG4Ofv\nMKrWh3A165pdTvA9n3u9wWGrplZI/4SsDSdgJ1nNUfQoC/jp+3cT9BkzgbD/\nUziSOJlKPuoRCPcHQltaspa+BDcvw+KOzcaB9f43fYsMCVbPuqRq0D9wrB7s\nAAF+nTczcnE6BzBPHz12DCFcbsAws0UVMu5GGoW6+Ep0FrEQjL+DsffJSxYB\nWVXkmbIxDYotXUf4Cj5bKa2cX1QIJ/UglMsNILSGWfzEIghDyv8dM33v1yY2\nYs+k\r\n=qtGI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxZXDtrsIQsZ9ttcGfTEUvpZVo1uF+JiEnOqSoW6nE8QIhAJCX43XqFyKQdZxTbbNDoGCXzrPVemPcWl9SgY3yiEHL"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.11.0-beta.2_1546701746901_0.9122389992932591"},"_hasShrinkwrap":false},"0.11.0":{"name":"react-form-with-constraints","version":"0.11.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"del-cli lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"cross-env NODE_ENV=development rollup --config && cross-env NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.6.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","cross-env":"latest","del-cli":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","node-gyp":"latest","node-zopfli":"latest","react":"latest","react-dom":"latest","rollup":"^0.68.2","rollup-plugin-filesize":"^5.0.1","rollup-plugin-gzip":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","rollup-pluginutils":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"58becea4459e61fe45eb967281911d7c87d20f24","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.11.0","_nodeVersion":"8.12.0","_npmVersion":"lerna/3.8.5/node@v8.12.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-qEWXiXk6RAWrQ+4A2mvGK6rORzXfWSEZ4sX6Hww8UEHqZfSnGyByioeEcNNKIHTML4Aj8+Lo6hp4CupMQ1zy5A==","shasum":"282e04795aa3d3662324f68014c712a6b792c286","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.11.0.tgz","fileCount":79,"unpackedSize":361223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcMNlDCRA9TVsSAnZWagAAOZ8P/iSHI7WrJzgtmmOmKIL2\nk8wZJUlmq11WuRASNBcgwfSNiK5VUWR40qayNiHA2K4kRENOnxMQtkuc9beD\nZ2Etppxk1UT23YUcuBqqMFgtNQ7ws0lNW9D7ULTjgpJZvncMZfOGaYMB3qCE\nHjrDPhtepDXn7uQVXxt6i1sQP1jY8b5Q7BVlJQemJq4D6lcz/YB44oTYVTAf\nrBRhXaqHPKAC8A1dQdN2JCDtmnqzNSMEUfhn2rwr+DqlMjZ8NRicRKTZSq8D\n8wGSQJRMDkewS+dUEgspMJJ0qzipaLtzrNbDrX8nqBcgxJX7FWnJ1Rdtj+Em\nL5LRObs+IDwLMEyEKGoR18jZqatBuMVX3l9AvcIoQl7Q1Fcyio4zbJK9B1kU\nlIRWIZo5sG0ng2eN/O0q/j0g/fId7XqQOmnXfoNE9Qpi4dr3ThG1BLK2dF3S\nubmL+IFcibu6rdNYw557o6JF1rdt2fLctq3Oms/futTSuLyvV+nJSEsfti2f\nJJa8z3uNTl7tcLOcy1lFc3n9I5nsqlAIKAexD1CKSq55KhA31lUjdMp6k70x\nr6nBj5/hEpl7zA6gdEJb7TscG9LDeD7WINPjWDU2Z/iYF1of7cNG8CIdwy6Y\nOm+0nVBkKEhzjKhAkz52Qnu0pYHIpZQOYG263J7SowLYHRf5//R5ouw0Fw6x\n8YCz\r\n=67VE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAKDCd80giYWeIGeL+n1K6IOF17IPhlYHfKxsHrJ7ae3AiAxf0pqfd1AIAUkZsm+9mJEyLsvalqGqyXiDnieBccZLQ=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.11.0_1546705219006_0.39172740883297075"},"_hasShrinkwrap":false},"0.12.0":{"name":"react-form-with-constraints","version":"0.12.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"NODE_ENV=development rollup --config && NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"latest","@types/enzyme-adapter-react-16":"latest","@types/jest":"latest","@types/js-beautify":"latest","@types/prop-types":"latest","@types/react":"latest","enzyme":"latest","enzyme-adapter-react-16":"latest","jest":"latest","js-beautify":"latest","react":"latest","react-dom":"latest","rollup":"latest","rollup-plugin-filesize":"latest","rollup-plugin-strip":"latest","rollup-plugin-typescript2":"latest","rollup-plugin-uglify":"latest","ts-jest":"latest","typescript":"latest"},"gitHead":"c2778c8bc5b2ba2a6e984dec1fc1432b2a6f1eba","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.12.0","_nodeVersion":"11.10.0","_npmVersion":"lerna/3.13.1/node@v11.10.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-UPHQXf7ux0xTwBqeE8p3S9sK7NfP8y1W0lkIp8yQEus0op3/jkxt10ht+olnRP+CyGvNby61yzi0ZQRcLYalNg==","shasum":"75dec38a8957f918aae70252a9cfa13fc4885111","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.12.0.tgz","fileCount":77,"unpackedSize":345720,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcks3sCRA9TVsSAnZWagAA8A0QAJPLOEzG402K69OS5I6c\n/JpTDcPGlrWtKH4431StizDeG/Lwn6yYKXtstb14YJLT3dtm8TSa80pgNqa0\nbhgLUp3hO4zoqJJtTUy0njTLRRGf65X6leR5gmZLCwdnC1c3N5hOo8k4rLcM\nSlzW5JrOPvBF9VAXSuxsqt7Eag+eMJxGPQ8T+mHy5VW8F/LIlS/BYY75pctG\n4n9x1kJ5CYFnz+8BxLJc43GJgnnHBajCVZ8wW8AkCogKmf3m4rig5K5jSQlc\nIiRKaSjUoX3jbdPw1QGNJ0jIbaqxE7SB7Udt4ra9YTe7W2NTjlMaiqKV4W+t\nFhNOO960fShK4y/nms+Wx/vK9miJLlxYWuY7Pgu0cxxqNhHmKJRcLKUNMHn6\ns9xVHP5vSfchmc96wWZHJQWnpTMSGtJafSmXXMKIIdA2+QJP5mjU45UNvcfs\nDhkw64i2e3jxno8K/QaX2GkjR/B28ct3L6sQcb+QVzYPebVA4tWIponjPHZ0\nlCPhI7AHRRsUzOUAhj5x+bWEtcGpzx8WtPdbn7EI2WJLS2mJsQkSgNQ8A2z9\n1UdNN816zAKXYGd60X46ylvtZOAiTn2bUVS+9E4d/dXSSizMKMxdhm+MtCEC\n4rmyvionSFQQvhiWlXyecWuJrbOuFpw48UUD1x7VJvEJDsGMAzEcBF0Pc/pE\n1PFT\r\n=ZGD9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHwie1ScRqWws19uZOm44AXfxUe7arITvfahxBNS0w9YAiA66YjpRdl0lIPD2OHUNHIEoEdo2pfG9kizE4nm16sRsA=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.12.0_1553124843155_0.5300602021303706"},"_hasShrinkwrap":false},"0.13.0-beta.1":{"name":"react-form-with-constraints","version":"0.13.0-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"NODE_ENV=development rollup --config && NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.9.1","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.11","@types/js-beautify":"^1.8.0","@types/prop-types":"^15.7.0","@types/react":"^16.8.8","enzyme":"^3.9.0","enzyme-adapter-react-16":"^1.11.2","jest":"^24.5.0","js-beautify":"^1.9.1","react":"^16.8.5","react-dom":"^16.8.5","rollup":"^1.7.3","rollup-plugin-filesize":"^6.0.1","rollup-plugin-strip":"^1.2.1","rollup-plugin-typescript2":"^0.20.1","rollup-plugin-uglify":"^6.0.2","ts-jest":"^24.0.0","typescript":"^3.3.4000"},"gitHead":"e2c0168ce96053e00e0fc83ca481deb038a7013b","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic Password example: https://codepen.io/tkrotoff/pen/BRGdqL ([CodeSandbox version](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Password))\n\n  ![example-password](doc/example-password.png)\n\n- [Bootstrap 4 example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Bootstrap4)\n- [Material-UI example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/MaterialUI)\n- [WizardForm example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/WizardForm)\n- [SignUp example (React classes)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/SignUp)\n- [ClubMembers example (React classes + MobX)](https://codesandbox.io/s/q8364yn60j)\n- [Password without state example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PasswordWithoutState)\n\n- [React Native example (React classes)](examples/ReactNative):\n\n  | iOS                                                   | Android                                                       |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\n- Other examples from [the examples directory](examples):\n  - [Plain old React form validation example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PlainOldReact)\n  - [React with HTML5 constraint validation API example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/HTML5ConstraintValidationAPI)\n  - [Server-side rendering example (React hooks)](examples/ServerSideRendering)\n\n## How it works\n\nThe API works the same way as [React Router v4](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/PlainOldReact/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(\\*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n\n```JSX\nfunction MyForm() {\n  const form = useRef(null);\n\n  async function handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    const fields = await form.current.validateFields(target);\n  }\n\n  async function handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    const fields = await form.current.validateForm();\n\n    if (form.current.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  return (\n    <FormWithConstraints ref={form} onSubmit={handleSubmit} noValidate>\n      <input\n        name=\"username\"\n        onChange={handleChange}\n        required minLength={3}\n      />\n      <FieldFeedbacks for=\"username\">\n        <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n        <Async\n          promise={checkUsernameAvailability}\n          then={available => available ?\n            <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n            <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n          }\n        />\n        <FieldFeedback when=\"*\" />\n      </FieldFeedbacks>\n    </FormWithConstraints>\n  );\n}\n```\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n    Might be renamed to `validateNonDirtyFieldsOnly()` or `validateFieldsNotDirtyOnly()` in the future?\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, indicates if the fields are valid\n\n  - `hasFeedbacks(): boolean` => indicates if any of the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) or [@babel/polyfill](https://babeljs.io/docs/usage/polyfill/) to support IE <= 11, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input type=\"email\" name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange} />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## How to consume the npm packages?\n\n### ESNext (currently ES2018) + ES modules\n\nFiles inside [`lib/`](https://unpkg.com/react-form-with-constraints@latest/lib/) (package.json `\"module\": \"lib/index.js\"`).\n\nA recent browser or Node.js is required or you will need to transpile the react-form-with-constraints source code using Babel (or TypeScript tsc).\n\nSeveral advantages:\n\n- The combine use of `\"sideEffects\": false` with `\"module\": ...` generates a smaller bundle thanks to [tree shaking](https://webpack.js.org/guides/tree-shaking/)\n- You can transpile react-form-with-constraints source code with your Babel's [preset-env](https://babeljs.io/docs/en/babel-preset-env) and [Browserslist](https://github.com/browserslist/browserslist) configuration\n\nFor this to work, do not exclude `node_modules` from your webpack configuration, example:\n\n```JS\n// webpack.config.js\nmodule: {\n  rules: [\n    {\n      test: /\\.(js|jsx?)$/,\n\n      // See [Enable babel-preset-env for node_modules that target newer Node versions](https://github.com/facebook/create-react-app/issues/1125)\n      // See [Create React App 2.0: \"You can now use packages written for latest Node versions without breaking the build\"](https://reactjs.org/blog/2018/10/01/create-react-app-v2.html)\n      // See [\"If you have to exclude node_modules/, how do you get babel to polyfill/transform code in 3rd party code?\"](https://github.com/webpack/webpack/issues/6544#issuecomment-417108242)\n      // See [Compile dependencies with babel-preset-env](https://github.com/facebook/create-react-app/pull/3776)\n      //exclude: /node_modules/,\n      exclude: /\\/core-js/,\n\n      loader: 'babel-loader',\n      options: {\n        // See https://github.com/facebook/create-react-app/blob/v2.1.0/packages/react-scripts/config/webpack.config.dev.js#L284\n        compact: false\n      }\n    }\n  ]\n}\n```\n\nYou probably want to configure Babel with `sourceType: 'unambiguous'`:\n\n```JS\n// babel.config.js\nmodule.exports = {\n  // See https://github.com/facebook/create-react-app/blob/v2.1.0/packages/babel-preset-react-app/dependencies.js#L64\n  // See [Add Babel config sourceType: 'unambiguous' for dependencies](https://github.com/facebook/create-react-app/pull/5052)\n  sourceType: 'unambiguous',\n\n  presets: [\n    [\n      '@babel/preset-env',\n      {\n        useBuiltIns: 'usage'\n      }\n    ],\n    '@babel/preset-react'\n  ],\n  plugins: [\n    '@babel/plugin-proposal-class-properties',\n    '@babel/plugin-proposal-object-rest-spread'\n  ]\n};\n```\n\n### ES5 + CommonJS\n\nClassic ES5 transpilation, files inside [`lib-es5/`](https://unpkg.com/react-form-with-constraints@latest/lib-es5/) (package.json `\"main\": \"lib-es5/index.js\"`).\nNo tree shaking.\n\n### UMD (Universal Module Definition) + ES5\n\nFiles inside [`dist/`](https://unpkg.com/react-form-with-constraints@latest/dist/).\nTypical use is with `<script src=\"react-form-with-constraints.production.min.js\">` inside your index.html.\n\nA good use case is [CodePen](https://codepen.io/tkrotoff/pen/BRGdqL), files are generated by [Rollup](packages/react-form-with-constraints/rollup.config.js).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n- With `<input type=\"number\">` it's better to use `onInput` instead of `onChange`, see https://github.com/facebook/react/issues/11142\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.13.0-beta.1","_nodeVersion":"11.10.0","_npmVersion":"lerna/3.13.1/node@v11.10.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-/Xo8vqA+id2wNJWwcM6g66U1t9xAKR78TZjKX6uby/D8UnRTfxnQ5KhdBKYiUR1rzu/cmHtqlSoTNzZS/3cLIg==","shasum":"81308eebac53f4fb56945bfa4049e9419e51867d","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.13.0-beta.1.tgz","fileCount":77,"unpackedSize":347359,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmsvHCRA9TVsSAnZWagAA+bcQAJG+cFuBX5jshyUVcXe9\nk1jDnKGYhNJ7X0Q17ozp6O+GQWGJVtESdQAAajMCmGc+j5DMJsRL3A4OzIIn\n+fScuNrKtU6lsuhMYNtEiHfBo2377oq+FgZLNLlGS/1UHh9tquRGBzvcA6tH\nUGMFcwWEizMC43De/V55cPY3CU08jPhnrdtkKyAGs2I9GXNCB8LWEJvR0eKN\nfLeNI9hmDUYxDiwJsCQVC5p2XmtnR0/2JE2j8qKkfiqbtp2i7DxDvuDd6jwd\nz9KEZu55ieXzMFETodu8wydrodoCEq5ztwFCm1S2vuPXG7pHOBuJWeVt6utl\nXyJm5/d22zouZ0nFbIIpXgSuSZa3CnkJ4iI3GAobSKR2CGwA9LRZwetTHw3V\nI+7o5g9F5DzpzN1V8sLXEG9NQ1VG8D1lf1IS06n1C+NTI93+0sCSoQvYlS6A\ne7jeAtp9fESxklovu8dNHTHptHqquv8kTaiZgWSUxT0UhLa+ZzXLhblAXo1u\nP9DvCTCf4YHxFazX2MVYM5DUaRkcDAjAl0fJ0Y9Gzsjbf7MOHGLGtpFKYXwS\nzXhgcsBaDLcI2fE3g1x98l46sHSt8m/7Av5pRMzyPppKoRPUwuuhnDsHXuc6\nFmes+zwY9bOLbvGdZ++31UQGDdPRC47Ji277vz6MkSlYcxFMX9eo8GYLMdbd\nZzDe\r\n=kyie\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHkYEZojNMmU2iz+c8hauFi5pPfT14VNU0yTHdUR768eAiEA88e5CN5Wfc/Y7EZUNM101XJer73SD+dPxZKy4RojiO0="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.13.0-beta.1_1553648583074_0.2568398320419176"},"_hasShrinkwrap":false},"0.13.0-beta.2":{"name":"react-form-with-constraints","version":"0.13.0-beta.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"NODE_ENV=development rollup --config && NODE_ENV=production rollup --config","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md .","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.9.3","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.14","@types/js-beautify":"^1.8.1","@types/prop-types":"^15.7.1","@types/react":"^16.8.20","enzyme":"3.9.0","enzyme-adapter-react-16":"^1.14.0","jest":"^24.8.0","js-beautify":"^1.10.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.15.3","rollup-plugin-filesize":"^6.1.0","rollup-plugin-strip":"^1.2.1","rollup-plugin-typescript2":"^0.21.1","rollup-plugin-uglify":"^6.0.2","ts-jest":"^24.0.2","typescript":"^3.5.2"},"gitHead":"60a437ed6d1fc0e70421d8d8ce45b8bcf2448b19","readme":"# react-form-with-constraints\n\n[![npm version](https://badge.fury.io/js/react-form-with-constraints.svg)](https://badge.fury.io/js/react-form-with-constraints)\n[![Build Status](https://travis-ci.org/tkrotoff/react-form-with-constraints.svg?branch=master)](https://travis-ci.org/tkrotoff/react-form-with-constraints)\n[![codecov](https://codecov.io/gh/tkrotoff/react-form-with-constraints/branch/master/graph/badge.svg)](https://codecov.io/gh/tkrotoff/react-form-with-constraints)\n[![gzip size](https://img.badgesize.io/https://unpkg.com/react-form-with-constraints@latest/dist/react-form-with-constraints.production.min.js?compression=gzip)](https://unpkg.com/react-form-with-constraints/dist/)\n\nSimple form validation for React\n\n- Installation: `npm install react-form-with-constraints`\n- CDN: https://unpkg.com/react-form-with-constraints/dist/\n\nCheck the [changelog](CHANGELOG.md) for breaking changes and fixes between releases.\n\n## Introduction: what is HTML5 form validation?\n\n⚠️ [Client side validation is cosmetic, you should not rely on it to enforce security](https://stackoverflow.com/q/162159)\n\n```HTML\n<form>\n  <label for=\"email\">Email:</label>\n  <input type=\"email\" id=\"email\" required>\n  <button>Submit</button>\n</form>\n```\n\n![input required](doc/input-required.png)\n![input type=\"email\"](doc/input-type-email.png)\n\nThe `required` HTML5 attribute specifies that the user must fill in a value, [`type=\"email\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email) checks that the entered text looks like an email address.\n\nResources:\n\n- [Making Forms Fabulous with HTML5](https://www.html5rocks.com/en/tutorials/forms/html5forms/)\n- [Constraint Validation: Native Client Side Validation for Web Forms](https://www.html5rocks.com/en/tutorials/forms/constraintvalidation/)\n- [MDN - Form data validation](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation)\n- [MDN - Form input types](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_<input>_types)\n- [UX Research Articles - Usability Testing of Inline Form Validation](https://baymard.com/blog/inline-form-validation)\n\n## What react-form-with-constraints brings\n\n- Minimal API and footprint\n- Unobtrusive: easy to adapt regular [React code](https://reactjs.org/docs/forms.html)\n- HTML5 error messages personalization: `<FieldFeedback when=\"valueMissing\">My custom error message</FieldFeedback>`\n- Custom constraints: `<FieldFeedback when={value => ...}>`\n- Warnings and infos: `<FieldFeedback ... warning>`, `<FieldFeedback ... info>`\n- Async validation\n- No dependency beside React (no Redux, MobX...)\n- Re-render only what's necessary\n- Easily extendable\n- [Bootstrap 4](examples/Bootstrap4) styling with npm package `react-form-with-constraints-bootstrap4`\n- [Material-UI](examples/MaterialUI) integration with npm package `react-form-with-constraints-material-ui`\n- Support for [React Native](examples/ReactNative) with npm package `react-form-with-constraints-native`\n- ...\n\n```JSX\n<input type=\"password\" name=\"password\"\n       value={this.state.password} onChange={this.handleChange}\n       required pattern=\".{5,}\" />\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">\n    Should be at least 5 characters long\n  </FieldFeedback>\n  <FieldFeedback when={value => !/\\d/.test(value)} warning>\n    Should contain numbers\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[a-z]/.test(value)} warning>\n    Should contain small letters\n  </FieldFeedback>\n  <FieldFeedback when={value => !/[A-Z]/.test(value)} warning>\n    Should contain capital letters\n  </FieldFeedback>\n</FieldFeedbacks>\n```\n\n## Examples\n\n- CodePen basic Password example: https://codepen.io/tkrotoff/pen/BRGdqL ([CodeSandbox version](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Password))\n\n  ![example-password](doc/example-password.png)\n\n- [Bootstrap 4 example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/Bootstrap4)\n- [Material-UI example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/MaterialUI)\n- [WizardForm example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/WizardForm)\n- [SignUp example (React classes)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/SignUp)\n- [ClubMembers example (React classes + MobX)](https://codesandbox.io/s/q8364yn60j)\n- [Password without state example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PasswordWithoutState)\n\n- [React Native example (React classes)](examples/ReactNative):\n\n  | iOS                                                   | Android                                                       |\n  | ----------------------------------------------------- | ------------------------------------------------------------- |\n  | ![react-native-example-ios](doc/react-native-ios.png) | ![react-native-example-android](doc/react-native-android.png) |\n\n- Other examples from [the examples directory](examples):\n  - [Plain old React form validation example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/PlainOldReact)\n  - [React with HTML5 constraint validation API example (React hooks)](https://codesandbox.io/s/github/tkrotoff/react-form-with-constraints/tree/master/examples/HTML5ConstraintValidationAPI)\n  - [Server-side rendering example (React hooks)](examples/ServerSideRendering)\n\n## How it works\n\nThe API works the same way as [React Router](https://reacttraining.com/react-router/web/example/basic):\n\n```JSX\n<Router>\n  <Route exact path=\"/\" component={Home} />\n  <Route path=\"/news\" component={NewsFeed} />\n</Router>\n```\n\nIt is also inspired by [AngularJS ngMessages](https://docs.angularjs.org/api/ngMessages#usage).\n\nIf you had to implement validation yourself, you would end up with [a global object that tracks errors for each field](examples/PlainOldReact/App.tsx).\nreact-form-with-constraints [works similarly](packages/react-form-with-constraints/src/FieldsStore.ts).\nIt uses [React context](https://reactjs.org/docs/legacy-context.html) to share the [`FieldsStore`](packages/react-form-with-constraints/src/FieldsStore.ts) object across [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx) and [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx).\n\n## API\n\nThe API reads like this: \"for field when constraint violation display feedback\", example:\n\n```JSX\n<FieldFeedbacks for=\"password\">\n  <FieldFeedback when=\"valueMissing\" />\n  <FieldFeedback when=\"patternMismatch\">Should be at least 5 characters long</FieldFeedback>\n</FieldFeedbacks>\n```\n\n```\nfor field \"password\"\n  when constraint violation \"valueMissing\"    display <the HTML5 error message (*)>\n  when constraint violation \"patternMismatch\" display \"Should be at least 5 characters long\"\n```\n\n(\\*) [element.validationMessage](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api)\n\nAsync support works as follow:\n\n```JSX\n<FieldFeedbacks for=\"username\">\n  <Async\n    promise={checkUsernameAvailability} /* Function that returns a promise */\n    then={available => available ?\n      <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n      <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n      // Why key=*? Needed otherwise React gets buggy when the user rapidly changes the field\n    }\n  />\n</FieldFeedbacks>\n```\n\nTrigger validation:\n\n```JSX\nfunction MyForm() {\n  const form = useRef(null);\n\n  async function handleChange(e) {\n    const target = e.target;\n\n    // Validates only the given fields and returns Promise<Field[]>\n    await form.current.validateFields(target);\n  }\n\n  async function handleSubmit(e) {\n    e.preventDefault();\n\n    // Validates the non-dirty fields and returns Promise<Field[]>\n    await form.current.validateForm();\n\n    if (form.current.isValid()) console.log('The form is valid');\n    else console.log('The form is invalid');\n  }\n\n  return (\n    <FormWithConstraints ref={form} onSubmit={handleSubmit} noValidate>\n      <input\n        name=\"username\"\n        onChange={handleChange}\n        required minLength={3}\n      />\n      <FieldFeedbacks for=\"username\">\n        <FieldFeedback when=\"tooShort\">Too short</FieldFeedback>\n        <Async\n          promise={checkUsernameAvailability}\n          then={available => available ?\n            <FieldFeedback key=\"1\" info style={{color: 'green'}}>Username available</FieldFeedback> :\n            <FieldFeedback key=\"2\">Username already taken, choose another</FieldFeedback>\n          }\n        />\n        <FieldFeedback when=\"*\" />\n      </FieldFeedbacks>\n    </FormWithConstraints>\n  );\n}\n```\n\n<br>\n\n**Important note:**\n\nIf a field (i.e an `<input>`) does not have a matching `FieldFeedbacks`, the library won't known about this field (and thus won't perform validation).\nThe field name should match `FieldFeedbacks.for`:\n\n```JSX\n<input name=\"MY_FIELD\" ...>\n<FieldFeedbacks for=\"MY_FIELD\">\n  ...\n</FieldFeedbacks>\n```\n\n<br>\n<br>\n\n- [`FieldFeedbacks`](packages/react-form-with-constraints/src/FieldFeedbacks.tsx)\n\n  - `for: string` => reference to a `name` attribute (e.g `<input name=\"username\">`), should be unique to the current form\n  - `stop?: 'first' | 'first-error' | 'first-warning' | 'first-info' | 'no'` =>\n    when to stop rendering `FieldFeedback`s, by default stops at the first error encountered (`FieldFeedback`s order matters)\n\n  Note: you can place `FieldFeedbacks` anywhere, have as many as you want for the same `field`, nest them, mix them with `FieldFeedback`... Example:\n\n  ```JSX\n  <input name=\"username\" ... />\n\n  <FieldFeedbacks for=\"username\" stop=\"first-warning\">\n    <FieldFeedbacks>\n      <FieldFeedback ... />\n      <Async ... />\n      <FieldFeedbacks stop=\"first-info\">\n        ...\n      </FieldFeedbacks>\n    </FieldFeedbacks>\n\n    <FieldFeedback ... />\n    <Async ... />\n  </FieldFeedbacks>\n\n  <FieldFeedbacks for=\"username\" stop=\"no\">\n    ...\n  </FieldFeedbacks>\n  ```\n\n- [`FieldFeedback`](packages/react-form-with-constraints/src/FieldFeedback.tsx)\n\n  - `when?`:\n    - [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) as a string => HTML5 constraint violation name\n    - `'*'` => matches any HTML5 constraint violation\n    - `'valid'` => displays the feedback only if the field is valid\n    - `(value: string) => boolean` => custom constraint\n  - `error?: boolean` => treats the feedback as an error (default)\n  - `warning?: boolean` => treats the feedback as a warning\n  - `info?: boolean` => treats the feedback as an info\n  - `children` => what to display when the constraint matches; if missing, displays the [HTML5 error message](https://www.w3.org/TR/html51/sec-forms.html#the-constraint-validation-api) if any\n\n- [`Async<T>`](packages/react-form-with-constraints/src/Async.tsx) => Async version of `FieldFeedback` (similar API as [react-promise](https://github.com/capaj/react-promise))\n\n  - `promise: (value: string) => Promise<T>` => a promise you want to wait for\n  - `pending?: React.ReactNode` => runs when promise is pending\n  - `then?: (value: T) => React.ReactNode` => runs when promise is resolved\n  - `catch?: (reason: any) => React.ReactNode` => runs when promise is rejected\n\n- [`FormWithConstraints`](packages/react-form-with-constraints/src/FormWithConstraints.tsx)\n\n  - `validateFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Should be called when a `field` changes, will re-render the proper `FieldFeedback`s (and update the internal `FieldsStore`).\n    Without arguments, all fields (`$('[name]')`) are validated.\n\n  - `validateFieldsWithoutFeedback(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Validates only all non-dirty fields (won't re-validate fields that have been already validated with `validateFields()`),\n    If you want to force re-validate all fields, use `validateFields()`.\n    Might be renamed to `validateNonDirtyFieldsOnly()` or `validateFieldsNotDirtyOnly()` in the future?\n\n  - `validateForm(): Promise<Field[]>` =>\n    Same as `validateFieldsWithoutFeedback()` without arguments, typically called before to submit the `form`.\n    Might be removed in the future?\n\n  - `isValid(): boolean` => should be called after `validateFields()`, `validateFieldsWithoutFeedback()` or `validateForm()`, indicates if the fields are valid\n\n  - `hasFeedbacks(): boolean` => indicates if any of the fields have any kind of feedback\n\n  - `resetFields(...inputsOrNames: Array<Input | string>): Promise<Field[]>` =>\n    Resets the given fields and re-render the proper `FieldFeedback`s.\n    Without arguments, all fields (`$('[name]')`) are reset.\n\n  - [`Field`](packages/react-form-with-constraints/src/Field.ts) =>\n    ```TypeScript\n    {\n      name: string;\n      validations: { // FieldFeedbackValidation[]\n        key: number;\n        type: 'error' | 'warning' | 'info' | 'whenValid';\n        show: boolean | undefined;\n      }[];\n      isValid: () => boolean\n    }\n    ```\n\n- [`Input`](packages/react-form-with-constraints/src/Input.tsx)\n\n  If you want to style `<input>`, use `<Input>` instead: it will add classes `is-pending`, `has-errors`, `has-warnings`, `has-infos` and/or `is-valid` on `<input>` when the field is validated.\n\n  Example: `<Input name=\"username\" />` can generate `<input name=\"username\" class=\"has-errors has-warnings\">`\n\n  FYI `react-form-with-constraints-bootstrap4` and `react-form-with-constraints-material-ui` already style the fields to match their respective frameworks.\n\n## Browser support\n\nreact-form-with-constraints needs [`ValidityState`](https://developer.mozilla.org/en-US/docs/Web/API/ValidityState) which is supported by all modern browsers and IE >= 10.\nIt also needs a polyfill such as [core-js](https://github.com/zloirock/core-js) to support IE >= 10, see [React JavaScript Environment Requirements](https://reactjs.org/docs/javascript-environment-requirements.html).\n\nYou can use HTML5 attributes like `type=\"email\"`, `required`, [`minlength`](https://caniuse.com/#feat=input-minlength)...\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input type=\"email\" name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange}\n       required />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when=\"*\" />\n</FieldFeedbacks>\n```\n\n...and/or rely on `when` functions:\n\n```JSX\n<label htmlFor=\"email\">Email</label>\n<input name=\"email\" id=\"email\"\n       value={this.state.email} onChange={this.handleChange} />\n<FieldFeedbacks for=\"email\">\n  <FieldFeedback when={value => value.length === 0}>Please fill out this field.</FieldFeedback>\n  <FieldFeedback when={value => !/\\S+@\\S+/.test(value)}>Invalid email address.</FieldFeedback>\n</FieldFeedbacks>\n```\n\nIn the last case you will have to manage translations yourself (see SignUp example).\n\n## How to consume the npm packages?\n\n### ESNext (currently ES2018) + ES modules\n\nFiles inside [`lib/`](https://unpkg.com/react-form-with-constraints@latest/lib/) (package.json `\"module\": \"lib/index.js\"`).\n\nA recent browser or Node.js is required or you will need to transpile the react-form-with-constraints source code using Babel (or TypeScript tsc).\n\nSeveral advantages:\n\n- The combine use of `\"sideEffects\": false` with `\"module\": ...` generates a smaller bundle thanks to [tree shaking](https://webpack.js.org/guides/tree-shaking/)\n- You can transpile react-form-with-constraints source code with your Babel's [preset-env](https://babeljs.io/docs/en/babel-preset-env) and [Browserslist](https://github.com/browserslist/browserslist) configuration\n\nFor this to work, do not exclude `node_modules` from your webpack configuration, example:\n\n```JS\n// webpack.config.js\nmodule: {\n  rules: [\n    {\n      test: /\\.(js|jsx?)$/,\n\n      // See [Enable babel-preset-env for node_modules that target newer Node versions](https://github.com/facebook/create-react-app/issues/1125)\n      // See [Create React App 2.0: \"You can now use packages written for latest Node versions without breaking the build\"](https://reactjs.org/blog/2018/10/01/create-react-app-v2.html)\n      // See [\"If you have to exclude node_modules/, how do you get babel to polyfill/transform code in 3rd party code?\"](https://github.com/webpack/webpack/issues/6544#issuecomment-417108242)\n      // See [Compile dependencies with babel-preset-env](https://github.com/facebook/create-react-app/pull/3776)\n      //exclude: /node_modules/,\n      exclude: /\\/core-js/,\n\n      loader: 'babel-loader',\n      options: {\n        // See https://github.com/facebook/create-react-app/blob/v2.1.0/packages/react-scripts/config/webpack.config.dev.js#L284\n        compact: false\n      }\n    }\n  ]\n}\n```\n\nYou probably want to configure Babel with `sourceType: 'unambiguous'`:\n\n```JS\n// babel.config.js\nmodule.exports = {\n  // See https://github.com/facebook/create-react-app/blob/v2.1.0/packages/babel-preset-react-app/dependencies.js#L64\n  // See [Add Babel config sourceType: 'unambiguous' for dependencies](https://github.com/facebook/create-react-app/pull/5052)\n  sourceType: 'unambiguous',\n\n  presets: [\n    [\n      '@babel/preset-env',\n      {\n        useBuiltIns: 'usage',\n        corejs: 3\n      }\n    ],\n    '@babel/preset-react'\n  ],\n  plugins: [\n    '@babel/plugin-proposal-class-properties',\n    '@babel/plugin-proposal-object-rest-spread'\n  ]\n};\n```\n\n### ES5 + CommonJS\n\nClassic ES5 transpilation, files inside [`lib-es5/`](https://unpkg.com/react-form-with-constraints@latest/lib-es5/) (package.json `\"main\": \"lib-es5/index.js\"`).\nNo tree shaking.\n\n### UMD (Universal Module Definition) + ES5\n\nFiles inside [`dist/`](https://unpkg.com/react-form-with-constraints@latest/dist/).\nTypical use is with `<script src=\"react-form-with-constraints.production.min.js\">` inside your index.html.\n\nA good use case is [CodePen](https://codepen.io/tkrotoff/pen/BRGdqL), files are generated by [Rollup](packages/react-form-with-constraints/rollup.config.js).\n\n## Notes\n\n- A [`type=\"hidden\"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/hidden#Validation), [`readonly`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly) or [`disabled`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-disabled) input won't trigger any HTML5 form constraint validation like [`required`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-required), see https://codepen.io/tkrotoff/pen/gdjVNv\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.13.0-beta.2","_nodeVersion":"10.16.0","_npmVersion":"lerna/3.15.0/node@v10.16.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-Do5TSxTIXPBI1dDsMwOCE8SoQjP2WxtF3Qqa0AF+6w78eYHASIMkCghTLCsaitTetDKOZpGvqVcX8KqGWBwrhA==","shasum":"d6197550ceee7057c88de6409e653ad0000a9006","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.13.0-beta.2.tgz","fileCount":77,"unpackedSize":345673,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC/zVCRA9TVsSAnZWagAA2gsQAJ7o7uq85kPsbAf4pYas\nYuJslr5d7NToVUs8G/krZuAAs+yD2atL/f61dHqUVTYQBD3Uz4SYUF77ozfm\nxvAtTvKyHvfQUdChXhugjwNJ3JSi/OPJ6qvJ5hoEQlEka4nGQ+9RlqG1vP9y\nW5S8POjqxFLnFQvJIaCVsFVRVaNdg4MQtQsMfU/3sZpoIBPf6LQIDC6/7suZ\nFVA9ffrEtPEzdtSVXbhKvczpJVG3vFtv2HyO2Izo2oXcW4oWCgcc6H+kZ9Dg\nfWw7CW8xDN2k8cMmnz3kw2TR3srtrVIqgXKN2BrNslsWlfuTr/WpzEY8ECuX\n2jfX57CWYR5LiQEDGZ/s7ZJ+9Axxqsh2VNx52ZcUutkEA6uh69TkF3+94dkL\ndkAt32VCSUnG3SQKIrXcvJJ0LqU2X16i7Ar0LUDcXZG4WNhjKudQiWmpAIb3\n7L1dHR4OlVuYJ0s31QBdzSZ3fFU4JGPBST2QlSzrbgi6/hETzYOH8sAb8Fjc\nReP0pEheaXR+1rxodXIdOoCtG9Qdc8jTx20YBG083SoqTCl+mmxHUbwDo9ob\nuA2qyIPWUMhKaWwywqbBMC6iHxGzTPXEL9FOujovIK9gVPb9sYoOgv/Y0SZJ\nn4ucyRRKWCC6DkizC9w0/8nsPMUV7XUi6YbgR0P6lfMIEfVfsISzSD/lXqNJ\nx4Hf\r\n=z6i9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD23VI2sf9Ct/dQn2SUoqtV+3yM1YCDO79U8BT6fTb1ugIhANIxUvOoPuuYRbwo/PUW5QCS6dLs0t3uj1sZu2Fdkzl1"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.13.0-beta.2_1561066708465_0.34267106332657704"},"_hasShrinkwrap":false},"0.13.0-beta.3":{"name":"react-form-with-constraints","version":"0.13.0-beta.3","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"NODE_ENV=development rollup --config && NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.9.3","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.14","@types/js-beautify":"^1.8.1","@types/prop-types":"^15.7.1","@types/react":"^16.8.20","enzyme":"3.9.0","enzyme-adapter-react-16":"^1.14.0","jest":"^24.8.0","js-beautify":"^1.10.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.15.3","rollup-plugin-filesize":"^6.1.0","rollup-plugin-strip":"^1.2.1","rollup-plugin-typescript2":"^0.21.1","rollup-plugin-uglify":"^6.0.2","ts-jest":"^24.0.2","typescript":"^3.5.2"},"gitHead":"33f5f2a1bb3b5a0c0130c2bce2e2b23262dc5f8c","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.13.0-beta.3","_nodeVersion":"10.16.0","_npmVersion":"lerna/3.15.0/node@v10.16.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-J4g8tdnUzSm9v22N9CMddmvXaXCTSVok4aibM+hG/h8vSXtGQP8iMg8Y9i+K5YmWchXaQdRhyQ8Q2RtAyjiefQ==","shasum":"8a4881b04434e61078cc8f892fc2da6c7d3036e8","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.13.0-beta.3.tgz","fileCount":77,"unpackedSize":344236,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDAMsCRA9TVsSAnZWagAAZ6gP+QES0XisloKDMFXQbqpu\n5hsM40inbBDuuquKp8RbvO61kwqJT3RIqxbXxtNfiAldp1oBq58nTxRn42+S\nQy2AHqEtDoPmGFUnUui/yiBuZxkTtWPR/oKzP1FY/Fa16pwuPHVWKWTCtmZm\nOqjq4CiqtajHeXz8ysIzYSk5T3AMvRldxn+oz2z2gMz4mFtqgazKopOtmagY\n6Ppl50bAZTlUxKbGPbJzb0Mv0eGyT64c7t4DyUWoQy5HJuAhtgb5ooC4g422\nbO49wyI0KR1oNKEkx5ZLr/7vos6rhxsvExaYnrbg/p/oGEUmrUL2MP0o4qT+\nUNYAojZEyLk7afX4v61UbgT4pghygJSGpI9B25fG1YMKYb6+gpVUo/Q1KaV0\nDEwwFAZhlYu9wV6hJMBVBkp/T8qwIa1d2S9BeiPu2oe11mPDL4iVnF1mncfX\nXGuKuNQmnieJ+igixR+DUJt+zaI7YKLWH1yCdyfD3oU3hw7uOKqqjpnJfm/K\nXrJ2OAksJ6cr9SQd2xNjCfBT5lRXin6Aw9F/xcRUxKxktveUSecA+AeiT1dX\nQHC7cJir1mIDHzR0ppaPAf6C9yNcydEc5WkLED3Ouf2RfCFB+AzU1xCNDjHG\nlv6b1y6Aon1TnCW5D/piqgWZChM+kJw5xtIPPMBoOi5ThWnPWDlAkvMdsSG7\nUspm\r\n=/nrA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICTsCUz4wDg+5rX3/xVdUIKUObrd2pU8eds9mEVub5FCAiBDwjaF5YbwqNe6WNmTy8QVuTKM2G22TYZ+1lzjaqr5hw=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.13.0-beta.3_1561068331934_0.014064091460766592"},"_hasShrinkwrap":false},"0.13.0-beta.4":{"name":"react-form-with-constraints","version":"0.13.0-beta.4","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"NODE_ENV=development rollup --config && NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn tsc && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.9.3","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.14","@types/js-beautify":"^1.8.1","@types/prop-types":"^15.7.1","@types/react":"^16.8.20","enzyme":"3.9.0","enzyme-adapter-react-16":"^1.14.0","jest":"^24.8.0","js-beautify":"^1.10.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.15.3","rollup-plugin-filesize":"^6.1.0","rollup-plugin-typescript2":"^0.21.1","rollup-plugin-uglify":"^6.0.2","ts-jest":"^24.0.2","typescript":"^3.5.2"},"gitHead":"f5257e0fea77403b51147b35f19d7de1c62ac8bd","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.13.0-beta.4","_nodeVersion":"10.16.0","_npmVersion":"lerna/3.15.0/node@v10.16.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-WAJpMWx2mpu2ns4/D35SHJBXVobsiAkKIEDMarD98yQ1PSCKG+OAoggUENWbocwi3LLWqkbJrleieQ1TQzICTw==","shasum":"1504f46860a1171ea0e5870dd007bfc9a6c8a95a","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.13.0-beta.4.tgz","fileCount":77,"unpackedSize":344783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDRNsCRA9TVsSAnZWagAARuQP/0SmHIYbORe1ofmdV9kH\nQkptlE9yssItLrbmtK8DJvItnxA60lrtPgKTPOIjjIqPirfoCOaTRz/CAp+N\nK/glCl/WpDpSeAly3c9iDSFF6lUJXUu8/P+3IDIc1yk7yHZ+7oQZ39vJHQFI\nMXDUNvU8bi4DBGJ/+OPbbusQDWvs2sVexNLk1qfvDtjIY33UFjrI2SANe2Yz\nwpu32k458V3C7D8gQc5oNaBu959sjKHoKDfOo9UPBpYtYk/jFwa03P/YOSmk\nB25+Va8DdSTNsPkhsJmxjYguBn06bfq3WGBEnvaOWcb/tLuIM9DYZAO3IYGc\nOg80LWRBMTKYHLHcOFyDBNq/3TevHXf+gjsRFKRV6OHfYmhBUNhhgnkY0Saz\nYZYppsgskaRDVWSEXqrZPe6boL2plQf96CZdSH8p7nEPRyB9UCZ898t/vYc2\n2x+VGgZGugkmCYolOmFp8K1hQ3MsUli85z1Ao8zXE80KP/vlhYCSUaw2fmGu\nltUesQbf50T7P8dMnZF9zARaXLkaTZCWIRRVZpdYkE7/bjRW+SCRADa1lVIy\ndpE1GZzb42/6OiHMKqrm1oIE1WIrelkVrmBNzhpKAuB/W28wbnjC50E/cf66\nZ6dgPljdnTldcjpHaTL9VLEkOrsDw05qMRG5KZvFk03z/AAi1/Rxj3HLwg9X\nZWke\r\n=6eKQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF9m9O54CEQBpL5NSPmP28IldHQIeOXHKSwGMVKQ3FlqAiBy10UGFdsMoxEHWAEXFgS5mMrAOf5EQBRiV5mDyqKzGw=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.13.0-beta.4_1561138027478_0.45451345228822504"},"_hasShrinkwrap":false},"0.13.0":{"name":"react-form-with-constraints","version":"0.13.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"run-p build:*","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"run-p dist:*","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && run-p tsc build dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"node --trace-warnings node_modules/.bin/jest --no-cache --verbose","test:coverage":"node --trace-warnings node_modules/.bin/jest --no-cache --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.9.3","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.14","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.1","@types/prop-types":"^15.7.1","@types/react":"^16.8.20","enzyme":"3.9.0","enzyme-adapter-react-16":"^1.14.0","jest":"^24.8.0","js-beautify":"^1.10.0","jscodeshift":"^0.6.4","npm-run-all":"^4.1.5","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.15.3","rollup-plugin-filesize":"^6.1.0","rollup-plugin-typescript2":"^0.21.1","rollup-plugin-uglify":"^6.0.2","ts-jest":"^24.0.2","typescript":"^3.5.2"},"gitHead":"0cb3bb63f7ceb4388a03dc7468a0a842be5f3ff3","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.13.0","_nodeVersion":"10.16.0","_npmVersion":"lerna/3.15.0/node@v10.16.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-mneCHRcX44l5ECNerU/QGaRoTK/3mHHrq/bPGQ7reVw7HdEkQI4h3ehGjN3vbSth6gPTNPSbxhBf6slk+AmL+w==","shasum":"7909df60c09d6860721359f89421f5ff178d9c37","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.13.0.tgz","fileCount":77,"unpackedSize":344915,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEWt4CRA9TVsSAnZWagAAx9MP/Ro89cpSIhDve/ZO5jeg\nm4pubS86t4AZZEgtI1hep9leF5tAi4dYzIOaKAxkLlh5XGDWx0B/WYj8T7/h\n2KpDAw5iG1BGYE8hREcTKvsooSjpE1VFVcbzSfKoinwiqTkFz/AFQup5e6Jg\nULVltjJndSi1ov0EgK5IXcW5SK5S+gtoulLse39kCQ3SvrdxKv3FJrC19zqL\nTIjlje0LU8ulkoMC8uGAVGJIz0/fIEbWw4Mk957rROMe//RO1pQ5k7aNXUXq\nU5CVcrw1f0BpjYZhxOC9zYwWtJMdMW6pxivA8MztsNd2n3/V2sngVX9MdQvz\n5mN+IXVg0OrcUaAlpUkSg+mydZXiDsJbElZPWwiAyNd2QzYAY0OLAFT57wSO\nnCXxLY1OCiRGzjtoIO8ZYyRSQgocxXTroLtBJn0p1aZTBcpjMtWIMS9C1UgS\nk1jq5cSkECFCFEk4jqYGBe3G/rUi9KP2hdLwhfJrLzYk9pGq1I8DJJISt2NJ\nJx9Fw6kW6P5961RmVJlDQD6ubzqCEPHwf0j67FsCZiHoFwJ3/PKbUzERfXZW\nlY85RDc75zunqLHgf9m05oIVp+Z29ooXCj2aIsW469QPmHSx7bNkoptYhr6+\ngjXT7jddc3GO1evQZhEe8XzPzXuHp7vbLoh+tKzHGySfTPuIIMXRtBhDFPY6\n8AOr\r\n=dqKn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH5WV2xOOn4wzheVJGRSSeNcO8DpCjshp5BsHfJ/NOUaAiEA/aN6S/qqJjXOo6eTE0jiLzrFlV60Gm7HxqEvvug8Oo8="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.13.0_1561422711388_0.34504079803372445"},"_hasShrinkwrap":false},"0.14.0":{"name":"react-form-with-constraints","version":"0.14.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.3","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.18","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.2","enzyme":"^3.10.0","enzyme-adapter-react-16":"^1.14.0","jest":"^24.9.0","js-beautify":"^1.10.2","jscodeshift":"^0.6.4","npm-run-all":"^4.1.5","react":"^16.9.0","react-dom":"^16.9.0","rollup":"^1.21.4","rollup-plugin-filesize":"^6.2.0","rollup-plugin-typescript2":"^0.24.2","rollup-plugin-uglify":"^6.0.3","ts-jest":"^24.1.0","typescript":"^3.6.3"},"gitHead":"637b033cfe5fa483c5f46d644aaaeb493bea428a","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.0","_nodeVersion":"10.16.0","_npmVersion":"lerna/3.16.4/node@v10.16.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-Q6AqUDLtQHooQ9tkK/K0XU/ADsdLZvnKhnlkPQwEF8aeomHMe2tTCBKduXO5Un/VMAi2rVHhyrDhc4MsmQTFsA==","shasum":"730f9ad5a5f1c1360fc174628c9ef217076d619a","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.0.tgz","fileCount":77,"unpackedSize":350650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdipgFCRA9TVsSAnZWagAA0soP/1tupkuEDt67vSvrhGbo\n9j2ds4Hs43pHJAwTqYf4nwN6/85/36mzaHtL3tC6iEUGH25HscUSt+X7Dl5+\n8rmkYzCWgyWlQnYK22ZEk9JzHZhRRN6oKGsgLU0fOrXTxGNyZvpERhMBXQDb\nNqDDB6yOmJaQcfyk8iggtFdC3Na2h5+5NOulHpjnO6L8cAQ/HwG9yp+t6Nse\nHvGFP9TFpXb1MXrjIwUnnc/uGn9mgViEVplWVfV1VZ9KO2VaP2jmerpHTsQS\nODlZ7BqorYoRqPFyKuNf8MOaQi9+5rHguJNFM4ohx4nxNvit5v++U5Vj+jlq\ntE95cP35hw9QnJQqdpyQagBRLmX2PHwpK5FeM4vLBrxx9ogD8Fy/NXpB+5JL\nZnLug1HecRobgeDv8rWsePG1J3+yeIsjXXBClaUVJ1gvCKb3yVhnqnUZzt5m\ngf19Ub+McrprkkNc7bxx1zRGBPhCOgAGIM4UxfKVlefkxSMnQeubMJgU9INi\nxN7VBNYRiuC35VzfOqnBCskHx1bBquDl46W5ZnycMCX+qFopKYaF4DTIOnF8\n0zTbZ7nZrPEyEDoasLehi0G7i28XQZxqaPJAIL/1hB8eln1KHNmZA/2Kdj3A\nqBnzOdH7Hsk/VcvsJCEfT0EvFMbB78nBbIB0yK/ccDoM+XImKcOp8XYgYR76\niOp7\r\n=KZPa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPuYNkcx+X8zeewi8RB7AC6SAzmfBP+SVc9qXXiMRFmAIhALUSOCy10QaLvvb4ossEVJEJlZ4mYvlaF3Qio0zGbY36"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.0_1569363973211_0.2577867838558232"},"_hasShrinkwrap":false},"0.14.1-beta.1":{"name":"react-form-with-constraints","version":"0.14.1-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.3","@types/enzyme-adapter-react-16":"^1.0.5","@types/jest":"^24.0.18","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.2","enzyme":"^3.10.0","enzyme-adapter-react-16":"^1.14.0","jest":"^24.9.0","js-beautify":"^1.10.2","jscodeshift":"^0.6.4","react":"^16.9.0","react-dom":"^16.9.0","rollup":"^1.21.4","rollup-plugin-filesize":"^6.2.0","rollup-plugin-typescript2":"^0.24.2","rollup-plugin-uglify":"^6.0.3","ts-jest":"^24.1.0","typescript":"^3.6.3"},"gitHead":"6cc2d55ced0b63e3ad7e5a8693415685bdebd272","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.1-beta.1","_nodeVersion":"10.16.0","_npmVersion":"lerna/3.16.4/node@v10.16.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-7/KQUwyvbspE6CDPFPGitCQ+3e+9M8I+lJFKqmhGru8G+l0K/7fKtnlu3G/zfo791FVogrVxgX5nrsUZit4/qQ==","shasum":"fe3a842b2c996f669e011eb7c6bc6a4982974a78","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.1-beta.1.tgz","fileCount":77,"unpackedSize":350628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdiqFnCRA9TVsSAnZWagAArf0P/0FksWcntrwllvsmzL8F\npAov8F9IR0DXIwbLIc81HszL3AHG1hfaS8k66cmnG9UyBVX+4wDronKSwMy7\nV/6qfXY9o1CNoZ+tnsKOy1suJUSq3/YMjBgDyosVuRHTafl9r8MxHvPYAPXc\n64Ohs2Nbu7URGFSLS0ytVDJ6T7HFkazyyalMgTux2OkwTZZOCCqJ8VUyxD4r\nLNoxUUcy4CREFjrxV/cus7cbz3JS7fgj0vJinEG+uoULcnA+RN9yBgNWKyzi\n7SPvxmvy6K0eJgxtbqVE9VhbGOhwJZLOT6PVfcM5B1+UlazDF2Na0CugZg1E\nLzcoo3v7fVHtnLbvNnse9xOfIkvHYFDU4Ab/twNnuogcZkucWx7pLF/1+z56\nfqvfdVF4e6J/IQoGu6WLbn3IXVJmDc86S5a/imZwXHZKeinlxa/ZlmSbXe05\nqzcu8Eg4kn8bD08lZZWtimZt/etNY1wjVhMoyobusvKhon5qb5sglGrfsIP6\n9MAuPybzsZvGv5ddPoAKDHQnNc3wIr1BQyZdr3FYDsEngv9tKzh0c/FV3UiR\nlnox0J28B04lbOhottAkTjFOh3RYj8yKoCghHcj6BuaFo/b2DIB/tt8Noz6Z\ntZR6JQkO6NDd3kvmik6VtrJuYZgEXLLYJDGRWU4DyF/W5s1NxgvGQa7V3+c9\n7uDr\r\n=bhJI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICHYY6BHRrEfx2d7nkSzcyXph3zPRhk5p5vfxq0/M+a8AiBPBEnC1MwKVKlMCDH05wbQVYuKY+3pChcsZcxBHAz1kA=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.1-beta.1_1569366374612_0.008077128855457971"},"_hasShrinkwrap":false},"0.14.1":{"name":"react-form-with-constraints","version":"0.14.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"0019a2aa13d803a9edb9dae87bd6422dc62e879b","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.1","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-Vg18U/C6aEIGEmbcQIKXr1LNkUuUbviuqccoeTajNzKzPSVIkKPt+AznIkakXZy89Gz3V/CEg4qt3QL4bL47AQ==","shasum":"a8e73b9542d2d3f7e807f3ae6cf661c857240884","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.1.tgz","fileCount":77,"unpackedSize":350668,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeWFJoCRA9TVsSAnZWagAA6DMP+wUmKMqYcuPpIpvjyz+X\npw4oUzgmsevz7ZiHwlXvssS4aXjSmLut7dACnuN0PD5rn+SBZ6iaGViCt/TB\nAxD+n+MebIKxim03fEEG321sZPL+1jk8xVLYI9F7zmVPH8R7kg/Mouwg5qSH\nO1Xm2reLTwrtSgAZvBp/Thp1XKlF5YqpyzmP3GNXeZznZdKS6Px/qmlVFu9B\nglyFjq3iiwV7lt7ncvYlJhAsscYNL9exycuQ1qzW9JkS39TI95v2IWMotnul\nbgafjCsPZBHPwwve+ToJM5IcWB8nTecbUFpz2MPNlYEQDo0IpkY8VqYnkFgC\nfB75LM5u6KzJBRr3lLZ4yKUWVObxiUxcuHm6l/hgBlstKHF9M7TRi4sVSAlv\nVn8NaVCpUUNEMCCI4fGAO+cnlOWjvCXmL/Zle90Buc0aP7Gd+K0/EapcLsyi\nRidd7Hh7aVKwFYOvvqHB651/bxRBU5WIwp8jy/wxvoykucSfI1IVr/PI+/6I\npqjwRrw4YO/fyzAf04z4LUoA1UZXAw+UKY2gU4nwv9Bxz8TIXIhlCVxcX7Ll\nIM6pX6QA4h9k5Hspz7TFPzXUqyyiejzHFoc9rgB6/yR79dRxlmJUKITX118B\nbwEGPVCvQaL/MGyce8F6DRbBUpNImvKOCTFkIWn5IAeWkNMN6Pt8b1ucuDTP\n0zdq\r\n=zLtN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGIODdyhVZGD5wNp7V1+ee/y+OWcvaYLRz/h265n2yA2AiEA6baPwIirsXMVgOR9acGG7Jod+V1rEZZ4sx15C833oig="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.1_1582846567779_0.31329773251857573"},"_hasShrinkwrap":false},"0.14.2":{"name":"react-form-with-constraints","version":"0.14.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"ec36f97c8dd9a56935663e3f9957b8160c4dd4ee","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.2","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-2XS4mr7wuyw9nx0sFl9MQ+xLp4ogPoofhw7K83UQ00LG66E0hJm4+jba91YN17zfIh+GyirGSwviYn4VF1FhCQ==","shasum":"f0798e20fee5c6ebc7c779e5c00a88266784e339","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.2.tgz","fileCount":77,"unpackedSize":344568,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeWGaqCRA9TVsSAnZWagAAZ8MP/3b302aFhdeNOujqTgUb\ntv3s3coLPPSnFR2fFL3fpbW+SOqNdbz/rf+MOSKNbK/6ueey1LE+hjeoLxxj\nNyGGdDO1dW2QLaCojal8ICBvwFcO0i0409fqajkqH8x/jXwubdjBui/bCL4x\npdP8sp8Hgs5ifNoj9wEzyEknVn1wyUQ2YpdD9HB4E8zBTvsbnWy5NcJLollu\n22het6AkGBf7yJlNITyj/q6QIFjYwVcz/HOqcmBl8MnufDP/UGuYAwPAL58+\nxto/ury6gKJExCzVHunZDr3lPzwLjcedrwSYMyybYXpwkPkxWdYwTUISozTi\nA3JUJTmr1NyhncC4qDk/knlMn0LGmmLTKEHKEsLQVv4VDCp9O3PRqfU4qhup\n5/lNZtB0YuaIl8w0C8gEXMeKL4FPgdvRc7qltH9fZln9rGfoaetxf5yJMK7c\nS7p9daeQPiiyBrrEhVxtMg4onNjDpdUTpDXufZryU13mnTlFP+mujTNq+a5X\nklcVn7czz/ws7ekcKGmIdPN61epLq5yIAO2GvB4K21TJ+aj2aodjB6N50Frc\nrYJfIW8RKWBUTSKQHwxfEUzAu3V8zdo8rIZEKaYCJzhSThTcjISiH8U7PiRk\nfDNnxsAOFAUFkSJ79qQ945mXQMd2yDWRcML7hnMSDE8cfDKDJAJVUhtkLgqd\n0dwi\r\n=qp/X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmDMvWWN2NtWXonJqb8FsVNgMXwFQO06/f2B9s7p8vTwIhAOMpX3ZU3IOKckzD7S6IwuBNLAbKAzkzX0WCjoW5hSKd"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.2_1582851754254_0.5856108505083222"},"_hasShrinkwrap":false},"0.14.3-beta.1":{"name":"react-form-with-constraints","version":"0.14.3-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"1a7cde990822fb6612ecf7df8f743c3905121975","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.3-beta.1","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-G0Fhpe0BliyhneJ+OalSv9xAo+Wvkf00fn8b3iDXUFJZr+tp3ma9180aLRv9hHyzo7L0eXQo7OolvfrfdrOjTQ==","shasum":"5e0fb6588be3f4d34773730c8d363f3de6a4cfe0","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.3-beta.1.tgz","fileCount":122,"unpackedSize":266069,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXV7tCRA9TVsSAnZWagAAAKUP/ixFL2Ht8tCfrEwC8+Rv\nmp+a8GlFOUIsa7gExYhtgxFUGEY/kA/Kk19EqGX2HaanLQpAWW5LXMbA8x5M\nA5fiTHW/DQbTPJc+yLqxSpgLnjko+P/FjlcJjK29rPh96z3ckISuxSzME/Qr\n8EmIlssO6PzxcJRoBumml5RAz7QGI0YxkHEPrYZJxv0jEcGpV3Rbl6gYRkSf\nR8AkMKpu7ioNBGmcpdUVU6L8/h/3WdQMr/Vx7QCKfdgzoCLVj9i7qnSISRxt\nUtdznnTl1VkbQW/Ai6CHWbiSRn0FDG25uBnSGiTIqDv83cXl0joWsJDgnjQ6\nqws9KnpNdYSwINb6xsbde2KPyPoyRKB9GFGl7oZsnWknUhGzXWS+jvtiKY54\nf5aIB16UxaHu8+DAlE5eK9EOyM7L62MKsjI4m+cYymik3HyOlLPE2Pso8KtF\nRad93wq5B8FVo8ZG7Eb291gkdBV0k1Svp0RM+9PUkisWJT8fZT19HftuxDnQ\ndoomfIUCFonDfxVIKh3b/88HMfA+sRNk+mO/3Z+mNO+Lst0p89NnLU63zbp8\nJj7I9+fcr39a7pwxqF/dL2wEqGHc/XPlMGH58CpiNw0y35GlqlTzkS5rvb03\ni3Yk9zHpwA/eWNhd5Uqd3OC8mmT96gJEZLWlZQVHPu9KGet5r6MukjXAbPgQ\ndF5Q\r\n=mH6r\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF2JEetoxZkt1R+18VbVY7/O2Kjq76UtMxBwfkDNxx7hAiEAzk9aSuM3G4CJUTAFcvZk9FxANJf0mPeGSONxHJ2ai7A="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.3-beta.1_1583177452886_0.26792784891266486"},"_hasShrinkwrap":false},"0.14.3-beta.2":{"name":"react-form-with-constraints","version":"0.14.3-beta.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"cb28942f207177aa8fcd2e568981902a6d6add85","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.3-beta.2","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-uif47D152sSIdWQr0mBJcPwx7t5VutNL4b26vLIGiA0xCfugkh5jdLrBZv8h38X5SrfhsYTtAL2FR547U/kthQ==","shasum":"53925e6cbba1501c0b5abadfc48ac59021eb80d1","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.3-beta.2.tgz","fileCount":120,"unpackedSize":266029,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXWQsCRA9TVsSAnZWagAA1sUP/A5emQnQQhTLtV/OXtaK\ntlrv4UJIDaRSgUpLM8NIQSVvPn39/XOQa/1NVRvN8SAF+Mh9WxUOCls8qGyC\nWQ6bApXxfsCk7mK68zLBEBMLGSWkgeyPmRAs77348TM3FOeWdvyJJmt7kTOy\nd617VwemVEXUdLg83htADXZ38K3eUxPL7/muw7eu0kmiwCC/sAPo3DF5aTpV\n+KQCVeD5t2PW+duu1zc1NOmSjHQkipD5hAZ4CYy1LPGh2et5JfPfgSV9SZLc\n1i2EqV6HZsGvIR227+ABWQkiwMkC+F8NobU7eGgsBeVyU0odrFvFrIuTGecQ\n3N5FH5vrbyfP2R+CGqSUOQxJG4PKmSbPcGOo05nWDdsyjoT73cWAqheTDltl\nIxwAzx7eAwyCVv6LsaNJNm+lbS9efncQkLDJOScYEAnELNYKFnkpw2ISN3pj\n44D8txa4pYkfqO23Cvpr4IwiRU6gEIsdf4tAotXhpUOcbRXBPdq6GqG0g+cH\nbPEPpPcyzL/6tfAUhYn9680fKxLopL8GfU+UOHtWOrBuHDVBURiUuNvAqpbt\nlsNndVq5rKftKeE4Q7B608pJvxzgGeYc/mwP1wVDiuUIhZUI8akVonW9bmbD\njf0+QV4VfQyghNpo8bYgcYqEz7zAiyj9RM766sSj7H8a9+KNtbjDgD6W/jFM\nh0DD\r\n=VfFY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDSP86dlz7AWXeAZjUv0YaN5DWWtEgnRzmIOVB5N7r5NAiBFJH3R+wMfVV9Y1jY3NupWIJyIiKISaEENhQ+xOiNoKw=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.3-beta.2_1583178796112_0.6556479368046877"},"_hasShrinkwrap":false},"0.14.3-beta.3":{"name":"react-form-with-constraints","version":"0.14.3-beta.3","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"2fa6aaf504b5f6afa28afcf7731e7d6b2b79c81e","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.3-beta.3","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-9G4mNeLYYpIL0BcfQaOy3cRxirJFCXEsHSUZh7xLKcqLX/Dlpol5POe6chF4+WIq1NUhY2lvQcWqbjou/IGDGw==","shasum":"b0712e1283f026e7bce4d23b12994d5a995e9632","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.3-beta.3.tgz","fileCount":168,"unpackedSize":588469,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXaMECRA9TVsSAnZWagAAJBoP/2iPjfEzdzQ4pAtT0rF4\nF91Nce6pO6MvgzXsqdUmqT09qqZdVWPkugub6/WHHpw8cLeMeLzeIu2mZo1P\ntOIPPPqxjHMGS63mwDO+9mMhWJAvbakRNtnODDjGVN9XHUR3LEdHlWOMM46E\nRosxCiZTZIyIaho3vdJexY+UGAcw9EvC8biwRAnjDeYfn6XYB72Du4ek/2Mh\nVA5JoUcB7FTYbxZh5XQuPyuqLSdg9WLtFUh9PbRcHts5gvky+UyBnWYhXVxH\nP6B2U9xQ8oQ7jn2vt22DOdtN8IJg2M3g3I1e1KoAn7y3Beq07QM0lb45lzpi\nlOY7zwXXVZtnyw6TX/8wO3xYDtYlR/Mdy0XVRmHNDkdpsslTqnqQM1Edm7kS\npB1rYnXJtgi19ZJxOVnqLpRBLtjAhY//LQtmZvtNYSclP28s4RgysTGKVbeC\nLh4o143ogIQO1z/axpl7vrtTvadrPsZd7gST/G2LKpr1toJyi4p4lfwXCfOP\na7BvrpZ2is+4kxZpqK4fJBsIWYY2Fii+sOS8vCzFkecRQhWA6lbufM/KPgJe\n+mw3zIBoMG+PRCPdGLmtvvdL4qOuyXGrRfAtr47OmcYA8fLV8/jsR4CTCmL4\nmVij6V7lR/5rDp9D++42687cCSh7imqynIpZZ952zxcTYGqnL/UjOgGhEH0u\n8uYm\r\n=PzAq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDngDMPtA+cDkJoPmz7RR+0jICigPeSqhhuR4IVItskGQIhAKp1PtGj5M9ongxfTJgaFaecHXMbJd9qenWUFomADvC8"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.3-beta.3_1583194884317_0.10390081742654056"},"_hasShrinkwrap":false},"0.14.3-beta.4":{"name":"react-form-with-constraints","version":"0.14.3-beta.4","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"eb03b96009ce16d2c288d91ecb55a6187b8ad36b","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.3-beta.4","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-am7szF4sWjszUgJ8CaEeKFtA3Y0M14lmyHXGJiXoXzkw3ZbUi+O76X2uuxu8laiqKeH3uKhMFNBiWz49qg/rvw==","shasum":"a89303bb93b17824d5842f017e0852b8ad2a6445","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.3-beta.4.tgz","fileCount":123,"unpackedSize":548328,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXa1uCRA9TVsSAnZWagAAdv8QAIY/NxtcZR6Zc66xOZKs\nW0MCeMnJ3yBrkAUzddb4nRROzWJeMtWLDt+wTa0EBMsaqT9k3nH3Uz25ZgXk\ncSwHq0ovSqHBTuMoszEDZCowYuTNrVCFcqQDL7q118E+4byvlsbO0wDc51zu\n07s2BxN441WWdmh0wniFuReq11FL/r2QnoAPF8aBuMK3WLUle90fHURfV4lK\nhuj98J5M4ImAzDTBpk9Bwa0lExtIesHW8S/gdaCT0rzWS5bBdU5AFIb4cOS+\nogXHgCyqe1L8yF8+aycD/zx3gJL37PPPpkAxwyqNeKRskzrjkL2Gybwyuqp6\nBnjSoDFuZBtsCdDY036/LBFAdSfh5NRqvcSR08zNbaUoWpJ2jkfeiaSbqWuJ\nu17eAgJDRsV/dWVgDBUU2eVNLb7a6GJh/lBJ1EEHOkcI1TGrWLmwtkcI3IMj\nJuoKzSrF+Vyjhly9P4VUJx2TMqV0tBaSvjnIjPWVIxr8AZVtGezOOF5cM9xC\nE74xX+v8GOIheHBxu6txD8rTjfw36Kg4oyyAPs2maypyUsuJ9TOOAIsHAcyo\neV9ejlbiWU3rYawuy2EuL0+34myocYHb35I8707YaeZTfETcQ2EdTRgpebZ2\nrGzZeTA8F5EqpJmewS9YuVx0wFRouX60Em0MQzIl0utK/68b1KQZ/ZkSpmJO\nrApA\r\n=VvOs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFf0PRFhEBV78rhRowEnegBqC1rRIgdWw6o6eetM+q0gIgLGqMTtxKb5jE+UTDTJ8wYgTLJINo5+8yK1F1CDftnHY="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.3-beta.4_1583197549883_0.7272462501464336"},"_hasShrinkwrap":false},"0.14.3-beta.5":{"name":"react-form-with-constraints","version":"0.14.3-beta.5","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"7881f8a687fc9c1c45cbee07c5e312c1083f1a77","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.3-beta.5","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-hE/cC0kE47krgSavKG1jLpNAc6ZbmzYeb8Xp+u6boDKABGuSTABMdHk9fxVP+pC3J9qrtl7d3IZ0chMV/Mp6AQ==","shasum":"d5522c72ede096e46502eab9abfce8cc29670f5e","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.3-beta.5.tgz","fileCount":128,"unpackedSize":557706,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXrT2CRA9TVsSAnZWagAA3csP/juKP/zOlX+drTW+MyGN\nt/YJtEN3ZNhpocxMJBPuSYCUoOD4HxUQnkjXBKcpJDUapv+fey+lsUyvv6R+\nEaF9QBXPa57cBU2fnCdL1z9sGuBT3KC5Mlw7FxSq4vKIqTCrkIEWnYvP51M5\nSKepJo60QqPXdxtrGsA2lSmTXU2Sp2+sEt1m3mHBxvHM/1i1ar46t/i47Omz\nKrGbjb4oFcxPSQUJZDD/rAcFxRGG3EQW5TnGNEr4X/7lkE2DKKFFo+NLMqMA\n0ttdWBmyNR/M7c7EP59vfy1YPnb+BElSWaI9fE+Q1f9dbPEeEPPq2s4cbmPR\nmP81VX+6lJfUjOd+QBrZAHUKxpyJn2JTYUFut3+sqGTvfBXuMf1/16QUd6NN\nsyapkd6ddxv8zH1sfJtKLO8G3jzcy5mWfx8XBhYi9a4Ku8DEpqtJhvan7qBP\nMpOeI6FpzyeekYd5TWJ0Q/oxZNQ3jQVm1i657oIzwM/I61CxgSvbCQq/C7DA\nIVLLHFsES42TFFejbDDfSEXOeIUy0OYlhsYz2RaGVqmRU3epIFS5atA6qFhU\n0oJyuKiPGmmMJV35NvvAgJ8lPFLlsTsMkbKg5aXH2z5d/1Sb243MCG+bBESS\nZHM3vHGk77ll2ks7zEcGeiazS6QkCv202Aoy5MXm9GlxlDRjo33gZelGSnoX\nWLo9\r\n=lsAO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDtca2k5lt9rBl5aTu2OobUj2Q6XTXSnaUQeplZQ54TNAiEA0VL6Iu8vuLszMTU2EXI+ArzkZeEHInxiRbPmhXQ7D7k="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.3-beta.5_1583265014194_0.30635229489604066"},"_hasShrinkwrap":false},"0.14.3-beta.6":{"name":"react-form-with-constraints","version":"0.14.3-beta.6","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"fcea6c85fb73266f3fdc303a591cf2746a570883","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.14.3-beta.6","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-yD3lMT+mEpQNr0/1V6artZvJh0mnUuPBqtwO/xZ40uBeEqNSFXdqcbwps5oL5ur6UTbkOeYkQ53PHSCFYF6c+g==","shasum":"4f1c1368471f3b077046329300f5194e9d438b6c","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.14.3-beta.6.tgz","fileCount":128,"unpackedSize":555168,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeXu7aCRA9TVsSAnZWagAAFjYQAJY37FhVUEdX7SMlujMz\n5kQrpzpVEjYzSd31jUFRbcLOeNOqe4ekgjllFtzczvS5MFabMnW3nnbCIAO4\nxnD5V0wMAq3t7WIuqSXHSCzRvUwRu1JX4PGTkTEXeEgMSk/gznSn2++tVbQq\nGJK89DRUGyHpIyAlcrb3DsqlXVePzk1I96v7chMy4wYPYiVDcicLuTD008Pw\nLV0xMPn00I7v4E+TRMkcuHGDtNxpwMG4gXl06TCI8z9TcGngX65cYAD8fne2\nPc3JwA8bVTJf5Ro/42g7tJBMPdaDoCXd33WKtZc8HUf8gDAkjG7jYnLmP0gn\n08MVc3Hwis8N7570kYr0PAb7KznMAGgo9piR5PcMJRZ8gRZG/mG7e4EPlewI\n4wGGBwg5tLxY3hHwxyQYJFaF3dbtSOwmO6ib60SFLvy9+8lpBhyFDMEtOFyi\naDMOLAWbyZRa3AuYW2FimrO/GMxTd+6WKOIY3bLYAqwXBbT1YOVnI8HcoKgb\n7MBGftZPV1twaypbLK3IeBVYlIMlaHx/odksnafwaoCumZYCxpHQQzvSfrlg\nDpb+bvsxN3gTiqbUXr7RfGAR/cnDUeNgxgmuA76g9H6kaYqW1dGrj1FjjDKb\nYMhA0Z/yi1b7BF7bbfM75N+k66ndp5rF2fwbeRHM6xuMFTIOBAJKI+u8rzxy\nDRNl\r\n=C8dc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGhz9BVtDrn8wsdaEzWmqoLA3AOikq9VdoZR9rEkYyRQIgCEXYmvti822HvrS42XCHn2qMD4qNgSPVHUSi7WX3eUQ="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.14.3-beta.6_1583279834116_0.472388040676186"},"_hasShrinkwrap":false},"0.15.0":{"name":"react-form-with-constraints","version":"0.15.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"260397f5d1dd0691faf931c7dd86ceecc8e6d349","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.15.0","_nodeVersion":"12.16.1","_npmVersion":"lerna/3.20.2/node@v12.16.1+x64 (linux)","dist":{"integrity":"sha512-K67BbJKzZCGg3I06ReAbyScAs0FPmERP0Y+58pNGnbpY33KR276LXZ7J+Dr6oOTxuG3MMhUuZ6LKCAO2dtxxEQ==","shasum":"414e4fd3abc896801fa3a7007f49fd586b31a9f0","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.15.0.tgz","fileCount":123,"unpackedSize":551327,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeYU00CRA9TVsSAnZWagAAc2IP/RbK3EVbWeL1euZXtizt\nsvZvSOgazrXcgRdM5DY8D+236zL2efZ8bK6XmxQTik7pX7wor8mWjjj6JvG7\nJEsgI66xJO9XToUQtHQizzgwbGp4r4g5X0XVrx441FsK/DR7AqLEtjGjwMbq\nkCIiKrJVSX/cFgUNuEXZ7umqxWdOGHjeEiXIJwyu+UIwHLIrL4+PWkx4XGTQ\nAAczqmqWDsBXPAqmadvTJCHwXMlHGCM0ZhcDRJ49uyPuQX6dWvdV5c47TAX0\ngrJyY+bJWMfeIxqYt2sfGISxxOdmKkriF3dkoidw0JpbuIv6PAlwYPdcE/WU\nuXqLTK1Io/6g/6d0GD/KrFeJ7YLEUBxHBlu3gFz8oFvcp7prCrsekVNIQJkp\nTXEpl1PzC0OwSJYcMFruqO1AaBiPOa5rYkAuOYpr3WGINEB0IctV4a/Ch4tO\njfYYhm8olMJBy+ydPCH4K0vr9pmaSHJ3WgkLVFzyEZ5IzZDWT3HvRyc6YI0+\n8JqPi58W4hpKQjeyXpLkZOYwRwrwnAk1MplkNPefywLYtRfbScNQ2s0wjOZZ\njVeT4Z77eKPycSn/JFXhiwW5tc2t6oGloVk7bYvnoIzro+2Zz9ouvcmaAsbO\neYVL0kg+ATdNFEesnOprZ9adwqfikvIdIm8HL4RVgm1mKmm1n32cqzN110gU\nOXuW\r\n=UMFC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC9qKD3frBtuvSiHMdmgo7J3PT9asAUktYUaXYlLtMG/AiEAngPHlW/zk7dB2h78XZxq8qFnz5MzLEXMbQdvM0jG1pI="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.15.0_1583435059578_0.08532767328888502"},"_hasShrinkwrap":false},"0.15.1":{"name":"react-form-with-constraints","version":"0.15.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.6.3","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.7.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"ea6bcc21728092e8195343a48f48050ea1fcce49","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.15.1","_nodeVersion":"12.14.1","_npmVersion":"lerna/3.20.2/node@v12.14.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-Z/ezhDQaNMN2ml2rDRMzpzgk4GDvD/f7hWzGcgzJPEo0i2xxW/wP5Fn0O4t0T6h06NRQdN+nwFyYOu5SgDszmw==","shasum":"abe705b2079ea319725655ea85a6043f49129830","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.15.1.tgz","fileCount":123,"unpackedSize":552599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfh4ujCRA9TVsSAnZWagAAKFcP/j7SQKvuTNY2+Bvy2YLN\nPj3Ds7vnD1MbavcpHf60C2iMJcDZEe385K8zxmA5QHFeQOwYVqbKFh8icq3s\nL4B+1z+fSzfgHeq8Qohit+0w7VdPMnoT5Rb0hzsyXal5ApUTfkXluKnmmjMW\nX6DqLGoCeGOwYiIR3t/KDPVRAXzn2pQDaifUf9N0jMlyOR3DwO8BPt8FmrS/\ntBYKo9JYC5h8Iuh2UIEqo//TeQFBzqVs27gw5RnNqyO8t5i/ovzCinwchkmx\nNh9/MtyL8cU3f+yzaVngHiY9TBEt1PXwr5f06zFMl17PPkCEzSBRJYH5j15m\nA894oQlz06tCejcaw+1t2mfSGHj+64sJ10V50Rx+WsuK6xGaBO9tIrAM+jIk\nTfr+/EFcQnUear5I2acOiABlWrDXs1JzQ8G0oOiL4P79J00Bdc1Q2ILShZK1\nrm8JyKCPz6k+e/wrYxJERZWCs0tElDOwYvjF+XrgtwuguequAPydiOgECjvM\nQVDx1JHtMhJ9+rUkeKAq0OBVar5PUcr9ZHRDxHdz/u+V/N/yOY5fm78sLLh0\napdqD4zwyNUP77dpJH536Wj18rIPG0d0wzC9KJH5sQZ9CR/1HIXcR2ccHjqV\n7pokb7VnnecxyY1dUuHQZrHCtQeYcIMPXDCAoitssqZ4jG85tPCcnZaCW5zl\nyDzr\r\n=DDdg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID0R6VZTbCOHFEeP40vojbsey9VQJeKoxQw9qL+T4JfoAiEAhebwr7u+3q+TKikeYTezRj8xYPOVl9MtDvNpYvkb2rs="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.15.1_1602718627147_0.9200156683017111"},"_hasShrinkwrap":false},"0.15.2":{"name":"react-form-with-constraints","version":"0.15.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.5","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^25.1.3","@types/js-beautify":"^1.8.1","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.23","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.2","jest":"^25.1.0","js-beautify":"^1.10.3","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.13.0","rollup":"^1.31.1","rollup-plugin-filesize":"^6.2.1","rollup-plugin-typescript2":"^0.26.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^25.2.1","typescript":"^3.8.2"},"gitHead":"f2000a126700fcd581bf108949c27af0c5a5376f","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.15.2","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.20.2/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-aV42ZLORf8q5SkqODDDrrzNFKxIfjwVPh6tgBKZoH64I49UFn57px2XJLIVTiinpYV3fStm2LKjTpzL5YNOK7A==","shasum":"ef390be63a7f4af2a08a82d1ec83e43f364ac65f","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.15.2.tgz","fileCount":123,"unpackedSize":552600,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfjhT6CRA9TVsSAnZWagAAiAYQAKPQ1a4ng+shJm3hwtyU\ntxQCs0YbEYxlYFwrht0Q4EfOZu7AfwkbIqfcVUDyidpqG4s8FQt1yMdbE8Bb\nxBxk9EMOlPphViyLxlDyREjjx3R2nnSZIYUiasfcAbwKLCtA0iljhAkWlo+b\nTFtTWzU3poeV7p/r9AdrHU/X1xuonGQsd/IQM+D4bmgkmhlhg1pqUywqPHqu\nbp2xjg/Yl4n4PiWA/dr4ju0nYvuU6YCjVQYgEpHL49cNE3Gda2hhuYp8AGr4\nxJZbaBo3RtF1m+KoSvSgtUv74+pmAl5duY4Cx95OpM60vag3NojbwvTTLzK1\n6quwyRUoX1a7hruUirhGTwCBuZm6hvLAnFEMute0jjUfosVL2+vTy10zAdVt\nDtPH5Kxlm73HZPRRX9DJ0ZxVVLmibfEX7ad9XvqB0DFGpi7zdIFT3Ci2dIPy\nUt2EAFwKR83BjWNbwLrpTAbj3BrCq94B9ni2zcQZ9cfngrVahMTAyypZbGlr\nut+aKd0clWK+APkfdasI32wH7GRJWbPs3pDMjaPTMm7xjAaqCjys5O1xQqI3\nlYSnZK9maf0GMQsg6uH0p1gbjrV7uP6nyrjlsF9tS1kq6rZCNOKi6Ajs9acD\nrhJkTLgv+34erK1WixXODlilzqd8pgcLlb3TXcA0C4yPi39A6L7kIFiKNiSw\ngP5F\r\n=Bmnr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeIXjLlm5NW1aGsF6UccmjFjC8Vv3/yNjiLO4XUw8q4AIgI5eFWuxQ6wel54OhSrEe6zBXxF7vY0swLFerGTQyQvs="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.15.2_1603147002075_0.8243674686016043"},"_hasShrinkwrap":false},"0.16.0-beta.1":{"name":"react-form-with-constraints","version":"0.16.0-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"fc529e9655a2a415ca89ba83a17d2dbaf308fe24","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.16.0-beta.1","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-/Imv5U+IzfQWKT4uOWHRCyatY9JbdMO9KwUKZiki9sXMQGtorBIFNUC8H4vzkDKoQcgRKkdxFS/cL68Iv3cD2w==","shasum":"db012de1c3f055de93d26411bd9ee92590a34d3f","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.16.0-beta.1.tgz","fileCount":123,"unpackedSize":557296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkY4iCRA9TVsSAnZWagAAl+YQAJd/iIqHfXDY5NnjTM0y\nksectDqHe9xuudf0tcXpdWeccfXiOa7J3+xDZmS0KCdlv+unHGW7UsWgLRZx\n4YoW4jzMNhvKpLil8XxcBZb/167KEE3N46qBJrPPoDJQ7Lru4oDIYKtFBOG8\nMINQX/pMkW7GU7c0aKQxm4qrnfDdX3udrsJrzFufwBn7U+B6mbFJEK7Fm47H\nILhQkV7DYRcy3a5Ul/seg1OPV6Rl3oUiDrqc71aQ4KHqFob7j9/63W0kVyeI\nSqFaC2ino5BfgkLPyFgkY82nxwJkaHsS8Wds5JsvlmnaAcuEjh/e/XpV6wNn\nEsn7L7L5hFxGDQTzW0CpwLPZXrqiKOvCJUUECi+y7T2OX9rxxzprFFNlEwzk\nzTHgEj1V9yaoyLuKgneEPTn2svaNemMNLoL8XVVQCz4CsgMNhzcku9xkwK4v\nPlaTnBR19OzVVQno72v/G9tjH16wUv4V6wZo8Ou1AC285LB9FngD/ex/bs99\n1cYUCDjg44MnCmN6u1gojPZHeiMo1rnBNsWmKOVIHQkLxHUcRt853fCJb+Vs\ndY1wQLjK+6APttWNbNXyyhdTWhqY9y9zotF35MOzLVqKGyqjtor7C+y2Bc2P\nTq/Ihn0pAn40VosqMV1i5voNz9P5XJY2+xY3RX2DHCl8oa/poUPujdh16Hav\nZwWR\r\n=0Pol\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE2ol0zu2dTj73mRlF01Q+7wa01tepD1CI/eNbgwGXTVAiAvpA1l+mlnnjJeTdc7AUSvU28/eEPtnn/qEAh4i4hHiA=="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.16.0-beta.1_1603374625716_0.009953364478816118"},"_hasShrinkwrap":false},"0.16.0":{"name":"react-form-with-constraints","version":"0.16.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"815084fe939f5b193cb6f75300961297b3f7d671","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.16.0","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (linux)","dist":{"integrity":"sha512-xt6geBao/+i3pcfNKDHYIJCHI+Ii6mhNN5rhL5l7BnKnQ04KPIRkWmrBNrhfptwV2LIc21hLH6lYZMN5BaKkvQ==","shasum":"88bfed61bff8df6946692200287c6737761eb0db","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.16.0.tgz","fileCount":123,"unpackedSize":557547,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkaTgCRA9TVsSAnZWagAAbMgP/1RLKK9fuXEVa4M83wIc\n7Yq1oyRXN+qlrn04Jve9LBL/HDsfancLjVcl5lCjOi7y8aLf75awKItbR24Z\nvp6x2e5JfCINEhAS6m/TW2gLeboX+34N5oCnuJ14zWGOb7ZahOPu6QvLK8YE\n/s8ykXRuhCN33kAKZkWPextu5njRwUn4GfeCYgrdp++X22SmC+engelTseG2\nwHq3nmTTLDGB8zsd8y/ajaOlzewb5Ny3IcHaT5SWjOEZwgABfRo/r41jCiqJ\nUSP77Wikr/D6tlqwwx2UxeijTEfDNRQEMeWtyONNq0PvbVnXhjmKVEAo58pB\nBMRGyKPsnH1G47sUMTjv8RwSKHkkzP4xdwxTdio95UWzVfWgE/+ulBUtXdcU\nzLnD1nBwUUW4vy2OmxEDDi92Z0E7eLrk6PBymr2+EnhErjcGymPWbtAOD2cY\nNhuG6f+Y2yWvakaChWa/qxOsBFMlyf5tyJaaXlMARYbZCkhV2AqUC4KfTZ7v\nMI4GNuOd4F7QSEZtuYGpsfPhUpbFZSQ+3vRyyQ2K3HnqHI1y9V3wbHeATkqn\n58uol5ccGTz/Yk0i+U1o10m6M9nFDKLuWwVn3rcla45EfXNXcMEVSZd+gC4/\n2J+/LJQju6CsFV3o5vbjFIUU+eFL1HRBPkwinr3EMC3HPkEVNVieP3qL4BFj\nss3N\r\n=AFyI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUi5mmMUAO9k5Cngf8mqh1pPfvzvCtyjwsk65ioUsiZgIgEJpfnAIxLouPjM3KNCH/o3vQD4lsbKIiDgjBLwGJY9U="}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.16.0_1603380447583_0.1261291523018715"},"_hasShrinkwrap":false},"0.16.1-beta.1":{"name":"react-form-with-constraints","version":"0.16.1-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"f707a459dd7ab873e4844f194ce83a4267129765","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.16.1-beta.1","_nodeVersion":"12.19.0","_npmVersion":"lerna/3.22.1/node@v12.19.0+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-fcnXfDublhN7xQBOHBtk5VuINXKOvpPOA/mADPTN0LBZLUg+2tHiys8kckpjo6yA7bGjB/pkRGqkBXH2vBFxFg==","shasum":"9f4a22b3452d3a6fffc8164e4fb4b0bad8c4c85c","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.16.1-beta.1.tgz","fileCount":123,"unpackedSize":556454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkh5fCRA9TVsSAnZWagAA5iMP/31iKXp2iIoGEOl/csxo\nrtY7XfO7276QataSHMWfvCM5PdljugXk8LCkGZ3917RSosE/zu78OG/58EXX\nhLcg2Iv/OtHRVAvOyRK4oFY6LzYqbEdPkfHhSDskrgbPYn2zI+2rwAhZU+Lk\nFf4QnB/BkfkUbP8JzxoNAlPhgcFcaUqn9+65hZOhuJ6iGRcG3vRaWDwyP0Qa\nqmIVIrEoOuv2NDuhMgbs4PayFNOr/Jx2CRt+8DLYg3wB6nJuFkDacWu1rYTB\njhCPDRrdnEl9QctWcLsIujcLZDl0SW9yewjqlQtCGVlc8ypeDC0vIcoME+Z8\nbIyF125A76u6PUpn4MBtf8yacdz5QaN/MtZGUe0YhAdqQ6gcE4GGi/3GiseP\nMaajPwm9PJ9V3POhGOfqh0AhLpN9zXQuKrJueLFv+fmd2akSkq5y499QXqgA\nZlD/zmx12tILdBx9Rk8/Z1M5tWnT7P7YgNqKHZcG26k8CGEwe8CtkS0ohXZs\nFMlUgwUnvIh1LNIZvYfaUkd1pE28xGjv7pQi2168CqQap+TuXHd/3eB+rb/6\nR7ohPa4BY6AwYutZnuueM8QVcFZ9B32lxFbniGL9R7ldgC+7cfybhwHjn7+i\nvgq+EtZDaRZj/0AOZ6ciOuHoVf0gI29h4qs6g7slOjfr7fANsvuX1WtXQqpK\nFj4n\r\n=nNf5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCD+Q+L/OUNhROqfiob6Pk0NhoTRzfQPld46uIPQbLOQIhAPV/1txjGIlVhY1ZN8fmvsoh1mLrxTrdXHALXh6LLXzU"}]},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.16.1-beta.1_1603411551543_0.8623475527119429"},"_hasShrinkwrap":false},"0.16.1":{"name":"react-form-with-constraints","version":"0.16.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"1163a844f53941ed84296cb1a70c85f96df6fdfb","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.16.1","_nodeVersion":"12.22.1","_npmVersion":"lerna/3.22.1/node@v12.22.1+x64 (linux)","dist":{"integrity":"sha512-SWlErEffFTYdW8BoFYAs4rn2PSmbAylLKNgYzh2/cMZYetSy4pM7MDMMVoy1+GOMuI4jc1axdNSH5MF0LUrGFQ==","shasum":"560f52de3726087b9ac40d0a759a2e7d236eeb71","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.16.1.tgz","fileCount":123,"unpackedSize":556036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgk5xtCRA9TVsSAnZWagAAHTIQAIDOXDEY5eZ7E+eo4114\nwg48UYxfZvhFz7/2mMIZ4P7N+s0Vfsl1PWTNyrt+NRZAUojFsLOZkDnUG35v\ngeRYeeas36Y4fTSU+b3V+139AW8oFwFss5qTNF5ZUDFMZ/tFomEPg+N3ViQG\nihrAZwP/4n4+j93B4xxwbbewes+yzQ9gotCLfZmcc5r2Yndwrvgg/tRPJCv+\nvLxPtjPJCqTUfByc1Y/vqI6OS1faT6WJ2OhwRP+1OrD239Qh7JBg6LdoM31N\nQr6nI3JoWbpTIg+cJqdVQK4GkqtEYeexNrCZ8xmfpK1p1y67bp1cbQViT8vp\n0BImA1vQ/Ok91CnG0yJnGyR2HpLHKP06nvGKuaeR/OYk3gFtkbnqEO4FmruW\n704EG9u/m53Phx+uByNNEOftGnzx6i/GyxnxHjqB9kB1pwycGKgcehmilFl4\nLBdJ5VyTuard7KsCGmbxKFYxD1kDgAToLUAtIfHv75YINwl/R2UCWYaQ/lgx\nR8m8zhpLfJZdsrv0tm9GR+lPIN6eSs5wdwLqriw9xDqiuDt0is/X2hC44p9m\n6xede08vBfrgDynfjXpstBYYgJ1TSu+UcP1zhYPxIRf8XW6g1PQigWslV2Mw\n3Ux6YxKgGjm64u5ikAFNOkY4hGUmtBnrNGjia+cXc9JR1IH09KNUdnrMZEaN\n3/Xe\r\n=tN8B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCH0kVTTlMWI+U4WH5hzlqUfo+K5KCVvKcq04SAN4z3JwCIBDvskJX/Sa0pr/skF2PLduLabfylzD9wO/TEjCGIjI0"}]},"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.16.1_1620286572934_0.6707904582371838"},"_hasShrinkwrap":false},"0.17.0":{"name":"react-form-with-constraints","version":"0.17.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"4064f77c68f0454f17f001e6fcb31d4717fcd080","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.17.0","_nodeVersion":"12.22.1","_npmVersion":"lerna/3.22.1/node@v12.22.1+x64 (linux)","dist":{"integrity":"sha512-NxCgI0GQE+fdHs1z+z3oT8eZNzFvzGX0rBuCawLWlKObb3962tCO8sPQXZRZCIk9097OiPc1JAPPeUyna0wL8g==","shasum":"754f72d8d1b9996a5665eca34c218372f2cc1558","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.17.0.tgz","fileCount":123,"unpackedSize":556224,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoWwGCRA9TVsSAnZWagAAh3UQAJtV+joYs5TIB1+xyQht\n382uLqmOJMS1mTPNoFTU5IHmWU7JBswXHUzTOCPMBOGz0+t0xoMaAYOL1L86\n9NLbr5ynZaFG1flFxNALZK+d+uQKtCHsQmmMEQnlrngwjjsg4Myu0eMNJR1A\nURie0aFCGkSSYwC4lTUkzwDBt1fxoEHXCmDnSaNKSy4P0eKnkrZvuiJz80Vk\nW/9NxD79Jg5vFdwlOwHSctpIMm2Vt1iCug/eoyEuQty8yWhMzJI7I8jtRyYQ\n3vySluL7o4Odf/E3MDJbYpg+M9sfCjqf6b9q7U4PL3Ads6hbL71wrBEbjizY\ndzbGei82WWeIs67UiN26+MFjUEf0V8bsWApjE1LX8vWF5vGRCvCq75ibTlK+\nvbNVg8PfBNZgSWctVIEmUGx4B3rKwLoFtlMxE3Iej0/k/rs14eznGQCgRQeG\n/OLGGYnpnJhadfzWt2TfKCAifbFTiVvFWofLUEkuJ5gAQfQkTKcMSzUsyuaH\naGjz3n4xKE9WeiKLOK6L/xam6qLKlaX1yugVebAdCaA2+SuaBN2KFz6HHsIX\nOgU3RVURhnEZrXjQy4rvn+VAskcyxVq8l9Gybbl4o9/KcFVqYoLcyUIZwSUh\nn5XybLoAYplHgoc9MBMvF+2ETLps/Z8e6s7nZ4vCycV5TcuFi8dAuTa+vOxQ\nIWRx\r\n=s+6g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDh30QpQUsQUtxA5Y/dQbI5rPP7mQq4kFWwjzp4x0gjsgIhAOoU0OsDxHVEuFswARBcM8MV4roXbGeWnUtGitOMz1kB"}]},"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.17.0_1621191686508_0.677774732098182"},"_hasShrinkwrap":false},"0.18.0-beta.1":{"name":"react-form-with-constraints","version":"0.18.0-beta.1","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":"^15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"c6296fa45e8e1b7b3aa39a28b7598d6c2eb4cb4b","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.18.0-beta.1","_nodeVersion":"14.16.1","_npmVersion":"lerna/3.22.1/node@v14.16.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-tinEzZKPxUetj6wS/ugDdrDqtNFNl2pfAQT/lOBVnuMfcigyqkKzvwF9lNKxAAXqO60UCt+3fVu2uST3Jq5UVg==","shasum":"923c8fabc0ab5565be94709b23928c581c6211cf","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.18.0-beta.1.tgz","fileCount":123,"unpackedSize":556297,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoheFCRA9TVsSAnZWagAAveQP/imgR1an4JvoXZwC07xf\noAn0y21RBV5HVAvrhsrHBCyIaa6OCM4phYLCtV16NhpUs1u/w/fftF5Sv/lr\n1VQSSbBgcIdCkab+CINTweSj52DEDN3Is9gRywoh+eNTy7mW/2M8ZzKYQcqD\n28m0y3zmLjY6KSQKYFL1V+IVLld/qwtNt3n76zh6ezhtKwUHHaweYHNeUy4M\noBcOrz+vqLLgGVnepF3GqksYibYff8dRmtwbMSrexjJrht79LW42Oo5uFJ90\nrVzyILyEp7wZrm9BNAVq7lUElPDqlQdCBWY3va6C2ArlUIdtfUCAb36atFyz\nL1qKGYV5doxR7qhec20Y7cZZKZ3/XNyPCRFv9cNsQWYPSQwvBUhR63YgHZ66\nSp4vulAwa9qqUVP7wn69KxRfOq5KqZp8Yl1QDS4xcZu4nm1K+MNN9urhrPRg\nLgmJFQmeOnigLyLJ+Ju7WIqUVr16lGBWjTwHwkDhTfT9ps2+ly7Woebz7ApR\nnkm24TOa+jxCAhK4R6fqzjmgBf4btQVzjwGazmkiKJaEWzydYezRZD/+Ik5j\nx22KgHiacvwgD4ukP1u+I5BGi8vXGoTgXQ4Xtkq95BainR9JorvZhPnlTLS6\nExscSTPCSv/sUGC59yKrOp93Dhz4BX1obtzE2Y1lnizjw3NGvSFl4R51CyIU\nGROJ\r\n=YUhe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHgnmgQNTC6bvAoiuFuStrp1rXSi13Q/ZAmedAl8oJIFAiACBQN/F9k9ShzAVcuJ0B/DSzM9UMBErSKs7Iz7tnSLWQ=="}]},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.18.0-beta.1_1621235588898_0.4755143578647294"},"_hasShrinkwrap":false},"0.18.0-beta.2":{"name":"react-form-with-constraints","version":"0.18.0-beta.2","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":">=15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"019cf5556af0730905bba1154ee48632a40197a4","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.18.0-beta.2","_nodeVersion":"14.16.1","_npmVersion":"lerna/3.22.1/node@v14.16.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-AVyw5UEzwwUk7VrDZUSBE7xFIatqllyQP4QQF8y2Fh7Rrj4Vz5/yd/hRilRp62i5d5gKO2QjNX7VEUxdHK9CRQ==","shasum":"6facaef1071371f32f1937790e1eea292dfdcd0c","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.18.0-beta.2.tgz","fileCount":123,"unpackedSize":556298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoiE6CRA9TVsSAnZWagAAdaQQAKDpQMMQ6L/4StTtZkkB\nzaWVosFrjfhaDD4F3yd2TJQcr1mcH2DqIc+LixStuTwQ5U77vQWCmaBSKtYt\nctH6Bu4g+9LCnBqSDLALrmhWUszIsmJySL4yuuy88/Jget8jxObI0iEnQBAY\nIE6Se/48ZlYUxhwq/GEprDmO7xdzqPXqu8e0//ZDNNQJQzSXSaQngHyVjrlu\njjBbcOupMm60gyg/iA4vUasU29lY3AbFIRlFnG7aRCXN3VUpuzYOpgicO5oF\n2m8Od3RA69CaeL5wirLFKpHr87BYBjXKYgJp/r2tfq5PMCe0Xer7a++BXTbw\n2H+usVsywSj1Q0iMIAWd8P1Lb3M90jYt44UFu9D/Jv3guPR9PN7lZtIBrIJ7\ntsRn/b8fcYnJ2ZoXxkGPUmFpimKC7bvEjz3zGo5+wmcPqKfXvo9VKwpLJkvH\nTy33PfAjvAvATtn+8Ag/AIlwn3y32zHG8vkY/cN9i71pZB38nww/HqCx3Kr2\nyiiriq23w6vIMfjR+htCy64fruE3wm3gVay90Rw/hk1j7WEabKphZkQ0+g0G\nq8m+zeVCDghEZKyvguBUm58Z9RU2vAz9CwlsPgfdx5/iPI7NWFI9oSpEAyu7\ng4QewutvhvdUQrmZ1nm2TFehsGgau2CB2o+anO8at4iyEJnkXUU/3HjQFC8A\nTUze\r\n=QfG4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCU4Cav6foqm2qIn1Hb8mGbqBpYCHU89W/SWD3LHqx3ZQIgNrSa7vjYx5dpAq/U7OXHToCIb8xfQBHoOKQvgnut9Os="}]},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.18.0-beta.2_1621238073752_0.4532141402427903"},"_hasShrinkwrap":false},"0.18.0":{"name":"react-form-with-constraints","version":"0.18.0","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"description":"Simple form validation for React","license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"lib-es5/index.js","module":"lib/index.js","types":"lib/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf lib lib-es5 dist coverage .rpt2_cache README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:esnext && yarn build:es5","build:esnext":"tsc --project tsconfig.lib.json","build:es5":"tsc --project tsconfig.lib-es5.json","dist":"yarn dist:dev && yarn dist:prod","dist:dev":"NODE_ENV=development rollup --config","dist:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn dist","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts lib lib-es5","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":">=15.7.2"},"devDependencies":{"@types/enzyme":"^3.10.7","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^26.0.14","@types/js-beautify":"^1.11.0","@types/jscodeshift":"^0.7.1","@types/prop-types":"^15.7.3","@types/react":"^16.9.53","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.5","jest":"^26.6.0","js-beautify":"^1.13.0","jscodeshift":"^0.11.0","react":"^16.13.0","react-dom":"^16.14.0","rollup":"^2.32.0","rollup-plugin-filesize":"^9.0.2","rollup-plugin-typescript2":"^0.28.0","rollup-plugin-uglify":"^6.0.4","ts-jest":"^26.4.1","typescript":"^4.0.3"},"gitHead":"c4648fcf26c27f462eb730ea79eff2dfdd6d82ec","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.18.0","_nodeVersion":"12.22.1","_npmVersion":"lerna/3.22.1/node@v12.22.1+x64 (linux)","dist":{"integrity":"sha512-JPbechD+g500rhe2ixNGM2+Lez9YgAmVj+D+H1IUyXY2qCUqohMx48QlZEO1fZXJyl9Fkx/ibpzE4C0xZqYjQw==","shasum":"785480036ad191baa112e4e0a6e606486ff49703","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.18.0.tgz","fileCount":123,"unpackedSize":556307,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpqLYCRA9TVsSAnZWagAAfjwP+wayAEZWNb9FBSmTrMnO\nV4ormri8V2lAc88nhaJ+Uhu3juKz7yfDmNEAk1orR1zGswm3jDrB4P0x2coU\nlboI8dWh6kOneBo7UjaUb+1FdM/WgR5bPjefGwMKD/RrN9AEVXmEgxuNgCOS\nn833x0EjeSHOLg3W3ojnr74s+C1nZ8x6SEhB7e5Kx+NW6JzMdyVWTQ//C2+W\nVE5pn4HiRSn6gXrihY4cPzw78ZoFmv8nTspeC30MEypdah6P6DLMfVCq5pS2\nM62tlSwsPDyJNElC8ep7Zsbg8V14JGUF2DO7TpdpfRMiT3aZltkVpf4plGZS\nSiGMapeOicJ1yWKSNEfcfk62anxDGBx1AzZajFxCsW68Cb9mCFWcmnINIyYy\nh16Pk7Qr10593BmjRWF9UBZfSvYqUz7bu/MMNxTeeSbeMNnrTJoQnaU+TsVg\no4Mrotzeq2yH4LjB27BWyn2M7DMESIvOvzI6Tb4z/3pC2EwwH+OKUOlZiyN/\nk2BVk1OBr9b4eA1y4FvqtL8psbgqXIl+NsWaDbmRG1y6xF4w7qWd7EmNmv3n\n5jPYaia8T8zFoBm49tadop7eozYz7UvU8sf1DpbOqj/XL/kgdJJLECRXctiv\n/pwT5FQN2mZsYWEQ2CVtfXvNlSbtAQZ5PQdxqRUnrJRIB6yOXqv+S3QT0lBa\nUMl3\r\n=Hawz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/5YIiPM3NRlNAE9u+G6R4+CTE+SIAfbRgxhZGUzhO/QIhAMc7O1Nosx+AhZhJN+F6FCxop6ApvVTWE2QUHm96TxY+"}]},"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.18.0_1621533399912_0.9678288160104773"},"_hasShrinkwrap":false},"0.19.0-beta.1":{"name":"react-form-with-constraints","version":"0.19.0-beta.1","description":"Simple form validation for React","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"dist/cjs/index.js","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf dist coverage README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"yarn build:dts && yarn build:esm && yarn build:cjs","build:dts":"tsc --project tsconfig.dist.json --declaration --emitDeclarationOnly --outDir dist","build:esm":"tsc --project tsconfig.dist.json --removeComments --outDir dist","build:cjs":"tsc --project tsconfig.dist.json --removeComments --module commonjs --outDir dist/cjs","build:umd":"yarn build:umd:dev && yarn build:umd:prod","build:umd:dev":"NODE_ENV=development rollup --config","build:umd:prod":"NODE_ENV=production rollup --config","prepublishOnly":"yarn clean && yarn build && yarn build:umd","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts dist","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":">=15.8.1"},"devDependencies":{"@types/enzyme":"^3.10.12","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^28.1.4","@types/js-beautify":"^1.13.3","@types/jscodeshift":"^0.11.5","@types/prop-types":"^15.7.5","@types/react":"^18.0.15","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^26.6.3","js-beautify":"^1.14.4","jscodeshift":"^0.13.1","react":"^16.14.0","react-dom":"^16.14.0","rollup":"^2.76.0","rollup-plugin-terser":"^7.0.2","rollup-plugin-typescript2":"^0.32.1","ts-jest":"^26.5.6","typescript":"^4.7.4"},"gitHead":"0071b45b6cb9c0381bb6066d69f4057d4f1f1632","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.19.0-beta.1","_nodeVersion":"16.15.1","_npmVersion":"lerna/3.22.1/node@v16.15.1+x64 (darwin)","_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"dist":{"integrity":"sha512-SD4q4aAeMh/eoNBHbFVrHeX9R6yjEFz0W8WNkcEgUuU0NiSWRpgEO7MzqnTy7r1HcdjHS56jdkCjcx4GU4Jb6g==","shasum":"dfac6a9f16dcf2479aa7178f21cb29bf8abb0374","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.19.0-beta.1.tgz","fileCount":75,"unpackedSize":182884,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdL06V7mMFkR8kVSu2SjaFXVWI2mBIgrpL83FVeTX/DwIgDjtwESzS/YFoqRJeQtyYItb31igMlfhEnmybIsR/ovU="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJizZ0zACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp4mg/+JQxk0clOS8zHKX3+HwbpjgGqx2xUJZnZjyqiGSxxu3vXmCMB\r\nIIgxLCRdvQ655GCBKVOPE+3PJRGerb+ZaUJFabUjUgz+8ppWh2uwxUmc4ldc\r\nZZ/wGW3vA8ZoNUqCxszwuSWxdTNa4qI8CStCvUAkvpwSKHxQpnHuMGY1Vpm3\r\nWKWNRvBau/k20ic3exxxJxsH+BiF4bIPpPpvdpnnUE0BEkjroDZ0Bvgp3Fu3\r\nRQp+TDXOMkTFAriAqHJR8oWYq1tW+ftbCw/Z8ImRf/0Zld2WQ6/Uzap2UO0B\r\nHdK0VgKEvDg7DSLvwwv5zhj63ZEn95cFbZPRDsUIVp7ZFZANTHw6BdpD38tz\r\nFodRYh25fV1zcm5HNV1TD+RA6eJTTcLb4wXOpsk/7jTR5V4t+rqWGOl595T0\r\noX6t9CVc0okgl/4/pi9iuuZfVcz1Y3lIPSGUXDuDDD2xB2QPYvLx3RNQaBSI\r\ndrbmTLQOWNAb8RSwQFXcH+zKpLZvRma8kLW6Iir1uU+QTr8qEnSZC0pvQg0M\r\nE2kFqIJuZrqmwRM6H0wdyrt3AynkgbM8V9v6WbpWK18dUeCsYOyYHLFeyald\r\nDJWYqYu1cA8SXVHykbfDtciszTpFJ0tA/P+HorkfojqW9GHULUprqd/L4ofR\r\nlY02nFTXyIQb9uu4wbBfH8oj0Z0W+qht64k=\r\n=TqRn\r\n-----END PGP SIGNATURE-----\r\n"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.19.0-beta.1_1657642291220_0.431390128215392"},"_hasShrinkwrap":false},"0.19.0-beta.2":{"name":"react-form-with-constraints","version":"0.19.0-beta.2","description":"Simple form validation for React","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"dist/cjs/index.js","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf dist coverage README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"npm run build:dts && npm run build:esm && npm run build:cjs","build:dts":"tsc --project tsconfig.dist.json --declaration --emitDeclarationOnly --outDir dist","build:esm":"tsc --project tsconfig.dist.json --removeComments --outDir dist","build:cjs":"tsc --project tsconfig.dist.json --removeComments --module commonjs --outDir dist/cjs","build:umd":"npm run build:umd:dev && npm run build:umd:prod","build:umd:dev":"NODE_ENV=development rollup --config","build:umd:prod":"NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run build && npm run build:umd","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts dist","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":">=15.8.1"},"devDependencies":{"@types/enzyme":"^3.10.12","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^28.1.6","@types/js-beautify":"^1.13.3","@types/jscodeshift":"^0.11.5","@types/prop-types":"^15.7.5","@types/react":"^18.0.15","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^26.6.3","js-beautify":"^1.14.4","jscodeshift":"^0.13.1","react":"^16.14.0","rollup":"^2.77.0","rollup-plugin-terser":"^7.0.2","rollup-plugin-typescript2":"^0.32.1","ts-jest":"^26.5.6","typescript":"^4.7.4"},"gitHead":"5bc9e821bb6c71dc3361835d9a6b2161a06be2a9","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"readme":"ERROR: No README data found!","homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.19.0-beta.2","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-5epgDOXUK2/7RYSAwyKyApYZt0D5xV8/eQpnOYXCJqH8NFlnMunK6M7epcbwIdrs4Shpv9Q2B0IrbKn/l6WFjA==","shasum":"2f1177146c8be99dab5bc5a6e59eb304d55b0dc5","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.19.0-beta.2.tgz","fileCount":74,"unpackedSize":168001,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUziYAf8pM7bdykQghgdoftvRiILW4fXprgUUUIOsDCgIhANqZtgK5xCtwenQujEgbqhREykC+T3XLg4+aC5eUR3ny"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2ZvOACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorKBAAk6bRGoTit9VR7xulG87XtEIdm2FMK9Gfq+/XiDsuIhzD5rMd\r\nZbeuWRhGSC41asv6FohRLIliT3Aym7ein73hGDgSbEPSKnWumlguAJCZgMVT\r\nA1WkKKflL3IFo/7IWKg7E7byMrU0C5nu+ICBht7sGO1vhzFQ8OT3SV72SfdI\r\nhnOmLqC0Zh/Js6W1Q2Kd4jZmIzkDRMKSaChxjsIUkQBVew3YIrBarA3toGp+\r\nBIbVKNa6/6rBbHK6wfRDhZXz0Yn8R/QPYD5//+cmaT+EJeNk2UnxYqfTXXtO\r\ncjjmvWxq+A1wPQHSq1D5x+Q4h3GJyplTbuNaoMKtfN9YEzmsgASXkaXPf+5/\r\nCQHy+8HkxLXFtGiUf1AHUiTFYoTqIqKaEumPAinGAdWrEHDNY9XEEmLlcsag\r\nRl5uU5vQW9iaLCUlE3VKDjMzZP3c8nL7DBLnACfyjraGNG078qn05FLnvwFB\r\n2leWdFBv3IntiN+1OZRBA99M1cBtQT5KVVRpEQBtdWuCkAkM+bet39K6/Ma5\r\nvaX3W93QucuYlemT3WeDDqnxGmukW6USvPB1lQOsqLr5beIcObp3DAn5wafs\r\nVsRWhMo57T9lY66OOTAyvprwXYftn8i79BwREmwDLt2Lhd6FY1L13n+MCl4z\r\nqfGrm7CyFsZ2rVskYEeEDNLcVomnMY1vzv0=\r\n=Pfzy\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.19.0-beta.2_1658428366129_0.8017814000649428"},"_hasShrinkwrap":false},"0.19.0":{"name":"react-form-with-constraints","version":"0.19.0","description":"Simple form validation for React","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"dist/cjs/index.js","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf dist coverage README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"npm run build:dts && npm run build:esm && npm run build:cjs","build:dts":"tsc --project tsconfig.dist.json --declaration --emitDeclarationOnly --outDir dist","build:esm":"tsc --project tsconfig.dist.json --removeComments --outDir dist","build:cjs":"tsc --project tsconfig.dist.json --removeComments --module commonjs --outDir dist/cjs","build:umd":"npm run build:umd:dev && npm run build:umd:prod","build:umd:dev":"NODE_ENV=development rollup --config","build:umd:prod":"NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run build && npm run build:umd","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts dist","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":">=15.8.1"},"devDependencies":{"@types/enzyme":"^3.10.12","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^28.1.6","@types/js-beautify":"^1.13.3","@types/jscodeshift":"^0.11.5","@types/prop-types":"^15.7.5","@types/react":"^18.0.15","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^26.6.3","js-beautify":"^1.14.4","jscodeshift":"^0.13.1","react":"^16.14.0","rollup":"^2.77.0","rollup-plugin-terser":"^7.0.2","rollup-plugin-typescript2":"^0.32.1","ts-jest":"^26.5.6","typescript":"^4.7.4"},"gitHead":"4b9ad3feaf496f60164f8909d08f49a58bf4d17f","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.19.0","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-vyJ9+tJdCns9A3JLHuiK2vqN6q/CPFR+sdCj0rJjUifAi6bSNCLThLyjaftmNJ8HEzu4cXR5+ccLGL1B9AW6KA==","shasum":"4e223ea9377a445fc4fdd8566805a72737f4ff70","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.19.0.tgz","fileCount":74,"unpackedSize":167994,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFBJWnPU6bT06fmGEb64e+aX3LEFI4htAmjYXf2xYFx0AiEA5prcdTc/3qmcVfnOLvH2BIv2hpKXo+GfNlgiAHktats="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2bDaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmodiw/8Cp/fMInT34zU2FpLn8WgMkuBMh73Kf2GR41Ebo5qKY7wq4o4\r\nR0/n2uqJQ/vTXeym3Neld9TTp39qePzDz6fQqzSkWaw9jFtCySlfeCevvjRk\r\nPuxPIZpmywbf4AiOYd+RW+HwLAyhgKDShwAAFVJmo8dBOaxt7pk45qluVnkf\r\nH8z98Gl7ChoCvaXYxQOnf2sDYidIZ07dxw008EUbG+X/luZecjvc9qsYorwg\r\na9MCbbmJuPPC843iiC+lu8eoSZRNHeqi/fccwE+/WngOwQsz0iFuRkK+ZYdi\r\noJ+pPagga3BBOPuVlNrtrfYuma472KvHLhvFjuCBieFTnI9d01rV3Y2AQpn0\r\nkYK1N3rVXFwT4CDxNzT6PbF04zXI2VuPIy812c6nSsk79Q3xc92479RwzK0W\r\nb3ACmhDWFQHbeiM45TtPX2jDf3vr6B954Z2fINO3+gT8VEeSJc7lOvQ5gWjG\r\n6dmPm+Bbf/AKZY5eloLN2QziUriAmQ9QxjBvIkDlipWwYgZZDjr579rtXusq\r\nEvi5dYvpkY4rC1tJD6PEe/cJgGWjltPPOQzcLuvWqcJ4XfCY04aHHpd306ot\r\nUP1Mim0/fQ7AU2N6iVniEciM4Y3R2jK/noIMzrwKIHKCyfD1/2WxZiFpPk8F\r\n8sk1H5awX+z8qP+XW+xnSBb3WKx2at9fmz8=\r\n=c+r+\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.19.0_1658433754029_0.1932330637681654"},"_hasShrinkwrap":false},"0.19.1":{"name":"react-form-with-constraints","version":"0.19.1","description":"Simple form validation for React","repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"license":"MIT","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"main":"dist/cjs/index.js","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"scripts":{"clean":"rm -rf dist coverage README.md LICENSE CHANGELOG.md","tsc":"tsc","build":"npm run build:dts && npm run build:esm && npm run build:cjs","build:dts":"tsc --project tsconfig.dist.json --declaration --emitDeclarationOnly --outDir dist","build:esm":"tsc --project tsconfig.dist.json --removeComments --outDir dist","build:cjs":"tsc --project tsconfig.dist.json --removeComments --module commonjs --outDir dist/cjs","build:umd":"npm run build:umd:dev && npm run build:umd:prod","build:umd:dev":"NODE_ENV=development rollup --config","build:umd:prod":"NODE_ENV=production rollup --config","prepublishOnly":"npm run clean && npm run build && npm run build:umd","prepack":"cp ../../README.md ../../LICENSE ../../CHANGELOG.md . && jscodeshift --transform=../../removeConsoleTransform.ts dist","postpack":"rm README.md LICENSE CHANGELOG.md","test":"jest --verbose","test:coverage":"jest --coverage"},"peerDependencies":{"react":">=16"},"dependencies":{"prop-types":">=15.8.1"},"devDependencies":{"@types/enzyme":"^3.10.12","@types/enzyme-adapter-react-16":"^1.0.6","@types/jest":"^28.1.6","@types/js-beautify":"^1.13.3","@types/jscodeshift":"^0.11.5","@types/prop-types":"^15.7.5","@types/react":"^18.0.15","enzyme":"^3.11.0","enzyme-adapter-react-16":"^1.15.6","jest":"^26.6.3","js-beautify":"^1.14.4","jscodeshift":"^0.13.1","react":"^16.14.0","rollup":"^2.77.0","rollup-plugin-terser":"^7.0.2","rollup-plugin-typescript2":"^0.32.1","ts-jest":"^26.5.6","typescript":"^4.7.4"},"gitHead":"2f806eed7e284e5e06f1a20cb625bca51d03ae62","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"},"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","_id":"react-form-with-constraints@0.19.1","_nodeVersion":"16.16.0","_npmVersion":"8.11.0","dist":{"integrity":"sha512-i3zJ7LpJ4Ad8PPUr56aJ0xlewwfumkDVAP/RepdHTtIlZODbXVwHLwmc4O05YF63tVf7LS/azDJvjQBdx2C6ZQ==","shasum":"aca1e9019cb669ec8195012e2bcf8c42bf62e997","tarball":"https://registry.npmjs.org/react-form-with-constraints/-/react-form-with-constraints-0.19.1.tgz","fileCount":74,"unpackedSize":168052,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBrCbMTkTyxHtgyPbSoYo4mNx2bJE1S1hZcZALFM/u4wIgS+twbukRWnmOxSfzPDBTcb9BV3cvRjVIZDEJkQjBx38="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi2dQIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpBQw/8DprOJ6ZAWHl1WX/pc4Yt4E6GGZI+mSwHzBlnf8UWGsipXgnK\r\nVwCgkgn6BUCYGG0Ae8LqKtTVvj4wUMim39hx8yy4Ibf1OczpDO2cfHgqJtKy\r\neDor/XCRrJbw0MPrnMa9PSBO9GC2ImyhcJdCyU+h3/fjIfAf21URj1Fu/n2K\r\n1Y+NzXGSPRibS/q+qieJIxA/d6vJZ9yqrcf5IyRbn/NSNiXZ6P2VAEjrUWWo\r\nIPGl9pXPlyRKWWWax6nhZyMM4bD9+lqv7bl+ndT/zNqA1Fn8eGzQIfWWqjnl\r\nkkBuL+1vVt1JzslbRGZs2EA/IPr6/Nse7z4o0R/hw4pDCZy/Khar+NwME0ls\r\nLUgX3N2+tUD4aVYPnaOLh/ma3ehe4BVRGm13W8ef6i6FwCBQleti8+DIh4Ba\r\n6YZkdLYrBdcOrLwIAF4+h9zcbr6hVQ0j69WD8DzQt7X4zalEAOv3RZz1WBlx\r\nLWLF1JVw6m6xrXidmScI+eUeV0lGO3PnOg26rw2zb8AD2ThdRmgeymCqVEqj\r\n8eAcncneuW1T+4AsyjBNWOvNzkiHEC7M4IGrPpSAgSTtKapHOK3UyC0v93T2\r\n310QSFxtxe5lHp1gw5WAHWuP+/HY79fyqMLi/zZTbg7v3ulSjLTu3Jgs1IS4\r\nsD0UVTb3DcIPZ1TK5hRyQpQqeg/0/ZBiJLE=\r\n=YaMG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"tkrotoff","email":"tkrotoff@gmail.com"},"directories":{},"maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-form-with-constraints_0.19.1_1658442760138_0.044743078475028675"},"_hasShrinkwrap":false}},"readme":"ERROR: No README data found!","maintainers":[{"name":"tkrotoff","email":"tkrotoff@gmail.com"}],"time":{"modified":"2022-07-21T22:32:40.476Z","created":"2017-05-19T01:13:58.850Z","0.1.0":"2017-05-19T01:13:58.850Z","0.1.1":"2017-05-19T01:43:46.817Z","0.1.2":"2017-05-20T17:00:43.568Z","0.1.3":"2017-05-20T17:13:50.616Z","0.2.0":"2017-05-20T18:24:29.952Z","0.2.1":"2017-05-20T18:27:52.598Z","0.2.2":"2017-05-20T18:34:36.684Z","0.2.3":"2017-05-29T12:04:27.800Z","0.3.0":"2017-06-20T14:25:22.353Z","0.3.1":"2017-06-20T15:25:17.064Z","0.4.0":"2017-06-23T22:33:22.117Z","0.4.1":"2017-08-10T01:25:59.005Z","0.5.0":"2017-09-11T16:48:42.900Z","0.5.1":"2017-09-11T17:01:11.249Z","0.5.2":"2017-09-11T23:07:38.818Z","0.6.0-beta.1":"2017-09-26T21:06:18.035Z","0.6.0-beta.2":"2017-09-27T16:22:42.372Z","0.6.0-beta.3":"2017-09-28T21:36:36.509Z","0.6.0-beta.4":"2017-10-02T09:03:17.832Z","0.6.0-beta.5":"2017-10-02T13:05:34.883Z","0.6.0":"2017-10-02T14:37:52.623Z","0.6.1":"2017-10-02T21:24:39.288Z","0.6.2":"2017-10-12T08:24:46.481Z","0.6.3":"2017-11-04T01:50:17.236Z","0.6.4":"2017-11-10T21:44:49.754Z","0.7.0-beta.1":"2017-11-24T22:40:18.896Z","0.7.0-beta.2":"2017-11-25T18:10:28.753Z","0.7.0-beta.3":"2017-11-25T18:32:32.938Z","0.7.0-beta.4":"2017-11-25T18:36:27.105Z","0.7.0":"2017-11-25T22:40:45.178Z","0.8.0-beta.1":"2018-04-23T21:18:13.310Z","0.8.0-beta.2":"2018-04-23T21:32:33.923Z","0.8.0-beta.3":"2018-04-24T10:30:28.463Z","0.8.0-beta.4":"2018-04-24T10:36:23.665Z","0.8.0-beta.5":"2018-04-24T11:15:06.093Z","0.8.0-beta.6":"2018-04-24T11:22:42.625Z","0.8.0-beta.7":"2018-04-24T22:52:26.660Z","0.8.0-beta.8":"2018-04-25T22:26:29.488Z","0.8.0-beta.9":"2018-04-26T17:43:25.699Z","0.8.0":"2018-04-26T19:46:13.726Z","0.9.0-beta.1":"2018-07-03T17:28:31.062Z","0.9.0":"2018-07-05T22:38:07.770Z","0.9.1":"2018-07-05T22:50:15.813Z","0.9.2":"2018-07-12T23:36:00.302Z","0.9.3":"2018-09-11T22:19:01.006Z","0.10.0-beta.1":"2018-09-14T01:27:56.247Z","0.10.0-beta.2":"2018-09-18T00:25:54.426Z","0.10.0-beta.3":"2018-10-08T23:02:47.748Z","0.10.0-beta.4":"2018-10-10T22:32:44.669Z","0.10.0-beta.5":"2018-10-13T14:46:42.604Z","0.10.0":"2018-10-16T20:18:19.839Z","0.10.0-beta.6":"2018-10-16T20:25:41.854Z","0.10.0-beta.7":"2018-10-16T20:29:15.547Z","0.11.0-beta.1":"2019-01-05T14:20:49.699Z","0.11.0-beta.2":"2019-01-05T15:22:27.170Z","0.11.0":"2019-01-05T16:20:19.213Z","0.12.0":"2019-03-20T23:34:03.361Z","0.13.0-beta.1":"2019-03-27T01:03:03.309Z","0.13.0-beta.2":"2019-06-20T21:38:28.678Z","0.13.0-beta.3":"2019-06-20T22:05:32.168Z","0.13.0-beta.4":"2019-06-21T17:27:07.591Z","0.13.0":"2019-06-25T00:31:51.616Z","0.14.0":"2019-09-24T22:26:13.314Z","0.14.1-beta.1":"2019-09-24T23:06:14.829Z","0.14.1":"2020-02-27T23:36:07.872Z","0.14.2":"2020-02-28T01:02:34.426Z","0.14.3-beta.1":"2020-03-02T19:30:53.014Z","0.14.3-beta.2":"2020-03-02T19:53:16.238Z","0.14.3-beta.3":"2020-03-03T00:21:24.467Z","0.14.3-beta.4":"2020-03-03T01:05:50.141Z","0.14.3-beta.5":"2020-03-03T19:50:14.325Z","0.14.3-beta.6":"2020-03-03T23:57:14.321Z","0.15.0":"2020-03-05T19:04:19.765Z","0.15.1":"2020-10-14T23:37:07.288Z","0.15.2":"2020-10-19T22:36:42.240Z","0.16.0-beta.1":"2020-10-22T13:50:25.906Z","0.16.0":"2020-10-22T15:27:27.838Z","0.16.1-beta.1":"2020-10-23T00:05:51.677Z","0.16.1":"2021-05-06T07:36:13.085Z","0.17.0":"2021-05-16T19:01:26.641Z","0.18.0-beta.1":"2021-05-17T07:13:09.215Z","0.18.0-beta.2":"2021-05-17T07:54:33.924Z","0.18.0":"2021-05-20T17:56:40.083Z","0.19.0-beta.1":"2022-07-12T16:11:31.448Z","0.19.0-beta.2":"2022-07-21T18:32:46.355Z","0.19.0":"2022-07-21T20:02:34.286Z","0.19.1":"2022-07-21T22:32:40.387Z"},"repository":{"type":"git","url":"git+https://github.com/tkrotoff/react-form-with-constraints.git"},"license":"MIT","readmeFilename":"","keywords":["react","form","validation","form-validation","input-validation","constraints","html5"],"homepage":"https://github.com/tkrotoff/react-form-with-constraints#readme","bugs":{"url":"https://github.com/tkrotoff/react-form-with-constraints/issues"}}