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