Everything belonging to the v4 TypeScript engine moves to the master-v4 branch: apps/, packages/, build-utils/, changesets, pnpm workspace, turbo, the Node.js CI workflow and the ts-* release jobs. What remains is the Rust workspace under rust/, the npm wrapper and platform packages, the GitHub Action, Docker image, flake, skills, benchmark and fixtures/. - rust.yml gains a smoke job that runs the release binary against fixtures/ (json, sarif, html) and asserts clones and reporters - release.yml keeps only the Rust jobs; pnpm removed from every workflow; audit.yml keeps cargo audit + cargo deny; dependabot drops the root npm entry - root package.json becomes a thin private package depending on the exact jscpd@5 version so the pre-commit hook keeps installing the binary; sync-version.mjs keeps it in step - .pre-commit-hooks.yaml used v4-only flags that the v5 CLI rejects; fixed - FORMATS.md is now generated from the Rust tokenizer (224 formats) - README, docs, CONTRIBUTING, SECURITY, package and crate descriptions, benchmark and skills rewritten for v5 on its own terms: no v5-vs-v4 speed multipliers anywhere, a single "Looking for v4?" pointer to master-v4
2.2 KiB
Programming API
jscpd is a Rust engine. The CLI ships as the jscpd crate on crates.io (installs the jscpd and cpd binaries) and as the jscpd / cpd npm packages (prebuilt binaries); the engine itself is a set of library crates you can depend on directly.
Rust
Use the cpd-finder crate — it is the orchestration entry point and pulls in the tokenizer, detection core, and reporters:
[dependencies]
cpd-finder = "0.1"
use cpd_finder::orchestrate::{RunConfig, run};
let config = RunConfig {
paths: vec!["./src".into()],
min_tokens: 50,
..Default::default()
};
let result = run(&config).unwrap();
println!("Found {} clones", result.clones.len());
println!("Analyzed {} files", result.statistics.total.sources);
A complete, runnable version is in examples/rust-cpd-finder.
The jscpd crate's own library target is not a public API — it exists to share helpers with the crate's tests and may change in any release. Depend on the engine crates instead.
Crate Architecture
| Crate | Description |
|---|---|
cpd-core |
Core data models and hashing (Rabin-Karp rolling hash) |
cpd-tokenizer |
Source code tokenization (224 formats, uses oxc_parser for JavaScript/TypeScript) — pure, no I/O |
cpd-finder |
File walking, orchestration, git blame (rayon + ignore + globset) |
cpd-reporter |
Output format rendering (15 reporters) |
See Packages for versions and paths.
Other languages
There is no Node.js (or other language) binding for the v5 engine. From another language, run the binary and read the json reporter's output (--reporters json --output <dir> writes <dir>/jscpd-report.json), or talk to it over the MCP stdio transport.
The TypeScript API of jscpd v4 (jscpd(), detectClones(), @jscpd/core, LevelDB/Redis stores) is maintained on the master-v4 branch and published as jscpd@4.