{"id":23814127,"url":"https://github.com/dfkaye/wheredoc","last_synced_at":"2026-05-14T12:32:24.662Z","repository":{"id":67481517,"uuid":"299131669","full_name":"dfkaye/wheredoc","owner":"dfkaye","description":"Use docstring-like data tables in JavaScript tests, similar to Cucumber's Scenario Outline Examples: or Spock where: blocks.","archived":false,"fork":false,"pushed_at":"2022-06-15T21:32:21.000Z","size":85,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-10T14:14:34.647Z","etag":null,"topics":["data-driven-testing","docstring-driven-testing","heredoc-driven-testing","mocha","qunit","table-driven-testing","tape","tdd"],"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/dfkaye.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2020-09-27T22:36:27.000Z","updated_at":"2023-09-21T21:02:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"eda5b189-e520-49d0-9537-bd5425cd9249","html_url":"https://github.com/dfkaye/wheredoc","commit_stats":{"total_commits":69,"total_committers":1,"mean_commits":69.0,"dds":0.0,"last_synced_commit":"173fd227e7a6a2d3a1918e877a635466baf36d67"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dfkaye/wheredoc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfkaye%2Fwheredoc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfkaye%2Fwheredoc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfkaye%2Fwheredoc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfkaye%2Fwheredoc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dfkaye","download_url":"https://codeload.github.com/dfkaye/wheredoc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dfkaye%2Fwheredoc/sbom","scorecard":{"id":339045,"data":{"date":"2025-08-11","repo":{"name":"github.com/dfkaye/wheredoc","commit":"173fd227e7a6a2d3a1918e877a635466baf36d67"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"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":"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":-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":"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":"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":-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":"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":"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":"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":"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-18T05:22:03.288Z","repository_id":67481517,"created_at":"2025-08-18T05:22:03.288Z","updated_at":"2025-08-18T05:22:03.288Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33024949,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["data-driven-testing","docstring-driven-testing","heredoc-driven-testing","mocha","qunit","table-driven-testing","tape","tdd"],"created_at":"2025-01-02T03:46:32.272Z","updated_at":"2026-05-14T12:32:24.645Z","avatar_url":"https://github.com/dfkaye.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wheredoc\n\nUse docstring-like data tables in JavaScript tests, similar to Cucumber's Scenario Outline `Examples:` or Spock `where:` blocks.\n\n```js\ndescribe(\"Using Mocha and Chai.expect\", (done) =\u003e {\n  function spec(a, b, c) {\n    expect(c).to.equal(a + b)\n\n    where: `\n      a  |  b  |  c\n      1  |  2  |  3\n      4  | -5  | -1\n    `;\n  }\n\n  where(spec).forEach({ params, test } =\u003e {\n    var { a, b, c } = params\n\n    it(`${c} should equal ${a} + ${b}.`, test)\n  })\n\n  done()\n})\n```\n\n## Scenarios\n\nThe `where(spec)` call returns an array of scenarios (or errors - more on that elsewhere). A scenario contains a `params` map of key-value pairs, and a `test` function.\n\nIn cases where the testing library uses a flattened pattern, such as [QUnit](https://qunitjs.com/), and [Tape](https://github.com/substack/tape), you can define the test name or message in the spec or test function itself, and call the scenario test directly in the iteration callback.\n\nIn cases where the testing library uses the describe-it pattern, such as [Mocha](https://mochajs.org/#bdd) and [Jasmine](https://jasmine.github.io/), you can define the test name in each scenario iteration function, then pass both the name and the test function, e.g., as `it(name, test)`.\n\nRead more about this in the library [examples](/docs/examples.md) document.\n\n## Requirements\n\nES2015 module support (i.e., JavaScript `import` statements):\n\n+ Node.js: version 14, see details at https://nodejs.org/api/esm.html\n+ Browsers: All but Internet Explorer, see table at https://caniuse.com/mdn-javascript_statements_import \n\n## Install\n\n+ from npm: `npm install wheredoc`\n+ from github: `git clone https://github.com/dfkaye/wheredoc.git`\n\n## Main test suite\n\nCreated on Node.js, version 14.13.0, using Mocha 8.1.3 and Chai 4.2.0.\n\nRun with `npm test`\n\n## Example suites on Node.js\n\nThese have both passing and failing examples.\n\n- mocha (using chai): `npm run mocha-node`\n- qunit (using qunit-tap): `npm run qunit-node`\n- tape (using tape-describe):  `npm run tape`\n\n## Browser example suites\n\nThe browser suites run with [live-server](https://github.com/tapio/live-server) and download the testing libraries from https://unpkg.com. You should install live-server globally, `npm install -g live-server`, before running these examples.\n\nThese have both passing and failing examples.\n\n- mocha (using chai): `npm run mocha`\n- qunit:  `npm run qunit`\n\n## Further Documentation\n\n+ [Details about prior art, redesign, defining specs, handling scenarios](/docs/details.md)\n+ [Examples with different testing libraries](/docs/examples.md)\n+ [Node.js interop between ES2015 modules and CommonJS](/docs/esm-cjs.md).\n+ [Data table value types](/docs/values.md)\n+ [Status, progress, to-do list](/docs/to-do.md)\n\n## License\n\n[MIT 2020](/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfkaye%2Fwheredoc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdfkaye%2Fwheredoc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdfkaye%2Fwheredoc/lists"}