{"id":13515364,"url":"https://github.com/daniel-lundin/kuta","last_synced_at":"2026-01-18T12:36:43.074Z","repository":{"id":14223712,"uuid":"76140617","full_name":"daniel-lundin/kuta","owner":"daniel-lundin","description":"blazingly fast test runner","archived":false,"fork":false,"pushed_at":"2023-04-17T18:19:31.000Z","size":516,"stargazers_count":12,"open_issues_count":14,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-06T15:58:08.222Z","etag":null,"topics":["parallel","runner","test"],"latest_commit_sha":null,"homepage":"https://daniel-lundin.github.io/kuta/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/daniel-lundin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2016-12-10T22:15:28.000Z","updated_at":"2022-03-15T11:27:39.000Z","dependencies_parsed_at":"2024-06-18T22:59:00.947Z","dependency_job_id":"eb440118-5a5b-4447-b786-837d3aa8424d","html_url":"https://github.com/daniel-lundin/kuta","commit_stats":{"total_commits":226,"total_committers":4,"mean_commits":56.5,"dds":"0.41150442477876104","last_synced_commit":"f6354d36bd993a99db5a67af48085691431a09ca"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/daniel-lundin/kuta","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-lundin%2Fkuta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-lundin%2Fkuta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-lundin%2Fkuta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-lundin%2Fkuta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daniel-lundin","download_url":"https://codeload.github.com/daniel-lundin/kuta/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daniel-lundin%2Fkuta/sbom","scorecard":{"id":319228,"data":{"date":"2025-08-11","repo":{"name":"github.com/daniel-lundin/kuta","commit":"f6354d36bd993a99db5a67af48085691431a09ca"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.8,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":4,"reason":"Found 8/20 approved changesets -- score normalized to 4","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":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"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":"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":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 18 are checked with a SAST tool"],"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":0,"reason":"36 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-3gx7-xhv7-5mx3","Warn: Project is vulnerable to: GHSA-8mmm-9v2q-x3f9","Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-p9wx-2529-fp83","Warn: Project is vulnerable to: GHSA-5v2h-r2cx-5xgj","Warn: Project is vulnerable to: GHSA-rrrm-qjm4-v8hf","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T00:58:22.810Z","repository_id":14223712,"created_at":"2025-08-18T00:58:22.810Z","updated_at":"2025-08-18T00:58:22.810Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28536002,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T10:13:46.436Z","status":"ssl_error","status_checked_at":"2026-01-18T10:13:11.045Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["parallel","runner","test"],"created_at":"2024-08-01T05:01:10.210Z","updated_at":"2026-01-18T12:36:42.999Z","avatar_url":"https://github.com/daniel-lundin.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"\u003cimg src=\"https://github.com/daniel-lundin/kuta/raw/master/assets/kuta-logo.png\" width=200\u003e\n\n# kuta\n\n[![Build Status](https://travis-ci.org/daniel-lundin/kuta.svg?branch=master)](https://travis-ci.org/daniel-lundin/kuta)\n[![npm version](https://badge.fury.io/js/kuta.svg)](https://badge.fury.io/js/kuta)\n\nExperimental parallel test runner for node\n\n`npm install kuta`\n\n## Introduction\n\nThis is an attempt at a parallel test runner for node. Parallellism is achieved by starting a number of processes and feeding them test-files. As soon as one process is done running a test file it will be given a new one.\n\n## Design goals\n\n- Fast execution times by running tests in parallel\n- Agnostic towards assertion libraries, as long as exceptions are thrown or promises returned.\n- Small API, few features, little configuration\n\n## Trade-offs\n\n- No TAP support(files are run one by one, so total number of tests are unknown)\n- Processes are reused which means that test clean up has to be done for each test. If one test \"leaks\" into another it can be hard to debug since it is not deterministic which process will run which test.\n\n## Usage\n\n### Writing tests\n\n```js\nimport { test } from \"kuta\";\n\ntest.before(() =\u003e {\n  // Some setup\n});\n\ntest.after(() =\u003e {\n  // Some tear down\n});\n\ntest.beforeEach(() =\u003e {\n  // Will run before each test\n});\n\ntest.afterEach(() =\u003e {\n  // Will run after each test\n});\n\n// Synchronous test\ntest(\"it should work\", () =\u003e {\n  assert(true);\n});\n\n// Asynchronous test (return a promise)\ntest(\"it should work\", () =\u003e {\n  return fetch(\"http://url.se\").then((response) =\u003e {\n    assert(response.ok);\n  });\n});\n\n//  Grouped tests\ntest.group(\"a group\", (t) =\u003e {\n  t.before(() =\u003e {\n    // Will run before tests in group\n  });\n\n  t.after(() =\u003e {\n    // Will run after tests in group\n  });\n\n  t(\"a test in this group\", () =\u003e {});\n});\n\n// Only running some tests\ntest.only(\"will only run this test\", () =\u003e {});\n\ntest.only(\"and this since it also has only\", () =\u003e {});\n\n// Skipped tests\ntest.skip(\"this will not run\", () =\u003e {});\n\ntest.group.skip(\"nor will this group\", (t) =\u003e {\n  t(\"or any tests withing it\", () =\u003e {});\n});\n```\n\n### Running tests\n\nTests are run with the `kuta` command:\n\n```\n  Usage: kuta [options] testfiles\n\n  Options:\n   -r, --require            Files to require before running tests\n   -p, --processes          Number of processes in the process pool\n   -t, --timeout            Number of milliseconds before tests timeout\n       --reporter           progress or spec(default)\n```\n\nExample:\n\n`kuta tests/**/*.js`\n\n### Configuration\n\nKuta looks for a `kuta`-section in package.json where options can be defined. CLI arguments take precendence over package.json config.\n\nExample package.json:\n\n```json\n{\n  \"name\": \"my-app\",\n  \"kuta\": {\n    \"requires\": [\"testSetup.js\", \"babel-register\"],\n    \"files\": [\"tests/*.js\"],\n    \"processes\": 8,\n    \"timeout\": 1000\n  }\n}\n```\n\n#### Environment variables\n\nYou can also use the following environment variables to configure `kuta`\n\n- `KUTA_PROCESSES`: Number of processes in the process pool\n- `KUTA_TIMEOUT`: Number of milliseconds before tests timeout\n- `KUTA_REPORTER`: Which reporter to run\n\nIf the same option is supplied from multiple sources the priority is\n\n1. CLI argument\n2. `kuta`-section in package.json\n3. Environment variable\n\n### Babel\n\nIf you transpile with babel, use the babel-register hook:\n\n`kuta tests/**/*.js --require babel-register`\n\n### Parallel processes\n\nSince processes are run in parallel, test that spawn services on specific port will run into problems where two processes try to allocate the same port. To overcome this, kuta sends an environment variable with an index to each of the processs that can be used to generate unique ports for different processes.\n\nThe environment variable is `KUTA_PROCESS_INDEX`\n\n## Mocha compatibility\n\nKuta includes a mocha and mocha-cakes compatability layer:\n\n```js\nimport { describe, it } from \"kuta/lib/mocha-compat\";\n\ndescribe(\"mocha style\", () =\u003e {\n  before(() =\u003e {});\n  after(() =\u003e {});\n\n  it(\"should work\", () =\u003e {\n    describe(\"inner group\", () =\u003e {});\n  });\n});\n```\n\n### Mocha cakes\n\n```js\nimport { Feature, Scenario, Given, When, Then, But } from \"kuta/lib/mocha-compat\";\n\nFeature(\"Feature\", () =\u003e {\n  Scenario(\"\", () =\u003e {\n    Given(\"a given\", () =\u003e {});\n\n    When(\"something happens\", () =\u003e {});\n\n    Then(\"something is expected\", () =\u003e {});\n\n    And(\"another thing should be expected\", () =\u003e {});\n\n    But(\"not this thing\", () =\u003e {});\n  });\n});\n```\n\n## Licence\n\nMIT Copyright Daniel Lundin\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-lundin%2Fkuta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaniel-lundin%2Fkuta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaniel-lundin%2Fkuta/lists"}