Reporters

Reporters

Output formats and reporters in jscpd.

Overview

jscpd supports multiple reporters to output duplication detection results in various formats.

Available Reporters

ReporterDescription
consoleOutput results to console (default)
consoleFullDetailed console output with code snippets
aiCompact token-efficient output for AI tools (~79% fewer tokens than default)
jsonJSON format output
xmlXML format output
htmlInteractive HTML report
markdownMarkdown format output
csvCSV format output
thresholdExit with error if threshold exceeded
badgeGenerate SVG badge

AI Reporter

The ai reporter is optimized for piping jscpd output into AI/LLM tools. It uses common-path-prefix compression and omits code fragments and colors, producing output that is ~79% smaller than the default reporter.

Benchmarked on fixtures/ (91 clones, 132 files):

ReporterEstimated tokens
console (default)~5,400
ai~1,100
jscpd --reporters ai ./src

Example output:

Clones:
fixtures/yaml/ file1.yml:1-18 ~ file2.yml:1-18
fixtures/xml/file2.xsl 32-43 ~ 20-31
fixtures/xml/ file1.xsl:1-47 ~ file2.xsl:1-35
fixtures/xml/ file1.svg:1-88 ~ file2.svg:1-87
fixtures/vue/ file1.vue:1-75 ~ file2.vue:1-75
fixtures/vue/ file1.vue:95-262 ~ file2.vue:74-241
fixtures/twig/file_2.twig 17-32 ~ 14-23
fixtures/twig/ file_1.twig:1-29 ~ file_2.twig:1-32
fixtures/text/ file1.txt:1-12 ~ file2.txt:1-12
fixtures/swift/ file1.swift:9-30 ~ file2.swift:2-24
fixtures/sass/ file1.sass:21-45 ~ file2.sass:24-48
fixtures/rust/file2.rs 220-230 ~ 148-158
fixtures/rust/file2.rs 256-271 ~ 204-219
fixtures/rust/ file1.rs:1-131 ~ file2.rs:1-132
fixtures/rust/ file1.rs:199-206 ~ file2.rs:140-147
fixtures/rust/ file1.rs:232-239 ~ file2.rs:132-139
fixtures/rust/ file1.rs:239-416 ~ file2.rs:123-301
fixtures/ruby/ file1.rb:1-40 ~ file2.rb:1-40
fixtures/r/ file1.r:1-64 ~ file2.r:1-64
fixtures/python/ file1.py:1-27 ~ file2.py:1-26
fixtures/puppet/ file1.pp:1-40 ~ file2.pp:1-40
fixtures/puppet/ file1.pp:44-64 ~ file2.pp:38-58
fixtures/pug/ file1.pug:1-274 ~ file2.pug:1-266
fixtures/php/ file1.php:1-51 ~ file2.php:1-51
fixtures/perl/ file1.pm:1-144 ~ file2.pm:1-144
fixtures/perl/ file1.pl:1-123 ~ file2.pl:1-123
fixtures/one-file/one-file.js 32-61 ~ 1-29
fixtures/objective-c/ file_1.m:14-64 ~ file_2.m:38-88
fixtures/objective-c/ file_1.h:1-35 ~ file_2.h:1-37
fixtures/modes/ file1.ts:1-92 ~ file2.ts:1-86
fixtures/markdown/ file1.md:4-81 ~ file2.md:9-86
fixtures/markdown/ file1.md:82-178 ~ file2.md:87-183
fixtures/jsx/ file1.tsx:1-37 ~ file2.tsx:1-37
fixtures/jsx/ file1.jsx:1-23 ~ file2.jsx:1-23
fixtures/javascript/file_4.js 56-83 ~ 15-42
fixtures/javascript/ file_2.mjs:1-28 ~ file_3.js:25-52
fixtures/javascript/ file_2.mjs:29-56 ~ file_3.js:25-52
fixtures/javascript/ file_2.js:1-56 ~ file_3.js:25-52
fixtures/javascript/ file_2.cjs:1-56 ~ file_3.js:25-52
fixtures/javascript/ file_1.mjs:4-55 ~ file_3.js:1-52
fixtures/javascript/ file_1.js:1-55 ~ file_1.mjs:1-52
fixtures/javascript/ file_1.cjs:1-55 ~ file_1.mjs:1-52
fixtures/javascript/ file2.mts:1-376 ~ file2.ts:1-376
fixtures/javascript/ file2.cts:1-376 ~ file2.ts:1-376
fixtures/javascript/ file1.ts:1-73 ~ file2.ts:48-119
fixtures/javascript/ file1.ts:73-263 ~ file2.ts:186-376
fixtures/javascript/ file1.mts:1-263 ~ file2.ts:48-376
fixtures/javascript/ file1.js:1-24 ~ file2.js:1-27
fixtures/javascript/ file1.cts:1-263 ~ file2.ts:48-376
fixtures/ ignore-case/file2.txt:1-61 ~ text/file2.txt:1-61
fixtures/ htmlmixed/file2.htm:1-24 ~ ignore/file2.htm:1-24
fixtures/htmlmixed/ file1.html:1-16 ~ file2.html:1-16
fixtures/ htmlmixed/file1.htm:1-24 ~ ignore/file2.htm:1-24
fixtures/haxe/ file1.hxml:3-14 ~ file2.hxml:1-12
fixtures/haxe/ file1.hx:1-47 ~ file2.hx:1-47
fixtures/haxe/ file1.hx:47-103 ~ file2.hx:6-62
fixtures/haskell/ file1.hs:1-175 ~ file2.hs:1-175
fixtures/haskell/ file1.hs:190-204 ~ file2.hs:175-189
fixtures/go/ file1.go:1-30 ~ file2.go:1-31
fixtures/gdscript/ file1.gd:22-47 ~ file2.gd:22-47
fixtures/ folder2/file_2.js:1-56 ~ javascript/file_3.js:25-52
fixtures/ folder1/file_1.js:1-55 ~ javascript/file_1.mjs:1-52
fixtures/folder1/file2.c 18-28 ~ 8-18
fixtures/erlang/ file1.erl:1-121 ~ file2.erl:1-121
fixtures/dart/ file1.dart:1-91 ~ file2.dart:1-91
fixtures/dart/ file1.dart:118-148 ~ file2.dart:88-118
fixtures/d/ file1.d:1-169 ~ file2.d:1-169
fixtures/css/ file10.css:1-20 ~ file2.css:1-20
fixtures/css/ file1.less:1-20 ~ file2.less:1-20
fixtures/css/file1.less 24-36 ~ 14-25
fixtures/css/ file1.css:1-25 ~ file2.css:1-25
fixtures/coffeescript/ file1.coffee:1-13 ~ file2.coffee:3-15
fixtures/coffeescript/file1.coffee 46-77 ~ 16-46
fixtures/clike/file2.hpp 45-66 ~ 24-45
fixtures/clike/file2.h 18-28 ~ 8-18
fixtures/clike/file2.cpp 45-66 ~ 24-45
fixtures/ clike/file2.c:1-29 ~ folder1/file2.c:1-29
fixtures/clike/ file1.scala:1-29 ~ file2.scala:1-29
fixtures/clike/ file1.java:1-191 ~ file2.java:1-191
fixtures/clike/ file1.java:182-221 ~ file2.java:194-233
fixtures/clike/ file1.hpp:14-86 ~ file2.hpp:14-86
fixtures/clike/ file1.h:1-19 ~ file2.h:1-29
fixtures/clike/ file1.cs:1-95 ~ file2.cs:1-94
fixtures/clike/ file1.cs:103-185 ~ file2.cs:93-175
fixtures/clike/ file1.cpp:14-86 ~ file2.cpp:14-86
fixtures/ clike/file1.c:1-19 ~ folder1/file2.c:1-29
fixtures/brainfuck/ file2.b:1-41 ~ file2.bf:1-41
fixtures/brainfuck/ file1.bf:1-28 ~ file2.bf:1-28
fixtures/brainfuck/ file1.bf:28-36 ~ file2.bf:33-41
fixtures/brainfuck/ file1.b:1-41 ~ file2.bf:1-41
fixtures/apl/ file1.apl:1-21 ~ file2.apl:1-22
---
91 clones · 54.4% duplication
time: 377.51ms

Using Multiple Reporters

jscpd --reporters console,html,json ./src

Output Directory

Specify where reports are saved:

jscpd --output ./reports ./src

Reporter Configuration

In .jscpd.json:

.jscpd.json
{
  "reporters": ["html", "console", "json"],
  "output": "./jscpd-report"
}