{"id":15117114,"url":"https://github.com/coderaiser/supertape","last_synced_at":"2026-03-09T20:07:44.146Z","repository":{"id":55550907,"uuid":"165381880","full_name":"coderaiser/supertape","owner":"coderaiser","description":"📼  Simplest high speed testing","archived":false,"fork":false,"pushed_at":"2026-03-05T15:50:38.000Z","size":872,"stargazers_count":26,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-05T18:47:28.897Z","etag":null,"topics":["async","await","diff","tape","tdd","test","try-catch"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/coderaiser.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"coderaiser","open_collective":"cloudcmd","ko_fi":"coderaiser"}},"created_at":"2019-01-12T11:47:23.000Z","updated_at":"2026-03-05T16:02:21.000Z","dependencies_parsed_at":"2023-02-10T03:45:18.566Z","dependency_job_id":"6deee299-857b-4094-ba89-d64a76ea78a9","html_url":"https://github.com/coderaiser/supertape","commit_stats":{"total_commits":791,"total_committers":5,"mean_commits":158.2,"dds":0.07838179519595445,"last_synced_commit":"77695769e0ed870d1d8dd7eea97b640b78bc9194"},"previous_names":[],"tags_count":207,"template":false,"template_full_name":null,"purl":"pkg:github/coderaiser/supertape","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coderaiser%2Fsupertape","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coderaiser%2Fsupertape/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coderaiser%2Fsupertape/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coderaiser%2Fsupertape/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/coderaiser","download_url":"https://codeload.github.com/coderaiser/supertape/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/coderaiser%2Fsupertape/sbom","scorecard":{"id":297439,"data":{"date":"2025-08-11","repo":{"name":"github.com/coderaiser/supertape","commit":"5d90bd888ea38bdb2108c8fb84c50e6f50695f2d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs-pr.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs-pr.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nodejs-pr.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs-pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs-pr.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs-pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs-pr.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs-pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nodejs.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/nodejs.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nodejs.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/nodejs.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/coderaiser/supertape/nodejs.yml/master?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/nodejs-pr.yml:1","Warn: no topLevel permission defined: .github/workflows/nodejs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-17T19:53:49.548Z","repository_id":55550907,"created_at":"2025-08-17T19:53:49.548Z","updated_at":"2025-08-17T19:53:49.548Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30210787,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T09:02:10.694Z","status":"ssl_error","status_checked_at":"2026-03-07T09:02:08.429Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","await","diff","tape","tdd","test","try-catch"],"created_at":"2024-09-26T01:45:50.543Z","updated_at":"2026-03-09T20:07:44.117Z","avatar_url":"https://github.com/coderaiser.png","language":"JavaScript","funding_links":["https://github.com/sponsors/coderaiser","https://opencollective.com/cloudcmd","https://ko-fi.com/coderaiser"],"categories":["JavaScript"],"sub_categories":[],"readme":"# 📼 Supertape [![NPM version][NPMIMGURL]][NPMURL] [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Coverage Status][CoverageIMGURL]][CoverageURL] [![License: MIT][MITLicenseIMGURL]][MITLicenseURL]\n\n[NPMURL]: https://npmjs.org/package/supertape \"npm\"\n[NPMIMGURL]: https://img.shields.io/npm/v/supertape.svg?style=flat\u0026longCache=true\n[BuildStatusURL]: https://github.com/coderaiser/supertape/actions?query=workflow%3A%22Node+CI%22 \"Build Status\"\n[BuildStatusIMGURL]: https://github.com/coderaiser/supertape/workflows/Node%20CI/badge.svg\n[BuildStatusURL]: https://travis-ci.org/coderaiser/supertape \"Build Status\"\n[CoverageURL]: https://coveralls.io/github/coderaiser/supertape?branch=master\n[CoverageIMGURL]: https://coveralls.io/repos/coderaiser/supertape/badge.svg?branch=master\u0026service=github\n[MITLicenseURL]: https://opensource.org/licenses/MIT\n[MITLicenseIMGURL]: https://img.shields.io/badge/License-MIT-green.svg\n\n[![supertape](https://asciinema.org/a/Cgc3rDOfZAeDnJSxzEYpPfBMY.svg)](https://asciinema.org/a/Cgc3rDOfZAeDnJSxzEYpPfBMY)\n\n📼 **Supertape** is [**Tape**](https://github.com/substack/tape)-inspired [`TAP`](https://testanything.org/)-compatible simplest high speed test runner with superpowers. It's designed to be as compatible as possible with **tape** while still having some key improvements, such as:\n\n- the ability to work with [ESM Modules](https://nodejs.org/api/esm.html) (take a look at [mock-import](https://github.com/coderaiser/mock-import) for mocking and 🎩[ESCover](https://github.com/coderaiser/escover) for coverage)\n- a number of [built-in pretty output formatters](#formatters)\n- the ability to [extend](#testextendextensions)\n- showing colored diff when using the [`t.equal()`](#tequalresult-any-expected-any-message-string) and [`t.deepEqual()`](#tdeepequalresult-any-expected-any-message-string) assertion operators\n- detailed stack traces for `async` functions\n- multiple [`test.only`'s](#testonlyname-cb)\n- [smart timeouts](#environment-variables) for long running tests 🏃‍♂️\n- more natural assertions: `expected, result` -\u003e `result, expected`:\n\n  ```js\n  t.equal(error.message, 'hello world', `expected error.message to be 'hello world'`);\n  ```\n- ability to generate tests with ♨️[**Speca**](https://github.com/coderaiser/speca)\n\n📼 **Supertape** doesn't contain:\n\n- assertion aliases, making the available operators far more concise;\n- `es3 code` and lots of [ponyfills](https://github.com/sindresorhus/ponyfill#how-are-ponyfills-better-than-polyfills);\n- `t.throws()`, `t.doesNotThrow()` - use [**tryCatch**](https://github.com/coderaiser/try-catch) or [**tryToCatch**](https://github.com/coderaiser/try-to-catch) with [`t.equal()`](#tequalresult-any-expected-any-message-string) instead;\n- [`t.plan()`](https://github.com/substack/tape#tplann);\n\nFor a list of all built-in assertions, see [Operators](#operators).\n\n## How 📼**Supertape** test looks like?\n\nYou can use both **CommonJS** and **ESM**, here is **ESM** example:\n\n```js\nimport {test} from 'supertape';\n\nconst sump = (a, b) =\u003e a + b;\n\ntest('calc: sum', (t) =\u003e {\n    const result = sum(1, 2);\n    const expected = 3;\n    \n    t.equal(result, expected);\n    t.end();\n});\n```\n\n## Install\n\n```\nnpm i supertape -D\n```\n\n## Usage\n\n```\nUsage: supertape [options] [path]\nOptions\n   -h, --help                  display this help and exit\n   -v, --version               output version information and exit\n   -f, --format                use a specific output format - default: progress-bar/tap on CI\n   -r, --require               require module\n   --no-check-scopes           do not check that messages contains scope: 'scope: message'\n   --no-check-assertions-count do not check that assertion count is no more then 1\n   --no-check-duplicates       do not check messages for duplicates\n   --no-worker                 disable worker thread\n```\n\n## Environment variables\n\n- `SUPERTAPE_TIMEOUT` - timeout for long running processes, defaults to `3000` (3 seconds);\n- `SUPERTAPE_CHECK_DUPLICATES` - toggle check duplicates;\n- `SUPERTAPE_CHECK_SCOPES` - check that test message has a scope: `scope: subject`;\n- `SUPERTAPE_CHECK_ASSERTIONS_COUNT` - check that assertion count is no more then 1;\n- `SUPERTAPE_CHECK_SKIPPED` - check that skipped count equal to `0`, exit with status code;\n- `SUPERTAPE_LOAD_LOOP_TIMEOUT` - timeout for load tests, defaults to `5ms`, when mocha used as runner - `50ms` optimal;\n\n```js\ntest('tape: error', (t) =\u003e {\n    t.equal(error.code, 'ENOENT');\n    t.end();\n});\n```\n\n## 🤷 How to migrate from **tape**?\n\n\u003e 🐊 + 📼 = ❤️\n\nYou can convert your codebase from **Tape**, or **Jest** to 📼**Supertape** with help of 🐊[**Putout**](https://github.com/coderaiser/putout), which has built-in [**@putout/plugin-tape**](https://github.com/coderaiser/putout/tree/master/packages/plugin-tape#readme),\nwith a lots of rules that helps to write and maintain tests of the highest possible quality.\n\nHere is [result example](https://github.com/coderaiser/cloudcmd/commit/74d56f795d22e98937dce0641ee3c7514a79e9e6).\n\n## **ESLint** rules\n\n[**eslint-plugin-putout**](https://github.com/coderaiser/putout/tree/master/packages/eslint-plugin-putout#-supertape) has a couple rules for 📼**Supertape**:\n\n- ✅ [`remove-newline-before-t-end`](https://github.com/coderaiser/putout/tree/master/packages/eslint-plugin-putout/lib/tape-remove-newline-before-t-end#readme)\n- ✅ [`add-newline-before-assertion`](https://github.com/coderaiser/putout/tree/master/packages/eslint-plugin-putout/lib/tape-add-newline-before-assertion#readme)\n- ✅ [`add-newline-between-tests`](https://github.com/coderaiser/putout/tree/master/packages/eslint-plugin-putout/lib/tape-add-newline-between-tests#readme)\n\n## Validation checks\n\nTo up the quality of your tests even higher, 📼**Supertape** has built-in checks.\nWhen test not passes validation it marked as a new failed test.\n\n### Single `t.end()`\n\n`t.end()` must not be used more than once. This check cannot be disabled\nand has auto fixable rule 🐊[`remove-useless-t-end`](https://github.com/coderaiser/putout/blob/master/packages/plugin-tape/README.md#remove-useless-t-end).\n\n#### ❌ Example of incorrect code\n\n```js\ntest('hello: world', (t) =\u003e {\n    t.end();\n    t.end();\n});\n```\n\n#### ✅ Example of correct code\n\n```js\ntest('hello: world', (t) =\u003e {\n    t.end();\n});\n```\n\n### Check duplicates\n\nCheck for duplicates in test messages. Can be disabled with:\n\n- passing `--no-check-duplicates` command line flag;\n- setting `SUPERTAPE_CHECK_DUPLICATES=0` env variable;\n\n#### ❌ Example of incorrect code\n\n```js\ntest('hello: world', (t) =\u003e {\n    t.equal(1, 1);\n    t.end();\n});\n```\n\n```js\ntest('hello: world', (t) =\u003e {\n    t.equal(2, 1);\n    t.end();\n});\n```\n\n### Check scopes\n\nCheck that test message are divided on groups by colons. Can be disabled with:\n\n- passing `--no-check-scopes` command line flag;\n- setting `SUPERTAPE_CHECK_SCOPES=0` env variable;\n\n#### ❌ Example of incorrect code\n\n```js\ntest('hello', (t) =\u003e {\n    t.equal(1, 1);\n    t.end();\n});\n```\n\n#### ✅ Example of correct code\n\n```js\ntest('hello: world', (t) =\u003e {\n    t.equal(1, 1);\n    t.end();\n});\n```\n\n### Check assertions count\n\nCheck that test contains exactly one assertion. Can be disabled with:\n\n- passing `--no-check-assertions-count` command line flag;\n- setting `SUPERTAPE_CHECK_ASSERTIONS_COUNT=0` env variable;\n\n#### ❌ Example of incorrect code\n\n```js\ntest('hello: no assertion', (t) =\u003e {\n    t.end();\n});\n\ntest('hello: more then one assertion', (t) =\u003e {\n    t.equal(1, 1);\n    t.equal(2, 2);\n    t.end();\n});\n```\n\n#### ✅ Example of correct code\n\n```js\ntest('hello: one', (t) =\u003e {\n    t.equal(1, 1);\n    t.end();\n});\n\ntest('hello: two', (t) =\u003e {\n    t.equal(2, 2);\n    t.end();\n});\n```\n\n## Operators\n\nThe assertion methods of 📼 **Supertape** are heavily influenced by [**tape**](https://github.com/substack/tape). However, to keep a minimal core of assertions, there are no aliases and some superfluous operators hasn't been implemented (such as `t.throws()`).\n\nThe following is a list of the base methods maintained by 📼 **Supertape**. Others, such as assertions for stubbing, are maintained in [special operators](#special-operators). To add custom assertion operators, see [Extending](#testextendextensions).\n\n### Core Operators\n\n#### `t.equal(result: any, expected: any, message?: string)`\n\nAsserts that `result` and `expected` are strictly equal. If `message` is provided, it will be outputted as a description of the assertion.\n\n☝️ *Note: uses `Object.is(result, expected)`*\n\n#### `t.notEqual(result: any, expected: any, message?: string)`\n\nAsserts that `result` and `expected` are not strictly equal. If `message` is provided, it will be outputted as a description of the assertion.\n\n☝️ *Note: uses `!Object.is(result, expected)`*\n\n#### `t.deepEqual(result: any, expected: any, message?: string)`\n\nAsserts that `result` and `expected` are equal, with the same structure and nested values. If `message` is provided, it will be outputted as a description of the assertion.\n\n☝️ *Note: uses [node's isDeepStrictEqual() algorithm][NodeDeepEqual] with strict comparisons (`===`) on leaf nodes*\n\n#### `t.notDeepEqual(result: any, expected: any, message?: string)`\n\nAsserts that `result` and `expected` are not equal, with different structure and/or nested values. If `message` is provided, it will be outputted as a description of the assertion.\n\n☝️ *Note: uses [node's isDeepStrictEqual() algorithm][NodeDeepEqual] with strict comparisons (`===`) on leaf nodes*\n\n[NodeDeepEqual]: https://nodejs.org/dist/latest-v17.x/docs/api/util.html#utilisdeepstrictequalval1-val2\n\n#### `t.ok(result: boolean | any, message?: string)`\n\nAsserts that `result` is truthy. If `message` is provided, it will be outputted as a description of the assertion.\n\n#### `t.notOk(result: boolean | any, message?: string)`\n\nAsserts that `result` is falsy. If `message` is provided, it will be outputted as a description of the assertion.\n\n#### `t.pass(message: string)`\n\nGenerates a passing assertion with `message` as a description.\n\n#### `t.fail(message: string)`\n\nGenerates a failing assertion with `message` as a description.\n\n#### `t.end()`\n\nDeclares the end of a test explicitly. Must be called exactly once per test. (See: [Single Call to `t.end()`](#single-tend)\n\n#### `t.match(result: string, pattern: string | RegExp, message?: string)`\n\nAsserts that `result` matches the regex `pattern`. If `pattern` is not a valid regex, the assertion fails. If `message` is provided, it will be outputted as a description of the assertion.\n\n#### `t.notMatch(result: string, pattern: string | RegExp, message?: string)`\n\nAsserts that `result` does not match the regex `pattern`. If `pattern` is not a valid regex, the assertion always fails. If `message` is provided, it will be outputted as a description of the assertion.\n\n#### `t.comment(message: string)`\n\nPrint a message without breaking the `TAP` output. Useful when using a `tap`-reporter such as `tap-colorize`, where the output is buffered and `console.log()` will print in incorrect order vis-a-vis `TAP` output.\n\n### Special Operators\n\nTo simplify the core of 📼 **Supertape**, other operators are maintained in separate packages. The following is a list of all such packages:\n\nHere is a list of built-int operators:\n\n| Package | Version |\n|--------|-------|\n| [`@supertape/operator-stub`](/packages/operator-stub) | [![npm](https://img.shields.io/npm/v/@supertape/operator-stub.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/operator-stub) |\n\n## Formatters\n\nThere is a list of built-int `formatters` to customize output:\n\n| Package | Version |\n|--------|-------|\n| [`@supertape/formatter-tap`](/packages/formatter-tap) | [![npm](https://img.shields.io/npm/v/@supertape/formatter-tap.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/formatter-tap) |\n| [`@supertape/formatter-time`](/packages/formatter-time) | [![time](https://img.shields.io/npm/v/@supertape/formatter-time.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/formatter-time) |\n| [`@supertape/formatter-fail`](/packages/formatter-fail) | [![npm](https://img.shields.io/npm/v/@supertape/formatter-fail.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/formatter-fail) |\n| [`@supertape/formatter-short`](/packages/formatter-short) | [![npm](https://img.shields.io/npm/v/@supertape/formatter-short.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/formatter-short) |\n| [`@supertape/formatter-progress-bar`](/packages/formatter-progress-bar) | [![npm](https://img.shields.io/npm/v/@supertape/formatter-progress-bar.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/formatter-progress-bar) |\n| [`@supertape/formatter-json-lines`](/packages/formatter-json-lines) | [![npm](https://img.shields.io/npm/v/@supertape/formatter-json-lines.svg?maxAge=86400)](https://www.npmjs.com/package/@supertape/formatter-json-lines) |\n\n## API\n\n### test(message: string, fn: (t: Test) =\u003e void, options?: TestOptions)\n\nCreate a new test with `message` string.\n`fn(t)` fires with the new test object `t` once all preceding tests have\nfinished. Tests execute serially.\n\nHere is Possible `options` similar to [Environment Variables](#environment-variables) but relates to one test:\n\n- `checkDuplicates`;\n- `checkScopes`;-\n- `checkAssertionsCount`;\n- `timeout`;\n\n### test.only(message, fn, options?)\n\nLike `test(name, cb)` except if you use `.only` this is the only test case\nthat will run for the entire process, all other test cases using `tape` will\nbe ignored.\n\n### test.skip(message, fn, options?)\n\nExtend base assertions with more:\n\n```js\nconst {extend} = require('supertape');\nconst test = extend({\n    transform: (operator) =\u003e (a, b, message = 'should transform') =\u003e {\n        const {is, output} = operator.equal(a + 1, b - 1);\n        \n        return {\n            is,\n            output,\n        };\n    },\n});\n\ntest('assertion', (t) =\u003e {\n    t.transform(1, 3);\n    t.end();\n});\n```\n\n## Example\n\n```js\nconst test = require('supertape');\n\ntest('lib: arguments', async (t) =\u003e {\n    throw Error('hello');\n    // will call t.fail with an error\n    // will call t.end\n});\n\ntest('lib: diff', (t) =\u003e {\n    t.equal({}, {hello: 'world'}, 'should equal');\n    t.end();\n});\n\n// output\n`\n- Expected\n+ Received\n\n- Object {}\n+ Object {\n+   \"hello\": \"world\",\n+ }\n`;\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoderaiser%2Fsupertape","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoderaiser%2Fsupertape","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoderaiser%2Fsupertape/lists"}