Skip to content

jscpd

GitHub stars GitHub release (latest SemVer) GitHub last commit GitHub commit activity GitHub contributors

JSCPD browses all files of your repository to detect excessive copy-pastes

If you need to ignore folders,files or file extensions, use glob expressions ignore property of local .jscpd.json file

Example:

{
  "threshold": 0,
  "reporters": ["html", "markdown"],
  "ignore": [
    "**/node_modules/**",
    "**/.git/**",
    "**/*.md",
    "**/myFolderToSkip/**"
  ]
}

jscpd documentation

jscpd - GitHub

Configuration in MegaLinter

Variable Description Default value
COPYPASTE_JSCPD_ARGUMENTS User custom arguments to add in linter CLI call
Ex: -s --foo "bar"
COPYPASTE_JSCPD_COMMAND_REMOVE_ARGUMENTS User custom arguments to remove from command line before calling the linter
Ex: -s --foo "bar"
COPYPASTE_JSCPD_CLI_LINT_MODE Override default CLI lint mode
⚠️ As default value is project, overriding might not work
- file: Calls the linter for each file
- list_of_files: Call the linter with the list of files as argument
- project: Call the linter from the root of the project
project
COPYPASTE_JSCPD_PRE_COMMANDS List of bash commands to run before the linter None
COPYPASTE_JSCPD_POST_COMMANDS List of bash commands to run after the linter None
COPYPASTE_JSCPD_UNSECURED_ENV_VARIABLES List of env variables explicitly not filtered before calling COPYPASTE_JSCPD and its pre/post commands None
COPYPASTE_JSCPD_CONFIG_FILE jscpd configuration file nameUse LINTER_DEFAULT to let the linter find it .jscpd.json
COPYPASTE_JSCPD_RULES_PATH Path where to find linter configuration file Workspace folder, then MegaLinter default rules
COPYPASTE_JSCPD_DISABLE_ERRORS Run linter but consider errors as warnings false
COPYPASTE_JSCPD_DISABLE_ERRORS_IF_LESS_THAN Maximum number of errors allowed 0
COPYPASTE_JSCPD_CLI_EXECUTABLE Override CLI executable ['jscpd']

MegaLinter Flavors

This linter is available in the following flavors

Flavor Description Embedded linters Info
all Default MegaLinter Flavor 124 Docker Image Size (tag) Docker Pulls
c_cpp Optimized for pure C/C++ projects 54 Docker Image Size (tag) Docker Pulls
ci_light Optimized for CI items (Dockerfile, Jenkinsfile, JSON/YAML schemas,XML 21 Docker Image Size (tag) Docker Pulls
cupcake MegaLinter for the most commonly used languages 83 Docker Image Size (tag) Docker Pulls
documentation MegaLinter for documentation projects 49 Docker Image Size (tag) Docker Pulls
dotnet Optimized for C, C++, C# or VB based projects 62 Docker Image Size (tag) Docker Pulls
dotnetweb Optimized for C, C++, C# or VB based projects with JS/TS 71 Docker Image Size (tag) Docker Pulls
go Optimized for GO based projects 51 Docker Image Size (tag) Docker Pulls
java Optimized for JAVA based projects 52 Docker Image Size (tag) Docker Pulls
javascript Optimized for JAVASCRIPT or TYPESCRIPT based projects 59 Docker Image Size (tag) Docker Pulls
php Optimized for PHP based projects 54 Docker Image Size (tag) Docker Pulls
python Optimized for PYTHON based projects 62 Docker Image Size (tag) Docker Pulls
ruby Optimized for RUBY based projects 50 Docker Image Size (tag) Docker Pulls
rust Optimized for RUST based projects 50 Docker Image Size (tag) Docker Pulls
salesforce Optimized for Salesforce based projects 54 Docker Image Size (tag) Docker Pulls
swift Optimized for SWIFT based projects 50 Docker Image Size (tag) Docker Pulls
terraform Optimized for TERRAFORM based projects 54 Docker Image Size (tag) Docker Pulls

Behind the scenes

How are identified applicable files

  • If this linter is active, all files will always be linted

How the linting is performed

jscpd is called once on the whole project directory (project CLI lint mode)

  • filtering can not be done using MegaLinter configuration variables,it must be done using jscpd configuration or ignore file (if existing)
  • VALIDATE_ALL_CODEBASE: false doesn't make jscpd analyze only updated files

Example calls

jscpd --output ./report/copy-paste/ .
jscpd --output ./report/copy-paste/ -c .jscpd.json .

Help content

Usage: jscpd [options] <path ...>

detector of copy/paste in files

Options:
  -V, --version              output the version number
  -l, --min-lines [number]   min size of duplication in code lines (Default is
                             5)
  -k, --min-tokens [number]  min size of duplication in code tokens (Default is
                             50)
  -x, --max-lines [number]   max size of source in lines (Default is 1000)
  -z, --max-size [string]    max size of source in bytes, examples: 1kb, 1mb,
                             120kb (Default is 100kb)
  -t, --threshold [number]   threshold for duplication, in case duplications >=
                             threshold jscpd will exit with error
  -c, --config [string]      path to config file (Default is .jscpd.json in
                             <path>)
  -i, --ignore [string]      glob pattern for files what should be excluded
                             from duplication detection
  --ignore-pattern [string]  Ignore code blocks matching the regexp patterns
  -r, --reporters [string]   reporters or list of reporters separated with
                             comma to use (Default is time,console)
  -o, --output [string]      reporters to use (Default is ./report/)
  -m, --mode [string]        mode of quality of search, can be "strict", "mild" and "weak" (Default is "function mild(token) {
    return strict(token) && token.type !== "empty" && token.type !== "new_line";
  }")
  -f, --format [string]      format or formats separated by comma (Example
                             php,javascript,python)
  -p, --pattern [string]     glob pattern to file search (Example **/*.txt)
  -b, --blame                blame authors of duplications (get information
                             about authors from git)
  -s, --silent               do not write detection progress and result to a
                             console
  --store [string]           use for define custom store (e.g. --store leveldb
                             used for big codebase)
  -a, --absolute             use absolute path in reports
  -n, --noSymlinks           dont use symlinks for detection in files
  --ignoreCase               ignore case of symbols in code (experimental)
  -g, --gitignore            ignore all files from .gitignore file
  --formats-exts [string]    list of formats with file extensions
                             (javascript:es,es6;dart:dt)
  -d, --debug                show debug information, not run detection
                             process(options list and selected files)
  -v, --verbose              show full information during detection process
  --list                     show list of total supported formats
  --skipLocal                skip duplicates in local folders, just detect
                             cross folders duplications
  --exitCode [number]        exit code to use when code duplications are
                             detected
  -h, --help                 display help for command

Installation on mega-linter Docker image