{
  "version": 3,
  "sources": ["../src/Query.ts"],
  "sourcesContent": ["import type { SortOptions } from '@colyseus/core';\n\nexport class Query<T> {\n  private readonly rooms: Promise<T[]>;\n  private conditions: any;\n  protected order: Map<string, 1 | -1> = new Map();\n\n  constructor(rooms: Promise<T[]>, conditions) {\n    this.conditions = conditions;\n    this.rooms = rooms;\n  }\n\n  public sort(options: SortOptions) {\n    this.order.clear();\n\n    const fields = Object.entries(options);\n\n    if (fields.length) {\n      for (const [field, direction] of fields) {\n        if (direction === 1 || direction === 'asc' || direction === 'ascending') {\n          this.order.set(field, 1);\n\n        } else {\n          this.order.set(field, -1);\n        }\n      }\n    }\n\n    return this;\n  }\n\n  private filterRooms(rooms: T[]): T[] {\n    const conditions = Object.entries(this.conditions);\n    const withConditions = conditions.length > 0;\n\n    return rooms.filter((room: any) => {\n      if (withConditions) {\n        for (let [field, value] of conditions) {\n          // Check if field exists in room (IRoomCache base fields)\n          if (room.hasOwnProperty(field)) {\n            if (room[field] !== value) {\n              return false;\n            }\n          } else if (room.metadata?.hasOwnProperty(field)) {\n            // Check if field exists in metadata\n            if (room.metadata[field] !== value) {\n              return false;\n            }\n          } else {\n            // Field doesn't exist in room or metadata\n            return false;\n          }\n        }\n      }\n      return true;\n    });\n  }\n\n  private sortRooms(rooms: T[]): T[] {\n    if (this.order.size) {\n      rooms.sort((room1: any, room2: any) => {\n        for (const [field, direction] of this.order) {\n          // Check if field exists in room or metadata\n          const val1 = room1.hasOwnProperty(field) ? room1[field] : room1.metadata?.[field];\n          const val2 = room2.hasOwnProperty(field) ? room2[field] : room2.metadata?.[field];\n\n          if (direction === 1) {\n            if (val1 > val2) return 1;\n            if (val1 < val2) return -1;\n          } else {\n            if (val1 > val2) return -1;\n            if (val1 < val2) return 1;\n          }\n        }\n        return 0;\n      });\n    }\n    return rooms;\n  }\n\n  public all(): Promise<T[]> {\n    return this.rooms.then(rooms => {\n      return this.sortRooms(this.filterRooms(rooms));\n    });\n  }\n\n  public then(resolve, reject) {\n    return this.rooms.then(rooms => {\n      return this.sortRooms(this.filterRooms(rooms))[0];\n    }).then(resolve, reject);\n  }\n}"],
  "mappings": ";AAEO,IAAM,QAAN,MAAe;AAAA,EAKpB,YAAY,OAAqB,YAAY;AAF7C,SAAU,QAA6B,oBAAI,IAAI;AAG7C,SAAK,aAAa;AAClB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,KAAK,SAAsB;AAChC,SAAK,MAAM,MAAM;AAEjB,UAAM,SAAS,OAAO,QAAQ,OAAO;AAErC,QAAI,OAAO,QAAQ;AACjB,iBAAW,CAAC,OAAO,SAAS,KAAK,QAAQ;AACvC,YAAI,cAAc,KAAK,cAAc,SAAS,cAAc,aAAa;AACvE,eAAK,MAAM,IAAI,OAAO,CAAC;AAAA,QAEzB,OAAO;AACL,eAAK,MAAM,IAAI,OAAO,EAAE;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,OAAiB;AACnC,UAAM,aAAa,OAAO,QAAQ,KAAK,UAAU;AACjD,UAAM,iBAAiB,WAAW,SAAS;AAE3C,WAAO,MAAM,OAAO,CAAC,SAAc;AACjC,UAAI,gBAAgB;AAClB,iBAAS,CAAC,OAAO,KAAK,KAAK,YAAY;AAErC,cAAI,KAAK,eAAe,KAAK,GAAG;AAC9B,gBAAI,KAAK,KAAK,MAAM,OAAO;AACzB,qBAAO;AAAA,YACT;AAAA,UACF,WAAW,KAAK,UAAU,eAAe,KAAK,GAAG;AAE/C,gBAAI,KAAK,SAAS,KAAK,MAAM,OAAO;AAClC,qBAAO;AAAA,YACT;AAAA,UACF,OAAO;AAEL,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU,OAAiB;AACjC,QAAI,KAAK,MAAM,MAAM;AACnB,YAAM,KAAK,CAAC,OAAY,UAAe;AACrC,mBAAW,CAAC,OAAO,SAAS,KAAK,KAAK,OAAO;AAE3C,gBAAM,OAAO,MAAM,eAAe,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,WAAW,KAAK;AAChF,gBAAM,OAAO,MAAM,eAAe,KAAK,IAAI,MAAM,KAAK,IAAI,MAAM,WAAW,KAAK;AAEhF,cAAI,cAAc,GAAG;AACnB,gBAAI,OAAO,KAAM,QAAO;AACxB,gBAAI,OAAO,KAAM,QAAO;AAAA,UAC1B,OAAO;AACL,gBAAI,OAAO,KAAM,QAAO;AACxB,gBAAI,OAAO,KAAM,QAAO;AAAA,UAC1B;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEO,MAAoB;AACzB,WAAO,KAAK,MAAM,KAAK,WAAS;AAC9B,aAAO,KAAK,UAAU,KAAK,YAAY,KAAK,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEO,KAAK,SAAS,QAAQ;AAC3B,WAAO,KAAK,MAAM,KAAK,WAAS;AAC9B,aAAO,KAAK,UAAU,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;AAAA,IAClD,CAAC,EAAE,KAAK,SAAS,MAAM;AAAA,EACzB;AACF;",
  "names": []
}
