mirror of
https://github.com/kucherenko/jscpd.git
synced 2026-09-19 08:11:03 +08:00
030f38aa1b
Detect duplicates across related formats via format equivalence groups sharing one comparison pool, e.g. --cross-formats "javascript,typescript" or the js-ts preset (javascript,jsx,typescript,tsx). When a group mixes TypeScript with JavaScript, TS files are compared with erasable type-only syntax stripped from the detection token stream (type annotations, generics, interface/type declarations, as/satisfies, ?/! markers, access modifiers, implements clauses, type-only imports/exports, overload signatures, declare statements) so that `function f(a: number): void` matches `function f(a)`. Stripping is AST-driven (oxc_ast_visit over the already-parsed program) and only drops tokens, so reported clone positions always reference the original source. - cpd-tokenizer: new ts_strip module, tokenize_js_stripped, TokenizeOptions.strip_types_formats (empty by default) - cpd-finder: RunConfig.cross_formats, build_pools() pool grouping, strip-set computation for TS-family formats grouped with JS - cpd: --cross-formats flag, crossFormats config field (string, array-of-strings, or array-of-arrays), js-ts preset, overlap merging, unknown-format warnings, --debug output - docs: rust.md option + Cross-Format Groups section, CHANGELOG entry - tests: tokenizer strip tests, pool unit tests, cross-pool core test, cpd-finder integration tests, CLI parse/config tests, e2e binary tests with fixtures; default behavior unchanged (golden parity intact) Non-erasable TS syntax with runtime semantics (enum, non-declare namespace, parameter properties, import =, export =) is left intact and will not cross-match. Cross-format clones are attributed to one member format in per-format statistics. Closes #810 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>