diff --git a/README.md b/README.md
index d34d180b..3c1c3205 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
✅ Opt-in subscriptions - only update on the state you need!
-✅ 💥 [**2.8k gzipped**](https://bundlephobia.com/result?p=react-final-form) 💥
+✅ 💥 [**3.0k gzipped**](https://bundlephobia.com/result?p=react-final-form) 💥
---
@@ -532,11 +532,11 @@ well as any non-API props passed into the ` ` component.
_**Before using this prop, read and understand the 🏁 Final Form documentation on [`initialValue`](https://github.com/final-form/final-form#initialvalue-any) and [`defaultValue`](https://github.com/final-form/final-form#defaultvalue-any)!**_
-#### `format?: ((value: any, name: string) => any) | null`
+#### `format?: ((value: any, name: string) => any)`
A function that takes the value from the form values and the name of the field and formats the value to give to the input. Common use cases include converting javascript `Date` values into a localized date string. Almost always used in conjunction with `parse`.
-**Note: If you pass `null` to `format`, it will override the default behavior of converting `undefined` into `''`. If you do this, making sure your inputs are "controlled" is up to you.**
+**Note: If you would like to disable the default behavior of converting `undefined` to `''`, you can pass an [identity function](https://en.wikipedia.org/wiki/Identity_function), `v => v`, to `format`. If you do this, making sure your inputs are "controlled" is up to you.**
#### `formatOnBlur?: boolean`
@@ -554,11 +554,11 @@ If `true`, the `format` function will only be called when the field is blurred.
The name of your field. Field values may be deeply nested using dot-and-bracket syntax. [Learn more about Field Names](https://github.com/final-form/final-form#field-names).
-#### `parse?: ((value: any, name: string) => any) | null`
+#### `parse?: ((value: any, name: string) => any)`
A function that takes the value from the input and name of the field and converts the value into the value you want stored as this field's value in the form. Common usecases include converting strings into `Number`s or parsing localized dates into actual javascript `Date` objects. Almost always used in conjuction with `format`.
-**Note: If you pass `null` to `parse`, it will override the default behavior of converting `''` into `undefined`, thus allowing you to have form values of `''`.**
+**Note: If would like to override the default behavior of converting `''` to `undefined`, you can pass an [identity function](https://en.wikipedia.org/wiki/Identity_function), `v => v`, to `parse`, thus allowing you to have form values of `''`.**
#### `render?: (props: FieldRenderProps) => React.Node`
diff --git a/package-lock.json b/package-lock.json
index d4d9c86d..b172c1bc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,17 +14,17 @@
}
},
"@babel/core": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.4.tgz",
- "integrity": "sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
+ "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@babel/generator": "^7.4.4",
"@babel/helpers": "^7.4.4",
- "@babel/parser": "^7.4.4",
+ "@babel/parser": "^7.4.5",
"@babel/template": "^7.4.4",
- "@babel/traverse": "^7.4.4",
+ "@babel/traverse": "^7.4.5",
"@babel/types": "^7.4.4",
"convert-source-map": "^1.1.0",
"debug": "^4.1.0",
@@ -33,6 +33,31 @@
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "@babel/parser": {
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz",
+ "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==",
+ "dev": true
+ },
+ "@babel/traverse": {
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz",
+ "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.4.4",
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.4.4",
+ "@babel/parser": "^7.4.5",
+ "@babel/types": "^7.4.4",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.11"
+ }
+ }
}
},
"@babel/generator": {
@@ -715,12 +740,12 @@
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz",
- "integrity": "sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
+ "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
"dev": true,
"requires": {
- "regexp-tree": "^0.1.0"
+ "regexp-tree": "^0.1.6"
}
},
"@babel/plugin-transform-new-target": {
@@ -803,12 +828,12 @@
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz",
- "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
+ "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
"dev": true,
"requires": {
- "regenerator-transform": "^0.13.4"
+ "regenerator-transform": "^0.14.0"
}
},
"@babel/plugin-transform-reserved-words": {
@@ -891,9 +916,9 @@
}
},
"@babel/preset-env": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.4.tgz",
- "integrity": "sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
+ "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
@@ -925,12 +950,12 @@
"@babel/plugin-transform-modules-commonjs": "^7.4.4",
"@babel/plugin-transform-modules-systemjs": "^7.4.4",
"@babel/plugin-transform-modules-umd": "^7.2.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
"@babel/plugin-transform-new-target": "^7.4.4",
"@babel/plugin-transform-object-super": "^7.2.0",
"@babel/plugin-transform-parameters": "^7.4.4",
"@babel/plugin-transform-property-literals": "^7.2.0",
- "@babel/plugin-transform-regenerator": "^7.4.4",
+ "@babel/plugin-transform-regenerator": "^7.4.5",
"@babel/plugin-transform-reserved-words": "^7.2.0",
"@babel/plugin-transform-shorthand-properties": "^7.2.0",
"@babel/plugin-transform-spread": "^7.2.0",
@@ -939,8 +964,8 @@
"@babel/plugin-transform-typeof-symbol": "^7.2.0",
"@babel/plugin-transform-unicode-regex": "^7.4.4",
"@babel/types": "^7.4.4",
- "browserslist": "^4.5.2",
- "core-js-compat": "^3.0.0",
+ "browserslist": "^4.6.0",
+ "core-js-compat": "^3.1.1",
"invariant": "^2.2.2",
"js-levenshtein": "^1.1.3",
"semver": "^5.5.0"
@@ -970,9 +995,9 @@
}
},
"@babel/runtime": {
- "version": "7.4.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.4.tgz",
- "integrity": "sha512-w0+uT71b6Yi7i5SE0co4NioIpSYS6lLiXvCzWzGSKvpK5vdQtCbICHMj+gbAKAOtxiV6HsVh/MBdaF9EQ6faSg==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz",
+ "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==",
"requires": {
"regenerator-runtime": "^0.13.2"
}
@@ -1383,9 +1408,9 @@
"dev": true
},
"@types/react": {
- "version": "16.8.17",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.17.tgz",
- "integrity": "sha512-pln3mgc6VfkNg92WXODul/ONo140huK9OMsx62GlBlZ2lvjNK86PQJhYMPLO1i66aF5O9OPyZefogvNltBIszA==",
+ "version": "16.8.18",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.18.tgz",
+ "integrity": "sha512-lUXdKzRqWR4FebR5tGHkLCqnvQJS4fdXKCBrNGGbglqZg2gpU+J82pMONevQODUotATs9fc9k66bx3/St8vReg==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@@ -1701,12 +1726,12 @@
"dev": true
},
"axios": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz",
- "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=",
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
+ "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
"dev": true,
"requires": {
- "follow-redirects": "^1.2.5",
+ "follow-redirects": "^1.3.0",
"is-buffer": "^1.1.5"
}
},
@@ -1981,15 +2006,6 @@
"integrity": "sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=",
"dev": true
},
- "block-stream": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
- "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
- "dev": true,
- "requires": {
- "inherits": "~2.0.0"
- }
- },
"boolify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/boolify/-/boolify-1.0.1.tgz",
@@ -2042,13 +2058,13 @@
}
},
"brotli-size": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-0.0.1.tgz",
- "integrity": "sha1-jBruoBzSLzWbBIlRGFvVOf8Mgp8=",
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-0.1.0.tgz",
+ "integrity": "sha512-5ny7BNvpe2TSmdafF1T9dnFYp3AIrJ8qJt29K0DQJzORlK38LBim/CmlY26JtreV6SWmXza7Oa+9m61SzvxR0Q==",
"dev": true,
"requires": {
"duplexer": "^0.1.1",
- "iltorb": "^1.0.9"
+ "iltorb": "^2.4.3"
}
},
"browser-process-hrtime": {
@@ -2075,14 +2091,14 @@
}
},
"browserslist": {
- "version": "4.5.6",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.6.tgz",
- "integrity": "sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg==",
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.0.tgz",
+ "integrity": "sha512-Jk0YFwXBuMOOol8n6FhgkDzn3mY9PYLYGk29zybF05SbRTsMgPqmTNeQQhOghCxq5oFqAXE3u4sYddr4C0uRhg==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30000963",
- "electron-to-chromium": "^1.3.127",
- "node-releases": "^1.1.17"
+ "caniuse-lite": "^1.0.30000967",
+ "electron-to-chromium": "^1.3.133",
+ "node-releases": "^1.1.19"
}
},
"bser": {
@@ -2129,18 +2145,18 @@
"dev": true
},
"bundlesize": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/bundlesize/-/bundlesize-0.17.1.tgz",
- "integrity": "sha512-p5I5Tpoug9aOVGg4kQETMJ8xquY66mX9XI19kXkkAFnmDhDXwSF+1jq1OjBGz7h27TAulM3k2wLEJPvickTt0A==",
+ "version": "0.17.2",
+ "resolved": "https://registry.npmjs.org/bundlesize/-/bundlesize-0.17.2.tgz",
+ "integrity": "sha512-cJAZ6wvs6IHQCnUn9kTme4GL+ahoICjcS0QPcGTj61Hl4bCc8wKkkVLUote4k/1yxa0+kUIrIo9wyNJ+XIciEw==",
"dev": true,
"requires": {
- "axios": "^0.17.0",
- "brotli-size": "0.0.1",
- "bytes": "^3.0.0",
+ "axios": "^0.18.0",
+ "brotli-size": "0.1.0",
+ "bytes": "^3.1.0",
"ci-env": "^1.4.0",
- "commander": "^2.11.0",
+ "commander": "^2.20.0",
"github-build": "^1.2.0",
- "glob": "^7.1.2",
+ "glob": "^7.1.4",
"gzip-size": "^4.0.0",
"prettycli": "^1.4.3",
"read-pkg-up": "^3.0.0"
@@ -2282,9 +2298,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30000967",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz",
- "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==",
+ "version": "1.0.30000971",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000971.tgz",
+ "integrity": "sha512-TQFYFhRS0O5rdsmSbF1Wn+16latXYsQJat66f7S7lizXW1PVpWJeZw9wqqVLIjuxDRz7s7xRUj13QCfd8hKn6g==",
"dev": true
},
"capture-exit": {
@@ -2656,36 +2672,29 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
"dev": true
},
- "core-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz",
- "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==",
- "dev": true
- },
"core-js-compat": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz",
- "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.2.tgz",
+ "integrity": "sha512-X0Ch5f6itrHxhg5HSJucX6nNLNAGr+jq+biBh6nPGc3YAWz2a8p/ZIZY8cUkDzSRNG54omAuu3hoEF8qZbu/6Q==",
"dev": true,
"requires": {
- "browserslist": "^4.5.4",
- "core-js": "3.0.1",
- "core-js-pure": "3.0.1",
+ "browserslist": "^4.6.0",
+ "core-js-pure": "3.1.2",
"semver": "^6.0.0"
},
"dependencies": {
"semver": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz",
- "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz",
+ "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==",
"dev": true
}
}
},
"core-js-pure": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz",
- "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.2.tgz",
+ "integrity": "sha512-5ckIdBF26B3ldK9PM177y2ZcATP2oweam9RskHSoqfZCrJ2As6wVg8zJ1zTriFsZf6clj/N1ThDFRGaomMsh9w==",
"dev": true
},
"core-util-is": {
@@ -3428,9 +3437,9 @@
"dev": true
},
"detect-libc": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-0.2.0.tgz",
- "integrity": "sha1-R/31ZzSKF+wl/L8LnkRjSKdvn7U=",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true
},
"detect-newline": {
@@ -3491,9 +3500,9 @@
}
},
"dom-testing-library": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-4.1.0.tgz",
- "integrity": "sha512-654GHd0oPC31S+ll1bJH9NUOBRzcHcrf23/XzJh41o6g67uGUpF9tn23qmbcwjNauoRqKQfAdHCDwr/Ez/Ot7A==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/dom-testing-library/-/dom-testing-library-4.1.1.tgz",
+ "integrity": "sha512-PUsG7aY5BJxzulDrOtkksqudRRypcVQF6d4RGAyj9xNwallOFqrNLOyg2QW2mCpFaNVPELX8hBX/wbHQtOto/A==",
"dev": true,
"requires": {
"@babel/runtime": "^7.4.3",
@@ -3543,29 +3552,41 @@
"dev": true
},
"dts-critic": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-1.0.9.tgz",
- "integrity": "sha512-fUh7YSqC+usC0r4pnslxPr02XB9txKEvk/4drxAbSNx1CZDHSkpIAXlTSp6zAz1dBM09/qakRsAsr3r6zKNl2Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-1.1.0.tgz",
+ "integrity": "sha512-Z1rAdNEP+BEEu3dIX+/SwEiN1THafnazLXqGcnsZ2vRIX9xxEQmpj6eCixKhD5iDvDG9Zbz07gP3PcK8zOOOow==",
"dev": true,
"requires": {
- "definitelytyped-header-parser": "^1.0.1",
+ "definitelytyped-header-parser": "^1.2.0",
"download-file-sync": "^1.0.4",
"yargs": "^12.0.5"
+ },
+ "dependencies": {
+ "definitelytyped-header-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/definitelytyped-header-parser/-/definitelytyped-header-parser-1.2.0.tgz",
+ "integrity": "sha512-xpg8uu/2YD/reaVsZV4oJ4g7UDYFqQGWvT1W9Tsj6q4VtWBSaig38Qgah0ZMnQGF9kAsAim08EXDO1nSi0+Nog==",
+ "dev": true,
+ "requires": {
+ "@types/parsimmon": "^1.3.0",
+ "parsimmon": "^1.2.0"
+ }
+ }
}
},
"dtslint": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-0.7.3.tgz",
- "integrity": "sha512-l4VEoeLfykG1k+ryWo7CqSAbauoqKbmJo72T/CvB15Em9kBys3tt0dhVmJcWCZmFVaBsdMmNydgyg0FepyoCNw==",
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-0.7.6.tgz",
+ "integrity": "sha512-QmD66NTHMQ1qf/nRp06gl1DBhY19PXGNVi+FTsaFhDtUTNOma1LSqbldKot+MBB+eEfw9YoUelNxZGJt+SU45Q==",
"dev": true,
"requires": {
- "definitelytyped-header-parser": "^1.0.1",
+ "definitelytyped-header-parser": "1.1.0",
"dts-critic": "^1.0.9",
"fs-extra": "^6.0.1",
"request": "^2.88.0",
"strip-json-comments": "^2.0.1",
"tslint": "5.14.0",
- "typescript": "^3.5.0-dev.20190524"
+ "typescript": "^3.5.0-dev.20190525"
},
"dependencies": {
"tslint": {
@@ -3590,9 +3611,9 @@
}
},
"typescript": {
- "version": "3.5.0-dev.20190524",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.0-dev.20190524.tgz",
- "integrity": "sha512-EVq7zfcfHRXyPZiCBuc2Wbbx7i87GdBLwcq3aO1lrRlQbJ9clztVfU4ur0gHBpVZNXXQFbjbYQcCMUMcqTvPZQ==",
+ "version": "3.5.0-dev.20190525",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.0-dev.20190525.tgz",
+ "integrity": "sha512-+EhVvwjYE3bLN3yc5kZHylvyqRB86oqWpO2XrYImi89ErqddhNx28ms50Gt8r3dzK4LUpEUWR9p/bL1I4L8sfw==",
"dev": true
}
}
@@ -3614,9 +3635,9 @@
}
},
"electron-to-chromium": {
- "version": "1.3.133",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz",
- "integrity": "sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg==",
+ "version": "1.3.137",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.137.tgz",
+ "integrity": "sha512-kGi32g42a8vS/WnYE7ELJyejRT7hbr3UeOOu0WeuYuQ29gCpg9Lrf6RdcTQVXSt/v0bjCfnlb/EWOOsiKpTmkw==",
"dev": true
},
"elegant-spinner": {
@@ -3867,18 +3888,18 @@
}
},
"eslint-plugin-flowtype": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.9.0.tgz",
- "integrity": "sha512-g5CMBJx0dagvOOYLo0ws5Y4+Ma8BBDtgQU+AkjL3W0z8LJUsGL2avY2/bsTZS69qzEA+G7qWKleI1aZp6QNBBw==",
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.9.1.tgz",
+ "integrity": "sha512-ZlV6SbIXqz2ysvG0F64ZH07dqzLrwMdM1s0UNfoxdXjr4kMKuPPoLViwK+gFC952QIf341AmP4BKtKOhcB96Ug==",
"dev": true,
"requires": {
"lodash": "^4.17.11"
}
},
"eslint-plugin-import": {
- "version": "2.17.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.2.tgz",
- "integrity": "sha512-m+cSVxM7oLsIpmwNn2WXTJoReOF9f/CtLMo7qOVmKd1KntBy0hEcuNZ3erTmWjx+DxRO0Zcrm5KwAvI9wHcV5g==",
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz",
+ "integrity": "sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==",
"dev": true,
"requires": {
"array-includes": "^3.0.3",
@@ -3891,7 +3912,7 @@
"lodash": "^4.17.11",
"minimatch": "^3.0.4",
"read-pkg-up": "^2.0.0",
- "resolve": "^1.10.0"
+ "resolve": "^1.11.0"
},
"dependencies": {
"debug": {
@@ -4018,6 +4039,15 @@
"find-up": "^2.0.0",
"read-pkg": "^2.0.0"
}
+ },
+ "resolve": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
+ "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
}
}
},
@@ -4251,9 +4281,9 @@
}
},
"expand-template": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz",
- "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"dev": true
},
"expect": {
@@ -5225,18 +5255,6 @@
}
}
},
- "fstream": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
- "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "inherits": "~2.0.0",
- "mkdirp": ">=0.5 0",
- "rimraf": "2"
- }
- },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -5753,15 +5771,16 @@
"dev": true
},
"iltorb": {
- "version": "1.3.10",
- "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-1.3.10.tgz",
- "integrity": "sha512-nyB4+ru1u8CQqQ6w7YjasboKN3NQTN8GH/V/eEssNRKhW6UbdxdWhB9fJ5EEdjJfezKY0qPrcwLyIcgjL8hHxA==",
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-2.4.3.tgz",
+ "integrity": "sha512-cr/kC07Cf9sW3TWH7yUxV2QkNjby4LMCsXGmxPCQs5x//QzTpF3GLPNY7L66G+DkNGaTRCgY+vYZ+dyAcuDOnQ==",
"dev": true,
"requires": {
- "detect-libc": "^0.2.0",
- "nan": "^2.6.2",
- "node-gyp": "^3.6.2",
- "prebuild-install": "^2.3.0"
+ "detect-libc": "^1.0.3",
+ "nan": "^2.13.2",
+ "npmlog": "^4.1.2",
+ "prebuild-install": "^5.3.0",
+ "which-pm-runs": "^1.0.0"
}
},
"import-fresh": {
@@ -6466,9 +6485,9 @@
}
},
"jest-dom": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-3.2.2.tgz",
- "integrity": "sha512-Fnq3Y6d0MoDAJV8pAXkqe/e4VTBihRGaJypXvaHTLL9oRYzOvz0Q04evi5SBwPQ7FBiujQQOPXoEgEBGTg5BaA==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/jest-dom/-/jest-dom-3.4.0.tgz",
+ "integrity": "sha512-fQR5ESaxTfNbZE02y+gtaQH7+sMwzrQtJo5OE0E3BNArjTL9GWNI+uPFr1yS24eodH1X62L+qncv106M/O98gQ==",
"dev": true,
"requires": {
"chalk": "^2.4.1",
@@ -6618,9 +6637,9 @@
}
},
"jest-mock-console": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/jest-mock-console/-/jest-mock-console-0.4.2.tgz",
- "integrity": "sha512-24ryiWYf/pmvOLlelLg4+K2umMI4IFcLls1hluJzs22jGVXzdqpfcMMSXaWdAzbTJ+C0qlSdvj06fqvqFyRO1A==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jest-mock-console/-/jest-mock-console-1.0.0.tgz",
+ "integrity": "sha512-bN9UjH+Jd/5Gs+p9Xt9Mai4SoUQRFd3f+ZOSCjlcbuVRUhNvl1y9jvys6L7BUx+1Uz+3jOoaq1O+C6j3sSu7SQ==",
"dev": true
},
"jest-pnp-resolver": {
@@ -7767,6 +7786,12 @@
"to-regex": "^3.0.1"
}
},
+ "napi-build-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz",
+ "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==",
+ "dev": true
+ },
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -7819,45 +7844,6 @@
"is-stream": "^1.0.1"
}
},
- "node-gyp": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
- "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
- "dev": true,
- "requires": {
- "fstream": "^1.0.0",
- "glob": "^7.0.3",
- "graceful-fs": "^4.1.2",
- "mkdirp": "^0.5.0",
- "nopt": "2 || 3",
- "npmlog": "0 || 1 || 2 || 3 || 4",
- "osenv": "0",
- "request": "^2.87.0",
- "rimraf": "2",
- "semver": "~5.3.0",
- "tar": "^2.0.0",
- "which": "1"
- },
- "dependencies": {
- "semver": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
- "dev": true
- },
- "tar": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
- "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
- "dev": true,
- "requires": {
- "block-stream": "*",
- "fstream": "^1.0.2",
- "inherits": "2"
- }
- }
- }
- },
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -7884,9 +7870,9 @@
}
},
"node-releases": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.19.tgz",
- "integrity": "sha512-SH/B4WwovHbulIALsQllAVwqZZD1kPmKCqrhGfR29dXjLAVZMHvBjD3S6nL9D/J9QkmZ1R92/0wCMDKXUUvyyA==",
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.21.tgz",
+ "integrity": "sha512-TwnURTCjc8a+ElJUjmDqU6+12jhli1Q61xOQmdZ7ECZVBZuQpN/1UnembiIHDM1wCcfLvh5wrWXUF5H6ufX64Q==",
"dev": true,
"requires": {
"semver": "^5.3.0"
@@ -8800,16 +8786,6 @@
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
"p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
@@ -9096,34 +9072,29 @@
"dev": true
},
"prebuild-install": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.3.tgz",
- "integrity": "sha512-/rI36cN2g7vDQnKWN8Uzupi++KjyqS9iS+/fpwG4Ea8d0Pip0PQ5bshUNzVwt+/D2MRfhVAplYMMvWLqWrCF/g==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.0.tgz",
+ "integrity": "sha512-aaLVANlj4HgZweKttFNUVNRxDukytuIuxeK2boIMHjagNJCiVKWFsKF4tCE3ql3GbrD2tExPQ7/pwtEJcHNZeg==",
"dev": true,
"requires": {
"detect-libc": "^1.0.3",
- "expand-template": "^1.0.2",
+ "expand-template": "^2.0.3",
"github-from-package": "0.0.0",
"minimist": "^1.2.0",
"mkdirp": "^0.5.1",
- "node-abi": "^2.2.0",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^2.7.0",
"noop-logger": "^0.1.1",
"npmlog": "^4.0.1",
"os-homedir": "^1.0.1",
"pump": "^2.0.1",
- "rc": "^1.1.6",
+ "rc": "^1.2.7",
"simple-get": "^2.7.0",
"tar-fs": "^1.13.0",
"tunnel-agent": "^0.6.0",
"which-pm-runs": "^1.0.0"
},
"dependencies": {
- "detect-libc": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
- "dev": true
- },
"pump": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
@@ -10202,13 +10173,13 @@
"dev": true
},
"react-testing-library": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-7.0.0.tgz",
- "integrity": "sha512-8SHqwG+uhN9VhAgNVkVa3f7VjTw/L5CIaoAxKmy+EZuDQ6O+VsfcpRAyUw3MDL1h8S/gGrEiazmHBVL/uXsftA==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/react-testing-library/-/react-testing-library-7.0.1.tgz",
+ "integrity": "sha512-doQkM3/xPcIm22x9jgTkGxU8xqXg4iWvM1WwbbQ7CI5/EMk3DhloYBwMyk+Ywtta3dIAIh9sC7llXoKovf3L+w==",
"dev": true,
"requires": {
"@babel/runtime": "^7.4.3",
- "dom-testing-library": "^4.0.0"
+ "dom-testing-library": "^4.1.0"
}
},
"read-pkg": {
@@ -10304,9 +10275,9 @@
"integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
},
"regenerator-transform": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz",
- "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz",
+ "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==",
"dev": true,
"requires": {
"private": "^0.1.6"
@@ -10323,9 +10294,9 @@
}
},
"regexp-tree": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.6.tgz",
- "integrity": "sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w==",
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz",
+ "integrity": "sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==",
"dev": true
},
"regexpp": {
@@ -10606,9 +10577,9 @@
}
},
"rollup": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.12.1.tgz",
- "integrity": "sha512-6CL0c+HxqEY9/8G+7mYIvor0tt60mVC64410/1DeaGWZCFAvcY8ClT0bsnTxECd6vR004CMm0X2yBZmod5gWjw==",
+ "version": "1.12.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.12.4.tgz",
+ "integrity": "sha512-sHg0F05oTMJzM592MWU8irsPx8LIFMKSCnEkcp6vp/gnj+oJ9GJEBW9hl8jUqy2L6Q2uUxFzPgvoExLbfuSODA==",
"dev": true,
"requires": {
"@types/estree": "0.0.39",
@@ -12216,9 +12187,9 @@
}
},
"wait-for-expect": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.1.1.tgz",
- "integrity": "sha512-vd9JOqqEcBbCDhARWhW85ecjaEcfBLuXgVBqatfS3iw6oU4kzAcs+sCNjF+TC9YHPImCW7ypsuQc+htscIAQCw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-1.2.0.tgz",
+ "integrity": "sha512-EJhKpA+5UHixduMBEGhTFuLuVgQBKWxkFbefOdj2bbk2/OpA5Opsc4aUTGmF+qJ+v3kTGxDRNYwKaT4j6g5n8Q==",
"dev": true
},
"walker": {
diff --git a/package.json b/package.json
index 62415524..ad167f4c 100644
--- a/package.json
+++ b/package.json
@@ -30,7 +30,7 @@
},
"homepage": "https://github.com/final-form/react-final-form#readme",
"devDependencies": {
- "@babel/core": "^7.4.4",
+ "@babel/core": "^7.4.5",
"@babel/plugin-proposal-class-properties": "^7.4.4",
"@babel/plugin-proposal-decorators": "^7.4.4",
"@babel/plugin-proposal-export-namespace-from": "^7.2.0",
@@ -42,21 +42,21 @@
"@babel/plugin-syntax-import-meta": "^7.2.0",
"@babel/plugin-transform-flow-strip-types": "^7.4.4",
"@babel/plugin-transform-runtime": "^7.4.4",
- "@babel/preset-env": "^7.4.4",
+ "@babel/preset-env": "^7.4.5",
"@babel/preset-flow": "^7.0.0",
"@babel/preset-react": "^7.0.0",
- "@types/react": "^16.8.17",
+ "@types/react": "^16.8.18",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.0.1",
"babel-jest": "^24.8.0",
- "bundlesize": "^0.17.1",
+ "bundlesize": "^0.17.2",
"doctoc": "^1.4.0",
- "dtslint": "^0.7.3",
+ "dtslint": "^0.7.6",
"eslint": "^5.16.0",
"eslint-config-react-app": "^4.0.0",
"eslint-plugin-babel": "^5.2.1",
- "eslint-plugin-flowtype": "^3.9.0",
- "eslint-plugin-import": "^2.17.2",
+ "eslint-plugin-flowtype": "^3.9.1",
+ "eslint-plugin-import": "^2.17.3",
"eslint-plugin-jsx-a11y": "^6.2.1",
"eslint-plugin-react": "^7.13.0",
"eslint-plugin-react-hooks": "^1.6.0",
@@ -66,8 +66,8 @@
"glow": "^1.2.2",
"husky": "^2.3.0",
"jest": "^24.8.0",
- "jest-dom": "^3.2.2",
- "jest-mock-console": "^0.4.2",
+ "jest-dom": "^3.4.0",
+ "jest-mock-console": "^1.0.0",
"lint-staged": "^8.1.7",
"nps": "^5.9.4",
"nps-utils": "^1.7.0",
@@ -76,8 +76,8 @@
"prettier-eslint-cli": "^4.7.1",
"react": "^16.8.6",
"react-dom": "^16.8.6",
- "react-testing-library": "^7.0.0",
- "rollup": "^1.12.1",
+ "react-testing-library": "^7.0.1",
+ "rollup": "^1.12.4",
"rollup-plugin-babel": "^4.3.2",
"rollup-plugin-commonjs": "^10.0.0",
"rollup-plugin-node-resolve": "^5.0.0",
@@ -122,7 +122,7 @@
"url": "https://opencollective.com/final-form"
},
"dependencies": {
- "@babel/runtime": "^7.4.4",
+ "@babel/runtime": "^7.4.5",
"ts-essentials": "^2.0.2"
}
}
diff --git a/src/Field.test.js b/src/Field.test.js
index a0e6a5e5..cf8cd481 100644
--- a/src/Field.test.js
+++ b/src/Field.test.js
@@ -21,7 +21,7 @@ describe('Field', () => {
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Warning: useField must be used inside of a
+ )
+ })
+
it('should accept a null format prop to preserve undefined values', () => {
const spy = jest.fn()
const { getByTestId } = render(
{() => (
-
+ v}>
{wrapWith(spy, ({ input: { value, ...props } }) => (
{
})
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0]).toBe(
- 'Warning: You must pass `type="checkbox"` prop to your Field(checkboxInput) component.\n' +
+ 'You must pass `type="checkbox"` prop to your Field(checkboxInput) component.\n' +
'Without it we don\'t know how to unpack your `value` prop - "checkboxValue".'
)
fireEvent.click(getByTestId('radio'), {
@@ -790,7 +809,7 @@ describe('Field', () => {
})
expect(errorSpy).toHaveBeenCalledTimes(2)
expect(errorSpy.mock.calls[1][0]).toBe(
- 'Warning: You must pass `type="radio"` prop to your Field(radioInput) component.\n' +
+ 'You must pass `type="radio"` prop to your Field(radioInput) component.\n' +
'Without it we don\'t know how to unpack your `value` prop - "radioValue".'
)
fireEvent.change(getByTestId('select'), {
@@ -798,7 +817,7 @@ describe('Field', () => {
})
expect(errorSpy).toHaveBeenCalledTimes(3)
expect(errorSpy.mock.calls[2][0]).toBe(
- 'Warning: You must pass `type="select"` prop to your Field(selectMultipleInput) component.\n' +
+ 'You must pass `type="select"` prop to your Field(selectMultipleInput) component.\n' +
"Without it we don't know how to unpack your `value` prop - []."
)
errorSpy.mockRestore()
diff --git a/src/FormSpy.js b/src/FormSpy.js
index 7c72ff7f..720f2c7b 100644
--- a/src/FormSpy.js
+++ b/src/FormSpy.js
@@ -10,9 +10,7 @@ import ReactFinalFormContext from './context'
const FormSpy = ({ onChange, subscription, ...rest }: Props) => {
const reactFinalForm: ?FormApi = React.useContext(ReactFinalFormContext)
if (!reactFinalForm) {
- throw new Error(
- 'Warning: FormSpy must be used inside of a ReactFinalForm component'
- )
+ throw new Error('FormSpy must be used inside of a ReactFinalForm component')
}
const state = useFormState({ onChange, subscription })
if (onChange) {
diff --git a/src/FormSpy.test.js b/src/FormSpy.test.js
index 97440aab..77f51607 100644
--- a/src/FormSpy.test.js
+++ b/src/FormSpy.test.js
@@ -31,7 +31,7 @@ describe('FormSpy', () => {
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Warning: FormSpy must be used inside of a ReactFinalForm component'
+ 'FormSpy must be used inside of a ReactFinalForm component'
)
console.error.mockRestore()
})
diff --git a/src/ReactFinalForm.js b/src/ReactFinalForm.js
index 55ca0ed8..cc6d29f4 100644
--- a/src/ReactFinalForm.js
+++ b/src/ReactFinalForm.js
@@ -117,7 +117,7 @@ const ReactFinalForm = ({
decorators,
() => {
console.error(
- 'Warning: Form decorators should not change from one render to the next as new values will be ignored'
+ 'Form decorators should not change from one render to the next as new values will be ignored'
)
},
shallowEqual
diff --git a/src/ReactFinalForm.test.js b/src/ReactFinalForm.test.js
index 836b06db..f90163a3 100644
--- a/src/ReactFinalForm.test.js
+++ b/src/ReactFinalForm.test.js
@@ -30,13 +30,19 @@ describe('ReactFinalForm', () => {
})
it('should print a warning with no render or children specified', () => {
- const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
- render( )
+ jest.spyOn(console, 'error').mockImplementation(() => {})
+ const errorSpy = jest.fn()
+ render(
+
+
+
+ )
expect(errorSpy).toHaveBeenCalled()
- expect(errorSpy).toHaveBeenCalledWith(
- 'Warning: Must specify either a render prop, a render function as children, or a component prop to ReactFinalForm'
+ expect(errorSpy).toHaveBeenCalledTimes(1)
+ expect(errorSpy.mock.calls[0][0].message).toBe(
+ 'Must specify either a render prop, a render function as children, or a component prop to ReactFinalForm'
)
- errorSpy.mockRestore()
+ console.error.mockRestore()
})
it('should print a warning with no onSubmit specified', () => {
@@ -484,7 +490,7 @@ describe('ReactFinalForm', () => {
fireEvent.click(getByText('Toggle'))
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledWith(
- 'Warning: Form decorators should not change from one render to the next as new values will be ignored'
+ 'Form decorators should not change from one render to the next as new values will be ignored'
)
errorSpy.mockRestore()
})
diff --git a/src/renderComponent.js b/src/renderComponent.js
index 770020c7..29e0a4d9 100644
--- a/src/renderComponent.js
+++ b/src/renderComponent.js
@@ -16,13 +16,9 @@ export default function renderComponent(
return render(children === undefined ? rest : { ...rest, children }) // inject children back in
}
if (typeof children !== 'function') {
- // istanbul ignore next
- if (process.env.NODE_ENV !== 'production') {
- console.error(
- `Warning: Must specify either a render prop, a render function as children, or a component prop to ${name}`
- )
- }
- return null // warning will alert developer to their mistake
+ throw new Error(
+ `Must specify either a render prop, a render function as children, or a component prop to ${name}`
+ )
}
return children(rest)
}
diff --git a/src/useField.js b/src/useField.js
index 5d412e5f..3d5dc6a2 100644
--- a/src/useField.js
+++ b/src/useField.js
@@ -73,7 +73,7 @@ const useField = (
)
beforeSubmitRef.current = () => {
- if (format && formatOnBlur) {
+ if (formatOnBlur) {
const formatted = format(state.value, state.name)
if (formatted !== state.value) {
state.change(formatted)
@@ -112,7 +112,7 @@ const useField = (
onBlur: React.useCallback(
(event: ?SyntheticFocusEvent<*>) => {
state.blur()
- if (format && formatOnBlur) {
+ if (formatOnBlur) {
state.change(format(state.value, state.name))
}
},
@@ -133,7 +133,7 @@ const useField = (
if (unknown) {
console.error(
- `Warning: You must pass \`type="${
+ `You must pass \`type="${
targetType === 'select-multiple' ? 'select' : targetType
}"\` prop to your Field(${name}) component.\n` +
`Without it we don't know how to unpack your \`value\` prop - ${
@@ -147,7 +147,7 @@ const useField = (
event && event.target
? getValue(event, state.value, _value, isReactNative)
: event
- state.change(parse ? parse(value, name) : value)
+ state.change(parse(value, name))
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[_value, name, parse, state.change, state.value, type]
@@ -180,8 +180,10 @@ const useField = (
visited: otherState.visited
}
if (formatOnBlur) {
- value = defaultFormat(value, name)
- } else if (format) {
+ if (component === 'input') {
+ value = defaultFormat(value, name)
+ }
+ } else {
value = format(value, name)
}
if (value === null && !allowNull) {
diff --git a/src/useField.test.js b/src/useField.test.js
index 82ba66f8..326d1d84 100644
--- a/src/useField.test.js
+++ b/src/useField.test.js
@@ -29,7 +29,7 @@ describe('useField', () => {
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Warning: useField must be used inside of a component'
+ 'useField must be used inside of a component'
)
console.error.mockRestore()
})
diff --git a/src/useForm.js b/src/useForm.js
index ab254237..233f89a1 100644
--- a/src/useForm.js
+++ b/src/useForm.js
@@ -7,8 +7,7 @@ const useForm = (componentName?: string): FormApi => {
const form: ?FormApi = React.useContext(ReactFinalFormContext)
if (!form) {
throw new Error(
- `Warning: ${componentName ||
- 'useForm'} must be used inside of a component`
+ `${componentName || 'useForm'} must be used inside of a component`
)
}
return form
diff --git a/src/useForm.test.js b/src/useForm.test.js
index 91745b7d..2cc78f27 100644
--- a/src/useForm.test.js
+++ b/src/useForm.test.js
@@ -25,7 +25,7 @@ describe('useForm', () => {
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Warning: useForm must be used inside of a component'
+ 'useForm must be used inside of a component'
)
console.error.mockRestore()
})
@@ -45,7 +45,7 @@ describe('useForm', () => {
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Warning: MyFormConsumer must be used inside of a component'
+ 'MyFormConsumer must be used inside of a component'
)
console.error.mockRestore()
})
diff --git a/src/useFormState.test.js b/src/useFormState.test.js
index 3527449e..71db6619 100644
--- a/src/useFormState.test.js
+++ b/src/useFormState.test.js
@@ -24,7 +24,7 @@ describe('useField', () => {
expect(errorSpy).toHaveBeenCalled()
expect(errorSpy).toHaveBeenCalledTimes(1)
expect(errorSpy.mock.calls[0][0].message).toBe(
- 'Warning: useFormState must be used inside of a component'
+ 'useFormState must be used inside of a component'
)
console.error.mockRestore()
})
diff --git a/typescript/index.d.ts b/typescript/index.d.ts
index 25442673..cae73aa1 100644
--- a/typescript/index.d.ts
+++ b/typescript/index.d.ts
@@ -66,12 +66,12 @@ export interface UseFieldConfig {
allowNull?: boolean;
beforeSubmit?: () => void | boolean;
defaultValue?: any;
- format?: ((value: any, name: string) => any) | null;
+ format?: (value: any, name: string) => any;
formatOnBlur?: boolean;
initialValue?: any;
isEqual?: (a: any, b: any) => boolean;
multiple?: boolean;
- parse?: ((value: any, name: string) => any) | null;
+ parse?: (value: any, name: string) => any;
subscription?: FieldSubscription;
type?: string;
validate?: FieldValidator;