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