{"version":3,"sources":["../src/Stages.ts"],"sourcesContent":["import { Filter, FindOptions } from './MongoProvider';\nimport {\n  asNumber,\n  asString,\n  Currency,\n  Get,\n  Id,\n  ifDefined,\n  ifNotEmpty,\n  isDefined,\n  isPresent,\n  isPrimitive,\n  isString,\n  meta,\n  ofGet,\n  on,\n  OneOrMore,\n  Optional,\n  PartialRecord,\n  toArray,\n  use,\n} from '@thisisagile/easy';\nimport { toMongoType } from './Utils';\n\nexport const asc = 1;\nexport const desc = -1;\nexport type Accumulators = '$sum' | '$count' | '$multiply' | '$avg' | '$first' | '$last' | '$min' | '$max' | '$push' | '$addToSet' | '$size';\nexport type Accumulator = PartialRecord<Accumulators, Filter>;\n\nexport class FilterBuilder<Options> {\n  constructor(private filters: { [K in keyof Options]: (v: Options[K]) => Filter }) {}\n\n  from = (q: Partial<Options> = {}): Filter =>\n    stages.match.match(\n      meta(q)\n        .entries()\n        .reduce((acc, [key, value]) => ({ ...acc, ...ifDefined(this.filters[key as keyof Options], f => f(value as Options[keyof Options])) }), {})\n    );\n}\n\ntype Sort = Record<string, typeof asc | typeof desc>;\n\nexport class SortBuilder {\n  constructor(private sorts: Record<string, Sort>) {}\n\n  get keys(): string[] {\n    return Object.keys(this.sorts);\n  }\n\n  from = (\n    s: {\n      s?: string;\n    } = {},\n    alt?: string\n  ): Optional<Filter> => stages.sort.sort(this.sorts[s?.s ?? ''] ?? this.sorts[alt ?? '']);\n}\n\nexport class IncludeBuilder {\n  constructor(private includes: Record<string, (string | Record<string, 1>)[]>) {}\n\n  get keys(): string[] {\n    return Object.keys(this.includes);\n  }\n\n  from = (\n    i: {\n      i?: string;\n    } = {},\n    alt?: string\n  ): Optional<Filter> => stages.project.include(...(this.includes[i?.i ?? ''] ?? this.includes[alt ?? ''] ?? []));\n}\n\nconst escapeRegex = (s: string) => s.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n\nexport const stages = {\n  root: '$$ROOT',\n  current: '$$CURRENT',\n  id: '_id',\n  decode: {\n    object: (f: Filter) => use(Object.entries(f)[0], ([k, v]) => ofGet(v, k)),\n    fields: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => ifDefined(ofGet(v, k), nv => (r[k] = nv))), {} as any),\n    fieldsArrays: (f: Filter) => Object.entries(f).reduce((res, [k, v]) => on(res, r => (r[k] = use(toArray(v), vs => vs.map(v => ofGet(v, k))))), {} as any),\n    id: (f: Filter | string) => (isString(f) ? `$${asString(f)}` : isPrimitive(f) ? f : Object.entries(f).map(([k, v]) => ofGet(v, k))[0]),\n  },\n  match: {\n    match: (f: Record<string, Get<Optional<Filter>, string>>) => ({ $match: stages.decode.fields(f) }),\n    filter: <Options>(filters: { [K in keyof Options]: (v: Options[K]) => Filter }) => new FilterBuilder<Options>(filters),\n    or: (...filters: Filter[]) => ({ $or: toArray(filters).map(f => stages.decode.object(f)) }),\n    gt: (value: Filter) => ({ $gt: value }),\n    gte: (value: Filter) => ({ $gte: value }),\n    lt: (value: Filter) => ({ $lt: value }),\n    lte: (value: Filter) => ({ $lte: value }),\n    isIn: (value: OneOrMore<unknown>, separator = ',') => ({ $in: isString(value) ? value.split(separator) : value }),\n    notIn: (value: OneOrMore<unknown>, separator = ',') => ({ $nin: isString(value) ? value.split(separator) : value }),\n    after: (date: unknown) => stages.match.gte(toMongoType(date)),\n    before: (date: unknown) => stages.match.lt(toMongoType(date)),\n    anywhere: (q: string) => ({ $regex: escapeRegex(q), $options: 'i' }),\n    money: (currency: Currency, value: Filter) => (key: string) => ({\n      [`${key}.currency`]: currency.id,\n      ...stages.decode.fields({ [`${key}.value`]: value }),\n    }),\n  },\n  sort: {\n    sort: ($sort: Sort) => (isPresent($sort) ? { $sort } : undefined),\n    sorter: (sorts: Record<string, Sort>) => new SortBuilder(sorts),\n    asc: (key: string) => stages.sort.sort({ [key]: asc }),\n    desc: (key: string) => stages.sort.sort({ [key]: desc }),\n  },\n  group: {\n    group: (fields: Record<string, Accumulator>) => ({\n      by: (by: Filter) => ({ $group: Object.assign({ _id: stages.decode.id(by) }, stages.decode.fields(fields)) }),\n    }),\n    date:\n      (format = '%Y-%m-%d') =>\n      (key: string) => ({ $dateToString: { date: `$${key}`, format } }),\n    count: (): Accumulator => ({ $count: {} }),\n    sum: (from?: string): Accumulator => (isDefined(from) ? { $sum: `$${from}` } : { $sum: 1 }),\n    avg: (from?: string) => ({ $avg: `$${from}` }),\n    multiply: (...multiply: string[]) => ({ $multiply: multiply.map(m => `$${m}`) }),\n    first: (from?: string): Accumulator => ({ $first: `$${from}` }),\n    last: (from?: string): Accumulator => ({ $last: `$${from}` }),\n    min: (from?: string): Accumulator => ({ $min: `$${from}` }),\n    max: (from?: string): Accumulator => ({ $max: `$${from}` }),\n    addToSet: (from?: string): Accumulator => ({ $addToSet: `$${from}` }),\n    push: (from = '$ROOT'): Accumulator => ({ $push: `$${from}` }),\n    size: (from?: string): Accumulator => ({ $size: `$${from}` }),\n  },\n  search: {\n    search: (f: Record<string, Get<Filter, string>>) => ifDefined(stages.decode.id(f), $search => ({ $search })),\n    auto: (value?: Id) => (key: string) => ifDefined(value, v => ({ autocomplete: { path: key, query: [v] } })),\n    fuzzy:\n      (value?: string, maxEdits = 1) =>\n      (key?: string) =>\n        ifDefined(value, v => ({\n          text: {\n            query: v,\n            path: key === 'wildcard' ? { wildcard: '*' } : key,\n            fuzzy: { maxEdits },\n          },\n        })),\n  },\n  set: {\n    set: (f: Record<string, Get<Filter, string>>) => ({ $set: stages.decode.fields(f) }),\n    score: () => ({ $meta: 'searchScore' }),\n  },\n  skip: {\n    skip: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.skip, { $skip: asNumber(o.skip) }),\n    take: (o: FindOptions = {}): Optional<Filter> => ifDefined(o.take, { $limit: asNumber(o.take) }),\n  },\n  project: {\n    include: (...includes: (string | Record<string, 1 | string>)[]): Optional<Filter> =>\n      ifNotEmpty(includes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 1 } : b) }), {}) })),\n    exclude: (...excludes: (string | Record<string, 0>)[]): Optional<Filter> =>\n      ifNotEmpty(excludes, es => ({ $project: es.reduce((a: Filter, b: Filter) => ({ ...a, ...(isString(b) ? { [b]: 0 } : b) }), {}) })),\n    includes: (includes: Record<string, (string | Record<string, 1>)[]>) => new IncludeBuilder(includes),\n    project: (project?: Filter) => ifDefined(project, $project => ({ $project })),\n    date: (key: string, format?: string) => ({ $toDate: `$${key}`, ...ifDefined(format, { format }) }),\n    duration: (from: string, to: string) => ({ $divide: [{ $subtract: [stages.project.date(from), stages.project.date(to)] }, 1000] }),\n  },\n  replaceWith: {\n    replaceWith: (f?: Filter): Optional<Filter> => ifDefined(f, { $replaceWith: f }),\n    merge: (...objects: Filter[]): Optional<Filter> => ifNotEmpty(objects, os => ({ $mergeObjects: os })),\n    rootAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.root, ...objects),\n    currentAnd: (...objects: Filter[]): Optional<Filter> => stages.replaceWith.merge(stages.current, ...objects),\n    reroot: (prop: string): Filter => ({ $replaceRoot: { newRoot: `$${prop}` } }),\n    concat: (...props: string[]): Optional<Filter> => ifNotEmpty(props, ps => ({ $concatArrays: ps.map(p => `$${p}`) })),\n  },\n  facet: {\n    facet: (f: Record<string, OneOrMore<Get<Optional<Filter>, string>>>) => ({ $facet: stages.decode.fieldsArrays(f) }),\n    unwind: (from?: string) => (f?: string) => ({ $unwind: `$${from ?? f}` }),\n    count: (from?: string) => (f?: string) => ({ $sortByCount: `$${from ?? f}` }),\n    data: () => [],\n  },\n  unwind: {\n    unwind: (prop?: string) => ({ $unwind: `$${prop}` }),\n  },\n};\n"],"mappings":"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","names":["v"]}