{"version":3,"sources":["jsdelivr-header.js","/npm/ranking@0.5.1/lib/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,aAEA,OAAO,eAAe,QAAS,aAAc,CAC3C,OAAO,IAGT,IAAI,aAAe,WAAe,SAAS,EAAiB,EAAQ,GAAS,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CAAE,IAAI,EAAa,EAAM,GAAI,EAAW,WAAa,EAAW,aAAc,EAAO,EAAW,cAAe,EAAU,UAAW,IAAY,EAAW,UAAW,GAAM,OAAO,eAAe,EAAQ,EAAW,IAAK,EAAa,CAAE,CAAE,OAAO,SAAU,EAAa,EAAY,GAAiJ,OAA9H,GAAY,EAAiB,EAAY,UAAW,GAAiB,GAAa,EAAiB,EAAa,GAAqB,CAAa,CAAI,CAA/hB,GAEnB,SAAS,gBAAgB,EAAU,GAAe,KAAM,aAAoB,GAAgB,MAAM,IAAI,UAAU,oCAAwC,CAExJ,IAAI,MAAQ,QAAQ,UAEhB,MAAQ,QAAQ,UAAR,CAAmB,WAC3B,uBAAyB,QACzB,cAAgB,UAahB,QAAU,WACZ,SAAS,EAAQ,GACf,IAAI,EAAW,EAAK,SAChB,EAAe,EAAK,aAExB,gBAAgB,KAAM,GAEtB,KAAK,SAAW,EAChB,KAAK,aAAe,EACpB,KAAK,KAAO,CAAE,OAAQ,EAAG,SAAU,MACnC,KAAK,QAAU,CAAC,CAClB,CA8IA,OA5IA,aAAa,EAAS,CAAC,CACrB,IAAK,OACL,MAAO,SAAc,GAInB,GAHA,MAAM,SAGD,KAAK,KAAK,SACb,MAAO,GAGT,IAAI,EAAS,CAAE,SAAU,EAAG,KAAM,IAQlC,GANK,IACH,EAAQ,CAAC,GAEX,EAAM,OAAS,EAAM,QAAU,GAG3B,EAAM,WAAa,EAAM,QAAU,EAAM,WAAa,EAAM,SAAS,OAAS,EAAM,SAAS,KAAM,CAErG,IADkB,KAAK,QAAQ,EAAM,SAAS,YAE5C,MAAO,GAET,EAAM,MAAQ,KAAK,QAAQ,EAAM,SACnC,CAiCA,OA/BA,oBAAoB,EAAO,YAC3B,oBAAoB,EAAO,YAC3B,oBAAoB,EAAO,SAEvB,EAAM,UACR,EAAI,MAAM,gBAAgB,CACxB,aAAc,KAAK,aACnB,KAAM,KAAK,KACX,eAAgB,CACd,QAAS,EACT,MAAO,KAAK,SAAW,GAEzB,MAAO,EACP,OAAQ,IAED,EAAM,QACf,EAAM,MAAM,KAAO,EAAM,MAAM,KAC/B,EAAM,MAAM,KAAO,EAAM,MAAM,MAAQ,KAAK,SAAW,GAEvD,EAAI,MAAM,aAAa,CACrB,aAAc,KAAK,aACnB,KAAM,KAAK,KACX,eAAgB,CACd,QAAS,EACT,MAAO,KAAK,UAEd,MAAO,EACP,OAAQ,KAIL,EAAO,IAChB,GACC,CACD,IAAK,UACL,MAAO,SAAiB,GAQtB,OAPA,MAAM,WAED,IACH,EAAQ,CAAC,GAEX,EAAM,OAAS,EAER,KAAK,KAAK,GAAO,EAC1B,GACC,CACD,IAAK,WAIL,MAAO,SAAkB,GACvB,IAAI,EAAQ,EAAM,MACd,EAAW,EAAM,SAIrB,GAFA,MAAM,YAEQ,IAAV,EACF,OAAO,KAET,GAAI,EAAQ,KAAK,SACf,MAAM,IAAI,MAAM,0CAElB,IAAK,uBAAuB,KAAK,GAC/B,MAAM,IAAI,MAAM,6BAmBlB,OAhBI,KAAK,QAAQ,KACf,MAAM,0BACN,EAAI,MAAM,mBAAmB,CAC3B,aAAc,KAAK,aACnB,MAAO,KAAK,QAAQ,GACpB,SAAU,EACV,QAAS,KAAK,QACd,KAAM,KAAK,KACX,eAAgB,CACd,QAAS,EACT,MAAO,KAAK,SAAW,MAK7B,MAAM,6BACC,EAAI,MAAM,UAAU,CACzB,aAAc,KAAK,aACnB,MAAO,EACP,SAAU,EACV,QAAS,KAAK,QACd,KAAM,KAAK,KACX,eAAgB,CACd,QAAS,EACT,MAAO,KAAK,SAAW,IAG7B,GACC,CACD,IAAK,kBACL,MAAO,SAAyB,GAC9B,IAAI,EAAS,EAAM,OACf,EAAW,EAAM,SAErB,MAAM,kBAEN,IAAI,GAAY,KAAK,QAAQ,IAAa,GAAK,EAI/C,MAAO,CACL,SAHgB,KAAK,SAAS,CAAE,MAAO,EAAU,SAAU,IAI3D,MAAO,EACP,SAAU,EAEd,KAGK,CACR,CA1Ja,GAkKd,SAAS,oBAAoB,EAAO,GAClC,GAAK,EAAM,GAAX,CAIA,IAAI,EAAQ,cAAc,KAAK,EAAM,KAAW,EAAM,GACtD,EAAM,GAAS,CACb,KAAM,GAAS,EAAM,GAAO,MAAQ,EACpC,KAAM,GAAS,EAAM,GAAO,MAAQ,IALtC,CAOF,CAhBA,QAAiB,QAAI,QAiBrB,OAAO,QAAU,QAAiB","file":"/npm/ranking@0.5.1/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ranking@0.5.1/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n  value: true\n});\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _core = require('./core');\n\nvar debug = require('./debug')('ranking');\nvar REGEXP_POSITIVE_NUMBER = /^\\d+$/;\nvar REGEXP_NUMBER = /^-?\\d+$/;\n\n/**\n\n  Nodes\n  =============================================================\n   {\n      amount: 10,   // total number of playerIds\n      children: [], // list of nodes  (only existing on non-leaf)\n      playerIds: [] // users id       (only existing on leaf)\n    }\n */\n\nvar Ranking = (function () {\n  function Ranking(_ref) {\n    var maxScore = _ref.maxScore;\n    var branchFactor = _ref.branchFactor;\n\n    _classCallCheck(this, Ranking);\n\n    this.maxScore = maxScore;\n    this.branchFactor = branchFactor;\n    this.tree = { amount: 0, children: null };\n    this.players = {};\n  }\n\n  _createClass(Ranking, [{\n    key: 'find',\n    value: function find(query) {\n      debug('find');\n\n      // rank is empty\n      if (!this.tree.children) {\n        return [];\n      }\n\n      var result = { position: 0, list: [] };\n\n      if (!query) {\n        query = {};\n      }\n      query.$limit = query.$limit || 10;\n\n      // filters by player id when not passing his score or position\n      if (query.playerId && !query.score && !query.position && !query.playerId.$gte && !query.playerId.$lte) {\n        var playerScore = this.players[query.playerId.toString()];\n        if (!playerScore) {\n          return [];\n        }\n        query.score = this.players[query.playerId];\n      }\n\n      prepareQueryByRange(query, 'playerId');\n      prepareQueryByRange(query, 'position');\n      prepareQueryByRange(query, 'score');\n\n      if (query.position) {\n        (0, _core.findByPosition)({\n          branchFactor: this.branchFactor,\n          node: this.tree,\n          nodeScoreRange: {\n            beginAt: 0,\n            endAt: this.maxScore - 1 /*base 0*/\n          },\n          query: query,\n          result: result\n        });\n      } else if (query.score) {\n        query.score.$gte = query.score.$gte; /*base 0*/\n        query.score.$lte = query.score.$lte || this.maxScore - 1 /*base 0*/;\n\n        (0, _core.findByScore)({\n          branchFactor: this.branchFactor,\n          node: this.tree,\n          nodeScoreRange: {\n            beginAt: 0,\n            endAt: this.maxScore /*base 0*/\n          },\n          query: query,\n          result: result\n        });\n      }\n\n      return result.list;\n    }\n  }, {\n    key: 'findOne',\n    value: function findOne(query) {\n      debug('findOne');\n\n      if (!query) {\n        query = {};\n      }\n      query.$limit = 1;\n\n      return this.find(query)[0];\n    }\n  }, {\n    key: 'setScore',\n\n    // TODO NEXT BREAKING CHANGES:\n    // change setScore to return the same result schema of addPlayerPoints { position, score, playerId }\n    value: function setScore(_ref2) {\n      var score = _ref2.score;\n      var playerId = _ref2.playerId;\n\n      debug('setScore');\n\n      if (score === 0) {\n        return null;\n      }\n      if (score > this.maxScore) {\n        throw new Error('score is bigger than the ranking limit');\n      }\n      if (!REGEXP_POSITIVE_NUMBER.test(playerId)) {\n        throw new Error('playerId must be a number');\n      }\n\n      if (this.players[playerId]) {\n        debug('removing player score');\n        (0, _core.removePlayerScore)({\n          branchFactor: this.branchFactor,\n          score: this.players[playerId],\n          playerId: playerId,\n          players: this.players,\n          node: this.tree,\n          nodeScoreRange: {\n            beginAt: 0,\n            endAt: this.maxScore - 1 /*base 0*/\n          }\n        });\n      }\n\n      debug('setting new player score');\n      return (0, _core.setScore)({\n        branchFactor: this.branchFactor,\n        score: score,\n        playerId: playerId,\n        players: this.players,\n        node: this.tree,\n        nodeScoreRange: {\n          beginAt: 0,\n          endAt: this.maxScore - 1 /*base 0*/\n        }\n      });\n    }\n  }, {\n    key: 'addPlayerPoints',\n    value: function addPlayerPoints(_ref3) {\n      var points = _ref3.points;\n      var playerId = _ref3.playerId;\n\n      debug('addPlayerScore');\n\n      var newScore = (this.players[playerId] || 0) + points;\n\n      var newPosition = this.setScore({ score: newScore, playerId: playerId });\n\n      return {\n        position: newPosition,\n        score: newScore,\n        playerId: playerId\n      };\n    }\n  }]);\n\n  return Ranking;\n})();\n\nexports['default'] = Ranking;\n\n/**\n * prepares the query before searching in the ranking\n * it is possible to filter by a specific value or a range ($gte and $lte)\n */\nfunction prepareQueryByRange(query, field) {\n  if (!query[field]) {\n    return;\n  }\n\n  var value = REGEXP_NUMBER.test(query[field]) && query[field];\n  query[field] = {\n    $gte: value || query[field].$gte || 1,\n    $lte: value || query[field].$lte || 100\n  };\n}\nmodule.exports = exports['default'];"]}