Repository: dubzzz/fast-check
Pull request #1984 (2021-06-12 09:08:10)

✨ Async reporters can enrich the output with async data
<!-- Context of the PR: short description and potentially linked issues -->

<!-- ...a few words to describe the content of this PR...               -->
<!-- ... -->

<!-- Type of PR: [ ] unchecked / [ ] checked -->
**_Category:_**

- [x] ✨ Introduce new features
- [ ] 📝 Add or update documentation
- [ ] ✅ Add or update tests
- [ ] 🐛 Fix a bug
- [ ] 🏷️ Add or update types
- [ ] ⚡️ Improve performance
- [ ] _Other(s):_ ...
<!-- Don't forget to add the gitmoji icon in the name of the PR -->
<!-- See: https://gitmoji.dev/                                  -->

<!-- Fixing bugs, adding features... may impact existing ones           -->
<!-- in order to track potential issues that could be related to your PR -->
<!-- please check the impacts and describe more precisely what to expect -->

**_Potential impacts:_**

<!-- Generated values: Can your change impact any of the existing generators in terms of generated values, if so which ones? when? -->
<!-- Shrink values:    Can your change impact any of the existing generators in terms of shrink values, if so which ones? when? -->
<!-- Performance:      Can it require some typings changes on user side? Please give more details -->
<!-- Typings:          Is there a potential performance impact? In which cases? -->
- [ ] Generated values
- [ ] Shrink values
- [ ] Performance
- [ ] Typings
- [ ] _Other(s):_ ...


