import { type Maybe } from '@dereekb/util'; import { type DateQueryBuilder } from './query.builder'; /** * Describes the document field names that store temporal start/end values, * used by {@link makeMongoDBLikeDateQueryBuilder} to produce query filters. */ export interface TimeFieldsNameSet { /** * Field name storing the start (or combined start+end) timestamp. */ start: string; /** * Field name storing the end timestamp. Ignored when `singleFieldForStartAndEnd` is true. */ end?: string; /** * When true, a single field represents both start and end so range bounds are merged. */ singleFieldForStartAndEnd?: boolean; } /** * A MongoDB-style range filter object with optional upper and lower date bounds. */ export interface MongoDBLikeDateRangeFilter { $lte?: Date; $gte?: Date; } export type MongoDBLikeDateQueryFilter = object; /** * Merges separate starts-at and ends-at range filters into a single * {@link MongoDBLikeDateRangeFilter} for documents that use one field * to represent both start and end. * * Takes `$lte` from `startsAt` (falling back to `endsAt`) and `$gte` from * `endsAt` (falling back to `startsAt`). * * @param startsAt - Range filter derived from the starts-at bounds. * @param endsAt - Range filter derived from the ends-at bounds. * @returns A single merged range filter. * * @example * ```ts * const merged = mergeMongoDBLikeRangeFilters( * { $lte: new Date('2026-12-31') }, * { $gte: new Date('2026-01-01') } * ); * // { $lte: 2026-12-31, $gte: 2026-01-01 } * ``` */ export declare function mergeMongoDBLikeRangeFilters(startsAt: Maybe, endsAt: Maybe): { $lte: Date | undefined; $gte: Date | undefined; }; export interface MakeMongoDBLikeDateQueryBuilderConfig { readonly fields: TimeFieldsNameSet; } /** * Creates a {@link DateQueryBuilder} that produces MongoDB-style `$gte`/`$lte` * query filter objects for the configured time fields. * * Supports both two-field (start + end) and single-field date models. * * @param config - Configuration specifying the document field names. * @returns Date query builder that emits MongoDB-style range filters. * * @example * ```ts * const builder = makeMongoDBLikeDateQueryBuilder({ * fields: { start: 'startsAt', end: 'endsAt' } * }); * const filter = builder.makeFieldFilter({ * startsAt: { $gte: new Date('2026-01-01') } * }); * ``` * * @__NO_SIDE_EFFECTS__ */ export declare function makeMongoDBLikeDateQueryBuilder(config: MakeMongoDBLikeDateQueryBuilderConfig): DateQueryBuilder;