{"ref":"artifact:qualiture-enforce-export-coverage","page":"/artifacts/qualiture-enforce-export-coverage","json":"/artifacts/qualiture-enforce-export-coverage.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"qualiture-enforce-export-coverage","name":"enforce-export-coverage","artifact_type":"cli","ecosystem":"general","serves_ecosystems":["cap"],"domain":"developer-experience","origin_ring":"independent","use_as":"dependency","description":{"one_line":"A static-analysis command line that checks every exported TypeScript function has a corresponding test, without running the test suite.","short":"Static check that each exported TypeScript function has a test","what_it_solves":"Parses a project's TypeScript with ts-morph, extracts the names of the exported functions, resolves the candidate test files for each source file, and records a violation when no candidate test file contains a call to the function. It runs on the file paths it is given, which is the pre-commit mode on staged files, or with `--all` over the whole source root, which is the CI mode. Test locations follow configured conventions (co-located, a `__tests__` subdirectory, or a mirrored test root), set in `enforce-export-coverage.config.json` or an `enforceExportCoverage` key in `package.json`. The README contrasts it with Jest's `coverageThreshold: { functions: 100 }`, which it calls overlapping but not equivalent. It checks that a call exists in a test file and does not run the tests, so it says nothing about whether the call passes or what it asserts.","when_not_to_use":"It reads TypeScript exports only; a project written in plain JavaScript has no exported functions for it to extract. A call to the function name in a test file counts as tested, and a call through property access such as `.foo(` does not."},"links":{"npm":"https://www.npmjs.com/package/enforce-export-coverage"},"identity":{"author":"Robin van het Hof","license":"MIT"},"maintainers":["actor:qualiture"],"compat":{"runtimes":["node"]},"provides":[{"capability":"capability:testing","what_it_does":"Checks, without running tests, that every exported TypeScript function of a source tree has a test file that calls it, on staged files in a pre-commit hook or across the project in CI. The README's `srv` configuration (`\"srcRoot\": \"srv\"`) is an example of a source root name and not a statement about CAP.","sources":[{"url":"https://registry.npmjs.org/enforce-export-coverage","title":"enforce-export-coverage on npm, description of 1.0.0","checked":"2026-10-26","quote":"Enforce that every exported TypeScript function has a corresponding test"},{"url":"https://registry.npmjs.org/enforce-export-coverage","title":"enforce-export-coverage on npm, README","checked":"2026-10-26","quote":"Designed to run as a fast pre-commit hook on staged files, or as a full project scan in CI."}]}],"provenance":{"discovered_via":[{"source":"source:npm"}],"first_seen":"2026-10-26"},"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"fair","evidence":"4 months since release"},{"label":"Continuity","tier":"fair","evidence":"1 publisher on npm"},{"label":"Repository","tier":"unknown","evidence":"no repository data"}],"compatibility":[{"label":"Declared for","tier":"unknown","evidence":"no GENERAL release lines in the atlas"},{"label":"Survived majors","tier":"unknown","evidence":"no GENERAL release lines in the atlas"},{"label":"Maintainer's CI","tier":"unknown","evidence":"no repository data"}],"practice":[{"label":"Tests","tier":"unknown","evidence":"not crawled"},{"label":"Docs","tier":"good","evidence":"README 7 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":3,"unit":"installs/week"},{"value":null,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-26","latest_version":"1.0.0","majors":{"1":{"version":"1.0.0","date":"2026-06-19"}},"license":"MIT","first_release":"2026-06-19","last_release":"2026-06-19","releases":1,"cadence_days":null,"maintainers":1,"repository":null,"repository_directory":null,"peer_cds":null,"dependencies":1,"node_engine":">=18.0.0","test_script":false,"types":true,"downloads_weekly":3,"downloads_monthly":35,"npm_document_version":"1.0.0","npm_document_integrity":"sha512-FCll0fhtgzFwdVmZ6gOFC4KosFWmmfsN+zMnA4GlYD79py2M01nxebUtJvwRuzjUYUX+e4BZ/zZrtJzbKiM7OQ==","npm_document_tarball":"https://registry.npmjs.org/enforce-export-coverage/-/enforce-export-coverage-1.0.0.tgz","readme_path":"README.md","readme_bytes":7545,"readme_source":"npm","changelog":false,"license_file":false,"months_since_release":4,"dormant":false},"edges":{"maintainers":[{"ref":"actor:qualiture","name":"Robin van het Hof","json":"/actors/qualiture.json"}],"contributors":[],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}