codesandbox[bot]: This pull request is automatically built and testable in [CodeSandbox](https://codesandbox.io).

  To see build info of the built libraries, click [here](https://ci.codesandbox.io/status/dubzzz/fast-check/pr/1984/builds/139251) or the icon next to each commit SHA.

Latest deployment of this branch, based on commit 5d9ccbcc8a2f222cc3877053896d09ef07691e65:

|Sandbox| Source |
|--|--|
|[Vanilla](https://codesandbox.io/s/vanilla-shbbe)| Configuration |
|[fast-check-examples](https://codesandbox.io/s/fast-check-examples-seyd8)| Configuration |

codecov[bot]: # [Codecov](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) Report
> Merging [#1984](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) (5d9ccbc) into [main](https://codecov.io/gh/dubzzz/fast-check/commit/4990ee15552e7fd9d614f731e8c7165bb9d686ea?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) (4990ee1) will **decrease** coverage by `0.67%`.
> The diff coverage is `51.66%`.

[![Impacted file tree graph](https://codecov.io/gh/dubzzz/fast-check/pull/1984/graphs/tree.svg?width=650&height=150&src=pr&token=fRi2fJN730&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN)](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN)

```diff
@@            Coverage Diff             @@
##             main    #1984      +/-   ##
==========================================
- Coverage   97.15%   96.48%   -0.68%     
==========================================
  Files         167      167              
  Lines        4147     4180      +33     
  Branches      808      814       +6     
==========================================
+ Hits         4029     4033       +4     
- Misses        114      143      +29     
  Partials        4        4              
```

| Flag | Coverage Δ | |
|---|---|---|
| unit-tests | `96.48% <51.66%> (-0.68%)` | :arrow_down: |
| unit-tests-12.x-Linux | `?` | |
| unit-tests-14.x-Linux | `96.48% <51.66%> (-0.60%)` | :arrow_down: |
| unit-tests-16.x-Linux | `?` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) | Coverage Δ | |
|---|---|---|
| [src/check/runner/utils/RunDetailsFormatter.ts](https://codecov.io/gh/dubzzz/fast-check/pull/1984/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#diff-c3JjL2NoZWNrL3J1bm5lci91dGlscy9SdW5EZXRhaWxzRm9ybWF0dGVyLnRz) | `64.70% <44.23%> (-21.60%)` | :arrow_down: |
| [src/check/runner/Runner.ts](https://codecov.io/gh/dubzzz/fast-check/pull/1984/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#diff-c3JjL2NoZWNrL3J1bm5lci9SdW5uZXIudHM=) | `100.00% <100.00%> (ø)` | |
| [src/fast-check-default.ts](https://codecov.io/gh/dubzzz/fast-check/pull/1984/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#diff-c3JjL2Zhc3QtY2hlY2stZGVmYXVsdC50cw==) | `100.00% <100.00%> (ø)` | |
| [src/utils/stringify.ts](https://codecov.io/gh/dubzzz/fast-check/pull/1984/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#diff-c3JjL3V0aWxzL3N0cmluZ2lmeS50cw==) | `99.12% <100.00%> (+0.01%)` | :arrow_up: |
| [src/check/arbitrary/helpers/ArrayInt64Arbitrary.ts](https://codecov.io/gh/dubzzz/fast-check/pull/1984/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#diff-c3JjL2NoZWNrL2FyYml0cmFyeS9oZWxwZXJzL0FycmF5SW50NjRBcmJpdHJhcnkudHM=) | `94.31% <0.00%> (-3.41%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN). Last update [4990ee1...5d9ccbc](https://codecov.io/gh/dubzzz/fast-check/pull/1984?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN).

dubzzz: The Map used by the default reporter must never deal with non object values. Or at least not with 0 or - 0.

Patch:
diff --git a/.github/actions/deploy-netlify/package.json b/.github/actions/deploy-netlify/package.json
index 3e47bbd5..4944b438 100644
--- a/.github/actions/deploy-netlify/package.json
+++ b/.github/actions/deploy-netlify/package.json
@@ -3,8 +3,8 @@
   "main": "index.cjs",
   "private": true,
   "dependencies": {
-    "@actions/core": "^1.3.0",
+    "@actions/core": "^1.4.0",
     "@actions/github": "^5.0.0",
-    "netlify-cli": "^3.35.1"
+    "netlify-cli": "^3.37.17"
   }
 }
diff --git a/.github/actions/deploy-netlify/yarn.lock b/.github/actions/deploy-netlify/yarn.lock
index 0c604496..5b3b3adb 100644
--- a/.github/actions/deploy-netlify/yarn.lock
+++ b/.github/actions/deploy-netlify/yarn.lock
@@ -2,10 +2,10 @@
 # yarn lockfile v1
 
 
-"@actions/core@^1.3.0":
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.3.0.tgz#f5e4b24c889e7f2e58b466cc8c7481292284eba0"
-  integrity sha512-xxtX0Cwdhb8LcgatfJkokqT8KzPvcIbwL9xpLU09nOwBzaStbfm0dNncsP0M4us+EpoPdWy7vbzU5vSOH7K6pg==
+"@actions/core@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.4.0.tgz#cf2e6ee317e314b03886adfeb20e448d50d6e524"
+  integrity sha512-CGx2ilGq5i7zSLgiiGUtBCxhRRxibJYU6Fim0Q1Wg2aQL2LTnF27zbqZOrxfvFQ55eSBW0L8uVStgtKMpa0Qlg==
 
 "@actions/github@^5.0.0":
   version "5.0.0"
@@ -920,20 +920,20 @@
     call-me-maybe "^1.0.1"
     glob-to-regexp "^0.3.0"
 
-"@netlify/build@^11.32.3":
-  version "11.32.3"
-  resolved "https://registry.yarnpkg.com/@netlify/build/-/build-11.32.3.tgz#459c40eebced3b9b8a09b80c7de80ea9d1ebe320"
-  integrity sha512-If0EhjaEEOmFOMEPRk8YF1RrZwblJhwfqSRe4/lFNLTTZOrPob+2gedkzaPqZtkoOoOsM1cnpDdd+8eegGofDg==
+"@netlify/build@^12.1.0":
+  version "12.1.0"
+  resolved "https://registry.yarnpkg.com/@netlify/build/-/build-12.1.0.tgz#bd1da3e4ae9919851849260745099d5095c9082f"
+  integrity sha512-DvKkNgfwzrQc3lFHJjHfoX7/l2qNd5F6i8urIEthYCH98SLMKrwuCcw3MSkgcmVKI4e+YE0H2PF2MiWWgQ+WLw==
   dependencies:
     "@bugsnag/js" "^7.0.0"
     "@netlify/cache-utils" "^1.0.7"
-    "@netlify/config" "^6.0.0"
+    "@netlify/config" "^7.0.0"
     "@netlify/functions-utils" "^1.3.13"
     "@netlify/git-utils" "^1.0.8"
-    "@netlify/plugin-edge-handlers" "^1.11.14"
-    "@netlify/plugins-list" "^2.14.2"
+    "@netlify/plugin-edge-handlers" "^1.11.16"
+    "@netlify/plugins-list" "^2.15.0"
     "@netlify/run-utils" "^1.0.6"
-    "@netlify/zip-it-and-ship-it" "^4.2.7"
+    "@netlify/zip-it-and-ship-it" "4.2.7"
     "@sindresorhus/slugify" "^1.1.0"
     "@ungap/from-entries" "^0.2.1"
     ansi-escapes "^4.3.2"
@@ -968,7 +968,7 @@
     resolve "^2.0.0-next.1"
     safe-json-stringify "^1.2.0"
     semver "^6.3.0"
-    statsd-client "0.4.6"
+    statsd-client "0.4.7"
     string-width "^4.2.0"
     strip-ansi "^6.0.0"
     supports-color "^7.1.0"
@@ -994,15 +994,16 @@
     path-exists "^4.0.0"
     readdirp "^3.4.0"
 
-"@netlify/config@^6.0.0", "@netlify/config@^6.7.2":
-  version "6.7.2"
-  resolved "https://registry.yarnpkg.com/@netlify/config/-/config-6.7.2.tgz#c6498371796ef6721b209bb6a90d9db1e26f1d2f"
-  integrity sha512-yoP3iw8MqLnOiRL3QPODFHyCefk2FYjwbGnwIvx/NzaB02L7e2nZW9Wk9Vs2aEUWiAOCMPWlp6TDSGASaqwAWw==
+"@netlify/config@^7.0.0", "@netlify/config@^7.2.0":
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@netlify/config/-/config-7.2.0.tgz#bb0bb463227b85e3ddf386f71c0a7473310c9f21"
+  integrity sha512-bxjAO6EvROkDtHZtaJg6phiZnR+cXYDTrlsrws9uOV5fuwT2hN0+82ICxUw5dSv+PHnz36nKqJCaC2F2J459Vw==
   dependencies:
     "@ungap/from-entries" "^0.2.1"
     array-flat-polyfill "^1.0.1"
     chalk "^3.0.0"
     deepmerge "^4.2.2"
+    dot-prop "^5.3.0"
     execa "^3.4.0"
     fast-safe-stringify "^2.0.7"
     figures "^3.2.0"
@@ -1013,6 +1014,7 @@
     js-yaml "^4.0.0"
     map-obj "^4.0.0"
     netlify "^7.0.1"
+    netlify-redirect-parser "^5.1.1"
     omit.js "^2.0.2"
     p-locate "^4.1.0"
     path-exists "^4.0.0"
@@ -1022,10 +1024,10 @@
     validate-npm-package-name "^3.0.0"
     yargs "^15.3.0"
 
-"@netlify/framework-info@^5.1.3":
-  version "5.1.3"
-  resolved "https://registry.yarnpkg.com/@netlify/framework-info/-/framework-info-5.1.3.tgz#55681f033afbed0083e9805a9c30da809c7922ef"
-  integrity sha512-38K1AqgXr/YiOldGdpHQXXNfdXiAIRtSlRD7PY7qVqfOggtkcaB1leIDw94lKM3wzzSEJq7uadLKu1fUpfPShg==
+"@netlify/framework-info@^5.2.0":
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/@netlify/framework-info/-/framework-info-5.2.0.tgz#383e9f53ff21297df5e0e3059ac6999d6c85a99e"
+  integrity sha512-8naCC254shxLqsLAbeGpV6iGB1drgVUr5Y8D19WtYm3o9TovmYnma8yYaTwsg59sKokFZZtE1jfxUBeHWFtscQ==
   dependencies:
     ajv "^8.0.0"
     filter-obj "^2.0.1"
@@ -1061,10 +1063,10 @@
   resolved "https://registry.yarnpkg.com/@netlify/open-api/-/open-api-2.5.0.tgz#d0d947ec21a0a8e8dd46f542c60b6cb25609b0f2"
   integrity sha512-KiXfYPO/X24p7EYQjcjBTizoyfY3U8zPv68Rte0EtayW2ZSqIslLLpNNd2gteqdh0Q83mzSiESdhlQHd0Ckjjg==
 
-"@netlify/plugin-edge-handlers@^1.11.14":
-  version "1.11.14"
-  resolved "https://registry.yarnpkg.com/@netlify/plugin-edge-handlers/-/plugin-edge-handlers-1.11.14.tgz#5ecc15ead944448970a56c0bcf9b1d50284b89ae"
-  integrity sha512-HhqrCjNiFHuxQTYWU6pi18Zd8Wo13qOaGqhMPZzeWZHWxl0xI+kRdlMCbclsKXQmT7ReXgdWuR6OZ7Nml9fEnA==
+"@netlify/plugin-edge-handlers@^1.11.16":
+  version "1.11.16"
+  resolved "https://registry.yarnpkg.com/@netlify/plugin-edge-handlers/-/plugin-edge-handlers-1.11.16.tgz#a0dae831f51e0a908244dcab0e731867e42e635d"
+  integrity sha512-f9a2G4z9PY5nh2UClLuY8+j+kNa38CuDFPDdf63vEfy1Dt/ICrWpbfTOhwknd6BrPgZ3lu477joRankm19dPMQ==
   dependencies:
     "@babel/core" "^7.11.4"
     "@babel/preset-env" "^7.11.5"
@@ -1085,40 +1087,40 @@
     rollup-plugin-terser "^7.0.2"
     typescript "^4.1.5"
 
-"@netlify/plugins-list@^2.14.2":
-  version "2.14.2"
-  resolved "https://registry.yarnpkg.com/@netlify/plugins-list/-/plugins-list-2.14.2.tgz#d0259377629e95733e5880f3c363e1a1be825cf7"
-  integrity sha512-WbLQ0X1cnryXzWeV03dA3BHw0CEPDTrj3IvjbeOB45A5/dxvTgQVjAeFbmqgRj6A8GPHgSLoNN0kteoXBojHhw==
-
-"@netlify/routing-local-proxy-darwin-arm64@^0.30.0-pre.11":
-  version "0.30.0-pre.11"
-  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-darwin-arm64/-/routing-local-proxy-darwin-arm64-0.30.0-pre.11.tgz#f5a21c0ea351004575ce25f39cc1a319488cc628"
-  integrity sha512-TxLJiwNUg8leWErYUdWeNUWMNiWY3bu2Jx/sQK1keBB5u/liQZowDe1GMmVSN19Ha/0a2eRcAcN3vtrPU5uv9A==
-
-"@netlify/routing-local-proxy-darwin-x64@^0.30.0-pre.11":
-  version "0.30.0-pre.11"
-  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-darwin-x64/-/routing-local-proxy-darwin-x64-0.30.0-pre.11.tgz#6557a4fd605cca8c85eefdc39c621aecad9b39fb"
-  integrity sha512-rpxRGndzFyPagV9qtxl1oo5ifVKv7Cc7AV3HrN8gtBw0JwNRFAv5qodU760XzDQmg4x6y2WrDFRA9EBYQDcLRA==
-
-"@netlify/routing-local-proxy-linux-x64@^0.30.0-pre.11":
-  version "0.30.0-pre.11"
-  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-linux-x64/-/routing-local-proxy-linux-x64-0.30.0-pre.11.tgz#817fbdb5874a7821c54b9713e7ef070d5c16308c"
-  integrity sha512-1Z0AXehRyM+mYtjxFFmHgyUbh6jIiMaAUQC2KGHTn99buzooOVxG+MYboYnhEpmMCkT5joeXmSalZoh9UzFeiw==
-
-"@netlify/routing-local-proxy-win32-x64@^0.30.0-pre.11":
-  version "0.30.0-pre.11"
-  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-win32-x64/-/routing-local-proxy-win32-x64-0.30.0-pre.11.tgz#e2240483bc37a0b43105b81e1ac87d7c7aefcae9"
-  integrity sha512-ylFW5eVhURwoVmL8s8YK18ki3KgTwDNUhDOut5st3MC2WQZZwea2RAykCUXKWjJll/cWJQHIXgTVBKwZWtWdrw==
-
-"@netlify/routing-local-proxy@^0.30.0-pre.11":
-  version "0.30.0-pre.11"
-  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy/-/routing-local-proxy-0.30.0-pre.11.tgz#8addfbffc5082ed5b6d7adf82a5fe7a3c622de41"
-  integrity sha512-D8cyOS2grH9I3HdkKwqvB5zfvDcI0pFHyFfJQbQFqgmW8/jnhDFdk2kaVE+SUMR9U9uN1YEML1WrJLZH3gg6qg==
+"@netlify/plugins-list@^2.15.0":
+  version "2.15.0"
+  resolved "https://registry.yarnpkg.com/@netlify/plugins-list/-/plugins-list-2.15.0.tgz#56e2ad5c30e98d61f7770d4d5536c50aa8aeb0cb"
+  integrity sha512-UOkQGvLjy5XDQsVpaaur/QOTPCXS6xCIbMWRYgboEH/BtMNh7ATv7fkF1kQgrJ1+hdguWzRYhww8/4A+G/kcxw==
+
+"@netlify/routing-local-proxy-darwin-arm64@^0.30.0":
+  version "0.30.0"
+  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-darwin-arm64/-/routing-local-proxy-darwin-arm64-0.30.0.tgz#e4782255558fbd0d573ee2205fee7c75bac7add2"
+  integrity sha512-DL73yErgPN/UeSZsxbEnJaEssLHlQVV+BWfPe45WP5qkRfvnokM1CXJX4KvblIyb82VbdY0Vczif8LLmAbKcGA==
+
+"@netlify/routing-local-proxy-darwin-x64@^0.30.0":
+  version "0.30.0"
+  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-darwin-x64/-/routing-local-proxy-darwin-x64-0.30.0.tgz#f6ccf2c8494a500212ea9a05f0c0a52c85a93d66"
+  integrity sha512-vAY6hyAo5rH1dXTqp8AEPkouxoEPCkLiUS6wNRC0Y12765knB7vHWOQucm/7UcrcNUmvYmqtK8JClXAfQIDVZA==
+
+"@netlify/routing-local-proxy-linux-x64@^0.30.0":
+  version "0.30.0"
+  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-linux-x64/-/routing-local-proxy-linux-x64-0.30.0.tgz#8d3da2959d9157b64057d3ef86404e6851020fdf"
+  integrity sha512-sHa3nKK0uCNXUMtDNP/yuZElV7YVDiPU32HXm66lNKIde+EIMyYy93nmjRBHo4EbjniR1U5FY185FIAcQyPqqw==
+
+"@netlify/routing-local-proxy-win32-x64@^0.30.0":
+  version "0.30.0"
+  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy-win32-x64/-/routing-local-proxy-win32-x64-0.30.0.tgz#672a245b163b612cc331dd0e0451802516551f9b"
+  integrity sha512-TitCXiFxlXAfg3ynqZdtlEDXwGadNuOGPu3fK0dmeVvHbc2xMYYBva44ODNTbalKj2ZyLKUOT4G0PDlbSTsypQ==
+
+"@netlify/routing-local-proxy@^0.30.0":
+  version "0.30.0"
+  resolved "https://registry.yarnpkg.com/@netlify/routing-local-proxy/-/routing-local-proxy-0.30.0.tgz#608fb9bcbabf5ecc013390935cc1047820afa2c8"
+  integrity sha512-603JAYirKZOse+wzAdHwudvWUCGe7nqu5pOVVIa562AV3YhNgZU4sPPKFUcRSXn3QFgyhUSxnNHOabs62IWhrg==
   optionalDependencies:
-    "@netlify/routing-local-proxy-darwin-arm64" "^0.30.0-pre.11"
-    "@netlify/routing-local-proxy-darwin-x64" "^0.30.0-pre.11"
-    "@netlify/routing-local-proxy-linux-x64" "^0.30.0-pre.11"
-    "@netlify/routing-local-proxy-win32-x64" "^0.30.0-pre.11"
+    "@netlify/routing-local-proxy-darwin-arm64" "^0.30.0"
+    "@netlify/routing-local-proxy-darwin-x64" "^0.30.0"
+    "@netlify/routing-local-proxy-linux-x64" "^0.30.0"
+    "@netlify/routing-local-proxy-win32-x64" "^0.30.0"
 
 "@netlify/run-utils@^1.0.6":
   version "1.0.6"
@@ -1127,35 +1129,7 @@
   dependencies:
     execa "^3.4.0"
 
-"@netlify/zip-it-and-ship-it@^2.4.0":
-  version "2.7.1"
-  resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-2.7.1.tgz#22558e0d2aeec6aeba5062b911dcdd92cc6708d8"
-  integrity sha512-Tt37A8tyQcEw3h4YZ4g5/Cgqya4rf/BnweDjfwPDj0BFZmfjRSH8CIZvTJd2y+R2AvLJ1b89cXVYen9uwb2A9w==
-  dependencies:
-    archiver "^4.0.0"
-    array-flat-polyfill "^1.0.1"
-    common-path-prefix "^2.0.0"
-    cp-file "^7.0.0"
-    elf-cam "^0.1.1"
-    end-of-stream "^1.4.4"
-    esbuild "^0.8.46"
-    filter-obj "^2.0.1"
-    find-up "^4.1.0"
-    glob "^7.1.6"
-    junk "^3.1.0"
-    locate-path "^5.0.0"
-    make-dir "^3.1.0"
-    p-map "^3.0.0"
-    path-exists "^4.0.0"
-    pkg-dir "^4.2.0"
-    precinct "^6.3.1"
-    require-package-name "^2.0.1"
-    resolve "^2.0.0-next.1"
-    semver "^6.3.0"
-    unixify "^1.0.0"
-    yargs "^15.4.1"
-
-"@netlify/zip-it-and-ship-it@^4.2.7":
+"@netlify/zip-it-and-ship-it@4.2.7":
   version "4.2.7"
   resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-4.2.7.tgz#ee67a7fff1cff9b103200dc9c26822f50533aeec"
   integrity sha512-7RDPHByyberzRWpQ5PTQZOWWXGH4mqggPDCgj58vDsgIffF+GeG+pZBPv4ZOGCPPb2INZbG0iTiJFvAHictKew==
@@ -1187,6 +1161,34 @@
     unixify "^1.0.0"
     yargs "^16.0.0"
 
+"@netlify/zip-it-and-ship-it@^2.4.0":
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-2.7.1.tgz#22558e0d2aeec6aeba5062b911dcdd92cc6708d8"
+  integrity sha512-Tt37A8tyQcEw3h4YZ4g5/Cgqya4rf/BnweDjfwPDj0BFZmfjRSH8CIZvTJd2y+R2AvLJ1b89cXVYen9uwb2A9w==
+  dependencies:
+    archiver "^4.0.0"
+    array-flat-polyfill "^1.0.1"
+    common-path-prefix "^2.0.0"
+    cp-file "^7.0.0"
+    elf-cam "^0.1.1"
+    end-of-stream "^1.4.4"
+    esbuild "^0.8.46"
+    filter-obj "^2.0.1"
+    find-up "^4.1.0"
+    glob "^7.1.6"
+    junk "^3.1.0"
+    locate-path "^5.0.0"
+    make-dir "^3.1.0"
+    p-map "^3.0.0"
+    path-exists "^4.0.0"
+    pkg-dir "^4.2.0"
+    precinct "^6.3.1"
+    require-package-name "^2.0.1"
+    resolve "^2.0.0-next.1"
+    semver "^6.3.0"
+    unixify "^1.0.0"
+    yargs "^15.4.1"
+
 "@nodelib/fs.scandir@2.1.4":
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
@@ -2585,7 +2587,7 @@ cli-progress@^3.7.0:
     colors "^1.1.2"
     string-width "^4.2.0"
 
-cli-spinners@^2.0.0, cli-spinners@^2.5.0:
+cli-spinners@^2.5.0:
   version "2.6.0"
   resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939"
   integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==
@@ -3371,7 +3373,7 @@ dir-glob@^3.0.1:
   dependencies:
     path-type "^4.0.0"
 
-dot-prop@^5.1.0, dot-prop@^5.2.0:
+dot-prop@^5.1.0, dot-prop@^5.2.0, dot-prop@^5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
   integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
@@ -5878,18 +5880,18 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0:
   resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61"
   integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==
 
-netlify-cli@^3.35.1:
-  version "3.35.1"
-  resolved "https://registry.yarnpkg.com/netlify-cli/-/netlify-cli-3.35.1.tgz#352a299a16329fe2742234bfc452e2d6b528dbef"
-  integrity sha512-IS6az8d6Iz8/NfypR8qG4NeJ2eeN1GJGysG20I/Nk0sISwHcx4E1yCKaphpsa+jWw3Ez7S0ku9F61hHPyASrBQ==
-  dependencies:
-    "@netlify/build" "^11.32.3"
-    "@netlify/config" "^6.7.2"
-    "@netlify/framework-info" "^5.1.3"
-    "@netlify/plugin-edge-handlers" "^1.11.14"
-    "@netlify/plugins-list" "^2.14.2"
-    "@netlify/routing-local-proxy" "^0.30.0-pre.11"
-    "@netlify/zip-it-and-ship-it" "^4.2.7"
+netlify-cli@^3.37.17:
+  version "3.37.17"
+  resolved "https://registry.yarnpkg.com/netlify-cli/-/netlify-cli-3.37.17.tgz#61057cd4f75bcea9417bf500f07045803f4a8503"
+  integrity sha512-2l7lrDTCBWQUngfNKc/S0aHweeCgHCOnGZI9RBtoo6r5VQBYkoZQMYg3xAIqUKKELEsg4d5HWUhrWN9QOyXLtw==
+  dependencies:
+    "@netlify/build" "^12.1.0"
+    "@netlify/config" "^7.2.0"
+    "@netlify/framework-info" "^5.2.0"
+    "@netlify/plugin-edge-handlers" "^1.11.16"
+    "@netlify/plugins-list" "^2.15.0"
+    "@netlify/routing-local-proxy" "^0.30.0"
+    "@netlify/zip-it-and-ship-it" "4.2.7"
     "@oclif/command" "^1.6.1"
     "@oclif/config" "^1.15.1"
     "@oclif/errors" "^1.3.4"
@@ -5910,7 +5912,6 @@ netlify-cli@^3.35.1:
     chokidar "^3.0.2"
     ci-info "^3.0.0"
     clean-deep "^3.0.2"
-    cli-spinners "^2.0.0"
     cli-ux "^5.5.1"
     concordance "^5.0.0"
     configstore "^5.0.0"
@@ -5918,7 +5919,7 @@ netlify-cli@^3.35.1:
     cookie "^0.4.0"
     copy-template-dir "^1.4.0"
     debug "^4.1.1"
-    del "^5.1.0"
+    del "^6.0.0"
     dot-prop "^5.1.0"
     dotenv "^10.0.0"
     env-paths "^2.2.0"
@@ -5957,7 +5958,7 @@ netlify-cli@^3.35.1:
     minimist "^1.2.5"
     multiparty "^4.2.1"
     netlify "^7.0.1"
-    netlify-redirect-parser "^4.0.1"
+    netlify-redirect-parser "^5.1.1"
     netlify-redirector "^0.2.1"
     node-fetch "^2.6.0"
     node-version-alias "^1.0.1"
@@ -5976,7 +5977,6 @@ netlify-cli@^3.35.1:
     path-type "^4.0.0"
     prettyjson "^1.2.1"
     pump "^3.0.0"
-    random-item "^3.0.0"
     raw-body "^2.4.1"
     resolve "^1.12.0"
     safe-join "^0.1.3"
@@ -5996,14 +5996,15 @@ netlify-cli@^3.35.1:
     wrap-ansi "^7.0.0"
     write-file-atomic "^3.0.0"
 
-netlify-redirect-parser@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/netlify-redirect-parser/-/netlify-redirect-parser-4.0.1.tgz#a4ce1a3dbbaae8f40d62cae861e3640c93f43ae0"
-  integrity sha512-Cm8Wz6tmkUvHUHc7dYG19VfowPkRMIy2V92ao90fGEnALs+KIR8aO2hCFI2++9zMS/l0xA0IoqDkPJYB+dyg7Q==
+netlify-redirect-parser@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/netlify-redirect-parser/-/netlify-redirect-parser-5.1.1.tgz#1df2a752c532f338ff10d9dac4bbc5520f917d76"
+  integrity sha512-TDJShXyaMwQaVtzWjK6U1UAWzWHnFzTVULAduaGroVlQha5Hi6WaRCZLg64FvQx4MUMOH8qOgSyByCqIMXqZWA==
   dependencies:
-    "@netlify/config" "^6.7.2"
     filter-obj "^2.0.2"
     is-plain-obj "^2.1.0"
+    path-exists "^4.0.0"
+    toml "^3.0.0"
 
 netlify-redirector@^0.2.1:
   version "0.2.1"
@@ -6837,11 +6838,6 @@ random-bytes@~1.0.0:
   resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
   integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=
 
-random-item@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/random-item/-/random-item-3.1.0.tgz#b0425646b06292059fd8aaf4bdf0c04cf426f625"
-  integrity sha512-0DyAT8LYBNQKSkqcPjia/HNoWCZ5JWBdAQWjBQVh5DMVv3Fv7V90I8/AuUf8NW4zdFn27i9qj8Kp6wI5JsiiOA==
-
 randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -7574,10 +7570,10 @@ static-server@^2.2.1:
     mime "^1.2.11"
     opn "^5.2.0"
 
-statsd-client@0.4.6:
-  version "0.4.6"
-  resolved "https://registry.yarnpkg.com/statsd-client/-/statsd-client-0.4.6.tgz#b9fa90876009850000db7b2388380a59ca3114f6"
-  integrity sha512-OL3PAf0LhlFP8ZpxFm3Ue7dL3cV5o7PAsWDsQnx/iKXGVr8huYF/ui+OZEORerEDVRps7BCPAq5bWppMj1oMoA==
+statsd-client@0.4.7:
+  version "0.4.7"
+  resolved "https://registry.yarnpkg.com/statsd-client/-/statsd-client-0.4.7.tgz#a423894bd80bd27524c992001511530ef16933d1"
+  integrity sha512-+sGCE6FednJ/vI7vywErOg/mhVqmf6Zlktz7cdGRnF/cQWXD9ifMgtqU1CIIXmhSwm11SCk4zDN+bwNCvIR/Kg==
 
 "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
   version "1.5.0"
diff --git a/src/arbitrary/_internals/ArrayArbitrary.ts b/src/arbitrary/_internals/ArrayArbitrary.ts
index 536194f1..054400a6 100644
--- a/src/arbitrary/_internals/ArrayArbitrary.ts
+++ b/src/arbitrary/_internals/ArrayArbitrary.ts
@@ -45,18 +45,48 @@ export class ArrayArbitrary<T> extends NextArbitrary<T[]> {
     return vs;
   }
 
-  private canAppendItem(items: NextValue<T>[], newItem: NextValue<T>): boolean {
-    if (this.isEqual === undefined) {
-      return true;
-    }
+  private static canAppendItem<T>(
+    items: NextValue<T>[],
+    newItem: NextValue<T>,
+    isEqual: (valueA: T, valueB: T) => boolean
+  ): boolean {
     for (let idx = 0; idx !== items.length; ++idx) {
-      if (this.isEqual(items[idx].value_, newItem.value_)) {
+      if (isEqual(items[idx].value_, newItem.value_)) {
         return false;
       }
     }
     return true;
   }
 
+  private generateNItemsNoDuplicates(N: number, mrng: Random, biasFactorItems: number | undefined): NextValue<T>[] {
+    let numSkippedInRow = 0;
+    const items: NextValue<T>[] = [];
+    // Try to append into items up to the target size
+    // In the case of a set we may reject some items as they are already part of the set
+    // so we need to retry and generate other ones. In order to prevent infinite loop,
+    // we accept a max of maxLength consecutive failures. This circuit breaker may cause
+    // generated to be smaller than the minimal accepted one.
+    while (items.length < N && numSkippedInRow < this.maxLength) {
+      const current = this.arb.generate(mrng, biasFactorItems);
+      if (this.isEqual === undefined || ArrayArbitrary.canAppendItem(items, current, this.isEqual)) {
+        numSkippedInRow = 0;
+        items.push(current);
+      } else {
+        numSkippedInRow += 1;
+      }
+    }
+    return items;
+  }
+
+  private generateNItems(N: number, mrng: Random, biasFactorItems: number | undefined): NextValue<T>[] {
+    const items: NextValue<T>[] = [];
+    for (let index = 0; index !== N; ++index) {
+      const current = this.arb.generate(mrng, biasFactorItems);
+      items.push(current);
+    }
+    return items;
+  }
+
   private wrapper(itemsRaw: NextValue<T>[], shrunkOnce: boolean, itemsRawLengthContext: unknown): NextValue<T[]> {
     // We need to explicitly apply filtering on shrink items
     // has they might have duplicates (on non shrunk it is not the case by construct)
@@ -85,23 +115,10 @@ export class ArrayArbitrary<T> extends NextArbitrary<T[]> {
   generate(mrng: Random, biasFactor: number | undefined): NextValue<T[]> {
     const biasMeta = this.applyBias(mrng, biasFactor);
     const targetSize = biasMeta.size;
-
-    let numSkippedInRow = 0;
-    const items: NextValue<T>[] = [];
-    // Try to append into items up to the target size
-    // In the case of a set we may reject some items as they are already part of the set
-    // so we need to retry and generate other ones. In order to prevent infinite loop,
-    // we accept a max of maxLength consecutive failures. This circuit breaker may cause
-    // generated to be smaller than the minimal accepted one.
-    while (items.length < targetSize && numSkippedInRow < this.maxLength) {
-      const current = this.arb.generate(mrng, biasMeta.biasFactorItems);
-      if (this.canAppendItem(items, current)) {
-        numSkippedInRow = 0;
-        items.push(current);
-      } else {
-        numSkippedInRow += 1;
-      }
-    }
+    const items =
+      this.isEqual !== undefined
+        ? this.generateNItemsNoDuplicates(targetSize, mrng, biasMeta.biasFactorItems)
+        : this.generateNItems(targetSize, mrng, biasMeta.biasFactorItems);
     return this.wrapper(items, false, undefined);
   }
 
diff --git a/src/check/runner/Runner.ts b/src/check/runner/Runner.ts
index 9848a79c..336243d2 100644
--- a/src/check/runner/Runner.ts
+++ b/src/check/runner/Runner.ts
@@ -13,7 +13,7 @@ import { RunnerIterator } from './RunnerIterator';
 import { SourceValuesIterator } from './SourceValuesIterator';
 import { toss } from './Tosser';
 import { pathWalk } from './utils/PathWalker';
-import { reportRunDetails } from './utils/RunDetailsFormatter';
+import { asyncReportRunDetails, reportRunDetails } from './utils/RunDetailsFormatter';
 import { IAsyncProperty } from '../property/AsyncProperty';
 import { IProperty } from '../property/Property';
 
@@ -190,7 +190,7 @@ function assert<Ts>(property: IProperty<Ts>, params?: Parameters<Ts>): void;
 function assert<Ts>(property: IRawProperty<Ts>, params?: Parameters<Ts>): Promise<void> | void;
 function assert<Ts>(property: IRawProperty<Ts>, params?: Parameters<Ts>): unknown {
   const out = check(property, params);
-  if (property.isAsync()) return (out as Promise<RunDetails<Ts>>).then(reportRunDetails);
+  if (property.isAsync()) return (out as Promise<RunDetails<Ts>>).then(asyncReportRunDetails);
   else reportRunDetails(out as RunDetails<Ts>);
 }
 
diff --git a/src/check/runner/utils/RunDetailsFormatter.ts b/src/check/runner/utils/RunDetailsFormatter.ts
index c7007fa1..f04bd71e 100644
--- a/src/check/runner/utils/RunDetailsFormatter.ts
+++ b/src/check/runner/utils/RunDetailsFormatter.ts
@@ -1,4 +1,4 @@
-import { stringify } from '../../../utils/stringify';
+import { stringify, possiblyAsyncStringify } from '../../../utils/stringify';
 import { VerbosityLevel } from '../configuration/VerbosityLevel';
 import { ExecutionStatus } from '../reporter/ExecutionStatus';
 import { ExecutionTree } from '../reporter/ExecutionTree';
@@ -18,12 +18,12 @@ function formatHints(hints: string[]): string {
 }
 
 /** @internal */
-function formatFailures<Ts>(failures: Ts[]): string {
-  return `Encountered failures were:\n- ${failures.map(stringify).join('\n- ')}`;
+function formatFailures<Ts>(failures: Ts[], stringifyOne: (value: Ts) => string): string {
+  return `Encountered failures were:\n- ${failures.map(stringifyOne).join('\n- ')}`;
 }
 
 /** @internal */
-function formatExecutionSummary<Ts>(executionTrees: ExecutionTree<Ts>[]): string {
+function formatExecutionSummary<Ts>(executionTrees: ExecutionTree<Ts>[], stringifyOne: (value: Ts) => string): string {
   const summaryLines: string[] = [];
   const remainingTreesAndDepth: { depth: number; tree: ExecutionTree<Ts> }[] = [];
   for (const tree of executionTrees.reverse()) {
@@ -45,7 +45,7 @@ function formatExecutionSummary<Ts>(executionTrees: ExecutionTree<Ts>[]): string
         ? '\x1b[31m\xD7\x1b[0m'
         : '\x1b[33m!\x1b[0m';
     const leftPadding = Array(currentDepth).join('. ');
-    summaryLines.push(`${leftPadding}${statusIcon} ${stringify(currentTree.value)}`);
+    summaryLines.push(`${leftPadding}${statusIcon} ${stringifyOne(currentTree.value)}`);
 
     // push its children to the queue
     for (const tree of currentTree.children.reverse()) {
@@ -56,7 +56,7 @@ function formatExecutionSummary<Ts>(executionTrees: ExecutionTree<Ts>[]): string
 }
 
 /** @internal */
-function preFormatTooManySkipped<Ts>(out: RunDetailsFailureTooManySkips<Ts>) {
+function preFormatTooManySkipped<Ts>(out: RunDetailsFailureTooManySkips<Ts>, stringifyOne: (value: Ts) => string) {
   const message = `Failed to run property, too many pre-condition failures encountered\n{ seed: ${out.seed} }\n\nRan ${out.numRuns} time(s)\nSkipped ${out.numSkips} time(s)`;
   let details: string | null = null;
   const hints = [
@@ -65,7 +65,7 @@ function preFormatTooManySkipped<Ts>(out: RunDetailsFailureTooManySkips<Ts>) {
   ];
 
   if (out.verbose >= VerbosityLevel.VeryVerbose) {
-    details = formatExecutionSummary(out.executionSummary);
+    details = formatExecutionSummary(out.executionSummary, stringifyOne);
   } else {
     hints.push(
       'Enable verbose mode at level VeryVerbose in order to check all generated values and their associated status'
@@ -76,19 +76,19 @@ function preFormatTooManySkipped<Ts>(out: RunDetailsFailureTooManySkips<Ts>) {
 }
 
 /** @internal */
-function preFormatFailure<Ts>(out: RunDetailsFailureProperty<Ts>) {
+function preFormatFailure<Ts>(out: RunDetailsFailureProperty<Ts>, stringifyOne: (value: Ts) => string) {
   const message = `Property failed after ${out.numRuns} tests\n{ seed: ${out.seed}, path: "${
     out.counterexamplePath
-  }", endOnFailure: true }\nCounterexample: ${stringify(out.counterexample)}\nShrunk ${
+  }", endOnFailure: true }\nCounterexample: ${stringifyOne(out.counterexample)}\nShrunk ${
     out.numShrinks
   } time(s)\nGot error: ${out.error}`;
   let details: string | null = null;
   const hints = [];
 
   if (out.verbose >= VerbosityLevel.VeryVerbose) {
-    details = formatExecutionSummary(out.executionSummary);
+    details = formatExecutionSummary(out.executionSummary, stringifyOne);
   } else if (out.verbose === VerbosityLevel.Verbose) {
-    details = formatFailures(out.failures);
+    details = formatFailures(out.failures, stringifyOne);
   } else {
     hints.push('Enable verbose mode in order to have the list of all failing values encountered during the run');
   }
@@ -97,13 +97,13 @@ function preFormatFailure<Ts>(out: RunDetailsFailureProperty<Ts>) {
 }
 
 /** @internal */
-function preFormatEarlyInterrupted<Ts>(out: RunDetailsFailureInterrupted<Ts>) {
+function preFormatEarlyInterrupted<Ts>(out: RunDetailsFailureInterrupted<Ts>, stringifyOne: (value: Ts) => string) {
   const message = `Property interrupted after ${out.numRuns} tests\n{ seed: ${out.seed} }`;
   let details: string | null = null;
   const hints = [];
 
   if (out.verbose >= VerbosityLevel.VeryVerbose) {
-    details = formatExecutionSummary(out.executionSummary);
+    details = formatExecutionSummary(out.executionSummary, stringifyOne);
   } else {
     hints.push(
       'Enable verbose mode at level VeryVerbose in order to check all generated values and their associated status'
@@ -113,6 +113,26 @@ function preFormatEarlyInterrupted<Ts>(out: RunDetailsFailureInterrupted<Ts>) {
   return { message, details, hints };
 }
 
+/** @internal */
+function defaultReportMessageInternal<Ts>(
+  out: RunDetails<Ts>,
+  stringifyOne: (value: Ts) => string
+): string | undefined {
+  if (!out.failed) return;
+
+  const { message, details, hints } =
+    out.counterexamplePath === null
+      ? out.interrupted
+        ? preFormatEarlyInterrupted(out, stringifyOne)
+        : preFormatTooManySkipped(out, stringifyOne)
+      : preFormatFailure(out, stringifyOne);
+
+  let errorMessage = message;
+  if (details != null) errorMessage += `\n\n${details}`;
+  if (hints.length > 0) errorMessage += `\n\n${formatHints(hints)}`;
+  return errorMessage;
+}
+
 /**
  * Format output of {@link check} using the default error reporting of {@link assert}
  *
@@ -144,19 +164,72 @@ function defaultReportMessage<Ts>(out: RunDetails<Ts> & { failed: true }): strin
  */
 function defaultReportMessage<Ts>(out: RunDetails<Ts>): string | undefined;
 function defaultReportMessage<Ts>(out: RunDetails<Ts>): string | undefined {
-  if (!out.failed) return;
+  return defaultReportMessageInternal(out, stringify);
+}
 
-  const { message, details, hints } =
-    out.counterexamplePath === null
-      ? out.interrupted
-        ? preFormatEarlyInterrupted(out)
-        : preFormatTooManySkipped(out)
-      : preFormatFailure(out);
+/**
+ * Format output of {@link check} using the default error reporting of {@link assert}
+ *
+ * Produce a string containing the formated error in case of failed run,
+ * undefined otherwise.
+ *
+ * @remarks Since 2.17.0
+ * @public
+ */
+function asyncDefaultReportMessage<Ts>(out: RunDetails<Ts> & { failed: false }): Promise<undefined>;
+/**
+ * Format output of {@link check} using the default error reporting of {@link assert}
+ *
+ * Produce a string containing the formated error in case of failed run,
+ * undefined otherwise.
+ *
+ * @remarks Since 2.17.0
+ * @public
+ */
+function asyncDefaultReportMessage<Ts>(out: RunDetails<Ts> & { failed: true }): Promise<string>;
+/**
+ * Format output of {@link check} using the default error reporting of {@link assert}
+ *
+ * Produce a string containing the formated error in case of failed run,
+ * undefined otherwise.
+ *
+ * @remarks Since 2.17.0
+ * @public
+ */
+function asyncDefaultReportMessage<Ts>(out: RunDetails<Ts>): Promise<string | undefined>;
+async function asyncDefaultReportMessage<Ts>(out: RunDetails<Ts>): Promise<string | undefined> {
+  // The asynchronous version might require two passes:
+  // - the first one will register the asynchronous values that will need to be stringified
+  // - the second one will take the computed values
+  const pendingStringifieds: Promise<[unknown, string]>[] = [];
+  function stringifyOne(value: unknown): string {
+    const stringified = possiblyAsyncStringify(value);
+    if (typeof stringified === 'string') {
+      return stringified;
+    }
+    pendingStringifieds.push(Promise.all([value, stringified]));
+    return '\u2026'; // ellipsis
+  }
+  const firstTryMessage = defaultReportMessageInternal(out, stringifyOne);
 
-  let errorMessage = message;
-  if (details != null) errorMessage += `\n\n${details}`;
-  if (hints.length > 0) errorMessage += `\n\n${formatHints(hints)}`;
-  return errorMessage;
+  // Checks if async mode would have changed the message
+  if (pendingStringifieds.length === 0) {
+    // No asynchronous stringify have been queued: the computation was synchronous
+    return firstTryMessage;
+  }
+
+  // Retry with async stringified versions in mind
+  const registeredValues = new Map(await Promise.all(pendingStringifieds));
+  function stringifySecond(value: unknown): string {
+    const asyncStringifiedIfRegistered = registeredValues.get(value);
+    if (asyncStringifiedIfRegistered !== undefined) {
+      return asyncStringifiedIfRegistered;
+    }
+    // Here we ALWAYS recompute sync versions to avoid putting a cost penalty
+    // on usual paths, the ones not having any async generated values
+    return stringify(value);
+  }
+  return defaultReportMessageInternal(out, stringifySecond);
 }
 
 /** @internal */
@@ -165,6 +238,12 @@ function throwIfFailed<Ts>(out: RunDetails<Ts>): void {
   throw new Error(defaultReportMessage(out));
 }
 
+/** @internal */
+async function asyncThrowIfFailed<Ts>(out: RunDetails<Ts>): Promise<void> {
+  if (!out.failed) return;
+  throw new Error(await asyncDefaultReportMessage(out));
+}
+
 /**
  * In case this code has to be executed synchronously the caller
  * has to make sure that no asyncReporter has been defined
@@ -177,4 +256,16 @@ export function reportRunDetails<Ts>(out: RunDetails<Ts>): Promise<void> | void
   else return throwIfFailed(out);
 }
 
-export { defaultReportMessage };
+/**
+ * In case this code has to be executed synchronously the caller
+ * has to make sure that no asyncReporter has been defined
+ * otherwise it might trigger an unchecked promise
+ * @internal
+ */
+export async function asyncReportRunDetails<Ts>(out: RunDetails<Ts>): Promise<void> {
+  if (out.runConfiguration.asyncReporter) return out.runConfiguration.asyncReporter(out);
+  else if (out.runConfiguration.reporter) return out.runConfiguration.reporter(out);
+  else return asyncThrowIfFailed(out);
+}
+
+export { defaultReportMessage, asyncDefaultReportMessage };
diff --git a/src/fast-check-default.ts b/src/fast-check-default.ts
index 0d7a6038..72576435 100644
--- a/src/fast-check-default.ts
+++ b/src/fast-check-default.ts
@@ -127,7 +127,7 @@ import { ExecutionTree } from './check/runner/reporter/ExecutionTree';
 import { cloneMethod, cloneIfNeeded, hasCloneMethod, WithCloneMethod } from './check/symbols';
 import { Stream, stream } from './stream/Stream';
 import { hash } from './utils/hash';
-import { stringify } from './utils/stringify';
+import { stringify, asyncStringify } from './utils/stringify';
 import {
   scheduler,
   schedulerFor,
@@ -136,7 +136,7 @@ import {
   SchedulerReportItem,
   SchedulerConstraints,
 } from './arbitrary/scheduler';
-import { defaultReportMessage } from './check/runner/utils/RunDetailsFormatter';
+import { defaultReportMessage, asyncDefaultReportMessage } from './check/runner/utils/RunDetailsFormatter';
 import { ArbitraryWithShrink } from './check/arbitrary/definition/ArbitraryWithShrink';
 import { ArbitraryWithContextualShrink } from './check/arbitrary/definition/ArbitraryWithContextualShrink';
 import { CommandsContraints } from './check/model/commands/CommandsContraints';
@@ -340,7 +340,9 @@ export {
   convertToNext,
   // print values
   stringify,
+  asyncStringify,
   defaultReportMessage,
+  asyncDefaultReportMessage,
   hash,
   // constraints
   ArrayConstraints,
diff --git a/src/utils/stringify.ts b/src/utils/stringify.ts
index b3c9e0f6..18008eea 100644
--- a/src/utils/stringify.ts
+++ b/src/utils/stringify.ts
@@ -194,3 +194,31 @@ export function stringifyInternal<Ts>(value: Ts, previousValues: any[]): string
 export function stringify<Ts>(value: Ts): string {
   return stringifyInternal(value, []);
 }
+
+/**
+ * Mid-way between stringify and asyncStringify
+ *
+ * If the value can be stringified in a synchronous way then it returns a string.
+ * Otherwise, it tries to go further in investigations and return a Promise<string>.
+ *
+ * Not publicly exposed yet!
+ *
+ * @internal
+ */
+export function possiblyAsyncStringify<Ts>(value: Ts): string | Promise<string> {
+  return stringifyInternal(value, []);
+}
+
+/**
+ * Convert any value to its fast-check string representation
+ *
+ * This asynchronous version is also able to dig into the status of Promise
+ *
+ * @param value - Value to be converted into a string
+ *
+ * @remarks Since 2.17.0
+ * @public
+ */
+export async function asyncStringify<Ts>(value: Ts): Promise<string> {
+  return Promise.resolve(possiblyAsyncStringify(value));
+}


Test patch:
diff --git a/test/esm/esbuild-with-import/package.json b/test/esm/esbuild-with-import/package.json
index 23ad1977..2f80b192 100644
--- a/test/esm/esbuild-with-import/package.json
+++ b/test/esm/esbuild-with-import/package.json
@@ -10,7 +10,7 @@
     "fast-check": "*"
   },
   "devDependencies": {
-    "esbuild": "^0.12.6"
+    "esbuild": "^0.12.8"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/esbuild-with-import/yarn.lock b/test/esm/esbuild-with-import/yarn.lock
index d2c5071f..2ac9fe14 100644
--- a/test/esm/esbuild-with-import/yarn.lock
+++ b/test/esm/esbuild-with-import/yarn.lock
@@ -2,10 +2,10 @@
 # yarn lockfile v1
 
 
-esbuild@^0.12.6:
-  version "0.12.6"
-  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.6.tgz#85bc755c7cf3005d4f34b4f10f98049ce0ee67ce"
-  integrity sha512-RDvVLvAjsq/kIZJoneMiUOH7EE7t2QaW7T3Q7EdQij14+bZbDq5sndb0tTanmHIFSqZVMBMMyqzVHkS3dJobeA==
+esbuild@^0.12.8:
+  version "0.12.8"
+  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.8.tgz#ac90da77cb3bfbf49ab815200bcef7ffe1a3348f"
+  integrity sha512-sx/LwlP/SWTGsd9G4RlOPrXnIihAJ2xwBUmzoqe2nWwbXORMQWtAGNJNYLBJJqa3e9PWvVzxdrtyFZJcr7D87g==
 
 fast-check@*:
   version "2.13.0"
diff --git a/test/esm/esbuild-with-require/package.json b/test/esm/esbuild-with-require/package.json
index 23ad1977..2f80b192 100644
--- a/test/esm/esbuild-with-require/package.json
+++ b/test/esm/esbuild-with-require/package.json
@@ -10,7 +10,7 @@
     "fast-check": "*"
   },
   "devDependencies": {
-    "esbuild": "^0.12.6"
+    "esbuild": "^0.12.8"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/esbuild-with-require/yarn.lock b/test/esm/esbuild-with-require/yarn.lock
index d2c5071f..2ac9fe14 100644
--- a/test/esm/esbuild-with-require/yarn.lock
+++ b/test/esm/esbuild-with-require/yarn.lock
@@ -2,10 +2,10 @@
 # yarn lockfile v1
 
 
-esbuild@^0.12.6:
-  version "0.12.6"
-  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.6.tgz#85bc755c7cf3005d4f34b4f10f98049ce0ee67ce"
-  integrity sha512-RDvVLvAjsq/kIZJoneMiUOH7EE7t2QaW7T3Q7EdQij14+bZbDq5sndb0tTanmHIFSqZVMBMMyqzVHkS3dJobeA==
+esbuild@^0.12.8:
+  version "0.12.8"
+  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.8.tgz#ac90da77cb3bfbf49ab815200bcef7ffe1a3348f"
+  integrity sha512-sx/LwlP/SWTGsd9G4RlOPrXnIihAJ2xwBUmzoqe2nWwbXORMQWtAGNJNYLBJJqa3e9PWvVzxdrtyFZJcr7D87g==
 
 fast-check@*:
   version "2.13.0"
diff --git a/test/esm/rollup-with-import/package.json b/test/esm/rollup-with-import/package.json
index 4f58f95e..cb4fd2e4 100644
--- a/test/esm/rollup-with-import/package.json
+++ b/test/esm/rollup-with-import/package.json
@@ -12,7 +12,7 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^19.0.0",
     "@rollup/plugin-node-resolve": "^13.0.0",
-    "rollup": "^2.51.0"
+    "rollup": "^2.51.2"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/rollup-with-import/yarn.lock b/test/esm/rollup-with-import/yarn.lock
index ebe7d1e3..7f0057f4 100644
--- a/test/esm/rollup-with-import/yarn.lock
+++ b/test/esm/rollup-with-import/yarn.lock
@@ -223,10 +223,10 @@ resolve@^1.17.0, resolve@^1.19.0:
     is-core-module "^2.1.0"
     path-parse "^1.0.6"
 
-rollup@^2.51.0:
-  version "2.51.0"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.51.0.tgz#ffd847882283998fc8611cd57af917f173b4ab5c"
-  integrity sha512-ITLt9sScNCBVspSHauw/W49lEZ0vjN8LyCzSNsNaqT67vTss2lYEfOyxltX8hjrhr1l/rQwmZ2wazzEqhZ/fUg==
+rollup@^2.51.2:
+  version "2.51.2"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.51.2.tgz#6de71e28c833089a0bd745a09671a3e2b92af6b7"
+  integrity sha512-ReV2eGEadA7hmXSzjxdDKs10neqH2QURf2RxJ6ayAlq93ugy6qIvXMmbc5cWMGCDh1h5T4thuWO1e2VNbMq8FA==
   optionalDependencies:
     fsevents "~2.3.1"
 
diff --git a/test/esm/rollup-with-require/package.json b/test/esm/rollup-with-require/package.json
index 4f58f95e..cb4fd2e4 100644
--- a/test/esm/rollup-with-require/package.json
+++ b/test/esm/rollup-with-require/package.json
@@ -12,7 +12,7 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^19.0.0",
     "@rollup/plugin-node-resolve": "^13.0.0",
-    "rollup": "^2.51.0"
+    "rollup": "^2.51.2"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/rollup-with-require/yarn.lock b/test/esm/rollup-with-require/yarn.lock
index ebe7d1e3..7f0057f4 100644
--- a/test/esm/rollup-with-require/yarn.lock
+++ b/test/esm/rollup-with-require/yarn.lock
@@ -223,10 +223,10 @@ resolve@^1.17.0, resolve@^1.19.0:
     is-core-module "^2.1.0"
     path-parse "^1.0.6"
 
-rollup@^2.51.0:
-  version "2.51.0"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.51.0.tgz#ffd847882283998fc8611cd57af917f173b4ab5c"
-  integrity sha512-ITLt9sScNCBVspSHauw/W49lEZ0vjN8LyCzSNsNaqT67vTss2lYEfOyxltX8hjrhr1l/rQwmZ2wazzEqhZ/fUg==
+rollup@^2.51.2:
+  version "2.51.2"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.51.2.tgz#6de71e28c833089a0bd745a09671a3e2b92af6b7"
+  integrity sha512-ReV2eGEadA7hmXSzjxdDKs10neqH2QURf2RxJ6ayAlq93ugy6qIvXMmbc5cWMGCDh1h5T4thuWO1e2VNbMq8FA==
   optionalDependencies:
     fsevents "~2.3.1"
 
diff --git a/test/esm/webpack-with-import/package.json b/test/esm/webpack-with-import/package.json
index 5110cc70..622eb6f3 100644
--- a/test/esm/webpack-with-import/package.json
+++ b/test/esm/webpack-with-import/package.json
@@ -12,7 +12,7 @@
   "devDependencies": {
     "querystring-es3": "^0.2.1",
     "webpack": "^5.38.1",
-    "webpack-cli": "^4.7.0"
+    "webpack-cli": "^4.7.2"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/webpack-with-import/yarn.lock b/test/esm/webpack-with-import/yarn.lock
index 0bb2bcc8..8be51010 100644
--- a/test/esm/webpack-with-import/yarn.lock
+++ b/test/esm/webpack-with-import/yarn.lock
@@ -159,22 +159,22 @@
     "@webassemblyjs/ast" "1.11.0"
     "@xtuc/long" "4.2.2"
 
-"@webpack-cli/configtest@^1.0.3":
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9"
-  integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==
+"@webpack-cli/configtest@^1.0.4":
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa"
+  integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==
 
-"@webpack-cli/info@^1.2.4":
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573"
-  integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==
+"@webpack-cli/info@^1.3.0":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b"
+  integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==
   dependencies:
     envinfo "^7.7.3"
 
-"@webpack-cli/serve@^1.4.0":
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e"
-  integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==
+"@webpack-cli/serve@^1.5.1":
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278"
+  integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==
 
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
@@ -759,15 +759,15 @@ watchpack@^2.2.0:
     glob-to-regexp "^0.4.1"
     graceful-fs "^4.1.2"
 
-webpack-cli@^4.7.0:
-  version "4.7.0"
-  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35"
-  integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==
+webpack-cli@^4.7.2:
+  version "4.7.2"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5"
+  integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==
   dependencies:
     "@discoveryjs/json-ext" "^0.5.0"
-    "@webpack-cli/configtest" "^1.0.3"
-    "@webpack-cli/info" "^1.2.4"
-    "@webpack-cli/serve" "^1.4.0"
+    "@webpack-cli/configtest" "^1.0.4"
+    "@webpack-cli/info" "^1.3.0"
+    "@webpack-cli/serve" "^1.5.1"
     colorette "^1.2.1"
     commander "^7.0.0"
     execa "^5.0.0"
diff --git a/test/esm/webpack-with-require/package.json b/test/esm/webpack-with-require/package.json
index 5110cc70..622eb6f3 100644
--- a/test/esm/webpack-with-require/package.json
+++ b/test/esm/webpack-with-require/package.json
@@ -12,7 +12,7 @@
   "devDependencies": {
     "querystring-es3": "^0.2.1",
     "webpack": "^5.38.1",
-    "webpack-cli": "^4.7.0"
+    "webpack-cli": "^4.7.2"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/webpack-with-require/yarn.lock b/test/esm/webpack-with-require/yarn.lock
index 0bb2bcc8..8be51010 100644
--- a/test/esm/webpack-with-require/yarn.lock
+++ b/test/esm/webpack-with-require/yarn.lock
@@ -159,22 +159,22 @@
     "@webassemblyjs/ast" "1.11.0"
     "@xtuc/long" "4.2.2"
 
-"@webpack-cli/configtest@^1.0.3":
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9"
-  integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==
+"@webpack-cli/configtest@^1.0.4":
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa"
+  integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==
 
-"@webpack-cli/info@^1.2.4":
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573"
-  integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==
+"@webpack-cli/info@^1.3.0":
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b"
+  integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==
   dependencies:
     envinfo "^7.7.3"
 
-"@webpack-cli/serve@^1.4.0":
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e"
-  integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==
+"@webpack-cli/serve@^1.5.1":
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278"
+  integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==
 
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
@@ -759,15 +759,15 @@ watchpack@^2.2.0:
     glob-to-regexp "^0.4.1"
     graceful-fs "^4.1.2"
 
-webpack-cli@^4.7.0:
-  version "4.7.0"
-  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35"
-  integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==
+webpack-cli@^4.7.2:
+  version "4.7.2"
+  resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5"
+  integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==
   dependencies:
     "@discoveryjs/json-ext" "^0.5.0"
-    "@webpack-cli/configtest" "^1.0.3"
-    "@webpack-cli/info" "^1.2.4"
-    "@webpack-cli/serve" "^1.4.0"
+    "@webpack-cli/configtest" "^1.0.4"
+    "@webpack-cli/info" "^1.3.0"
+    "@webpack-cli/serve" "^1.5.1"
     colorette "^1.2.1"
     commander "^7.0.0"
     execa "^5.0.0"
diff --git a/test/unit/utils/stringify.spec.ts b/test/unit/utils/stringify.spec.ts
index 0dcec550..d219162a 100644
--- a/test/unit/utils/stringify.spec.ts
+++ b/test/unit/utils/stringify.spec.ts
@@ -4,7 +4,7 @@ import * as fc from '../../../lib/fast-check';
 // Instead we want 'buffer' from our node_modules - the most used polyfill for Buffer on browser-side
 import { Buffer as NotNodeBuffer } from '../../../node_modules/buffer';
 
-import { stringify } from '../../../src/utils/stringify';
+import { asyncStringify, possiblyAsyncStringify, stringify } from '../../../src/utils/stringify';
 
 declare function BigInt(n: number | bigint | string): bigint;
 
@@ -366,6 +366,30 @@ describe('stringify', () => {
   });
 });
 
+describe('possiblyAsyncStringify', () => {
+  it('Should behave as "stringify" for synchronous values produced by fc.anything()', () =>
+    fc.assert(
+      fc.property(fc.anything(anythingEnableAll), (value) => {
+        const expectedStringifiedValue = stringify(value);
+        const stringifiedValue = possiblyAsyncStringify(value);
+        expect(typeof stringifiedValue).toBe('string');
+        expect(stringifiedValue as string).toBe(expectedStringifiedValue);
+      })
+    ));
+});
+
+describe('asyncStringify', () => {
+  it('Should return the same string as "stringify" for synchronous values produced by fc.anything()', () =>
+    fc.assert(
+      fc.asyncProperty(fc.anything(anythingEnableAll), async (value) => {
+        const expectedStringifiedValue = stringify(value);
+        const stringifiedValue = asyncStringify(value);
+        expect(typeof stringifiedValue).not.toBe('string');
+        expect(await stringifiedValue).toBe(expectedStringifiedValue);
+      })
+    ));
+});
+
 // Helpers
 
 function assertStringifyTypedArraysProperly<TNumber>(