{"version":3,"file":"filter-expressions-CtEmlfxM.mjs","names":[],"sources":["../src/ast-node.ts","../src/filter-expressions.ts"],"sourcesContent":["export abstract class MongoAstNode {\n  abstract readonly kind: string;\n\n  protected freeze(): void {\n    Object.freeze(this);\n  }\n}\n","import type { MongoValue } from '@prisma-next/mongo-value';\nimport type { MongoAggExpr } from './aggregation-expressions';\nimport { MongoAstNode } from './ast-node';\nimport type { MongoFilterRewriter, MongoFilterVisitor } from './visitors';\n\nconst FILTER_EXPR_BRAND = '__prismaNextMongoFilter__';\n\nexport function isMongoFilterExpr(value: unknown): value is MongoFilterExpr {\n  return typeof value === 'object' && value !== null && FILTER_EXPR_BRAND in value;\n}\n\nabstract class MongoFilterExpression extends MongoAstNode {\n  abstract accept<R>(visitor: MongoFilterVisitor<R>): R;\n  abstract rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr;\n\n  not(this: MongoFilterExpr): MongoNotExpr {\n    return new MongoNotExpr(this);\n  }\n\n  and(this: MongoFilterExpr, other: MongoFilterExpr): MongoAndExpr {\n    return MongoAndExpr.of([this, other]);\n  }\n}\n\nObject.defineProperty(MongoFilterExpression.prototype, FILTER_EXPR_BRAND, {\n  value: true,\n  writable: false,\n  enumerable: false,\n  configurable: false,\n});\n\nexport class MongoFieldFilter extends MongoFilterExpression {\n  readonly kind = 'field' as const;\n  readonly field: string;\n  readonly op: string;\n  readonly value: MongoValue;\n\n  constructor(field: string, op: string, value: MongoValue) {\n    super();\n    this.field = field;\n    this.op = op;\n    this.value = value;\n    this.freeze();\n  }\n\n  static of(field: string, op: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, op, value);\n  }\n\n  static eq(field: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$eq', value);\n  }\n\n  static neq(field: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$ne', value);\n  }\n\n  static gt(field: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$gt', value);\n  }\n\n  static lt(field: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$lt', value);\n  }\n\n  static gte(field: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$gte', value);\n  }\n\n  static lte(field: string, value: MongoValue): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$lte', value);\n  }\n\n  static in(field: string, values: ReadonlyArray<MongoValue>): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$in', values);\n  }\n\n  static nin(field: string, values: ReadonlyArray<MongoValue>): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$nin', values);\n  }\n\n  static isNull(field: string): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$eq', null);\n  }\n\n  static isNotNull(field: string): MongoFieldFilter {\n    return new MongoFieldFilter(field, '$ne', null);\n  }\n\n  accept<R>(visitor: MongoFilterVisitor<R>): R {\n    return visitor.field(this);\n  }\n\n  rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr {\n    return rewriter.field ? rewriter.field(this) : this;\n  }\n}\n\nexport class MongoAndExpr extends MongoFilterExpression {\n  readonly kind = 'and' as const;\n  readonly exprs: ReadonlyArray<MongoFilterExpr>;\n\n  constructor(exprs: ReadonlyArray<MongoFilterExpr>) {\n    super();\n    if (exprs.length === 0) {\n      throw new Error('$and requires at least one expression');\n    }\n    this.exprs = Object.freeze([...exprs]);\n    this.freeze();\n  }\n\n  static of(exprs: ReadonlyArray<MongoFilterExpr>): MongoAndExpr {\n    return new MongoAndExpr(exprs);\n  }\n\n  accept<R>(visitor: MongoFilterVisitor<R>): R {\n    return visitor.and(this);\n  }\n\n  rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr {\n    const rewritten = new MongoAndExpr(this.exprs.map((e) => e.rewrite(rewriter)));\n    return rewriter.and ? rewriter.and(rewritten) : rewritten;\n  }\n}\n\nexport class MongoOrExpr extends MongoFilterExpression {\n  readonly kind = 'or' as const;\n  readonly exprs: ReadonlyArray<MongoFilterExpr>;\n\n  constructor(exprs: ReadonlyArray<MongoFilterExpr>) {\n    super();\n    if (exprs.length === 0) {\n      throw new Error('$or requires at least one expression');\n    }\n    this.exprs = Object.freeze([...exprs]);\n    this.freeze();\n  }\n\n  static of(exprs: ReadonlyArray<MongoFilterExpr>): MongoOrExpr {\n    return new MongoOrExpr(exprs);\n  }\n\n  accept<R>(visitor: MongoFilterVisitor<R>): R {\n    return visitor.or(this);\n  }\n\n  rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr {\n    const rewritten = new MongoOrExpr(this.exprs.map((e) => e.rewrite(rewriter)));\n    return rewriter.or ? rewriter.or(rewritten) : rewritten;\n  }\n}\n\nexport class MongoNotExpr extends MongoFilterExpression {\n  readonly kind = 'not' as const;\n  readonly expr: MongoFilterExpr;\n\n  constructor(expr: MongoFilterExpr) {\n    super();\n    this.expr = expr;\n    this.freeze();\n  }\n\n  accept<R>(visitor: MongoFilterVisitor<R>): R {\n    return visitor.not(this);\n  }\n\n  rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr {\n    const rewritten = new MongoNotExpr(this.expr.rewrite(rewriter));\n    return rewriter.not ? rewriter.not(rewritten) : rewritten;\n  }\n}\n\nexport class MongoExistsExpr extends MongoFilterExpression {\n  readonly kind = 'exists' as const;\n  readonly field: string;\n  readonly exists: boolean;\n\n  constructor(field: string, exists: boolean) {\n    super();\n    this.field = field;\n    this.exists = exists;\n    this.freeze();\n  }\n\n  static exists(field: string): MongoExistsExpr {\n    return new MongoExistsExpr(field, true);\n  }\n\n  static notExists(field: string): MongoExistsExpr {\n    return new MongoExistsExpr(field, false);\n  }\n\n  accept<R>(visitor: MongoFilterVisitor<R>): R {\n    return visitor.exists(this);\n  }\n\n  rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr {\n    return rewriter.exists ? rewriter.exists(this) : this;\n  }\n}\n\nexport class MongoExprFilter extends MongoFilterExpression {\n  readonly kind = 'expr' as const;\n  readonly aggExpr: MongoAggExpr;\n\n  constructor(aggExpr: MongoAggExpr) {\n    super();\n    this.aggExpr = aggExpr;\n    this.freeze();\n  }\n\n  static of(aggExpr: MongoAggExpr): MongoExprFilter {\n    return new MongoExprFilter(aggExpr);\n  }\n\n  accept<R>(visitor: MongoFilterVisitor<R>): R {\n    return visitor.expr(this);\n  }\n\n  rewrite(rewriter: MongoFilterRewriter): MongoFilterExpr {\n    return rewriter.expr ? rewriter.expr(this) : this;\n  }\n}\n\nexport type MongoFilterExpr =\n  | MongoFieldFilter\n  | MongoAndExpr\n  | MongoOrExpr\n  | MongoNotExpr\n  | MongoExistsExpr\n  | MongoExprFilter;\n"],"mappings":"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"}