{"owner":"dubzzz","repo":"fast-check","hasSkills":true,"totalSkillsCount":13,"totalTokensCount":27904,"categories":["copilot-instructions","plugin-manifest","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":[".github/copilot-instructions.md","packages/ava/README.md","packages/fast-check/README.md","packages/jest/README.md","packages/packaged/README.md","packages/poisoning/README.md","packages/vitest/README.md","packages/worker/README.md","skills/javascript-testing-expert/SKILL.md","website/docs/core-blocks/plugins/index.md","website/docs/core-blocks/plugins/life-cycle.md","website/docs/core-blocks/plugins/time-limits.md","website/docs/core-blocks/plugins/values.md"],"skills":{".github/copilot-instructions.md":"# GitHub Copilot Instructions\n\n## Pull Request Naming Convention\n\nWhen creating or naming pull requests, follow the [gitmoji](https://gitmoji.dev/) specification:\n\n### Format\n\n- **For changes to the main `fast-check` package**: Use the format `emoji Description`\n  - Example: `✨ Add new arbitrary for dates`\n  - Example: `🐛 Fix edge case in integer shrinking`\n\n- **For changes to other packages** (ava, vitest, jest, worker, poisoning, packaged): Use the format `emoji(package-name) Description`\n  - Example: `👷(vitest) Add support for new vitest features`\n  - Example: `🐛(jest) Fix compatibility with jest 29`\n  - Example: `📝(ava) Update documentation for ava integration`\n\nLimit the name of the PR to at most 50 characters for the Description part (that is, the text after the `emoji` or `emoji(package-name)` prefix). It forces the author to summarize the changes succinctly, making it easier for others to understand the main purpose of the PR at a glance.\n\n### Common Gitmoji Examples\n\n- ✨ Introduce new features\n- 🐛 Fix a bug\n- 📝 Add or update documentation\n- ✅ Add or update tests\n- 🏷️ Add or update types\n- ⚡️ Improve performance\n- 👷 Add or update CI/CD\n- ♻️ Refactor code\n- 🔧 Add or update configuration files\n- 🎨 Improve structure/format of the code\n- 🔥 Remove code or files\n- 🚀 Deploy stuff\n- 🔒️ Fix security or privacy issues\n- ⬆️ Upgrade dependencies\n- ⬇️ Downgrade dependencies\n- 📦 Add or update compiled files or packages\n\nFor a complete list of gitmoji codes, see https://gitmoji.dev/\n\n## Pull Request Template\n\nWhen creating pull requests, always use the PR template located at `.github/PULL_REQUEST_TEMPLATE.md`. The template includes:\n\n- **Description**: Provide a short description and link to related issues (if any)\n- **Checklist**: Keep the entire checklist and all of its items; only check the boxes for the items that are fulfilled.\n- **Advanced**: Fill in the Category and Impacts sections to help reviewers understand the changes\n\nMake sure to fill out all sections of the template completely and accurately, and do not delete or reorder any sections or checklist items—only update their content and checkbox states.\n","packages/ava/README.md":"# `@fast-check/ava`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into AVA.\n`@fast-check/ava` simplifies the integration of `fast-check` into AVA testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://badge.fury.io/js/@fast-check%2Fava.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fava\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/ava/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fava.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/ava`:\n\n```bash\nnpm install --save-dev @fast-check/ava\n```\n\nIn order to work properly, `@fast-check/ava` requires `ava` to be installed.\n\n## Example\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntestProp('should detect the substring', [fc.string(), fc.string(), fc.string()], (t, a, b, c) => {\n  t.true((a + b + c).includes(b));\n});\n```\n\nThe property is passed [AVA's `t` argument](https://github.com/avajs/ava/blob/main/docs/02-execution-context.md#execution-context-t-argument) as its first parameter, and the value of each arbitrary for the current test case for the rest of the parameters.\n\n`@fast-check/ava` supports all of [AVA's assertions](https://github.com/avajs/ava/blob/main/docs/03-assertions.md#assertions) and like AVA, it supports synchronous and asynchronous functions, including promises, observables, and callbacks. See [AVA's documentation](https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#declaring-test) for more information.\n\n⚠️ **WARNING:** When relying on `@fast-check/ava`, returning `true` or `false` in your predicates is not taken into account. The library wants assertions or plans to be defined as `ava` itself does. Nonetheless you can still use primitives such as `fc.pre` to cut runs at the middle if some invariants are unmeet: the started plan (if any) will just be ignored.\n\n## Advanced\n\n### `fast-check` Parameters\n\n`testProp` accepts an optional `fc.Parameters` for forwarding custom parameters to `fast-check` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should detect the substring',\n  [fc.string(), fc.string(), fc.string()],\n  (t, a, b, c) => {\n    t.true((a + b + c).includes(b));\n  },\n  { numRuns: 10 }, // Example of parameters\n);\n```\n\n### AVA Modifiers\n\n`@fast-check/ava` also comes with [`.only`], [`.serial`] [`.skip`], and [`.failing`] modifiers from AVA.\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should replay the test for the seed 4242',\n  [fc.nat(), fc.nat()],\n  (t, a, b) => {\n    t.is(a + b, b + a);\n  },\n  { seed: 4242 },\n);\n\ntestProp.skip('should be skipped', [fc.string()], (t, text) => {\n  t.is([...text].length, text.length);\n});\n```\n\n[`.only`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-specific-tests\n[`.serial`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-tests-serially\n[`.skip`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#skipping-tests\n[`.failing`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#failing-tests\n\n### AVA `before`/`after` Hooks\n\n`@fast-check/ava` exposes AVA's `before`/`after` [hooks]:\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp.before((t) => {\n  connectToDatabase();\n});\n\ntestProp();\n// ... omitted for brevity\n\ntestProp.after((t) => {\n  closeDatabaseConnection();\n});\n```\n\n[hooks]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#before--after-hooks\n\n### AVA Execution Context\n\n`@fast-check/ava` mirror's AVA's procedure for customizing the test [execution context]:\n\n```typescript\nimport { fc, testProp as anyTestProp, PropertyTestInterface } from '@fast-check/ava';\n\ntype TestContext = {\n  state: string;\n};\n\nconst testProp = anyTestProp as PropertyTestInterface<TestContext>;\n\ntestProp('should reach terminal state', [fc.string()], (t, received) => {\n  // here t is typed as ExecutionContext<TestContext>\n  console.log(t.context.state); // logs 'uninitialized'\n  // ... omitted for brevity\n});\n```\n\n[execution context]: https://github.com/avajs/ava/blob/main/docs/02-execution-context.md\n\n## Minimal requirements\n\n| @fast-check/ava | AVA                | fast-check | node                   |\n| --------------- | ------------------ | ---------- | ---------------------- |\n| **3.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥20.19.0<sup>(1)</sup> |\n| **2.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥12.22.0<sup>(2)</sup> |\n| **1.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3         | ≥12.22.0<sup>(2)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n2. As for ava 4.\n\n</details>\n","packages/fast-check/README.md":"<h1 align=\"center\">\n  <img align=\"center\" src=\"https://fast-check.dev/assets/images/logo.png\" alt=\"fast-check logo\" />\n</h1>\n\n<p align=\"center\">\nProperty based testing framework for JavaScript/TypeScript\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/actions?query=branch%3Amain+workflow%3A%22Build+Status%22\"><img src=\"https://github.com/dubzzz/fast-check/actions/workflows/build-status.yml/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://badge.fury.io/js/fast-check.svg\" alt=\"npm version\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://img.shields.io/npm/dm/fast-check\" alt=\"monthly downloads\" /></a>\n  <a href=\"https://fast-check.dev/\"><img src=\"https://img.shields.io/badge/-Documentation-%23282ea9.svg\" title=\"Documentation\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://app.codecov.io/gh/dubzzz/fast-check/branch/main\"><img src=\"https://codecov.io/gh/dubzzz/fast-check/branch/main/graph/badge.svg\" alt=\"Coverage Status (unit tests)\" /></a>\n  <a href=\"https://packagequality.com/#?package=fast-check\"><img src=\"https://packagequality.com/shield/fast-check.svg\" alt=\"Package quality\" /></a>\n  <a href=\"https://securityscorecards.dev/viewer/?platform=github.com&org=dubzzz&repo=fast-check\"><img src=\"https://api.securityscorecards.dev/projects/github.com/dubzzz/fast-check/badge\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"https://bestpractices.coreinfrastructure.org/projects/7450\"><img src=\"https://bestpractices.coreinfrastructure.org/projects/7450/badge\" alt=\"OpenSSF Best Practices\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/labels/good%20first%20issue\"><img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\" alt=\"PRs Welcome\" /></a>\n  <a href=\"https://github.com/dubzzz/fast-check/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/fast-check.svg\" alt=\"License\" /></a>\n</p>\n\n## Getting started\n\nHands-on tutorial and definition of Property Based Testing: [🏁 see tutorial](https://fast-check.dev/docs/tutorials/quick-start/). Or directly try it online on our pre-configured [CodeSandbox](https://codesandbox.io/s/github/dubzzz/fast-check/tree/main/examples?previewwindow=tests).\n\nProperty based testing frameworks check the truthfulness of properties. A property is a statement like: _for all (x, y, ...) such that precondition(x, y, ...) holds predicate(x, y, ...) is true_.\n\nInstall the module with: `pnpm add -D fast-check` or `yarn add fast-check --dev` or `npm install fast-check --save-dev`\n\nExample of integration in [mocha](http://mochajs.org/):\n\n```js\nimport * as fc from 'fast-check';\n\n// Code under test\nconst contains = (text, pattern) => text.indexOf(pattern) >= 0;\n\n// Properties\ndescribe('properties', () => {\n  // string text always contains itself\n  it('should always contain itself', async () => {\n    await fc.assert(fc.property(fc.string(), (text) => contains(text, text)));\n  });\n  // string a + b + c always contains b, whatever the values of a, b and c\n  it('should always contain its substrings', async () => {\n    await fc.assert(\n      fc.property(fc.string(), fc.string(), fc.string(), (a, b, c) => {\n        // Alternatively: no return statement and direct usage of expect or assert\n        return contains(a + b + c, b);\n      }),\n    );\n  });\n});\n```\n\nIn case of failure, the test raises a red flag. Its output should help you to diagnose what went wrong in your implementation. Example with a failing implementation of contain:\n\n```\n1) should always contain its substrings\n    Error: Property failed after 1 tests (seed: 1527422598337, path: 0:0): [\"\",\"\",\"\"]\n    Shrunk 1 time(s)\n    Got error: Property failed by returning false\n\n    Hint: Enable verbose mode in order to have the list of all failing values encountered during the run\n```\n\nIntegration with other test frameworks: [ava](https://github.com/dubzzz/fast-check-examples/blob/main/test-ava/example.spec.js), [jasmine](https://github.com/dubzzz/fast-check-examples/blob/main/test-jasmine/example.spec.js), [jest](https://github.com/dubzzz/fast-check-examples/blob/main/test-jest/example.spec.js), [mocha](https://github.com/dubzzz/fast-check-examples/blob/main/test/longest%20common%20substr/test.js) and [tape](https://github.com/dubzzz/fast-check-examples/blob/main/test-tape/example.spec.js).\n\nMore examples: [simple examples](https://github.com/dubzzz/fast-check/tree/main/examples), [fuzzing](https://github.com/dubzzz/fuzz-rest-api) and [against various algorithms](https://github.com/dubzzz/fast-check-examples).\n\nUseful documentations:\n\n- [🏁 Introduction to Property Based & Hands On](https://fast-check.dev/docs/tutorials/quick-start/)\n- [🐣 Built-in arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/)\n- [🔧 Custom arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/)\n- [🏃‍♂️ Property based runners](https://fast-check.dev/docs/core-blocks/runners/)\n- [💥 Tips](https://fast-check.dev/docs/configuration/)\n- [🔌 API Reference](https://fast-check.dev/docs/api/)\n- [⭐ Awesome fast-check](https://fast-check.dev/docs/ecosystem/)\n\n## Why should I migrate to fast-check?\n\nfast-check has initially been designed in an attempt to cope with limitations I encountered while using other property based testing frameworks designed for JavaScript:\n\n- **Types:** strong and up-to-date types - _thanks to TypeScript_\n- **Extendable:** easy `map` method to derive existing arbitraries while keeping shrink \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#map)\\] - _some frameworks ask the user to provide both a->b and b->a mappings in order to keep a shrinker_\n- **Extendable:** kind of flatMap-operation called `chain` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#chain)\\] - _able to bind the output of an arbitrary as input of another one while keeping the shrink working_\n- **Extendable:** precondition checks with `fc.pre(...)` \\[[more](https://fast-check.dev/docs/core-blocks/properties/#example)\\] - _filtering invalid entries can be done directly inside the check function if needed_\n- **Extendable:** easily switch from fake data in tests to property based with `fc.gen()` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#gen)\\] - _generate random values within your predicates_\n- **Smart:** ability to shrink on `fc.oneof` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#oneof)\\] - _surprisingly some frameworks don't_\n- **Smart:** biased by default - _by default it generates both small and large values, making it easier to dig into counterexamples without having to tweak a size parameter manually_\n- **Debug:** verbose mode \\[[more](https://fast-check.dev/docs/configuration/custom-reports/#verbosity)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-increase-verbosity)\\] - _easier troubleshooting with verbose mode enabled_\n- **Debug:** replay directly on the minimal counterexample \\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-re-run)\\] - _no need to replay the whole sequence, you get directly the counterexample_\n- **Debug:** custom examples in addition of generated ones \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#run-against-custom-values)\\] - _no need to duplicate the code to play the property on custom examples_\n- **Debug:** logger per predicate run \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#context)\\] - _simplify your troubleshoot with fc.context and its logging feature_\n- **Unique:** model based approach \\[[more](https://fast-check.dev/docs/advanced/model-based-testing/)\\]\\[[article](https://medium.com/criteo-labs/detecting-the-unexpected-in-web-ui-fuzzing-1f3822c8a3a5)\\] - _use the power of property based testing to test UI, APIs or state machines_\n- **Unique:** detect race conditions in your code \\[[more](https://fast-check.dev/docs/advanced/race-conditions/)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/detect-race-conditions/)\\] - _shuffle the way your promises and async calls resolve using the power of property based testing to detect races_\n- **Unique:** simplify user definable corner cases \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#shrink-custom-values)\\] - _simplify bug resolution by asking fast-check if it can find an even simpler corner case_\n\nFor more details, refer to the documentation in the links above.\n\n### Trusted\n\nfast-check has been trusted for years by big projects like: [jest](https://github.com/jestjs/jest), [jasmine](https://github.com/jasmine/jasmine), [fp-ts](https://github.com/gcanti/fp-ts), [io-ts](https://github.com/gcanti/io-ts), [ramda](https://github.com/ramda/ramda), [js-yaml](https://github.com/nodeca/js-yaml), [query-string](https://github.com/sindresorhus/query-string)...\n\n### Powerful\n\nIt also proved useful in finding bugs among major open source projects such as [jest](https://github.com/jestjs/jest), [query-string](https://github.com/sindresorhus/query-string)... and [many others](https://fast-check.dev/docs/introduction/track-record/).\n\n## Compatibility\n\nHere are the minimal requirements to use fast-check properly without any polyfills:\n\n| fast-check | node                   | ECMAScript version | _TypeScript (optional)_ |\n| ---------- | ---------------------- | ------------------ | ----------------------- |\n| **5.x**    | ≥22.12.0               | ES2025             | ≥5.8                    |\n| **4.x**    | ≥12.17.0<sup>(1)</sup> | ES2020             | ≥5.0                    |\n| **3.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥4.1<sup>(3)</sup>      |\n| **2.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥3.2<sup>(4)</sup>      |\n| **1.x**    | ≥0.12<sup>(2)</sup>    | ES3                | ≥3.0<sup>(4)</sup>      |\n\n<details>\n<summary>More details...</summary>\n\n1. Even if version 12.x should support most of the ES2020 features that will be leveraged by the version 4, we recommend relying at least on version 14.x of Node as it supports all the targeted specification. In addition, we highly encourage switching to still supported LTS versions of Node and not sticking to unsupported versions for too long.\n2. Except for features that cannot be polyfilled - such as `bigint`-related ones - all the capabilities of fast-check should be usable given you use at least the minimal recommended version of node associated to your major of fast-check.\n3. Require either lib or target ≥ ES2020 or `@types/node` to be installed.\n4. Require either lib or target ≥ ES2015 or `@types/node` to be installed.\n\n</details>\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dubzzz\"><img src=\"https://avatars.githubusercontent.com/u/5300235?v=4?s=100\" width=\"100px;\" alt=\"Nicolas DUBIEN\"/><br /><sub><b>Nicolas DUBIEN</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Tests\">⚠️</a> <a href=\"#infra-dubzzz\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"#design-dubzzz\" title=\"Design\">🎨</a> <a href=\"#maintenance-dubzzz\" title=\"Maintenance\">🚧</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/hath995\"><img src=\"https://avatars.githubusercontent.com/u/381037?v=4?s=100\" width=\"100px;\" alt=\"Aaron Elligsen\"/><br /><sub><b>Aaron Elligsen</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/willheslam\"><img src=\"https://avatars.githubusercontent.com/u/5377213?v=4?s=100\" width=\"100px;\" alt=\"Will Heslam\"/><br /><sub><b>Will Heslam</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=willheslam\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/kazchimo\"><img src=\"https://avatars.githubusercontent.com/u/31263328?v=4?s=100\" width=\"100px;\" alt=\"kazchimo\"/><br /><sub><b>kazchimo</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brandon-leapyear\"><img src=\"https://avatars.githubusercontent.com/u/27799541?v=4?s=100\" width=\"100px;\" alt=\"Brandon Chinn\"/><br /><sub><b>Brandon Chinn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://safareli.github.io/resume/\"><img src=\"https://avatars.githubusercontent.com/u/1932383?v=4?s=100\" width=\"100px;\" alt=\"Irakli Safareli\"/><br /><sub><b>Irakli Safareli</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=safareli\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/TheSpyder\"><img src=\"https://avatars.githubusercontent.com/u/298292?v=4?s=100\" width=\"100px;\" alt=\"Andrew Herron\"/><br /><sub><b>Andrew Herron</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TheSpyder\" title=\"Documentation\">📖</a> <a href=\"#plugin-TheSpyder\" title=\"Plugin/utility libraries\">🔌</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/EricCrosson\"><img src=\"https://avatars.githubusercontent.com/u/1596818?v=4?s=100\" width=\"100px;\" alt=\"Eric Crosson\"/><br /><sub><b>Eric Crosson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/burrscurr\"><img src=\"https://avatars.githubusercontent.com/u/23213508?v=4?s=100\" width=\"100px;\" alt=\"burrscurr\"/><br /><sub><b>burrscurr</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=burrscurr\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.dijonkitchen.org/\"><img src=\"https://avatars.githubusercontent.com/u/11434205?v=4?s=100\" width=\"100px;\" alt=\"JC (Jonathan Chen)\"/><br /><sub><b>JC (Jonathan Chen)</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dijonkitchen\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fixate.it/\"><img src=\"https://avatars.githubusercontent.com/u/1510520?v=4?s=100\" width=\"100px;\" alt=\"Larry Botha\"/><br /><sub><b>Larry Botha</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://epa.ms/RomanGusev\"><img src=\"https://avatars.githubusercontent.com/u/5839225?v=4?s=100\" width=\"100px;\" alt=\"Roman Gusev\"/><br /><sub><b>Roman Gusev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=102\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://timwis.com/\"><img src=\"https://avatars.githubusercontent.com/u/761444?v=4?s=100\" width=\"100px;\" alt=\"Tim Wisniewski\"/><br /><sub><b>Tim Wisniewski</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=timwis\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://world.hey.com/brais\"><img src=\"https://avatars.githubusercontent.com/u/17855450?v=4?s=100\" width=\"100px;\" alt=\"Brais Piñeiro\"/><br /><sub><b>Brais Piñeiro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brds\"><img src=\"https://avatars.githubusercontent.com/u/118620?v=4?s=100\" width=\"100px;\" alt=\"Renaud-Pierre Bordes\"/><br /><sub><b>Renaud-Pierre Bordes</b></sub></a><br /><a href=\"#design-brds\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/fwip\"><img src=\"https://avatars.githubusercontent.com/u/190414?v=4?s=100\" width=\"100px;\" alt=\"Jemma Nelson\"/><br /><sub><b>Jemma Nelson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=fwip\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fullof.bs/\"><img src=\"https://avatars.githubusercontent.com/u/77482?v=4?s=100\" width=\"100px;\" alt=\"John Haugeland\"/><br /><sub><b>John Haugeland</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=StoneCypher\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/treydavis\"><img src=\"https://avatars.githubusercontent.com/u/1691239?v=4?s=100\" width=\"100px;\" alt=\"Trey Davis\"/><br /><sub><b>Trey Davis</b></sub></a><br /><a href=\"#design-treydavis\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://leonzalion.com/\"><img src=\"https://avatars.githubusercontent.com/u/36966635?v=4?s=100\" width=\"100px;\" alt=\"Leon Si\"/><br /><sub><b>Leon Si</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=leonzalion\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://spion.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/502412?v=4?s=100\" width=\"100px;\" alt=\"Gorgi Kosev\"/><br /><sub><b>Gorgi Kosev</b></sub></a><br /><a href=\"#infra-spion\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/mayconsacht\"><img src=\"https://avatars.githubusercontent.com/u/5214042?v=4?s=100\" width=\"100px;\" alt=\"mayconsacht\"/><br /><sub><b>mayconsacht</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=mayconsacht\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/paldepind\"><img src=\"https://avatars.githubusercontent.com/u/521604?v=4?s=100\" width=\"100px;\" alt=\"Simon Friis Vindum\"/><br /><sub><b>Simon Friis Vindum</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/gibson042\"><img src=\"https://avatars.githubusercontent.com/u/1199584?v=4?s=100\" width=\"100px;\" alt=\"Richard Gibson\"/><br /><sub><b>Richard Gibson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gibson042\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://alanharper.com.au/\"><img src=\"https://avatars.githubusercontent.com/u/475?v=4?s=100\" width=\"100px;\" alt=\"Alan Harper\"/><br /><sub><b>Alan Harper</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=aussiegeek\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Osman-Sodefa\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Osman-Sodefa\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/sommd\"><img src=\"https://avatars.githubusercontent.com/u/7817485?v=4?s=100\" width=\"100px;\" alt=\"David Sommerich\"/><br /><sub><b>David Sommerich</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/diegopedro94\"><img src=\"https://avatars.githubusercontent.com/u/7157796?v=4?s=100\" width=\"100px;\" alt=\"Diego Pedro\"/><br /><sub><b>Diego Pedro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/BoruiGu\"><img src=\"https://avatars.githubusercontent.com/u/8686167?v=4?s=100\" width=\"100px;\" alt=\"Borui Gu\"/><br /><sub><b>Borui Gu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=BoruiGu\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/eventualbuddha\"><img src=\"https://avatars.githubusercontent.com/u/1938?v=4?s=100\" width=\"100px;\" alt=\"Brian Donovan\"/><br /><sub><b>Brian Donovan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=eventualbuddha\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/volrk\"><img src=\"https://avatars.githubusercontent.com/u/32265974?v=4?s=100\" width=\"100px;\" alt=\"volrk\"/><br /><sub><b>volrk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tinydylan\"><img src=\"https://avatars.githubusercontent.com/u/41112113?v=4?s=100\" width=\"100px;\" alt=\"tinydylan\"/><br /><sub><b>tinydylan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jasikpark\"><img src=\"https://avatars.githubusercontent.com/u/10626596?v=4?s=100\" width=\"100px;\" alt=\"Caleb Jasik\"/><br /><sub><b>Caleb Jasik</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jasikpark\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rulai-hu\"><img src=\"https://avatars.githubusercontent.com/u/2570932?v=4?s=100\" width=\"100px;\" alt=\"Rulai Hu\"/><br /><sub><b>Rulai Hu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rulai-hu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/afonsojramos\"><img src=\"https://avatars.githubusercontent.com/u/19473034?v=4?s=100\" width=\"100px;\" alt=\"Afonso Jorge Ramos\"/><br /><sub><b>Afonso Jorge Ramos</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=afonsojramos\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tjenkinson.me/\"><img src=\"https://avatars.githubusercontent.com/u/3259993?v=4?s=100\" width=\"100px;\" alt=\"Tom Jenkinson\"/><br /><sub><b>Tom Jenkinson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tjenkinson\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/phormio\"><img src=\"https://avatars.githubusercontent.com/u/28146332?v=4?s=100\" width=\"100px;\" alt=\"phormio\"/><br /><sub><b>phormio</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=phormio\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://buildo.io/\"><img src=\"https://avatars.githubusercontent.com/u/2643520?v=4?s=100\" width=\"100px;\" alt=\"Giovanni Gonzaga\"/><br /><sub><b>Giovanni Gonzaga</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://caurea.org/\"><img src=\"https://avatars.githubusercontent.com/u/34538?v=4?s=100\" width=\"100px;\" alt=\"Tomas Carnecky\"/><br /><sub><b>Tomas Carnecky</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=wereHamster\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Djaler\"><img src=\"https://avatars.githubusercontent.com/u/7964583?v=4?s=100\" width=\"100px;\" alt=\"Kirill Romanov\"/><br /><sub><b>Kirill Romanov</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://giovannyg.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/5326411?v=4?s=100\" width=\"100px;\" alt=\"Giovanny González\"/><br /><sub><b>Giovanny González</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giovannyg\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/markkulube\"><img src=\"https://avatars.githubusercontent.com/u/34955942?v=4?s=100\" width=\"100px;\" alt=\"Mark Kulube\"/><br /><sub><b>Mark Kulube</b></sub></a><br /><a href=\"#infra-markkulube\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.undiscoveredfeatures.com/\"><img src=\"https://avatars.githubusercontent.com/u/354848?v=4?s=100\" width=\"100px;\" alt=\"Peter Hamilton\"/><br /><sub><b>Peter Hamilton</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hamiltop\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ChineduOzodi\"><img src=\"https://avatars.githubusercontent.com/u/11678369?v=4?s=100\" width=\"100px;\" alt=\"Chinedu Ozodi\"/><br /><sub><b>Chinedu Ozodi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ChineduOzodi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gunar\"><img src=\"https://avatars.githubusercontent.com/u/7684574?v=4?s=100\" width=\"100px;\" alt=\"Gunar Gessner\"/><br /><sub><b>Gunar Gessner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gunar\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CSBatchelor\"><img src=\"https://avatars.githubusercontent.com/u/18668440?v=4?s=100\" width=\"100px;\" alt=\"Christian Batchelor\"/><br /><sub><b>Christian Batchelor</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CSBatchelor\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tomeraberba.ch/\"><img src=\"https://avatars.githubusercontent.com/u/23299544?v=4?s=100\" width=\"100px;\" alt=\"Tomer Aberbach\"/><br /><sub><b>Tomer Aberbach</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/0xflotus\"><img src=\"https://avatars.githubusercontent.com/u/26602940?v=4?s=100\" width=\"100px;\" alt=\"0xflotus\"/><br /><sub><b>0xflotus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=0xflotus\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CodeLenny\"><img src=\"https://avatars.githubusercontent.com/u/9272847?v=4?s=100\" width=\"100px;\" alt=\"Ryan Leonard\"/><br /><sub><b>Ryan Leonard</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://blog.bitjson.com/\"><img src=\"https://avatars.githubusercontent.com/u/904007?v=4?s=100\" width=\"100px;\" alt=\"Jason Dreyzehner\"/><br /><sub><b>Jason Dreyzehner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://matinzd.dev/\"><img src=\"https://avatars.githubusercontent.com/u/24797481?v=4?s=100\" width=\"100px;\" alt=\"Matin Zadeh Dolatabad\"/><br /><sub><b>Matin Zadeh Dolatabad</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matinzd\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://goo.gl/IlWG8U\"><img src=\"https://avatars.githubusercontent.com/u/500?v=4?s=100\" width=\"100px;\" alt=\"Juan Julián Merelo Guervós\"/><br /><sub><b>Juan Julián Merelo Guervós</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=JJ\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/SimenB\"><img src=\"https://avatars.githubusercontent.com/u/1404810?v=4?s=100\" width=\"100px;\" alt=\"Simen Bekkhus\"/><br /><sub><b>Simen Bekkhus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=SimenB\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tskj\"><img src=\"https://avatars.githubusercontent.com/u/25415972?v=4?s=100\" width=\"100px;\" alt=\"Tarjei Skjærset\"/><br /><sub><b>Tarjei Skjærset</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tskj\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://denisgorbachev.com/\"><img src=\"https://avatars.githubusercontent.com/u/829578?v=4?s=100\" width=\"100px;\" alt=\"Denis Gorbachev\"/><br /><sub><b>Denis Gorbachev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=DenisGorbachev\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://senocular.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/3536716?v=4?s=100\" width=\"100px;\" alt=\"Trevor McCauley\"/><br /><sub><b>Trevor McCauley</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=senocular\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://grantkiely.com/\"><img src=\"https://avatars.githubusercontent.com/u/1948935?v=4?s=100\" width=\"100px;\" alt=\"Grant Kiely\"/><br /><sub><b>Grant Kiely</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gkiely\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/vecerek\"><img src=\"https://avatars.githubusercontent.com/u/5737996?v=4?s=100\" width=\"100px;\" alt=\"Attila Večerek\"/><br /><sub><b>Attila Večerek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.zachbjornson.com/\"><img src=\"https://avatars.githubusercontent.com/u/469365?v=4?s=100\" width=\"100px;\" alt=\"Zach Bjornson\"/><br /><sub><b>Zach Bjornson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/bennettp123\"><img src=\"https://avatars.githubusercontent.com/u/1610227?v=4?s=100\" width=\"100px;\" alt=\"Bennett Perkins\"/><br /><sub><b>Bennett Perkins</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bennettp123\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nielk\"><img src=\"https://avatars.githubusercontent.com/u/4980521?v=4?s=100\" width=\"100px;\" alt=\"Alexandre Oger\"/><br /><sub><b>Alexandre Oger</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ej-shafran\"><img src=\"https://avatars.githubusercontent.com/u/116496520?v=4?s=100\" width=\"100px;\" alt=\"ej shafran\"/><br /><sub><b>ej shafran</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ej-shafran\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gruhn\"><img src=\"https://avatars.githubusercontent.com/u/26570572?v=4?s=100\" width=\"100px;\" alt=\"Niklas Gruhn\"/><br /><sub><b>Niklas Gruhn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gruhn\" title=\"Code\">💻</a> <a href=\"#question-gruhn\" title=\"Answering Questions\">💬</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://patrickroza.com/\"><img src=\"https://avatars.githubusercontent.com/u/42661?v=4?s=100\" width=\"100px;\" alt=\"Patrick Roza\"/><br /><sub><b>Patrick Roza</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=patroza\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/cindywu\"><img src=\"https://avatars.githubusercontent.com/u/1177031?v=4?s=100\" width=\"100px;\" alt=\"Cindy Wu\"/><br /><sub><b>Cindy Wu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=cindywu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nmay231\"><img src=\"https://avatars.githubusercontent.com/u/35386821?v=4?s=100\" width=\"100px;\" alt=\"Noah\"/><br /><sub><b>Noah</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nmay231\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jamesbvaughan\"><img src=\"https://avatars.githubusercontent.com/u/2906913?v=4?s=100\" width=\"100px;\" alt=\"James Vaughan\"/><br /><sub><b>James Vaughan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/AlexErrant\"><img src=\"https://avatars.githubusercontent.com/u/109672176?v=4?s=100\" width=\"100px;\" alt=\"Alex Errant\"/><br /><sub><b>Alex Errant</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=AlexErrant\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ahrjarrett.com/\"><img src=\"https://avatars.githubusercontent.com/u/15133992?v=4?s=100\" width=\"100px;\" alt=\"andrew jarrett\"/><br /><sub><b>andrew jarrett</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/matthyk\"><img src=\"https://avatars.githubusercontent.com/u/53833818?v=4?s=100\" width=\"100px;\" alt=\"Matthias Keckl\"/><br /><sub><b>Matthias Keckl</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matthyk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dmurvihill\"><img src=\"https://avatars.githubusercontent.com/u/1649120?v=4?s=100\" width=\"100px;\" alt=\"Dolan Murvihill\"/><br /><sub><b>Dolan Murvihill</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dmurvihill\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/emilianbold\"><img src=\"https://avatars.githubusercontent.com/u/991554?v=4?s=100\" width=\"100px;\" alt=\"Emi\"/><br /><sub><b>Emi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=emilianbold\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.russbiggs.com/\"><img src=\"https://avatars.githubusercontent.com/u/8487728?v=4?s=100\" width=\"100px;\" alt=\"Russ Biggs\"/><br /><sub><b>Russ Biggs</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=russbiggs\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/adamni21\"><img src=\"https://avatars.githubusercontent.com/u/85580454?v=4?s=100\" width=\"100px;\" alt=\"adamni21\"/><br /><sub><b>adamni21</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=adamni21\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/josephjunker\"><img src=\"https://avatars.githubusercontent.com/u/1519098?v=4?s=100\" width=\"100px;\" alt=\"Joseph Junker\"/><br /><sub><b>Joseph Junker</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=josephjunker\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rushelex\"><img src=\"https://avatars.githubusercontent.com/u/41122157?v=4?s=100\" width=\"100px;\" alt=\"Aleksey Shelementev\"/><br /><sub><b>Aleksey Shelementev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rushelex\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rugk\"><img src=\"https://avatars.githubusercontent.com/u/11966684?v=4?s=100\" width=\"100px;\" alt=\"rugk\"/><br /><sub><b>rugk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rugk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/makeeno\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=makeeno\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jneidel.com/\"><img src=\"https://avatars.githubusercontent.com/u/25589715?v=4?s=100\" width=\"100px;\" alt=\"Jonathan Neidel\"/><br /><sub><b>Jonathan Neidel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jneidel\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jkomyno.dev/\"><img src=\"https://avatars.githubusercontent.com/u/12381818?v=4?s=100\" width=\"100px;\" alt=\"Alberto Schiabel\"/><br /><sub><b>Alberto Schiabel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jkomyno\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/zek\"><img src=\"https://avatars.githubusercontent.com/u/3463291?v=4?s=100\" width=\"100px;\" alt=\"Zek\"/><br /><sub><b>Zek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Tests\">⚠️</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! [Become one of them](CONTRIBUTING.md)\n\n## Sponsors 💸\n\nMany individuals and companies offer their financial support to the project, a huge thanks to all of them too 💓\n\n<a href=\"https://github.com/sponsors/dubzzz\"><img align=\"center\" src=\"https://raw.githubusercontent.com/dubzzz/sponsors-svg/main/sponsorkit/sponsors.svg\" alt=\"all sponsors\" /></a>\n\nYou can also become one of them by contributing via [GitHub Sponsors](https://github.com/sponsors/dubzzz) or [OpenCollective](https://opencollective.com/fast-check/contribute).\n","packages/jest/README.md":"# `@fast-check/jest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Jest.\n`@fast-check/jest` simplifies the integration of `fast-check` into Jest testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fjest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fjest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fjest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/jest`:\n\n```bash\nnpm install --save-dev @fast-check/jest\n```\n\nIn order to work properly, `@fast-check/jest` requires `jest` to be installed.\n\nWe also highly recommend users to launch their tests using the `--show-seed` option provided by Jest. It ensures Jest will always print the seed by itself (requires Jest ≥29.2.0).\n\n```sh\njest --show-seed\n```\n\n## Example\n\n```javascript\nimport { test, fc } from '@fast-check/jest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// Or the exact same test but based on named parameters\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nThe `it` and `test` functions returned by `@fast-check/jest` are just enriched versions of the ones coming from `jest` itself. They both come with `.prop`.\n\nPlease note that the properties accepted by `@fast-check/jest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances). In other words, the predicate passed as the last argument can be asynchronous.\n\n**Remark:** `it` and `test` have been introduced in 1.4.0. You have to refer to [Deprecated API](#deprecated-api) if you are using a version of `@fast-check/jest` <1.4.0.\n\n## Advanced\n\n### Support for variations of `test` and `it`\n\nIf you want to forward custom parameters to `fast-check`, `test.prop` and its variants accept an optional `fc.Parameters` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n`@fast-check/jest` also comes with support for `.only`, `.skip`, `.todo` and `.concurrent` from `jest`. It also accepts more complex ones such as `.concurrent.failing` or `.concurrent.only.failing`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/jest';\n\n// With custom `fc.Parameters`, here { seed: 4242 }\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\n// With .skip\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\n// With it version\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n### Experimental worker-based runner\n\n**The following feature is experimental!** When used it makes runners able to kill long running synchonous code. Meaning that it will make fast-check able to kill infinite loops blocking the main thread. So far, the feature does not fully support transformations performed via transform steps defined with jest.\n\nThe CommonJS approach would be:\n\n```js\nconst { init, fc } = require('@fast-check/jest/worker');\nconst { pathToFileURL } = require('node:url');\n\nconst { test, expect } = init(pathToFileURL(__filename));\n// can also be passed options such as isolationLevel: init(pathToFileURL(__filename), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\nThe ES Modules approach would be:\n\n```js\nimport { init, fc } from '@fast-check/jest/worker';\n\nconst { test, expect } = await init(new URL(import.meta.url));\n// can also be passed options such as isolationLevel: init(new URL(import.meta.url), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\n⚠️ Do not forget to add the `await` before `init` for the ES Module version!\n\n#### Extra setup for `@fast-check/worker` 0.6.0 and later\n\nSince `@fast-check/worker` is an ESM-only package, running it under Jest in CommonJS mode requires `babel-jest` to transpile it. Install the following dependencies:\n\n```bash\nnpm install --save-dev babel-jest @babel/core @babel/preset-env\n```\n\nThen add a `babel.config.cjs` at the root of your project:\n\n```js\nmodule.exports = {\n  presets: [['@babel/preset-env', { targets: { node: 'current' }, modules: 'commonjs' }]],\n};\n```\n\nAnd update your Jest configuration to use `babel-jest` while excluding `@fast-check/worker` from the ignore patterns:\n\n```js\nmodule.exports = {\n  transform: {\n    '^.+\\\\.[t|j]sx?$': 'babel-jest',\n  },\n  transformIgnorePatterns: ['/node_modules/(?!(?:@fast-check/worker)/)'],\n};\n```\n\nThis ensures `@fast-check/worker` gets transpiled to CommonJS by Babel instead of being skipped. Without it, Jest will fail to load the ESM-only package.\n\nFor ES Modules mode, no extra setup is needed — just make sure to run Jest with `--experimental-vm-modules`:\n\n```bash\nnode --experimental-vm-modules node_modules/jest/bin/jest.js\n```\n\n## Minimal requirements\n\n| @fast-check/jest | jest                                    | fast-check | node                                                                                  |\n| ---------------- | --------------------------------------- | ---------- | ------------------------------------------------------------------------------------- |\n| ^2.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n| ^1.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n\n- (1) any version of `jest` should be greater or equal than 26.5.0 if you are using `commonjs`\n- (2) in order to use `esm` build, you may need to enable experimental features of node, see [here](https://github.com/dubzzz/fast-check/blob/main/packages/test-jest-bundle-esm/package.json)\n- (3) &gt;=14.15.0 is the minimal requirements for `jest`, &gt;=12.17.0 is the one for `@fast-check/jest`\n- (4) timeout defined on jest might not be properly applied to fast-check for node 18 (until 18.17.0) and node 19, see [#4004](https://github.com/dubzzz/fast-check/pull/4004)\n","packages/packaged/README.md":"# `@fast-check/packaged`\n\nUtility package removing any files that will not be part of the final bundle published to npm registry\n\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpackaged.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpackaged\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/packaged/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpackaged.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nWhen publishing packages to npm registry, it is quite easy to forget about some files. It also happens many times that we want somehow to check the packaged bundle in some of our tests but totally forget that some files have not been added to the bundle and so that the final user will actually never be able to run this code.\n\nThis package mostly try to prevent this issue. It can easily be used in monorepos to emulate the bundled package when used against other packages of the monorepo to make sure others do not depend on internals or non published stuff.\n\n## Easy to use\n\nRun the following command at the root of your package to drop any file that will not make it in the final bundle published to npm.\n\n```bash\n# With npm\nnpx -p @fast-check/packaged packaged\n# With pnpm\npnpm --package=@fast-check/packaged dlx packaged\n# With yarn\nyarn dlx -p @fast-check/packaged packaged\n```\n\n⚠️ You may want to try with `--dry-run` flag first to give it a try.\n\nIt also comes with some extra flags:\n\n- `--dry-run`: do not drop any file or directory from the file system and only print what would have been removed\n- `--keep <name>`: keep a root-level file or directory matching the exact name (not a glob pattern, can be specified multiple times, e.g. `--keep node_modules --keep src`)\n\n## Simple API\n\n```js\nimport { computePublishedFiles, removeNonPublishedFiles } from '@fast-check/packaged';\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at .\nconst publishedFilesRoot = await computePublishedFiles('.');\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at ./sub-directory\nconst publishedFilesSubDirectory = await computePublishedFiles('./sub-directory');\n\n// Run the deletion of unwanted files\nconst { kept, removed } = await removeNonPublishedFiles('.', { dryRun: false, keep: [] });\n// kept and removed are arrays of strings\n// they may contain files or directories\n```\n\n## Minimal requirements\n\n| @fast-check/packaged | node                   |\n| -------------------- | ---------------------- |\n| **0.6.x**            | ≥20.19.0<sup>(1)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n\n</details>\n","packages/poisoning/README.md":"# `@fast-check/poisoning`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nSet of utilities to ease detection and revert of poisoning\n\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpoisoning.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpoisoning\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/poisoning/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpoisoning.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nIn JavaScript, \"prototype poisoning\" is one of the most common source for CVEs or zero days. It allows attackers to change the behaviour of some defaults like `Array.prototype.map`, `Map`, `Set`... so that they behave differently and can be leveraged for evil stuffs. This package can be used in addition to `fast-check` in order to detect poisoning that may occur during your property based tests.\n\n## Easy to use\n\nThe package comes with:\n\n- `assertNoPoisoning`: assert that the defaults known when first importing the package in your code have not been changed\n- `restoreGlobals`: restore the defaults so that any change that could have been detected by `assertNoPoisoning` will be resolved\n\n## Minimal requirements\n\n- Node ≥20.19.0\n","packages/vitest/README.md":"# `@fast-check/vitest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Vitest.\n`@fast-check/vitest` simplifies the integration of `fast-check` into Vitest.\n\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fvitest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fvitest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fvitest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/vitest`:\n\n```bash\nnpm install --save-dev @fast-check/vitest\n```\n\nIn order to work properly, `@fast-check/vitest` requires `vitest` to be installed.\n\n## Examples\n\nThe library comes with two modes, both powered by fast-check:\n\n- One-time random mode – A lightweight approach that introduces controlled randomness into your tests while keeping runs reproducible.\n- Property-based testing mode – A full-fledged property-based testing approach leveraging the full capabilities of fast-check.\n\n### One-time random mode\n\nThis mode extends Vitest's default `test` and `it` functions, allowing you to introduce controlled randomness into your tests while ensuring failures remain reproducible. This makes it easier to debug flaky tests and avoid irreproducible failures due to randomness.\n\nUnlike property-based testing, this mode does not run tests multiple times or attempt shrinking when failures occur. Instead, it provides a determistic way to introduce randomness when needed.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\nimport { expect } from 'vitest';\n\n// You can provide a fixed seed to force a replay by adding this line:\n// >>  fc.configureGlobal({ seed })\n// Eventually you can disable shrinking capabilities with:\n// >>  fc.configureGlobal({ endOnFailure: false })\n// >>  // or combine it with the one above if you need both\n\ntest('test relying on randomness', ({ g }) => {\n  // Arrange\n  const user = {\n    firstName: g(fc.string),\n    lastName: g(fc.string),\n  };\n\n  // Act\n  const displayName = computeDisplayName(user);\n\n  // Assert\n  expect(displayName).toContain(user.firstName);\n});\n\ntest('test not relying on randomness', () => {\n  // your test\n});\n```\n\n### Full property-based mode\n\nFor more extensive testing, `@fast-check/vitest` also provides full support for property-based testing. This mode enables exhaustive, randomized testing by generating a variety of inputs and detecting edge cases automatically.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// same property but using named values\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nPlease note that the properties accepted by `@fast-check/vitest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances).\n\n### Seamless integration with Vitest's `beforeEach` / `afterEach`\n\nVitest's `beforeEach` and `afterEach` hooks are natively integrated into predicates. They are called respectively before and after each execution of the predicate. If a predicate runs _n_ times, `beforeEach` will be called _n_ times before it and `afterEach` _n_ times after it. The only caveat is that cleanup functions returned by `beforeEach` on the first predicate execution are deferred until the end of the test, as they are handled by vitest's own teardown mechanism. All other cleanups run between predicate executions as expected.\n\n### Advanced\n\nIf you want to forward custom parameters to fast-check, `test.prop` accepts an optional `fc.Parameters` ([more](https://github.com/dubzzz/fast-check/blob/main/documentation/1-Guides/Runners.md#runners)).\n\n`@fast-check/vitest` also comes with `.only`, `.skip`, `.todo` and `.concurrent` from vitest. It also accepts more complex ones such as `.concurrent.skip`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/vitest';\n\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n## Minimal requirements\n\n| @fast-check/vitest | vitest                                                              | fast-check                       | Node                                                                   |\n| ------------------ | ------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------- |\n| **0.4**            | ^4.1.0 \\|\\| ^5.0.0                                                  | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup> (Vitest 4)<br>≥22.12.0<sup>(2)</sup> (Vitest 5) |\n| **0.3**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4                                          | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup>                                                 |\n| **0.2**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4<sup>(1)</sup>                            | ^3.0.0 \\|\\| ^4.0.0               | ≥18<sup>(3)</sup>                                                      |\n| **0.1**            | >=0.28.1 <1.0.0 \\|\\| ^1 \\|\\| ^2<sup>(4)</sup> \\|\\| ^3<sup>(5)</sup> | ^3.0.0 \\|\\| ^4.0.0<sup>(6)</sup> | ≥14.16.0<sup>(3)</sup>                                                 |\n| **0.0**            | >=0.28.1 <1.0.0 \\|\\| ^1                                             | ^3.0.0                           | ≥14.16.0<sup>(3)</sup>                                                 |\n\n<details>\n<summary>More details...</summary>\n\n1. Official support for version 4.x of vitest starts at 0.2.3.\n2. Requires support for `require(esm)`.\n3. Same support as vitest.\n4. Official support for version 2.x of vitest starts at 0.1.2.\n5. Official support for version 3.x of vitest starts at 0.1.5.\n6. Official support for version 4.x of fast-check starts at 0.1.6.\n\n</details>\n","packages/worker/README.md":"# `@fast-check/worker`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nProvide built-ins to run predicates directly within dedicated workers\n\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://badge.fury.io/js/@fast-check%2Fworker.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fworker\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/worker/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fworker.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\n`fast-check` alone is great but what if it led your code into an infinite and synchronous loop for such inputs? In such case, it would neither be able to shrink the issue, nor to report any for you as the single threaded philosophy at the root of JavaScript will prevent it from anything except waiting for the main thread to come back.\n\nThis package tends to provide a way to run easily your properties within dedicated workers automatically spawed by it.\n\n## Example\n\nHere are some of the changes you will have to do:\n\n- hoist properties so that they get declared on the root scope\n- replace `fc.property` by `property` coming from `propertyFor(<path-to-file>)`\n- replace `fc.assert` by `assert` coming from `@fast-check/worker` for automatic cleaning of the workers as the test ends\n- transpilation has not been addressed yet but it may probably work\n- in theory, if you were only using `propertyFor` and `assert` without any external framework for `test`, `it` and others, the separation of the property from the assertion would be useless as the check for main thread is fully handled within `@fast-check/worker` itself so no hoisting needing in such case\n\n```js\nimport { test } from '@jest/globals';\nimport * as fc from 'fast-check';\nimport { isMainThread } from 'node:worker_threads';\nimport { assert, propertyFor } from '@fast-check/worker';\n\nconst property = propertyFor(new URL(import.meta.url)); // or propertyFor(pathToFileURL(__filename)) in commonjs\nconst p1 = property(fc.nat(), fc.nat(), (start, end) => {\n  // starting a possibly infinite loop\n  for (let i = start; i !== end; ++i) {\n    // doing stuff...\n  }\n});\n\nif (isMainThread) {\n  test('should assess p1', async () => {\n    await assert(p1, { plugins: [fc.timeout(1000)] });\n  });\n}\n```\n\nRefer to the tests defined `test/main.spec.ts` for a living example of how you can use this package with a test runner such as Jest.\n\n## Extra options\n\nThe builder of properties `propertyFor` accepts a second parameter to customize how the workers will behave. By default, workers will be shared across properties. In case you want a more isolation between your runs, you can use:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { isolationLevel: 'predicate' });\n// Other values:\n// - \"file\": Re-use workers cross properties (default)\n// - \"property\": Re-use workers for each run of the predicate. Not shared across properties!\n// - \"predicate\": One worker per run of the predicate\n```\n\nBy default, workers will receive the generated values from their parent thread. In some cases, such sending is made impossible as the generated values include non-serializable pieces. In such cases, you can opt-in to generate the values directly within the workers by using:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { randomSource: 'worker' });\n// Other values:\n// - \"main-thread\": The main thread will be responsible to generate the random values and send them to the worker thread. It unfortunately cannot send any value that cannot be serialized between threads. (default)\n// - \"worker\": The worker is responsible to generate its own values based on the instructions provided by the main thread. Switching to a worker mode allows to support non-serializable values, unfortunately it drops all shrinking. capabilities.\n```\n\n## Minimal requirements\n\n- Node ≥14.18.0<sup>(1)</sup><sup>(2)</sup><sup>(3)</sup>\n- TypeScript ≥4.1 (optional)\n\n_(1): `worker_threads` alone would only require Node ≥10.5.0, but our usage of `require(node:*)` forces us to request at least Node ≥14.18.0_\n\n_(2): this package targets ES2020 specification which is quite well supported (more than 94%) by any Node ≥14.5.0_\n\n_(3): this package requires a version of node able to understand `package.json#exports`, supported by any Node ≥12.17.0_\n","skills/javascript-testing-expert/SKILL.md":"---\nname: javascript-testing-expert\ndescription: Expert-level JavaScript testing skill focused on writing high-quality tests that find bugs, serve as documentation, and prevent regressions. Advocates for property-based testing with fast-check and protects against indeterministic code in tests. Does not cover black-box e2e testing.\n---\n\n> **⚠️ Scope:** Testing functions and components, not black-box e2e.\n\n**🏅 Main objectives:** use tests as a way to...\n\n1. uncover hard to detect bugs\n2. document how to use the code\n3. avoid regressions\n4. challenge the code\n\n**🔧 Recommended tooling:** `vitest`, `fast-check`, `@fast-check/vitest`, `@testing-library/*`, `@vitest/browser-playwright`, `msw` installed as devDependencies.  \n**✅ Do** try to install missing and relevant tooling, only recommend for `@fast-check/vitest` and browser testing.  \n**✅ Do** highly recommend user to install missing and relevant tooling.  \n**✅ Do** adapt yourself to missing tools.\n\n## File and code layout\n\n**✅ Do** mimic the existing test structure of the project when adding new tests\n\n**✅ Do** use one test file per code file\n\n**👍 Prefer** using `.spec.ts` extension (e.g., `fileName.ts` → `fileName.spec.ts`) and colocated with the source file if no existing test structure is present\n\n**✅ Do** put `it` within `describe`, when using `it`\n\n**👍 Prefer** `it` over `test`\n\n**✅ Do** name the `describe` with the name of the function being tested\n\n**✅ Do** use a dedicated `describe` for each function being tested\n\n**✅ Do** start naming `it` with \"should\" and considers that the name should be clear, as consise as possible and could be read as a sentence implicitly prefixed by \"it\"\n\n**✅ Do** start with simple and documenting tests\n\n**✅ Do** continue with advanced tests looking for edge-cases\n\n**❌ Don't** delimitate explicitely simple from advanced tests, just but them in the right order\n\n**✅ Do** put helper functions specific to the file after all the `describe`s just below a comment `// Helpers` stating the beginning of the helpers tailored for this file\n\n## Core guidelines\n\n**✅ Do** follow the AAA pattern and make it visible in the test\n\n```ts\nit('should...', () => {\n  // Arrange\n  code;\n\n  // Act\n  code;\n\n  // Assert\n  code;\n});\n```\n\n**✅ Do** keep tests focused, try to assert on one precise aspect\n\n**✅ Do** keep tests simple\n\n**👎 Avoid** complex logic in tests or its helpers\n\n**❌ Don't** test internal details\n\n**👍 Prefer** stubs over mocks, the first one provides an alternate implementation, the second one helps to assert on calls being done or not  \nWhy? Often, asserting the number of calls is not something critical for the user of the function but purely an internal detail\n\n**❌ Don't** rely on network call, stub it with `msw`\n\n**✅ Do** reset globals and mocks in `beforeEach` if any `it` plays with mocks or spies or alter globals  \nAlternatively, when using vitest you could check if flags `mockReset`, `unstubEnvs` and `unstubGlobals` have been enabled in the configuration, in such case resetting globals is done by default\n\n**👍 Prefer** realistic data for documentation-like tests  \nEg.: use real names if you have to build instances of users\n\n**❌ Don't** overuse snapshot tests; only snapshot things when the \"what is expected to be seen in the snapshot\" is clear  \nWhy? Snapshots tests tend to capture too many details in the snapshot, making them hard to update given future reader is lost on what was the real thing being tested\n\n**👍 Prefer** snapshots when shape and structure are important (component hierarchy, attributes, non-regression on output structure)\n\n**👍 Prefer** screenshots when final render is important (visual styling, layout)\n\n**✅ Do** warn developer when the code under tests requires too many parameters and/or too many mocks/stubs to be forged (more than 10)  \nWhy? Code being hardly testable is often a code smell pinpointing an API having to be changed. Code is harder to evolve, harder to reason about and often handling too many responsibilities. Recommend the single-responsibility principle (SRP)\n\n**✅ Do** try to make tests shorter and faster to read by factorizing recurrent logics into helper functions\n\n**✅ Do** group shared logics under a function having a clear and explicit name, follow SRP for these helpers  \nEg.: avoid functions with lots of optional parameters, doing several things\n\n**❌ Don't** write a big `prepare` function re-used by all tests in their act part, but make the name clearer and eventually split it into multiple functions\n\n**✅ Do** make sure your test breaks if you drop the thing supposed to make it pass  \nEg.: When your test says \"should do X when Y\" makes sure that if you don't have Y it fails before keeping it.\n\n**👎 Avoid** writing tests with entities specifying hardcoded values on unused fields\n\nExample of test content\n\n```ts\nconst user: User = {\n  name: 'Paul', // unused\n  birthday: '2010-02-03',\n};\nconst age = computeAge(user);\n//...\n```\n\n**👍 Prefer** leveraging `@fast-check/vitest`, if installed\n\n```ts\nimport { describe } from 'vitest';\nimport { it, fc } from '@fast-check/vitest';\n\ndescribe('computeAge', () => {\n  it('should compute a positive age', ({ g }) => {\n    // Arrange\n    const user: User = {\n      name: g(fc.string), // unused\n      birthday: '2010-02-03',\n    };\n\n    // Act\n    const age = computeAge(user);\n\n    // Assert\n    expect(age).toBeGreaterThan(0);\n  });\n});\n```\n\n**👍 Prefer** leveraging `fast-check`, if installed but not `@fast-check/vitest`\n\n**👎 Avoid** writing tests depending on unstable values  \nEg.: in the example above `computeAge` depends on the current date  \nRemark: same for locales and plenty other platform dependent values\n\n**👍 Prefer** stubbing today using `vi.setSystemTime`\n\n**👍 Prefer** controlling today using `@fast-check/vitest`  \nWhy? Contrary to `vi.setSystemTime` alone you check the code against one new today at each run, but if it happens to fail one day you will be reported with the exact date causing the problem\n\n```ts\n// Arrange\nvi.setSystemTime(g(fc.date, { min: new Date('2010-02-04'), noInvalidDate: true }));\nconst user: User = {\n  name: g(fc.string), // unused\n  birthday: '2010-02-03',\n};\n```\n\n**👎 Avoid** writing tests depending on random values or entities\n\n**👍 Prefer** controlling randomly generated values by relying on `@fast-check/vitest` if installed, or `fast-check` otherwise\n\n**✅ Do** use property based tests for any test with a notion of always or never  \nEg.: name being \"should always do x when y\" or \"should never do x when y\"  \nRemark: consider these tests as advanced and put them after the documentation tests and not with them\n\n**👍 Prefer** using property based testing for edge case detection instead of writing all cases one by one\n\n**❌ Don't** try to test 100% of the algorithm cases using property-based testing\nWhy? Property-based testing and example-based testing are complementary. Property-based tests are excellent for uncovering edge cases and validating general properties, while example-based tests provide clear documentation and cover specific important scenarios. Use both approaches together for comprehensive test coverage.\n\n```ts\n// for all a, b, c strings\n// b is a substring of a + b + c\nit.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  // Arrange\n  const text = a + b + c;\n  const pattern = b;\n\n  // Act\n  const result = isSubstring(text, pattern);\n\n  // Assert\n  expect(result).toBe(true);\n});\n```\n\n**✅ Do** extract complex logic from components into dedicated and testable functions\n\n**❌ Don't** test trivial component logic that has zero complexity\n\n**👍 Prefer** testing the DOM structure and user interactions when using testing-library\n\n**👍 Prefer** testing the visual display and user interactions when using browser testing\n\n**👍 Prefer** querying by accessible attributes and user-visible text by relying on `getByRole`, `getByLabelText`, `getByText` over `getByTestId` whenever possible for testing-library and browser testing\n\n**✅ Do** ensure non visual regression of Design System components and more generally visual components by leveraging screenshot tests in browser when available  \n**✅ Do** fallback to snapshot tests capturing the DOM structure if screenshot tests cannot be ran\n\n## Guidelines for properties\n\nAll this section considers that we are in the context of property based tests!\n\n**⚠️ Version compatibility:** Starting with fast-check v5, use `fc.property` for both synchronous and asynchronous predicates. With fast-check v4, use `fc.property` for synchronous predicates and `fc.asyncProperty` for asynchronous predicates.\n\n**✅ Do** always await `fc.assert(...)` when using `fast-check` directly, in both v4 and v5+, even when the predicate is synchronous. Make the surrounding test callback `async` so property failures are reported by the test runner.\n\n**⚠️ Important:** When using `g` from `@fast-check/vitest`, pass the arbitrary **function** (e.g., `fc.string`, `fc.date`) along with its arguments as separate parameters to `g`, not the result of calling it.  \nCorrect: `g(fc.string)`, `g(fc.date, { min: new Date('2010-01-01') })`  \nIncorrect: `g(fc.string())`, `g(fc.date({ min: new Date('2010-01-01') }))`\n\n**❌ Don't** generate inputs directly  \nThe risk being that you may end up rewriting the code being tested in the test\n\n**✅ Do** construct values to build some inputs where you know the expected outcome\n\n**❌ Don't** expect the returned value in details, in many cases you won't have enough details to be able to assert the full value\n\n**✅ Do** expect some aspects and characteristics of the returned value\n\n**❌ NEVER** specify any `maxLength` on an arbitrary if it is a not a requirement of the algorithm  \n**👍 Prefer** specifying a `size: '-1'` if you feel that the algorithm will take very long on large inputs (by default fast-check generates up to 10 items, so only use `size` when clearly required)  \nEg.: No `fc.string({maxLength: 5})` or `fc.array(arb, {maxLength: 8})` except being a string requirement\n\n**❌ NEVER** specify any constraint on an arbitrary if it is not a requirement of the arbitrary, use defaults as much as possible  \nEg.: if the algorithm should accept any integer just ask an integer without specifying any min and max\n\n**👎 Avoid** overusing `.filter` and `fc.pre`  \nWhy? They slow down the generation of values by dropping some generated ones\n\n**👍 Prefer** using options provided by arbitraries to directly generate valid values  \nEg.: use `fc.string({ minLength: 2 })` instead of `fc.string().filter(s => s.length >= 2)`  \nEg.: use `fc.integer({ min: 1 })` instead of `fc.integer().filter(n => n >= 1)`, or use `fc.nat()` instead of `fc.integer().filter(n => n >= 0)`\n\n**👍 Prefer** using `map` over `filter` when a `map` trick can avoid filtering  \nEg.: use `fc.nat().map(n => n * 2)` for even numbers  \nEg.: use `fc.tuple(fc.string(), fc.string()).map(([start, end]) => start + 'A' + end)` for strings always having an 'A' character\n\n**👍 Prefer** bigint type over number type for integer computations used within predicates when there is a risk of overflow (eg.: when running pow, multiply.. on generated values)\n\nSome classical properties:\n\n1. Characteristics independent of the inputs. _Eg.: for any floating point number d, Math.floor(d) is an integer. for any integer n, Math.abs(n) ≥ 0_\n2. Characteristics derived from the inputs. _Eg.: for any a and b integers, the average of a and b is between a and b. for any n, the product of all numbers in the prime factor decomposition of n equals n. for any array of data, sorted(data) and data contains the same elements. for any n1, n2 integers such that n1 != n2, romanString(n1) != romanString(n2). for any floating point number d, Math.floor(d) is an integer such as d-1 ≤ Math.floor(d) ≤ d_\n3. Restricted set of inputs with useful characteristics. _Eg.: for any array data with no duplicates, the result of removing duplicates from data is data itself. for any a, b and c strings, the concatenation of a, b and c always contains b. for any prime number p, its decomposition into prime factors is itself_\n4. Characteristics on combination of functions. _Eg.: zipping then unzipping a file should result in the original file. lcm(a,b) times gcd(a,b) must be equal to a times b_\n5. Comparison with a simpler implementation. _Eg.: c is contained inside sorted array data for binary search is equivalent to c is contained inside data for linear search_\n\n## Guidelines for race conditions\n\n**✅ Do** write tests checking for race conditions and playing with resolution order — _automatically handled by `fast-check`_ — when an algorithm accepts asynchronous functions as input\n\n**✅ Do** leverage `fast-check` and its `fc.scheduler()` arbitrary to test asynchronous code depending on asynchronous functions\n\nTurn:\n\n```ts\nit('should resolve in call order', async () => {\n  // Arrange\n  const seenAnswers = [];\n  const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n  // Act\n  const queued = queue(call);\n  await Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]);\n\n  // Assert\n  expect(seenAnswers).toEqual([1, 2]);\n});\n```\n\nInto (fast-check v5+; use `fc.asyncProperty` instead of `fc.property` in v4):\n\n```ts\nit('should resolve in call order', async () => {\n  await fc.assert(\n    fc.property(fc.scheduler(), async (s) => {\n      // Arrange\n      const seenAnswers = [];\n      const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n      // Act\n      const queued = queue(s.scheduleFunction(call));\n      await s.waitFor(\n        Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]),\n      );\n\n      // Assert\n      expect(seenAnswers).toEqual([1, 2]);\n    }),\n  );\n});\n```\n\n## Recommendation for faker users\n\nIf using `faker` to fake data, we recommend wiring any fake data generation within `fast-check` by leveraging this code snippet:\n\n```ts\n// Source: https://fast-check.dev/blog/2024/07/18/integrating-faker-with-fast-check/\nimport { Faker, Randomizer, base } from '@faker-js/faker';\nimport * as fc from 'fast-check';\n\nclass FakerBuilder<TValue> extends fc.Arbitrary<TValue> {\n  constructor(private readonly generator: (faker: Faker) => TValue) {\n    super();\n  }\n  generate(mrng: fc.Random, biasFactor: number | undefined): fc.Value<TValue> {\n    const randomizer: Randomizer = {\n      next: (): number => (mrng.nextInt(0, 0x3ffffff) * 2 ** 27 + mrng.nextInt(0, 0x7ffffff)) / 2 ** 53,\n      seed: () => {}, // no-op, no support for updates of the seed, could even throw\n    };\n    const customFaker = new Faker({ locale: base, randomizer });\n    return new fc.Value(this.generator(customFaker), undefined);\n  }\n  canShrinkWithoutContext(value: unknown): value is TValue {\n    return false;\n  }\n  shrink(value: TValue, context: unknown): fc.Stream<fc.Value<TValue>> {\n    return fc.Stream.nil();\n  }\n}\n\nfunction fakerToArb<TValue>(generator: (faker: Faker) => TValue): fc.Arbitrary<TValue> {\n  return new FakerBuilder(generator);\n}\n```\n\nExample of usage\n\n```ts\nawait fc.assert(\n  fc.property(\n    fakerToArb((faker) => faker.person.firstName),\n    fakerToArb((faker) => faker.person.lastName),\n    (firstName, lastName) => {\n      // code\n    },\n  ),\n);\n```\n\n## Equivalence `fast-check` and `@fast-check/vitest`\n\nExample 1.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit('...', ({ g }) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(fc.gen(), (g) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 2.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, (...values) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 3. For asynchronous predicates, use `fc.property` in fast-check v5+ (as shown below) and `fc.asyncProperty` in v4. Always await `fc.assert`, just as in the synchronous examples above.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', async (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, async (...values) => {\n      //...\n    }),\n  );\n});\n```\n","website/docs/core-blocks/plugins/index.md":"---\nsidebar_position: 4\nslug: /core-blocks/plugins/\ndescription: Extend the default execution flow provided by runners to meet your needs.\n---\n\n# Plugins\n\nPlugins provide a way to extend and refine the runtime and execution behavior of your properties. In the same way building custom arbitraries gives you the flexibility to tweak generation flows, plugins give you ways to customize how your properties run.\n\nPlugins are designed to support things such as:\n\n- Executing something before the predicate\n- Stopping a predicate running for too long\n- Capturing key insights about the execution flows including timings for observability\n\n## Using plugins\n\nPlugins can be passed as part of the customizations accepted by the `fc.assert` runner.\n\n```ts\nawait fc.assert(fc.property(...arbs, predicate), {\n  plugins: [pluginA(...paramsForPluginA), pluginB(...paramsForPluginB)],\n});\n```\n\n## Installing plugins globally\n\nPlugins needed by all your properties can be installed once, typically in a [setup file](/docs/configuration/global-settings/#integration-with-test-frameworks), with `installGlobalPlugin`.\n\n```ts\nfc.installGlobalPlugin(pluginA());\n```\n\nInstalled plugins run before the ones passed to the runner, so the snippet above followed by `fc.assert(myProp, { plugins: [pluginB()] })` is equivalent to `plugins: [pluginA(), pluginB()]`.\n\n## Combining plugins\n\nPlugins have been designed to be combined together. When multiple plugins get defined for the same assertion, they execute in declaration order. The first plugin runs first and wraps the execution of the second one until we reach the main operation. Plugins can wrap various stages of the flow, including the execution of the predicate function.\n\nLet's illustrate how plugins get combined on a property checking a search endpoint. In this example, the database is brought back to a clean state before each run:\n\n```ts\nawait fc.assert(\n  fc.property(fc.string(), async (query) => {\n    const results = await searchService.search(query);\n    // ...assertions on the results...\n  }),\n  {\n    plugins: [\n      timeout(10_000),\n      beforeEach(async () => {\n        await database.reset(); // bring back a clean state, possibly slow\n      }),\n      timeout(5_000),\n    ],\n  },\n);\n```\n\nThe plugin setup above makes use of two instances of the `timeout` plugin. The first instance is responsible for making sure that the time taken by the `beforeEach` cleanup plus the one taken by the predicate never exceeds 10 seconds. The second one only wraps the predicate and makes sure that it won't take more than 5 seconds.\n\nThis short example clearly highlights why the declaration order of plugins is crucial. Two different orders may result in totally different expectations. Correctly ordering them will make you capable of finely configuring your flows to fit your needs.\n\n## The plugins\n\nWe come up with a set of plugins to extend the library using built-in plugins. The following pages provide extended details and deep dive into each of them.\n\n```mdx-code-block\nimport DocCardList from '@theme/DocCardList';\n\n<DocCardList />\n```\n","website/docs/core-blocks/plugins/life-cycle.md":"---\nslug: /core-blocks/plugins/life-cycle/\n---\n\n# Life-cycle\n\nLife-cycle plugins provide hooks to prepare or clean up things for your predicates. They wrap every execution of the predicate including the ones linked to shrinking.\n\n## `beforeEach`\n\nThe `beforeEach` plugin lets you run code right before the execution of your predicate.\n\nIt expects to receive a function returning either nothing or a teardown function, in a synchronous or asynchronous fashion. Any other returned value may lead to unexpected behavior and is subject to change between versions.\n\nWhen a teardown function gets returned, it will be used as a clean-up function running right after the execution of the predicate, no matter its status.\n\nSimple example involving two synchronous `beforeEach` without any teardown function being declared:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      // beforeEach hook #1\n    }),\n    beforeEach(() => {\n      // beforeEach hook #2\n    }),\n  ];\n}\n```\n\nExample featuring all the possible variants with or without teardown, synchronous or asynchronous:\n\n```ts\n{\n  plugins: [\n    // synchronous beforeEach\n    beforeEach(() => {\n      // ...\n    }),\n    // synchronous beforeEach with synchronous teardown\n    beforeEach(() => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // synchronous beforeEach with asynchronous teardown\n    beforeEach(() => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach\n    beforeEach(async () => {\n      // ...\n    }),\n    // asynchronous beforeEach with synchronous teardown\n    beforeEach(async () => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach with asynchronous teardown\n    beforeEach(async () => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n  ];\n}\n```\n\nAll these variants can be used together. They have the same ordering priorities.\n\nResources: [API reference](/docs/api/functions/beforeEach).\n\n## `afterEach`\n\nThe `afterEach` plugin is the mirror of `beforeEach`. It lets you run code right after the execution of your predicate.\n\nSimilarly to `beforeEach`, it expects to receive a function returning either `void` or `Promise<void>`, but unlike `beforeEach` it cannot return a teardown function. Any other returned value may lead to unexpected behavior.\n\nContrary to `beforeEach`, `afterEach` will always be executed no matter the execution status of other hooks. As such, if one `beforeEach` or one `afterEach` rejects, other `afterEach` will still be executed.\n\nResources: [API reference](/docs/api/functions/afterEach).\n\n## Execution flow\n\nLife-cycle plugins run in the same order as they got declared for before tasks and in reverse order for after tasks. As such, the following ordering of plugins:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n    afterEach(() => {\n      console.log('afterEach #3');\n    }),\n    afterEach(() => {\n      console.log('afterEach #4');\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #5');\n      return () => {\n        console.log('teardown for beforeEach #5');\n      };\n    }),\n  ];\n}\n```\n\nWould result, for each run, into:\n\n```txt\nbeforeEach #1\nbeforeEach #2\nbeforeEach #5\npredicate\nteardown for beforeEach #5\nafterEach #4\nafterEach #3\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n\nThey run in an exclusive fashion. As such, a `beforeEach`, a teardown or an `afterEach` will wait for the currently running one to end before starting. Similarly, they don't run while the predicate is under way. They wait for it to come back with an execution status.\n\n:::warning[Predicate may run longer]\nWhile they are waiting for the predicate to come back with a status, note that whenever the predicate's execution gets stopped or interrupted, due to a timeout for example, there is no certainty that the code of the predicate has really been stopped. In Node, and more generally in JavaScript, there is no way to stop a running script: such plugins will mostly resume before the script ends but in many cases the script will keep running in background (as the plugin can't stop it).\n:::\n\nLike any built-in plugin, life-cycle plugins compose with the plugins declared next to them. As such, in the hypothesis of a plugin named `retryOnFailure(count)`, declaring plugins as follows:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    retryOnFailure(2),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n  ];\n}\n```\n\nMay result in the following logs at execution time:\n\n```txt\nbeforeEach #1 <-- runs once, it wraps all the attempts\nbeforeEach #2 <-- the first attempt\npredicate     <-- considering it fails at first attempt...\nteardown for beforeEach #2\nbeforeEach #2 <-- ...`retryOnFailure` launches a second attempt\npredicate\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n","website/docs/core-blocks/plugins/time-limits.md":"---\nslug: /core-blocks/plugins/time-limits/\n---\n\n# Time limits\n\nTime-limit plugins bound the time spent assessing your properties. They can come into play at various levels, from an isolated execution of a predicate to the full run of the assertion.\n\nThey make the runner stop its ongoing task when the limit gets reached. As such, they cannot really stop the code they wrap but ignore its results.\n\n## `timeout`\n\nThe `timeout` plugin marks the current execution of your predicate as failed if it did not complete within the requested delay expressed in milliseconds.\n\n```ts\n{\n  plugins: [\n    timeout(1000), // fail any execution of the predicate taking more than 1 second\n  ];\n}\n```\n\nThe countdown restarts for every execution of the predicate, shrinking phase included. A timed-out execution gets reported like any other failure, it's just a failure.\n\nResources: [API reference](/docs/api/functions/timeout).\n\n## `interruptAfterTimeLimit`\n\nThe `interruptAfterTimeLimit` plugin interrupts all runs once the requested delay expires. Past this delay, no new execution of the predicate will be started and any execution still running at that time will be interrupted.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000), // interrupt the execution of the property after 1 second\n  ];\n}\n```\n\nThe countdown starts when the runner starts executing the property.\n\nAn interrupted property is not necessarily considered to be a failure. By default, it gets marked as successful as long as at least one execution succeeded before the interruption and no failure got reported. To change that default and report interrupted properties as failures, one can set `failOnInterrupt: true` on the plugin.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000, { failOnInterrupt: true }), // mark an interrupted property as a failed one\n  ];\n}\n```\n\nResources: [API reference](/docs/api/functions/interruptAfterTimeLimit).\n\n## Limitations\n\nBoth plugins share the same limitations.\n\n### Synchronous code can't be cut\n\nThere is no way to pause or kill a running synchronous script in JavaScript. A synchronous predicate will always run to its end before any of these plugins get the flow back.\n\nAs such, `timeout` has no effect on purely synchronous predicates and `interruptAfterTimeLimit` can only prevent new executions from starting once the limit gets reached.\n\n### Asynchronous code can't be canceled\n\nWhenever the limit gets reached during an asynchronous execution, the plugins give control back to the runner without waiting for the predicate. But the underlying execution keeps running in the background and its outcome gets ignored.\n\nPlugins declared before the time-limit one may thus run while the predicate is still under way.\n\n### Stopping the code\n\nIf you need the code under test to be really stopped, have a look at [`@fast-check/worker`](https://www.npmx.dev/package/@fast-check/worker). It runs predicates in dedicated worker threads that can be terminated, synchronous ones included.\n","website/docs/core-blocks/plugins/values.md":"---\nslug: /core-blocks/plugins/values/\n---\n\n# Values\n\nValue plugins customize which values get forwarded to your predicates. Bias plugins customize how generation targets values, while equal-values plugins avoid executing your predicates twice on the same value.\n\nEqual-values plugins keep track of the values already covered during the run and replay the outcome of the first execution whenever a value gets generated again. Values are compared based on their stringified representation.\n\n## `unbiased`\n\nThe `unbiased` plugin generates the values feeding your predicates without any bias.\n\n```ts\n{\n  plugins: [\n    unbiased(), // draw all values from the full range of the arbitraries\n  ];\n}\n```\n\nWithout this plugin, generation is biased by default. Compared with a uniform distribution, smaller or more extreme values are more likely to be generated, helping uncover common issues earlier. For example, with `fc.integer()`, small values such as `1` and `2` are more likely to be generated than `171414468`.\n\nWith this plugin enabled, every run draws from the full range of the arbitraries with no special treatment. For `fc.integer()`, `171414468` is then just as likely to be generated as `1` or `2`.\n\nResources: [API reference](/docs/api/functions/unbiased).\n\n## `ignoreEqualValues`\n\nThe `ignoreEqualValues` plugin discards runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    ignoreEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nDiscarded runs still count as runs: a run replaying a past success stays a success.\n\nResources: [API reference](/docs/api/functions/ignoreEqualValues).\n\n## `skipEqualValues`\n\nThe `skipEqualValues` plugin skips runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    skipEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nContrary to `ignoreEqualValues`, a run replaying a past success gets marked as skipped instead of successful: passed the maximal number of allowed skips the run will be marked as failed. It gives stronger guarantees on the number of distinct values covered by the run at the price of potentially failing on arbitraries unable to produce enough distinct values.\n\nResources: [API reference](/docs/api/functions/skipEqualValues).\n"},"files":{".github/copilot-instructions.md":"# GitHub Copilot Instructions\n\n## Pull Request Naming Convention\n\nWhen creating or naming pull requests, follow the [gitmoji](https://gitmoji.dev/) specification:\n\n### Format\n\n- **For changes to the main `fast-check` package**: Use the format `emoji Description`\n  - Example: `✨ Add new arbitrary for dates`\n  - Example: `🐛 Fix edge case in integer shrinking`\n\n- **For changes to other packages** (ava, vitest, jest, worker, poisoning, packaged): Use the format `emoji(package-name) Description`\n  - Example: `👷(vitest) Add support for new vitest features`\n  - Example: `🐛(jest) Fix compatibility with jest 29`\n  - Example: `📝(ava) Update documentation for ava integration`\n\nLimit the name of the PR to at most 50 characters for the Description part (that is, the text after the `emoji` or `emoji(package-name)` prefix). It forces the author to summarize the changes succinctly, making it easier for others to understand the main purpose of the PR at a glance.\n\n### Common Gitmoji Examples\n\n- ✨ Introduce new features\n- 🐛 Fix a bug\n- 📝 Add or update documentation\n- ✅ Add or update tests\n- 🏷️ Add or update types\n- ⚡️ Improve performance\n- 👷 Add or update CI/CD\n- ♻️ Refactor code\n- 🔧 Add or update configuration files\n- 🎨 Improve structure/format of the code\n- 🔥 Remove code or files\n- 🚀 Deploy stuff\n- 🔒️ Fix security or privacy issues\n- ⬆️ Upgrade dependencies\n- ⬇️ Downgrade dependencies\n- 📦 Add or update compiled files or packages\n\nFor a complete list of gitmoji codes, see https://gitmoji.dev/\n\n## Pull Request Template\n\nWhen creating pull requests, always use the PR template located at `.github/PULL_REQUEST_TEMPLATE.md`. The template includes:\n\n- **Description**: Provide a short description and link to related issues (if any)\n- **Checklist**: Keep the entire checklist and all of its items; only check the boxes for the items that are fulfilled.\n- **Advanced**: Fill in the Category and Impacts sections to help reviewers understand the changes\n\nMake sure to fill out all sections of the template completely and accurately, and do not delete or reorder any sections or checklist items—only update their content and checkbox states.\n","packages/ava/README.md":"# `@fast-check/ava`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into AVA.\n`@fast-check/ava` simplifies the integration of `fast-check` into AVA testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://badge.fury.io/js/@fast-check%2Fava.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fava\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/ava/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fava.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/ava`:\n\n```bash\nnpm install --save-dev @fast-check/ava\n```\n\nIn order to work properly, `@fast-check/ava` requires `ava` to be installed.\n\n## Example\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntestProp('should detect the substring', [fc.string(), fc.string(), fc.string()], (t, a, b, c) => {\n  t.true((a + b + c).includes(b));\n});\n```\n\nThe property is passed [AVA's `t` argument](https://github.com/avajs/ava/blob/main/docs/02-execution-context.md#execution-context-t-argument) as its first parameter, and the value of each arbitrary for the current test case for the rest of the parameters.\n\n`@fast-check/ava` supports all of [AVA's assertions](https://github.com/avajs/ava/blob/main/docs/03-assertions.md#assertions) and like AVA, it supports synchronous and asynchronous functions, including promises, observables, and callbacks. See [AVA's documentation](https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#declaring-test) for more information.\n\n⚠️ **WARNING:** When relying on `@fast-check/ava`, returning `true` or `false` in your predicates is not taken into account. The library wants assertions or plans to be defined as `ava` itself does. Nonetheless you can still use primitives such as `fc.pre` to cut runs at the middle if some invariants are unmeet: the started plan (if any) will just be ignored.\n\n## Advanced\n\n### `fast-check` Parameters\n\n`testProp` accepts an optional `fc.Parameters` for forwarding custom parameters to `fast-check` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should detect the substring',\n  [fc.string(), fc.string(), fc.string()],\n  (t, a, b, c) => {\n    t.true((a + b + c).includes(b));\n  },\n  { numRuns: 10 }, // Example of parameters\n);\n```\n\n### AVA Modifiers\n\n`@fast-check/ava` also comes with [`.only`], [`.serial`] [`.skip`], and [`.failing`] modifiers from AVA.\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should replay the test for the seed 4242',\n  [fc.nat(), fc.nat()],\n  (t, a, b) => {\n    t.is(a + b, b + a);\n  },\n  { seed: 4242 },\n);\n\ntestProp.skip('should be skipped', [fc.string()], (t, text) => {\n  t.is([...text].length, text.length);\n});\n```\n\n[`.only`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-specific-tests\n[`.serial`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-tests-serially\n[`.skip`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#skipping-tests\n[`.failing`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#failing-tests\n\n### AVA `before`/`after` Hooks\n\n`@fast-check/ava` exposes AVA's `before`/`after` [hooks]:\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp.before((t) => {\n  connectToDatabase();\n});\n\ntestProp();\n// ... omitted for brevity\n\ntestProp.after((t) => {\n  closeDatabaseConnection();\n});\n```\n\n[hooks]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#before--after-hooks\n\n### AVA Execution Context\n\n`@fast-check/ava` mirror's AVA's procedure for customizing the test [execution context]:\n\n```typescript\nimport { fc, testProp as anyTestProp, PropertyTestInterface } from '@fast-check/ava';\n\ntype TestContext = {\n  state: string;\n};\n\nconst testProp = anyTestProp as PropertyTestInterface<TestContext>;\n\ntestProp('should reach terminal state', [fc.string()], (t, received) => {\n  // here t is typed as ExecutionContext<TestContext>\n  console.log(t.context.state); // logs 'uninitialized'\n  // ... omitted for brevity\n});\n```\n\n[execution context]: https://github.com/avajs/ava/blob/main/docs/02-execution-context.md\n\n## Minimal requirements\n\n| @fast-check/ava | AVA                | fast-check | node                   |\n| --------------- | ------------------ | ---------- | ---------------------- |\n| **3.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥20.19.0<sup>(1)</sup> |\n| **2.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥12.22.0<sup>(2)</sup> |\n| **1.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3         | ≥12.22.0<sup>(2)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n2. As for ava 4.\n\n</details>\n","packages/fast-check/README.md":"<h1 align=\"center\">\n  <img align=\"center\" src=\"https://fast-check.dev/assets/images/logo.png\" alt=\"fast-check logo\" />\n</h1>\n\n<p align=\"center\">\nProperty based testing framework for JavaScript/TypeScript\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/actions?query=branch%3Amain+workflow%3A%22Build+Status%22\"><img src=\"https://github.com/dubzzz/fast-check/actions/workflows/build-status.yml/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://badge.fury.io/js/fast-check.svg\" alt=\"npm version\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://img.shields.io/npm/dm/fast-check\" alt=\"monthly downloads\" /></a>\n  <a href=\"https://fast-check.dev/\"><img src=\"https://img.shields.io/badge/-Documentation-%23282ea9.svg\" title=\"Documentation\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://app.codecov.io/gh/dubzzz/fast-check/branch/main\"><img src=\"https://codecov.io/gh/dubzzz/fast-check/branch/main/graph/badge.svg\" alt=\"Coverage Status (unit tests)\" /></a>\n  <a href=\"https://packagequality.com/#?package=fast-check\"><img src=\"https://packagequality.com/shield/fast-check.svg\" alt=\"Package quality\" /></a>\n  <a href=\"https://securityscorecards.dev/viewer/?platform=github.com&org=dubzzz&repo=fast-check\"><img src=\"https://api.securityscorecards.dev/projects/github.com/dubzzz/fast-check/badge\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"https://bestpractices.coreinfrastructure.org/projects/7450\"><img src=\"https://bestpractices.coreinfrastructure.org/projects/7450/badge\" alt=\"OpenSSF Best Practices\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/labels/good%20first%20issue\"><img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\" alt=\"PRs Welcome\" /></a>\n  <a href=\"https://github.com/dubzzz/fast-check/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/fast-check.svg\" alt=\"License\" /></a>\n</p>\n\n## Getting started\n\nHands-on tutorial and definition of Property Based Testing: [🏁 see tutorial](https://fast-check.dev/docs/tutorials/quick-start/). Or directly try it online on our pre-configured [CodeSandbox](https://codesandbox.io/s/github/dubzzz/fast-check/tree/main/examples?previewwindow=tests).\n\nProperty based testing frameworks check the truthfulness of properties. A property is a statement like: _for all (x, y, ...) such that precondition(x, y, ...) holds predicate(x, y, ...) is true_.\n\nInstall the module with: `pnpm add -D fast-check` or `yarn add fast-check --dev` or `npm install fast-check --save-dev`\n\nExample of integration in [mocha](http://mochajs.org/):\n\n```js\nimport * as fc from 'fast-check';\n\n// Code under test\nconst contains = (text, pattern) => text.indexOf(pattern) >= 0;\n\n// Properties\ndescribe('properties', () => {\n  // string text always contains itself\n  it('should always contain itself', async () => {\n    await fc.assert(fc.property(fc.string(), (text) => contains(text, text)));\n  });\n  // string a + b + c always contains b, whatever the values of a, b and c\n  it('should always contain its substrings', async () => {\n    await fc.assert(\n      fc.property(fc.string(), fc.string(), fc.string(), (a, b, c) => {\n        // Alternatively: no return statement and direct usage of expect or assert\n        return contains(a + b + c, b);\n      }),\n    );\n  });\n});\n```\n\nIn case of failure, the test raises a red flag. Its output should help you to diagnose what went wrong in your implementation. Example with a failing implementation of contain:\n\n```\n1) should always contain its substrings\n    Error: Property failed after 1 tests (seed: 1527422598337, path: 0:0): [\"\",\"\",\"\"]\n    Shrunk 1 time(s)\n    Got error: Property failed by returning false\n\n    Hint: Enable verbose mode in order to have the list of all failing values encountered during the run\n```\n\nIntegration with other test frameworks: [ava](https://github.com/dubzzz/fast-check-examples/blob/main/test-ava/example.spec.js), [jasmine](https://github.com/dubzzz/fast-check-examples/blob/main/test-jasmine/example.spec.js), [jest](https://github.com/dubzzz/fast-check-examples/blob/main/test-jest/example.spec.js), [mocha](https://github.com/dubzzz/fast-check-examples/blob/main/test/longest%20common%20substr/test.js) and [tape](https://github.com/dubzzz/fast-check-examples/blob/main/test-tape/example.spec.js).\n\nMore examples: [simple examples](https://github.com/dubzzz/fast-check/tree/main/examples), [fuzzing](https://github.com/dubzzz/fuzz-rest-api) and [against various algorithms](https://github.com/dubzzz/fast-check-examples).\n\nUseful documentations:\n\n- [🏁 Introduction to Property Based & Hands On](https://fast-check.dev/docs/tutorials/quick-start/)\n- [🐣 Built-in arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/)\n- [🔧 Custom arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/)\n- [🏃‍♂️ Property based runners](https://fast-check.dev/docs/core-blocks/runners/)\n- [💥 Tips](https://fast-check.dev/docs/configuration/)\n- [🔌 API Reference](https://fast-check.dev/docs/api/)\n- [⭐ Awesome fast-check](https://fast-check.dev/docs/ecosystem/)\n\n## Why should I migrate to fast-check?\n\nfast-check has initially been designed in an attempt to cope with limitations I encountered while using other property based testing frameworks designed for JavaScript:\n\n- **Types:** strong and up-to-date types - _thanks to TypeScript_\n- **Extendable:** easy `map` method to derive existing arbitraries while keeping shrink \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#map)\\] - _some frameworks ask the user to provide both a->b and b->a mappings in order to keep a shrinker_\n- **Extendable:** kind of flatMap-operation called `chain` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#chain)\\] - _able to bind the output of an arbitrary as input of another one while keeping the shrink working_\n- **Extendable:** precondition checks with `fc.pre(...)` \\[[more](https://fast-check.dev/docs/core-blocks/properties/#example)\\] - _filtering invalid entries can be done directly inside the check function if needed_\n- **Extendable:** easily switch from fake data in tests to property based with `fc.gen()` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#gen)\\] - _generate random values within your predicates_\n- **Smart:** ability to shrink on `fc.oneof` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#oneof)\\] - _surprisingly some frameworks don't_\n- **Smart:** biased by default - _by default it generates both small and large values, making it easier to dig into counterexamples without having to tweak a size parameter manually_\n- **Debug:** verbose mode \\[[more](https://fast-check.dev/docs/configuration/custom-reports/#verbosity)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-increase-verbosity)\\] - _easier troubleshooting with verbose mode enabled_\n- **Debug:** replay directly on the minimal counterexample \\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-re-run)\\] - _no need to replay the whole sequence, you get directly the counterexample_\n- **Debug:** custom examples in addition of generated ones \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#run-against-custom-values)\\] - _no need to duplicate the code to play the property on custom examples_\n- **Debug:** logger per predicate run \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#context)\\] - _simplify your troubleshoot with fc.context and its logging feature_\n- **Unique:** model based approach \\[[more](https://fast-check.dev/docs/advanced/model-based-testing/)\\]\\[[article](https://medium.com/criteo-labs/detecting-the-unexpected-in-web-ui-fuzzing-1f3822c8a3a5)\\] - _use the power of property based testing to test UI, APIs or state machines_\n- **Unique:** detect race conditions in your code \\[[more](https://fast-check.dev/docs/advanced/race-conditions/)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/detect-race-conditions/)\\] - _shuffle the way your promises and async calls resolve using the power of property based testing to detect races_\n- **Unique:** simplify user definable corner cases \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#shrink-custom-values)\\] - _simplify bug resolution by asking fast-check if it can find an even simpler corner case_\n\nFor more details, refer to the documentation in the links above.\n\n### Trusted\n\nfast-check has been trusted for years by big projects like: [jest](https://github.com/jestjs/jest), [jasmine](https://github.com/jasmine/jasmine), [fp-ts](https://github.com/gcanti/fp-ts), [io-ts](https://github.com/gcanti/io-ts), [ramda](https://github.com/ramda/ramda), [js-yaml](https://github.com/nodeca/js-yaml), [query-string](https://github.com/sindresorhus/query-string)...\n\n### Powerful\n\nIt also proved useful in finding bugs among major open source projects such as [jest](https://github.com/jestjs/jest), [query-string](https://github.com/sindresorhus/query-string)... and [many others](https://fast-check.dev/docs/introduction/track-record/).\n\n## Compatibility\n\nHere are the minimal requirements to use fast-check properly without any polyfills:\n\n| fast-check | node                   | ECMAScript version | _TypeScript (optional)_ |\n| ---------- | ---------------------- | ------------------ | ----------------------- |\n| **5.x**    | ≥22.12.0               | ES2025             | ≥5.8                    |\n| **4.x**    | ≥12.17.0<sup>(1)</sup> | ES2020             | ≥5.0                    |\n| **3.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥4.1<sup>(3)</sup>      |\n| **2.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥3.2<sup>(4)</sup>      |\n| **1.x**    | ≥0.12<sup>(2)</sup>    | ES3                | ≥3.0<sup>(4)</sup>      |\n\n<details>\n<summary>More details...</summary>\n\n1. Even if version 12.x should support most of the ES2020 features that will be leveraged by the version 4, we recommend relying at least on version 14.x of Node as it supports all the targeted specification. In addition, we highly encourage switching to still supported LTS versions of Node and not sticking to unsupported versions for too long.\n2. Except for features that cannot be polyfilled - such as `bigint`-related ones - all the capabilities of fast-check should be usable given you use at least the minimal recommended version of node associated to your major of fast-check.\n3. Require either lib or target ≥ ES2020 or `@types/node` to be installed.\n4. Require either lib or target ≥ ES2015 or `@types/node` to be installed.\n\n</details>\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dubzzz\"><img src=\"https://avatars.githubusercontent.com/u/5300235?v=4?s=100\" width=\"100px;\" alt=\"Nicolas DUBIEN\"/><br /><sub><b>Nicolas DUBIEN</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Tests\">⚠️</a> <a href=\"#infra-dubzzz\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"#design-dubzzz\" title=\"Design\">🎨</a> <a href=\"#maintenance-dubzzz\" title=\"Maintenance\">🚧</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/hath995\"><img src=\"https://avatars.githubusercontent.com/u/381037?v=4?s=100\" width=\"100px;\" alt=\"Aaron Elligsen\"/><br /><sub><b>Aaron Elligsen</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/willheslam\"><img src=\"https://avatars.githubusercontent.com/u/5377213?v=4?s=100\" width=\"100px;\" alt=\"Will Heslam\"/><br /><sub><b>Will Heslam</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=willheslam\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/kazchimo\"><img src=\"https://avatars.githubusercontent.com/u/31263328?v=4?s=100\" width=\"100px;\" alt=\"kazchimo\"/><br /><sub><b>kazchimo</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brandon-leapyear\"><img src=\"https://avatars.githubusercontent.com/u/27799541?v=4?s=100\" width=\"100px;\" alt=\"Brandon Chinn\"/><br /><sub><b>Brandon Chinn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://safareli.github.io/resume/\"><img src=\"https://avatars.githubusercontent.com/u/1932383?v=4?s=100\" width=\"100px;\" alt=\"Irakli Safareli\"/><br /><sub><b>Irakli Safareli</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=safareli\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/TheSpyder\"><img src=\"https://avatars.githubusercontent.com/u/298292?v=4?s=100\" width=\"100px;\" alt=\"Andrew Herron\"/><br /><sub><b>Andrew Herron</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TheSpyder\" title=\"Documentation\">📖</a> <a href=\"#plugin-TheSpyder\" title=\"Plugin/utility libraries\">🔌</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/EricCrosson\"><img src=\"https://avatars.githubusercontent.com/u/1596818?v=4?s=100\" width=\"100px;\" alt=\"Eric Crosson\"/><br /><sub><b>Eric Crosson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/burrscurr\"><img src=\"https://avatars.githubusercontent.com/u/23213508?v=4?s=100\" width=\"100px;\" alt=\"burrscurr\"/><br /><sub><b>burrscurr</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=burrscurr\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.dijonkitchen.org/\"><img src=\"https://avatars.githubusercontent.com/u/11434205?v=4?s=100\" width=\"100px;\" alt=\"JC (Jonathan Chen)\"/><br /><sub><b>JC (Jonathan Chen)</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dijonkitchen\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fixate.it/\"><img src=\"https://avatars.githubusercontent.com/u/1510520?v=4?s=100\" width=\"100px;\" alt=\"Larry Botha\"/><br /><sub><b>Larry Botha</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://epa.ms/RomanGusev\"><img src=\"https://avatars.githubusercontent.com/u/5839225?v=4?s=100\" width=\"100px;\" alt=\"Roman Gusev\"/><br /><sub><b>Roman Gusev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=102\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://timwis.com/\"><img src=\"https://avatars.githubusercontent.com/u/761444?v=4?s=100\" width=\"100px;\" alt=\"Tim Wisniewski\"/><br /><sub><b>Tim Wisniewski</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=timwis\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://world.hey.com/brais\"><img src=\"https://avatars.githubusercontent.com/u/17855450?v=4?s=100\" width=\"100px;\" alt=\"Brais Piñeiro\"/><br /><sub><b>Brais Piñeiro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brds\"><img src=\"https://avatars.githubusercontent.com/u/118620?v=4?s=100\" width=\"100px;\" alt=\"Renaud-Pierre Bordes\"/><br /><sub><b>Renaud-Pierre Bordes</b></sub></a><br /><a href=\"#design-brds\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/fwip\"><img src=\"https://avatars.githubusercontent.com/u/190414?v=4?s=100\" width=\"100px;\" alt=\"Jemma Nelson\"/><br /><sub><b>Jemma Nelson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=fwip\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fullof.bs/\"><img src=\"https://avatars.githubusercontent.com/u/77482?v=4?s=100\" width=\"100px;\" alt=\"John Haugeland\"/><br /><sub><b>John Haugeland</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=StoneCypher\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/treydavis\"><img src=\"https://avatars.githubusercontent.com/u/1691239?v=4?s=100\" width=\"100px;\" alt=\"Trey Davis\"/><br /><sub><b>Trey Davis</b></sub></a><br /><a href=\"#design-treydavis\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://leonzalion.com/\"><img src=\"https://avatars.githubusercontent.com/u/36966635?v=4?s=100\" width=\"100px;\" alt=\"Leon Si\"/><br /><sub><b>Leon Si</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=leonzalion\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://spion.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/502412?v=4?s=100\" width=\"100px;\" alt=\"Gorgi Kosev\"/><br /><sub><b>Gorgi Kosev</b></sub></a><br /><a href=\"#infra-spion\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/mayconsacht\"><img src=\"https://avatars.githubusercontent.com/u/5214042?v=4?s=100\" width=\"100px;\" alt=\"mayconsacht\"/><br /><sub><b>mayconsacht</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=mayconsacht\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/paldepind\"><img src=\"https://avatars.githubusercontent.com/u/521604?v=4?s=100\" width=\"100px;\" alt=\"Simon Friis Vindum\"/><br /><sub><b>Simon Friis Vindum</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/gibson042\"><img src=\"https://avatars.githubusercontent.com/u/1199584?v=4?s=100\" width=\"100px;\" alt=\"Richard Gibson\"/><br /><sub><b>Richard Gibson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gibson042\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://alanharper.com.au/\"><img src=\"https://avatars.githubusercontent.com/u/475?v=4?s=100\" width=\"100px;\" alt=\"Alan Harper\"/><br /><sub><b>Alan Harper</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=aussiegeek\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Osman-Sodefa\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Osman-Sodefa\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/sommd\"><img src=\"https://avatars.githubusercontent.com/u/7817485?v=4?s=100\" width=\"100px;\" alt=\"David Sommerich\"/><br /><sub><b>David Sommerich</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/diegopedro94\"><img src=\"https://avatars.githubusercontent.com/u/7157796?v=4?s=100\" width=\"100px;\" alt=\"Diego Pedro\"/><br /><sub><b>Diego Pedro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/BoruiGu\"><img src=\"https://avatars.githubusercontent.com/u/8686167?v=4?s=100\" width=\"100px;\" alt=\"Borui Gu\"/><br /><sub><b>Borui Gu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=BoruiGu\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/eventualbuddha\"><img src=\"https://avatars.githubusercontent.com/u/1938?v=4?s=100\" width=\"100px;\" alt=\"Brian Donovan\"/><br /><sub><b>Brian Donovan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=eventualbuddha\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/volrk\"><img src=\"https://avatars.githubusercontent.com/u/32265974?v=4?s=100\" width=\"100px;\" alt=\"volrk\"/><br /><sub><b>volrk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tinydylan\"><img src=\"https://avatars.githubusercontent.com/u/41112113?v=4?s=100\" width=\"100px;\" alt=\"tinydylan\"/><br /><sub><b>tinydylan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jasikpark\"><img src=\"https://avatars.githubusercontent.com/u/10626596?v=4?s=100\" width=\"100px;\" alt=\"Caleb Jasik\"/><br /><sub><b>Caleb Jasik</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jasikpark\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rulai-hu\"><img src=\"https://avatars.githubusercontent.com/u/2570932?v=4?s=100\" width=\"100px;\" alt=\"Rulai Hu\"/><br /><sub><b>Rulai Hu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rulai-hu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/afonsojramos\"><img src=\"https://avatars.githubusercontent.com/u/19473034?v=4?s=100\" width=\"100px;\" alt=\"Afonso Jorge Ramos\"/><br /><sub><b>Afonso Jorge Ramos</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=afonsojramos\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tjenkinson.me/\"><img src=\"https://avatars.githubusercontent.com/u/3259993?v=4?s=100\" width=\"100px;\" alt=\"Tom Jenkinson\"/><br /><sub><b>Tom Jenkinson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tjenkinson\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/phormio\"><img src=\"https://avatars.githubusercontent.com/u/28146332?v=4?s=100\" width=\"100px;\" alt=\"phormio\"/><br /><sub><b>phormio</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=phormio\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://buildo.io/\"><img src=\"https://avatars.githubusercontent.com/u/2643520?v=4?s=100\" width=\"100px;\" alt=\"Giovanni Gonzaga\"/><br /><sub><b>Giovanni Gonzaga</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://caurea.org/\"><img src=\"https://avatars.githubusercontent.com/u/34538?v=4?s=100\" width=\"100px;\" alt=\"Tomas Carnecky\"/><br /><sub><b>Tomas Carnecky</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=wereHamster\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Djaler\"><img src=\"https://avatars.githubusercontent.com/u/7964583?v=4?s=100\" width=\"100px;\" alt=\"Kirill Romanov\"/><br /><sub><b>Kirill Romanov</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://giovannyg.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/5326411?v=4?s=100\" width=\"100px;\" alt=\"Giovanny González\"/><br /><sub><b>Giovanny González</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giovannyg\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/markkulube\"><img src=\"https://avatars.githubusercontent.com/u/34955942?v=4?s=100\" width=\"100px;\" alt=\"Mark Kulube\"/><br /><sub><b>Mark Kulube</b></sub></a><br /><a href=\"#infra-markkulube\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.undiscoveredfeatures.com/\"><img src=\"https://avatars.githubusercontent.com/u/354848?v=4?s=100\" width=\"100px;\" alt=\"Peter Hamilton\"/><br /><sub><b>Peter Hamilton</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hamiltop\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ChineduOzodi\"><img src=\"https://avatars.githubusercontent.com/u/11678369?v=4?s=100\" width=\"100px;\" alt=\"Chinedu Ozodi\"/><br /><sub><b>Chinedu Ozodi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ChineduOzodi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gunar\"><img src=\"https://avatars.githubusercontent.com/u/7684574?v=4?s=100\" width=\"100px;\" alt=\"Gunar Gessner\"/><br /><sub><b>Gunar Gessner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gunar\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CSBatchelor\"><img src=\"https://avatars.githubusercontent.com/u/18668440?v=4?s=100\" width=\"100px;\" alt=\"Christian Batchelor\"/><br /><sub><b>Christian Batchelor</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CSBatchelor\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tomeraberba.ch/\"><img src=\"https://avatars.githubusercontent.com/u/23299544?v=4?s=100\" width=\"100px;\" alt=\"Tomer Aberbach\"/><br /><sub><b>Tomer Aberbach</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/0xflotus\"><img src=\"https://avatars.githubusercontent.com/u/26602940?v=4?s=100\" width=\"100px;\" alt=\"0xflotus\"/><br /><sub><b>0xflotus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=0xflotus\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CodeLenny\"><img src=\"https://avatars.githubusercontent.com/u/9272847?v=4?s=100\" width=\"100px;\" alt=\"Ryan Leonard\"/><br /><sub><b>Ryan Leonard</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://blog.bitjson.com/\"><img src=\"https://avatars.githubusercontent.com/u/904007?v=4?s=100\" width=\"100px;\" alt=\"Jason Dreyzehner\"/><br /><sub><b>Jason Dreyzehner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://matinzd.dev/\"><img src=\"https://avatars.githubusercontent.com/u/24797481?v=4?s=100\" width=\"100px;\" alt=\"Matin Zadeh Dolatabad\"/><br /><sub><b>Matin Zadeh Dolatabad</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matinzd\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://goo.gl/IlWG8U\"><img src=\"https://avatars.githubusercontent.com/u/500?v=4?s=100\" width=\"100px;\" alt=\"Juan Julián Merelo Guervós\"/><br /><sub><b>Juan Julián Merelo Guervós</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=JJ\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/SimenB\"><img src=\"https://avatars.githubusercontent.com/u/1404810?v=4?s=100\" width=\"100px;\" alt=\"Simen Bekkhus\"/><br /><sub><b>Simen Bekkhus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=SimenB\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tskj\"><img src=\"https://avatars.githubusercontent.com/u/25415972?v=4?s=100\" width=\"100px;\" alt=\"Tarjei Skjærset\"/><br /><sub><b>Tarjei Skjærset</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tskj\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://denisgorbachev.com/\"><img src=\"https://avatars.githubusercontent.com/u/829578?v=4?s=100\" width=\"100px;\" alt=\"Denis Gorbachev\"/><br /><sub><b>Denis Gorbachev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=DenisGorbachev\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://senocular.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/3536716?v=4?s=100\" width=\"100px;\" alt=\"Trevor McCauley\"/><br /><sub><b>Trevor McCauley</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=senocular\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://grantkiely.com/\"><img src=\"https://avatars.githubusercontent.com/u/1948935?v=4?s=100\" width=\"100px;\" alt=\"Grant Kiely\"/><br /><sub><b>Grant Kiely</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gkiely\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/vecerek\"><img src=\"https://avatars.githubusercontent.com/u/5737996?v=4?s=100\" width=\"100px;\" alt=\"Attila Večerek\"/><br /><sub><b>Attila Večerek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.zachbjornson.com/\"><img src=\"https://avatars.githubusercontent.com/u/469365?v=4?s=100\" width=\"100px;\" alt=\"Zach Bjornson\"/><br /><sub><b>Zach Bjornson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/bennettp123\"><img src=\"https://avatars.githubusercontent.com/u/1610227?v=4?s=100\" width=\"100px;\" alt=\"Bennett Perkins\"/><br /><sub><b>Bennett Perkins</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bennettp123\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nielk\"><img src=\"https://avatars.githubusercontent.com/u/4980521?v=4?s=100\" width=\"100px;\" alt=\"Alexandre Oger\"/><br /><sub><b>Alexandre Oger</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ej-shafran\"><img src=\"https://avatars.githubusercontent.com/u/116496520?v=4?s=100\" width=\"100px;\" alt=\"ej shafran\"/><br /><sub><b>ej shafran</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ej-shafran\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gruhn\"><img src=\"https://avatars.githubusercontent.com/u/26570572?v=4?s=100\" width=\"100px;\" alt=\"Niklas Gruhn\"/><br /><sub><b>Niklas Gruhn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gruhn\" title=\"Code\">💻</a> <a href=\"#question-gruhn\" title=\"Answering Questions\">💬</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://patrickroza.com/\"><img src=\"https://avatars.githubusercontent.com/u/42661?v=4?s=100\" width=\"100px;\" alt=\"Patrick Roza\"/><br /><sub><b>Patrick Roza</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=patroza\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/cindywu\"><img src=\"https://avatars.githubusercontent.com/u/1177031?v=4?s=100\" width=\"100px;\" alt=\"Cindy Wu\"/><br /><sub><b>Cindy Wu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=cindywu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nmay231\"><img src=\"https://avatars.githubusercontent.com/u/35386821?v=4?s=100\" width=\"100px;\" alt=\"Noah\"/><br /><sub><b>Noah</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nmay231\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jamesbvaughan\"><img src=\"https://avatars.githubusercontent.com/u/2906913?v=4?s=100\" width=\"100px;\" alt=\"James Vaughan\"/><br /><sub><b>James Vaughan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/AlexErrant\"><img src=\"https://avatars.githubusercontent.com/u/109672176?v=4?s=100\" width=\"100px;\" alt=\"Alex Errant\"/><br /><sub><b>Alex Errant</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=AlexErrant\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ahrjarrett.com/\"><img src=\"https://avatars.githubusercontent.com/u/15133992?v=4?s=100\" width=\"100px;\" alt=\"andrew jarrett\"/><br /><sub><b>andrew jarrett</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/matthyk\"><img src=\"https://avatars.githubusercontent.com/u/53833818?v=4?s=100\" width=\"100px;\" alt=\"Matthias Keckl\"/><br /><sub><b>Matthias Keckl</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matthyk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dmurvihill\"><img src=\"https://avatars.githubusercontent.com/u/1649120?v=4?s=100\" width=\"100px;\" alt=\"Dolan Murvihill\"/><br /><sub><b>Dolan Murvihill</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dmurvihill\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/emilianbold\"><img src=\"https://avatars.githubusercontent.com/u/991554?v=4?s=100\" width=\"100px;\" alt=\"Emi\"/><br /><sub><b>Emi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=emilianbold\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.russbiggs.com/\"><img src=\"https://avatars.githubusercontent.com/u/8487728?v=4?s=100\" width=\"100px;\" alt=\"Russ Biggs\"/><br /><sub><b>Russ Biggs</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=russbiggs\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/adamni21\"><img src=\"https://avatars.githubusercontent.com/u/85580454?v=4?s=100\" width=\"100px;\" alt=\"adamni21\"/><br /><sub><b>adamni21</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=adamni21\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/josephjunker\"><img src=\"https://avatars.githubusercontent.com/u/1519098?v=4?s=100\" width=\"100px;\" alt=\"Joseph Junker\"/><br /><sub><b>Joseph Junker</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=josephjunker\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rushelex\"><img src=\"https://avatars.githubusercontent.com/u/41122157?v=4?s=100\" width=\"100px;\" alt=\"Aleksey Shelementev\"/><br /><sub><b>Aleksey Shelementev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rushelex\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rugk\"><img src=\"https://avatars.githubusercontent.com/u/11966684?v=4?s=100\" width=\"100px;\" alt=\"rugk\"/><br /><sub><b>rugk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rugk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/makeeno\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=makeeno\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jneidel.com/\"><img src=\"https://avatars.githubusercontent.com/u/25589715?v=4?s=100\" width=\"100px;\" alt=\"Jonathan Neidel\"/><br /><sub><b>Jonathan Neidel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jneidel\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jkomyno.dev/\"><img src=\"https://avatars.githubusercontent.com/u/12381818?v=4?s=100\" width=\"100px;\" alt=\"Alberto Schiabel\"/><br /><sub><b>Alberto Schiabel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jkomyno\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/zek\"><img src=\"https://avatars.githubusercontent.com/u/3463291?v=4?s=100\" width=\"100px;\" alt=\"Zek\"/><br /><sub><b>Zek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Tests\">⚠️</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! [Become one of them](CONTRIBUTING.md)\n\n## Sponsors 💸\n\nMany individuals and companies offer their financial support to the project, a huge thanks to all of them too 💓\n\n<a href=\"https://github.com/sponsors/dubzzz\"><img align=\"center\" src=\"https://raw.githubusercontent.com/dubzzz/sponsors-svg/main/sponsorkit/sponsors.svg\" alt=\"all sponsors\" /></a>\n\nYou can also become one of them by contributing via [GitHub Sponsors](https://github.com/sponsors/dubzzz) or [OpenCollective](https://opencollective.com/fast-check/contribute).\n","packages/jest/README.md":"# `@fast-check/jest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Jest.\n`@fast-check/jest` simplifies the integration of `fast-check` into Jest testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fjest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fjest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fjest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/jest`:\n\n```bash\nnpm install --save-dev @fast-check/jest\n```\n\nIn order to work properly, `@fast-check/jest` requires `jest` to be installed.\n\nWe also highly recommend users to launch their tests using the `--show-seed` option provided by Jest. It ensures Jest will always print the seed by itself (requires Jest ≥29.2.0).\n\n```sh\njest --show-seed\n```\n\n## Example\n\n```javascript\nimport { test, fc } from '@fast-check/jest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// Or the exact same test but based on named parameters\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nThe `it` and `test` functions returned by `@fast-check/jest` are just enriched versions of the ones coming from `jest` itself. They both come with `.prop`.\n\nPlease note that the properties accepted by `@fast-check/jest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances). In other words, the predicate passed as the last argument can be asynchronous.\n\n**Remark:** `it` and `test` have been introduced in 1.4.0. You have to refer to [Deprecated API](#deprecated-api) if you are using a version of `@fast-check/jest` <1.4.0.\n\n## Advanced\n\n### Support for variations of `test` and `it`\n\nIf you want to forward custom parameters to `fast-check`, `test.prop` and its variants accept an optional `fc.Parameters` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n`@fast-check/jest` also comes with support for `.only`, `.skip`, `.todo` and `.concurrent` from `jest`. It also accepts more complex ones such as `.concurrent.failing` or `.concurrent.only.failing`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/jest';\n\n// With custom `fc.Parameters`, here { seed: 4242 }\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\n// With .skip\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\n// With it version\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n### Experimental worker-based runner\n\n**The following feature is experimental!** When used it makes runners able to kill long running synchonous code. Meaning that it will make fast-check able to kill infinite loops blocking the main thread. So far, the feature does not fully support transformations performed via transform steps defined with jest.\n\nThe CommonJS approach would be:\n\n```js\nconst { init, fc } = require('@fast-check/jest/worker');\nconst { pathToFileURL } = require('node:url');\n\nconst { test, expect } = init(pathToFileURL(__filename));\n// can also be passed options such as isolationLevel: init(pathToFileURL(__filename), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\nThe ES Modules approach would be:\n\n```js\nimport { init, fc } from '@fast-check/jest/worker';\n\nconst { test, expect } = await init(new URL(import.meta.url));\n// can also be passed options such as isolationLevel: init(new URL(import.meta.url), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\n⚠️ Do not forget to add the `await` before `init` for the ES Module version!\n\n#### Extra setup for `@fast-check/worker` 0.6.0 and later\n\nSince `@fast-check/worker` is an ESM-only package, running it under Jest in CommonJS mode requires `babel-jest` to transpile it. Install the following dependencies:\n\n```bash\nnpm install --save-dev babel-jest @babel/core @babel/preset-env\n```\n\nThen add a `babel.config.cjs` at the root of your project:\n\n```js\nmodule.exports = {\n  presets: [['@babel/preset-env', { targets: { node: 'current' }, modules: 'commonjs' }]],\n};\n```\n\nAnd update your Jest configuration to use `babel-jest` while excluding `@fast-check/worker` from the ignore patterns:\n\n```js\nmodule.exports = {\n  transform: {\n    '^.+\\\\.[t|j]sx?$': 'babel-jest',\n  },\n  transformIgnorePatterns: ['/node_modules/(?!(?:@fast-check/worker)/)'],\n};\n```\n\nThis ensures `@fast-check/worker` gets transpiled to CommonJS by Babel instead of being skipped. Without it, Jest will fail to load the ESM-only package.\n\nFor ES Modules mode, no extra setup is needed — just make sure to run Jest with `--experimental-vm-modules`:\n\n```bash\nnode --experimental-vm-modules node_modules/jest/bin/jest.js\n```\n\n## Minimal requirements\n\n| @fast-check/jest | jest                                    | fast-check | node                                                                                  |\n| ---------------- | --------------------------------------- | ---------- | ------------------------------------------------------------------------------------- |\n| ^2.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n| ^1.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n\n- (1) any version of `jest` should be greater or equal than 26.5.0 if you are using `commonjs`\n- (2) in order to use `esm` build, you may need to enable experimental features of node, see [here](https://github.com/dubzzz/fast-check/blob/main/packages/test-jest-bundle-esm/package.json)\n- (3) &gt;=14.15.0 is the minimal requirements for `jest`, &gt;=12.17.0 is the one for `@fast-check/jest`\n- (4) timeout defined on jest might not be properly applied to fast-check for node 18 (until 18.17.0) and node 19, see [#4004](https://github.com/dubzzz/fast-check/pull/4004)\n","packages/packaged/README.md":"# `@fast-check/packaged`\n\nUtility package removing any files that will not be part of the final bundle published to npm registry\n\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpackaged.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpackaged\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/packaged/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpackaged.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nWhen publishing packages to npm registry, it is quite easy to forget about some files. It also happens many times that we want somehow to check the packaged bundle in some of our tests but totally forget that some files have not been added to the bundle and so that the final user will actually never be able to run this code.\n\nThis package mostly try to prevent this issue. It can easily be used in monorepos to emulate the bundled package when used against other packages of the monorepo to make sure others do not depend on internals or non published stuff.\n\n## Easy to use\n\nRun the following command at the root of your package to drop any file that will not make it in the final bundle published to npm.\n\n```bash\n# With npm\nnpx -p @fast-check/packaged packaged\n# With pnpm\npnpm --package=@fast-check/packaged dlx packaged\n# With yarn\nyarn dlx -p @fast-check/packaged packaged\n```\n\n⚠️ You may want to try with `--dry-run` flag first to give it a try.\n\nIt also comes with some extra flags:\n\n- `--dry-run`: do not drop any file or directory from the file system and only print what would have been removed\n- `--keep <name>`: keep a root-level file or directory matching the exact name (not a glob pattern, can be specified multiple times, e.g. `--keep node_modules --keep src`)\n\n## Simple API\n\n```js\nimport { computePublishedFiles, removeNonPublishedFiles } from '@fast-check/packaged';\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at .\nconst publishedFilesRoot = await computePublishedFiles('.');\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at ./sub-directory\nconst publishedFilesSubDirectory = await computePublishedFiles('./sub-directory');\n\n// Run the deletion of unwanted files\nconst { kept, removed } = await removeNonPublishedFiles('.', { dryRun: false, keep: [] });\n// kept and removed are arrays of strings\n// they may contain files or directories\n```\n\n## Minimal requirements\n\n| @fast-check/packaged | node                   |\n| -------------------- | ---------------------- |\n| **0.6.x**            | ≥20.19.0<sup>(1)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n\n</details>\n","packages/poisoning/README.md":"# `@fast-check/poisoning`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nSet of utilities to ease detection and revert of poisoning\n\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpoisoning.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpoisoning\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/poisoning/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpoisoning.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nIn JavaScript, \"prototype poisoning\" is one of the most common source for CVEs or zero days. It allows attackers to change the behaviour of some defaults like `Array.prototype.map`, `Map`, `Set`... so that they behave differently and can be leveraged for evil stuffs. This package can be used in addition to `fast-check` in order to detect poisoning that may occur during your property based tests.\n\n## Easy to use\n\nThe package comes with:\n\n- `assertNoPoisoning`: assert that the defaults known when first importing the package in your code have not been changed\n- `restoreGlobals`: restore the defaults so that any change that could have been detected by `assertNoPoisoning` will be resolved\n\n## Minimal requirements\n\n- Node ≥20.19.0\n","packages/vitest/README.md":"# `@fast-check/vitest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Vitest.\n`@fast-check/vitest` simplifies the integration of `fast-check` into Vitest.\n\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fvitest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fvitest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fvitest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/vitest`:\n\n```bash\nnpm install --save-dev @fast-check/vitest\n```\n\nIn order to work properly, `@fast-check/vitest` requires `vitest` to be installed.\n\n## Examples\n\nThe library comes with two modes, both powered by fast-check:\n\n- One-time random mode – A lightweight approach that introduces controlled randomness into your tests while keeping runs reproducible.\n- Property-based testing mode – A full-fledged property-based testing approach leveraging the full capabilities of fast-check.\n\n### One-time random mode\n\nThis mode extends Vitest's default `test` and `it` functions, allowing you to introduce controlled randomness into your tests while ensuring failures remain reproducible. This makes it easier to debug flaky tests and avoid irreproducible failures due to randomness.\n\nUnlike property-based testing, this mode does not run tests multiple times or attempt shrinking when failures occur. Instead, it provides a determistic way to introduce randomness when needed.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\nimport { expect } from 'vitest';\n\n// You can provide a fixed seed to force a replay by adding this line:\n// >>  fc.configureGlobal({ seed })\n// Eventually you can disable shrinking capabilities with:\n// >>  fc.configureGlobal({ endOnFailure: false })\n// >>  // or combine it with the one above if you need both\n\ntest('test relying on randomness', ({ g }) => {\n  // Arrange\n  const user = {\n    firstName: g(fc.string),\n    lastName: g(fc.string),\n  };\n\n  // Act\n  const displayName = computeDisplayName(user);\n\n  // Assert\n  expect(displayName).toContain(user.firstName);\n});\n\ntest('test not relying on randomness', () => {\n  // your test\n});\n```\n\n### Full property-based mode\n\nFor more extensive testing, `@fast-check/vitest` also provides full support for property-based testing. This mode enables exhaustive, randomized testing by generating a variety of inputs and detecting edge cases automatically.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// same property but using named values\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nPlease note that the properties accepted by `@fast-check/vitest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances).\n\n### Seamless integration with Vitest's `beforeEach` / `afterEach`\n\nVitest's `beforeEach` and `afterEach` hooks are natively integrated into predicates. They are called respectively before and after each execution of the predicate. If a predicate runs _n_ times, `beforeEach` will be called _n_ times before it and `afterEach` _n_ times after it. The only caveat is that cleanup functions returned by `beforeEach` on the first predicate execution are deferred until the end of the test, as they are handled by vitest's own teardown mechanism. All other cleanups run between predicate executions as expected.\n\n### Advanced\n\nIf you want to forward custom parameters to fast-check, `test.prop` accepts an optional `fc.Parameters` ([more](https://github.com/dubzzz/fast-check/blob/main/documentation/1-Guides/Runners.md#runners)).\n\n`@fast-check/vitest` also comes with `.only`, `.skip`, `.todo` and `.concurrent` from vitest. It also accepts more complex ones such as `.concurrent.skip`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/vitest';\n\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n## Minimal requirements\n\n| @fast-check/vitest | vitest                                                              | fast-check                       | Node                                                                   |\n| ------------------ | ------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------- |\n| **0.4**            | ^4.1.0 \\|\\| ^5.0.0                                                  | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup> (Vitest 4)<br>≥22.12.0<sup>(2)</sup> (Vitest 5) |\n| **0.3**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4                                          | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup>                                                 |\n| **0.2**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4<sup>(1)</sup>                            | ^3.0.0 \\|\\| ^4.0.0               | ≥18<sup>(3)</sup>                                                      |\n| **0.1**            | >=0.28.1 <1.0.0 \\|\\| ^1 \\|\\| ^2<sup>(4)</sup> \\|\\| ^3<sup>(5)</sup> | ^3.0.0 \\|\\| ^4.0.0<sup>(6)</sup> | ≥14.16.0<sup>(3)</sup>                                                 |\n| **0.0**            | >=0.28.1 <1.0.0 \\|\\| ^1                                             | ^3.0.0                           | ≥14.16.0<sup>(3)</sup>                                                 |\n\n<details>\n<summary>More details...</summary>\n\n1. Official support for version 4.x of vitest starts at 0.2.3.\n2. Requires support for `require(esm)`.\n3. Same support as vitest.\n4. Official support for version 2.x of vitest starts at 0.1.2.\n5. Official support for version 3.x of vitest starts at 0.1.5.\n6. Official support for version 4.x of fast-check starts at 0.1.6.\n\n</details>\n","packages/worker/README.md":"# `@fast-check/worker`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nProvide built-ins to run predicates directly within dedicated workers\n\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://badge.fury.io/js/@fast-check%2Fworker.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fworker\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/worker/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fworker.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\n`fast-check` alone is great but what if it led your code into an infinite and synchronous loop for such inputs? In such case, it would neither be able to shrink the issue, nor to report any for you as the single threaded philosophy at the root of JavaScript will prevent it from anything except waiting for the main thread to come back.\n\nThis package tends to provide a way to run easily your properties within dedicated workers automatically spawed by it.\n\n## Example\n\nHere are some of the changes you will have to do:\n\n- hoist properties so that they get declared on the root scope\n- replace `fc.property` by `property` coming from `propertyFor(<path-to-file>)`\n- replace `fc.assert` by `assert` coming from `@fast-check/worker` for automatic cleaning of the workers as the test ends\n- transpilation has not been addressed yet but it may probably work\n- in theory, if you were only using `propertyFor` and `assert` without any external framework for `test`, `it` and others, the separation of the property from the assertion would be useless as the check for main thread is fully handled within `@fast-check/worker` itself so no hoisting needing in such case\n\n```js\nimport { test } from '@jest/globals';\nimport * as fc from 'fast-check';\nimport { isMainThread } from 'node:worker_threads';\nimport { assert, propertyFor } from '@fast-check/worker';\n\nconst property = propertyFor(new URL(import.meta.url)); // or propertyFor(pathToFileURL(__filename)) in commonjs\nconst p1 = property(fc.nat(), fc.nat(), (start, end) => {\n  // starting a possibly infinite loop\n  for (let i = start; i !== end; ++i) {\n    // doing stuff...\n  }\n});\n\nif (isMainThread) {\n  test('should assess p1', async () => {\n    await assert(p1, { plugins: [fc.timeout(1000)] });\n  });\n}\n```\n\nRefer to the tests defined `test/main.spec.ts` for a living example of how you can use this package with a test runner such as Jest.\n\n## Extra options\n\nThe builder of properties `propertyFor` accepts a second parameter to customize how the workers will behave. By default, workers will be shared across properties. In case you want a more isolation between your runs, you can use:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { isolationLevel: 'predicate' });\n// Other values:\n// - \"file\": Re-use workers cross properties (default)\n// - \"property\": Re-use workers for each run of the predicate. Not shared across properties!\n// - \"predicate\": One worker per run of the predicate\n```\n\nBy default, workers will receive the generated values from their parent thread. In some cases, such sending is made impossible as the generated values include non-serializable pieces. In such cases, you can opt-in to generate the values directly within the workers by using:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { randomSource: 'worker' });\n// Other values:\n// - \"main-thread\": The main thread will be responsible to generate the random values and send them to the worker thread. It unfortunately cannot send any value that cannot be serialized between threads. (default)\n// - \"worker\": The worker is responsible to generate its own values based on the instructions provided by the main thread. Switching to a worker mode allows to support non-serializable values, unfortunately it drops all shrinking. capabilities.\n```\n\n## Minimal requirements\n\n- Node ≥14.18.0<sup>(1)</sup><sup>(2)</sup><sup>(3)</sup>\n- TypeScript ≥4.1 (optional)\n\n_(1): `worker_threads` alone would only require Node ≥10.5.0, but our usage of `require(node:*)` forces us to request at least Node ≥14.18.0_\n\n_(2): this package targets ES2020 specification which is quite well supported (more than 94%) by any Node ≥14.5.0_\n\n_(3): this package requires a version of node able to understand `package.json#exports`, supported by any Node ≥12.17.0_\n","skills/javascript-testing-expert/SKILL.md":"---\nname: javascript-testing-expert\ndescription: Expert-level JavaScript testing skill focused on writing high-quality tests that find bugs, serve as documentation, and prevent regressions. Advocates for property-based testing with fast-check and protects against indeterministic code in tests. Does not cover black-box e2e testing.\n---\n\n> **⚠️ Scope:** Testing functions and components, not black-box e2e.\n\n**🏅 Main objectives:** use tests as a way to...\n\n1. uncover hard to detect bugs\n2. document how to use the code\n3. avoid regressions\n4. challenge the code\n\n**🔧 Recommended tooling:** `vitest`, `fast-check`, `@fast-check/vitest`, `@testing-library/*`, `@vitest/browser-playwright`, `msw` installed as devDependencies.  \n**✅ Do** try to install missing and relevant tooling, only recommend for `@fast-check/vitest` and browser testing.  \n**✅ Do** highly recommend user to install missing and relevant tooling.  \n**✅ Do** adapt yourself to missing tools.\n\n## File and code layout\n\n**✅ Do** mimic the existing test structure of the project when adding new tests\n\n**✅ Do** use one test file per code file\n\n**👍 Prefer** using `.spec.ts` extension (e.g., `fileName.ts` → `fileName.spec.ts`) and colocated with the source file if no existing test structure is present\n\n**✅ Do** put `it` within `describe`, when using `it`\n\n**👍 Prefer** `it` over `test`\n\n**✅ Do** name the `describe` with the name of the function being tested\n\n**✅ Do** use a dedicated `describe` for each function being tested\n\n**✅ Do** start naming `it` with \"should\" and considers that the name should be clear, as consise as possible and could be read as a sentence implicitly prefixed by \"it\"\n\n**✅ Do** start with simple and documenting tests\n\n**✅ Do** continue with advanced tests looking for edge-cases\n\n**❌ Don't** delimitate explicitely simple from advanced tests, just but them in the right order\n\n**✅ Do** put helper functions specific to the file after all the `describe`s just below a comment `// Helpers` stating the beginning of the helpers tailored for this file\n\n## Core guidelines\n\n**✅ Do** follow the AAA pattern and make it visible in the test\n\n```ts\nit('should...', () => {\n  // Arrange\n  code;\n\n  // Act\n  code;\n\n  // Assert\n  code;\n});\n```\n\n**✅ Do** keep tests focused, try to assert on one precise aspect\n\n**✅ Do** keep tests simple\n\n**👎 Avoid** complex logic in tests or its helpers\n\n**❌ Don't** test internal details\n\n**👍 Prefer** stubs over mocks, the first one provides an alternate implementation, the second one helps to assert on calls being done or not  \nWhy? Often, asserting the number of calls is not something critical for the user of the function but purely an internal detail\n\n**❌ Don't** rely on network call, stub it with `msw`\n\n**✅ Do** reset globals and mocks in `beforeEach` if any `it` plays with mocks or spies or alter globals  \nAlternatively, when using vitest you could check if flags `mockReset`, `unstubEnvs` and `unstubGlobals` have been enabled in the configuration, in such case resetting globals is done by default\n\n**👍 Prefer** realistic data for documentation-like tests  \nEg.: use real names if you have to build instances of users\n\n**❌ Don't** overuse snapshot tests; only snapshot things when the \"what is expected to be seen in the snapshot\" is clear  \nWhy? Snapshots tests tend to capture too many details in the snapshot, making them hard to update given future reader is lost on what was the real thing being tested\n\n**👍 Prefer** snapshots when shape and structure are important (component hierarchy, attributes, non-regression on output structure)\n\n**👍 Prefer** screenshots when final render is important (visual styling, layout)\n\n**✅ Do** warn developer when the code under tests requires too many parameters and/or too many mocks/stubs to be forged (more than 10)  \nWhy? Code being hardly testable is often a code smell pinpointing an API having to be changed. Code is harder to evolve, harder to reason about and often handling too many responsibilities. Recommend the single-responsibility principle (SRP)\n\n**✅ Do** try to make tests shorter and faster to read by factorizing recurrent logics into helper functions\n\n**✅ Do** group shared logics under a function having a clear and explicit name, follow SRP for these helpers  \nEg.: avoid functions with lots of optional parameters, doing several things\n\n**❌ Don't** write a big `prepare` function re-used by all tests in their act part, but make the name clearer and eventually split it into multiple functions\n\n**✅ Do** make sure your test breaks if you drop the thing supposed to make it pass  \nEg.: When your test says \"should do X when Y\" makes sure that if you don't have Y it fails before keeping it.\n\n**👎 Avoid** writing tests with entities specifying hardcoded values on unused fields\n\nExample of test content\n\n```ts\nconst user: User = {\n  name: 'Paul', // unused\n  birthday: '2010-02-03',\n};\nconst age = computeAge(user);\n//...\n```\n\n**👍 Prefer** leveraging `@fast-check/vitest`, if installed\n\n```ts\nimport { describe } from 'vitest';\nimport { it, fc } from '@fast-check/vitest';\n\ndescribe('computeAge', () => {\n  it('should compute a positive age', ({ g }) => {\n    // Arrange\n    const user: User = {\n      name: g(fc.string), // unused\n      birthday: '2010-02-03',\n    };\n\n    // Act\n    const age = computeAge(user);\n\n    // Assert\n    expect(age).toBeGreaterThan(0);\n  });\n});\n```\n\n**👍 Prefer** leveraging `fast-check`, if installed but not `@fast-check/vitest`\n\n**👎 Avoid** writing tests depending on unstable values  \nEg.: in the example above `computeAge` depends on the current date  \nRemark: same for locales and plenty other platform dependent values\n\n**👍 Prefer** stubbing today using `vi.setSystemTime`\n\n**👍 Prefer** controlling today using `@fast-check/vitest`  \nWhy? Contrary to `vi.setSystemTime` alone you check the code against one new today at each run, but if it happens to fail one day you will be reported with the exact date causing the problem\n\n```ts\n// Arrange\nvi.setSystemTime(g(fc.date, { min: new Date('2010-02-04'), noInvalidDate: true }));\nconst user: User = {\n  name: g(fc.string), // unused\n  birthday: '2010-02-03',\n};\n```\n\n**👎 Avoid** writing tests depending on random values or entities\n\n**👍 Prefer** controlling randomly generated values by relying on `@fast-check/vitest` if installed, or `fast-check` otherwise\n\n**✅ Do** use property based tests for any test with a notion of always or never  \nEg.: name being \"should always do x when y\" or \"should never do x when y\"  \nRemark: consider these tests as advanced and put them after the documentation tests and not with them\n\n**👍 Prefer** using property based testing for edge case detection instead of writing all cases one by one\n\n**❌ Don't** try to test 100% of the algorithm cases using property-based testing\nWhy? Property-based testing and example-based testing are complementary. Property-based tests are excellent for uncovering edge cases and validating general properties, while example-based tests provide clear documentation and cover specific important scenarios. Use both approaches together for comprehensive test coverage.\n\n```ts\n// for all a, b, c strings\n// b is a substring of a + b + c\nit.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  // Arrange\n  const text = a + b + c;\n  const pattern = b;\n\n  // Act\n  const result = isSubstring(text, pattern);\n\n  // Assert\n  expect(result).toBe(true);\n});\n```\n\n**✅ Do** extract complex logic from components into dedicated and testable functions\n\n**❌ Don't** test trivial component logic that has zero complexity\n\n**👍 Prefer** testing the DOM structure and user interactions when using testing-library\n\n**👍 Prefer** testing the visual display and user interactions when using browser testing\n\n**👍 Prefer** querying by accessible attributes and user-visible text by relying on `getByRole`, `getByLabelText`, `getByText` over `getByTestId` whenever possible for testing-library and browser testing\n\n**✅ Do** ensure non visual regression of Design System components and more generally visual components by leveraging screenshot tests in browser when available  \n**✅ Do** fallback to snapshot tests capturing the DOM structure if screenshot tests cannot be ran\n\n## Guidelines for properties\n\nAll this section considers that we are in the context of property based tests!\n\n**⚠️ Version compatibility:** Starting with fast-check v5, use `fc.property` for both synchronous and asynchronous predicates. With fast-check v4, use `fc.property` for synchronous predicates and `fc.asyncProperty` for asynchronous predicates.\n\n**✅ Do** always await `fc.assert(...)` when using `fast-check` directly, in both v4 and v5+, even when the predicate is synchronous. Make the surrounding test callback `async` so property failures are reported by the test runner.\n\n**⚠️ Important:** When using `g` from `@fast-check/vitest`, pass the arbitrary **function** (e.g., `fc.string`, `fc.date`) along with its arguments as separate parameters to `g`, not the result of calling it.  \nCorrect: `g(fc.string)`, `g(fc.date, { min: new Date('2010-01-01') })`  \nIncorrect: `g(fc.string())`, `g(fc.date({ min: new Date('2010-01-01') }))`\n\n**❌ Don't** generate inputs directly  \nThe risk being that you may end up rewriting the code being tested in the test\n\n**✅ Do** construct values to build some inputs where you know the expected outcome\n\n**❌ Don't** expect the returned value in details, in many cases you won't have enough details to be able to assert the full value\n\n**✅ Do** expect some aspects and characteristics of the returned value\n\n**❌ NEVER** specify any `maxLength` on an arbitrary if it is a not a requirement of the algorithm  \n**👍 Prefer** specifying a `size: '-1'` if you feel that the algorithm will take very long on large inputs (by default fast-check generates up to 10 items, so only use `size` when clearly required)  \nEg.: No `fc.string({maxLength: 5})` or `fc.array(arb, {maxLength: 8})` except being a string requirement\n\n**❌ NEVER** specify any constraint on an arbitrary if it is not a requirement of the arbitrary, use defaults as much as possible  \nEg.: if the algorithm should accept any integer just ask an integer without specifying any min and max\n\n**👎 Avoid** overusing `.filter` and `fc.pre`  \nWhy? They slow down the generation of values by dropping some generated ones\n\n**👍 Prefer** using options provided by arbitraries to directly generate valid values  \nEg.: use `fc.string({ minLength: 2 })` instead of `fc.string().filter(s => s.length >= 2)`  \nEg.: use `fc.integer({ min: 1 })` instead of `fc.integer().filter(n => n >= 1)`, or use `fc.nat()` instead of `fc.integer().filter(n => n >= 0)`\n\n**👍 Prefer** using `map` over `filter` when a `map` trick can avoid filtering  \nEg.: use `fc.nat().map(n => n * 2)` for even numbers  \nEg.: use `fc.tuple(fc.string(), fc.string()).map(([start, end]) => start + 'A' + end)` for strings always having an 'A' character\n\n**👍 Prefer** bigint type over number type for integer computations used within predicates when there is a risk of overflow (eg.: when running pow, multiply.. on generated values)\n\nSome classical properties:\n\n1. Characteristics independent of the inputs. _Eg.: for any floating point number d, Math.floor(d) is an integer. for any integer n, Math.abs(n) ≥ 0_\n2. Characteristics derived from the inputs. _Eg.: for any a and b integers, the average of a and b is between a and b. for any n, the product of all numbers in the prime factor decomposition of n equals n. for any array of data, sorted(data) and data contains the same elements. for any n1, n2 integers such that n1 != n2, romanString(n1) != romanString(n2). for any floating point number d, Math.floor(d) is an integer such as d-1 ≤ Math.floor(d) ≤ d_\n3. Restricted set of inputs with useful characteristics. _Eg.: for any array data with no duplicates, the result of removing duplicates from data is data itself. for any a, b and c strings, the concatenation of a, b and c always contains b. for any prime number p, its decomposition into prime factors is itself_\n4. Characteristics on combination of functions. _Eg.: zipping then unzipping a file should result in the original file. lcm(a,b) times gcd(a,b) must be equal to a times b_\n5. Comparison with a simpler implementation. _Eg.: c is contained inside sorted array data for binary search is equivalent to c is contained inside data for linear search_\n\n## Guidelines for race conditions\n\n**✅ Do** write tests checking for race conditions and playing with resolution order — _automatically handled by `fast-check`_ — when an algorithm accepts asynchronous functions as input\n\n**✅ Do** leverage `fast-check` and its `fc.scheduler()` arbitrary to test asynchronous code depending on asynchronous functions\n\nTurn:\n\n```ts\nit('should resolve in call order', async () => {\n  // Arrange\n  const seenAnswers = [];\n  const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n  // Act\n  const queued = queue(call);\n  await Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]);\n\n  // Assert\n  expect(seenAnswers).toEqual([1, 2]);\n});\n```\n\nInto (fast-check v5+; use `fc.asyncProperty` instead of `fc.property` in v4):\n\n```ts\nit('should resolve in call order', async () => {\n  await fc.assert(\n    fc.property(fc.scheduler(), async (s) => {\n      // Arrange\n      const seenAnswers = [];\n      const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n      // Act\n      const queued = queue(s.scheduleFunction(call));\n      await s.waitFor(\n        Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]),\n      );\n\n      // Assert\n      expect(seenAnswers).toEqual([1, 2]);\n    }),\n  );\n});\n```\n\n## Recommendation for faker users\n\nIf using `faker` to fake data, we recommend wiring any fake data generation within `fast-check` by leveraging this code snippet:\n\n```ts\n// Source: https://fast-check.dev/blog/2024/07/18/integrating-faker-with-fast-check/\nimport { Faker, Randomizer, base } from '@faker-js/faker';\nimport * as fc from 'fast-check';\n\nclass FakerBuilder<TValue> extends fc.Arbitrary<TValue> {\n  constructor(private readonly generator: (faker: Faker) => TValue) {\n    super();\n  }\n  generate(mrng: fc.Random, biasFactor: number | undefined): fc.Value<TValue> {\n    const randomizer: Randomizer = {\n      next: (): number => (mrng.nextInt(0, 0x3ffffff) * 2 ** 27 + mrng.nextInt(0, 0x7ffffff)) / 2 ** 53,\n      seed: () => {}, // no-op, no support for updates of the seed, could even throw\n    };\n    const customFaker = new Faker({ locale: base, randomizer });\n    return new fc.Value(this.generator(customFaker), undefined);\n  }\n  canShrinkWithoutContext(value: unknown): value is TValue {\n    return false;\n  }\n  shrink(value: TValue, context: unknown): fc.Stream<fc.Value<TValue>> {\n    return fc.Stream.nil();\n  }\n}\n\nfunction fakerToArb<TValue>(generator: (faker: Faker) => TValue): fc.Arbitrary<TValue> {\n  return new FakerBuilder(generator);\n}\n```\n\nExample of usage\n\n```ts\nawait fc.assert(\n  fc.property(\n    fakerToArb((faker) => faker.person.firstName),\n    fakerToArb((faker) => faker.person.lastName),\n    (firstName, lastName) => {\n      // code\n    },\n  ),\n);\n```\n\n## Equivalence `fast-check` and `@fast-check/vitest`\n\nExample 1.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit('...', ({ g }) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(fc.gen(), (g) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 2.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, (...values) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 3. For asynchronous predicates, use `fc.property` in fast-check v5+ (as shown below) and `fc.asyncProperty` in v4. Always await `fc.assert`, just as in the synchronous examples above.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', async (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, async (...values) => {\n      //...\n    }),\n  );\n});\n```\n","website/docs/core-blocks/plugins/index.md":"---\nsidebar_position: 4\nslug: /core-blocks/plugins/\ndescription: Extend the default execution flow provided by runners to meet your needs.\n---\n\n# Plugins\n\nPlugins provide a way to extend and refine the runtime and execution behavior of your properties. In the same way building custom arbitraries gives you the flexibility to tweak generation flows, plugins give you ways to customize how your properties run.\n\nPlugins are designed to support things such as:\n\n- Executing something before the predicate\n- Stopping a predicate running for too long\n- Capturing key insights about the execution flows including timings for observability\n\n## Using plugins\n\nPlugins can be passed as part of the customizations accepted by the `fc.assert` runner.\n\n```ts\nawait fc.assert(fc.property(...arbs, predicate), {\n  plugins: [pluginA(...paramsForPluginA), pluginB(...paramsForPluginB)],\n});\n```\n\n## Installing plugins globally\n\nPlugins needed by all your properties can be installed once, typically in a [setup file](/docs/configuration/global-settings/#integration-with-test-frameworks), with `installGlobalPlugin`.\n\n```ts\nfc.installGlobalPlugin(pluginA());\n```\n\nInstalled plugins run before the ones passed to the runner, so the snippet above followed by `fc.assert(myProp, { plugins: [pluginB()] })` is equivalent to `plugins: [pluginA(), pluginB()]`.\n\n## Combining plugins\n\nPlugins have been designed to be combined together. When multiple plugins get defined for the same assertion, they execute in declaration order. The first plugin runs first and wraps the execution of the second one until we reach the main operation. Plugins can wrap various stages of the flow, including the execution of the predicate function.\n\nLet's illustrate how plugins get combined on a property checking a search endpoint. In this example, the database is brought back to a clean state before each run:\n\n```ts\nawait fc.assert(\n  fc.property(fc.string(), async (query) => {\n    const results = await searchService.search(query);\n    // ...assertions on the results...\n  }),\n  {\n    plugins: [\n      timeout(10_000),\n      beforeEach(async () => {\n        await database.reset(); // bring back a clean state, possibly slow\n      }),\n      timeout(5_000),\n    ],\n  },\n);\n```\n\nThe plugin setup above makes use of two instances of the `timeout` plugin. The first instance is responsible for making sure that the time taken by the `beforeEach` cleanup plus the one taken by the predicate never exceeds 10 seconds. The second one only wraps the predicate and makes sure that it won't take more than 5 seconds.\n\nThis short example clearly highlights why the declaration order of plugins is crucial. Two different orders may result in totally different expectations. Correctly ordering them will make you capable of finely configuring your flows to fit your needs.\n\n## The plugins\n\nWe come up with a set of plugins to extend the library using built-in plugins. The following pages provide extended details and deep dive into each of them.\n\n```mdx-code-block\nimport DocCardList from '@theme/DocCardList';\n\n<DocCardList />\n```\n","website/docs/core-blocks/plugins/life-cycle.md":"---\nslug: /core-blocks/plugins/life-cycle/\n---\n\n# Life-cycle\n\nLife-cycle plugins provide hooks to prepare or clean up things for your predicates. They wrap every execution of the predicate including the ones linked to shrinking.\n\n## `beforeEach`\n\nThe `beforeEach` plugin lets you run code right before the execution of your predicate.\n\nIt expects to receive a function returning either nothing or a teardown function, in a synchronous or asynchronous fashion. Any other returned value may lead to unexpected behavior and is subject to change between versions.\n\nWhen a teardown function gets returned, it will be used as a clean-up function running right after the execution of the predicate, no matter its status.\n\nSimple example involving two synchronous `beforeEach` without any teardown function being declared:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      // beforeEach hook #1\n    }),\n    beforeEach(() => {\n      // beforeEach hook #2\n    }),\n  ];\n}\n```\n\nExample featuring all the possible variants with or without teardown, synchronous or asynchronous:\n\n```ts\n{\n  plugins: [\n    // synchronous beforeEach\n    beforeEach(() => {\n      // ...\n    }),\n    // synchronous beforeEach with synchronous teardown\n    beforeEach(() => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // synchronous beforeEach with asynchronous teardown\n    beforeEach(() => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach\n    beforeEach(async () => {\n      // ...\n    }),\n    // asynchronous beforeEach with synchronous teardown\n    beforeEach(async () => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach with asynchronous teardown\n    beforeEach(async () => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n  ];\n}\n```\n\nAll these variants can be used together. They have the same ordering priorities.\n\nResources: [API reference](/docs/api/functions/beforeEach).\n\n## `afterEach`\n\nThe `afterEach` plugin is the mirror of `beforeEach`. It lets you run code right after the execution of your predicate.\n\nSimilarly to `beforeEach`, it expects to receive a function returning either `void` or `Promise<void>`, but unlike `beforeEach` it cannot return a teardown function. Any other returned value may lead to unexpected behavior.\n\nContrary to `beforeEach`, `afterEach` will always be executed no matter the execution status of other hooks. As such, if one `beforeEach` or one `afterEach` rejects, other `afterEach` will still be executed.\n\nResources: [API reference](/docs/api/functions/afterEach).\n\n## Execution flow\n\nLife-cycle plugins run in the same order as they got declared for before tasks and in reverse order for after tasks. As such, the following ordering of plugins:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n    afterEach(() => {\n      console.log('afterEach #3');\n    }),\n    afterEach(() => {\n      console.log('afterEach #4');\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #5');\n      return () => {\n        console.log('teardown for beforeEach #5');\n      };\n    }),\n  ];\n}\n```\n\nWould result, for each run, into:\n\n```txt\nbeforeEach #1\nbeforeEach #2\nbeforeEach #5\npredicate\nteardown for beforeEach #5\nafterEach #4\nafterEach #3\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n\nThey run in an exclusive fashion. As such, a `beforeEach`, a teardown or an `afterEach` will wait for the currently running one to end before starting. Similarly, they don't run while the predicate is under way. They wait for it to come back with an execution status.\n\n:::warning[Predicate may run longer]\nWhile they are waiting for the predicate to come back with a status, note that whenever the predicate's execution gets stopped or interrupted, due to a timeout for example, there is no certainty that the code of the predicate has really been stopped. In Node, and more generally in JavaScript, there is no way to stop a running script: such plugins will mostly resume before the script ends but in many cases the script will keep running in background (as the plugin can't stop it).\n:::\n\nLike any built-in plugin, life-cycle plugins compose with the plugins declared next to them. As such, in the hypothesis of a plugin named `retryOnFailure(count)`, declaring plugins as follows:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    retryOnFailure(2),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n  ];\n}\n```\n\nMay result in the following logs at execution time:\n\n```txt\nbeforeEach #1 <-- runs once, it wraps all the attempts\nbeforeEach #2 <-- the first attempt\npredicate     <-- considering it fails at first attempt...\nteardown for beforeEach #2\nbeforeEach #2 <-- ...`retryOnFailure` launches a second attempt\npredicate\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n","website/docs/core-blocks/plugins/time-limits.md":"---\nslug: /core-blocks/plugins/time-limits/\n---\n\n# Time limits\n\nTime-limit plugins bound the time spent assessing your properties. They can come into play at various levels, from an isolated execution of a predicate to the full run of the assertion.\n\nThey make the runner stop its ongoing task when the limit gets reached. As such, they cannot really stop the code they wrap but ignore its results.\n\n## `timeout`\n\nThe `timeout` plugin marks the current execution of your predicate as failed if it did not complete within the requested delay expressed in milliseconds.\n\n```ts\n{\n  plugins: [\n    timeout(1000), // fail any execution of the predicate taking more than 1 second\n  ];\n}\n```\n\nThe countdown restarts for every execution of the predicate, shrinking phase included. A timed-out execution gets reported like any other failure, it's just a failure.\n\nResources: [API reference](/docs/api/functions/timeout).\n\n## `interruptAfterTimeLimit`\n\nThe `interruptAfterTimeLimit` plugin interrupts all runs once the requested delay expires. Past this delay, no new execution of the predicate will be started and any execution still running at that time will be interrupted.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000), // interrupt the execution of the property after 1 second\n  ];\n}\n```\n\nThe countdown starts when the runner starts executing the property.\n\nAn interrupted property is not necessarily considered to be a failure. By default, it gets marked as successful as long as at least one execution succeeded before the interruption and no failure got reported. To change that default and report interrupted properties as failures, one can set `failOnInterrupt: true` on the plugin.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000, { failOnInterrupt: true }), // mark an interrupted property as a failed one\n  ];\n}\n```\n\nResources: [API reference](/docs/api/functions/interruptAfterTimeLimit).\n\n## Limitations\n\nBoth plugins share the same limitations.\n\n### Synchronous code can't be cut\n\nThere is no way to pause or kill a running synchronous script in JavaScript. A synchronous predicate will always run to its end before any of these plugins get the flow back.\n\nAs such, `timeout` has no effect on purely synchronous predicates and `interruptAfterTimeLimit` can only prevent new executions from starting once the limit gets reached.\n\n### Asynchronous code can't be canceled\n\nWhenever the limit gets reached during an asynchronous execution, the plugins give control back to the runner without waiting for the predicate. But the underlying execution keeps running in the background and its outcome gets ignored.\n\nPlugins declared before the time-limit one may thus run while the predicate is still under way.\n\n### Stopping the code\n\nIf you need the code under test to be really stopped, have a look at [`@fast-check/worker`](https://www.npmx.dev/package/@fast-check/worker). It runs predicates in dedicated worker threads that can be terminated, synchronous ones included.\n","website/docs/core-blocks/plugins/values.md":"---\nslug: /core-blocks/plugins/values/\n---\n\n# Values\n\nValue plugins customize which values get forwarded to your predicates. Bias plugins customize how generation targets values, while equal-values plugins avoid executing your predicates twice on the same value.\n\nEqual-values plugins keep track of the values already covered during the run and replay the outcome of the first execution whenever a value gets generated again. Values are compared based on their stringified representation.\n\n## `unbiased`\n\nThe `unbiased` plugin generates the values feeding your predicates without any bias.\n\n```ts\n{\n  plugins: [\n    unbiased(), // draw all values from the full range of the arbitraries\n  ];\n}\n```\n\nWithout this plugin, generation is biased by default. Compared with a uniform distribution, smaller or more extreme values are more likely to be generated, helping uncover common issues earlier. For example, with `fc.integer()`, small values such as `1` and `2` are more likely to be generated than `171414468`.\n\nWith this plugin enabled, every run draws from the full range of the arbitraries with no special treatment. For `fc.integer()`, `171414468` is then just as likely to be generated as `1` or `2`.\n\nResources: [API reference](/docs/api/functions/unbiased).\n\n## `ignoreEqualValues`\n\nThe `ignoreEqualValues` plugin discards runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    ignoreEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nDiscarded runs still count as runs: a run replaying a past success stays a success.\n\nResources: [API reference](/docs/api/functions/ignoreEqualValues).\n\n## `skipEqualValues`\n\nThe `skipEqualValues` plugin skips runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    skipEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nContrary to `ignoreEqualValues`, a run replaying a past success gets marked as skipped instead of successful: passed the maximal number of allowed skips the run will be marked as failed. It gives stronger guarantees on the number of distinct values covered by the run at the price of potentially failing on arbitraries unable to produce enough distinct values.\n\nResources: [API reference](/docs/api/functions/skipEqualValues).\n"},"items":[{"name":"copilot-instructions.md","path":".github/copilot-instructions.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/.github/copilot-instructions.md","title":"GitHub Copilot Instructions","category":"copilot-instructions","format":"markdown","content":"# GitHub Copilot Instructions\n\n## Pull Request Naming Convention\n\nWhen creating or naming pull requests, follow the [gitmoji](https://gitmoji.dev/) specification:\n\n### Format\n\n- **For changes to the main `fast-check` package**: Use the format `emoji Description`\n  - Example: `✨ Add new arbitrary for dates`\n  - Example: `🐛 Fix edge case in integer shrinking`\n\n- **For changes to other packages** (ava, vitest, jest, worker, poisoning, packaged): Use the format `emoji(package-name) Description`\n  - Example: `👷(vitest) Add support for new vitest features`\n  - Example: `🐛(jest) Fix compatibility with jest 29`\n  - Example: `📝(ava) Update documentation for ava integration`\n\nLimit the name of the PR to at most 50 characters for the Description part (that is, the text after the `emoji` or `emoji(package-name)` prefix). It forces the author to summarize the changes succinctly, making it easier for others to understand the main purpose of the PR at a glance.\n\n### Common Gitmoji Examples\n\n- ✨ Introduce new features\n- 🐛 Fix a bug\n- 📝 Add or update documentation\n- ✅ Add or update tests\n- 🏷️ Add or update types\n- ⚡️ Improve performance\n- 👷 Add or update CI/CD\n- ♻️ Refactor code\n- 🔧 Add or update configuration files\n- 🎨 Improve structure/format of the code\n- 🔥 Remove code or files\n- 🚀 Deploy stuff\n- 🔒️ Fix security or privacy issues\n- ⬆️ Upgrade dependencies\n- ⬇️ Downgrade dependencies\n- 📦 Add or update compiled files or packages\n\nFor a complete list of gitmoji codes, see https://gitmoji.dev/\n\n## Pull Request Template\n\nWhen creating pull requests, always use the PR template located at `.github/PULL_REQUEST_TEMPLATE.md`. The template includes:\n\n- **Description**: Provide a short description and link to related issues (if any)\n- **Checklist**: Keep the entire checklist and all of its items; only check the boxes for the items that are fulfilled.\n- **Advanced**: Fill in the Category and Impacts sections to help reviewers understand the changes\n\nMake sure to fill out all sections of the template completely and accurately, and do not delete or reorder any sections or checklist items—only update their content and checkbox states.\n","isInternal":false,"tokens":529,"sizeBytes":2214},{"name":"SKILL.md","path":"skills/javascript-testing-expert/SKILL.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/skills/javascript-testing-expert/SKILL.md","title":"javascript-testing-expert","category":"anthropic-skill","format":"markdown","content":"---\nname: javascript-testing-expert\ndescription: Expert-level JavaScript testing skill focused on writing high-quality tests that find bugs, serve as documentation, and prevent regressions. Advocates for property-based testing with fast-check and protects against indeterministic code in tests. Does not cover black-box e2e testing.\n---\n\n> **⚠️ Scope:** Testing functions and components, not black-box e2e.\n\n**🏅 Main objectives:** use tests as a way to...\n\n1. uncover hard to detect bugs\n2. document how to use the code\n3. avoid regressions\n4. challenge the code\n\n**🔧 Recommended tooling:** `vitest`, `fast-check`, `@fast-check/vitest`, `@testing-library/*`, `@vitest/browser-playwright`, `msw` installed as devDependencies.  \n**✅ Do** try to install missing and relevant tooling, only recommend for `@fast-check/vitest` and browser testing.  \n**✅ Do** highly recommend user to install missing and relevant tooling.  \n**✅ Do** adapt yourself to missing tools.\n\n## File and code layout\n\n**✅ Do** mimic the existing test structure of the project when adding new tests\n\n**✅ Do** use one test file per code file\n\n**👍 Prefer** using `.spec.ts` extension (e.g., `fileName.ts` → `fileName.spec.ts`) and colocated with the source file if no existing test structure is present\n\n**✅ Do** put `it` within `describe`, when using `it`\n\n**👍 Prefer** `it` over `test`\n\n**✅ Do** name the `describe` with the name of the function being tested\n\n**✅ Do** use a dedicated `describe` for each function being tested\n\n**✅ Do** start naming `it` with \"should\" and considers that the name should be clear, as consise as possible and could be read as a sentence implicitly prefixed by \"it\"\n\n**✅ Do** start with simple and documenting tests\n\n**✅ Do** continue with advanced tests looking for edge-cases\n\n**❌ Don't** delimitate explicitely simple from advanced tests, just but them in the right order\n\n**✅ Do** put helper functions specific to the file after all the `describe`s just below a comment `// Helpers` stating the beginning of the helpers tailored for this file\n\n## Core guidelines\n\n**✅ Do** follow the AAA pattern and make it visible in the test\n\n```ts\nit('should...', () => {\n  // Arrange\n  code;\n\n  // Act\n  code;\n\n  // Assert\n  code;\n});\n```\n\n**✅ Do** keep tests focused, try to assert on one precise aspect\n\n**✅ Do** keep tests simple\n\n**👎 Avoid** complex logic in tests or its helpers\n\n**❌ Don't** test internal details\n\n**👍 Prefer** stubs over mocks, the first one provides an alternate implementation, the second one helps to assert on calls being done or not  \nWhy? Often, asserting the number of calls is not something critical for the user of the function but purely an internal detail\n\n**❌ Don't** rely on network call, stub it with `msw`\n\n**✅ Do** reset globals and mocks in `beforeEach` if any `it` plays with mocks or spies or alter globals  \nAlternatively, when using vitest you could check if flags `mockReset`, `unstubEnvs` and `unstubGlobals` have been enabled in the configuration, in such case resetting globals is done by default\n\n**👍 Prefer** realistic data for documentation-like tests  \nEg.: use real names if you have to build instances of users\n\n**❌ Don't** overuse snapshot tests; only snapshot things when the \"what is expected to be seen in the snapshot\" is clear  \nWhy? Snapshots tests tend to capture too many details in the snapshot, making them hard to update given future reader is lost on what was the real thing being tested\n\n**👍 Prefer** snapshots when shape and structure are important (component hierarchy, attributes, non-regression on output structure)\n\n**👍 Prefer** screenshots when final render is important (visual styling, layout)\n\n**✅ Do** warn developer when the code under tests requires too many parameters and/or too many mocks/stubs to be forged (more than 10)  \nWhy? Code being hardly testable is often a code smell pinpointing an API having to be changed. Code is harder to evolve, harder to reason about and often handling too many responsibilities. Recommend the single-responsibility principle (SRP)\n\n**✅ Do** try to make tests shorter and faster to read by factorizing recurrent logics into helper functions\n\n**✅ Do** group shared logics under a function having a clear and explicit name, follow SRP for these helpers  \nEg.: avoid functions with lots of optional parameters, doing several things\n\n**❌ Don't** write a big `prepare` function re-used by all tests in their act part, but make the name clearer and eventually split it into multiple functions\n\n**✅ Do** make sure your test breaks if you drop the thing supposed to make it pass  \nEg.: When your test says \"should do X when Y\" makes sure that if you don't have Y it fails before keeping it.\n\n**👎 Avoid** writing tests with entities specifying hardcoded values on unused fields\n\nExample of test content\n\n```ts\nconst user: User = {\n  name: 'Paul', // unused\n  birthday: '2010-02-03',\n};\nconst age = computeAge(user);\n//...\n```\n\n**👍 Prefer** leveraging `@fast-check/vitest`, if installed\n\n```ts\nimport { describe } from 'vitest';\nimport { it, fc } from '@fast-check/vitest';\n\ndescribe('computeAge', () => {\n  it('should compute a positive age', ({ g }) => {\n    // Arrange\n    const user: User = {\n      name: g(fc.string), // unused\n      birthday: '2010-02-03',\n    };\n\n    // Act\n    const age = computeAge(user);\n\n    // Assert\n    expect(age).toBeGreaterThan(0);\n  });\n});\n```\n\n**👍 Prefer** leveraging `fast-check`, if installed but not `@fast-check/vitest`\n\n**👎 Avoid** writing tests depending on unstable values  \nEg.: in the example above `computeAge` depends on the current date  \nRemark: same for locales and plenty other platform dependent values\n\n**👍 Prefer** stubbing today using `vi.setSystemTime`\n\n**👍 Prefer** controlling today using `@fast-check/vitest`  \nWhy? Contrary to `vi.setSystemTime` alone you check the code against one new today at each run, but if it happens to fail one day you will be reported with the exact date causing the problem\n\n```ts\n// Arrange\nvi.setSystemTime(g(fc.date, { min: new Date('2010-02-04'), noInvalidDate: true }));\nconst user: User = {\n  name: g(fc.string), // unused\n  birthday: '2010-02-03',\n};\n```\n\n**👎 Avoid** writing tests depending on random values or entities\n\n**👍 Prefer** controlling randomly generated values by relying on `@fast-check/vitest` if installed, or `fast-check` otherwise\n\n**✅ Do** use property based tests for any test with a notion of always or never  \nEg.: name being \"should always do x when y\" or \"should never do x when y\"  \nRemark: consider these tests as advanced and put them after the documentation tests and not with them\n\n**👍 Prefer** using property based testing for edge case detection instead of writing all cases one by one\n\n**❌ Don't** try to test 100% of the algorithm cases using property-based testing\nWhy? Property-based testing and example-based testing are complementary. Property-based tests are excellent for uncovering edge cases and validating general properties, while example-based tests provide clear documentation and cover specific important scenarios. Use both approaches together for comprehensive test coverage.\n\n```ts\n// for all a, b, c strings\n// b is a substring of a + b + c\nit.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  // Arrange\n  const text = a + b + c;\n  const pattern = b;\n\n  // Act\n  const result = isSubstring(text, pattern);\n\n  // Assert\n  expect(result).toBe(true);\n});\n```\n\n**✅ Do** extract complex logic from components into dedicated and testable functions\n\n**❌ Don't** test trivial component logic that has zero complexity\n\n**👍 Prefer** testing the DOM structure and user interactions when using testing-library\n\n**👍 Prefer** testing the visual display and user interactions when using browser testing\n\n**👍 Prefer** querying by accessible attributes and user-visible text by relying on `getByRole`, `getByLabelText`, `getByText` over `getByTestId` whenever possible for testing-library and browser testing\n\n**✅ Do** ensure non visual regression of Design System components and more generally visual components by leveraging screenshot tests in browser when available  \n**✅ Do** fallback to snapshot tests capturing the DOM structure if screenshot tests cannot be ran\n\n## Guidelines for properties\n\nAll this section considers that we are in the context of property based tests!\n\n**⚠️ Version compatibility:** Starting with fast-check v5, use `fc.property` for both synchronous and asynchronous predicates. With fast-check v4, use `fc.property` for synchronous predicates and `fc.asyncProperty` for asynchronous predicates.\n\n**✅ Do** always await `fc.assert(...)` when using `fast-check` directly, in both v4 and v5+, even when the predicate is synchronous. Make the surrounding test callback `async` so property failures are reported by the test runner.\n\n**⚠️ Important:** When using `g` from `@fast-check/vitest`, pass the arbitrary **function** (e.g., `fc.string`, `fc.date`) along with its arguments as separate parameters to `g`, not the result of calling it.  \nCorrect: `g(fc.string)`, `g(fc.date, { min: new Date('2010-01-01') })`  \nIncorrect: `g(fc.string())`, `g(fc.date({ min: new Date('2010-01-01') }))`\n\n**❌ Don't** generate inputs directly  \nThe risk being that you may end up rewriting the code being tested in the test\n\n**✅ Do** construct values to build some inputs where you know the expected outcome\n\n**❌ Don't** expect the returned value in details, in many cases you won't have enough details to be able to assert the full value\n\n**✅ Do** expect some aspects and characteristics of the returned value\n\n**❌ NEVER** specify any `maxLength` on an arbitrary if it is a not a requirement of the algorithm  \n**👍 Prefer** specifying a `size: '-1'` if you feel that the algorithm will take very long on large inputs (by default fast-check generates up to 10 items, so only use `size` when clearly required)  \nEg.: No `fc.string({maxLength: 5})` or `fc.array(arb, {maxLength: 8})` except being a string requirement\n\n**❌ NEVER** specify any constraint on an arbitrary if it is not a requirement of the arbitrary, use defaults as much as possible  \nEg.: if the algorithm should accept any integer just ask an integer without specifying any min and max\n\n**👎 Avoid** overusing `.filter` and `fc.pre`  \nWhy? They slow down the generation of values by dropping some generated ones\n\n**👍 Prefer** using options provided by arbitraries to directly generate valid values  \nEg.: use `fc.string({ minLength: 2 })` instead of `fc.string().filter(s => s.length >= 2)`  \nEg.: use `fc.integer({ min: 1 })` instead of `fc.integer().filter(n => n >= 1)`, or use `fc.nat()` instead of `fc.integer().filter(n => n >= 0)`\n\n**👍 Prefer** using `map` over `filter` when a `map` trick can avoid filtering  \nEg.: use `fc.nat().map(n => n * 2)` for even numbers  \nEg.: use `fc.tuple(fc.string(), fc.string()).map(([start, end]) => start + 'A' + end)` for strings always having an 'A' character\n\n**👍 Prefer** bigint type over number type for integer computations used within predicates when there is a risk of overflow (eg.: when running pow, multiply.. on generated values)\n\nSome classical properties:\n\n1. Characteristics independent of the inputs. _Eg.: for any floating point number d, Math.floor(d) is an integer. for any integer n, Math.abs(n) ≥ 0_\n2. Characteristics derived from the inputs. _Eg.: for any a and b integers, the average of a and b is between a and b. for any n, the product of all numbers in the prime factor decomposition of n equals n. for any array of data, sorted(data) and data contains the same elements. for any n1, n2 integers such that n1 != n2, romanString(n1) != romanString(n2). for any floating point number d, Math.floor(d) is an integer such as d-1 ≤ Math.floor(d) ≤ d_\n3. Restricted set of inputs with useful characteristics. _Eg.: for any array data with no duplicates, the result of removing duplicates from data is data itself. for any a, b and c strings, the concatenation of a, b and c always contains b. for any prime number p, its decomposition into prime factors is itself_\n4. Characteristics on combination of functions. _Eg.: zipping then unzipping a file should result in the original file. lcm(a,b) times gcd(a,b) must be equal to a times b_\n5. Comparison with a simpler implementation. _Eg.: c is contained inside sorted array data for binary search is equivalent to c is contained inside data for linear search_\n\n## Guidelines for race conditions\n\n**✅ Do** write tests checking for race conditions and playing with resolution order — _automatically handled by `fast-check`_ — when an algorithm accepts asynchronous functions as input\n\n**✅ Do** leverage `fast-check` and its `fc.scheduler()` arbitrary to test asynchronous code depending on asynchronous functions\n\nTurn:\n\n```ts\nit('should resolve in call order', async () => {\n  // Arrange\n  const seenAnswers = [];\n  const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n  // Act\n  const queued = queue(call);\n  await Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]);\n\n  // Assert\n  expect(seenAnswers).toEqual([1, 2]);\n});\n```\n\nInto (fast-check v5+; use `fc.asyncProperty` instead of `fc.property` in v4):\n\n```ts\nit('should resolve in call order', async () => {\n  await fc.assert(\n    fc.property(fc.scheduler(), async (s) => {\n      // Arrange\n      const seenAnswers = [];\n      const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n      // Act\n      const queued = queue(s.scheduleFunction(call));\n      await s.waitFor(\n        Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]),\n      );\n\n      // Assert\n      expect(seenAnswers).toEqual([1, 2]);\n    }),\n  );\n});\n```\n\n## Recommendation for faker users\n\nIf using `faker` to fake data, we recommend wiring any fake data generation within `fast-check` by leveraging this code snippet:\n\n```ts\n// Source: https://fast-check.dev/blog/2024/07/18/integrating-faker-with-fast-check/\nimport { Faker, Randomizer, base } from '@faker-js/faker';\nimport * as fc from 'fast-check';\n\nclass FakerBuilder<TValue> extends fc.Arbitrary<TValue> {\n  constructor(private readonly generator: (faker: Faker) => TValue) {\n    super();\n  }\n  generate(mrng: fc.Random, biasFactor: number | undefined): fc.Value<TValue> {\n    const randomizer: Randomizer = {\n      next: (): number => (mrng.nextInt(0, 0x3ffffff) * 2 ** 27 + mrng.nextInt(0, 0x7ffffff)) / 2 ** 53,\n      seed: () => {}, // no-op, no support for updates of the seed, could even throw\n    };\n    const customFaker = new Faker({ locale: base, randomizer });\n    return new fc.Value(this.generator(customFaker), undefined);\n  }\n  canShrinkWithoutContext(value: unknown): value is TValue {\n    return false;\n  }\n  shrink(value: TValue, context: unknown): fc.Stream<fc.Value<TValue>> {\n    return fc.Stream.nil();\n  }\n}\n\nfunction fakerToArb<TValue>(generator: (faker: Faker) => TValue): fc.Arbitrary<TValue> {\n  return new FakerBuilder(generator);\n}\n```\n\nExample of usage\n\n```ts\nawait fc.assert(\n  fc.property(\n    fakerToArb((faker) => faker.person.firstName),\n    fakerToArb((faker) => faker.person.lastName),\n    (firstName, lastName) => {\n      // code\n    },\n  ),\n);\n```\n\n## Equivalence `fast-check` and `@fast-check/vitest`\n\nExample 1.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit('...', ({ g }) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(fc.gen(), (g) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 2.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, (...values) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 3. For asynchronous predicates, use `fc.property` in fast-check v5+ (as shown below) and `fc.asyncProperty` in v4. Always await `fc.assert`, just as in the synchronous examples above.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', async (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, async (...values) => {\n      //...\n    }),\n  );\n});\n```\n","frontmatter":{"name":"javascript-testing-expert","description":"Expert-level JavaScript testing skill focused on writing high-quality tests that find bugs, serve as documentation, and prevent regressions. Advocates for property-based testing with fast-check and protects against indeterministic code in tests. Does not cover black-box e2e testing."},"isInternal":false,"tokens":4129,"sizeBytes":16728},{"name":"index.md","path":"website/docs/core-blocks/plugins/index.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/website/docs/core-blocks/plugins/index.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\nsidebar_position: 4\nslug: /core-blocks/plugins/\ndescription: Extend the default execution flow provided by runners to meet your needs.\n---\n\n# Plugins\n\nPlugins provide a way to extend and refine the runtime and execution behavior of your properties. In the same way building custom arbitraries gives you the flexibility to tweak generation flows, plugins give you ways to customize how your properties run.\n\nPlugins are designed to support things such as:\n\n- Executing something before the predicate\n- Stopping a predicate running for too long\n- Capturing key insights about the execution flows including timings for observability\n\n## Using plugins\n\nPlugins can be passed as part of the customizations accepted by the `fc.assert` runner.\n\n```ts\nawait fc.assert(fc.property(...arbs, predicate), {\n  plugins: [pluginA(...paramsForPluginA), pluginB(...paramsForPluginB)],\n});\n```\n\n## Installing plugins globally\n\nPlugins needed by all your properties can be installed once, typically in a [setup file](/docs/configuration/global-settings/#integration-with-test-frameworks), with `installGlobalPlugin`.\n\n```ts\nfc.installGlobalPlugin(pluginA());\n```\n\nInstalled plugins run before the ones passed to the runner, so the snippet above followed by `fc.assert(myProp, { plugins: [pluginB()] })` is equivalent to `plugins: [pluginA(), pluginB()]`.\n\n## Combining plugins\n\nPlugins have been designed to be combined together. When multiple plugins get defined for the same assertion, they execute in declaration order. The first plugin runs first and wraps the execution of the second one until we reach the main operation. Plugins can wrap various stages of the flow, including the execution of the predicate function.\n\nLet's illustrate how plugins get combined on a property checking a search endpoint. In this example, the database is brought back to a clean state before each run:\n\n```ts\nawait fc.assert(\n  fc.property(fc.string(), async (query) => {\n    const results = await searchService.search(query);\n    // ...assertions on the results...\n  }),\n  {\n    plugins: [\n      timeout(10_000),\n      beforeEach(async () => {\n        await database.reset(); // bring back a clean state, possibly slow\n      }),\n      timeout(5_000),\n    ],\n  },\n);\n```\n\nThe plugin setup above makes use of two instances of the `timeout` plugin. The first instance is responsible for making sure that the time taken by the `beforeEach` cleanup plus the one taken by the predicate never exceeds 10 seconds. The second one only wraps the predicate and makes sure that it won't take more than 5 seconds.\n\nThis short example clearly highlights why the declaration order of plugins is crucial. Two different orders may result in totally different expectations. Correctly ordering them will make you capable of finely configuring your flows to fit your needs.\n\n## The plugins\n\nWe come up with a set of plugins to extend the library using built-in plugins. The following pages provide extended details and deep dive into each of them.\n\n```mdx-code-block\nimport DocCardList from '@theme/DocCardList';\n\n<DocCardList />\n```\n","frontmatter":{"sidebar_position":4,"slug":"/core-blocks/plugins/","description":"Extend the default execution flow provided by runners to meet your needs."},"isInternal":false,"tokens":641,"sizeBytes":3087},{"name":"life-cycle.md","path":"website/docs/core-blocks/plugins/life-cycle.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/website/docs/core-blocks/plugins/life-cycle.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\nslug: /core-blocks/plugins/life-cycle/\n---\n\n# Life-cycle\n\nLife-cycle plugins provide hooks to prepare or clean up things for your predicates. They wrap every execution of the predicate including the ones linked to shrinking.\n\n## `beforeEach`\n\nThe `beforeEach` plugin lets you run code right before the execution of your predicate.\n\nIt expects to receive a function returning either nothing or a teardown function, in a synchronous or asynchronous fashion. Any other returned value may lead to unexpected behavior and is subject to change between versions.\n\nWhen a teardown function gets returned, it will be used as a clean-up function running right after the execution of the predicate, no matter its status.\n\nSimple example involving two synchronous `beforeEach` without any teardown function being declared:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      // beforeEach hook #1\n    }),\n    beforeEach(() => {\n      // beforeEach hook #2\n    }),\n  ];\n}\n```\n\nExample featuring all the possible variants with or without teardown, synchronous or asynchronous:\n\n```ts\n{\n  plugins: [\n    // synchronous beforeEach\n    beforeEach(() => {\n      // ...\n    }),\n    // synchronous beforeEach with synchronous teardown\n    beforeEach(() => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // synchronous beforeEach with asynchronous teardown\n    beforeEach(() => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach\n    beforeEach(async () => {\n      // ...\n    }),\n    // asynchronous beforeEach with synchronous teardown\n    beforeEach(async () => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach with asynchronous teardown\n    beforeEach(async () => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n  ];\n}\n```\n\nAll these variants can be used together. They have the same ordering priorities.\n\nResources: [API reference](/docs/api/functions/beforeEach).\n\n## `afterEach`\n\nThe `afterEach` plugin is the mirror of `beforeEach`. It lets you run code right after the execution of your predicate.\n\nSimilarly to `beforeEach`, it expects to receive a function returning either `void` or `Promise<void>`, but unlike `beforeEach` it cannot return a teardown function. Any other returned value may lead to unexpected behavior.\n\nContrary to `beforeEach`, `afterEach` will always be executed no matter the execution status of other hooks. As such, if one `beforeEach` or one `afterEach` rejects, other `afterEach` will still be executed.\n\nResources: [API reference](/docs/api/functions/afterEach).\n\n## Execution flow\n\nLife-cycle plugins run in the same order as they got declared for before tasks and in reverse order for after tasks. As such, the following ordering of plugins:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n    afterEach(() => {\n      console.log('afterEach #3');\n    }),\n    afterEach(() => {\n      console.log('afterEach #4');\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #5');\n      return () => {\n        console.log('teardown for beforeEach #5');\n      };\n    }),\n  ];\n}\n```\n\nWould result, for each run, into:\n\n```txt\nbeforeEach #1\nbeforeEach #2\nbeforeEach #5\npredicate\nteardown for beforeEach #5\nafterEach #4\nafterEach #3\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n\nThey run in an exclusive fashion. As such, a `beforeEach`, a teardown or an `afterEach` will wait for the currently running one to end before starting. Similarly, they don't run while the predicate is under way. They wait for it to come back with an execution status.\n\n:::warning[Predicate may run longer]\nWhile they are waiting for the predicate to come back with a status, note that whenever the predicate's execution gets stopped or interrupted, due to a timeout for example, there is no certainty that the code of the predicate has really been stopped. In Node, and more generally in JavaScript, there is no way to stop a running script: such plugins will mostly resume before the script ends but in many cases the script will keep running in background (as the plugin can't stop it).\n:::\n\nLike any built-in plugin, life-cycle plugins compose with the plugins declared next to them. As such, in the hypothesis of a plugin named `retryOnFailure(count)`, declaring plugins as follows:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    retryOnFailure(2),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n  ];\n}\n```\n\nMay result in the following logs at execution time:\n\n```txt\nbeforeEach #1 <-- runs once, it wraps all the attempts\nbeforeEach #2 <-- the first attempt\npredicate     <-- considering it fails at first attempt...\nteardown for beforeEach #2\nbeforeEach #2 <-- ...`retryOnFailure` launches a second attempt\npredicate\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n","frontmatter":{"slug":"/core-blocks/plugins/life-cycle/"},"isInternal":false,"tokens":1168,"sizeBytes":5340},{"name":"time-limits.md","path":"website/docs/core-blocks/plugins/time-limits.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/website/docs/core-blocks/plugins/time-limits.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\nslug: /core-blocks/plugins/time-limits/\n---\n\n# Time limits\n\nTime-limit plugins bound the time spent assessing your properties. They can come into play at various levels, from an isolated execution of a predicate to the full run of the assertion.\n\nThey make the runner stop its ongoing task when the limit gets reached. As such, they cannot really stop the code they wrap but ignore its results.\n\n## `timeout`\n\nThe `timeout` plugin marks the current execution of your predicate as failed if it did not complete within the requested delay expressed in milliseconds.\n\n```ts\n{\n  plugins: [\n    timeout(1000), // fail any execution of the predicate taking more than 1 second\n  ];\n}\n```\n\nThe countdown restarts for every execution of the predicate, shrinking phase included. A timed-out execution gets reported like any other failure, it's just a failure.\n\nResources: [API reference](/docs/api/functions/timeout).\n\n## `interruptAfterTimeLimit`\n\nThe `interruptAfterTimeLimit` plugin interrupts all runs once the requested delay expires. Past this delay, no new execution of the predicate will be started and any execution still running at that time will be interrupted.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000), // interrupt the execution of the property after 1 second\n  ];\n}\n```\n\nThe countdown starts when the runner starts executing the property.\n\nAn interrupted property is not necessarily considered to be a failure. By default, it gets marked as successful as long as at least one execution succeeded before the interruption and no failure got reported. To change that default and report interrupted properties as failures, one can set `failOnInterrupt: true` on the plugin.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000, { failOnInterrupt: true }), // mark an interrupted property as a failed one\n  ];\n}\n```\n\nResources: [API reference](/docs/api/functions/interruptAfterTimeLimit).\n\n## Limitations\n\nBoth plugins share the same limitations.\n\n### Synchronous code can't be cut\n\nThere is no way to pause or kill a running synchronous script in JavaScript. A synchronous predicate will always run to its end before any of these plugins get the flow back.\n\nAs such, `timeout` has no effect on purely synchronous predicates and `interruptAfterTimeLimit` can only prevent new executions from starting once the limit gets reached.\n\n### Asynchronous code can't be canceled\n\nWhenever the limit gets reached during an asynchronous execution, the plugins give control back to the runner without waiting for the predicate. But the underlying execution keeps running in the background and its outcome gets ignored.\n\nPlugins declared before the time-limit one may thus run while the predicate is still under way.\n\n### Stopping the code\n\nIf you need the code under test to be really stopped, have a look at [`@fast-check/worker`](https://www.npmx.dev/package/@fast-check/worker). It runs predicates in dedicated worker threads that can be terminated, synchronous ones included.\n","frontmatter":{"slug":"/core-blocks/plugins/time-limits/"},"isInternal":false,"tokens":614,"sizeBytes":2990},{"name":"values.md","path":"website/docs/core-blocks/plugins/values.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/website/docs/core-blocks/plugins/values.md","title":"Plugins Skill","category":"anthropic-skill","format":"markdown","content":"---\nslug: /core-blocks/plugins/values/\n---\n\n# Values\n\nValue plugins customize which values get forwarded to your predicates. Bias plugins customize how generation targets values, while equal-values plugins avoid executing your predicates twice on the same value.\n\nEqual-values plugins keep track of the values already covered during the run and replay the outcome of the first execution whenever a value gets generated again. Values are compared based on their stringified representation.\n\n## `unbiased`\n\nThe `unbiased` plugin generates the values feeding your predicates without any bias.\n\n```ts\n{\n  plugins: [\n    unbiased(), // draw all values from the full range of the arbitraries\n  ];\n}\n```\n\nWithout this plugin, generation is biased by default. Compared with a uniform distribution, smaller or more extreme values are more likely to be generated, helping uncover common issues earlier. For example, with `fc.integer()`, small values such as `1` and `2` are more likely to be generated than `171414468`.\n\nWith this plugin enabled, every run draws from the full range of the arbitraries with no special treatment. For `fc.integer()`, `171414468` is then just as likely to be generated as `1` or `2`.\n\nResources: [API reference](/docs/api/functions/unbiased).\n\n## `ignoreEqualValues`\n\nThe `ignoreEqualValues` plugin discards runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    ignoreEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nDiscarded runs still count as runs: a run replaying a past success stays a success.\n\nResources: [API reference](/docs/api/functions/ignoreEqualValues).\n\n## `skipEqualValues`\n\nThe `skipEqualValues` plugin skips runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    skipEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nContrary to `ignoreEqualValues`, a run replaying a past success gets marked as skipped instead of successful: passed the maximal number of allowed skips the run will be marked as failed. It gives stronger guarantees on the number of distinct values covered by the run at the price of potentially failing on arbitraries unable to produce enough distinct values.\n\nResources: [API reference](/docs/api/functions/skipEqualValues).\n","frontmatter":{"slug":"/core-blocks/plugins/values/"},"isInternal":false,"tokens":478,"sizeBytes":2254},{"name":"README.md","path":"packages/ava/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/ava/README.md","title":"ava Documentation","category":"plugin-manifest","format":"markdown","content":"# `@fast-check/ava`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into AVA.\n`@fast-check/ava` simplifies the integration of `fast-check` into AVA testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://badge.fury.io/js/@fast-check%2Fava.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fava\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/ava/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fava.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/ava`:\n\n```bash\nnpm install --save-dev @fast-check/ava\n```\n\nIn order to work properly, `@fast-check/ava` requires `ava` to be installed.\n\n## Example\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntestProp('should detect the substring', [fc.string(), fc.string(), fc.string()], (t, a, b, c) => {\n  t.true((a + b + c).includes(b));\n});\n```\n\nThe property is passed [AVA's `t` argument](https://github.com/avajs/ava/blob/main/docs/02-execution-context.md#execution-context-t-argument) as its first parameter, and the value of each arbitrary for the current test case for the rest of the parameters.\n\n`@fast-check/ava` supports all of [AVA's assertions](https://github.com/avajs/ava/blob/main/docs/03-assertions.md#assertions) and like AVA, it supports synchronous and asynchronous functions, including promises, observables, and callbacks. See [AVA's documentation](https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#declaring-test) for more information.\n\n⚠️ **WARNING:** When relying on `@fast-check/ava`, returning `true` or `false` in your predicates is not taken into account. The library wants assertions or plans to be defined as `ava` itself does. Nonetheless you can still use primitives such as `fc.pre` to cut runs at the middle if some invariants are unmeet: the started plan (if any) will just be ignored.\n\n## Advanced\n\n### `fast-check` Parameters\n\n`testProp` accepts an optional `fc.Parameters` for forwarding custom parameters to `fast-check` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should detect the substring',\n  [fc.string(), fc.string(), fc.string()],\n  (t, a, b, c) => {\n    t.true((a + b + c).includes(b));\n  },\n  { numRuns: 10 }, // Example of parameters\n);\n```\n\n### AVA Modifiers\n\n`@fast-check/ava` also comes with [`.only`], [`.serial`] [`.skip`], and [`.failing`] modifiers from AVA.\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should replay the test for the seed 4242',\n  [fc.nat(), fc.nat()],\n  (t, a, b) => {\n    t.is(a + b, b + a);\n  },\n  { seed: 4242 },\n);\n\ntestProp.skip('should be skipped', [fc.string()], (t, text) => {\n  t.is([...text].length, text.length);\n});\n```\n\n[`.only`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-specific-tests\n[`.serial`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-tests-serially\n[`.skip`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#skipping-tests\n[`.failing`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#failing-tests\n\n### AVA `before`/`after` Hooks\n\n`@fast-check/ava` exposes AVA's `before`/`after` [hooks]:\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp.before((t) => {\n  connectToDatabase();\n});\n\ntestProp();\n// ... omitted for brevity\n\ntestProp.after((t) => {\n  closeDatabaseConnection();\n});\n```\n\n[hooks]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#before--after-hooks\n\n### AVA Execution Context\n\n`@fast-check/ava` mirror's AVA's procedure for customizing the test [execution context]:\n\n```typescript\nimport { fc, testProp as anyTestProp, PropertyTestInterface } from '@fast-check/ava';\n\ntype TestContext = {\n  state: string;\n};\n\nconst testProp = anyTestProp as PropertyTestInterface<TestContext>;\n\ntestProp('should reach terminal state', [fc.string()], (t, received) => {\n  // here t is typed as ExecutionContext<TestContext>\n  console.log(t.context.state); // logs 'uninitialized'\n  // ... omitted for brevity\n});\n```\n\n[execution context]: https://github.com/avajs/ava/blob/main/docs/02-execution-context.md\n\n## Minimal requirements\n\n| @fast-check/ava | AVA                | fast-check | node                   |\n| --------------- | ------------------ | ---------- | ---------------------- |\n| **3.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥20.19.0<sup>(1)</sup> |\n| **2.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥12.22.0<sup>(2)</sup> |\n| **1.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3         | ≥12.22.0<sup>(2)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n2. As for ava 4.\n\n</details>\n","isInternal":false,"tokens":1421,"sizeBytes":5029},{"name":"README.md","path":"packages/fast-check/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/fast-check/README.md","title":"fast-check Documentation","category":"plugin-manifest","format":"markdown","content":"<h1 align=\"center\">\n  <img align=\"center\" src=\"https://fast-check.dev/assets/images/logo.png\" alt=\"fast-check logo\" />\n</h1>\n\n<p align=\"center\">\nProperty based testing framework for JavaScript/TypeScript\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/actions?query=branch%3Amain+workflow%3A%22Build+Status%22\"><img src=\"https://github.com/dubzzz/fast-check/actions/workflows/build-status.yml/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://badge.fury.io/js/fast-check.svg\" alt=\"npm version\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://img.shields.io/npm/dm/fast-check\" alt=\"monthly downloads\" /></a>\n  <a href=\"https://fast-check.dev/\"><img src=\"https://img.shields.io/badge/-Documentation-%23282ea9.svg\" title=\"Documentation\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://app.codecov.io/gh/dubzzz/fast-check/branch/main\"><img src=\"https://codecov.io/gh/dubzzz/fast-check/branch/main/graph/badge.svg\" alt=\"Coverage Status (unit tests)\" /></a>\n  <a href=\"https://packagequality.com/#?package=fast-check\"><img src=\"https://packagequality.com/shield/fast-check.svg\" alt=\"Package quality\" /></a>\n  <a href=\"https://securityscorecards.dev/viewer/?platform=github.com&org=dubzzz&repo=fast-check\"><img src=\"https://api.securityscorecards.dev/projects/github.com/dubzzz/fast-check/badge\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"https://bestpractices.coreinfrastructure.org/projects/7450\"><img src=\"https://bestpractices.coreinfrastructure.org/projects/7450/badge\" alt=\"OpenSSF Best Practices\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/labels/good%20first%20issue\"><img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\" alt=\"PRs Welcome\" /></a>\n  <a href=\"https://github.com/dubzzz/fast-check/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/fast-check.svg\" alt=\"License\" /></a>\n</p>\n\n## Getting started\n\nHands-on tutorial and definition of Property Based Testing: [🏁 see tutorial](https://fast-check.dev/docs/tutorials/quick-start/). Or directly try it online on our pre-configured [CodeSandbox](https://codesandbox.io/s/github/dubzzz/fast-check/tree/main/examples?previewwindow=tests).\n\nProperty based testing frameworks check the truthfulness of properties. A property is a statement like: _for all (x, y, ...) such that precondition(x, y, ...) holds predicate(x, y, ...) is true_.\n\nInstall the module with: `pnpm add -D fast-check` or `yarn add fast-check --dev` or `npm install fast-check --save-dev`\n\nExample of integration in [mocha](http://mochajs.org/):\n\n```js\nimport * as fc from 'fast-check';\n\n// Code under test\nconst contains = (text, pattern) => text.indexOf(pattern) >= 0;\n\n// Properties\ndescribe('properties', () => {\n  // string text always contains itself\n  it('should always contain itself', async () => {\n    await fc.assert(fc.property(fc.string(), (text) => contains(text, text)));\n  });\n  // string a + b + c always contains b, whatever the values of a, b and c\n  it('should always contain its substrings', async () => {\n    await fc.assert(\n      fc.property(fc.string(), fc.string(), fc.string(), (a, b, c) => {\n        // Alternatively: no return statement and direct usage of expect or assert\n        return contains(a + b + c, b);\n      }),\n    );\n  });\n});\n```\n\nIn case of failure, the test raises a red flag. Its output should help you to diagnose what went wrong in your implementation. Example with a failing implementation of contain:\n\n```\n1) should always contain its substrings\n    Error: Property failed after 1 tests (seed: 1527422598337, path: 0:0): [\"\",\"\",\"\"]\n    Shrunk 1 time(s)\n    Got error: Property failed by returning false\n\n    Hint: Enable verbose mode in order to have the list of all failing values encountered during the run\n```\n\nIntegration with other test frameworks: [ava](https://github.com/dubzzz/fast-check-examples/blob/main/test-ava/example.spec.js), [jasmine](https://github.com/dubzzz/fast-check-examples/blob/main/test-jasmine/example.spec.js), [jest](https://github.com/dubzzz/fast-check-examples/blob/main/test-jest/example.spec.js), [mocha](https://github.com/dubzzz/fast-check-examples/blob/main/test/longest%20common%20substr/test.js) and [tape](https://github.com/dubzzz/fast-check-examples/blob/main/test-tape/example.spec.js).\n\nMore examples: [simple examples](https://github.com/dubzzz/fast-check/tree/main/examples), [fuzzing](https://github.com/dubzzz/fuzz-rest-api) and [against various algorithms](https://github.com/dubzzz/fast-check-examples).\n\nUseful documentations:\n\n- [🏁 Introduction to Property Based & Hands On](https://fast-check.dev/docs/tutorials/quick-start/)\n- [🐣 Built-in arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/)\n- [🔧 Custom arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/)\n- [🏃‍♂️ Property based runners](https://fast-check.dev/docs/core-blocks/runners/)\n- [💥 Tips](https://fast-check.dev/docs/configuration/)\n- [🔌 API Reference](https://fast-check.dev/docs/api/)\n- [⭐ Awesome fast-check](https://fast-check.dev/docs/ecosystem/)\n\n## Why should I migrate to fast-check?\n\nfast-check has initially been designed in an attempt to cope with limitations I encountered while using other property based testing frameworks designed for JavaScript:\n\n- **Types:** strong and up-to-date types - _thanks to TypeScript_\n- **Extendable:** easy `map` method to derive existing arbitraries while keeping shrink \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#map)\\] - _some frameworks ask the user to provide both a->b and b->a mappings in order to keep a shrinker_\n- **Extendable:** kind of flatMap-operation called `chain` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#chain)\\] - _able to bind the output of an arbitrary as input of another one while keeping the shrink working_\n- **Extendable:** precondition checks with `fc.pre(...)` \\[[more](https://fast-check.dev/docs/core-blocks/properties/#example)\\] - _filtering invalid entries can be done directly inside the check function if needed_\n- **Extendable:** easily switch from fake data in tests to property based with `fc.gen()` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#gen)\\] - _generate random values within your predicates_\n- **Smart:** ability to shrink on `fc.oneof` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#oneof)\\] - _surprisingly some frameworks don't_\n- **Smart:** biased by default - _by default it generates both small and large values, making it easier to dig into counterexamples without having to tweak a size parameter manually_\n- **Debug:** verbose mode \\[[more](https://fast-check.dev/docs/configuration/custom-reports/#verbosity)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-increase-verbosity)\\] - _easier troubleshooting with verbose mode enabled_\n- **Debug:** replay directly on the minimal counterexample \\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-re-run)\\] - _no need to replay the whole sequence, you get directly the counterexample_\n- **Debug:** custom examples in addition of generated ones \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#run-against-custom-values)\\] - _no need to duplicate the code to play the property on custom examples_\n- **Debug:** logger per predicate run \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#context)\\] - _simplify your troubleshoot with fc.context and its logging feature_\n- **Unique:** model based approach \\[[more](https://fast-check.dev/docs/advanced/model-based-testing/)\\]\\[[article](https://medium.com/criteo-labs/detecting-the-unexpected-in-web-ui-fuzzing-1f3822c8a3a5)\\] - _use the power of property based testing to test UI, APIs or state machines_\n- **Unique:** detect race conditions in your code \\[[more](https://fast-check.dev/docs/advanced/race-conditions/)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/detect-race-conditions/)\\] - _shuffle the way your promises and async calls resolve using the power of property based testing to detect races_\n- **Unique:** simplify user definable corner cases \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#shrink-custom-values)\\] - _simplify bug resolution by asking fast-check if it can find an even simpler corner case_\n\nFor more details, refer to the documentation in the links above.\n\n### Trusted\n\nfast-check has been trusted for years by big projects like: [jest](https://github.com/jestjs/jest), [jasmine](https://github.com/jasmine/jasmine), [fp-ts](https://github.com/gcanti/fp-ts), [io-ts](https://github.com/gcanti/io-ts), [ramda](https://github.com/ramda/ramda), [js-yaml](https://github.com/nodeca/js-yaml), [query-string](https://github.com/sindresorhus/query-string)...\n\n### Powerful\n\nIt also proved useful in finding bugs among major open source projects such as [jest](https://github.com/jestjs/jest), [query-string](https://github.com/sindresorhus/query-string)... and [many others](https://fast-check.dev/docs/introduction/track-record/).\n\n## Compatibility\n\nHere are the minimal requirements to use fast-check properly without any polyfills:\n\n| fast-check | node                   | ECMAScript version | _TypeScript (optional)_ |\n| ---------- | ---------------------- | ------------------ | ----------------------- |\n| **5.x**    | ≥22.12.0               | ES2025             | ≥5.8                    |\n| **4.x**    | ≥12.17.0<sup>(1)</sup> | ES2020             | ≥5.0                    |\n| **3.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥4.1<sup>(3)</sup>      |\n| **2.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥3.2<sup>(4)</sup>      |\n| **1.x**    | ≥0.12<sup>(2)</sup>    | ES3                | ≥3.0<sup>(4)</sup>      |\n\n<details>\n<summary>More details...</summary>\n\n1. Even if version 12.x should support most of the ES2020 features that will be leveraged by the version 4, we recommend relying at least on version 14.x of Node as it supports all the targeted specification. In addition, we highly encourage switching to still supported LTS versions of Node and not sticking to unsupported versions for too long.\n2. Except for features that cannot be polyfilled - such as `bigint`-related ones - all the capabilities of fast-check should be usable given you use at least the minimal recommended version of node associated to your major of fast-check.\n3. Require either lib or target ≥ ES2020 or `@types/node` to be installed.\n4. Require either lib or target ≥ ES2015 or `@types/node` to be installed.\n\n</details>\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dubzzz\"><img src=\"https://avatars.githubusercontent.com/u/5300235?v=4?s=100\" width=\"100px;\" alt=\"Nicolas DUBIEN\"/><br /><sub><b>Nicolas DUBIEN</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Tests\">⚠️</a> <a href=\"#infra-dubzzz\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"#design-dubzzz\" title=\"Design\">🎨</a> <a href=\"#maintenance-dubzzz\" title=\"Maintenance\">🚧</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/hath995\"><img src=\"https://avatars.githubusercontent.com/u/381037?v=4?s=100\" width=\"100px;\" alt=\"Aaron Elligsen\"/><br /><sub><b>Aaron Elligsen</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/willheslam\"><img src=\"https://avatars.githubusercontent.com/u/5377213?v=4?s=100\" width=\"100px;\" alt=\"Will Heslam\"/><br /><sub><b>Will Heslam</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=willheslam\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/kazchimo\"><img src=\"https://avatars.githubusercontent.com/u/31263328?v=4?s=100\" width=\"100px;\" alt=\"kazchimo\"/><br /><sub><b>kazchimo</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brandon-leapyear\"><img src=\"https://avatars.githubusercontent.com/u/27799541?v=4?s=100\" width=\"100px;\" alt=\"Brandon Chinn\"/><br /><sub><b>Brandon Chinn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://safareli.github.io/resume/\"><img src=\"https://avatars.githubusercontent.com/u/1932383?v=4?s=100\" width=\"100px;\" alt=\"Irakli Safareli\"/><br /><sub><b>Irakli Safareli</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=safareli\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/TheSpyder\"><img src=\"https://avatars.githubusercontent.com/u/298292?v=4?s=100\" width=\"100px;\" alt=\"Andrew Herron\"/><br /><sub><b>Andrew Herron</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TheSpyder\" title=\"Documentation\">📖</a> <a href=\"#plugin-TheSpyder\" title=\"Plugin/utility libraries\">🔌</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/EricCrosson\"><img src=\"https://avatars.githubusercontent.com/u/1596818?v=4?s=100\" width=\"100px;\" alt=\"Eric Crosson\"/><br /><sub><b>Eric Crosson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/burrscurr\"><img src=\"https://avatars.githubusercontent.com/u/23213508?v=4?s=100\" width=\"100px;\" alt=\"burrscurr\"/><br /><sub><b>burrscurr</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=burrscurr\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.dijonkitchen.org/\"><img src=\"https://avatars.githubusercontent.com/u/11434205?v=4?s=100\" width=\"100px;\" alt=\"JC (Jonathan Chen)\"/><br /><sub><b>JC (Jonathan Chen)</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dijonkitchen\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fixate.it/\"><img src=\"https://avatars.githubusercontent.com/u/1510520?v=4?s=100\" width=\"100px;\" alt=\"Larry Botha\"/><br /><sub><b>Larry Botha</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://epa.ms/RomanGusev\"><img src=\"https://avatars.githubusercontent.com/u/5839225?v=4?s=100\" width=\"100px;\" alt=\"Roman Gusev\"/><br /><sub><b>Roman Gusev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=102\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://timwis.com/\"><img src=\"https://avatars.githubusercontent.com/u/761444?v=4?s=100\" width=\"100px;\" alt=\"Tim Wisniewski\"/><br /><sub><b>Tim Wisniewski</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=timwis\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://world.hey.com/brais\"><img src=\"https://avatars.githubusercontent.com/u/17855450?v=4?s=100\" width=\"100px;\" alt=\"Brais Piñeiro\"/><br /><sub><b>Brais Piñeiro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brds\"><img src=\"https://avatars.githubusercontent.com/u/118620?v=4?s=100\" width=\"100px;\" alt=\"Renaud-Pierre Bordes\"/><br /><sub><b>Renaud-Pierre Bordes</b></sub></a><br /><a href=\"#design-brds\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/fwip\"><img src=\"https://avatars.githubusercontent.com/u/190414?v=4?s=100\" width=\"100px;\" alt=\"Jemma Nelson\"/><br /><sub><b>Jemma Nelson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=fwip\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fullof.bs/\"><img src=\"https://avatars.githubusercontent.com/u/77482?v=4?s=100\" width=\"100px;\" alt=\"John Haugeland\"/><br /><sub><b>John Haugeland</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=StoneCypher\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/treydavis\"><img src=\"https://avatars.githubusercontent.com/u/1691239?v=4?s=100\" width=\"100px;\" alt=\"Trey Davis\"/><br /><sub><b>Trey Davis</b></sub></a><br /><a href=\"#design-treydavis\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://leonzalion.com/\"><img src=\"https://avatars.githubusercontent.com/u/36966635?v=4?s=100\" width=\"100px;\" alt=\"Leon Si\"/><br /><sub><b>Leon Si</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=leonzalion\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://spion.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/502412?v=4?s=100\" width=\"100px;\" alt=\"Gorgi Kosev\"/><br /><sub><b>Gorgi Kosev</b></sub></a><br /><a href=\"#infra-spion\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/mayconsacht\"><img src=\"https://avatars.githubusercontent.com/u/5214042?v=4?s=100\" width=\"100px;\" alt=\"mayconsacht\"/><br /><sub><b>mayconsacht</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=mayconsacht\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/paldepind\"><img src=\"https://avatars.githubusercontent.com/u/521604?v=4?s=100\" width=\"100px;\" alt=\"Simon Friis Vindum\"/><br /><sub><b>Simon Friis Vindum</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/gibson042\"><img src=\"https://avatars.githubusercontent.com/u/1199584?v=4?s=100\" width=\"100px;\" alt=\"Richard Gibson\"/><br /><sub><b>Richard Gibson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gibson042\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://alanharper.com.au/\"><img src=\"https://avatars.githubusercontent.com/u/475?v=4?s=100\" width=\"100px;\" alt=\"Alan Harper\"/><br /><sub><b>Alan Harper</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=aussiegeek\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Osman-Sodefa\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Osman-Sodefa\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/sommd\"><img src=\"https://avatars.githubusercontent.com/u/7817485?v=4?s=100\" width=\"100px;\" alt=\"David Sommerich\"/><br /><sub><b>David Sommerich</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/diegopedro94\"><img src=\"https://avatars.githubusercontent.com/u/7157796?v=4?s=100\" width=\"100px;\" alt=\"Diego Pedro\"/><br /><sub><b>Diego Pedro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/BoruiGu\"><img src=\"https://avatars.githubusercontent.com/u/8686167?v=4?s=100\" width=\"100px;\" alt=\"Borui Gu\"/><br /><sub><b>Borui Gu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=BoruiGu\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/eventualbuddha\"><img src=\"https://avatars.githubusercontent.com/u/1938?v=4?s=100\" width=\"100px;\" alt=\"Brian Donovan\"/><br /><sub><b>Brian Donovan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=eventualbuddha\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/volrk\"><img src=\"https://avatars.githubusercontent.com/u/32265974?v=4?s=100\" width=\"100px;\" alt=\"volrk\"/><br /><sub><b>volrk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tinydylan\"><img src=\"https://avatars.githubusercontent.com/u/41112113?v=4?s=100\" width=\"100px;\" alt=\"tinydylan\"/><br /><sub><b>tinydylan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jasikpark\"><img src=\"https://avatars.githubusercontent.com/u/10626596?v=4?s=100\" width=\"100px;\" alt=\"Caleb Jasik\"/><br /><sub><b>Caleb Jasik</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jasikpark\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rulai-hu\"><img src=\"https://avatars.githubusercontent.com/u/2570932?v=4?s=100\" width=\"100px;\" alt=\"Rulai Hu\"/><br /><sub><b>Rulai Hu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rulai-hu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/afonsojramos\"><img src=\"https://avatars.githubusercontent.com/u/19473034?v=4?s=100\" width=\"100px;\" alt=\"Afonso Jorge Ramos\"/><br /><sub><b>Afonso Jorge Ramos</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=afonsojramos\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tjenkinson.me/\"><img src=\"https://avatars.githubusercontent.com/u/3259993?v=4?s=100\" width=\"100px;\" alt=\"Tom Jenkinson\"/><br /><sub><b>Tom Jenkinson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tjenkinson\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/phormio\"><img src=\"https://avatars.githubusercontent.com/u/28146332?v=4?s=100\" width=\"100px;\" alt=\"phormio\"/><br /><sub><b>phormio</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=phormio\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://buildo.io/\"><img src=\"https://avatars.githubusercontent.com/u/2643520?v=4?s=100\" width=\"100px;\" alt=\"Giovanni Gonzaga\"/><br /><sub><b>Giovanni Gonzaga</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://caurea.org/\"><img src=\"https://avatars.githubusercontent.com/u/34538?v=4?s=100\" width=\"100px;\" alt=\"Tomas Carnecky\"/><br /><sub><b>Tomas Carnecky</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=wereHamster\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Djaler\"><img src=\"https://avatars.githubusercontent.com/u/7964583?v=4?s=100\" width=\"100px;\" alt=\"Kirill Romanov\"/><br /><sub><b>Kirill Romanov</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://giovannyg.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/5326411?v=4?s=100\" width=\"100px;\" alt=\"Giovanny González\"/><br /><sub><b>Giovanny González</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giovannyg\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/markkulube\"><img src=\"https://avatars.githubusercontent.com/u/34955942?v=4?s=100\" width=\"100px;\" alt=\"Mark Kulube\"/><br /><sub><b>Mark Kulube</b></sub></a><br /><a href=\"#infra-markkulube\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.undiscoveredfeatures.com/\"><img src=\"https://avatars.githubusercontent.com/u/354848?v=4?s=100\" width=\"100px;\" alt=\"Peter Hamilton\"/><br /><sub><b>Peter Hamilton</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hamiltop\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ChineduOzodi\"><img src=\"https://avatars.githubusercontent.com/u/11678369?v=4?s=100\" width=\"100px;\" alt=\"Chinedu Ozodi\"/><br /><sub><b>Chinedu Ozodi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ChineduOzodi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gunar\"><img src=\"https://avatars.githubusercontent.com/u/7684574?v=4?s=100\" width=\"100px;\" alt=\"Gunar Gessner\"/><br /><sub><b>Gunar Gessner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gunar\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CSBatchelor\"><img src=\"https://avatars.githubusercontent.com/u/18668440?v=4?s=100\" width=\"100px;\" alt=\"Christian Batchelor\"/><br /><sub><b>Christian Batchelor</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CSBatchelor\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tomeraberba.ch/\"><img src=\"https://avatars.githubusercontent.com/u/23299544?v=4?s=100\" width=\"100px;\" alt=\"Tomer Aberbach\"/><br /><sub><b>Tomer Aberbach</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/0xflotus\"><img src=\"https://avatars.githubusercontent.com/u/26602940?v=4?s=100\" width=\"100px;\" alt=\"0xflotus\"/><br /><sub><b>0xflotus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=0xflotus\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CodeLenny\"><img src=\"https://avatars.githubusercontent.com/u/9272847?v=4?s=100\" width=\"100px;\" alt=\"Ryan Leonard\"/><br /><sub><b>Ryan Leonard</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://blog.bitjson.com/\"><img src=\"https://avatars.githubusercontent.com/u/904007?v=4?s=100\" width=\"100px;\" alt=\"Jason Dreyzehner\"/><br /><sub><b>Jason Dreyzehner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://matinzd.dev/\"><img src=\"https://avatars.githubusercontent.com/u/24797481?v=4?s=100\" width=\"100px;\" alt=\"Matin Zadeh Dolatabad\"/><br /><sub><b>Matin Zadeh Dolatabad</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matinzd\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://goo.gl/IlWG8U\"><img src=\"https://avatars.githubusercontent.com/u/500?v=4?s=100\" width=\"100px;\" alt=\"Juan Julián Merelo Guervós\"/><br /><sub><b>Juan Julián Merelo Guervós</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=JJ\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/SimenB\"><img src=\"https://avatars.githubusercontent.com/u/1404810?v=4?s=100\" width=\"100px;\" alt=\"Simen Bekkhus\"/><br /><sub><b>Simen Bekkhus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=SimenB\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tskj\"><img src=\"https://avatars.githubusercontent.com/u/25415972?v=4?s=100\" width=\"100px;\" alt=\"Tarjei Skjærset\"/><br /><sub><b>Tarjei Skjærset</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tskj\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://denisgorbachev.com/\"><img src=\"https://avatars.githubusercontent.com/u/829578?v=4?s=100\" width=\"100px;\" alt=\"Denis Gorbachev\"/><br /><sub><b>Denis Gorbachev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=DenisGorbachev\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://senocular.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/3536716?v=4?s=100\" width=\"100px;\" alt=\"Trevor McCauley\"/><br /><sub><b>Trevor McCauley</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=senocular\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://grantkiely.com/\"><img src=\"https://avatars.githubusercontent.com/u/1948935?v=4?s=100\" width=\"100px;\" alt=\"Grant Kiely\"/><br /><sub><b>Grant Kiely</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gkiely\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/vecerek\"><img src=\"https://avatars.githubusercontent.com/u/5737996?v=4?s=100\" width=\"100px;\" alt=\"Attila Večerek\"/><br /><sub><b>Attila Večerek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.zachbjornson.com/\"><img src=\"https://avatars.githubusercontent.com/u/469365?v=4?s=100\" width=\"100px;\" alt=\"Zach Bjornson\"/><br /><sub><b>Zach Bjornson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/bennettp123\"><img src=\"https://avatars.githubusercontent.com/u/1610227?v=4?s=100\" width=\"100px;\" alt=\"Bennett Perkins\"/><br /><sub><b>Bennett Perkins</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bennettp123\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nielk\"><img src=\"https://avatars.githubusercontent.com/u/4980521?v=4?s=100\" width=\"100px;\" alt=\"Alexandre Oger\"/><br /><sub><b>Alexandre Oger</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ej-shafran\"><img src=\"https://avatars.githubusercontent.com/u/116496520?v=4?s=100\" width=\"100px;\" alt=\"ej shafran\"/><br /><sub><b>ej shafran</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ej-shafran\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gruhn\"><img src=\"https://avatars.githubusercontent.com/u/26570572?v=4?s=100\" width=\"100px;\" alt=\"Niklas Gruhn\"/><br /><sub><b>Niklas Gruhn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gruhn\" title=\"Code\">💻</a> <a href=\"#question-gruhn\" title=\"Answering Questions\">💬</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://patrickroza.com/\"><img src=\"https://avatars.githubusercontent.com/u/42661?v=4?s=100\" width=\"100px;\" alt=\"Patrick Roza\"/><br /><sub><b>Patrick Roza</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=patroza\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/cindywu\"><img src=\"https://avatars.githubusercontent.com/u/1177031?v=4?s=100\" width=\"100px;\" alt=\"Cindy Wu\"/><br /><sub><b>Cindy Wu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=cindywu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nmay231\"><img src=\"https://avatars.githubusercontent.com/u/35386821?v=4?s=100\" width=\"100px;\" alt=\"Noah\"/><br /><sub><b>Noah</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nmay231\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jamesbvaughan\"><img src=\"https://avatars.githubusercontent.com/u/2906913?v=4?s=100\" width=\"100px;\" alt=\"James Vaughan\"/><br /><sub><b>James Vaughan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/AlexErrant\"><img src=\"https://avatars.githubusercontent.com/u/109672176?v=4?s=100\" width=\"100px;\" alt=\"Alex Errant\"/><br /><sub><b>Alex Errant</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=AlexErrant\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ahrjarrett.com/\"><img src=\"https://avatars.githubusercontent.com/u/15133992?v=4?s=100\" width=\"100px;\" alt=\"andrew jarrett\"/><br /><sub><b>andrew jarrett</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/matthyk\"><img src=\"https://avatars.githubusercontent.com/u/53833818?v=4?s=100\" width=\"100px;\" alt=\"Matthias Keckl\"/><br /><sub><b>Matthias Keckl</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matthyk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dmurvihill\"><img src=\"https://avatars.githubusercontent.com/u/1649120?v=4?s=100\" width=\"100px;\" alt=\"Dolan Murvihill\"/><br /><sub><b>Dolan Murvihill</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dmurvihill\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/emilianbold\"><img src=\"https://avatars.githubusercontent.com/u/991554?v=4?s=100\" width=\"100px;\" alt=\"Emi\"/><br /><sub><b>Emi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=emilianbold\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.russbiggs.com/\"><img src=\"https://avatars.githubusercontent.com/u/8487728?v=4?s=100\" width=\"100px;\" alt=\"Russ Biggs\"/><br /><sub><b>Russ Biggs</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=russbiggs\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/adamni21\"><img src=\"https://avatars.githubusercontent.com/u/85580454?v=4?s=100\" width=\"100px;\" alt=\"adamni21\"/><br /><sub><b>adamni21</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=adamni21\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/josephjunker\"><img src=\"https://avatars.githubusercontent.com/u/1519098?v=4?s=100\" width=\"100px;\" alt=\"Joseph Junker\"/><br /><sub><b>Joseph Junker</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=josephjunker\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rushelex\"><img src=\"https://avatars.githubusercontent.com/u/41122157?v=4?s=100\" width=\"100px;\" alt=\"Aleksey Shelementev\"/><br /><sub><b>Aleksey Shelementev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rushelex\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rugk\"><img src=\"https://avatars.githubusercontent.com/u/11966684?v=4?s=100\" width=\"100px;\" alt=\"rugk\"/><br /><sub><b>rugk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rugk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/makeeno\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=makeeno\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jneidel.com/\"><img src=\"https://avatars.githubusercontent.com/u/25589715?v=4?s=100\" width=\"100px;\" alt=\"Jonathan Neidel\"/><br /><sub><b>Jonathan Neidel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jneidel\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jkomyno.dev/\"><img src=\"https://avatars.githubusercontent.com/u/12381818?v=4?s=100\" width=\"100px;\" alt=\"Alberto Schiabel\"/><br /><sub><b>Alberto Schiabel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jkomyno\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/zek\"><img src=\"https://avatars.githubusercontent.com/u/3463291?v=4?s=100\" width=\"100px;\" alt=\"Zek\"/><br /><sub><b>Zek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Tests\">⚠️</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! [Become one of them](CONTRIBUTING.md)\n\n## Sponsors 💸\n\nMany individuals and companies offer their financial support to the project, a huge thanks to all of them too 💓\n\n<a href=\"https://github.com/sponsors/dubzzz\"><img align=\"center\" src=\"https://raw.githubusercontent.com/dubzzz/sponsors-svg/main/sponsorkit/sponsors.svg\" alt=\"all sponsors\" /></a>\n\nYou can also become one of them by contributing via [GitHub Sponsors](https://github.com/sponsors/dubzzz) or [OpenCollective](https://opencollective.com/fast-check/contribute).\n","isInternal":false,"tokens":13362,"sizeBytes":42944},{"name":"README.md","path":"packages/jest/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/jest/README.md","title":"jest Documentation","category":"plugin-manifest","format":"markdown","content":"# `@fast-check/jest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Jest.\n`@fast-check/jest` simplifies the integration of `fast-check` into Jest testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fjest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fjest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fjest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/jest`:\n\n```bash\nnpm install --save-dev @fast-check/jest\n```\n\nIn order to work properly, `@fast-check/jest` requires `jest` to be installed.\n\nWe also highly recommend users to launch their tests using the `--show-seed` option provided by Jest. It ensures Jest will always print the seed by itself (requires Jest ≥29.2.0).\n\n```sh\njest --show-seed\n```\n\n## Example\n\n```javascript\nimport { test, fc } from '@fast-check/jest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// Or the exact same test but based on named parameters\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nThe `it` and `test` functions returned by `@fast-check/jest` are just enriched versions of the ones coming from `jest` itself. They both come with `.prop`.\n\nPlease note that the properties accepted by `@fast-check/jest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances). In other words, the predicate passed as the last argument can be asynchronous.\n\n**Remark:** `it` and `test` have been introduced in 1.4.0. You have to refer to [Deprecated API](#deprecated-api) if you are using a version of `@fast-check/jest` <1.4.0.\n\n## Advanced\n\n### Support for variations of `test` and `it`\n\nIf you want to forward custom parameters to `fast-check`, `test.prop` and its variants accept an optional `fc.Parameters` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n`@fast-check/jest` also comes with support for `.only`, `.skip`, `.todo` and `.concurrent` from `jest`. It also accepts more complex ones such as `.concurrent.failing` or `.concurrent.only.failing`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/jest';\n\n// With custom `fc.Parameters`, here { seed: 4242 }\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\n// With .skip\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\n// With it version\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n### Experimental worker-based runner\n\n**The following feature is experimental!** When used it makes runners able to kill long running synchonous code. Meaning that it will make fast-check able to kill infinite loops blocking the main thread. So far, the feature does not fully support transformations performed via transform steps defined with jest.\n\nThe CommonJS approach would be:\n\n```js\nconst { init, fc } = require('@fast-check/jest/worker');\nconst { pathToFileURL } = require('node:url');\n\nconst { test, expect } = init(pathToFileURL(__filename));\n// can also be passed options such as isolationLevel: init(pathToFileURL(__filename), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\nThe ES Modules approach would be:\n\n```js\nimport { init, fc } from '@fast-check/jest/worker';\n\nconst { test, expect } = await init(new URL(import.meta.url));\n// can also be passed options such as isolationLevel: init(new URL(import.meta.url), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\n⚠️ Do not forget to add the `await` before `init` for the ES Module version!\n\n#### Extra setup for `@fast-check/worker` 0.6.0 and later\n\nSince `@fast-check/worker` is an ESM-only package, running it under Jest in CommonJS mode requires `babel-jest` to transpile it. Install the following dependencies:\n\n```bash\nnpm install --save-dev babel-jest @babel/core @babel/preset-env\n```\n\nThen add a `babel.config.cjs` at the root of your project:\n\n```js\nmodule.exports = {\n  presets: [['@babel/preset-env', { targets: { node: 'current' }, modules: 'commonjs' }]],\n};\n```\n\nAnd update your Jest configuration to use `babel-jest` while excluding `@fast-check/worker` from the ignore patterns:\n\n```js\nmodule.exports = {\n  transform: {\n    '^.+\\\\.[t|j]sx?$': 'babel-jest',\n  },\n  transformIgnorePatterns: ['/node_modules/(?!(?:@fast-check/worker)/)'],\n};\n```\n\nThis ensures `@fast-check/worker` gets transpiled to CommonJS by Babel instead of being skipped. Without it, Jest will fail to load the ESM-only package.\n\nFor ES Modules mode, no extra setup is needed — just make sure to run Jest with `--experimental-vm-modules`:\n\n```bash\nnode --experimental-vm-modules node_modules/jest/bin/jest.js\n```\n\n## Minimal requirements\n\n| @fast-check/jest | jest                                    | fast-check | node                                                                                  |\n| ---------------- | --------------------------------------- | ---------- | ------------------------------------------------------------------------------------- |\n| ^2.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n| ^1.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n\n- (1) any version of `jest` should be greater or equal than 26.5.0 if you are using `commonjs`\n- (2) in order to use `esm` build, you may need to enable experimental features of node, see [here](https://github.com/dubzzz/fast-check/blob/main/packages/test-jest-bundle-esm/package.json)\n- (3) &gt;=14.15.0 is the minimal requirements for `jest`, &gt;=12.17.0 is the one for `@fast-check/jest`\n- (4) timeout defined on jest might not be properly applied to fast-check for node 18 (until 18.17.0) and node 19, see [#4004](https://github.com/dubzzz/fast-check/pull/4004)\n","isInternal":false,"tokens":1812,"sizeBytes":6639},{"name":"README.md","path":"packages/packaged/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/packaged/README.md","title":"packaged Documentation","category":"plugin-manifest","format":"markdown","content":"# `@fast-check/packaged`\n\nUtility package removing any files that will not be part of the final bundle published to npm registry\n\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpackaged.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpackaged\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/packaged/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpackaged.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nWhen publishing packages to npm registry, it is quite easy to forget about some files. It also happens many times that we want somehow to check the packaged bundle in some of our tests but totally forget that some files have not been added to the bundle and so that the final user will actually never be able to run this code.\n\nThis package mostly try to prevent this issue. It can easily be used in monorepos to emulate the bundled package when used against other packages of the monorepo to make sure others do not depend on internals or non published stuff.\n\n## Easy to use\n\nRun the following command at the root of your package to drop any file that will not make it in the final bundle published to npm.\n\n```bash\n# With npm\nnpx -p @fast-check/packaged packaged\n# With pnpm\npnpm --package=@fast-check/packaged dlx packaged\n# With yarn\nyarn dlx -p @fast-check/packaged packaged\n```\n\n⚠️ You may want to try with `--dry-run` flag first to give it a try.\n\nIt also comes with some extra flags:\n\n- `--dry-run`: do not drop any file or directory from the file system and only print what would have been removed\n- `--keep <name>`: keep a root-level file or directory matching the exact name (not a glob pattern, can be specified multiple times, e.g. `--keep node_modules --keep src`)\n\n## Simple API\n\n```js\nimport { computePublishedFiles, removeNonPublishedFiles } from '@fast-check/packaged';\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at .\nconst publishedFilesRoot = await computePublishedFiles('.');\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at ./sub-directory\nconst publishedFilesSubDirectory = await computePublishedFiles('./sub-directory');\n\n// Run the deletion of unwanted files\nconst { kept, removed } = await removeNonPublishedFiles('.', { dryRun: false, keep: [] });\n// kept and removed are arrays of strings\n// they may contain files or directories\n```\n\n## Minimal requirements\n\n| @fast-check/packaged | node                   |\n| -------------------- | ---------------------- |\n| **0.6.x**            | ≥20.19.0<sup>(1)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n\n</details>\n","isInternal":false,"tokens":700,"sizeBytes":2898},{"name":"README.md","path":"packages/poisoning/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/poisoning/README.md","title":"poisoning Documentation","category":"plugin-manifest","format":"markdown","content":"# `@fast-check/poisoning`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nSet of utilities to ease detection and revert of poisoning\n\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpoisoning.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpoisoning\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/poisoning/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpoisoning.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nIn JavaScript, \"prototype poisoning\" is one of the most common source for CVEs or zero days. It allows attackers to change the behaviour of some defaults like `Array.prototype.map`, `Map`, `Set`... so that they behave differently and can be leveraged for evil stuffs. This package can be used in addition to `fast-check` in order to detect poisoning that may occur during your property based tests.\n\n## Easy to use\n\nThe package comes with:\n\n- `assertNoPoisoning`: assert that the defaults known when first importing the package in your code have not been changed\n- `restoreGlobals`: restore the defaults so that any change that could have been detected by `assertNoPoisoning` will be resolved\n\n## Minimal requirements\n\n- Node ≥20.19.0\n","isInternal":false,"tokens":347,"sizeBytes":1378},{"name":"README.md","path":"packages/vitest/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/vitest/README.md","title":"vitest Documentation","category":"plugin-manifest","format":"markdown","content":"# `@fast-check/vitest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Vitest.\n`@fast-check/vitest` simplifies the integration of `fast-check` into Vitest.\n\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fvitest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fvitest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fvitest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/vitest`:\n\n```bash\nnpm install --save-dev @fast-check/vitest\n```\n\nIn order to work properly, `@fast-check/vitest` requires `vitest` to be installed.\n\n## Examples\n\nThe library comes with two modes, both powered by fast-check:\n\n- One-time random mode – A lightweight approach that introduces controlled randomness into your tests while keeping runs reproducible.\n- Property-based testing mode – A full-fledged property-based testing approach leveraging the full capabilities of fast-check.\n\n### One-time random mode\n\nThis mode extends Vitest's default `test` and `it` functions, allowing you to introduce controlled randomness into your tests while ensuring failures remain reproducible. This makes it easier to debug flaky tests and avoid irreproducible failures due to randomness.\n\nUnlike property-based testing, this mode does not run tests multiple times or attempt shrinking when failures occur. Instead, it provides a determistic way to introduce randomness when needed.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\nimport { expect } from 'vitest';\n\n// You can provide a fixed seed to force a replay by adding this line:\n// >>  fc.configureGlobal({ seed })\n// Eventually you can disable shrinking capabilities with:\n// >>  fc.configureGlobal({ endOnFailure: false })\n// >>  // or combine it with the one above if you need both\n\ntest('test relying on randomness', ({ g }) => {\n  // Arrange\n  const user = {\n    firstName: g(fc.string),\n    lastName: g(fc.string),\n  };\n\n  // Act\n  const displayName = computeDisplayName(user);\n\n  // Assert\n  expect(displayName).toContain(user.firstName);\n});\n\ntest('test not relying on randomness', () => {\n  // your test\n});\n```\n\n### Full property-based mode\n\nFor more extensive testing, `@fast-check/vitest` also provides full support for property-based testing. This mode enables exhaustive, randomized testing by generating a variety of inputs and detecting edge cases automatically.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// same property but using named values\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nPlease note that the properties accepted by `@fast-check/vitest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances).\n\n### Seamless integration with Vitest's `beforeEach` / `afterEach`\n\nVitest's `beforeEach` and `afterEach` hooks are natively integrated into predicates. They are called respectively before and after each execution of the predicate. If a predicate runs _n_ times, `beforeEach` will be called _n_ times before it and `afterEach` _n_ times after it. The only caveat is that cleanup functions returned by `beforeEach` on the first predicate execution are deferred until the end of the test, as they are handled by vitest's own teardown mechanism. All other cleanups run between predicate executions as expected.\n\n### Advanced\n\nIf you want to forward custom parameters to fast-check, `test.prop` accepts an optional `fc.Parameters` ([more](https://github.com/dubzzz/fast-check/blob/main/documentation/1-Guides/Runners.md#runners)).\n\n`@fast-check/vitest` also comes with `.only`, `.skip`, `.todo` and `.concurrent` from vitest. It also accepts more complex ones such as `.concurrent.skip`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/vitest';\n\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n## Minimal requirements\n\n| @fast-check/vitest | vitest                                                              | fast-check                       | Node                                                                   |\n| ------------------ | ------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------- |\n| **0.4**            | ^4.1.0 \\|\\| ^5.0.0                                                  | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup> (Vitest 4)<br>≥22.12.0<sup>(2)</sup> (Vitest 5) |\n| **0.3**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4                                          | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup>                                                 |\n| **0.2**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4<sup>(1)</sup>                            | ^3.0.0 \\|\\| ^4.0.0               | ≥18<sup>(3)</sup>                                                      |\n| **0.1**            | >=0.28.1 <1.0.0 \\|\\| ^1 \\|\\| ^2<sup>(4)</sup> \\|\\| ^3<sup>(5)</sup> | ^3.0.0 \\|\\| ^4.0.0<sup>(6)</sup> | ≥14.16.0<sup>(3)</sup>                                                 |\n| **0.0**            | >=0.28.1 <1.0.0 \\|\\| ^1                                             | ^3.0.0                           | ≥14.16.0<sup>(3)</sup>                                                 |\n\n<details>\n<summary>More details...</summary>\n\n1. Official support for version 4.x of vitest starts at 0.2.3.\n2. Requires support for `require(esm)`.\n3. Same support as vitest.\n4. Official support for version 2.x of vitest starts at 0.1.2.\n5. Official support for version 3.x of vitest starts at 0.1.5.\n6. Official support for version 4.x of fast-check starts at 0.1.6.\n\n</details>\n","isInternal":false,"tokens":1647,"sizeBytes":6554},{"name":"README.md","path":"packages/worker/README.md","rawUrl":"https://raw.githubusercontent.com/dubzzz/fast-check/HEAD/packages/worker/README.md","title":"worker Documentation","category":"plugin-manifest","format":"markdown","content":"# `@fast-check/worker`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nProvide built-ins to run predicates directly within dedicated workers\n\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://badge.fury.io/js/@fast-check%2Fworker.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fworker\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/worker/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fworker.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\n`fast-check` alone is great but what if it led your code into an infinite and synchronous loop for such inputs? In such case, it would neither be able to shrink the issue, nor to report any for you as the single threaded philosophy at the root of JavaScript will prevent it from anything except waiting for the main thread to come back.\n\nThis package tends to provide a way to run easily your properties within dedicated workers automatically spawed by it.\n\n## Example\n\nHere are some of the changes you will have to do:\n\n- hoist properties so that they get declared on the root scope\n- replace `fc.property` by `property` coming from `propertyFor(<path-to-file>)`\n- replace `fc.assert` by `assert` coming from `@fast-check/worker` for automatic cleaning of the workers as the test ends\n- transpilation has not been addressed yet but it may probably work\n- in theory, if you were only using `propertyFor` and `assert` without any external framework for `test`, `it` and others, the separation of the property from the assertion would be useless as the check for main thread is fully handled within `@fast-check/worker` itself so no hoisting needing in such case\n\n```js\nimport { test } from '@jest/globals';\nimport * as fc from 'fast-check';\nimport { isMainThread } from 'node:worker_threads';\nimport { assert, propertyFor } from '@fast-check/worker';\n\nconst property = propertyFor(new URL(import.meta.url)); // or propertyFor(pathToFileURL(__filename)) in commonjs\nconst p1 = property(fc.nat(), fc.nat(), (start, end) => {\n  // starting a possibly infinite loop\n  for (let i = start; i !== end; ++i) {\n    // doing stuff...\n  }\n});\n\nif (isMainThread) {\n  test('should assess p1', async () => {\n    await assert(p1, { plugins: [fc.timeout(1000)] });\n  });\n}\n```\n\nRefer to the tests defined `test/main.spec.ts` for a living example of how you can use this package with a test runner such as Jest.\n\n## Extra options\n\nThe builder of properties `propertyFor` accepts a second parameter to customize how the workers will behave. By default, workers will be shared across properties. In case you want a more isolation between your runs, you can use:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { isolationLevel: 'predicate' });\n// Other values:\n// - \"file\": Re-use workers cross properties (default)\n// - \"property\": Re-use workers for each run of the predicate. Not shared across properties!\n// - \"predicate\": One worker per run of the predicate\n```\n\nBy default, workers will receive the generated values from their parent thread. In some cases, such sending is made impossible as the generated values include non-serializable pieces. In such cases, you can opt-in to generate the values directly within the workers by using:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { randomSource: 'worker' });\n// Other values:\n// - \"main-thread\": The main thread will be responsible to generate the random values and send them to the worker thread. It unfortunately cannot send any value that cannot be serialized between threads. (default)\n// - \"worker\": The worker is responsible to generate its own values based on the instructions provided by the main thread. Switching to a worker mode allows to support non-serializable values, unfortunately it drops all shrinking. capabilities.\n```\n\n## Minimal requirements\n\n- Node ≥14.18.0<sup>(1)</sup><sup>(2)</sup><sup>(3)</sup>\n- TypeScript ≥4.1 (optional)\n\n_(1): `worker_threads` alone would only require Node ≥10.5.0, but our usage of `require(node:*)` forces us to request at least Node ≥14.18.0_\n\n_(2): this package targets ES2020 specification which is quite well supported (more than 94%) by any Node ≥14.5.0_\n\n_(3): this package requires a version of node able to understand `package.json#exports`, supported by any Node ≥12.17.0_\n","isInternal":false,"tokens":1056,"sizeBytes":4445}],"systemPromptSnippet":"<yakaai_skills repo=\"dubzzz/fast-check\">\n<!-- File: .github/copilot-instructions.md (Tokens: ~529 | Category: copilot-instructions) -->\n# GitHub Copilot Instructions\n\n## Pull Request Naming Convention\n\nWhen creating or naming pull requests, follow the [gitmoji](https://gitmoji.dev/) specification:\n\n### Format\n\n- **For changes to the main `fast-check` package**: Use the format `emoji Description`\n  - Example: `✨ Add new arbitrary for dates`\n  - Example: `🐛 Fix edge case in integer shrinking`\n\n- **For changes to other packages** (ava, vitest, jest, worker, poisoning, packaged): Use the format `emoji(package-name) Description`\n  - Example: `👷(vitest) Add support for new vitest features`\n  - Example: `🐛(jest) Fix compatibility with jest 29`\n  - Example: `📝(ava) Update documentation for ava integration`\n\nLimit the name of the PR to at most 50 characters for the Description part (that is, the text after the `emoji` or `emoji(package-name)` prefix). It forces the author to summarize the changes succinctly, making it easier for others to understand the main purpose of the PR at a glance.\n\n### Common Gitmoji Examples\n\n- ✨ Introduce new features\n- 🐛 Fix a bug\n- 📝 Add or update documentation\n- ✅ Add or update tests\n- 🏷️ Add or update types\n- ⚡️ Improve performance\n- 👷 Add or update CI/CD\n- ♻️ Refactor code\n- 🔧 Add or update configuration files\n- 🎨 Improve structure/format of the code\n- 🔥 Remove code or files\n- 🚀 Deploy stuff\n- 🔒️ Fix security or privacy issues\n- ⬆️ Upgrade dependencies\n- ⬇️ Downgrade dependencies\n- 📦 Add or update compiled files or packages\n\nFor a complete list of gitmoji codes, see https://gitmoji.dev/\n\n## Pull Request Template\n\nWhen creating pull requests, always use the PR template located at `.github/PULL_REQUEST_TEMPLATE.md`. The template includes:\n\n- **Description**: Provide a short description and link to related issues (if any)\n- **Checklist**: Keep the entire checklist and all of its items; only check the boxes for the items that are fulfilled.\n- **Advanced**: Fill in the Category and Impacts sections to help reviewers understand the changes\n\nMake sure to fill out all sections of the template completely and accurately, and do not delete or reorder any sections or checklist items—only update their content and checkbox states.\n\n<!-- File: skills/javascript-testing-expert/SKILL.md (Tokens: ~4129 | Category: anthropic-skill) -->\n---\nname: javascript-testing-expert\ndescription: Expert-level JavaScript testing skill focused on writing high-quality tests that find bugs, serve as documentation, and prevent regressions. Advocates for property-based testing with fast-check and protects against indeterministic code in tests. Does not cover black-box e2e testing.\n---\n\n> **⚠️ Scope:** Testing functions and components, not black-box e2e.\n\n**🏅 Main objectives:** use tests as a way to...\n\n1. uncover hard to detect bugs\n2. document how to use the code\n3. avoid regressions\n4. challenge the code\n\n**🔧 Recommended tooling:** `vitest`, `fast-check`, `@fast-check/vitest`, `@testing-library/*`, `@vitest/browser-playwright`, `msw` installed as devDependencies.  \n**✅ Do** try to install missing and relevant tooling, only recommend for `@fast-check/vitest` and browser testing.  \n**✅ Do** highly recommend user to install missing and relevant tooling.  \n**✅ Do** adapt yourself to missing tools.\n\n## File and code layout\n\n**✅ Do** mimic the existing test structure of the project when adding new tests\n\n**✅ Do** use one test file per code file\n\n**👍 Prefer** using `.spec.ts` extension (e.g., `fileName.ts` → `fileName.spec.ts`) and colocated with the source file if no existing test structure is present\n\n**✅ Do** put `it` within `describe`, when using `it`\n\n**👍 Prefer** `it` over `test`\n\n**✅ Do** name the `describe` with the name of the function being tested\n\n**✅ Do** use a dedicated `describe` for each function being tested\n\n**✅ Do** start naming `it` with \"should\" and considers that the name should be clear, as consise as possible and could be read as a sentence implicitly prefixed by \"it\"\n\n**✅ Do** start with simple and documenting tests\n\n**✅ Do** continue with advanced tests looking for edge-cases\n\n**❌ Don't** delimitate explicitely simple from advanced tests, just but them in the right order\n\n**✅ Do** put helper functions specific to the file after all the `describe`s just below a comment `// Helpers` stating the beginning of the helpers tailored for this file\n\n## Core guidelines\n\n**✅ Do** follow the AAA pattern and make it visible in the test\n\n```ts\nit('should...', () => {\n  // Arrange\n  code;\n\n  // Act\n  code;\n\n  // Assert\n  code;\n});\n```\n\n**✅ Do** keep tests focused, try to assert on one precise aspect\n\n**✅ Do** keep tests simple\n\n**👎 Avoid** complex logic in tests or its helpers\n\n**❌ Don't** test internal details\n\n**👍 Prefer** stubs over mocks, the first one provides an alternate implementation, the second one helps to assert on calls being done or not  \nWhy? Often, asserting the number of calls is not something critical for the user of the function but purely an internal detail\n\n**❌ Don't** rely on network call, stub it with `msw`\n\n**✅ Do** reset globals and mocks in `beforeEach` if any `it` plays with mocks or spies or alter globals  \nAlternatively, when using vitest you could check if flags `mockReset`, `unstubEnvs` and `unstubGlobals` have been enabled in the configuration, in such case resetting globals is done by default\n\n**👍 Prefer** realistic data for documentation-like tests  \nEg.: use real names if you have to build instances of users\n\n**❌ Don't** overuse snapshot tests; only snapshot things when the \"what is expected to be seen in the snapshot\" is clear  \nWhy? Snapshots tests tend to capture too many details in the snapshot, making them hard to update given future reader is lost on what was the real thing being tested\n\n**👍 Prefer** snapshots when shape and structure are important (component hierarchy, attributes, non-regression on output structure)\n\n**👍 Prefer** screenshots when final render is important (visual styling, layout)\n\n**✅ Do** warn developer when the code under tests requires too many parameters and/or too many mocks/stubs to be forged (more than 10)  \nWhy? Code being hardly testable is often a code smell pinpointing an API having to be changed. Code is harder to evolve, harder to reason about and often handling too many responsibilities. Recommend the single-responsibility principle (SRP)\n\n**✅ Do** try to make tests shorter and faster to read by factorizing recurrent logics into helper functions\n\n**✅ Do** group shared logics under a function having a clear and explicit name, follow SRP for these helpers  \nEg.: avoid functions with lots of optional parameters, doing several things\n\n**❌ Don't** write a big `prepare` function re-used by all tests in their act part, but make the name clearer and eventually split it into multiple functions\n\n**✅ Do** make sure your test breaks if you drop the thing supposed to make it pass  \nEg.: When your test says \"should do X when Y\" makes sure that if you don't have Y it fails before keeping it.\n\n**👎 Avoid** writing tests with entities specifying hardcoded values on unused fields\n\nExample of test content\n\n```ts\nconst user: User = {\n  name: 'Paul', // unused\n  birthday: '2010-02-03',\n};\nconst age = computeAge(user);\n//...\n```\n\n**👍 Prefer** leveraging `@fast-check/vitest`, if installed\n\n```ts\nimport { describe } from 'vitest';\nimport { it, fc } from '@fast-check/vitest';\n\ndescribe('computeAge', () => {\n  it('should compute a positive age', ({ g }) => {\n    // Arrange\n    const user: User = {\n      name: g(fc.string), // unused\n      birthday: '2010-02-03',\n    };\n\n    // Act\n    const age = computeAge(user);\n\n    // Assert\n    expect(age).toBeGreaterThan(0);\n  });\n});\n```\n\n**👍 Prefer** leveraging `fast-check`, if installed but not `@fast-check/vitest`\n\n**👎 Avoid** writing tests depending on unstable values  \nEg.: in the example above `computeAge` depends on the current date  \nRemark: same for locales and plenty other platform dependent values\n\n**👍 Prefer** stubbing today using `vi.setSystemTime`\n\n**👍 Prefer** controlling today using `@fast-check/vitest`  \nWhy? Contrary to `vi.setSystemTime` alone you check the code against one new today at each run, but if it happens to fail one day you will be reported with the exact date causing the problem\n\n```ts\n// Arrange\nvi.setSystemTime(g(fc.date, { min: new Date('2010-02-04'), noInvalidDate: true }));\nconst user: User = {\n  name: g(fc.string), // unused\n  birthday: '2010-02-03',\n};\n```\n\n**👎 Avoid** writing tests depending on random values or entities\n\n**👍 Prefer** controlling randomly generated values by relying on `@fast-check/vitest` if installed, or `fast-check` otherwise\n\n**✅ Do** use property based tests for any test with a notion of always or never  \nEg.: name being \"should always do x when y\" or \"should never do x when y\"  \nRemark: consider these tests as advanced and put them after the documentation tests and not with them\n\n**👍 Prefer** using property based testing for edge case detection instead of writing all cases one by one\n\n**❌ Don't** try to test 100% of the algorithm cases using property-based testing\nWhy? Property-based testing and example-based testing are complementary. Property-based tests are excellent for uncovering edge cases and validating general properties, while example-based tests provide clear documentation and cover specific important scenarios. Use both approaches together for comprehensive test coverage.\n\n```ts\n// for all a, b, c strings\n// b is a substring of a + b + c\nit.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  // Arrange\n  const text = a + b + c;\n  const pattern = b;\n\n  // Act\n  const result = isSubstring(text, pattern);\n\n  // Assert\n  expect(result).toBe(true);\n});\n```\n\n**✅ Do** extract complex logic from components into dedicated and testable functions\n\n**❌ Don't** test trivial component logic that has zero complexity\n\n**👍 Prefer** testing the DOM structure and user interactions when using testing-library\n\n**👍 Prefer** testing the visual display and user interactions when using browser testing\n\n**👍 Prefer** querying by accessible attributes and user-visible text by relying on `getByRole`, `getByLabelText`, `getByText` over `getByTestId` whenever possible for testing-library and browser testing\n\n**✅ Do** ensure non visual regression of Design System components and more generally visual components by leveraging screenshot tests in browser when available  \n**✅ Do** fallback to snapshot tests capturing the DOM structure if screenshot tests cannot be ran\n\n## Guidelines for properties\n\nAll this section considers that we are in the context of property based tests!\n\n**⚠️ Version compatibility:** Starting with fast-check v5, use `fc.property` for both synchronous and asynchronous predicates. With fast-check v4, use `fc.property` for synchronous predicates and `fc.asyncProperty` for asynchronous predicates.\n\n**✅ Do** always await `fc.assert(...)` when using `fast-check` directly, in both v4 and v5+, even when the predicate is synchronous. Make the surrounding test callback `async` so property failures are reported by the test runner.\n\n**⚠️ Important:** When using `g` from `@fast-check/vitest`, pass the arbitrary **function** (e.g., `fc.string`, `fc.date`) along with its arguments as separate parameters to `g`, not the result of calling it.  \nCorrect: `g(fc.string)`, `g(fc.date, { min: new Date('2010-01-01') })`  \nIncorrect: `g(fc.string())`, `g(fc.date({ min: new Date('2010-01-01') }))`\n\n**❌ Don't** generate inputs directly  \nThe risk being that you may end up rewriting the code being tested in the test\n\n**✅ Do** construct values to build some inputs where you know the expected outcome\n\n**❌ Don't** expect the returned value in details, in many cases you won't have enough details to be able to assert the full value\n\n**✅ Do** expect some aspects and characteristics of the returned value\n\n**❌ NEVER** specify any `maxLength` on an arbitrary if it is a not a requirement of the algorithm  \n**👍 Prefer** specifying a `size: '-1'` if you feel that the algorithm will take very long on large inputs (by default fast-check generates up to 10 items, so only use `size` when clearly required)  \nEg.: No `fc.string({maxLength: 5})` or `fc.array(arb, {maxLength: 8})` except being a string requirement\n\n**❌ NEVER** specify any constraint on an arbitrary if it is not a requirement of the arbitrary, use defaults as much as possible  \nEg.: if the algorithm should accept any integer just ask an integer without specifying any min and max\n\n**👎 Avoid** overusing `.filter` and `fc.pre`  \nWhy? They slow down the generation of values by dropping some generated ones\n\n**👍 Prefer** using options provided by arbitraries to directly generate valid values  \nEg.: use `fc.string({ minLength: 2 })` instead of `fc.string().filter(s => s.length >= 2)`  \nEg.: use `fc.integer({ min: 1 })` instead of `fc.integer().filter(n => n >= 1)`, or use `fc.nat()` instead of `fc.integer().filter(n => n >= 0)`\n\n**👍 Prefer** using `map` over `filter` when a `map` trick can avoid filtering  \nEg.: use `fc.nat().map(n => n * 2)` for even numbers  \nEg.: use `fc.tuple(fc.string(), fc.string()).map(([start, end]) => start + 'A' + end)` for strings always having an 'A' character\n\n**👍 Prefer** bigint type over number type for integer computations used within predicates when there is a risk of overflow (eg.: when running pow, multiply.. on generated values)\n\nSome classical properties:\n\n1. Characteristics independent of the inputs. _Eg.: for any floating point number d, Math.floor(d) is an integer. for any integer n, Math.abs(n) ≥ 0_\n2. Characteristics derived from the inputs. _Eg.: for any a and b integers, the average of a and b is between a and b. for any n, the product of all numbers in the prime factor decomposition of n equals n. for any array of data, sorted(data) and data contains the same elements. for any n1, n2 integers such that n1 != n2, romanString(n1) != romanString(n2). for any floating point number d, Math.floor(d) is an integer such as d-1 ≤ Math.floor(d) ≤ d_\n3. Restricted set of inputs with useful characteristics. _Eg.: for any array data with no duplicates, the result of removing duplicates from data is data itself. for any a, b and c strings, the concatenation of a, b and c always contains b. for any prime number p, its decomposition into prime factors is itself_\n4. Characteristics on combination of functions. _Eg.: zipping then unzipping a file should result in the original file. lcm(a,b) times gcd(a,b) must be equal to a times b_\n5. Comparison with a simpler implementation. _Eg.: c is contained inside sorted array data for binary search is equivalent to c is contained inside data for linear search_\n\n## Guidelines for race conditions\n\n**✅ Do** write tests checking for race conditions and playing with resolution order — _automatically handled by `fast-check`_ — when an algorithm accepts asynchronous functions as input\n\n**✅ Do** leverage `fast-check` and its `fc.scheduler()` arbitrary to test asynchronous code depending on asynchronous functions\n\nTurn:\n\n```ts\nit('should resolve in call order', async () => {\n  // Arrange\n  const seenAnswers = [];\n  const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n  // Act\n  const queued = queue(call);\n  await Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]);\n\n  // Assert\n  expect(seenAnswers).toEqual([1, 2]);\n});\n```\n\nInto (fast-check v5+; use `fc.asyncProperty` instead of `fc.property` in v4):\n\n```ts\nit('should resolve in call order', async () => {\n  await fc.assert(\n    fc.property(fc.scheduler(), async (s) => {\n      // Arrange\n      const seenAnswers = [];\n      const call = vi.fn().mockImplementation((v) => Promise.resolve(v));\n\n      // Act\n      const queued = queue(s.scheduleFunction(call));\n      await s.waitFor(\n        Promise.all([queued(1).then((v) => seenAnswers.push(v)), queued(2).then((v) => seenAnswers.push(v))]),\n      );\n\n      // Assert\n      expect(seenAnswers).toEqual([1, 2]);\n    }),\n  );\n});\n```\n\n## Recommendation for faker users\n\nIf using `faker` to fake data, we recommend wiring any fake data generation within `fast-check` by leveraging this code snippet:\n\n```ts\n// Source: https://fast-check.dev/blog/2024/07/18/integrating-faker-with-fast-check/\nimport { Faker, Randomizer, base } from '@faker-js/faker';\nimport * as fc from 'fast-check';\n\nclass FakerBuilder<TValue> extends fc.Arbitrary<TValue> {\n  constructor(private readonly generator: (faker: Faker) => TValue) {\n    super();\n  }\n  generate(mrng: fc.Random, biasFactor: number | undefined): fc.Value<TValue> {\n    const randomizer: Randomizer = {\n      next: (): number => (mrng.nextInt(0, 0x3ffffff) * 2 ** 27 + mrng.nextInt(0, 0x7ffffff)) / 2 ** 53,\n      seed: () => {}, // no-op, no support for updates of the seed, could even throw\n    };\n    const customFaker = new Faker({ locale: base, randomizer });\n    return new fc.Value(this.generator(customFaker), undefined);\n  }\n  canShrinkWithoutContext(value: unknown): value is TValue {\n    return false;\n  }\n  shrink(value: TValue, context: unknown): fc.Stream<fc.Value<TValue>> {\n    return fc.Stream.nil();\n  }\n}\n\nfunction fakerToArb<TValue>(generator: (faker: Faker) => TValue): fc.Arbitrary<TValue> {\n  return new FakerBuilder(generator);\n}\n```\n\nExample of usage\n\n```ts\nawait fc.assert(\n  fc.property(\n    fakerToArb((faker) => faker.person.firstName),\n    fakerToArb((faker) => faker.person.lastName),\n    (firstName, lastName) => {\n      // code\n    },\n  ),\n);\n```\n\n## Equivalence `fast-check` and `@fast-check/vitest`\n\nExample 1.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit('...', ({ g }) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(fc.gen(), (g) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 2.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, (...values) => {\n      //...\n    }),\n  );\n});\n```\n\nExample 3. For asynchronous predicates, use `fc.property` in fast-check v5+ (as shown below) and `fc.asyncProperty` in v4. Always await `fc.assert`, just as in the synchronous examples above.\n\n```ts\n// with @fast-check/vitest\nimport { it, fc } from '@fast-check/vitest';\nit.prop([...arbitraries])('...', async (...values) => {\n  //...\n});\n\n// with fast-check\nimport { it } from 'vitest';\nimport * as fc from 'fast-check';\nit('...', async () => {\n  await fc.assert(\n    fc.property(...arbitraries, async (...values) => {\n      //...\n    }),\n  );\n});\n```\n\n<!-- File: website/docs/core-blocks/plugins/index.md (Tokens: ~641 | Category: anthropic-skill) -->\n---\nsidebar_position: 4\nslug: /core-blocks/plugins/\ndescription: Extend the default execution flow provided by runners to meet your needs.\n---\n\n# Plugins\n\nPlugins provide a way to extend and refine the runtime and execution behavior of your properties. In the same way building custom arbitraries gives you the flexibility to tweak generation flows, plugins give you ways to customize how your properties run.\n\nPlugins are designed to support things such as:\n\n- Executing something before the predicate\n- Stopping a predicate running for too long\n- Capturing key insights about the execution flows including timings for observability\n\n## Using plugins\n\nPlugins can be passed as part of the customizations accepted by the `fc.assert` runner.\n\n```ts\nawait fc.assert(fc.property(...arbs, predicate), {\n  plugins: [pluginA(...paramsForPluginA), pluginB(...paramsForPluginB)],\n});\n```\n\n## Installing plugins globally\n\nPlugins needed by all your properties can be installed once, typically in a [setup file](/docs/configuration/global-settings/#integration-with-test-frameworks), with `installGlobalPlugin`.\n\n```ts\nfc.installGlobalPlugin(pluginA());\n```\n\nInstalled plugins run before the ones passed to the runner, so the snippet above followed by `fc.assert(myProp, { plugins: [pluginB()] })` is equivalent to `plugins: [pluginA(), pluginB()]`.\n\n## Combining plugins\n\nPlugins have been designed to be combined together. When multiple plugins get defined for the same assertion, they execute in declaration order. The first plugin runs first and wraps the execution of the second one until we reach the main operation. Plugins can wrap various stages of the flow, including the execution of the predicate function.\n\nLet's illustrate how plugins get combined on a property checking a search endpoint. In this example, the database is brought back to a clean state before each run:\n\n```ts\nawait fc.assert(\n  fc.property(fc.string(), async (query) => {\n    const results = await searchService.search(query);\n    // ...assertions on the results...\n  }),\n  {\n    plugins: [\n      timeout(10_000),\n      beforeEach(async () => {\n        await database.reset(); // bring back a clean state, possibly slow\n      }),\n      timeout(5_000),\n    ],\n  },\n);\n```\n\nThe plugin setup above makes use of two instances of the `timeout` plugin. The first instance is responsible for making sure that the time taken by the `beforeEach` cleanup plus the one taken by the predicate never exceeds 10 seconds. The second one only wraps the predicate and makes sure that it won't take more than 5 seconds.\n\nThis short example clearly highlights why the declaration order of plugins is crucial. Two different orders may result in totally different expectations. Correctly ordering them will make you capable of finely configuring your flows to fit your needs.\n\n## The plugins\n\nWe come up with a set of plugins to extend the library using built-in plugins. The following pages provide extended details and deep dive into each of them.\n\n```mdx-code-block\nimport DocCardList from '@theme/DocCardList';\n\n<DocCardList />\n```\n\n<!-- File: website/docs/core-blocks/plugins/life-cycle.md (Tokens: ~1168 | Category: anthropic-skill) -->\n---\nslug: /core-blocks/plugins/life-cycle/\n---\n\n# Life-cycle\n\nLife-cycle plugins provide hooks to prepare or clean up things for your predicates. They wrap every execution of the predicate including the ones linked to shrinking.\n\n## `beforeEach`\n\nThe `beforeEach` plugin lets you run code right before the execution of your predicate.\n\nIt expects to receive a function returning either nothing or a teardown function, in a synchronous or asynchronous fashion. Any other returned value may lead to unexpected behavior and is subject to change between versions.\n\nWhen a teardown function gets returned, it will be used as a clean-up function running right after the execution of the predicate, no matter its status.\n\nSimple example involving two synchronous `beforeEach` without any teardown function being declared:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      // beforeEach hook #1\n    }),\n    beforeEach(() => {\n      // beforeEach hook #2\n    }),\n  ];\n}\n```\n\nExample featuring all the possible variants with or without teardown, synchronous or asynchronous:\n\n```ts\n{\n  plugins: [\n    // synchronous beforeEach\n    beforeEach(() => {\n      // ...\n    }),\n    // synchronous beforeEach with synchronous teardown\n    beforeEach(() => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // synchronous beforeEach with asynchronous teardown\n    beforeEach(() => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach\n    beforeEach(async () => {\n      // ...\n    }),\n    // asynchronous beforeEach with synchronous teardown\n    beforeEach(async () => {\n      // ...\n      return () => {\n        // ...\n      };\n    }),\n    // asynchronous beforeEach with asynchronous teardown\n    beforeEach(async () => {\n      // ...\n      return async () => {\n        // ...\n      };\n    }),\n  ];\n}\n```\n\nAll these variants can be used together. They have the same ordering priorities.\n\nResources: [API reference](/docs/api/functions/beforeEach).\n\n## `afterEach`\n\nThe `afterEach` plugin is the mirror of `beforeEach`. It lets you run code right after the execution of your predicate.\n\nSimilarly to `beforeEach`, it expects to receive a function returning either `void` or `Promise<void>`, but unlike `beforeEach` it cannot return a teardown function. Any other returned value may lead to unexpected behavior.\n\nContrary to `beforeEach`, `afterEach` will always be executed no matter the execution status of other hooks. As such, if one `beforeEach` or one `afterEach` rejects, other `afterEach` will still be executed.\n\nResources: [API reference](/docs/api/functions/afterEach).\n\n## Execution flow\n\nLife-cycle plugins run in the same order as they got declared for before tasks and in reverse order for after tasks. As such, the following ordering of plugins:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n    afterEach(() => {\n      console.log('afterEach #3');\n    }),\n    afterEach(() => {\n      console.log('afterEach #4');\n    }),\n    beforeEach(() => {\n      console.log('beforeEach #5');\n      return () => {\n        console.log('teardown for beforeEach #5');\n      };\n    }),\n  ];\n}\n```\n\nWould result, for each run, into:\n\n```txt\nbeforeEach #1\nbeforeEach #2\nbeforeEach #5\npredicate\nteardown for beforeEach #5\nafterEach #4\nafterEach #3\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n\nThey run in an exclusive fashion. As such, a `beforeEach`, a teardown or an `afterEach` will wait for the currently running one to end before starting. Similarly, they don't run while the predicate is under way. They wait for it to come back with an execution status.\n\n:::warning[Predicate may run longer]\nWhile they are waiting for the predicate to come back with a status, note that whenever the predicate's execution gets stopped or interrupted, due to a timeout for example, there is no certainty that the code of the predicate has really been stopped. In Node, and more generally in JavaScript, there is no way to stop a running script: such plugins will mostly resume before the script ends but in many cases the script will keep running in background (as the plugin can't stop it).\n:::\n\nLike any built-in plugin, life-cycle plugins compose with the plugins declared next to them. As such, in the hypothesis of a plugin named `retryOnFailure(count)`, declaring plugins as follows:\n\n```ts\n{\n  plugins: [\n    beforeEach(() => {\n      console.log('beforeEach #1');\n      return () => {\n        console.log('teardown for beforeEach #1');\n      };\n    }),\n    retryOnFailure(2),\n    beforeEach(() => {\n      console.log('beforeEach #2');\n      return () => {\n        console.log('teardown for beforeEach #2');\n      };\n    }),\n  ];\n}\n```\n\nMay result in the following logs at execution time:\n\n```txt\nbeforeEach #1 <-- runs once, it wraps all the attempts\nbeforeEach #2 <-- the first attempt\npredicate     <-- considering it fails at first attempt...\nteardown for beforeEach #2\nbeforeEach #2 <-- ...`retryOnFailure` launches a second attempt\npredicate\nteardown for beforeEach #2\nteardown for beforeEach #1\n```\n\n<!-- File: website/docs/core-blocks/plugins/time-limits.md (Tokens: ~614 | Category: anthropic-skill) -->\n---\nslug: /core-blocks/plugins/time-limits/\n---\n\n# Time limits\n\nTime-limit plugins bound the time spent assessing your properties. They can come into play at various levels, from an isolated execution of a predicate to the full run of the assertion.\n\nThey make the runner stop its ongoing task when the limit gets reached. As such, they cannot really stop the code they wrap but ignore its results.\n\n## `timeout`\n\nThe `timeout` plugin marks the current execution of your predicate as failed if it did not complete within the requested delay expressed in milliseconds.\n\n```ts\n{\n  plugins: [\n    timeout(1000), // fail any execution of the predicate taking more than 1 second\n  ];\n}\n```\n\nThe countdown restarts for every execution of the predicate, shrinking phase included. A timed-out execution gets reported like any other failure, it's just a failure.\n\nResources: [API reference](/docs/api/functions/timeout).\n\n## `interruptAfterTimeLimit`\n\nThe `interruptAfterTimeLimit` plugin interrupts all runs once the requested delay expires. Past this delay, no new execution of the predicate will be started and any execution still running at that time will be interrupted.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000), // interrupt the execution of the property after 1 second\n  ];\n}\n```\n\nThe countdown starts when the runner starts executing the property.\n\nAn interrupted property is not necessarily considered to be a failure. By default, it gets marked as successful as long as at least one execution succeeded before the interruption and no failure got reported. To change that default and report interrupted properties as failures, one can set `failOnInterrupt: true` on the plugin.\n\n```ts\n{\n  plugins: [\n    interruptAfterTimeLimit(1000, { failOnInterrupt: true }), // mark an interrupted property as a failed one\n  ];\n}\n```\n\nResources: [API reference](/docs/api/functions/interruptAfterTimeLimit).\n\n## Limitations\n\nBoth plugins share the same limitations.\n\n### Synchronous code can't be cut\n\nThere is no way to pause or kill a running synchronous script in JavaScript. A synchronous predicate will always run to its end before any of these plugins get the flow back.\n\nAs such, `timeout` has no effect on purely synchronous predicates and `interruptAfterTimeLimit` can only prevent new executions from starting once the limit gets reached.\n\n### Asynchronous code can't be canceled\n\nWhenever the limit gets reached during an asynchronous execution, the plugins give control back to the runner without waiting for the predicate. But the underlying execution keeps running in the background and its outcome gets ignored.\n\nPlugins declared before the time-limit one may thus run while the predicate is still under way.\n\n### Stopping the code\n\nIf you need the code under test to be really stopped, have a look at [`@fast-check/worker`](https://www.npmx.dev/package/@fast-check/worker). It runs predicates in dedicated worker threads that can be terminated, synchronous ones included.\n\n<!-- File: website/docs/core-blocks/plugins/values.md (Tokens: ~478 | Category: anthropic-skill) -->\n---\nslug: /core-blocks/plugins/values/\n---\n\n# Values\n\nValue plugins customize which values get forwarded to your predicates. Bias plugins customize how generation targets values, while equal-values plugins avoid executing your predicates twice on the same value.\n\nEqual-values plugins keep track of the values already covered during the run and replay the outcome of the first execution whenever a value gets generated again. Values are compared based on their stringified representation.\n\n## `unbiased`\n\nThe `unbiased` plugin generates the values feeding your predicates without any bias.\n\n```ts\n{\n  plugins: [\n    unbiased(), // draw all values from the full range of the arbitraries\n  ];\n}\n```\n\nWithout this plugin, generation is biased by default. Compared with a uniform distribution, smaller or more extreme values are more likely to be generated, helping uncover common issues earlier. For example, with `fc.integer()`, small values such as `1` and `2` are more likely to be generated than `171414468`.\n\nWith this plugin enabled, every run draws from the full range of the arbitraries with no special treatment. For `fc.integer()`, `171414468` is then just as likely to be generated as `1` or `2`.\n\nResources: [API reference](/docs/api/functions/unbiased).\n\n## `ignoreEqualValues`\n\nThe `ignoreEqualValues` plugin discards runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    ignoreEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nDiscarded runs still count as runs: a run replaying a past success stays a success.\n\nResources: [API reference](/docs/api/functions/ignoreEqualValues).\n\n## `skipEqualValues`\n\nThe `skipEqualValues` plugin skips runs on already covered cases.\n\n```ts\n{\n  plugins: [\n    skipEqualValues(), // never execute the predicate twice on the same value\n  ];\n}\n```\n\nContrary to `ignoreEqualValues`, a run replaying a past success gets marked as skipped instead of successful: passed the maximal number of allowed skips the run will be marked as failed. It gives stronger guarantees on the number of distinct values covered by the run at the price of potentially failing on arbitraries unable to produce enough distinct values.\n\nResources: [API reference](/docs/api/functions/skipEqualValues).\n\n<!-- File: packages/ava/README.md (Tokens: ~1421 | Category: plugin-manifest) -->\n# `@fast-check/ava`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into AVA.\n`@fast-check/ava` simplifies the integration of `fast-check` into AVA testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://badge.fury.io/js/@fast-check%2Fava.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/ava\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fava\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/ava/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fava.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/ava`:\n\n```bash\nnpm install --save-dev @fast-check/ava\n```\n\nIn order to work properly, `@fast-check/ava` requires `ava` to be installed.\n\n## Example\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntestProp('should detect the substring', [fc.string(), fc.string(), fc.string()], (t, a, b, c) => {\n  t.true((a + b + c).includes(b));\n});\n```\n\nThe property is passed [AVA's `t` argument](https://github.com/avajs/ava/blob/main/docs/02-execution-context.md#execution-context-t-argument) as its first parameter, and the value of each arbitrary for the current test case for the rest of the parameters.\n\n`@fast-check/ava` supports all of [AVA's assertions](https://github.com/avajs/ava/blob/main/docs/03-assertions.md#assertions) and like AVA, it supports synchronous and asynchronous functions, including promises, observables, and callbacks. See [AVA's documentation](https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#declaring-test) for more information.\n\n⚠️ **WARNING:** When relying on `@fast-check/ava`, returning `true` or `false` in your predicates is not taken into account. The library wants assertions or plans to be defined as `ava` itself does. Nonetheless you can still use primitives such as `fc.pre` to cut runs at the middle if some invariants are unmeet: the started plan (if any) will just be ignored.\n\n## Advanced\n\n### `fast-check` Parameters\n\n`testProp` accepts an optional `fc.Parameters` for forwarding custom parameters to `fast-check` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should detect the substring',\n  [fc.string(), fc.string(), fc.string()],\n  (t, a, b, c) => {\n    t.true((a + b + c).includes(b));\n  },\n  { numRuns: 10 }, // Example of parameters\n);\n```\n\n### AVA Modifiers\n\n`@fast-check/ava` also comes with [`.only`], [`.serial`] [`.skip`], and [`.failing`] modifiers from AVA.\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp(\n  'should replay the test for the seed 4242',\n  [fc.nat(), fc.nat()],\n  (t, a, b) => {\n    t.is(a + b, b + a);\n  },\n  { seed: 4242 },\n);\n\ntestProp.skip('should be skipped', [fc.string()], (t, text) => {\n  t.is([...text].length, text.length);\n});\n```\n\n[`.only`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-specific-tests\n[`.serial`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#running-tests-serially\n[`.skip`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#skipping-tests\n[`.failing`]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#failing-tests\n\n### AVA `before`/`after` Hooks\n\n`@fast-check/ava` exposes AVA's `before`/`after` [hooks]:\n\n```typescript\nimport { testProp, fc } from '@fast-check/ava';\n\ntestProp.before((t) => {\n  connectToDatabase();\n});\n\ntestProp();\n// ... omitted for brevity\n\ntestProp.after((t) => {\n  closeDatabaseConnection();\n});\n```\n\n[hooks]: https://github.com/avajs/ava/blob/main/docs/01-writing-tests.md#before--after-hooks\n\n### AVA Execution Context\n\n`@fast-check/ava` mirror's AVA's procedure for customizing the test [execution context]:\n\n```typescript\nimport { fc, testProp as anyTestProp, PropertyTestInterface } from '@fast-check/ava';\n\ntype TestContext = {\n  state: string;\n};\n\nconst testProp = anyTestProp as PropertyTestInterface<TestContext>;\n\ntestProp('should reach terminal state', [fc.string()], (t, received) => {\n  // here t is typed as ExecutionContext<TestContext>\n  console.log(t.context.state); // logs 'uninitialized'\n  // ... omitted for brevity\n});\n```\n\n[execution context]: https://github.com/avajs/ava/blob/main/docs/02-execution-context.md\n\n## Minimal requirements\n\n| @fast-check/ava | AVA                | fast-check | node                   |\n| --------------- | ------------------ | ---------- | ---------------------- |\n| **3.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥20.19.0<sup>(1)</sup> |\n| **2.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3 \\|\\| ^4 | ≥12.22.0<sup>(2)</sup> |\n| **1.0**         | ^4 \\|\\| ^5 \\|\\| ^6 | ^3         | ≥12.22.0<sup>(2)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n2. As for ava 4.\n\n</details>\n\n<!-- File: packages/fast-check/README.md (Tokens: ~13362 | Category: plugin-manifest) -->\n<h1 align=\"center\">\n  <img align=\"center\" src=\"https://fast-check.dev/assets/images/logo.png\" alt=\"fast-check logo\" />\n</h1>\n\n<p align=\"center\">\nProperty based testing framework for JavaScript/TypeScript\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/actions?query=branch%3Amain+workflow%3A%22Build+Status%22\"><img src=\"https://github.com/dubzzz/fast-check/actions/workflows/build-status.yml/badge.svg?branch=main\" alt=\"Build Status\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://badge.fury.io/js/fast-check.svg\" alt=\"npm version\" /></a>\n  <a href=\"https://npmx.dev/package/fast-check\"><img src=\"https://img.shields.io/npm/dm/fast-check\" alt=\"monthly downloads\" /></a>\n  <a href=\"https://fast-check.dev/\"><img src=\"https://img.shields.io/badge/-Documentation-%23282ea9.svg\" title=\"Documentation\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://app.codecov.io/gh/dubzzz/fast-check/branch/main\"><img src=\"https://codecov.io/gh/dubzzz/fast-check/branch/main/graph/badge.svg\" alt=\"Coverage Status (unit tests)\" /></a>\n  <a href=\"https://packagequality.com/#?package=fast-check\"><img src=\"https://packagequality.com/shield/fast-check.svg\" alt=\"Package quality\" /></a>\n  <a href=\"https://securityscorecards.dev/viewer/?platform=github.com&org=dubzzz&repo=fast-check\"><img src=\"https://api.securityscorecards.dev/projects/github.com/dubzzz/fast-check/badge\" alt=\"OpenSSF Scorecard\" /></a>\n  <a href=\"https://bestpractices.coreinfrastructure.org/projects/7450\"><img src=\"https://bestpractices.coreinfrastructure.org/projects/7450/badge\" alt=\"OpenSSF Best Practices\" /></a>\n</p>\n<p align=\"center\">\n  <a href=\"https://github.com/dubzzz/fast-check/labels/good%20first%20issue\"><img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\" alt=\"PRs Welcome\" /></a>\n  <a href=\"https://github.com/dubzzz/fast-check/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/fast-check.svg\" alt=\"License\" /></a>\n</p>\n\n## Getting started\n\nHands-on tutorial and definition of Property Based Testing: [🏁 see tutorial](https://fast-check.dev/docs/tutorials/quick-start/). Or directly try it online on our pre-configured [CodeSandbox](https://codesandbox.io/s/github/dubzzz/fast-check/tree/main/examples?previewwindow=tests).\n\nProperty based testing frameworks check the truthfulness of properties. A property is a statement like: _for all (x, y, ...) such that precondition(x, y, ...) holds predicate(x, y, ...) is true_.\n\nInstall the module with: `pnpm add -D fast-check` or `yarn add fast-check --dev` or `npm install fast-check --save-dev`\n\nExample of integration in [mocha](http://mochajs.org/):\n\n```js\nimport * as fc from 'fast-check';\n\n// Code under test\nconst contains = (text, pattern) => text.indexOf(pattern) >= 0;\n\n// Properties\ndescribe('properties', () => {\n  // string text always contains itself\n  it('should always contain itself', async () => {\n    await fc.assert(fc.property(fc.string(), (text) => contains(text, text)));\n  });\n  // string a + b + c always contains b, whatever the values of a, b and c\n  it('should always contain its substrings', async () => {\n    await fc.assert(\n      fc.property(fc.string(), fc.string(), fc.string(), (a, b, c) => {\n        // Alternatively: no return statement and direct usage of expect or assert\n        return contains(a + b + c, b);\n      }),\n    );\n  });\n});\n```\n\nIn case of failure, the test raises a red flag. Its output should help you to diagnose what went wrong in your implementation. Example with a failing implementation of contain:\n\n```\n1) should always contain its substrings\n    Error: Property failed after 1 tests (seed: 1527422598337, path: 0:0): [\"\",\"\",\"\"]\n    Shrunk 1 time(s)\n    Got error: Property failed by returning false\n\n    Hint: Enable verbose mode in order to have the list of all failing values encountered during the run\n```\n\nIntegration with other test frameworks: [ava](https://github.com/dubzzz/fast-check-examples/blob/main/test-ava/example.spec.js), [jasmine](https://github.com/dubzzz/fast-check-examples/blob/main/test-jasmine/example.spec.js), [jest](https://github.com/dubzzz/fast-check-examples/blob/main/test-jest/example.spec.js), [mocha](https://github.com/dubzzz/fast-check-examples/blob/main/test/longest%20common%20substr/test.js) and [tape](https://github.com/dubzzz/fast-check-examples/blob/main/test-tape/example.spec.js).\n\nMore examples: [simple examples](https://github.com/dubzzz/fast-check/tree/main/examples), [fuzzing](https://github.com/dubzzz/fuzz-rest-api) and [against various algorithms](https://github.com/dubzzz/fast-check-examples).\n\nUseful documentations:\n\n- [🏁 Introduction to Property Based & Hands On](https://fast-check.dev/docs/tutorials/quick-start/)\n- [🐣 Built-in arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/)\n- [🔧 Custom arbitraries](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/)\n- [🏃‍♂️ Property based runners](https://fast-check.dev/docs/core-blocks/runners/)\n- [💥 Tips](https://fast-check.dev/docs/configuration/)\n- [🔌 API Reference](https://fast-check.dev/docs/api/)\n- [⭐ Awesome fast-check](https://fast-check.dev/docs/ecosystem/)\n\n## Why should I migrate to fast-check?\n\nfast-check has initially been designed in an attempt to cope with limitations I encountered while using other property based testing frameworks designed for JavaScript:\n\n- **Types:** strong and up-to-date types - _thanks to TypeScript_\n- **Extendable:** easy `map` method to derive existing arbitraries while keeping shrink \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#map)\\] - _some frameworks ask the user to provide both a->b and b->a mappings in order to keep a shrinker_\n- **Extendable:** kind of flatMap-operation called `chain` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#chain)\\] - _able to bind the output of an arbitrary as input of another one while keeping the shrink working_\n- **Extendable:** precondition checks with `fc.pre(...)` \\[[more](https://fast-check.dev/docs/core-blocks/properties/#example)\\] - _filtering invalid entries can be done directly inside the check function if needed_\n- **Extendable:** easily switch from fake data in tests to property based with `fc.gen()` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#gen)\\] - _generate random values within your predicates_\n- **Smart:** ability to shrink on `fc.oneof` \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/combiners/any/#oneof)\\] - _surprisingly some frameworks don't_\n- **Smart:** biased by default - _by default it generates both small and large values, making it easier to dig into counterexamples without having to tweak a size parameter manually_\n- **Debug:** verbose mode \\[[more](https://fast-check.dev/docs/configuration/custom-reports/#verbosity)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-increase-verbosity)\\] - _easier troubleshooting with verbose mode enabled_\n- **Debug:** replay directly on the minimal counterexample \\[[tutorial](https://fast-check.dev/docs/tutorials/quick-start/read-test-reports/#how-to-re-run)\\] - _no need to replay the whole sequence, you get directly the counterexample_\n- **Debug:** custom examples in addition of generated ones \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#run-against-custom-values)\\] - _no need to duplicate the code to play the property on custom examples_\n- **Debug:** logger per predicate run \\[[more](https://fast-check.dev/docs/core-blocks/arbitraries/others/#context)\\] - _simplify your troubleshoot with fc.context and its logging feature_\n- **Unique:** model based approach \\[[more](https://fast-check.dev/docs/advanced/model-based-testing/)\\]\\[[article](https://medium.com/criteo-labs/detecting-the-unexpected-in-web-ui-fuzzing-1f3822c8a3a5)\\] - _use the power of property based testing to test UI, APIs or state machines_\n- **Unique:** detect race conditions in your code \\[[more](https://fast-check.dev/docs/advanced/race-conditions/)\\]\\[[tutorial](https://fast-check.dev/docs/tutorials/detect-race-conditions/)\\] - _shuffle the way your promises and async calls resolve using the power of property based testing to detect races_\n- **Unique:** simplify user definable corner cases \\[[more](https://fast-check.dev/docs/configuration/user-definable-values/#shrink-custom-values)\\] - _simplify bug resolution by asking fast-check if it can find an even simpler corner case_\n\nFor more details, refer to the documentation in the links above.\n\n### Trusted\n\nfast-check has been trusted for years by big projects like: [jest](https://github.com/jestjs/jest), [jasmine](https://github.com/jasmine/jasmine), [fp-ts](https://github.com/gcanti/fp-ts), [io-ts](https://github.com/gcanti/io-ts), [ramda](https://github.com/ramda/ramda), [js-yaml](https://github.com/nodeca/js-yaml), [query-string](https://github.com/sindresorhus/query-string)...\n\n### Powerful\n\nIt also proved useful in finding bugs among major open source projects such as [jest](https://github.com/jestjs/jest), [query-string](https://github.com/sindresorhus/query-string)... and [many others](https://fast-check.dev/docs/introduction/track-record/).\n\n## Compatibility\n\nHere are the minimal requirements to use fast-check properly without any polyfills:\n\n| fast-check | node                   | ECMAScript version | _TypeScript (optional)_ |\n| ---------- | ---------------------- | ------------------ | ----------------------- |\n| **5.x**    | ≥22.12.0               | ES2025             | ≥5.8                    |\n| **4.x**    | ≥12.17.0<sup>(1)</sup> | ES2020             | ≥5.0                    |\n| **3.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥4.1<sup>(3)</sup>      |\n| **2.x**    | ≥8<sup>(2)</sup>       | ES2017             | ≥3.2<sup>(4)</sup>      |\n| **1.x**    | ≥0.12<sup>(2)</sup>    | ES3                | ≥3.0<sup>(4)</sup>      |\n\n<details>\n<summary>More details...</summary>\n\n1. Even if version 12.x should support most of the ES2020 features that will be leveraged by the version 4, we recommend relying at least on version 14.x of Node as it supports all the targeted specification. In addition, we highly encourage switching to still supported LTS versions of Node and not sticking to unsupported versions for too long.\n2. Except for features that cannot be polyfilled - such as `bigint`-related ones - all the capabilities of fast-check should be usable given you use at least the minimal recommended version of node associated to your major of fast-check.\n3. Require either lib or target ≥ ES2020 or `@types/node` to be installed.\n4. Require either lib or target ≥ ES2015 or `@types/node` to be installed.\n\n</details>\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dubzzz\"><img src=\"https://avatars.githubusercontent.com/u/5300235?v=4?s=100\" width=\"100px;\" alt=\"Nicolas DUBIEN\"/><br /><sub><b>Nicolas DUBIEN</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=dubzzz\" title=\"Tests\">⚠️</a> <a href=\"#infra-dubzzz\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a> <a href=\"#design-dubzzz\" title=\"Design\">🎨</a> <a href=\"#maintenance-dubzzz\" title=\"Maintenance\">🚧</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/hath995\"><img src=\"https://avatars.githubusercontent.com/u/381037?v=4?s=100\" width=\"100px;\" alt=\"Aaron Elligsen\"/><br /><sub><b>Aaron Elligsen</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=hath995\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/willheslam\"><img src=\"https://avatars.githubusercontent.com/u/5377213?v=4?s=100\" width=\"100px;\" alt=\"Will Heslam\"/><br /><sub><b>Will Heslam</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=willheslam\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/kazchimo\"><img src=\"https://avatars.githubusercontent.com/u/31263328?v=4?s=100\" width=\"100px;\" alt=\"kazchimo\"/><br /><sub><b>kazchimo</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=kazchimo\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brandon-leapyear\"><img src=\"https://avatars.githubusercontent.com/u/27799541?v=4?s=100\" width=\"100px;\" alt=\"Brandon Chinn\"/><br /><sub><b>Brandon Chinn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brandon-leapyear\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://safareli.github.io/resume/\"><img src=\"https://avatars.githubusercontent.com/u/1932383?v=4?s=100\" width=\"100px;\" alt=\"Irakli Safareli\"/><br /><sub><b>Irakli Safareli</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=safareli\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/TheSpyder\"><img src=\"https://avatars.githubusercontent.com/u/298292?v=4?s=100\" width=\"100px;\" alt=\"Andrew Herron\"/><br /><sub><b>Andrew Herron</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TheSpyder\" title=\"Documentation\">📖</a> <a href=\"#plugin-TheSpyder\" title=\"Plugin/utility libraries\">🔌</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/EricCrosson\"><img src=\"https://avatars.githubusercontent.com/u/1596818?v=4?s=100\" width=\"100px;\" alt=\"Eric Crosson\"/><br /><sub><b>Eric Crosson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=EricCrosson\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/burrscurr\"><img src=\"https://avatars.githubusercontent.com/u/23213508?v=4?s=100\" width=\"100px;\" alt=\"burrscurr\"/><br /><sub><b>burrscurr</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=burrscurr\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.dijonkitchen.org/\"><img src=\"https://avatars.githubusercontent.com/u/11434205?v=4?s=100\" width=\"100px;\" alt=\"JC (Jonathan Chen)\"/><br /><sub><b>JC (Jonathan Chen)</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dijonkitchen\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fixate.it/\"><img src=\"https://avatars.githubusercontent.com/u/1510520?v=4?s=100\" width=\"100px;\" alt=\"Larry Botha\"/><br /><sub><b>Larry Botha</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=larrybotha\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://epa.ms/RomanGusev\"><img src=\"https://avatars.githubusercontent.com/u/5839225?v=4?s=100\" width=\"100px;\" alt=\"Roman Gusev\"/><br /><sub><b>Roman Gusev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=102\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://timwis.com/\"><img src=\"https://avatars.githubusercontent.com/u/761444?v=4?s=100\" width=\"100px;\" alt=\"Tim Wisniewski\"/><br /><sub><b>Tim Wisniewski</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=timwis\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://world.hey.com/brais\"><img src=\"https://avatars.githubusercontent.com/u/17855450?v=4?s=100\" width=\"100px;\" alt=\"Brais Piñeiro\"/><br /><sub><b>Brais Piñeiro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=brapifra\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/brds\"><img src=\"https://avatars.githubusercontent.com/u/118620?v=4?s=100\" width=\"100px;\" alt=\"Renaud-Pierre Bordes\"/><br /><sub><b>Renaud-Pierre Bordes</b></sub></a><br /><a href=\"#design-brds\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/fwip\"><img src=\"https://avatars.githubusercontent.com/u/190414?v=4?s=100\" width=\"100px;\" alt=\"Jemma Nelson\"/><br /><sub><b>Jemma Nelson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=fwip\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://fullof.bs/\"><img src=\"https://avatars.githubusercontent.com/u/77482?v=4?s=100\" width=\"100px;\" alt=\"John Haugeland\"/><br /><sub><b>John Haugeland</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=StoneCypher\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/treydavis\"><img src=\"https://avatars.githubusercontent.com/u/1691239?v=4?s=100\" width=\"100px;\" alt=\"Trey Davis\"/><br /><sub><b>Trey Davis</b></sub></a><br /><a href=\"#design-treydavis\" title=\"Design\">🎨</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://leonzalion.com/\"><img src=\"https://avatars.githubusercontent.com/u/36966635?v=4?s=100\" width=\"100px;\" alt=\"Leon Si\"/><br /><sub><b>Leon Si</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=leonzalion\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://spion.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/502412?v=4?s=100\" width=\"100px;\" alt=\"Gorgi Kosev\"/><br /><sub><b>Gorgi Kosev</b></sub></a><br /><a href=\"#infra-spion\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/mayconsacht\"><img src=\"https://avatars.githubusercontent.com/u/5214042?v=4?s=100\" width=\"100px;\" alt=\"mayconsacht\"/><br /><sub><b>mayconsacht</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=mayconsacht\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/paldepind\"><img src=\"https://avatars.githubusercontent.com/u/521604?v=4?s=100\" width=\"100px;\" alt=\"Simon Friis Vindum\"/><br /><sub><b>Simon Friis Vindum</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=paldepind\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://twitter.com/gibson042\"><img src=\"https://avatars.githubusercontent.com/u/1199584?v=4?s=100\" width=\"100px;\" alt=\"Richard Gibson\"/><br /><sub><b>Richard Gibson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gibson042\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://alanharper.com.au/\"><img src=\"https://avatars.githubusercontent.com/u/475?v=4?s=100\" width=\"100px;\" alt=\"Alan Harper\"/><br /><sub><b>Alan Harper</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=aussiegeek\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Osman-Sodefa\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Osman-Sodefa\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/sommd\"><img src=\"https://avatars.githubusercontent.com/u/7817485?v=4?s=100\" width=\"100px;\" alt=\"David Sommerich\"/><br /><sub><b>David Sommerich</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=sommd\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/diegopedro94\"><img src=\"https://avatars.githubusercontent.com/u/7157796?v=4?s=100\" width=\"100px;\" alt=\"Diego Pedro\"/><br /><sub><b>Diego Pedro</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=diegopedro94\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/BoruiGu\"><img src=\"https://avatars.githubusercontent.com/u/8686167?v=4?s=100\" width=\"100px;\" alt=\"Borui Gu\"/><br /><sub><b>Borui Gu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=BoruiGu\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/eventualbuddha\"><img src=\"https://avatars.githubusercontent.com/u/1938?v=4?s=100\" width=\"100px;\" alt=\"Brian Donovan\"/><br /><sub><b>Brian Donovan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=eventualbuddha\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/volrk\"><img src=\"https://avatars.githubusercontent.com/u/32265974?v=4?s=100\" width=\"100px;\" alt=\"volrk\"/><br /><sub><b>volrk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=volrk\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tinydylan\"><img src=\"https://avatars.githubusercontent.com/u/41112113?v=4?s=100\" width=\"100px;\" alt=\"tinydylan\"/><br /><sub><b>tinydylan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=tinydylan\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jasikpark\"><img src=\"https://avatars.githubusercontent.com/u/10626596?v=4?s=100\" width=\"100px;\" alt=\"Caleb Jasik\"/><br /><sub><b>Caleb Jasik</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jasikpark\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rulai-hu\"><img src=\"https://avatars.githubusercontent.com/u/2570932?v=4?s=100\" width=\"100px;\" alt=\"Rulai Hu\"/><br /><sub><b>Rulai Hu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rulai-hu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/afonsojramos\"><img src=\"https://avatars.githubusercontent.com/u/19473034?v=4?s=100\" width=\"100px;\" alt=\"Afonso Jorge Ramos\"/><br /><sub><b>Afonso Jorge Ramos</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=afonsojramos\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tjenkinson.me/\"><img src=\"https://avatars.githubusercontent.com/u/3259993?v=4?s=100\" width=\"100px;\" alt=\"Tom Jenkinson\"/><br /><sub><b>Tom Jenkinson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tjenkinson\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/phormio\"><img src=\"https://avatars.githubusercontent.com/u/28146332?v=4?s=100\" width=\"100px;\" alt=\"phormio\"/><br /><sub><b>phormio</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=phormio\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://buildo.io/\"><img src=\"https://avatars.githubusercontent.com/u/2643520?v=4?s=100\" width=\"100px;\" alt=\"Giovanni Gonzaga\"/><br /><sub><b>Giovanni Gonzaga</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=giogonzo\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://caurea.org/\"><img src=\"https://avatars.githubusercontent.com/u/34538?v=4?s=100\" width=\"100px;\" alt=\"Tomas Carnecky\"/><br /><sub><b>Tomas Carnecky</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=wereHamster\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/Djaler\"><img src=\"https://avatars.githubusercontent.com/u/7964583?v=4?s=100\" width=\"100px;\" alt=\"Kirill Romanov\"/><br /><sub><b>Kirill Romanov</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=Djaler\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://giovannyg.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/5326411?v=4?s=100\" width=\"100px;\" alt=\"Giovanny González\"/><br /><sub><b>Giovanny González</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=giovannyg\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/markkulube\"><img src=\"https://avatars.githubusercontent.com/u/34955942?v=4?s=100\" width=\"100px;\" alt=\"Mark Kulube\"/><br /><sub><b>Mark Kulube</b></sub></a><br /><a href=\"#infra-markkulube\" title=\"Infrastructure (Hosting, Build-Tools, etc)\">🚇</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.undiscoveredfeatures.com/\"><img src=\"https://avatars.githubusercontent.com/u/354848?v=4?s=100\" width=\"100px;\" alt=\"Peter Hamilton\"/><br /><sub><b>Peter Hamilton</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=hamiltop\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ChineduOzodi\"><img src=\"https://avatars.githubusercontent.com/u/11678369?v=4?s=100\" width=\"100px;\" alt=\"Chinedu Ozodi\"/><br /><sub><b>Chinedu Ozodi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ChineduOzodi\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gunar\"><img src=\"https://avatars.githubusercontent.com/u/7684574?v=4?s=100\" width=\"100px;\" alt=\"Gunar Gessner\"/><br /><sub><b>Gunar Gessner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gunar\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CSBatchelor\"><img src=\"https://avatars.githubusercontent.com/u/18668440?v=4?s=100\" width=\"100px;\" alt=\"Christian Batchelor\"/><br /><sub><b>Christian Batchelor</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CSBatchelor\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://tomeraberba.ch/\"><img src=\"https://avatars.githubusercontent.com/u/23299544?v=4?s=100\" width=\"100px;\" alt=\"Tomer Aberbach\"/><br /><sub><b>Tomer Aberbach</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=TomerAberbach\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/0xflotus\"><img src=\"https://avatars.githubusercontent.com/u/26602940?v=4?s=100\" width=\"100px;\" alt=\"0xflotus\"/><br /><sub><b>0xflotus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=0xflotus\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/CodeLenny\"><img src=\"https://avatars.githubusercontent.com/u/9272847?v=4?s=100\" width=\"100px;\" alt=\"Ryan Leonard\"/><br /><sub><b>Ryan Leonard</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=CodeLenny\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://blog.bitjson.com/\"><img src=\"https://avatars.githubusercontent.com/u/904007?v=4?s=100\" width=\"100px;\" alt=\"Jason Dreyzehner\"/><br /><sub><b>Jason Dreyzehner</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=bitjson\" title=\"Tests\">⚠️</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://matinzd.dev/\"><img src=\"https://avatars.githubusercontent.com/u/24797481?v=4?s=100\" width=\"100px;\" alt=\"Matin Zadeh Dolatabad\"/><br /><sub><b>Matin Zadeh Dolatabad</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matinzd\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://goo.gl/IlWG8U\"><img src=\"https://avatars.githubusercontent.com/u/500?v=4?s=100\" width=\"100px;\" alt=\"Juan Julián Merelo Guervós\"/><br /><sub><b>Juan Julián Merelo Guervós</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=JJ\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/SimenB\"><img src=\"https://avatars.githubusercontent.com/u/1404810?v=4?s=100\" width=\"100px;\" alt=\"Simen Bekkhus\"/><br /><sub><b>Simen Bekkhus</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=SimenB\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/tskj\"><img src=\"https://avatars.githubusercontent.com/u/25415972?v=4?s=100\" width=\"100px;\" alt=\"Tarjei Skjærset\"/><br /><sub><b>Tarjei Skjærset</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=tskj\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://denisgorbachev.com/\"><img src=\"https://avatars.githubusercontent.com/u/829578?v=4?s=100\" width=\"100px;\" alt=\"Denis Gorbachev\"/><br /><sub><b>Denis Gorbachev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=DenisGorbachev\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://senocular.github.io/\"><img src=\"https://avatars.githubusercontent.com/u/3536716?v=4?s=100\" width=\"100px;\" alt=\"Trevor McCauley\"/><br /><sub><b>Trevor McCauley</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=senocular\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://grantkiely.com/\"><img src=\"https://avatars.githubusercontent.com/u/1948935?v=4?s=100\" width=\"100px;\" alt=\"Grant Kiely\"/><br /><sub><b>Grant Kiely</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gkiely\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/vecerek\"><img src=\"https://avatars.githubusercontent.com/u/5737996?v=4?s=100\" width=\"100px;\" alt=\"Attila Večerek\"/><br /><sub><b>Attila Večerek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=vecerek\" title=\"Tests\">⚠️</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"http://www.zachbjornson.com/\"><img src=\"https://avatars.githubusercontent.com/u/469365?v=4?s=100\" width=\"100px;\" alt=\"Zach Bjornson\"/><br /><sub><b>Zach Bjornson</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zbjornson\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/bennettp123\"><img src=\"https://avatars.githubusercontent.com/u/1610227?v=4?s=100\" width=\"100px;\" alt=\"Bennett Perkins\"/><br /><sub><b>Bennett Perkins</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=bennettp123\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nielk\"><img src=\"https://avatars.githubusercontent.com/u/4980521?v=4?s=100\" width=\"100px;\" alt=\"Alexandre Oger\"/><br /><sub><b>Alexandre Oger</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=nielk\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/ej-shafran\"><img src=\"https://avatars.githubusercontent.com/u/116496520?v=4?s=100\" width=\"100px;\" alt=\"ej shafran\"/><br /><sub><b>ej shafran</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ej-shafran\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/gruhn\"><img src=\"https://avatars.githubusercontent.com/u/26570572?v=4?s=100\" width=\"100px;\" alt=\"Niklas Gruhn\"/><br /><sub><b>Niklas Gruhn</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=gruhn\" title=\"Code\">💻</a> <a href=\"#question-gruhn\" title=\"Answering Questions\">💬</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://patrickroza.com/\"><img src=\"https://avatars.githubusercontent.com/u/42661?v=4?s=100\" width=\"100px;\" alt=\"Patrick Roza\"/><br /><sub><b>Patrick Roza</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=patroza\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/cindywu\"><img src=\"https://avatars.githubusercontent.com/u/1177031?v=4?s=100\" width=\"100px;\" alt=\"Cindy Wu\"/><br /><sub><b>Cindy Wu</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=cindywu\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/nmay231\"><img src=\"https://avatars.githubusercontent.com/u/35386821?v=4?s=100\" width=\"100px;\" alt=\"Noah\"/><br /><sub><b>Noah</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=nmay231\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/jamesbvaughan\"><img src=\"https://avatars.githubusercontent.com/u/2906913?v=4?s=100\" width=\"100px;\" alt=\"James Vaughan\"/><br /><sub><b>James Vaughan</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Documentation\">📖</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=jamesbvaughan\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/AlexErrant\"><img src=\"https://avatars.githubusercontent.com/u/109672176?v=4?s=100\" width=\"100px;\" alt=\"Alex Errant\"/><br /><sub><b>Alex Errant</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=AlexErrant\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://ahrjarrett.com/\"><img src=\"https://avatars.githubusercontent.com/u/15133992?v=4?s=100\" width=\"100px;\" alt=\"andrew jarrett\"/><br /><sub><b>andrew jarrett</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=ahrjarrett\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/matthyk\"><img src=\"https://avatars.githubusercontent.com/u/53833818?v=4?s=100\" width=\"100px;\" alt=\"Matthias Keckl\"/><br /><sub><b>Matthias Keckl</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=matthyk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/dmurvihill\"><img src=\"https://avatars.githubusercontent.com/u/1649120?v=4?s=100\" width=\"100px;\" alt=\"Dolan Murvihill\"/><br /><sub><b>Dolan Murvihill</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=dmurvihill\" title=\"Code\">💻</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/emilianbold\"><img src=\"https://avatars.githubusercontent.com/u/991554?v=4?s=100\" width=\"100px;\" alt=\"Emi\"/><br /><sub><b>Emi</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=emilianbold\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://www.russbiggs.com/\"><img src=\"https://avatars.githubusercontent.com/u/8487728?v=4?s=100\" width=\"100px;\" alt=\"Russ Biggs\"/><br /><sub><b>Russ Biggs</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=russbiggs\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/adamni21\"><img src=\"https://avatars.githubusercontent.com/u/85580454?v=4?s=100\" width=\"100px;\" alt=\"adamni21\"/><br /><sub><b>adamni21</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=adamni21\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/josephjunker\"><img src=\"https://avatars.githubusercontent.com/u/1519098?v=4?s=100\" width=\"100px;\" alt=\"Joseph Junker\"/><br /><sub><b>Joseph Junker</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=josephjunker\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rushelex\"><img src=\"https://avatars.githubusercontent.com/u/41122157?v=4?s=100\" width=\"100px;\" alt=\"Aleksey Shelementev\"/><br /><sub><b>Aleksey Shelementev</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rushelex\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/rugk\"><img src=\"https://avatars.githubusercontent.com/u/11966684?v=4?s=100\" width=\"100px;\" alt=\"rugk\"/><br /><sub><b>rugk</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=rugk\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/makeeno\"><img src=\"https://avatars.githubusercontent.com/u/90332566?v=4?s=100\" width=\"100px;\" alt=\"Makien Osman\"/><br /><sub><b>Makien Osman</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=makeeno\" title=\"Documentation\">📖</a></td>\n    </tr>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jneidel.com/\"><img src=\"https://avatars.githubusercontent.com/u/25589715?v=4?s=100\" width=\"100px;\" alt=\"Jonathan Neidel\"/><br /><sub><b>Jonathan Neidel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jneidel\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://jkomyno.dev/\"><img src=\"https://avatars.githubusercontent.com/u/12381818?v=4?s=100\" width=\"100px;\" alt=\"Alberto Schiabel\"/><br /><sub><b>Alberto Schiabel</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=jkomyno\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/zek\"><img src=\"https://avatars.githubusercontent.com/u/3463291?v=4?s=100\" width=\"100px;\" alt=\"Zek\"/><br /><sub><b>Zek</b></sub></a><br /><a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Code\">💻</a> <a href=\"https://github.com/dubzzz/fast-check/commits?author=zek\" title=\"Tests\">⚠️</a></td>\n    </tr>\n  </tbody>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! [Become one of them](CONTRIBUTING.md)\n\n## Sponsors 💸\n\nMany individuals and companies offer their financial support to the project, a huge thanks to all of them too 💓\n\n<a href=\"https://github.com/sponsors/dubzzz\"><img align=\"center\" src=\"https://raw.githubusercontent.com/dubzzz/sponsors-svg/main/sponsorkit/sponsors.svg\" alt=\"all sponsors\" /></a>\n\nYou can also become one of them by contributing via [GitHub Sponsors](https://github.com/sponsors/dubzzz) or [OpenCollective](https://opencollective.com/fast-check/contribute).\n\n<!-- File: packages/jest/README.md (Tokens: ~1812 | Category: plugin-manifest) -->\n# `@fast-check/jest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Jest.\n`@fast-check/jest` simplifies the integration of `fast-check` into Jest testing framework.\n\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fjest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/jest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fjest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fjest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/jest`:\n\n```bash\nnpm install --save-dev @fast-check/jest\n```\n\nIn order to work properly, `@fast-check/jest` requires `jest` to be installed.\n\nWe also highly recommend users to launch their tests using the `--show-seed` option provided by Jest. It ensures Jest will always print the seed by itself (requires Jest ≥29.2.0).\n\n```sh\njest --show-seed\n```\n\n## Example\n\n```javascript\nimport { test, fc } from '@fast-check/jest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// Or the exact same test but based on named parameters\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nThe `it` and `test` functions returned by `@fast-check/jest` are just enriched versions of the ones coming from `jest` itself. They both come with `.prop`.\n\nPlease note that the properties accepted by `@fast-check/jest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances). In other words, the predicate passed as the last argument can be asynchronous.\n\n**Remark:** `it` and `test` have been introduced in 1.4.0. You have to refer to [Deprecated API](#deprecated-api) if you are using a version of `@fast-check/jest` <1.4.0.\n\n## Advanced\n\n### Support for variations of `test` and `it`\n\nIf you want to forward custom parameters to `fast-check`, `test.prop` and its variants accept an optional `fc.Parameters` ([more](https://fast-check.dev/docs/core-blocks/runners/#assert)).\n\n`@fast-check/jest` also comes with support for `.only`, `.skip`, `.todo` and `.concurrent` from `jest`. It also accepts more complex ones such as `.concurrent.failing` or `.concurrent.only.failing`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/jest';\n\n// With custom `fc.Parameters`, here { seed: 4242 }\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\n// With .skip\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\n// With it version\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n### Experimental worker-based runner\n\n**The following feature is experimental!** When used it makes runners able to kill long running synchonous code. Meaning that it will make fast-check able to kill infinite loops blocking the main thread. So far, the feature does not fully support transformations performed via transform steps defined with jest.\n\nThe CommonJS approach would be:\n\n```js\nconst { init, fc } = require('@fast-check/jest/worker');\nconst { pathToFileURL } = require('node:url');\n\nconst { test, expect } = init(pathToFileURL(__filename));\n// can also be passed options such as isolationLevel: init(pathToFileURL(__filename), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\nThe ES Modules approach would be:\n\n```js\nimport { init, fc } from '@fast-check/jest/worker';\n\nconst { test, expect } = await init(new URL(import.meta.url));\n// can also be passed options such as isolationLevel: init(new URL(import.meta.url), {})\n\ntest.prop([fc.constant(null)])('should pass', (value) => {\n  expect(value).toBe(null);\n});\n```\n\n⚠️ Do not forget to add the `await` before `init` for the ES Module version!\n\n#### Extra setup for `@fast-check/worker` 0.6.0 and later\n\nSince `@fast-check/worker` is an ESM-only package, running it under Jest in CommonJS mode requires `babel-jest` to transpile it. Install the following dependencies:\n\n```bash\nnpm install --save-dev babel-jest @babel/core @babel/preset-env\n```\n\nThen add a `babel.config.cjs` at the root of your project:\n\n```js\nmodule.exports = {\n  presets: [['@babel/preset-env', { targets: { node: 'current' }, modules: 'commonjs' }]],\n};\n```\n\nAnd update your Jest configuration to use `babel-jest` while excluding `@fast-check/worker` from the ignore patterns:\n\n```js\nmodule.exports = {\n  transform: {\n    '^.+\\\\.[t|j]sx?$': 'babel-jest',\n  },\n  transformIgnorePatterns: ['/node_modules/(?!(?:@fast-check/worker)/)'],\n};\n```\n\nThis ensures `@fast-check/worker` gets transpiled to CommonJS by Babel instead of being skipped. Without it, Jest will fail to load the ESM-only package.\n\nFor ES Modules mode, no extra setup is needed — just make sure to run Jest with `--experimental-vm-modules`:\n\n```bash\nnode --experimental-vm-modules node_modules/jest/bin/jest.js\n```\n\n## Minimal requirements\n\n| @fast-check/jest | jest                                    | fast-check | node                                                                                  |\n| ---------------- | --------------------------------------- | ---------- | ------------------------------------------------------------------------------------- |\n| ^2.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n| ^1.0.0           | &gt;=26.5.0<sup>(1)</sup><sup>(2)</sup> | ^3.0.0     | &gt;=14.15.0<sup>(3)</sup> and &lt;18, &gt;=18.17.0 and &lt;19<sup>(4)</sup>, &gt;=20 |\n\n- (1) any version of `jest` should be greater or equal than 26.5.0 if you are using `commonjs`\n- (2) in order to use `esm` build, you may need to enable experimental features of node, see [here](https://github.com/dubzzz/fast-check/blob/main/packages/test-jest-bundle-esm/package.json)\n- (3) &gt;=14.15.0 is the minimal requirements for `jest`, &gt;=12.17.0 is the one for `@fast-check/jest`\n- (4) timeout defined on jest might not be properly applied to fast-check for node 18 (until 18.17.0) and node 19, see [#4004](https://github.com/dubzzz/fast-check/pull/4004)\n\n<!-- File: packages/packaged/README.md (Tokens: ~700 | Category: plugin-manifest) -->\n# `@fast-check/packaged`\n\nUtility package removing any files that will not be part of the final bundle published to npm registry\n\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpackaged.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/packaged\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpackaged\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/packaged/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpackaged.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nWhen publishing packages to npm registry, it is quite easy to forget about some files. It also happens many times that we want somehow to check the packaged bundle in some of our tests but totally forget that some files have not been added to the bundle and so that the final user will actually never be able to run this code.\n\nThis package mostly try to prevent this issue. It can easily be used in monorepos to emulate the bundled package when used against other packages of the monorepo to make sure others do not depend on internals or non published stuff.\n\n## Easy to use\n\nRun the following command at the root of your package to drop any file that will not make it in the final bundle published to npm.\n\n```bash\n# With npm\nnpx -p @fast-check/packaged packaged\n# With pnpm\npnpm --package=@fast-check/packaged dlx packaged\n# With yarn\nyarn dlx -p @fast-check/packaged packaged\n```\n\n⚠️ You may want to try with `--dry-run` flag first to give it a try.\n\nIt also comes with some extra flags:\n\n- `--dry-run`: do not drop any file or directory from the file system and only print what would have been removed\n- `--keep <name>`: keep a root-level file or directory matching the exact name (not a glob pattern, can be specified multiple times, e.g. `--keep node_modules --keep src`)\n\n## Simple API\n\n```js\nimport { computePublishedFiles, removeNonPublishedFiles } from '@fast-check/packaged';\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at .\nconst publishedFilesRoot = await computePublishedFiles('.');\n\n// Compute the list of all files that would be part of the bundle\n// if we attempted to publish the packge defined at ./sub-directory\nconst publishedFilesSubDirectory = await computePublishedFiles('./sub-directory');\n\n// Run the deletion of unwanted files\nconst { kept, removed } = await removeNonPublishedFiles('.', { dryRun: false, keep: [] });\n// kept and removed are arrays of strings\n// they may contain files or directories\n```\n\n## Minimal requirements\n\n| @fast-check/packaged | node                   |\n| -------------------- | ---------------------- |\n| **0.6.x**            | ≥20.19.0<sup>(1)</sup> |\n\n<details>\n<summary>More details...</summary>\n\n1. Requires support for `require(esm)`.\n\n</details>\n\n<!-- File: packages/poisoning/README.md (Tokens: ~347 | Category: plugin-manifest) -->\n# `@fast-check/poisoning`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nSet of utilities to ease detection and revert of poisoning\n\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://badge.fury.io/js/@fast-check%2Fpoisoning.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/poisoning\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fpoisoning\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/poisoning/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fpoisoning.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\nIn JavaScript, \"prototype poisoning\" is one of the most common source for CVEs or zero days. It allows attackers to change the behaviour of some defaults like `Array.prototype.map`, `Map`, `Set`... so that they behave differently and can be leveraged for evil stuffs. This package can be used in addition to `fast-check` in order to detect poisoning that may occur during your property based tests.\n\n## Easy to use\n\nThe package comes with:\n\n- `assertNoPoisoning`: assert that the defaults known when first importing the package in your code have not been changed\n- `restoreGlobals`: restore the defaults so that any change that could have been detected by `assertNoPoisoning` will be resolved\n\n## Minimal requirements\n\n- Node ≥20.19.0\n\n<!-- File: packages/vitest/README.md (Tokens: ~1647 | Category: plugin-manifest) -->\n# `@fast-check/vitest`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nBring the power of property based testing framework `fast-check` into Vitest.\n`@fast-check/vitest` simplifies the integration of `fast-check` into Vitest.\n\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://badge.fury.io/js/@fast-check%2Fvitest.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/vitest\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fvitest\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/jest/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fvitest.svg\" alt=\"License\" /></a>\n\n---\n\n## Getting Started\n\nInstall `@fast-check/vitest`:\n\n```bash\nnpm install --save-dev @fast-check/vitest\n```\n\nIn order to work properly, `@fast-check/vitest` requires `vitest` to be installed.\n\n## Examples\n\nThe library comes with two modes, both powered by fast-check:\n\n- One-time random mode – A lightweight approach that introduces controlled randomness into your tests while keeping runs reproducible.\n- Property-based testing mode – A full-fledged property-based testing approach leveraging the full capabilities of fast-check.\n\n### One-time random mode\n\nThis mode extends Vitest's default `test` and `it` functions, allowing you to introduce controlled randomness into your tests while ensuring failures remain reproducible. This makes it easier to debug flaky tests and avoid irreproducible failures due to randomness.\n\nUnlike property-based testing, this mode does not run tests multiple times or attempt shrinking when failures occur. Instead, it provides a determistic way to introduce randomness when needed.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\nimport { expect } from 'vitest';\n\n// You can provide a fixed seed to force a replay by adding this line:\n// >>  fc.configureGlobal({ seed })\n// Eventually you can disable shrinking capabilities with:\n// >>  fc.configureGlobal({ endOnFailure: false })\n// >>  // or combine it with the one above if you need both\n\ntest('test relying on randomness', ({ g }) => {\n  // Arrange\n  const user = {\n    firstName: g(fc.string),\n    lastName: g(fc.string),\n  };\n\n  // Act\n  const displayName = computeDisplayName(user);\n\n  // Assert\n  expect(displayName).toContain(user.firstName);\n});\n\ntest('test not relying on randomness', () => {\n  // your test\n});\n```\n\n### Full property-based mode\n\nFor more extensive testing, `@fast-check/vitest` also provides full support for property-based testing. This mode enables exhaustive, randomized testing by generating a variety of inputs and detecting edge cases automatically.\n\n```javascript\nimport { test, fc } from '@fast-check/vitest';\n\n// for all a, b, c strings\n// b is a substring of a + b + c\ntest.prop([fc.string(), fc.string(), fc.string()])('should detect the substring', (a, b, c) => {\n  return (a + b + c).includes(b);\n});\n\n// same property but using named values\ntest.prop({ a: fc.string(), b: fc.string(), c: fc.string() })('should detect the substring', ({ a, b, c }) => {\n  return (a + b + c).includes(b);\n});\n```\n\nPlease note that the properties accepted by `@fast-check/vitest` as input can either be synchronous or asynchronous (even just `PromiseLike` instances).\n\n### Seamless integration with Vitest's `beforeEach` / `afterEach`\n\nVitest's `beforeEach` and `afterEach` hooks are natively integrated into predicates. They are called respectively before and after each execution of the predicate. If a predicate runs _n_ times, `beforeEach` will be called _n_ times before it and `afterEach` _n_ times after it. The only caveat is that cleanup functions returned by `beforeEach` on the first predicate execution are deferred until the end of the test, as they are handled by vitest's own teardown mechanism. All other cleanups run between predicate executions as expected.\n\n### Advanced\n\nIf you want to forward custom parameters to fast-check, `test.prop` accepts an optional `fc.Parameters` ([more](https://github.com/dubzzz/fast-check/blob/main/documentation/1-Guides/Runners.md#runners)).\n\n`@fast-check/vitest` also comes with `.only`, `.skip`, `.todo` and `.concurrent` from vitest. It also accepts more complex ones such as `.concurrent.skip`.\n\n```javascript\nimport { it, test, fc } from '@fast-check/vitest';\n\ntest.prop([fc.nat(), fc.nat()], { seed: 4242 })('should replay the test for the seed 4242', (a, b) => {\n  return a + b === b + a;\n});\n\ntest.skip.prop([fc.string()])('should be skipped', (text) => {\n  return text.length === [...text].length;\n});\n\ndescribe('with it', () => {\n  it.prop([fc.nat(), fc.nat()])('should run too', (a, b) => {\n    return a + b === b + a;\n  });\n});\n```\n\n## Minimal requirements\n\n| @fast-check/vitest | vitest                                                              | fast-check                       | Node                                                                   |\n| ------------------ | ------------------------------------------------------------------- | -------------------------------- | ---------------------------------------------------------------------- |\n| **0.4**            | ^4.1.0 \\|\\| ^5.0.0                                                  | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup> (Vitest 4)<br>≥22.12.0<sup>(2)</sup> (Vitest 5) |\n| **0.3**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4                                          | ^3.0.0 \\|\\| ^4.0.0               | ≥20.19.0<sup>(2)</sup>                                                 |\n| **0.2**            | ^1 \\|\\| ^2 \\|\\| ^3 \\|\\| ^4<sup>(1)</sup>                            | ^3.0.0 \\|\\| ^4.0.0               | ≥18<sup>(3)</sup>                                                      |\n| **0.1**            | >=0.28.1 <1.0.0 \\|\\| ^1 \\|\\| ^2<sup>(4)</sup> \\|\\| ^3<sup>(5)</sup> | ^3.0.0 \\|\\| ^4.0.0<sup>(6)</sup> | ≥14.16.0<sup>(3)</sup>                                                 |\n| **0.0**            | >=0.28.1 <1.0.0 \\|\\| ^1                                             | ^3.0.0                           | ≥14.16.0<sup>(3)</sup>                                                 |\n\n<details>\n<summary>More details...</summary>\n\n1. Official support for version 4.x of vitest starts at 0.2.3.\n2. Requires support for `require(esm)`.\n3. Same support as vitest.\n4. Official support for version 2.x of vitest starts at 0.1.2.\n5. Official support for version 3.x of vitest starts at 0.1.5.\n6. Official support for version 4.x of fast-check starts at 0.1.6.\n\n</details>\n\n<!-- File: packages/worker/README.md (Tokens: ~1056 | Category: plugin-manifest) -->\n# `@fast-check/worker`\n\n![fast-check logo](https://fast-check.dev/assets/images/logo.png)\n\nProvide built-ins to run predicates directly within dedicated workers\n\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://badge.fury.io/js/@fast-check%2Fworker.svg\" alt=\"npm version\" /></a>\n<a href=\"https://npmx.dev/package/@fast-check/worker\"><img src=\"https://img.shields.io/npm/dm/@fast-check%2Fworker\" alt=\"monthly downloads\" /></a>\n<a href=\"https://github.com/dubzzz/fast-check/blob/main/packages/worker/LICENSE\"><img src=\"https://img.shields.io/npm/l/@fast-check%2Fworker.svg\" alt=\"License\" /></a>\n\n---\n\n## Why?\n\n`fast-check` alone is great but what if it led your code into an infinite and synchronous loop for such inputs? In such case, it would neither be able to shrink the issue, nor to report any for you as the single threaded philosophy at the root of JavaScript will prevent it from anything except waiting for the main thread to come back.\n\nThis package tends to provide a way to run easily your properties within dedicated workers automatically spawed by it.\n\n## Example\n\nHere are some of the changes you will have to do:\n\n- hoist properties so that they get declared on the root scope\n- replace `fc.property` by `property` coming from `propertyFor(<path-to-file>)`\n- replace `fc.assert` by `assert` coming from `@fast-check/worker` for automatic cleaning of the workers as the test ends\n- transpilation has not been addressed yet but it may probably work\n- in theory, if you were only using `propertyFor` and `assert` without any external framework for `test`, `it` and others, the separation of the property from the assertion would be useless as the check for main thread is fully handled within `@fast-check/worker` itself so no hoisting needing in such case\n\n```js\nimport { test } from '@jest/globals';\nimport * as fc from 'fast-check';\nimport { isMainThread } from 'node:worker_threads';\nimport { assert, propertyFor } from '@fast-check/worker';\n\nconst property = propertyFor(new URL(import.meta.url)); // or propertyFor(pathToFileURL(__filename)) in commonjs\nconst p1 = property(fc.nat(), fc.nat(), (start, end) => {\n  // starting a possibly infinite loop\n  for (let i = start; i !== end; ++i) {\n    // doing stuff...\n  }\n});\n\nif (isMainThread) {\n  test('should assess p1', async () => {\n    await assert(p1, { plugins: [fc.timeout(1000)] });\n  });\n}\n```\n\nRefer to the tests defined `test/main.spec.ts` for a living example of how you can use this package with a test runner such as Jest.\n\n## Extra options\n\nThe builder of properties `propertyFor` accepts a second parameter to customize how the workers will behave. By default, workers will be shared across properties. In case you want a more isolation between your runs, you can use:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { isolationLevel: 'predicate' });\n// Other values:\n// - \"file\": Re-use workers cross properties (default)\n// - \"property\": Re-use workers for each run of the predicate. Not shared across properties!\n// - \"predicate\": One worker per run of the predicate\n```\n\nBy default, workers will receive the generated values from their parent thread. In some cases, such sending is made impossible as the generated values include non-serializable pieces. In such cases, you can opt-in to generate the values directly within the workers by using:\n\n```js\nconst property = propertyFor(new URL(import.meta.url), { randomSource: 'worker' });\n// Other values:\n// - \"main-thread\": The main thread will be responsible to generate the random values and send them to the worker thread. It unfortunately cannot send any value that cannot be serialized between threads. (default)\n// - \"worker\": The worker is responsible to generate its own values based on the instructions provided by the main thread. Switching to a worker mode allows to support non-serializable values, unfortunately it drops all shrinking. capabilities.\n```\n\n## Minimal requirements\n\n- Node ≥14.18.0<sup>(1)</sup><sup>(2)</sup><sup>(3)</sup>\n- TypeScript ≥4.1 (optional)\n\n_(1): `worker_threads` alone would only require Node ≥10.5.0, but our usage of `require(node:*)` forces us to request at least Node ≥14.18.0_\n\n_(2): this package targets ES2020 specification which is quite well supported (more than 94%) by any Node ≥14.5.0_\n\n_(3): this package requires a version of node able to understand `package.json#exports`, supported by any Node ≥12.17.0_\n</yakaai_skills>"}