jscpd
Version:
detector of copy/paste in files
1 lines • 23.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/init/cli.ts","../src/init/options.ts","../src/init/ignore.ts","../src/options.ts","../src/print/files.ts","../src/print/options.ts","../src/print/supported-format.ts","../src/init/store.ts","../src/init/reporters.ts","../src/init/subscribers.ts","../src/init/hooks.ts","../bin/jscpd.ts"],"sourcesContent":["import {getDefaultOptions, IClone, IMapFrame, IOptions, IStore, Statistic} from '@jscpd/core';\nimport { grey, italic } from 'colors/safe';\nimport { EntryWithContent, getFilesToDetect, InFilesDetector } from '@jscpd/finder';\nimport { initCli, initOptionsFromCli } from './init';\nimport { printFiles, printOptions, printSupportedFormat } from './print';\nimport { createHash } from \"crypto\";\nimport { getStore } from './init/store';\nimport { getSupportedFormats, Tokenizer } from '@jscpd/tokenizer';\nimport { registerReporters } from './init/reporters';\nimport { registerSubscribers } from './init/subscribers';\nimport { registerHooks } from './init/hooks';\nimport {readJSONSync} from \"fs-extra\";\n\nconst TIMER_LABEL = 'Detection time:';\n\nexport const detectClones = (opts: IOptions, store: IStore<IMapFrame> | undefined = undefined): Promise<IClone[]> => {\n const options: Partial<IOptions> = {...getDefaultOptions(), ...opts};\n options.format = options.format || getSupportedFormats();\n\n const files: EntryWithContent[] = getFilesToDetect(options);\n const hashFunction = (value: string): string => {\n return createHash('md5').update(value).digest('hex')\n }\n options.hashFunction = options.hashFunction || hashFunction;\n const currentStore: IStore<IMapFrame> = store || getStore(options.store);\n const statistic = new Statistic();\n const tokenizer = new Tokenizer();\n const detector = new InFilesDetector(tokenizer, currentStore, statistic, options);\n\n registerReporters(options, detector);\n registerSubscribers(options, detector);\n registerHooks(options, detector);\n\n if (!options.silent) {\n console.time(italic(grey(TIMER_LABEL)));\n }\n return detector.detect(files).then((clones: IClone[]) => {\n if (!options.silent) {\n console.timeEnd(italic(grey(TIMER_LABEL)));\n }\n return clones;\n });\n}\n\nexport async function jscpd(argv: string[], exitCallback?: (code: number) => {}) {\n\n const packageJson = readJSONSync(__dirname + '/../package.json');\n\n const cli = initCli(packageJson, argv);\n\n const options: IOptions = initOptionsFromCli(cli);\n\n if (options.list) {\n printSupportedFormat();\n }\n\n if (options.debug) {\n printOptions(options);\n }\n\n if (!options.path || options.path.length === 0) {\n options.path = [process.cwd()];\n }\n\n if (options.debug) {\n const files: EntryWithContent[] = getFilesToDetect(options);\n printFiles(files);\n return Promise.resolve([]);\n } else {\n const store = getStore(options.store);\n return detectClones(options, store)\n .then((clones) => {\n if (clones.length > 0) {\n exitCallback?.(options.exitCode || 0)\n }\n return clones;\n })\n .finally(() => {\n store.close();\n });\n }\n}\n\n","import {Command} from 'commander';\nimport {getOption} from '@jscpd/core';\n\nexport function initCli(packageJson: any, argv: string[]): Command {\n\tconst cli = new Command(packageJson.name);\n\n\tcli.version(packageJson.version)\n\t\t.usage('[options] <path ...>')\n\t\t.description(packageJson.description)\n\t\t.option(\n\t\t\t'-l, --min-lines [number]',\n\t\t\t'min size of duplication in code lines (Default is ' + getOption('minLines') + ')',\n\t\t)\n\t\t.option(\n\t\t\t'-k, --min-tokens [number]',\n\t\t\t'min size of duplication in code tokens (Default is ' + getOption('minTokens') + ')',\n\t\t)\n\t\t.option('-x, --max-lines [number]', 'max size of source in lines (Default is ' + getOption('maxLines') + ')')\n\t\t.option(\n\t\t\t'-z, --max-size [string]',\n\t\t\t'max size of source in bytes, examples: 1kb, 1mb, 120kb (Default is ' + getOption('maxSize') + ')',\n\t\t)\n\t\t.option(\n\t\t\t'-t, --threshold [number]',\n\t\t\t'threshold for duplication, in case duplications >= threshold jscpd will exit with error',\n\t\t)\n\t\t.option('-c, --config [string]', 'path to config file (Default is .jscpd.json in <path>)')\n\t\t.option('-i, --ignore [string]', 'glob pattern for files what should be excluded from duplication detection')\n\t\t.option('--ignore-pattern [string]', 'Ignore code blocks matching the regexp patterns')\n\t\t.option(\n\t\t\t'-r, --reporters [string]',\n\t\t\t'reporters or list of reporters separated with comma to use (Default is time,console)',\n\t\t)\n\t\t.option('-o, --output [string]', 'reporters to use (Default is ./report/)')\n\t\t.option(\n\t\t\t'-m, --mode [string]',\n\t\t\t'mode of quality of search, can be \"strict\", \"mild\" and \"weak\" (Default is \"' + getOption('mode') + '\")',\n\t\t)\n\t\t.option('-f, --format [string]', 'format or formats separated by comma (Example php,javascript,python)')\n\t\t.option('-p, --pattern [string]', 'glob pattern to file search (Example **/*.txt)')\n\t\t.option('-b, --blame', 'blame authors of duplications (get information about authors from git)')\n\t\t.option('-s, --silent', 'do not write detection progress and result to a console')\n\t\t.option('--store [string]', 'use for define custom store (e.g. --store leveldb used for big codebase)')\n\t\t.option('-a, --absolute', 'use absolute path in reports')\n\t\t.option('-n, --noSymlinks', 'dont use symlinks for detection in files')\n\t\t.option('--ignoreCase', 'ignore case of symbols in code (experimental)')\n\t\t.option('-g, --gitignore', 'ignore all files from .gitignore file')\n\t\t.option('--formats-exts [string]', 'list of formats with file extensions (javascript:es,es6;dart:dt)')\n\t\t.option('-d, --debug', 'show debug information, not run detection process(options list and selected files)')\n\t\t.option('-v, --verbose', 'show full information during detection process')\n\t\t.option('--list', 'show list of total supported formats')\n\t\t.option('--skipLocal', 'skip duplicates in local folders, just detect cross folders duplications')\n .option('--exitCode [number]', 'exit code to use when code duplications are detected')\n\n\tcli.parse(argv);\n\treturn cli as Command;\n}\n","import {Command} from 'commander';\nimport {getModeHandler, IOptions} from '@jscpd/core';\nimport {getSupportedFormats} from '@jscpd/tokenizer';\nimport {initIgnore} from './ignore';\nimport {prepareOptions} from '../options';\n\nexport function initOptionsFromCli(cli: Command): IOptions {\n\tconst options: IOptions = prepareOptions(cli);\n\n\toptions.format = options.format || getSupportedFormats();\n\n\toptions.mode = getModeHandler(options.mode);\n\n\toptions.ignore = initIgnore(options);\n\n\treturn options;\n}\n","import {IOptions} from '@jscpd/core';\nimport {existsSync} from \"fs\";\n\nconst gitignoreToGlob = require('gitignore-to-glob');\n\nexport function initIgnore(options: IOptions): string[] {\n\tconst ignore: string[] = options.ignore || [];\n\n\tif (options.gitignore && existsSync(process.cwd() + '/.gitignore')) {\n\t\tlet gitignorePatterns: string[] = gitignoreToGlob(process.cwd() + '/.gitignore') || [];\n\t\tgitignorePatterns = gitignorePatterns.map((pattern) =>\n\t\t\tpattern.substr(pattern.length - 1) === '/' ? `${pattern}**/*` : pattern,\n\t\t);\n\t\tignore.push(...gitignorePatterns);\n\t\tignore.map((pattern) => pattern.replace('!', ''));\n\t}\n\treturn ignore;\n}\n","// @ts-nocheck\nimport {dirname, resolve} from \"path\";\nimport {existsSync} from \"fs\";\nimport {Command} from 'commander';\nimport {readJSONSync} from 'fs-extra';\nimport {getDefaultOptions, IOptions} from '@jscpd/core';\nimport {parseFormatsExtensions} from '@jscpd/finder';\n\nconst convertCliToOptions = (cli: Command): Partial<IOptions> => {\n const result: Partial<IOptions> = {\n minTokens: cli.minTokens ? parseInt(cli.minTokens) : undefined,\n minLines: cli.minLines ? parseInt(cli.minLines) : undefined,\n maxLines: cli.maxLines ? parseInt(cli.maxLines) : undefined,\n maxSize: cli.maxSize,\n debug: cli.debug,\n store: cli.store,\n pattern: cli.pattern,\n executionId: cli.executionId,\n silent: cli.silent,\n blame: cli.blame,\n verbose: cli.verbose,\n cache: cli.cache,\n output: cli.output,\n format: cli.format,\n formatsExts: parseFormatsExtensions(cli.formatsExts),\n list: cli.list,\n mode: cli.mode,\n absolute: cli.absolute,\n noSymlinks: cli.noSymlinks,\n skipLocal: cli.skipLocal,\n ignoreCase: cli.ignoreCase,\n gitignore: cli.gitignore,\n exitCode: cli.exitCode,\n };\n\n if (cli.threshold !== undefined) {\n result.threshold = Number(cli.threshold);\n }\n\n if (cli.reporters) {\n result.reporters = cli.reporters.split(',');\n }\n\n if (cli.format) {\n result.format = cli.format.split(',');\n }\n if (cli.ignore) {\n result.ignore = cli.ignore.split(',');\n }\n if(cli.ignorePattern){\n result.ignorePattern = cli.ignorePattern.split(',');\n }\n result.path = cli.path ? [cli.path].concat(cli.args) : cli.args;\n\n if (result.path.length === 0) {\n delete result.path;\n }\n\n Object.keys(result).forEach((key) => {\n if (typeof result[key] === 'undefined') {\n delete result[key];\n }\n });\n\n return result;\n}\n\nconst readConfigJson = (config: string | undefined): Partial<IOptions> => {\n const configFile: string = config ? resolve(config) : resolve('.jscpd.json');\n const configExists = existsSync(configFile);\n if (configExists) {\n const result = {config: configFile, ...readJSONSync(configFile)};\n if (result.path) {\n result.path = result.path.map((path: string) => resolve(dirname(configFile), path));\n }\n return result;\n }\n return {};\n}\n\nconst readPackageJsonConfig = (): Partial<IOptions> => {\n const config = resolve(process.cwd() + '/package.json');\n if (existsSync(config)) {\n const json = readJSONSync(config);\n if (json.jscpd && json.jscpd.path) {\n json.jscpd.path = json.jscpd.path.map((path: string) => resolve(dirname(config), path));\n }\n return json.jscpd ? {config, ...json.jscpd} : {};\n }\n return {};\n}\n\nexport function prepareOptions(cli: Command): IOptions {\n // @ts-ignore\n const storedConfig: Partial<IOptions> = readConfigJson(cli.config);\n const packageJsonConfig: Partial<IOptions> = readPackageJsonConfig();\n\n const argsConfig: Partial<IOptions> = convertCliToOptions(cli);\n\n const result: IOptions = {\n\n ...getDefaultOptions(),\n ...packageJsonConfig,\n ...storedConfig,\n ...argsConfig,\n };\n result.reporters = result.reporters || [];\n result.listeners = result.listeners || [];\n\n if (result.silent) {\n result.reporters = result.reporters\n .filter(\n (reporter) => !reporter.includes('console'),\n )\n .concat('silent');\n }\n\n if (result.threshold !== undefined) {\n result.reporters = [...result.reporters, 'threshold'];\n }\n\n return result;\n}\n","import {bold, grey} from 'colors/safe';\nimport {EntryWithContent} from '@jscpd/finder';\n\nexport function printFiles(files: EntryWithContent[]): void {\n\tfiles.forEach((stats: EntryWithContent) => {\n\t\tconsole.log(grey(stats.path));\n\t});\n\tconsole.log(bold(`Found ${files.length} files to detect.`));\n}\n","import {IOptions} from '@jscpd/core';\nimport {bold, white} from 'colors/safe';\n\nexport function printOptions(options: IOptions): void {\n console.log(bold(white('Options:')));\n console.dir(options);\n}\n","import {bold, white} from 'colors/safe';\nimport {getSupportedFormats} from '@jscpd/tokenizer';\n\nexport function printSupportedFormat(): void {\n\tconsole.log(bold(white('Supported formats: ')));\n\tconsole.log(getSupportedFormats().join(', '));\n\tprocess.exit(0);\n}\n","import {IMapFrame, IStore, MemoryStore} from '@jscpd/core';\nimport {red} from 'colors/safe';\n\nexport function getStore(storeName: string | undefined): IStore<IMapFrame> {\n if (storeName) {\n const packageName = '@jscpd/' + storeName + '-store';\n try {\n const store = require(packageName).default;\n return new store();\n } catch (e) {\n console.error(red('store name ' + storeName + ' not installed.'))\n }\n }\n return new MemoryStore<IMapFrame>();\n}\n","import {\n ConsoleFullReporter,\n ConsoleReporter,\n CSVReporter,\n InFilesDetector,\n JsonReporter,\n MarkdownReporter,\n SilentReporter,\n ThresholdReporter,\n XcodeReporter,\n XmlReporter,\n} from '@jscpd/finder';\nimport {IOptions} from '@jscpd/core';\nimport {grey, yellow} from 'colors/safe';\nimport HtmlReporter from \"@jscpd/html-reporter\";\nimport SarifReporter from \"jscpd-sarif-reporter\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst reporters: Record<string, any> = {\n xml: XmlReporter,\n json: JsonReporter,\n csv: CSVReporter,\n markdown: MarkdownReporter,\n consoleFull: ConsoleFullReporter,\n html: HtmlReporter,\n console: ConsoleReporter,\n silent: SilentReporter,\n threshold: ThresholdReporter,\n xcode: XcodeReporter,\n sarif: SarifReporter,\n}\n\nexport function registerReporters(options: IOptions, detector: InFilesDetector): void {\n\n // @ts-ignore\n options.reporters.forEach((reporter: string) => {\n if (reporter in reporters) {\n detector.registerReporter(new reporters[reporter](options));\n } else {\n try {\n const reporterClass = require(`@jscpd/${reporter}-reporter`).default;\n detector.registerReporter(new reporterClass(options));\n } catch (e) {\n try {\n const reporterClass = require(`jscpd-${reporter}-reporter`).default;\n detector.registerReporter(new reporterClass(options));\n } catch (e) {\n console.log(yellow(`warning: ${reporter} not installed (install packages named @jscpd/${reporter}-reporter or jscpd-${reporter}-reporter)`))\n console.log(grey((e as any).message));\n }\n }\n }\n });\n}\n","import {InFilesDetector, ProgressSubscriber, VerboseSubscriber} from '@jscpd/finder';\nimport {IOptions} from '@jscpd/core';\n\nexport function registerSubscribers(options: IOptions, detector: InFilesDetector): void {\n if (options.verbose) {\n detector.registerSubscriber(new VerboseSubscriber(options));\n }\n\n if (!options.silent) {\n detector.registerSubscriber(new ProgressSubscriber(options));\n }\n}\n","import {BlamerHook, FragmentsHook, InFilesDetector} from '@jscpd/finder';\nimport {IOptions} from '@jscpd/core';\n\nexport function registerHooks(options: IOptions, detector: InFilesDetector): void {\n detector.registerHook(new FragmentsHook());\n if (options.blame) {\n detector.registerHook(new BlamerHook());\n }\n}\n","import {jscpd} from \"../src\";\n\n(async () => {\n try {\n await jscpd(process.argv, process.exit)\n } catch(e) {\n console.log(e);\n process.exit(1);\n }\n})()\n\nexport * from '../src'\n"],"mappings":"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","names":["getDefaultOptions","grey","InFilesDetector","existsSync","bold","bold","white","getSupportedFormats","getSupportedFormats","grey","e","grey","readJSONSync","getDefaultOptions","getSupportedFormats","InFilesDetector","grey"]}