[{"data":1,"prerenderedAt":2155},["ShallowReactive",2],{"navigation_docs":3,"-project-v4":239,"-project-v4-surround":2150},[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":200,"body":241,"description":2141,"extension":2142,"links":2143,"meta":2144,"navigation":2145,"path":201,"seo":2146,"stem":202,"__hash__":2149},"docs\u002F5.project\u002F3.v4.md",{"type":242,"value":243,"toc":2126},"minimark",[244,264,271,420,425,444,451,454,514,527,531,584,588,611,623,867,872,886,1118,1120,1281,1284,1288,1333,1336,1489,1616,1653,1657,1788,1794,1798,1804,1896,1905,1914,2060,2064,2077,2081,2122],[245,246,247,248,259,260,263],"p",{},"jscpd v4 is the version of the copy\u002Fpaste detector written in TypeScript and running on Node.js. It is maintained on the ",[249,250,254,258],"a",{"href":251,"rel":252},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Ftree\u002Fmaster-v4",[253],"nofollow",[255,256,257],"code",{},"master-v4"," branch"," and published to npm under the ",[255,261,262],{},"latest-4"," dist-tag. The current major version, v5, is a Rust engine that ships as a self-contained binary and is what this site documents everywhere else.",[245,265,266,267,270],{},"Both versions read the same ",[255,268,269],{},".jscpd.json",", run the same Rabin-Karp detection algorithm, and produce the same report formats. They differ in how they are built and what surrounds the core:",[272,273,274,289],"table",{},[275,276,277],"thead",{},[278,279,280,283,286],"tr",{},[281,282],"th",{},[281,284,285],{},"v4 (TypeScript)",[281,287,288],{},"v5 (Rust)",[290,291,292,304,317,335,346,364,380,394,410],"tbody",{},[278,293,294,298,301],{},[295,296,297],"td",{},"Runtime",[295,299,300],{},"Node.js 20+",[295,302,303],{},"Self-contained binary, no runtime",[278,305,306,309,314],{},[295,307,308],{},"Install",[295,310,311],{},[255,312,313],{},"npm install -g jscpd@4",[295,315,316],{},"install script, npm, cargo, Homebrew, Nix, Docker",[278,318,319,322,333],{},[295,320,321],{},"Programming API",[295,323,324,325,328,329,332],{},"Node.js (",[255,326,327],{},"jscpd()",", ",[255,330,331],{},"detectClones()",")",[295,334,181],{},[278,336,337,340,343],{},[295,338,339],{},"Token cache for large repositories",[295,341,342],{},"LevelDB \u002F Redis stores",[295,344,345],{},"Not needed",[278,347,348,351,357],{},[295,349,350],{},"MCP server",[295,352,353,356],{},[255,354,355],{},"jscpd-server"," package (Streamable HTTP + REST)",[295,358,359,360,363],{},"built-in ",[255,361,362],{},"jscpd --mcp"," (stdio)",[278,365,366,368,371],{},[295,367,135],{},[295,369,370],{},"13",[295,372,373,374,328,377,332],{},"15 (adds ",[255,375,376],{},"openmetrics",[255,378,379],{},"codeclimate",[278,381,382,388,391],{},[295,383,384,385,332],{},"Baseline mode (",[255,386,387],{},"--fail-on-new-clones",[295,389,390],{},"No",[295,392,393],{},"Yes",[278,395,396,402,408],{},[295,397,398,399],{},"GitHub Action ",[255,400,401],{},"kucherenko\u002Fjscpd@v5",[295,403,404,405,332],{},"No (use ",[255,406,407],{},"npx jscpd@4",[295,409,393],{},[278,411,412,415,418],{},[295,413,414],{},"Formats",[295,416,417],{},"224",[295,419,417],{},[421,422,424],"h2",{"id":423},"when-to-use-v4","When to use v4",[426,427,428,432,438,441],"ul",{},[429,430,431],"li",{},"You call jscpd from Node.js code through the programming API.",[429,433,434,435,437],{},"You run ",[255,436,355],{}," as a REST or MCP endpoint.",[429,439,440],{},"You rely on the LevelDB or Redis store to share token maps between runs.",[429,442,443],{},"Your environment can run Node.js packages but cannot execute prebuilt native binaries.",[245,445,446,447,450],{},"If none of these apply, use v5. The ",[249,448,449],{"href":196},"migration guide"," lists every flag and config difference.",[421,452,15],{"id":453},"installation",[455,456,461],"pre",{"className":457,"code":458,"language":459,"meta":460,"style":460},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Global install (newest 4.x release)\nnpm install -g jscpd@4\n\n# No install — run once with npx\nnpx jscpd@4 .\n","bash","",[255,462,463,472,489,496,502],{"__ignoreMap":460},[464,465,468],"span",{"class":466,"line":467},"line",1,[464,469,471],{"class":470},"sHwdD","# Global install (newest 4.x release)\n",[464,473,475,479,483,486],{"class":466,"line":474},2,[464,476,478],{"class":477},"sBMFI","npm",[464,480,482],{"class":481},"sfazB"," install",[464,484,485],{"class":481}," -g",[464,487,488],{"class":481}," jscpd@4\n",[464,490,492],{"class":466,"line":491},3,[464,493,495],{"emptyLinePlaceholder":494},true,"\n",[464,497,499],{"class":466,"line":498},4,[464,500,501],{"class":470},"# No install — run once with npx\n",[464,503,505,508,511],{"class":466,"line":504},5,[464,506,507],{"class":477},"npx",[464,509,510],{"class":481}," jscpd@4",[464,512,513],{"class":481}," .\n",[245,515,516,519,520,522,523,526],{},[255,517,518],{},"jscpd@4"," resolves to the newest 4.x release through the ",[255,521,262],{}," dist-tag. Plain ",[255,524,525],{},"npm install -g jscpd"," installs v5. Node.js 20 or newer is required.",[421,528,530],{"id":529},"quick-start","Quick start",[455,532,534],{"className":457,"code":533,"language":459,"meta":460,"style":460},"# Scan a project\njscpd \u002Fpath\u002Fto\u002Fcode\n\n# Fail when more than 5% of the code is duplicated, write JSON and HTML reports\njscpd --threshold 5 --reporters console,json,html --output report .\u002Fsrc\n",[255,535,536,541,549,553,558],{"__ignoreMap":460},[464,537,538],{"class":466,"line":467},[464,539,540],{"class":470},"# Scan a project\n",[464,542,543,546],{"class":466,"line":474},[464,544,545],{"class":477},"jscpd",[464,547,548],{"class":481}," \u002Fpath\u002Fto\u002Fcode\n",[464,550,551],{"class":466,"line":491},[464,552,495],{"emptyLinePlaceholder":494},[464,554,555],{"class":466,"line":498},[464,556,557],{"class":470},"# Fail when more than 5% of the code is duplicated, write JSON and HTML reports\n",[464,559,560,562,565,569,572,575,578,581],{"class":466,"line":504},[464,561,545],{"class":477},[464,563,564],{"class":481}," --threshold",[464,566,568],{"class":567},"sbssI"," 5",[464,570,571],{"class":481}," --reporters",[464,573,574],{"class":481}," console,json,html",[464,576,577],{"class":481}," --output",[464,579,580],{"class":481}," report",[464,582,583],{"class":481}," .\u002Fsrc\n",[421,585,587],{"id":586},"cli","CLI",[455,589,591],{"className":457,"code":590,"language":459,"meta":460,"style":460},"jscpd [options] \u003Cpath ...>\n",[255,592,593],{"__ignoreMap":460},[464,594,595,597,601,605,608],{"class":466,"line":467},[464,596,545],{"class":477},[464,598,600],{"class":599},"sTEyZ"," [options] ",[464,602,604],{"class":603},"sMK4o","\u003C",[464,606,607],{"class":599},"path ...",[464,609,610],{"class":603},">\n",[245,612,613,614,619,620,622],{},"The most used options. The ",[249,615,618],{"href":616,"rel":617},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Fblob\u002Fmaster-v4\u002Fdocs\u002Ftypescript.md#options",[253],"full reference"," on the ",[255,621,257],{}," branch lists all of them.",[272,624,625,638],{},[275,626,627],{},[278,628,629,632,635],{},[281,630,631],{},"Option",[281,633,634],{},"Description",[281,636,637],{},"Default",[290,639,640,653,666,679,694,709,732,745,757,769,790,806,819,831,843,855],{},[278,641,642,647,650],{},[295,643,644],{},[255,645,646],{},"-l, --min-lines",[295,648,649],{},"Minimum lines in a clone",[295,651,652],{},"5",[278,654,655,660,663],{},[295,656,657],{},[255,658,659],{},"-k, --min-tokens",[295,661,662],{},"Minimum tokens in a clone",[295,664,665],{},"50",[278,667,668,673,676],{},[295,669,670],{},[255,671,672],{},"-t, --threshold",[295,674,675],{},"Duplication percentage threshold, exit 1 if exceeded",[295,677,678],{},"—",[278,680,681,686,689],{},[295,682,683],{},[255,684,685],{},"-r, --reporters",[295,687,688],{},"Comma-separated reporters",[295,690,691],{},[255,692,693],{},"time,console",[278,695,696,701,704],{},[295,697,698],{},[255,699,700],{},"-o, --output",[295,702,703],{},"Output directory for file reporters",[295,705,706],{},[255,707,708],{},".\u002Freport\u002F",[278,710,711,716,728],{},[295,712,713],{},[255,714,715],{},"-m, --mode",[295,717,718,719,328,722,328,725],{},"Detection mode: ",[255,720,721],{},"strict",[255,723,724],{},"mild",[255,726,727],{},"weak",[295,729,730],{},[255,731,724],{},[278,733,734,739,742],{},[295,735,736],{},[255,737,738],{},"-f, --format",[295,740,741],{},"Formats to check (comma-separated)",[295,743,744],{},"all detected",[278,746,747,752,755],{},[295,748,749],{},[255,750,751],{},"-i, --ignore",[295,753,754],{},"Glob patterns to exclude",[295,756,678],{},[278,758,759,764,767],{},[295,760,761],{},[255,762,763],{},"-p, --pattern",[295,765,766],{},"Glob pattern for file search",[295,768,678],{},[278,770,771,780,787],{},[295,772,773,776,777],{},[255,774,775],{},"--gitignore"," \u002F ",[255,778,779],{},"--no-gitignore",[295,781,782,783,786],{},"Respect ",[255,784,785],{},".gitignore"," files",[295,788,789],{},"on",[278,791,792,797,803],{},[295,793,794],{},[255,795,796],{},"--store",[295,798,799,802],{},[255,800,801],{},"leveldb"," for large repositories",[295,804,805],{},"memory",[278,807,808,813,816],{},[295,809,810],{},[255,811,812],{},"-b, --blame",[295,814,815],{},"Enrich clones with git blame author data",[295,817,818],{},"off",[278,820,821,826,829],{},[295,822,823],{},[255,824,825],{},"--skipLocal",[295,827,828],{},"Skip clones within the same directory",[295,830,818],{},[278,832,833,838,841],{},[295,834,835],{},[255,836,837],{},"--exitCode",[295,839,840],{},"Exit code when clones are detected",[295,842,678],{},[278,844,845,850,853],{},[295,846,847],{},[255,848,849],{},"--noTips",[295,851,852],{},"Suppress tips (useful in CI)",[295,854,818],{},[278,856,857,862,865],{},[295,858,859],{},[255,860,861],{},"--list",[295,863,864],{},"List all supported formats",[295,866,678],{},[868,869,871],"h3",{"id":870},"configuration","Configuration",[245,873,874,875,877,878,881,882,885],{},"Create ",[255,876,269],{}," in the project root, or put the same keys under a ",[255,879,880],{},"\"jscpd\""," key in ",[255,883,884],{},"package.json",":",[455,887,891],{"className":888,"code":889,"language":890,"meta":460,"style":460},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"path\": [\".\u002Fsrc\"],\n  \"reporters\": [\"console\", \"json\", \"html\"],\n  \"minLines\": 5,\n  \"minTokens\": 50,\n  \"threshold\": 5,\n  \"format\": [\"javascript\", \"typescript\"],\n  \"ignore\": [\"**\u002Fnode_modules\u002F**\", \"**\u002Fdist\u002F**\"],\n  \"gitignore\": true,\n  \"mode\": \"mild\"\n}\n","json",[255,892,893,898,925,966,982,998,1014,1046,1078,1093,1112],{"__ignoreMap":460},[464,894,895],{"class":466,"line":467},[464,896,897],{"class":603},"{\n",[464,899,900,903,907,910,912,915,917,920,922],{"class":466,"line":474},[464,901,902],{"class":603},"  \"",[464,904,906],{"class":905},"spNyl","path",[464,908,909],{"class":603},"\"",[464,911,885],{"class":603},[464,913,914],{"class":603}," [",[464,916,909],{"class":603},[464,918,919],{"class":481},".\u002Fsrc",[464,921,909],{"class":603},[464,923,924],{"class":603},"],\n",[464,926,927,929,932,934,936,938,940,943,945,948,951,953,955,957,959,962,964],{"class":466,"line":491},[464,928,902],{"class":603},[464,930,931],{"class":905},"reporters",[464,933,909],{"class":603},[464,935,885],{"class":603},[464,937,914],{"class":603},[464,939,909],{"class":603},[464,941,942],{"class":481},"console",[464,944,909],{"class":603},[464,946,947],{"class":603},",",[464,949,950],{"class":603}," \"",[464,952,890],{"class":481},[464,954,909],{"class":603},[464,956,947],{"class":603},[464,958,950],{"class":603},[464,960,961],{"class":481},"html",[464,963,909],{"class":603},[464,965,924],{"class":603},[464,967,968,970,973,975,977,979],{"class":466,"line":498},[464,969,902],{"class":603},[464,971,972],{"class":905},"minLines",[464,974,909],{"class":603},[464,976,885],{"class":603},[464,978,568],{"class":567},[464,980,981],{"class":603},",\n",[464,983,984,986,989,991,993,996],{"class":466,"line":504},[464,985,902],{"class":603},[464,987,988],{"class":905},"minTokens",[464,990,909],{"class":603},[464,992,885],{"class":603},[464,994,995],{"class":567}," 50",[464,997,981],{"class":603},[464,999,1001,1003,1006,1008,1010,1012],{"class":466,"line":1000},6,[464,1002,902],{"class":603},[464,1004,1005],{"class":905},"threshold",[464,1007,909],{"class":603},[464,1009,885],{"class":603},[464,1011,568],{"class":567},[464,1013,981],{"class":603},[464,1015,1017,1019,1022,1024,1026,1028,1030,1033,1035,1037,1039,1042,1044],{"class":466,"line":1016},7,[464,1018,902],{"class":603},[464,1020,1021],{"class":905},"format",[464,1023,909],{"class":603},[464,1025,885],{"class":603},[464,1027,914],{"class":603},[464,1029,909],{"class":603},[464,1031,1032],{"class":481},"javascript",[464,1034,909],{"class":603},[464,1036,947],{"class":603},[464,1038,950],{"class":603},[464,1040,1041],{"class":481},"typescript",[464,1043,909],{"class":603},[464,1045,924],{"class":603},[464,1047,1049,1051,1054,1056,1058,1060,1062,1065,1067,1069,1071,1074,1076],{"class":466,"line":1048},8,[464,1050,902],{"class":603},[464,1052,1053],{"class":905},"ignore",[464,1055,909],{"class":603},[464,1057,885],{"class":603},[464,1059,914],{"class":603},[464,1061,909],{"class":603},[464,1063,1064],{"class":481},"**\u002Fnode_modules\u002F**",[464,1066,909],{"class":603},[464,1068,947],{"class":603},[464,1070,950],{"class":603},[464,1072,1073],{"class":481},"**\u002Fdist\u002F**",[464,1075,909],{"class":603},[464,1077,924],{"class":603},[464,1079,1081,1083,1086,1088,1090],{"class":466,"line":1080},9,[464,1082,902],{"class":603},[464,1084,1085],{"class":905},"gitignore",[464,1087,909],{"class":603},[464,1089,885],{"class":603},[464,1091,1092],{"class":603}," true,\n",[464,1094,1096,1098,1101,1103,1105,1107,1109],{"class":466,"line":1095},10,[464,1097,902],{"class":603},[464,1099,1100],{"class":905},"mode",[464,1102,909],{"class":603},[464,1104,885],{"class":603},[464,1106,950],{"class":603},[464,1108,724],{"class":481},[464,1110,1111],{"class":603},"\"\n",[464,1113,1115],{"class":466,"line":1114},11,[464,1116,1117],{"class":603},"}\n",[868,1119,135],{"id":931},[272,1121,1122,1132],{},[275,1123,1124],{},[278,1125,1126,1129],{},[281,1127,1128],{},"Reporter",[281,1130,1131],{},"Output",[290,1133,1134,1143,1153,1164,1177,1189,1201,1213,1226,1239,1249,1259,1271],{},[278,1135,1136,1140],{},[295,1137,1138],{},[255,1139,942],{},[295,1141,1142],{},"Clone list with a per-format statistics table",[278,1144,1145,1150],{},[295,1146,1147],{},[255,1148,1149],{},"consoleFull",[295,1151,1152],{},"Full source snippets for each clone",[278,1154,1155,1159],{},[295,1156,1157],{},[255,1158,890],{},[295,1160,1161],{},[255,1162,1163],{},"report\u002Fjscpd-report.json",[278,1165,1166,1171],{},[295,1167,1168],{},[255,1169,1170],{},"xml",[295,1172,1173,1176],{},[255,1174,1175],{},"report\u002Fjscpd-report.xml"," (PMD CPD format)",[278,1178,1179,1184],{},[295,1180,1181],{},[255,1182,1183],{},"csv",[295,1185,1186],{},[255,1187,1188],{},"report\u002Fjscpd-report.csv",[278,1190,1191,1196],{},[295,1192,1193],{},[255,1194,1195],{},"markdown",[295,1197,1198],{},[255,1199,1200],{},"report\u002Fjscpd-report.md",[278,1202,1203,1207],{},[295,1204,1205],{},[255,1206,961],{},[295,1208,1209,1210],{},"Interactive HTML report in ",[255,1211,1212],{},"report\u002Fhtml\u002F",[278,1214,1215,1220],{},[295,1216,1217],{},[255,1218,1219],{},"badge",[295,1221,1222,1223],{},"SVG badge ",[255,1224,1225],{},"report\u002Fjscpd-badge.svg",[278,1227,1228,1233],{},[295,1229,1230],{},[255,1231,1232],{},"sarif",[295,1234,1235,1238],{},[255,1236,1237],{},"report\u002Fjscpd-sarif.json"," for GitHub Code Scanning",[278,1240,1241,1246],{},[295,1242,1243],{},[255,1244,1245],{},"ai",[295,1247,1248],{},"Token-efficient output for LLM pipelines",[278,1250,1251,1256],{},[295,1252,1253],{},[255,1254,1255],{},"xcode",[295,1257,1258],{},"Xcode-compatible warnings",[278,1260,1261,1265],{},[295,1262,1263],{},[255,1264,1005],{},[295,1266,1267,1268],{},"Exit 1 if duplication exceeds ",[255,1269,1270],{},"--threshold",[278,1272,1273,1278],{},[295,1274,1275],{},[255,1276,1277],{},"silent",[295,1279,1280],{},"No console output",[245,1282,1283],{},"Third-party reporters are loaded by npm package name.",[868,1285,1287],{"id":1286},"detection-modes","Detection modes",[272,1289,1290,1300],{},[275,1291,1292],{},[278,1293,1294,1297],{},[281,1295,1296],{},"Mode",[281,1298,1299],{},"Behavior",[290,1301,1302,1311,1320],{},[278,1303,1304,1308],{},[295,1305,1306],{},[255,1307,721],{},[295,1309,1310],{},"All tokens must match, including whitespace and newlines",[278,1312,1313,1317],{},[295,1314,1315],{},[255,1316,724],{},[295,1318,1319],{},"Ignore empty and newline tokens",[278,1321,1322,1326],{},[295,1323,1324],{},[255,1325,727],{},[295,1327,1328,1329,1332],{},"Ignore comments, empty tokens, and newlines (",[255,1330,1331],{},"--skipComments"," is an alias)",[421,1334,321],{"id":1335},"programming-api",[455,1337,1340],{"className":1338,"code":1339,"language":1041,"meta":460,"style":460},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { detectClones } from 'jscpd';\n\nconst clones = await detectClones({\n  path: ['.\u002Fsrc'],\n  silent: true,\n  format: ['javascript', 'typescript'],\n  minLines: 5,\n  minTokens: 50,\n});\n",[255,1341,1342,1371,1375,1397,1418,1431,1458,1469,1480],{"__ignoreMap":460},[464,1343,1344,1348,1351,1354,1357,1360,1363,1365,1368],{"class":466,"line":467},[464,1345,1347],{"class":1346},"s7zQu","import",[464,1349,1350],{"class":603}," {",[464,1352,1353],{"class":599}," detectClones",[464,1355,1356],{"class":603}," }",[464,1358,1359],{"class":1346}," from",[464,1361,1362],{"class":603}," '",[464,1364,545],{"class":481},[464,1366,1367],{"class":603},"'",[464,1369,1370],{"class":603},";\n",[464,1372,1373],{"class":466,"line":474},[464,1374,495],{"emptyLinePlaceholder":494},[464,1376,1377,1380,1383,1386,1389,1392,1395],{"class":466,"line":491},[464,1378,1379],{"class":905},"const",[464,1381,1382],{"class":599}," clones ",[464,1384,1385],{"class":603},"=",[464,1387,1388],{"class":1346}," await",[464,1390,1353],{"class":1391},"s2Zo4",[464,1393,1394],{"class":599},"(",[464,1396,897],{"class":603},[464,1398,1399,1403,1405,1407,1409,1411,1413,1416],{"class":466,"line":498},[464,1400,1402],{"class":1401},"swJcz","  path",[464,1404,885],{"class":603},[464,1406,914],{"class":599},[464,1408,1367],{"class":603},[464,1410,919],{"class":481},[464,1412,1367],{"class":603},[464,1414,1415],{"class":599},"]",[464,1417,981],{"class":603},[464,1419,1420,1423,1425,1429],{"class":466,"line":504},[464,1421,1422],{"class":1401},"  silent",[464,1424,885],{"class":603},[464,1426,1428],{"class":1427},"sfNiH"," true",[464,1430,981],{"class":603},[464,1432,1433,1436,1438,1440,1442,1444,1446,1448,1450,1452,1454,1456],{"class":466,"line":1000},[464,1434,1435],{"class":1401},"  format",[464,1437,885],{"class":603},[464,1439,914],{"class":599},[464,1441,1367],{"class":603},[464,1443,1032],{"class":481},[464,1445,1367],{"class":603},[464,1447,947],{"class":603},[464,1449,1362],{"class":603},[464,1451,1041],{"class":481},[464,1453,1367],{"class":603},[464,1455,1415],{"class":599},[464,1457,981],{"class":603},[464,1459,1460,1463,1465,1467],{"class":466,"line":1016},[464,1461,1462],{"class":1401},"  minLines",[464,1464,885],{"class":603},[464,1466,568],{"class":567},[464,1468,981],{"class":603},[464,1470,1471,1474,1476,1478],{"class":466,"line":1048},[464,1472,1473],{"class":1401},"  minTokens",[464,1475,885],{"class":603},[464,1477,995],{"class":567},[464,1479,981],{"class":603},[464,1481,1482,1485,1487],{"class":466,"line":1080},[464,1483,1484],{"class":603},"}",[464,1486,332],{"class":599},[464,1488,1370],{"class":603},[455,1490,1492],{"className":1338,"code":1491,"language":1041,"meta":460,"style":460},"import { IClone } from '@jscpd\u002Fcore';\nimport { jscpd } from 'jscpd';\n\n\u002F\u002F argv-style, same options as the CLI\nconst clones: IClone[] = await jscpd(['', '', '.\u002Fsrc', '-m', 'weak', '--silent']);\n",[255,1493,1494,1516,1537,1541,1546],{"__ignoreMap":460},[464,1495,1496,1498,1500,1503,1505,1507,1509,1512,1514],{"class":466,"line":467},[464,1497,1347],{"class":1346},[464,1499,1350],{"class":603},[464,1501,1502],{"class":599}," IClone",[464,1504,1356],{"class":603},[464,1506,1359],{"class":1346},[464,1508,1362],{"class":603},[464,1510,1511],{"class":481},"@jscpd\u002Fcore",[464,1513,1367],{"class":603},[464,1515,1370],{"class":603},[464,1517,1518,1520,1522,1525,1527,1529,1531,1533,1535],{"class":466,"line":474},[464,1519,1347],{"class":1346},[464,1521,1350],{"class":603},[464,1523,1524],{"class":599}," jscpd",[464,1526,1356],{"class":603},[464,1528,1359],{"class":1346},[464,1530,1362],{"class":603},[464,1532,545],{"class":481},[464,1534,1367],{"class":603},[464,1536,1370],{"class":603},[464,1538,1539],{"class":466,"line":491},[464,1540,495],{"emptyLinePlaceholder":494},[464,1542,1543],{"class":466,"line":498},[464,1544,1545],{"class":470},"\u002F\u002F argv-style, same options as the CLI\n",[464,1547,1548,1550,1553,1555,1557,1560,1562,1564,1566,1569,1572,1574,1577,1579,1581,1583,1585,1587,1589,1592,1594,1596,1598,1600,1602,1604,1606,1609,1611,1614],{"class":466,"line":504},[464,1549,1379],{"class":905},[464,1551,1552],{"class":599}," clones",[464,1554,885],{"class":603},[464,1556,1502],{"class":477},[464,1558,1559],{"class":599},"[] ",[464,1561,1385],{"class":603},[464,1563,1388],{"class":1346},[464,1565,1524],{"class":1391},[464,1567,1568],{"class":599},"([",[464,1570,1571],{"class":603},"''",[464,1573,947],{"class":603},[464,1575,1576],{"class":603}," ''",[464,1578,947],{"class":603},[464,1580,1362],{"class":603},[464,1582,919],{"class":481},[464,1584,1367],{"class":603},[464,1586,947],{"class":603},[464,1588,1362],{"class":603},[464,1590,1591],{"class":481},"-m",[464,1593,1367],{"class":603},[464,1595,947],{"class":603},[464,1597,1362],{"class":603},[464,1599,727],{"class":481},[464,1601,1367],{"class":603},[464,1603,947],{"class":603},[464,1605,1362],{"class":603},[464,1607,1608],{"class":481},"--silent",[464,1610,1367],{"class":603},[464,1612,1613],{"class":599},"])",[464,1615,1370],{"class":603},[245,1617,1618,1619,1622,1623,1626,1627,1629,1630,1626,1633,1636,1637,1642,1643,619,1650,1652],{},"Pass a store as the second argument of ",[255,1620,1621],{},"detectClones"," to reuse token maps between runs: ",[255,1624,1625],{},"MemoryStore"," from ",[255,1628,1511],{}," or ",[255,1631,1632],{},"LevelDBStore",[255,1634,1635],{},"@jscpd\u002Fleveldb-store",". The ",[249,1638,1641],{"href":1639,"rel":1640},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Fblob\u002Fmaster-v4\u002Fdocs\u002Fapi.md",[253],"API docs"," and ",[249,1644,1647],{"href":1645,"rel":1646},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Ftree\u002Fmaster-v4\u002Fexamples\u002Fapi",[253],[255,1648,1649],{},"examples\u002Fapi",[255,1651,257],{}," branch have complete examples.",[421,1654,1656],{"id":1655},"packages","Packages",[272,1658,1659,1668],{},[275,1660,1661],{},[278,1662,1663,1666],{},[281,1664,1665],{},"Package",[281,1667,634],{},[290,1669,1670,1681,1692,1705,1717,1729,1741,1753,1765,1776],{},[278,1671,1672,1678],{},[295,1673,1674],{},[249,1675,545],{"href":1676,"rel":1677},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fjscpd",[253],[295,1679,1680],{},"CLI and Node.js API",[278,1682,1683,1689],{},[295,1684,1685],{},[249,1686,355],{"href":1687,"rel":1688},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fjscpd-server",[253],[295,1690,1691],{},"REST API and MCP server (Streamable HTTP)",[278,1693,1694,1700],{},[295,1695,1696],{},[249,1697,1511],{"href":1698,"rel":1699},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Fcore",[253],[295,1701,1702,1703],{},"Core detection algorithm, interfaces, ",[255,1704,1625],{},[278,1706,1707,1714],{},[295,1708,1709],{},[249,1710,1713],{"href":1711,"rel":1712},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Ffinder",[253],"@jscpd\u002Ffinder",[295,1715,1716],{},"File discovery, detection orchestration, built-in reporters",[278,1718,1719,1726],{},[295,1720,1721],{},[249,1722,1725],{"href":1723,"rel":1724},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Ftokenizer",[253],"@jscpd\u002Ftokenizer",[295,1727,1728],{},"Source code tokenization (224 formats)",[278,1730,1731,1738],{},[295,1732,1733],{},[249,1734,1737],{"href":1735,"rel":1736},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Fhtml-reporter",[253],"@jscpd\u002Fhtml-reporter",[295,1739,1740],{},"HTML report",[278,1742,1743,1750],{},[295,1744,1745],{},[249,1746,1749],{"href":1747,"rel":1748},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Fbadge-reporter",[253],"@jscpd\u002Fbadge-reporter",[295,1751,1752],{},"SVG badge",[278,1754,1755,1762],{},[295,1756,1757],{},[249,1758,1761],{"href":1759,"rel":1760},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fjscpd-sarif-reporter",[253],"jscpd-sarif-reporter",[295,1763,1764],{},"SARIF for GitHub Code Scanning",[278,1766,1767,1773],{},[295,1768,1769],{},[249,1770,1635],{"href":1771,"rel":1772},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Fleveldb-store",[253],[295,1774,1775],{},"LevelDB persistent store",[278,1777,1778,1785],{},[295,1779,1780],{},[249,1781,1784],{"href":1782,"rel":1783},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@jscpd\u002Fredis-store",[253],"@jscpd\u002Fredis-store",[295,1786,1787],{},"Redis distributed store",[245,1789,1790,1791,1793],{},"All of them are published from the ",[255,1792,257],{}," branch.",[421,1795,1797],{"id":1796},"ci-and-pre-commit","CI and pre-commit",[245,1799,1800,1801,1803],{},"Run the CLI with ",[255,1802,507],{}," in any CI system that has Node.js:",[455,1805,1809],{"className":1806,"code":1807,"language":1808,"meta":460,"style":460},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# GitHub Actions\n- uses: actions\u002Fsetup-node@v4\n  with:\n    node-version: 22\n- run: npx jscpd@4 --threshold 5 --reporters console,sarif --output report .\n- uses: github\u002Fcodeql-action\u002Fupload-sarif@v3\n  if: always()\n  with:\n    sarif_file: report\u002Fjscpd-sarif.json\n","yaml",[255,1810,1811,1816,1829,1837,1847,1859,1870,1880,1886],{"__ignoreMap":460},[464,1812,1813],{"class":466,"line":467},[464,1814,1815],{"class":470},"# GitHub Actions\n",[464,1817,1818,1821,1824,1826],{"class":466,"line":474},[464,1819,1820],{"class":603},"-",[464,1822,1823],{"class":1401}," uses",[464,1825,885],{"class":603},[464,1827,1828],{"class":481}," actions\u002Fsetup-node@v4\n",[464,1830,1831,1834],{"class":466,"line":491},[464,1832,1833],{"class":1401},"  with",[464,1835,1836],{"class":603},":\n",[464,1838,1839,1842,1844],{"class":466,"line":498},[464,1840,1841],{"class":1401},"    node-version",[464,1843,885],{"class":603},[464,1845,1846],{"class":567}," 22\n",[464,1848,1849,1851,1854,1856],{"class":466,"line":504},[464,1850,1820],{"class":603},[464,1852,1853],{"class":1401}," run",[464,1855,885],{"class":603},[464,1857,1858],{"class":481}," npx jscpd@4 --threshold 5 --reporters console,sarif --output report .\n",[464,1860,1861,1863,1865,1867],{"class":466,"line":1000},[464,1862,1820],{"class":603},[464,1864,1823],{"class":1401},[464,1866,885],{"class":603},[464,1868,1869],{"class":481}," github\u002Fcodeql-action\u002Fupload-sarif@v3\n",[464,1871,1872,1875,1877],{"class":466,"line":1016},[464,1873,1874],{"class":1401},"  if",[464,1876,885],{"class":603},[464,1878,1879],{"class":481}," always()\n",[464,1881,1882,1884],{"class":466,"line":1048},[464,1883,1833],{"class":1401},[464,1885,1836],{"class":603},[464,1887,1888,1891,1893],{"class":466,"line":1080},[464,1889,1890],{"class":1401},"    sarif_file",[464,1892,885],{"class":603},[464,1894,1895],{"class":481}," report\u002Fjscpd-sarif.json\n",[245,1897,1898,1899,1901,1902,1904],{},"The ",[255,1900,401],{}," GitHub Action and the Docker image install the v5 engine. Use the ",[255,1903,407],{}," form when you need the Node.js engine.",[245,1906,1907,1908,1913],{},"Pre-commit hook via the ",[249,1909,1912],{"href":1910,"rel":1911},"https:\u002F\u002Fpre-commit.com",[253],"pre-commit"," framework:",[455,1915,1917],{"className":1806,"code":1916,"language":1808,"meta":460,"style":460},"repos:\n  - repo: local\n    hooks:\n      - id: jscpd\n        name: jscpd - copy\u002Fpaste detector\n        entry: jscpd\n        language: node\n        additional_dependencies: ['jscpd@4']\n        args: [--threshold, \"5\", --reporters, console,silent]\n        pass_filenames: false\n        always_run: true\n",[255,1918,1919,1926,1939,1946,1959,1969,1978,1988,2006,2040,2050],{"__ignoreMap":460},[464,1920,1921,1924],{"class":466,"line":467},[464,1922,1923],{"class":1401},"repos",[464,1925,1836],{"class":603},[464,1927,1928,1931,1934,1936],{"class":466,"line":474},[464,1929,1930],{"class":603},"  -",[464,1932,1933],{"class":1401}," repo",[464,1935,885],{"class":603},[464,1937,1938],{"class":481}," local\n",[464,1940,1941,1944],{"class":466,"line":491},[464,1942,1943],{"class":1401},"    hooks",[464,1945,1836],{"class":603},[464,1947,1948,1951,1954,1956],{"class":466,"line":498},[464,1949,1950],{"class":603},"      -",[464,1952,1953],{"class":1401}," id",[464,1955,885],{"class":603},[464,1957,1958],{"class":481}," jscpd\n",[464,1960,1961,1964,1966],{"class":466,"line":504},[464,1962,1963],{"class":1401},"        name",[464,1965,885],{"class":603},[464,1967,1968],{"class":481}," jscpd - copy\u002Fpaste detector\n",[464,1970,1971,1974,1976],{"class":466,"line":1000},[464,1972,1973],{"class":1401},"        entry",[464,1975,885],{"class":603},[464,1977,1958],{"class":481},[464,1979,1980,1983,1985],{"class":466,"line":1016},[464,1981,1982],{"class":1401},"        language",[464,1984,885],{"class":603},[464,1986,1987],{"class":481}," node\n",[464,1989,1990,1993,1995,1997,1999,2001,2003],{"class":466,"line":1048},[464,1991,1992],{"class":1401},"        additional_dependencies",[464,1994,885],{"class":603},[464,1996,914],{"class":603},[464,1998,1367],{"class":603},[464,2000,518],{"class":481},[464,2002,1367],{"class":603},[464,2004,2005],{"class":603},"]\n",[464,2007,2008,2011,2013,2015,2017,2019,2021,2023,2025,2027,2029,2031,2034,2036,2038],{"class":466,"line":1080},[464,2009,2010],{"class":1401},"        args",[464,2012,885],{"class":603},[464,2014,914],{"class":603},[464,2016,1270],{"class":481},[464,2018,947],{"class":603},[464,2020,950],{"class":603},[464,2022,652],{"class":481},[464,2024,909],{"class":603},[464,2026,947],{"class":603},[464,2028,571],{"class":481},[464,2030,947],{"class":603},[464,2032,2033],{"class":481}," console",[464,2035,947],{"class":603},[464,2037,1277],{"class":481},[464,2039,2005],{"class":603},[464,2041,2042,2045,2047],{"class":466,"line":1095},[464,2043,2044],{"class":1401},"        pass_filenames",[464,2046,885],{"class":603},[464,2048,2049],{"class":1427}," false\n",[464,2051,2052,2055,2057],{"class":466,"line":1114},[464,2053,2054],{"class":1401},"        always_run",[464,2056,885],{"class":603},[464,2058,2059],{"class":1427}," true\n",[421,2061,2063],{"id":2062},"ai-tooling","AI tooling",[426,2065,2066,2072],{},[429,2067,2068,2071],{},[255,2069,2070],{},"--reporters ai"," prints a compact clone list for LLM pipelines and coding agents.",[429,2073,2074,2076],{},[255,2075,355],{}," exposes the detector as MCP tools over Streamable HTTP plus a REST API, so an assistant can check a snippet against your codebase on demand.",[421,2078,2080],{"id":2079},"maintenance-policy","Maintenance policy",[426,2082,2083,2089,2098,2103],{},[429,2084,2085,2086,2088],{},"v4 receives bug fixes and security fixes on ",[255,2087,257],{},". New features land in v5.",[429,2090,2091,2092,2097],{},"Bug reports for v4 go to the shared ",[249,2093,2096],{"href":2094,"rel":2095},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Fissues",[253],"issue tracker","; pick \"v4 (TypeScript)\" in the engine field.",[429,2099,2100,2101,1793],{},"Pull requests for v4 must target the ",[255,2102,257],{},[429,2104,2105,2106,328,2111,328,2116,2121],{},"Full v4 documentation: ",[249,2107,2110],{"href":2108,"rel":2109},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Fblob\u002Fmaster-v4\u002FREADME.md",[253],"README",[249,2112,2115],{"href":2113,"rel":2114},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Fblob\u002Fmaster-v4\u002Fdocs\u002Ftypescript.md",[253],"CLI reference",[249,2117,2120],{"href":2118,"rel":2119},"https:\u002F\u002Fgithub.com\u002Fkucherenko\u002Fjscpd\u002Fblob\u002Fmaster-v4\u002FCHANGELOG.md",[253],"changelog",".",[2123,2124,2125],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":460,"searchDepth":474,"depth":474,"links":2127},[2128,2129,2130,2131,2136,2137,2138,2139,2140],{"id":423,"depth":474,"text":424},{"id":453,"depth":474,"text":15},{"id":529,"depth":474,"text":530},{"id":586,"depth":474,"text":587,"children":2132},[2133,2134,2135],{"id":870,"depth":491,"text":871},{"id":931,"depth":491,"text":135},{"id":1286,"depth":491,"text":1287},{"id":1335,"depth":474,"text":321},{"id":1655,"depth":474,"text":1656},{"id":1796,"depth":474,"text":1797},{"id":2062,"depth":474,"text":2063},{"id":2079,"depth":474,"text":2080},"The Node.js version of jscpd — where it lives, when to use it, and how to install and run it.","md",null,{},{"icon":203},{"title":2147,"description":2148},"jscpd v4 (TypeScript engine)","jscpd v4 is the TypeScript version of the copy\u002Fpaste detector, maintained on the master-v4 branch and published as jscpd@4. Install, CLI, config, reporters, Node.js API, and packages.","BMgUAH6WJuSIXCMi3BGDCHObOaEgEEQCZZUghCuP8Is",[2151,2153],{"title":195,"path":196,"stem":197,"description":2152,"icon":198,"children":-1},"Guide for upgrading from jscpd v4 (TypeScript) to v5 (Rust).",{"title":205,"path":206,"stem":207,"description":2154,"icon":210,"children":-1},"How jscpd v5 compares to other copy\u002Fpaste detectors in speed, format coverage and token efficiency.",1791302985847]