diff --git a/packages/core/src/interfaces/options.interface.ts b/packages/core/src/interfaces/options.interface.ts index 91cf9ed2..812c3e88 100644 --- a/packages/core/src/interfaces/options.interface.ts +++ b/packages/core/src/interfaces/options.interface.ts @@ -1,3 +1,5 @@ +import { IClone } from ".."; + export interface IOptions { executionId?: string; minLines?: number; @@ -33,6 +35,7 @@ export interface IOptions { reportersOptions?: Record; tokensToSkip?: string[]; hashFunction?: (value: string) => string; + customValidate?: (clone: IClone) => boolean; exitCode?: number; } diff --git a/packages/core/src/rabin-karp.ts b/packages/core/src/rabin-karp.ts index 809ca84d..d41e7d25 100644 --- a/packages/core/src/rabin-karp.ts +++ b/packages/core/src/rabin-karp.ts @@ -60,12 +60,18 @@ export class RabinKarp { const validation: IValidationResult = runCloneValidators(clone, this.options, this.cloneValidators); - if (validation.status) { + let status = validation.status + + if (this.options.customValidate) { + status = status && this.options.customValidate(clone) + } + + if (status) { this.eventEmitter.emit('CLONE_FOUND', {clone}) } else { this.eventEmitter.emit('CLONE_SKIPPED', {clone, validation}) } - return validation.status; + return status; } private static createClone(format: string, mapFrameA: IMapFrame, mapFrameB: IMapFrame): IClone {