[{"data":1,"prerenderedAt":798},["ShallowReactive",2],{"navigation_docs":3,"-reference-reporters-openmetrics":239,"-reference-reporters-openmetrics-surround":793},[4,29,94,114,184],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Start",false,"\u002Fstart","1.start",[10,14,19,24],{"title":11,"path":7,"stem":12,"icon":13},"What jscpd finds","1.start\u002Findex","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F3.quickstart","i-lucide-rocket",{"title":25,"path":26,"stem":27,"icon":28},"Configuration basics","\u002Fstart\u002Fconfiguration","1.start\u002F4.configuration","i-lucide-settings-2",{"title":30,"icon":6,"path":31,"stem":32,"children":33,"page":6},"Guides","\u002Fguides","2.guides",[34,39,44,49,54,59,64,69,74,79,84,89],{"title":35,"path":36,"stem":37,"icon":38},"Use jscpd in CI","\u002Fguides\u002Fci","2.guides\u002F01.ci","i-lucide-github",{"title":40,"path":41,"stem":42,"icon":43},"Pre-commit hooks","\u002Fguides\u002Fpre-commit","2.guides\u002F02.pre-commit","i-lucide-git-commit",{"title":45,"path":46,"stem":47,"icon":48},"Fail only on new duplication","\u002Fguides\u002Fbaseline","2.guides\u002F03.baseline","i-lucide-git-compare",{"title":50,"path":51,"stem":52,"icon":53},"Monorepos","\u002Fguides\u002Fmonorepos","2.guides\u002F04.monorepos","i-lucide-folder-tree",{"title":55,"path":56,"stem":57,"icon":58},"Cross-format detection","\u002Fguides\u002Fcross-format","2.guides\u002F05.cross-format","i-lucide-layers",{"title":60,"path":61,"stem":62,"icon":63},"Agents","\u002Fguides\u002Fagents","2.guides\u002F06.agents","i-lucide-cpu",{"title":65,"path":66,"stem":67,"icon":68},"Editors","\u002Fguides\u002Feditors","2.guides\u002F07.editors","i-lucide-code",{"title":70,"path":71,"stem":72,"icon":73},"Duplication over git history","\u002Fguides\u002Fhistory","2.guides\u002F08.history","i-lucide-chart-no-axes-combined",{"title":75,"path":76,"stem":77,"icon":78},"Dashboard and health score","\u002Fguides\u002Fdashboard","2.guides\u002F09.dashboard","i-lucide-layout-dashboard",{"title":80,"path":81,"stem":82,"icon":83},"Dead code","\u002Fguides\u002Fdead-code","2.guides\u002F10.dead-code","i-lucide-ghost",{"title":85,"path":86,"stem":87,"icon":88},"Comparing two codebases","\u002Fguides\u002Fcompare","2.guides\u002F11.compare","i-lucide-git-compare-arrows",{"title":90,"path":91,"stem":92,"icon":93},"Semantic clones","\u002Fguides\u002Fsemantic-clones","2.guides\u002F12.semantic-clones","i-lucide-brain-circuit",{"title":95,"icon":6,"path":96,"stem":97,"children":98,"page":6},"Concepts","\u002Fconcepts","3.concepts",[99,104,109],{"title":100,"path":101,"stem":102,"icon":103},"Types of code clones","\u002Fconcepts\u002Fclone-types","3.concepts\u002F1.clone-types","i-lucide-copy",{"title":105,"path":106,"stem":107,"icon":108},"How detection works","\u002Fconcepts\u002Fhow-detection-works","3.concepts\u002F2.how-detection-works","i-lucide-scan-search",{"title":110,"path":111,"stem":112,"icon":113},"The health score","\u002Fconcepts\u002Fhealth-score","3.concepts\u002F3.health-score","i-lucide-heart-pulse",{"title":115,"icon":6,"path":116,"stem":117,"children":118,"page":6},"Reference","\u002Freference","4.reference",[119,124,129,134,171,176,180],{"title":120,"path":121,"stem":122,"icon":123},"CLI options","\u002Freference\u002Fcli","4.reference\u002F1.cli","i-lucide-terminal",{"title":125,"path":126,"stem":127,"icon":128},"The config file","\u002Freference\u002Fconfig-file","4.reference\u002F2.config-file","i-lucide-settings",{"title":130,"path":131,"stem":132,"icon":133},"Exit codes","\u002Freference\u002Fexit-codes","4.reference\u002F3.exit-codes","i-lucide-log-out",{"title":135,"icon":6,"path":136,"stem":137,"children":138},"Reporters","\u002Freference\u002Freporters","4.reference\u002F4.reporters\u002Findex",[139,141,146,151,156,161,166],{"title":135,"path":136,"stem":137,"icon":140},"i-lucide-file-chart-column",{"title":142,"path":143,"stem":144,"icon":145},"HTML reporter","\u002Freference\u002Freporters\u002Fhtml","4.reference\u002F4.reporters\u002F2.html","i-lucide-file-code",{"title":147,"path":148,"stem":149,"icon":150},"JSON reporter","\u002Freference\u002Freporters\u002Fjson","4.reference\u002F4.reporters\u002F3.json","i-lucide-braces",{"title":152,"path":153,"stem":154,"icon":155},"Badge reporter","\u002Freference\u002Freporters\u002Fbadge","4.reference\u002F4.reporters\u002F4.badge","i-lucide-award",{"title":157,"path":158,"stem":159,"icon":160},"SARIF reporter","\u002Freference\u002Freporters\u002Fsarif","4.reference\u002F4.reporters\u002F5.sarif","i-lucide-shield-check",{"title":162,"path":163,"stem":164,"icon":165},"CodeClimate reporter","\u002Freference\u002Freporters\u002Fcodeclimate","4.reference\u002F4.reporters\u002F6.codeclimate","i-lucide-flag-triangle-right",{"title":167,"path":168,"stem":169,"icon":170},"OpenMetrics reporter","\u002Freference\u002Freporters\u002Fopenmetrics","4.reference\u002F4.reporters\u002F7.openmetrics","i-lucide-activity",{"title":172,"path":173,"stem":174,"icon":175},"Supported formats","\u002Freference\u002Fsupported-formats","4.reference\u002F5.supported-formats","i-lucide-languages",{"title":177,"path":178,"stem":179,"icon":38},"GitHub Action","\u002Freference\u002Fgithub-action","4.reference\u002F6.github-action",{"title":181,"path":182,"stem":183,"icon":68},"Rust crates","\u002Freference\u002Frust-crates","4.reference\u002F7.rust-crates",{"title":185,"icon":6,"path":186,"stem":187,"children":188,"page":6},"Project","\u002Fproject","5.project",[189,194,199,204,229,234],{"title":190,"path":191,"stem":192,"icon":193},"Changelog","\u002Fproject\u002Fchangelog","5.project\u002F1.changelog","i-lucide-scroll-text",{"title":195,"path":196,"stem":197,"icon":198},"Migrating from v4 to v5","\u002Fproject\u002Fmigration","5.project\u002F2.migration","i-lucide-arrow-right-left",{"title":200,"path":201,"stem":202,"icon":203},"jscpd v4 (TypeScript)","\u002Fproject\u002Fv4","5.project\u002F3.v4","i-simple-icons-typescript",{"title":205,"icon":6,"path":206,"stem":207,"children":208},"Benchmarks","\u002Fproject\u002Fbenchmarks","5.project\u002F4.benchmarks\u002Findex",[209,211,216,220,225],{"title":205,"path":206,"stem":207,"icon":210},"i-lucide-gauge",{"title":212,"path":213,"stem":214,"icon":215},"Detection Speed","\u002Fproject\u002Fbenchmarks\u002Fdetection-speed","5.project\u002F4.benchmarks\u002F2.detection-speed","i-lucide-zap",{"title":217,"path":218,"stem":219,"icon":58},"Multi-Format Detection","\u002Fproject\u002Fbenchmarks\u002Fcross-format","5.project\u002F4.benchmarks\u002F3.cross-format",{"title":221,"path":222,"stem":223,"icon":224},"AI Token Efficiency","\u002Fproject\u002Fbenchmarks\u002Fai-token-efficiency","5.project\u002F4.benchmarks\u002F4.ai-token-efficiency","i-lucide-sparkles",{"title":226,"path":227,"stem":228,"icon":93},"Embedding Models","\u002Fproject\u002Fbenchmarks\u002Fembedding-models","5.project\u002F4.benchmarks\u002F5.embedding-models",{"title":230,"path":231,"stem":232,"icon":233},"Research","\u002Fproject\u002Fresearch","5.project\u002F5.research","i-lucide-graduation-cap",{"title":235,"path":236,"stem":237,"icon":238},"Articles","\u002Fproject\u002Farticles","5.project\u002F6.articles","i-lucide-newspaper",{"id":240,"title":167,"body":241,"description":786,"extension":787,"links":788,"meta":789,"navigation":790,"path":168,"seo":791,"stem":169,"__hash__":792},"docs\u002F4.reference\u002F4.reporters\u002F7.openmetrics.md",{"type":242,"value":243,"toc":778},"minimark",[244,256,261,296,304,384,388,395,402,546,553,557,564,670,673,677,698,702,749,753,774],[245,246,247,251,252,255],"p",{},[248,249,250],"code",{},"-r openmetrics"," writes the statistics of a run in the OpenMetrics text format: one gauge family per number, with an unlabeled sample for the whole run and one ",[248,253,254],{},"format=\"...\""," sample per format. GitLab reads the file as a metrics report and shows in a merge request how each number moved against the target branch; any parser of the Prometheus text format reads it as well. Available since jscpd 5.1.0.",[257,258,260],"h2",{"id":259},"run-it","Run it",[262,263,269],"pre",{"className":264,"code":265,"filename":266,"language":267,"meta":268,"style":268},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","jscpd . -r openmetrics --output report\n","Terminal","bash","",[248,270,271],{"__ignoreMap":268},[272,273,276,280,284,287,290,293],"span",{"class":274,"line":275},"line",1,[272,277,279],{"class":278},"sBMFI","jscpd",[272,281,283],{"class":282},"sfazB"," .",[272,285,286],{"class":282}," -r",[272,288,289],{"class":282}," openmetrics",[272,291,292],{"class":282}," --output",[272,294,295],{"class":282}," report\n",[262,297,302],{"className":298,"code":300,"language":301,"meta":268},[299],"language-text","OpenMetrics report saved to report\u002Fjscpd-metrics.txt\n","text",[248,303,300],{"__ignoreMap":268},[262,305,310],{"className":306,"code":307,"filename":308,"language":309,"meta":268,"style":268},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"reporters\": [\"console\", \"openmetrics\"],\n  \"output\": \"report\"\n}\n",".jscpd.json","json",[248,311,312,318,358,378],{"__ignoreMap":268},[272,313,314],{"class":274,"line":275},[272,315,317],{"class":316},"sMK4o","{\n",[272,319,321,324,328,331,334,337,339,342,344,347,350,353,355],{"class":274,"line":320},2,[272,322,323],{"class":316},"  \"",[272,325,327],{"class":326},"spNyl","reporters",[272,329,330],{"class":316},"\"",[272,332,333],{"class":316},":",[272,335,336],{"class":316}," [",[272,338,330],{"class":316},[272,340,341],{"class":282},"console",[272,343,330],{"class":316},[272,345,346],{"class":316},",",[272,348,349],{"class":316}," \"",[272,351,352],{"class":282},"openmetrics",[272,354,330],{"class":316},[272,356,357],{"class":316},"],\n",[272,359,361,363,366,368,370,372,375],{"class":274,"line":360},3,[272,362,323],{"class":316},[272,364,365],{"class":326},"output",[272,367,330],{"class":316},[272,369,333],{"class":316},[272,371,349],{"class":316},[272,373,374],{"class":282},"report",[272,376,377],{"class":316},"\"\n",[272,379,381],{"class":274,"line":380},4,[272,382,383],{"class":316},"}\n",[257,385,387],{"id":386},"the-output","The output",[245,389,390,391,394],{},"Two of the eleven families, from the repository's ",[248,392,393],{},"fixtures\u002Fmcp-demo"," folder:",[262,396,400],{"className":397,"code":398,"filename":399,"language":301,"meta":268},[299],"# HELP jscpd_clones_found Number of duplicated code blocks found.\n# TYPE jscpd_clones_found gauge\njscpd_clones_found 3\njscpd_clones_found{format=\"bash\"} 0\njscpd_clones_found{format=\"javascript\"} 3\njscpd_clones_found{format=\"markdown\"} 0\njscpd_clones_found{format=\"python\"} 0\n# HELP jscpd_duplicated_lines_percent Percentage of duplicated lines.\n# TYPE jscpd_duplicated_lines_percent gauge\n# UNIT jscpd_duplicated_lines_percent percent\njscpd_duplicated_lines_percent 17.708333333333336\njscpd_duplicated_lines_percent{format=\"bash\"} 0\njscpd_duplicated_lines_percent{format=\"javascript\"} 49.275362318840585\njscpd_duplicated_lines_percent{format=\"markdown\"} 0\njscpd_duplicated_lines_percent{format=\"python\"} 0\n# EOF\n","report\u002Fjscpd-metrics.txt",[248,401,398],{"__ignoreMap":268},[403,404,405,418],"table",{},[406,407,408],"thead",{},[409,410,411,415],"tr",{},[412,413,414],"th",{},"Metric",[412,416,417],{},"Meaning",[419,420,421,432,442,452,462,472,482,495,507,520,532],"tbody",{},[409,422,423,429],{},[424,425,426],"td",{},[248,427,428],{},"jscpd_source_files",[424,430,431],{},"Files analyzed",[409,433,434,439],{},[424,435,436],{},[248,437,438],{},"jscpd_lines_analyzed",[424,440,441],{},"Lines analyzed",[409,443,444,449],{},[424,445,446],{},[248,447,448],{},"jscpd_tokens_analyzed",[424,450,451],{},"Tokens analyzed",[409,453,454,459],{},[424,455,456],{},[248,457,458],{},"jscpd_clones_found",[424,460,461],{},"Clones",[409,463,464,469],{},[424,465,466],{},[248,467,468],{},"jscpd_duplicated_lines",[424,470,471],{},"Duplicated lines",[409,473,474,479],{},[424,475,476],{},[248,477,478],{},"jscpd_duplicated_tokens",[424,480,481],{},"Duplicated tokens",[409,483,484,489],{},[424,485,486],{},[248,487,488],{},"jscpd_new_clones",[424,490,491,492],{},"Clones absent from the baseline; 0 without ",[248,493,494],{},"--baseline",[409,496,497,502],{},[424,498,499],{},[248,500,501],{},"jscpd_new_duplicated_lines",[424,503,504,505],{},"Duplicated lines in those clones; 0 without ",[248,506,494],{},[409,508,509,514],{},[424,510,511],{},[248,512,513],{},"jscpd_duplicated_lines_percent",[424,515,516,517],{},"Duplication by lines, unit ",[248,518,519],{},"percent",[409,521,522,527],{},[424,523,524],{},[248,525,526],{},"jscpd_duplicated_tokens_percent",[424,528,529,530],{},"Duplication by tokens, unit ",[248,531,519],{},[409,533,534,539],{},[424,535,536],{},[248,537,538],{},"jscpd_detection_duration_seconds",[424,540,541,542,545],{},"Time spent on detection, unit ",[248,543,544],{},"seconds","; the total only",[245,547,548,549,552],{},"Format names are escaped as the OpenMetrics grammar requires, and the file ends with ",[248,550,551],{},"# EOF",".",[257,554,556],{"id":555},"where-it-shows-up","Where it shows up",[245,558,559,560,563],{},"Declare the file as a ",[248,561,562],{},"metrics"," report artifact. Metrics reports need GitLab Premium or Ultimate.",[262,565,570],{"className":566,"code":567,"filename":568,"language":569,"meta":268,"style":268},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","jscpd:\n  stage: test\n  image: node:22\n  before_script:\n    - npm install -g jscpd@5\n  script:\n    - jscpd . -r console,openmetrics --output report\n  artifacts:\n    when: always\n    reports:\n      metrics: report\u002Fjscpd-metrics.txt\n",".gitlab-ci.yml","yaml",[248,571,572,580,590,600,607,616,624,632,640,651,659],{"__ignoreMap":268},[272,573,574,577],{"class":274,"line":275},[272,575,279],{"class":576},"swJcz",[272,578,579],{"class":316},":\n",[272,581,582,585,587],{"class":274,"line":320},[272,583,584],{"class":576},"  stage",[272,586,333],{"class":316},[272,588,589],{"class":282}," test\n",[272,591,592,595,597],{"class":274,"line":360},[272,593,594],{"class":576},"  image",[272,596,333],{"class":316},[272,598,599],{"class":282}," node:22\n",[272,601,602,605],{"class":274,"line":380},[272,603,604],{"class":576},"  before_script",[272,606,579],{"class":316},[272,608,610,613],{"class":274,"line":609},5,[272,611,612],{"class":316},"    -",[272,614,615],{"class":282}," npm install -g jscpd@5\n",[272,617,619,622],{"class":274,"line":618},6,[272,620,621],{"class":576},"  script",[272,623,579],{"class":316},[272,625,627,629],{"class":274,"line":626},7,[272,628,612],{"class":316},[272,630,631],{"class":282}," jscpd . -r console,openmetrics --output report\n",[272,633,635,638],{"class":274,"line":634},8,[272,636,637],{"class":576},"  artifacts",[272,639,579],{"class":316},[272,641,643,646,648],{"class":274,"line":642},9,[272,644,645],{"class":576},"    when",[272,647,333],{"class":316},[272,649,650],{"class":282}," always\n",[272,652,654,657],{"class":274,"line":653},10,[272,655,656],{"class":576},"    reports",[272,658,579],{"class":316},[272,660,662,665,667],{"class":274,"line":661},11,[272,663,664],{"class":576},"      metrics",[272,666,333],{"class":316},[272,668,669],{"class":282}," report\u002Fjscpd-metrics.txt\n",[245,671,672],{},"The merge request widget then lists each metric with its value on the target branch and the change.",[257,674,676],{"id":675},"with-gates","With gates",[245,678,679,682,683,687,688,690,691,693,694,697],{},[248,680,681],{},"--threshold"," does not change the file. A ",[684,685,686],"a",{"href":46},"baseline"," fills ",[248,689,488],{}," and ",[248,692,501],{},", which stay at 0 otherwise. ",[248,695,696],{},"--kind"," narrows the counts to the kinds you name.",[257,699,701],{"id":700},"options","Options",[403,703,704,714],{},[406,705,706],{},[409,707,708,711],{},[412,709,710],{},"Flag",[412,712,713],{},"Effect on the file",[419,715,716,733],{},[409,717,718,727],{},[424,719,720,723,724],{},[248,721,722],{},"-o",", ",[248,725,726],{},"--output",[424,728,729,730],{},"The directory of ",[248,731,732],{},"jscpd-metrics.txt",[409,734,735,742],{},[424,736,737,723,739],{},[248,738,494],{},[248,740,741],{},"--baseline-from-ref",[424,743,744,745,748],{},"Values for the two ",[248,746,747],{},"new"," gauges",[257,750,752],{"id":751},"related","Related",[754,755,756,762,768],"ul",{},[757,758,759,761],"li",{},[684,760,162],{"href":163}," for the clones themselves in a merge request.",[757,763,764,767],{},[684,765,766],{"href":71},"History"," for the duplication trend over git commits.",[757,769,770,773],{},[684,771,772],{"href":36},"CI"," for the GitLab pipeline.",[775,776,777],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":268,"searchDepth":320,"depth":320,"links":779},[780,781,782,783,784,785],{"id":259,"depth":320,"text":260},{"id":386,"depth":320,"text":387},{"id":555,"depth":320,"text":556},{"id":675,"depth":320,"text":676},{"id":700,"depth":320,"text":701},{"id":751,"depth":320,"text":752},"The counts of a run as OpenMetrics gauges, one sample per format, for GitLab metrics reports and Prometheus-style tooling.","md",null,{},{"icon":170},{"title":167,"description":786},"jBM8a-QcNgn_5yOePXkCQk5l3-mUV7syzAJkL_Xki-w",[794,796],{"title":162,"path":163,"stem":164,"description":795,"icon":165,"children":-1},"GitLab Code Quality issues in the CodeClimate format, two per clone, so merge requests show duplication on the changed lines.",{"title":172,"path":173,"stem":174,"description":797,"icon":175,"children":-1},"The 224 formats jscpd 5.4.0 tokenizes, with the extensions and shebangs that select them, generated from the FORMATS.md of the release.",1791302986203]