import { FilterFunction, DocumentFilters } from '../interfaces'; import * as numberFilters from '../filters/number-filters'; import * as operationFilters from '../filters/operation-filters'; import * as defaultFilters from '../filters/default-filters'; import * as arrayFilters from '../filters/array-filters'; import * as dateFilters from '../filters/date-filters'; import { Parser } from '../interfaces/parser'; export class FiltersBuilder { constructor( private readonly parser: Parser, private filters: DocumentFilters = {}, ) {} addFilter(name: string, filter: FilterFunction): FiltersBuilder { this.filters[name] = filter; return this; } applyFilters(): Parser { Object.assign(this.parser.filters, this.filters); return this.parser; } reset(): void { for (const key in this.filters) { if (Object.prototype.hasOwnProperty.call(this.filters, key)) { delete this.parser.filters[key]; } } this.filters = {}; } static default(parser: Parser): FiltersBuilder { const filters: DocumentFilters = { ...arrayFilters, ...dateFilters, ...defaultFilters, ...numberFilters, ...operationFilters, }; return new FiltersBuilder(parser, filters); } }