{"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"],"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 = '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, readFileSync} from 'fs';\nimport {join} from 'path';\n\nfunction convertGitignorePatternToGlob(line: string): string[] {\n\t// Handle negation patterns\n\tif (line.startsWith('!')) {\n\t\t// Negation in gitignore means \"don't ignore this\"\n\t\t// In fast-glob's ignore option, we skip negation patterns\n\t\treturn [];\n\t}\n\n\t// Strip leading slash (means anchored to root in gitignore)\n\tconst isRooted = line.startsWith('/');\n\tlet pattern = isRooted ? line.slice(1) : line;\n\n\t// Strip trailing slash (gitignore uses it for \"directory only\", but glob patterns\n\t// don't distinguish file types, so we just strip it)\n\tif (pattern.endsWith('/')) {\n\t\tpattern = pattern.slice(0, -1);\n\t}\n\n\tconst results: string[] = [];\n\n\tif (isRooted) {\n\t\t// Root-anchored patterns: match only at project root\n\t\tresults.push(pattern);\n\t\tresults.push(`${pattern}/**`);\n\t} else if (pattern.includes('/')) {\n\t\t// Patterns with / are relative paths, match at any depth\n\t\tif (pattern.startsWith('**/')) {\n\t\t\t// Already has double-star prefix, don't duplicate\n\t\t\tresults.push(pattern);\n\t\t\tresults.push(`${pattern}/**`);\n\t\t} else {\n\t\t\tresults.push(pattern);\n\t\t\tresults.push(`${pattern}/**`);\n\t\t\tresults.push(`**/${pattern}`);\n\t\t\tresults.push(`**/${pattern}/**`);\n\t\t}\n\t} else {\n\t\t// Simple patterns match at any depth\n\t\tresults.push(`**/${pattern}`);\n\t\tresults.push(`**/${pattern}/**`);\n\t}\n\n\treturn results;\n}\n\nexport function initIgnore(options: IOptions): string[] {\n\t// Create a shallow copy to avoid mutating caller's options\n\tconst ignore: string[] = options.ignore ? [...options.ignore] : [];\n\n\tif (options.gitignore && existsSync(join(process.cwd(), '.gitignore'))) {\n\t\tconst gitignorePath = join(process.cwd(), '.gitignore');\n\t\tconst content = readFileSync(gitignorePath, 'utf8');\n\n\t\tconst gitignorePatterns = content\n\t\t\t.split('\\n')\n\t\t\t.map(line => line.trim())\n\t\t\t.filter(line => line && !line.startsWith('#'))\n\t\t\t.flatMap(convertGitignorePatternToGlob);\n\n\t\tignore.push(...gitignorePatterns);\n\t}\n\n\treturn ignore;\n}\n","// @ts-nocheck\nimport {dirname, resolve, isAbsolute, relative} 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 resolveIgnorePattern = (configDir: string, pattern: string): string => {\n  // Don't modify if pattern is already absolute\n  if (isAbsolute(pattern)) {\n    return pattern;\n  }\n  // Don't modify if pattern starts with ** (meant to match at any depth)\n  if (pattern.startsWith('**/')) {\n    return pattern;\n  }\n  // For relative patterns, we need to adjust them to be relative to cwd\n  // instead of the config directory\n  const absolutePattern = resolve(configDir, pattern);\n  const cwd = process.cwd();\n  // If the config is in cwd or a subdirectory of cwd, make pattern relative to cwd\n  const relativePath = relative(cwd, absolutePattern);\n  if (!relativePath.startsWith('..')) {\n    return relativePath;\n  }\n  // Otherwise return as absolute\n  return absolutePattern;\n};\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    const configDir = dirname(configFile);\n    if (result.path) {\n      result.path = result.path.map((path: string) => resolve(configDir, path));\n    }\n    if (result.ignore) {\n      result.ignore = result.ignore.map((pattern: string) => resolveIgnorePattern(configDir, pattern));\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    const configDir = dirname(config);\n    if (json.jscpd && json.jscpd.path) {\n      json.jscpd.path = json.jscpd.path.map((path: string) => resolve(configDir, path));\n    }\n    if (json.jscpd && json.jscpd.ignore) {\n      json.jscpd.ignore = json.jscpd.ignore.map((pattern: string) => resolveIgnorePattern(configDir, pattern));\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  AiReporter,\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  ai: AiReporter,\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 && !options.reporters?.includes('ai')) {\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"],"mappings":"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","names":["getDefaultOptions","grey","InFilesDetector","existsSync","bold","bold","white","getSupportedFormats","getSupportedFormats","grey","e","grey","readJSONSync","getDefaultOptions","getSupportedFormats","InFilesDetector","grey"]}