[
  {
    "path": ".editorconfig",
    "content": "[*.{js,jsx,ts,tsx,vue}]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nmax_line_length = 100\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Tests\n\non: [push, pull_request]\n\njobs:\n  pnpm:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: ['18', '20']\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@v4\n      - uses: pnpm/action-setup@v4\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: 'pnpm'\n      - name: Install dependencies\n        run: pnpm install\n      - name: Setup pokeapi/api-data\n        run: |\n          pnpm run apidata:clone\n          pnpm run apidata:replace\n      - name: Build\n        run: |\n          pnpm run generate:types\n          pnpm run generate:main\n          pnpm run generate:jsdocs\n      - name: Unit test\n        run: |\n          pnpm t\n  npm:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: ['18', '20']\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@v4\n      - name: Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n      - name: Install dependencies\n        run: npm ci\n      - name: Setup pokeapi/api-data\n        run: |\n          npm run apidata:clone\n          npm run apidata:replace\n      - name: Build\n        run: |\n          npm run generate:types\n          npm run generate:main\n          npm run generate:jsdocs\n      - name: Unit test\n        run: |\n          npm t\n\n  bun:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@v4\n      - name: Setup bun\n        uses: oven-sh/setup-bun@v2\n      - name: Install dependencies\n        run: bun install --frozen-lockfile\n      - name: Setup pokeapi/api-data\n        run: |\n          bun run apidata:clone\n          bun run apidata:replace\n      - name: Build\n        run: |\n          bun run generate:types\n          bun run generate:main\n          bun run generate:jsdocs\n      - name: Unit test\n        run: |\n          bun run test\n\n  lint:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: ['lts/*']\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@v4\n      - name: Setup node\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n      - name: Install dependencies\n        run: npm ci\n      - name: Lint\n        run: |\n          npm run lint\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules/\ndist/generator/\ndist/test/\napi-data/"
  },
  {
    "path": ".npmignore",
    "content": "node_modules\ntest\n.travis.yml\nwebpack.config.js\ngenerator\ndist/generator"
  },
  {
    "path": ".npmrc",
    "content": "legacy-peer-deps=true\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Thomas Asadurian\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# pokedex-promise-v2 <a href=\"https://pokeapi.co/api/v2/pokemon/bulbasaur\"><img src='https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/other/dream-world/1.svg' height=50px/></a>\n\n[![npm version](https://badge.fury.io/js/pokedex-promise-v2.svg)](https://badge.fury.io/js/pokedex-promise-v2)\n[![Tests](https://github.com/PokeAPI/pokedex-promise-v2/actions/workflows/test.yml/badge.svg)](https://github.com/PokeAPI/pokedex-promise-v2/actions/workflows/test.yml)\n[![Package Quality](http://npm.packagequality.com/shield/pokedex-promise-v2.svg)](http://packagequality.com/#?package=pokedex-promise-v2)\n[![npm](https://img.shields.io/npm/l/express.svg?maxAge=2592000)](https://github.com/PokeAPI/pokedex-promise-v2/blob/master/LICENSE)\n\nMaintainers: [Naramsim](https://github.com/Naramsim), [TheTommyTwitch](https://github.com/TheTommyTwitch) and [HRKings](https://github.com/HRKings)\n\nAn easy way to use [Pokéapi](https://pokeapi.co/) v2 with promises *(or callbacks as of v3)* in node.js\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Table of Contents**\n\n- [pokedex-promise-v2](#pokedex-promise-v2-)\n  - [Install](#install-)\n  - [Usage](#usage)\n    - [Example requests](#example-requests)\n  - [Configuration](#configuration)\n  - [Endpoints](#endpoints)\n    - [Berries](#berries)\n    - [Contests](#contests)\n    - [Encounters](#encounters)\n    - [Evolution](#evolution)\n    - [Games](#games)\n    - [Items](#items)\n    - [Machines](#machines)\n    - [Moves](#moves)\n    - [Locations](#locations)\n    - [Pokemon](#pokemon)\n    - [Utility](#utility)\n    - [Custom URLs and paths](#custom-urls-and-paths)\n  - [Root Endpoints](#root-endpoints)\n    - [List of supported root endpoints](#list-of-supported-root-endpoints)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n## Install [![nodeVersion](https://img.shields.io/badge/node->=12-brightgreen.svg)](https://www.npmjs.com/package/pokedex-promise-v2)\n\n> As of 4.0.0 this package is now pure ESM. Please [read this](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c).\n\n```sh\nnpm install pokedex-promise-v2 --save\n```\n\n```sh\nyarn add pokedex-promise-v2\n```\n\n```sh\npnpm i pokedex-promise-v2\n```\n\n## Usage\n\n```js\nimport Pokedex from 'pokedex-promise-v2';\nconst P = new Pokedex();\n```\n\n**NOTE**: Any function with the designation \"ByName\" can also be passed an integer ID. However, the functions with the designation \"ById\" can only be passed an integer ID. Refer to the [pokeapi v2 docs](http://pokeapi.co/docsv2/) to find out more about how the data is structured.\n\n**UPDATE**: You can pass an array to each endpoint, it will retrive data for each array element. If you scroll down, you will find an example.\n\n### Example requests\n\n```js\n(async () => { // with Async/Await\n    try {\n        const golduckSpecies = await P.getPokemonSpeciesByName(\"golduck\")\n        const frenchName = golduckSpecies.names.filter(pokeAPIName => pokeAPIName.language.name === 'fr')[0].name\n        console.log(frenchName)\n    } catch (error) {\n        throw error\n    }\n})()\n\nP.getPokemonByName(['eevee', 'ditto']) // with Promise\n  .then((response) => {\n    console.log(response);\n  })\n  .catch((error) => {\n    console.log('There was an ERROR: ', error);\n  });\n\nP.getPokemonByName(34, (response, error) => { // with callback\n    if(!error) {\n      console.log(response);\n    } else {\n      console.log(error)\n    }\n  });\n\nP.getResource(['/api/v2/pokemon/36', 'api/v2/berry/8', 'https://pokeapi.co/api/v2/ability/9/'])\n  .then((response) => {\n    console.log(response); // the getResource function accepts singles or arrays of URLs/paths\n  });\n```\n\n## Configuration\n\nPass an Object to Pokedex in order to configure it. Available options: `protocol`, `hostName`, `versionPath`, `cacheLimit` in ms, `timeout` in ms.\nAny option is optional :smile:. If no Object is passed, the Pokedex will be initialized to grab data from pokeapi.co using http with 20 seconds timeout and caching resources for 11 days. HTTPS is the default protocol.\n\n```js\nimport Pokedex from 'pokedex-promise-v2';\nconst options = {\n  protocol: 'https',\n  hostName: 'localhost:443',\n  versionPath: '/api/v2/',\n  cacheLimit: 100 * 1000, // 100s\n  timeout: 5 * 1000 // 5s\n}\nconst P = new Pokedex(options);\n```\n\n## Endpoints\n\n### Berries\n\nUse **getBerryByName** to return data about a specific berry.\n```js\n  P.getBerryByName('cheri')\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getBerryFirmnessByName** to return data about the firmness of a specific berry.\n```js\n  P.getBerryFirmnessByName('very-soft')\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getBerryFlavorByName** to return data about the flavor of a specific berry.\n```js\n  P.getBerryFlavorByName('spicy')\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n**Array** as a parameter example. It can be a mixed array.\nThis method fetches data asynchronously. So it is quite fast :smile:\n```js\n  P.getBerryByName(['cheri', 'chesto', 5])\n    .then((response) => {\n      console.log(response);\n    })\n  // response will be an Array containing 3 Objects\n  // response.forEach((item) => {console.log(item.size)}) // 80,50,20\n```\n\n### Contests\n\nUse **getContestTypeByName** to return data about the effects of moves when used in contests.\n```js\n  P.getContestTypeByName('cool')\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getContestEffectById** to return data about the effects of moves when used in contests.\n```js\n  P.getContestEffectById(1)\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getSuperContestEffectById** to return data about the effects of moves when used in super contests.\n```js\n  P.getSuperContestEffectById(1)\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n### Encounters\n\nUse **getEncounterMethodByName** to return data about the conditions in which a trainer may encounter a pokemon in the wild.\n```js\n  P.getEncounterMethodByName(\"walk\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getEncounterConditionByName** to return data that affects which pokemon might appear in the wild.\n```js\n  P.getEncounterConditionByName(\"swarm\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getEncounterConditionValueByName** to return data the various states that an encounter condition can have.\n```js\n  P.getEncounterConditionValueByName(\"swarm-yes\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Evolution\n\nUse **getEvolutionChainById** to return data evolution chains.\n```js\n  P.getEvolutionChainById(1)\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getEvolutionTriggerByName** to return data about triggers which cause pokemon to evolve.\n```js\n  P.getEvolutionTriggerByName(\"level-up\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Games\n\nUse **getGenerationByName** to return data about the different generations of pokemon games.\n```js\n  P.getGenerationByName(\"generation-i\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokedexByName** to return data about specific types of pokedexes.\n```js\n  P.getPokedexByName(\"kanto\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getVersionByName** to return data about specific versions of pokemon games.\n```js\n  P.getVersionByName(\"red\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getVersionGroupByName** to return data about specific version groups of pokemon games.\n```js\n  P.getVersionGroupByName(\"red-blue\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Items\n\nUse **getItemByName** to return data about specific items.\n```js\n  P.getItemByName(\"master-ball\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getItemAttributeByName** to return data about specific item attribute.\n```js\n  P.getItemAttributeByName(\"countable\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getItemCategoryByName** to return data about specific item category.\n```js\n  P.getItemCategoryByName(\"stat-boosts\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getItemFlingEffectByName** to return data about specific item fling effect.\n```js\n  P.getItemFlingEffectByName(\"badly-poison\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getItemPocketByName** to return data about specific pockets in a players bag.\n```js\n  P.getItemPocketByName(\"misc\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Machines\n\nUse **getMachineById** to return data about specific machine.\n```js\n  P.getMachineById(2)\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Moves\n\nUse **getMoveByName** to return data about specific pokemon move.\n```js\n  P.getMoveByName(\"pound\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getMoveAilmentByName** to return data about specific pokemon move ailment.\n```js\n  P.getMoveAilmentByName(\"paralysis\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getMoveBattleStyleByName** to return data about specific pokemon move battle style.\n```js\n  P.getMoveBattleStyleByName(\"attack\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getMoveCategoryByName** to return data about specific pokemon move category.\n```js\n  P.getMoveCategoryByName(\"ailment\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getMoveDamageClassByName** to return data about specific pokemon damage class.\n```js\n  P.getMoveDamageClassByName(\"status\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getMoveLearnMethodByName** to return data about specific pokemon learn method.\n```js\n  P.getMoveLearnMethodByName(\"level-up\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getMoveTargetByName** to return data about specific pokemon move target.\n```js\n  P.getMoveTargetByName(\"specific-move\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Locations\n\nUse **getLocationByName** to return data about specific pokemon location.\n```js\n  P.getLocationByName(\"sinnoh\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getLocationAreaByName** to return data about specific pokemon location area.\n```js\n  P.getLocationAreaByName(\"canalave-city-area\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPalParkAreaByName** to return data about specific pokemon pal park area.\n```js\n  P.getPalParkAreaByName(\"forest\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getRegionByName** to return data about specific pokemon region.\n```js\n  P.getRegionByName(\"kanto\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Pokemon\n\nUse **getAbilityByName** to return data about specific pokemon ability.\n```js\n  P.getAbilityByName(\"stench\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getCharacteristicById** to return data about specific pokemon characteristic.\n```js\n  P.getCharacteristicById(1)\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getEggGroupByName** to return data about specific pokemon egg group.\n```js\n  P.getEggGroupByName(\"monster\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getGenderByName** to return data about specific pokemon gender.\n```js\n  P.getGenderByName(\"female\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getGrowthRateByName** to return data about specific pokemon growth rate.\n```js\n  P.getGrowthRateByName(\"slow\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getNatureByName** to return data about specific pokemon nature.\n```js\n  P.getNatureByName(\"bold\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokeathlonStatByName** to return data about specific pokeathon stat.\n```js\n  P.getPokeathlonStatByName(\"speed\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokemonByName** to return data about specific pokemon.\n```js\n  P.getPokemonByName(\"butterfree\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokemonColorByName** to return data about specific pokemon color.\n```js\n  P.getPokemonColorByName(\"black\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokemonFormByName** to return data about specific pokemon form.\n```js\n  P.getPokemonFormByName(\"wormadam-plant\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokemonHabitatByName** to return data about specific pokemon habitat.\n```js\n  P.getPokemonHabitatByName(\"grottes\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokemonShapeByName** to return data about specific pokemon shape.\n```js\n  P.getPokemonShapeByName(\"ball\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getPokemonSpeciesByName** to return data about specific pokemon species.\n```js\n  P.getPokemonSpeciesByName(\"wormadam\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getStatByName** to return data about specific pokemon stat.\n```js\n  P.getStatByName(\"attack\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\nUse **getTypeByName** to return data about specific pokemon type.\n```js\n  P.getTypeByName(\"ground\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Utility\n\nUse **getLanguageByName** to return data about specific pokemon language.\n```js\n  P.getLanguageByName(\"ja\")\n    .then((response) => {\n      console.log(response);\n    })\n    .catch((error) => {\n      console.log('There was an ERROR: ', error);\n    });\n```\n\n### Custom URLs and paths\n\nUse **resource** to return data about any URL or path.\n\n```js\n  P.getResource(['/api/v2/pokemon/36', 'api/v2/berry/8', 'https://pokeapi.co/api/v2/ability/9/'])\n    .then((response) => {\n      console.log(response); // resource function accepts singles or arrays of URLs/paths\n    });\n\n  P.getResource('api/v2/berry/5')\n    .then((response) => {\n      console.log(response);\n    });\n```\n\n## Root Endpoints\n\nFor each root endpoint we provide a method to get all the items contained by that endpoint. By default the method will return every item in the endpoint. If you want you can configure its offset and limit.\n\n* `offset` is where to start. The first item that you will get. Default `0`\n* `limit` is how many items you want to list. Default `100000`\n\n**TIP**: Do not pass any config Object to your call, since you will get every item and everything will be cached to your RAM.\n\nThis call will get the list of pokemon between ID 34 and ID 44\n\n```js\n  const interval = {\n    limit: 10,\n    offset: 34\n  }\n  P.getPokemonsList(interval)\n    .then((response) => {\n      console.log(response);\n    })\n```\n\nThis is what you will get:\n\n```json\n{\n  \"count\": 811,\n  \"next\":  \"https://pokeapi.co:443/api/v2/pokemon/?limit=11&offset=44\",\n  \"previous\": \"https://pokeapi.co:443/api/v2/pokemon/?limit=11&offset=22\",\n  \"results\": [\n    {\n      \"url\": \"https://pokeapi.co:443/api/v2/pokemon/34/\",\n      \"name\": \"nidoking\"\n    },\n    {\n      \"url\": \"https://pokeapi.co:443/api/v2/pokemon/35/\",\n      \"name\": \"clefairy\"\n    },\n    {\n      \"url\": \"...\",\n      \"name\": \"...\"\n    },\n    {\n      \"url\": \"https://pokeapi.co:443/api/v2/pokemon/44/\",\n      \"name\": \"gloom\"\n    }\n  ]\n}\n```\n\n### List of supported root endpoints\n\n* .getEndpointsList()\n* .getBerriesList()\n* .getBerriesFirmnessList()\n* .getBerriesFlavorsList()\n* .getContestTypesList()\n* .getContestEffectsList()\n* .getSuperContestEffectsList()\n* .getEncounterMethodsList()\n* .getEncounterConditionsList()\n* .getEncounterConditionValuesList()\n* .getEvolutionChainsList()\n* .getEvolutionTriggersList()\n* .getGenerationsList()\n* .getPokedexList()\n* .getVersionsList()\n* .getVersionGroupsList()\n* .getItemsList()\n* .getItemAttributesList()\n* .getItemCategoriesList()\n* .getItemFlingEffectsList()\n* .getItemPocketsList()\n* .getMachinesList()\n* .getMovesList()\n* .getMoveAilmentsList()\n* .getMoveBattleStylesList()\n* .getMoveCategoriesList()\n* .getMoveDamageClassesList()\n* .getMoveLearnMethodsList()\n* .getMoveTargetByName()\n* .getLocationsList()\n* .getLocationAreasList()\n* .getPalParkAreasList()\n* .getRegionsList()\n* .getAbilitiesList()\n* .getCharacteristicsList()\n* .getEggGroupsList()\n* .getGendersList()\n* .getGrowthRatesList()\n* .getNaturesList()\n* .getPokeathlonStatsList()\n* .getPokemonsList()\n* .getPokemonColorsList()\n* .getPokemonFormsList()\n* .getPokemonHabitatsList()\n* .getPokemonShapesList()\n* .getPokemonSpeciesList()\n* .getStatsList()\n* .getTypesList()\n* .getLanguagesList()\n\n## Development\n\nA linux environment is preferred. `bash`, `sed`, `find` are required.\n\n```sh\nnpm i\nnpm run apidata:clone # Only if you are building for the first time\nnpm run apidata:sync # Only if you have already built once\nnpm run apidata:replace\nnpm run generate:types\nnpm run generate:main\nnpm run generate:jsdocs\nnpm t\n```\n"
  },
  {
    "path": "dist/src/index.js",
    "content": "/* eslint-disable */\n/*\n* DO NOT MODIFY, THIS IS AUTO GENERATED\n* Execute `npm run generate` to regenerate\n*/\nimport pMap from \"p-map\";\nimport NodeCache from \"node-cache\";\nimport PokeAPIOptions from \"./interfaces/PokeAPIOptions.js\";\nimport handleError from \"./utils/ErrorHandler.js\";\nimport getJSON from \"./utils/Getter.js\";\nexport default class Pokedex {\n    constructor(options) {\n        this.options = new PokeAPIOptions(options, new NodeCache());\n    }\n    async getResource(endpoint, callback) {\n        try {\n            // Fail if the endpoint is not supplied\n            if (!endpoint) {\n                throw new Error('Param \"endpoint\" is required needs to be a string or array of strings');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(endpoint) && typeof endpoint !== 'string') {\n                throw new Error('Param \"endpoint\" needs to be a string or array of strings');\n            }\n            /// If the user has submitted a string, return the JSON promise\n            if (typeof endpoint === 'string') {\n                return getJSON(this.options, endpoint, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (endpoints) => {\n                const queryRes = await getJSON(this.options, endpoints);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(endpoint, mapper, { concurrency: 4 });\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    /** @deprecated - will be removed on the next version. Use {@link getResource} instead */\n    async resource(endpoint, callback) {\n        try {\n            // Fail if the endpoint is not supplied\n            if (!endpoint) {\n                throw new Error('Param \"endpoint\" is required needs to be a string or array of strings');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(endpoint) && typeof endpoint !== 'string') {\n                throw new Error('Param \"endpoint\" needs to be a string or array of strings');\n            }\n            /// If the user has submitted a string, return the JSON promise\n            if (typeof endpoint === 'string') {\n                return getJSON(this.options, endpoint, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (endpoints) => {\n                const queryRes = await getJSON(this.options, endpoints);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(endpoint, mapper, { concurrency: 4 });\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getBerryByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getBerryFirmnessByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getBerryFlavorByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-flavor/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-flavor/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getContestTypeByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-type/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-type/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getContestEffectById(id, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n                throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n                throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-effect/${id}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-effect/${ids}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getSuperContestEffectById(id, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n                throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n                throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}super-contest-effect/${id}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}super-contest-effect/${ids}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEncounterMethodByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-method/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-method/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEncounterConditionByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEncounterConditionValueByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition-value/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition-value/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEvolutionChainById(id, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n                throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n                throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-chain/${id}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-chain/${ids}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEvolutionTriggerByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-trigger/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-trigger/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getGenerationByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}generation/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}generation/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokedexByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getVersionByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getVersionGroupByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version-group/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version-group/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemAttributeByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-attribute/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-attribute/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemCategoryByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-category/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-category/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemFlingEffectByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-fling-effect/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-fling-effect/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemPocketByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-pocket/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-pocket/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMachineById(id, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n                throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n                throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}machine/${id}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}machine/${ids}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveAilmentByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-ailment/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-ailment/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveBattleStyleByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-battle-style/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-battle-style/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveCategoryByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-category/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-category/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveDamageClassByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-damage-class/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-damage-class/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveLearnMethodByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-learn-method/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-learn-method/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveTargetByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-target/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-target/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getLocationByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getLocationAreaByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location-area/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location-area/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPalParkAreaByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pal-park-area/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pal-park-area/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getRegionByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}region/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}region/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getAbilityByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}ability/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}ability/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getCharacteristicById(id, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n                throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n                throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}characteristic/${id}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}characteristic/${ids}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEggGroupByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}egg-group/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}egg-group/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getGenderByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}gender/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}gender/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getGrowthRateByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}growth-rate/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}growth-rate/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getNatureByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}nature/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}nature/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokeathlonStatByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokeathlon-stat/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokeathlon-stat/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonColorByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-color/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-color/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonFormByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-form/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-form/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonHabitatByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-habitat/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-habitat/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonShapeByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-shape/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-shape/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonSpeciesByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-species/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-species/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getStatByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}stat/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}stat/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getTypeByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}type/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}type/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getLanguageByName(nameOrId, callback) {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n                throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n                throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n                return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}language/${nameOrId}/`, callback);\n            }\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds) => {\n                const queryRes = await getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}language/${nameOrIds}/`);\n                return queryRes;\n            };\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n            // Invoke the callback if we have one\n            if (callback) {\n                callback(mappedResults);\n            }\n            return mappedResults;\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getBerriesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getBerriesFirmnessList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    /** @deprecated will be removed on a future version. Use {@link getBerriesFirmnessList} instead */\n    async getBerriesFirmnesssList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getBerriesFlavorsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-flavor/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getContestTypesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-type/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getContestEffectsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-effect/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getSuperContestEffectsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}super-contest-effect/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEncounterMethodsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-method/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEncounterConditionsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEncounterConditionValuesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition-value/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEvolutionChainsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-chain/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEvolutionTriggersList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-trigger/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getGenerationsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}generation/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    /** @deprecated will be removed on a future version. Use {@link getPokedexList} instead */\n    async getPokedexsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokedexList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getVersionsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getVersionGroupsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version-group/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemAttributesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-attribute/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemCategoriesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-category/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemFlingEffectsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-fling-effect/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getItemPocketsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-pocket/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMachinesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}machine/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMovesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveAilmentsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-ailment/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveBattleStylesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-battle-style/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveCategoriesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-category/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveDamageClassesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-damage-class/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveLearnMethodsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-learn-method/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getMoveTargetsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-target/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getLocationsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getLocationAreasList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location-area/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPalParkAreasList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pal-park-area/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getRegionsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}region/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getAbilitiesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}ability/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getCharacteristicsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}characteristic/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEggGroupsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}egg-group/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getGendersList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}gender/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getGrowthRatesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}growth-rate/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getNaturesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}nature/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokeathlonStatsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokeathlon-stat/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonColorsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-color/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonFormsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-form/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonHabitatsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-habitat/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonShapesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-shape/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getPokemonSpeciesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-species/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getStatsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}stat/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getTypesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}type/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getLanguagesList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}language/?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    async getEndpointsList(interval, callback) {\n        try {\n            let { limit, offset } = this.options;\n            if (interval) {\n                if (interval.hasOwnProperty('limit')) {\n                    limit = interval.limit;\n                }\n                if (interval.hasOwnProperty('offset')) {\n                    offset = interval.offset;\n                }\n            }\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}?limit=${limit}&offset=${offset}`, callback);\n        }\n        catch (error) {\n            handleError(error, callback);\n        }\n    }\n    /** Retrieve the configs used */\n    getConfig() {\n        return this.options;\n    }\n    /** Retuns the current number of entries in the cache */\n    getCachedItemsCount() {\n        return this.options.cache.stats.keys;\n    }\n    /** @deprecated use {@link getCachedItemsCount} */\n    cacheSize() {\n        return this.options.cache.stats.keys;\n    }\n    /** Deletes all keys in cache */\n    clearCache() {\n        this.options.cache.flushAll();\n    }\n}\n"
  },
  {
    "path": "dist/src/interfaces/PokeAPIOptions.js",
    "content": "class PokeAPIOptions {\n    /* eslint-disable default-param-last */\n    constructor(config = {}, cache) {\n        this.protocol = 'https';\n        this.hostName = '://pokeapi.co';\n        this.versionPath = '/api/v2/';\n        this.offset = 0;\n        this.limit = 100000;\n        this.timeout = 10 * 1000; // 10 seconds\n        this.cacheLimit = 1000000 * 1000; // 11 days\n        this.cache = cache;\n        if (config.protocol) {\n            this.protocol = config.protocol;\n        }\n        if (config.hostName) {\n            this.hostName = `://${config.hostName}`;\n        }\n        if (config.versionPath) {\n            this.versionPath = config.versionPath;\n        }\n        if (config.offset) {\n            this.offset = config.offset - 1;\n        }\n        if (config.limit) {\n            this.limit = config.limit;\n        }\n        if (config.timeout) {\n            this.timeout = config.timeout;\n        }\n        if (config.cacheLimit) {\n            this.cacheLimit = config.cacheLimit;\n        }\n    }\n}\nexport default PokeAPIOptions;\n"
  },
  {
    "path": "dist/src/utils/Endpoints.js",
    "content": "const endpoints = [\n    ['getBerryByName', 'berry'],\n    ['getBerryFirmnessByName', 'berry-firmness'],\n    ['getBerryFlavorByName', 'berry-flavor'],\n    ['getContestTypeByName', 'contest-type'],\n    ['getContestEffectById', 'contest-effect'],\n    ['getSuperContestEffectById', 'super-contest-effect'],\n    ['getEncounterMethodByName', 'encounter-method'],\n    ['getEncounterConditionByName', 'encounter-condition'],\n    ['getEncounterConditionValueByName', 'encounter-condition-value'],\n    ['getEvolutionChainById', 'evolution-chain'],\n    ['getEvolutionTriggerByName', 'evolution-trigger'],\n    ['getGenerationByName', 'generation'],\n    ['getPokedexByName', 'pokedex'],\n    ['getVersionByName', 'version'],\n    ['getVersionGroupByName', 'version-group'],\n    ['getItemByName', 'item'],\n    ['getItemAttributeByName', 'item-attribute'],\n    ['getItemCategoryByName', 'item-category'],\n    ['getItemFlingEffectByName', 'item-fling-effect'],\n    ['getItemPocketByName', 'item-pocket'],\n    ['getMachineById', 'machine'],\n    ['getMoveByName', 'move'],\n    ['getMoveAilmentByName', 'move-ailment'],\n    ['getMoveBattleStyleByName', 'move-battle-style'],\n    ['getMoveCategoryByName', 'move-category'],\n    ['getMoveDamageClassByName', 'move-damage-class'],\n    ['getMoveLearnMethodByName', 'move-learn-method'],\n    ['getMoveTargetByName', 'move-target'],\n    ['getLocationByName', 'location'],\n    ['getLocationAreaByName', 'location-area'],\n    ['getPalParkAreaByName', 'pal-park-area'],\n    ['getRegionByName', 'region'],\n    ['getAbilityByName', 'ability'],\n    ['getCharacteristicById', 'characteristic'],\n    ['getEggGroupByName', 'egg-group'],\n    ['getGenderByName', 'gender'],\n    ['getGrowthRateByName', 'growth-rate'],\n    ['getNatureByName', 'nature'],\n    ['getPokeathlonStatByName', 'pokeathlon-stat'],\n    ['getPokemonByName', 'pokemon'],\n    ['getPokemonColorByName', 'pokemon-color'],\n    ['getPokemonFormByName', 'pokemon-form'],\n    ['getPokemonHabitatByName', 'pokemon-habitat'],\n    ['getPokemonShapeByName', 'pokemon-shape'],\n    ['getPokemonSpeciesByName', 'pokemon-species'],\n    ['getStatByName', 'stat'],\n    ['getTypeByName', 'type'],\n    ['getLanguageByName', 'language'],\n];\nexport default endpoints;\n"
  },
  {
    "path": "dist/src/utils/ErrorHandler.js",
    "content": "/* eslint-disable no-shadow */\n/* eslint-disable no-unused-vars */\nfunction handleError(error, callback) {\n    if (callback) {\n        callback('Pokedex-promise-v2 error', error);\n    }\n    else {\n        throw error;\n    }\n}\nexport default handleError;\n"
  },
  {
    "path": "dist/src/utils/Getter.js",
    "content": "/* eslint-disable import/no-unresolved */\nimport axios from 'axios';\nimport handleError from './ErrorHandler.js';\nasync function getJSON(values, url, \n// eslint-disable-next-line no-unused-vars\ncallback) {\n    const options = {\n        baseURL: `${values.protocol}${values.hostName}/`,\n        timeout: values.timeout,\n    };\n    try {\n        // Retrieve possible content from memory-cache\n        const cachedResult = values.cache.get(url);\n        // If we have in cache\n        if (callback && cachedResult) {\n            // Call callback without errors\n            callback(cachedResult);\n        }\n        // Return the cache\n        if (cachedResult) {\n            return cachedResult;\n        }\n        // If we don't have in cache\n        // get the data from the API\n        const response = await axios.get(url, options);\n        // If there is an error on the request\n        if (response.status !== 200) {\n            throw response;\n        }\n        // If everything was good\n        // set the data\n        const responseData = response.data;\n        // Cache the object in memory-cache\n        // only if cacheLimit > 0\n        if (values.cacheLimit > 0) {\n            values.cache.set(url, responseData, values.cacheLimit);\n        }\n        // If a callback is present\n        if (callback) {\n            // Call it, without errors\n            callback(responseData);\n        }\n        return responseData;\n    }\n    catch (error) {\n        handleError(error, callback);\n    }\n    // If we return nothing and the error handler fails\n    // reject the promise\n    return Promise.reject();\n}\nexport default getJSON;\n"
  },
  {
    "path": "dist/src/utils/RootEndpoints.js",
    "content": "const rootEndpoints = [\n    ['getEndpointsList', ''],\n    ['getBerriesList', 'berry/'],\n    ['getBerriesFirmnessList', 'berry-firmness/'],\n    ['getBerriesFirmnesssList', 'berry-firmness/', '@deprecated will be removed on a future version. Use {@link getBerriesFirmnessList} instead'],\n    ['getBerriesFlavorsList', 'berry-flavor/'],\n    ['getContestTypesList', 'contest-type/'],\n    ['getContestEffectsList', 'contest-effect/'],\n    ['getSuperContestEffectsList', 'super-contest-effect/'],\n    ['getEncounterMethodsList', 'encounter-method/'],\n    ['getEncounterConditionsList', 'encounter-condition/'],\n    ['getEncounterConditionValuesList', 'encounter-condition-value/'],\n    ['getEvolutionChainsList', 'evolution-chain/'],\n    ['getEvolutionTriggersList', 'evolution-trigger/'],\n    ['getGenerationsList', 'generation/'],\n    ['getPokedexsList', 'pokedex/', '@deprecated will be removed on a future version. Use {@link getPokedexList} instead'],\n    ['getPokedexList', 'pokedex/'],\n    ['getVersionsList', 'version/'],\n    ['getVersionGroupsList', 'version-group/'],\n    ['getItemsList', 'item/'],\n    ['getItemAttributesList', 'item-attribute/'],\n    ['getItemCategoriesList', 'item-category/'],\n    ['getItemFlingEffectsList', 'item-fling-effect/'],\n    ['getItemPocketsList', 'item-pocket/'],\n    ['getMachinesList', 'machine/'],\n    ['getMovesList', 'move/'],\n    ['getMoveAilmentsList', 'move-ailment/'],\n    ['getMoveBattleStylesList', 'move-battle-style/'],\n    ['getMoveCategoriesList', 'move-category/'],\n    ['getMoveDamageClassesList', 'move-damage-class/'],\n    ['getMoveLearnMethodsList', 'move-learn-method/'],\n    ['getMoveTargetsList', 'move-target/'],\n    ['getLocationsList', 'location/'],\n    ['getLocationAreasList', 'location-area/'],\n    ['getPalParkAreasList', 'pal-park-area/'],\n    ['getRegionsList', 'region/'],\n    ['getAbilitiesList', 'ability/'],\n    ['getCharacteristicsList', 'characteristic/'],\n    ['getEggGroupsList', 'egg-group/'],\n    ['getGendersList', 'gender/'],\n    ['getGrowthRatesList', 'growth-rate/'],\n    ['getNaturesList', 'nature/'],\n    ['getPokeathlonStatsList', 'pokeathlon-stat/'],\n    ['getPokemonsList', 'pokemon/'],\n    ['getPokemonColorsList', 'pokemon-color/'],\n    ['getPokemonFormsList', 'pokemon-form/'],\n    ['getPokemonHabitatsList', 'pokemon-habitat/'],\n    ['getPokemonShapesList', 'pokemon-shape/'],\n    ['getPokemonSpeciesList', 'pokemon-species/'],\n    ['getStatsList', 'stat/'],\n    ['getTypesList', 'type/'],\n    ['getLanguagesList', 'language/'],\n];\nexport default rootEndpoints;\n"
  },
  {
    "path": "eslint.config.js",
    "content": "import tseslint from '@typescript-eslint/eslint-plugin';\nimport tsparser from '@typescript-eslint/parser';\n\nexport default [\n  {\n    ignores: ['dist/', 'types/'],\n  },\n  {\n    files: ['src/**/*.ts'],\n    languageOptions: {\n      parser: tsparser,\n      ecmaVersion: 2021,\n      sourceType: 'module',\n    },\n    plugins: {\n      '@typescript-eslint': tseslint,\n    },\n    rules: {\n      ...tseslint.configs.recommended.rules,\n      '@typescript-eslint/no-explicit-any': 'off',\n    },\n  },\n];\n"
  },
  {
    "path": "generator/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"import/no-extraneous-dependencies\": \"off\",\n    \"import/no-unresolved\": \"off\",\n    \"no-console\": \"off\",\n    \"no-restricted-syntax\": \"off\",\n    \"no-shadow\": \"off\",\n    \"no-continue\": \"off\",\n    \"no-await-in-loop\": \"off\",\n    \"prefer-destructuring\": \"off\"\n  }\n}"
  },
  {
    "path": "generator/AddJSDocs.ts",
    "content": "import axios from 'axios';\nimport path from 'path';\nimport { InterfaceDeclaration, ModuleDeclaration, Project } from 'ts-morph';\n\nimport { jsdocsLabel, typeFile } from './Utils.js';\n\n// The doc names available on the PokeAPI github repo\nconst docList = [\n  'berries',\n  'contests',\n  'encounters',\n  'evolution',\n  'games',\n  'items',\n  'locations',\n  'machines',\n  'moves',\n  'pokemon',\n  'resource-lists',\n  'utility',\n];\n\n// Add JSDocs to the interface and all of its properties\nfunction addJsDoc(\n  generatedInterface: InterfaceDeclaration,\n  index: number,\n  description: string,\n  model: any,\n) {\n  // If it is the the root interface, add the main description to it\n  if (index === 0 && description && description !== ' ') {\n    const jsDocs = generatedInterface.getJsDocs();\n\n    if (jsDocs && jsDocs[0] && jsDocs[0].getDescription()) {\n      jsDocs[0].setDescription(description);\n    } else {\n      generatedInterface.addJsDoc({\n        description,\n      });\n    }\n  }\n\n  // Add JSDocs to all of the properties of the interface\n  for (const field of model.fields) {\n    if (!field.description || field.description === ' ') {\n      continue;\n    }\n\n    const property = generatedInterface.getProperty(field.name);\n    const jsDocs = property?.getJsDocs();\n\n    if (jsDocs && jsDocs[0] && jsDocs[0].getDescription()) {\n      jsDocs[0].setDescription(field.description);\n    } else if (property) {\n      property.addJsDoc({\n        description: field.description,\n      });\n    }\n  }\n}\n\n// Load a doc from the PokeAPI docs and get the descriptions to apply to the code\nasync function loadDocumentation(namespace: ModuleDeclaration, docName: string) {\n  const response = await axios.get(`https://raw.githubusercontent.com/PokeAPI/pokeapi.co/master/src/docs/${docName}.json`);\n  const apis: any = await response.data;\n\n  // As one doc contain multiple APIs examples, loop through them\n  for (const api of apis) {\n    // Loop over all of the response models, not the examples\n    for (const [index, model] of api.responseModels.entries()) {\n      try {\n        // Quicktype has its quirks while generating the types, so those 3 lines account for them\n        const generatedInterface = namespace.getInterface(model.name === 'PokemonEncounter' ? 'LocationAreaPokemonEncounter' : model.name);\n        const purpleGeneratedInterface = namespace.getInterface(`Purple${model.name}`);\n        const fluffyGeneratedInterface = namespace.getInterface(`Fluffy${model.name}`);\n\n        if (generatedInterface) {\n          addJsDoc(generatedInterface, index, api.description, model);\n        }\n\n        if (purpleGeneratedInterface) {\n          addJsDoc(purpleGeneratedInterface, index, api.description, model);\n        }\n\n        if (fluffyGeneratedInterface) {\n          addJsDoc(fluffyGeneratedInterface, index, api.description, model);\n        }\n      } catch (error) {\n        console.log(model.name);\n        console.log(error);\n      }\n    }\n  }\n}\n\n// Timestamp\nconsole.time(jsdocsLabel);\nconsole.timeLog(jsdocsLabel, '- Starting to generate JSDocs...');\n\n// Initialize the types file\nconst project = new Project({\n  tsConfigFilePath: path.resolve('./tsconfig.json'),\n});\nconst file = project.getSourceFileOrThrow(typeFile);\n\n// Create the root module\nconst rootModule = file.getModuleOrThrow('\\'pokedex-promise-v2\\'');\n\n// Create the namespace\nconst namespace = rootModule.getModuleOrThrow('PokeAPI');\n\n// Top level async function\n(async () => {\n  // For each doc we have on the array, add the descriptions it provides\n  for (const docName of docList) {\n    await loadDocumentation(namespace, docName);\n  }\n\n  // Save the file\n  await file.save();\n\n  // Timestamp\n  console.timeEnd(jsdocsLabel);\n  console.log('JSDocs added!');\n})();\n"
  },
  {
    "path": "generator/Main.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport { MethodDeclarationStructure, OptionalKind, Project } from 'ts-morph';\n\nimport endpoints from '../src/utils/Endpoints.js';\nimport rootEndpoints from '../src/utils/RootEndpoints.js';\nimport {\n  apiMapFile, mainFile, mainLabel, typeFile,\n} from './Utils.js';\n\nconsole.time(mainLabel);\nconsole.timeLog(mainLabel, '- Starting to main class...');\n\n// Initialize the project\nconst project = new Project({\n  tsConfigFilePath: path.resolve('./tsconfig.json'),\n});\n\n// Create the main index.ts\nconst indexFile = project.createSourceFile(mainFile, `/* eslint-disable */\n/*\n* DO NOT MODIFY, THIS IS AUTO GENERATED\n* Execute \\`npm run generate\\` to regenerate\n*/`, { overwrite: true });\n\n// Get the types file\nconst declarationFile = project.getSourceFile(typeFile);\n\n// Get the types module\nconst existingDeclarationModule = declarationFile.getModule('\\'pokedex-promise-v2\\'');\n\n// Get the export existing export and remove them if it exists\nconst existingDeclarationExports = existingDeclarationModule.getExportAssignments();\nif (existingDeclarationExports && existingDeclarationExports.length >= 1) {\n  existingDeclarationExports[0].remove();\n}\n\n// Gets the default types class and remove it if it exists\nconst existingDeclarationClass = existingDeclarationModule.getClass('PokeAPI');\nif (existingDeclarationClass) {\n  existingDeclarationClass.remove();\n}\n\n// Create the updated class\nconst declarationClass = existingDeclarationModule.addClass({\n  name: 'PokeAPI',\n});\n\n// Read the API Map\nconst apiMap = JSON.parse(fs.readFileSync(apiMapFile).toString());\n\n// Import dependencies\nindexFile.addImportDeclaration({\n  defaultImport: 'pMap',\n  moduleSpecifier: 'p-map',\n});\n\nindexFile.addImportDeclaration({\n  defaultImport: 'NodeCache',\n  moduleSpecifier: 'node-cache',\n});\n\nindexFile.addImportDeclaration({\n  defaultImport: 'PokeAPITypes',\n  moduleSpecifier: 'pokedex-promise-v2',\n});\n\nindexFile.addImportDeclaration({\n  defaultImport: 'ListEndpointOptions',\n  moduleSpecifier: './interfaces/ListEndpointOptions.js',\n});\n\nindexFile.addImportDeclaration({\n  defaultImport: 'PokeAPIOptions',\n  moduleSpecifier: './interfaces/PokeAPIOptions.js',\n});\n\nindexFile.addImportDeclaration({\n  defaultImport: 'handleError',\n  moduleSpecifier: './utils/ErrorHandler.js',\n});\n\nindexFile.addImportDeclaration({\n  defaultImport: 'getJSON',\n  moduleSpecifier: './utils/Getter.js',\n});\n\n// Add the main PokeAPI class\nconst pokeApiClass = indexFile.addClass({\n  name: 'Pokedex',\n}).setIsDefaultExport(true);\n\n// Add options\npokeApiClass.addProperty({\n  name: 'options',\n  type: 'PokeAPIOptions',\n});\n\n// Create constructor\nconst classConstructor = {\n  parameters: [{\n    name: 'options',\n    type: 'PokeAPIOptions',\n    hasQuestionToken: true,\n  }],\n};\n\n// Add the constructor typing to the class\npokeApiClass.addConstructor(classConstructor)\n  .setBodyText('this.options = new PokeAPIOptions(options, new NodeCache());');\ndeclarationClass.addConstructor(classConstructor);\n\n// Timestamp\nconsole.timeLog(mainLabel, ' - Base generated, generating methods...');\n\n// Add the get generic resource array method\nconst getResourceCode = `try {\n  // Fail if the endpoint is not supplied\n  if (!endpoint) {\n    throw new Error('Param \"endpoint\" is required needs to be a string or array of strings');\n  }\n\n  // Fail if the input types aren't accepted\n  if (!Array.isArray(endpoint) && typeof endpoint !== 'string') {\n    throw new Error('Param \"endpoint\" needs to be a string or array of strings');\n  }\n\n  /// If the user has submitted a string, return the JSON promise\n  if (typeof endpoint === 'string') {\n    return getJSON<any>(this.options, endpoint, callback);\n  }\n\n  // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n  const mapper = async (endpoints: string) => {\n    const queryRes = await getJSON<any>(this.options, endpoints);\n    return queryRes;\n  };\n\n  // Fetch data asynchronously to be faster\n  const mappedResults = await pMap(endpoint, mapper, { concurrency: 4 });\n\n  if (callback) {\n    callback(mappedResults);\n  }\n\n  return mappedResults;\n} catch (error) {\n  handleError(error, callback);\n}`;\n\nlet methodStructure: OptionalKind<MethodDeclarationStructure> = {\n  name: 'getResource',\n  isAsync: true,\n  parameters: [{\n    name: 'endpoint',\n    type: 'string | string[]',\n  },\n  {\n    name: 'callback',\n    type: '(result: any | any[], error?: any) => any',\n    hasQuestionToken: true,\n  }],\n  returnType: 'Promise<any | any[]>',\n  overloads: [\n    {\n      parameters: [\n        {\n          name: 'endpoint',\n          type: 'string',\n        },\n        {\n          name: 'callback',\n          type: '(result: any, error?: any) => any',\n          hasQuestionToken: true,\n        },\n      ],\n      returnType: 'Promise<any>',\n    },\n    {\n      parameters: [\n        {\n          name: 'endpoint',\n          type: 'string[]',\n        },\n        {\n          name: 'callback',\n          type: '(result: any[], error?: any) => any',\n          hasQuestionToken: true,\n        },\n      ],\n      returnType: 'Promise<any[]>',\n    },\n  ],\n};\n\npokeApiClass.addMethod(methodStructure).setBodyText(getResourceCode);\n// Add the declaration to the types file\n// Removing the async keyword\nmethodStructure.isAsync = false;\ndeclarationClass.addMethod(methodStructure);\n\n// Add the deprecated get generic resource method for backwards compatibility\nmethodStructure.name = 'resource';\n\nmethodStructure.isAsync = true;\npokeApiClass.addMethod(methodStructure).setBodyText(getResourceCode)\n  .addJsDoc('@deprecated - will be removed on the next version. Use {@link getResource} instead');\n\n// Add the declaration to the types file\n// Removing the async keyword\nmethodStructure.isAsync = false;\ndeclarationClass.addMethod(methodStructure)\n  .addJsDoc('@deprecated - will be removed on the next version. Use {@link getResource} instead');\n\n// Add all the methods from the endpoints list,\n// setting the parameters typing and binding to the correct interface and endpoint\nfor (const [methodName, endpoint, jsdocs] of endpoints) {\n  const inputParam = methodName.match(/ByName$/) ? 'nameOrId' : 'id';\n  const inputParamType = methodName.match(/ByName$/) ? 'string | number | Array<string | number>' : 'number | number[]';\n\n  const singleParamType = methodName.match(/ByName$/) ? 'string | number' : 'number';\n  const multipleParamType = methodName.match(/ByName$/) ? 'Array<string | number>' : 'number[]';\n\n  const returnType = `PokeAPITypes.${apiMap[endpoint]}`;\n\n  methodStructure = {\n    name: methodName,\n    isAsync: true,\n    parameters: [{\n      name: inputParam,\n      type: inputParamType,\n    },\n    {\n      name: 'callback',\n      type: `((result: ${returnType}, error?: any) => any) & ((result: ${returnType}[], error?: any) => any)`,\n      hasQuestionToken: true,\n    }],\n    returnType: `Promise<${returnType} | ${returnType}[]>`,\n    overloads: [\n      {\n        parameters: [\n          {\n            name: inputParam,\n            type: singleParamType,\n          },\n          {\n            name: 'callback',\n            type: `(result: ${returnType}, error?: any) => any`,\n            hasQuestionToken: true,\n          },\n        ],\n        returnType: `Promise<${returnType}>`,\n      },\n      {\n        parameters: [\n          {\n            name: inputParam,\n            type: multipleParamType,\n          },\n          {\n            name: 'callback',\n            type: `(result: ${returnType}[], error?: any) => any`,\n            hasQuestionToken: true,\n          },\n        ],\n        returnType: `Promise<${returnType}[]>`,\n      },\n    ],\n  };\n\n  const generatedMethod = pokeApiClass.addMethod(methodStructure).setBodyText(`try {\n    // Fail if the param is not supplied\n    if (!${inputParam}) {\n      throw new Error('Param \"${inputParam}\" is required (Must be a ${methodName.match(/ByName$/) ? 'string, array of strings or array of string and/or numbers' : 'number or array of numbers'} )');\n    }\n\n    // Fail if the input types aren't accepted\n    if (!Array.isArray(${inputParam}) && typeof ${inputParam} !== 'number' && typeof ${inputParam} !== 'string') {\n    throw new Error('Param \"${inputParam}\" must be a ${methodName.match(/ByName$/) ? 'string, array of strings or array of string and/or numbers' : 'number or array of numbers'}');\n    }\n\n    // If the user has submitted a Name or an ID, return the JSON promise\n    if (typeof ${inputParam} === 'number' || typeof ${inputParam} === 'string') {\n      return getJSON<${returnType}>(this.options, \\`\\${this.options.protocol}\\${this.options.hostName}\\${this.options.versionPath}${endpoint}/\\${${inputParam}}/\\`, callback);\n    }\n\n    // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n    const mapper = async (${inputParam}s: ${inputParamType}) => {\n      const queryRes = await getJSON<${returnType}>(this.options, \\`\\${this.options.protocol}\\${this.options.hostName}\\${this.options.versionPath}${endpoint}/\\${${inputParam}s}/\\`);\n      return queryRes;\n    };\n\n    // Fetch data asynchronously to be faster\n    const mappedResults = await pMap(${inputParam}, mapper, { concurrency: 4 });\n\n    // Invoke the callback if we have one\n    if (callback) {\n      callback(mappedResults);\n    }\n\n    return mappedResults;\n} catch (error) {\n    handleError(error, callback);\n}`);\n\n  // Add the declaration to the types file\n  // Removing the async keyword\n  methodStructure.isAsync = false;\n  const declaredMethod = declarationClass.addMethod(methodStructure);\n\n  // If the method has a JSDoc, add it\n  if (jsdocs) {\n    generatedMethod.addJsDoc(jsdocs);\n    declaredMethod.addJsDoc(jsdocs);\n  }\n}\n\n// Timestamp\nconsole.timeLog(mainLabel, ' - Normal methods completed, generating methods for root endpoints...');\n\n// Add all the get list methods from the root endpoints list,\n// setting the parameters typing and binding to the correct interface and endpoint\n// Also sets correctly to a named or normal list\nfor (const [method, rawEndpoint, jsdocs] of rootEndpoints) {\n  // Remove the last slash and add '-list' to the end\n  const endpoint = `${rawEndpoint.replace(/\\/$/, '')}-list`;\n\n  // If the method doesn't have a interface, skip it\n  if (!apiMap[endpoint]) {\n    if (method !== 'getEndpointsList') {\n      console.log('Could not found interface for: ', method);\n    }\n    continue;\n  }\n\n  // Infer the return type from the name\n  const returnType = `PokeAPITypes.${apiMap[endpoint].includes('NamedList') ? 'NamedAPIResourceList' : 'APIResourceList'}`;\n\n  const methodStructure = {\n    name: method,\n    isAsync: true,\n    parameters: [{\n      name: 'interval',\n      type: 'ListEndpointOptions',\n      hasQuestionToken: true,\n    },\n    {\n      name: 'callback',\n      type: `(result: ${returnType}, error?: any) => any`,\n      hasQuestionToken: true,\n    }],\n    returnType: `Promise<${returnType}>`,\n  };\n\n  const generatedMethod = pokeApiClass.addMethod(methodStructure).setBodyText(`try {\n    let { limit, offset } = this.options;\n\n    if (interval) {\n      if (interval.hasOwnProperty('limit')) {\n        limit = interval.limit;\n      }\n\n      if (interval.hasOwnProperty('offset')) {\n        offset = interval.offset;\n      }\n    }\n\n    return getJSON(this.options, \\`\\${this.options.protocol}\\${this.options.hostName}\\${this.options.versionPath}${rawEndpoint}?limit=\\${limit}&offset=\\${offset}\\`, callback);\n  } catch (error) {\n    handleError(error, callback);\n  }`);\n\n  // Add the declaration to the types file\n  // Removing the async keyword\n  methodStructure.isAsync = false;\n  const declaredMethod = declarationClass.addMethod(methodStructure);\n\n  // If the method has a JSDoc, add it\n  if (jsdocs) {\n    generatedMethod.addJsDoc(jsdocs);\n    declaredMethod.addJsDoc(jsdocs);\n  }\n}\n\n// Add method to get the list of endpoints\nmethodStructure = {\n  name: 'getEndpointsList',\n  isAsync: true,\n  parameters: [{\n    name: 'interval',\n    type: 'ListEndpointOptions',\n    hasQuestionToken: true,\n  },\n  {\n    name: 'callback',\n    type: '(result: any, error?: any) => any',\n    hasQuestionToken: true,\n  }],\n  returnType: 'Promise<PokeAPITypes.EndpointsList>',\n};\n\npokeApiClass.addMethod(methodStructure).setBodyText(`\ntry {\n  let { limit, offset } = this.options;\n\n  if (interval) {\n    if (interval.hasOwnProperty('limit')) {\n      limit = interval.limit;\n    }\n\n    if (interval.hasOwnProperty('offset')) {\n      offset = interval.offset;\n    }\n  }\n\n  return getJSON(this.options, \\`\\${this.options.protocol}\\${this.options.hostName}\\${this.options.versionPath}?limit=\\${limit}&offset=\\${offset}\\`, callback);\n} catch (error) {\n  handleError(error, callback);\n}`);\n\n// Add the declaration to the types file\n// Removing the async keyword\nmethodStructure.isAsync = false;\ndeclarationClass.addMethod(methodStructure);\n\n// Add method to get the config\npokeApiClass.addMethod({\n  name: 'getConfig',\n}).setBodyText('return this.options;').addJsDoc('Retrieve the configs used');\n\n// Add method to get the cache size\npokeApiClass.addMethod({\n  name: 'getCachedItemsCount',\n}).setBodyText('return this.options.cache.stats.keys;').addJsDoc('Retuns the current number of entries in the cache');\n\npokeApiClass.addMethod({\n  name: 'cacheSize',\n}).setBodyText('return this.options.cache.stats.keys;').addJsDoc('@deprecated use {@link getCachedItemsCount}');\n\n// Add method to clear the cache\npokeApiClass.addMethod({\n  name: 'clearCache',\n}).setBodyText('this.options.cache.flushAll();').addJsDoc('Deletes all keys in cache');\n\n// Export the typing\ndeclarationClass.getParentModule().addExportAssignment({\n  expression: 'PokeAPI',\n});\n\n// Sanitize the namespaces of the declaration file and format it again\ndeclarationClass.replaceWithText(declarationClass.getFullText().replace(/PokeAPITypes/g, 'PokeAPI'));\ndeclarationClass.formatText();\n\n// Top level async function\n(async () => {\n  // Save and compile to JS\n  await indexFile.save();\n  await declarationFile.save();\n  await project.emit();\n})();\n\n// Timestamp\nconsole.timeEnd(mainLabel);\nconsole.log('Main class generated!');\n"
  },
  {
    "path": "generator/TypesGenerator.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport directoryTree from 'directory-tree';\nimport { Project, Writers } from 'ts-morph';\nimport {\n  quicktype, InputData, JSONSchemaInput, FetchingJSONSchemaStore,\n} from 'quicktype-core';\n\nimport {\n  apiMapFile, schemaFolder, typesLabel, typeFile,\n} from './Utils.js';\n\nconsole.log(schemaFolder);\nif (!fs.existsSync(schemaFolder)) {\n  console.log('Schemas not found, please clone the \"PokeAPI/api-data\" repository on the root of this project first and change all $refs from \"/schema/v2\" to \"api-data/data/schema/v2\")');\n  process.exit(1);\n}\n\n// Helper functions to interface names\nfunction clearAndUpper(text: string) {\n  return text.replace(/-/, '').toUpperCase();\n}\n\nfunction toPascalCase(text: string) {\n  return text.replace(/(^\\w|-\\w)/g, clearAndUpper);\n}\n\n// A map for the methods of the class\nconst apiMap: Record<string, string> = {};\n\n// The method that will string together the types and the PokeAPI class\nasync function generateFinalFile(types: string) {\n  // Log progress...\n  console.timeLog(typesLabel, '- Types generated, starting the generation of the definition file...');\n\n  // Initialize the types file\n  const project = new Project();\n  const file = project.createSourceFile(typeFile, `/*\n* Type definitions for pokedex-promise-v2 v4.x\n* DO NOT MODIFY, THIS IS AUTO GENERATED\n* Code by: HRKings <https://github.com/HRKings/>\n* And: Christian Garza <https://github.com/C-Garza/>\n* Code inspired by: Mudkip <https://github.com/mudkipme/>\n* Execute \\`npm run generate:types\\` to regenerate\n*/`, { overwrite: true });\n\n  // Create the root module\n  const rootModule = file.addModule({\n    name: '\\'pokedex-promise-v2\\'',\n  });\n\n  // Create the namespace\n  const namespace = rootModule.addModule({\n    name: 'PokeAPI',\n  });\n\n  // Write the interfaces to the namespace\n  namespace.setBodyText(types);\n\n  // Remove interfaces that are wrongly generated\n  namespace.getInterface('EvolutionChainElement')?.remove();\n  namespace.getInterface('ResultElement')?.remove();\n  namespace.getInterface('GenerationElement')?.remove();\n  namespace.getInterface('VersionGroupNamedList')?.remove();\n\n  // Replace the wrong definitions with the correct ones\n  namespace.setBodyText(namespace.getBodyText()\n    .replace(/ResultElement/g, 'APIResource')\n    .replace(/EvolutionChainElement/g, 'APIResource')\n    .replace(/GenerationElement/g, 'NamedAPIResource'));\n\n  // Format the namespace to be correctly indented\n  namespace.formatText();\n\n  // Add the root endpoint interval\n  rootModule.addInterface({\n    name: 'ListEndpointOptions',\n    properties: [{\n      name: 'offset',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The offset to be used in the request'],\n    }, {\n      name: 'limit',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The limit to be used in the request'],\n    }, {\n      name: 'cacheLimit',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The limit of the cache in milliseconds'],\n    }],\n  });\n\n  // Add the options interface\n  rootModule.addInterface({\n    name: 'PokeAPIOptions',\n    properties: [{\n      name: 'protocol',\n      type: Writers.unionType('\\'https\\'', '\\'http\\''),\n      hasQuestionToken: true,\n      docs: ['The protocol to be used',\n        '@default \\'https\\''],\n    }, {\n      name: 'hostName',\n      type: 'string',\n      hasQuestionToken: true,\n      docs: ['The hostname of the PokeAPI instance',\n        '@default \\'pokeapi.co\\''],\n    }, {\n      name: 'versionPath',\n      type: 'string',\n      hasQuestionToken: true,\n      docs: ['The version path of the API',\n        '@default \\'/api/v2/\\''],\n    }, {\n      name: 'offset',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The offset to be used in list requests',\n        '@default 0'],\n    }, {\n      name: 'limit',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The limit to be used in list requests',\n        '@default 100000'],\n    }, {\n      name: 'timeout',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The timeout of a response in milliseconds',\n        '@default 10 * 1000 // (10 seconds)'],\n    }, {\n      name: 'cacheLimit',\n      type: 'number',\n      hasQuestionToken: true,\n      docs: ['The limit of the cache in milliseconds',\n        '@default 1000000 * 1000 // (11 days)'],\n    }],\n  });\n\n  // Write the file\n  await file.save();\n\n  // Write the API Map\n  fs.writeFileSync(apiMapFile, JSON.stringify(apiMap, null, 2));\n\n  // Log progress...\n  console.timeEnd(typesLabel);\n  console.log('Definition file created!');\n}\n\n// Log start\nconsole.time(typesLabel);\nconsole.timeLog(typesLabel, '- Starting to generate types...');\n\n// Init quicktype stuff\nconst schemaInput = new JSONSchemaInput(new FetchingJSONSchemaStore());\nconst inputData = new InputData();\n\n// Gets schema file and adds it to schema source, outputs file at end\nasync function quicktypeMain(jsonSchema: string, basename: string) {\n  // Add a single schema file to the schemaInput\n  await schemaInput.addSource({ name: basename, schema: jsonSchema });\n\n  // If its the last schema to process\n  if (basename === 'VersionGroupNamedList') {\n    // Adds the last file to the schema\n    inputData.addInput(schemaInput);\n\n    // Combines final large schema file into d.ts file\n    const qt = await quicktype({\n      inputData,\n      lang: 'typescript',\n      rendererOptions: {\n        'just-types': 'true',\n      },\n    });\n\n    await generateFinalFile(qt.lines.join('\\n').replace(/export /g, ''));\n  }\n}\n\n// First pass through directory tree to make sure standalone files\n// are added to schema source first\nconst tree = directoryTree(schemaFolder, { extensions: /\\.json$/, normalizePath: true });\ntree.children.forEach((child) => {\n  if (!child.children) {\n    // Get the file name\n    let basename = path.basename(child.path, '.json').replace(/_/g, '-');\n\n    // If the interface is the one containing all the endpoints, rename the interface\n    if (basename === 'index') {\n      basename = 'EndpointsList';\n    } else {\n      basename = toPascalCase(basename);\n    }\n\n    // Read all the schema file\n    const jsonSchema = fs.readFileSync(child.path, 'utf8');\n    quicktypeMain(jsonSchema, basename);\n  }\n});\n\n// Loops through schema directory with main logic\ndirectoryTree(schemaFolder, { extensions: /\\.json$/, normalizePath: true }, (item) => {\n  // Split the path, to get the folder names later\n  const paths = item.path.split('/').reverse();\n\n  // Don't add the standalone files again to the schema source\n  // also, don't parse the -1 folder\n  if (paths[1] !== 'v2' && !item.path.includes('move-ailment/-1')) {\n    // The endpoint path, as in the endpoints list\n    let basename: string;\n    // The name of the generated interface/type\n    let interfaceName: string;\n\n    // Handle special case\n    if (item.path.includes('pokemon/$id/encounters')) {\n      basename = 'pokemon-encounter';\n      interfaceName = 'PokemonEncounter';\n    } else if (item.path.includes('$id')) {\n      // If the scheme is the wanted one, pick the name of two folder above\n      // eg.: 'pokemon/$id/index.json', picks the \"pokemon\"\n      basename = paths[2];\n      interfaceName = toPascalCase(basename);\n    } else {\n      // Gets one folder above (used for the resource lists)\n      // eg. 'pokemon/index.js', picks the \"pokemon\"\n      // and adds 'List' to the interface name, eg. 'PokemonList'\n      basename = `${paths[1]}-list`;\n      interfaceName = toPascalCase(basename);\n    }\n\n    // Register to the API map to use later on the methods\n    apiMap[basename] = interfaceName;\n\n    // Read all the schema file\n    const jsonSchema = fs.readFileSync(item.path, 'utf8');\n\n    // If the interface contains named resources and is a list, rename the interface\n    if (interfaceName.includes('List') && jsonSchema.includes('named_api_resource_list.json')) {\n      interfaceName = interfaceName.replace('List', 'NamedList');\n      apiMap[basename] = interfaceName;\n    }\n\n    quicktypeMain(jsonSchema, interfaceName);\n  }\n});\n"
  },
  {
    "path": "generator/Utils.ts",
    "content": "/* eslint-disable no-underscore-dangle */\nimport { fileURLToPath } from 'url';\nimport path, { dirname } from 'path';\n\nexport const __filename = fileURLToPath(import.meta.url);\nexport const __dirname = dirname(__filename);\n\n// Paths that will be used\nexport const typeFile = path.resolve(__dirname, '../../types/index.d.ts');\nexport const mainFile = path.resolve(__dirname, '../../src/index.ts');\nexport const apiMapFile = path.join(__dirname, 'apiMap.json');\nexport const schemaFolder = path.resolve(__dirname, '../../api-data/data/schema/v2');\n\n// Timer labels\nexport const typesLabel = 'Types Generator';\nexport const mainLabel = 'Main Generator';\nexport const jsdocsLabel = 'JSDocs Generator';\n"
  },
  {
    "path": "generator/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"es2020\",\n    \"importHelpers\": true,\n    \"moduleResolution\": \"node\",\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\n      \"es2020\",\n      \"dom\"\n    ],\n    \"outDir\": \"../dist\"\n  },\n  \"include\": [\n    \"./**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"pokedex-promise-v2\",\n  \"type\": \"module\",\n  \"version\": \"4.2.1\",\n  \"description\": \"A library used to get information about Pokemons.\",\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"main\": \"dist/src/index.js\",\n  \"typings\": \"types/index.d.ts\",\n  \"scripts\": {\n    \"doctoc\": \"doctoc .\",\n    \"test\": \"tsc && mocha dist/test/\",\n    \"testjs\": \"(cd test/js && npm i ../.. && node index.js)\",\n    \"apidata:clone\": \"git clone https://github.com/PokeAPI/api-data.git\",\n    \"apidata:sync\": \"git -C api-data reset --hard HEAD && git -C api-data pull\",\n    \"apidata:replace\": \"find api-data/data/schema -type f -exec sed -i -e s:/schema/v2:api-data/data/schema/v2:g {} +\",\n    \"generate:types\": \"tsc -p generator/ && node dist/generator/TypesGenerator.js\",\n    \"generate:main\": \"tsc -p generator/ && node dist/generator/Main.js\",\n    \"generate:jsdocs\": \"tsc -p generator/ && node dist/generator/AddJSDocs.js\",\n    \"lint\": \"eslint src/ --fix\",\n    \"generate:all\": \"(npm run apidata:clone || true) && npm run apidata:sync && npm run apidata:replace && npm run generate:types && npm run generate:main && npm run generate:jsdocs\"\n  },\n  \"files\": [\n    \"dist/src/\",\n    \"types\"\n  ],\n  \"types\": \"types/index.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/PokeAPI/pokedex-promise-v2\"\n  },\n  \"keywords\": [\n    \"pokedex\",\n    \"pokemon\",\n    \"nintendo\",\n    \"promise\",\n    \"pokeapi\"\n  ],\n  \"author\": \"Thomas Asadurian <Tasadurian@gmail.com> (http://thetommytwitch.github.io/)\",\n  \"contributors\": [\n    \"Alessandro Pezzé <igougi.ui@gmail.com> (https://github.com/Naramsim)\",\n    \"Christian Garza (https://github.com/C-Garza)\",\n    \"Helton Reis (https://github.com/HRKings)\"\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/PokeAPI/pokedex-promise-v2/issues\"\n  },\n  \"homepage\": \"https://github.com/PokeAPI/pokedex-promise-v2#readme\",\n  \"dependencies\": {\n    \"axios\": \"^1.13.5\",\n    \"node-cache\": \"^5.1.2\",\n    \"p-map\": \"^7.0.4\"\n  },\n  \"devDependencies\": {\n    \"@types/chai\": \"^4.3.20\",\n    \"@types/chai-as-promised\": \"^7.1.8\",\n    \"@types/chai-things\": \"^0.0.38\",\n    \"@types/memory-cache\": \"^0.2.6\",\n    \"@types/mocha\": \"^10.0.10\",\n    \"@types/node\": \"^20.19.33\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.56.1\",\n    \"@typescript-eslint/parser\": \"^8.56.1\",\n    \"chai\": \"^4.5.0\",\n    \"chai-as-promised\": \"^7.1.2\",\n    \"chai-things\": \"^0.2.0\",\n    \"directory-tree\": \"^3.6.0\",\n    \"doctoc\": \"^2.3.0\",\n    \"eslint\": \"^10.0.2\",\n    \"lodash\": \"^4.17.23\",\n    \"mocha\": \"^11.7.5\",\n    \"quicktype-core\": \"^23.2.6\",\n    \"ts-morph\": \"^27.0.2\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"packageManager\": \"pnpm@9.15.4\",\n  \"overrides\": {\n    \"minimatch\": \">=10.2.3\",\n    \"diff\": \">=8.0.3\",\n    \"serialize-javascript\": \">=7.0.3\",\n    \"underscore\": \">=1.13.8\",\n    \"flatted\": \">=3.4.0\"\n  },\n  \"pnpm\": {\n    \"overrides\": {\n      \"braces@<3.0.3\": \">=3.0.3\",\n      \"micromatch@<4.0.8\": \">=4.0.8\",\n      \"axios@>=1.0.0 <1.8.2\": \">=1.8.2\",\n      \"cross-spawn@>=7.0.0 <7.0.5\": \">=7.0.5\",\n      \"brace-expansion@>=1.0.0 <=1.1.11\": \">=1.1.12\",\n      \"brace-expansion@>=2.0.0 <=2.0.1\": \">=2.0.2\",\n      \"form-data@>=4.0.0 <4.0.4\": \">=4.0.4\",\n      \"axios@<1.12.0\": \">=1.12.0\",\n      \"minimatch@<10.2.3\": \">=10.2.3\",\n      \"diff@>=6.0.0 <8.0.3\": \">=8.0.3\",\n      \"js-yaml@>=4.0.0 <4.1.1\": \">=4.1.1\",\n      \"serialize-javascript@<=7.0.2\": \">=7.0.3\",\n      \"underscore@<=1.13.7\": \">=1.13.8\",\n      \"flatted@<3.4.0\": \">=3.4.0\"\n    }\n  }\n}\n"
  },
  {
    "path": "src/index.ts",
    "content": "/*\n* DO NOT MODIFY, THIS IS AUTO GENERATED\n* Execute `npm run generate` to regenerate\n*/\nimport pMap from \"p-map\";\nimport NodeCache from \"node-cache\";\nimport PokeAPITypes from \"pokedex-promise-v2\";\nimport ListEndpointOptions from \"./interfaces/ListEndpointOptions.js\";\nimport PokeAPIOptions from \"./interfaces/PokeAPIOptions.js\";\nimport handleError from \"./utils/ErrorHandler.js\";\nimport getJSON from \"./utils/Getter.js\";\n\nexport default class Pokedex {\n    options: PokeAPIOptions;\n\n    constructor(options?: PokeAPIOptions) {\n        this.options = new PokeAPIOptions(options, new NodeCache());\n    }\n\n    getResource(endpoint: string, callback?: (result: any, error?: any) => any): Promise<any>;\n    getResource(endpoint: string[], callback?: (result: any[], error?: any) => any): Promise<any[]>;\n    async getResource(endpoint: string | string[], callback?: (result: any | any[], error?: any) => any): Promise<any | any[]> {\n        try {\n          // Fail if the endpoint is not supplied\n          if (!endpoint) {\n            throw new Error('Param \"endpoint\" is required needs to be a string or array of strings');\n          }\n\n          // Fail if the input types aren't accepted\n          if (!Array.isArray(endpoint) && typeof endpoint !== 'string') {\n            throw new Error('Param \"endpoint\" needs to be a string or array of strings');\n          }\n\n          /// If the user has submitted a string, return the JSON promise\n          if (typeof endpoint === 'string') {\n            return getJSON<any>(this.options, endpoint, callback);\n          }\n\n          // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n          const mapper = async (endpoints: string) => {\n            const queryRes = await getJSON<any>(this.options, endpoints);\n            return queryRes;\n          };\n\n          // Fetch data asynchronously to be faster\n          const mappedResults = await pMap(endpoint, mapper, { concurrency: 4 });\n\n          if (callback) {\n            callback(mappedResults);\n          }\n\n          return mappedResults;\n        } catch (error) {\n          handleError(error, callback);\n        }\n    }\n\n    resource(endpoint: string, callback?: (result: any, error?: any) => any): Promise<any>;\n    resource(endpoint: string[], callback?: (result: any[], error?: any) => any): Promise<any[]>;\n    /** @deprecated - will be removed on the next version. Use {@link getResource} instead */\n    async resource(endpoint: string | string[], callback?: (result: any | any[], error?: any) => any): Promise<any | any[]> {\n        try {\n          // Fail if the endpoint is not supplied\n          if (!endpoint) {\n            throw new Error('Param \"endpoint\" is required needs to be a string or array of strings');\n          }\n\n          // Fail if the input types aren't accepted\n          if (!Array.isArray(endpoint) && typeof endpoint !== 'string') {\n            throw new Error('Param \"endpoint\" needs to be a string or array of strings');\n          }\n\n          /// If the user has submitted a string, return the JSON promise\n          if (typeof endpoint === 'string') {\n            return getJSON<any>(this.options, endpoint, callback);\n          }\n\n          // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n          const mapper = async (endpoints: string) => {\n            const queryRes = await getJSON<any>(this.options, endpoints);\n            return queryRes;\n          };\n\n          // Fetch data asynchronously to be faster\n          const mappedResults = await pMap(endpoint, mapper, { concurrency: 4 });\n\n          if (callback) {\n            callback(mappedResults);\n          }\n\n          return mappedResults;\n        } catch (error) {\n          handleError(error, callback);\n        }\n    }\n\n    getBerryByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Berry, error?: any) => any): Promise<PokeAPITypes.Berry>;\n    getBerryByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Berry[], error?: any) => any): Promise<PokeAPITypes.Berry[]>;\n    async getBerryByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Berry, error?: any) => any) & ((result: PokeAPITypes.Berry[], error?: any) => any)): Promise<PokeAPITypes.Berry | PokeAPITypes.Berry[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Berry>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Berry>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getBerryFirmnessByName(nameOrId: string | number, callback?: (result: PokeAPITypes.BerryFirmness, error?: any) => any): Promise<PokeAPITypes.BerryFirmness>;\n    getBerryFirmnessByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.BerryFirmness[], error?: any) => any): Promise<PokeAPITypes.BerryFirmness[]>;\n    async getBerryFirmnessByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.BerryFirmness, error?: any) => any) & ((result: PokeAPITypes.BerryFirmness[], error?: any) => any)): Promise<PokeAPITypes.BerryFirmness | PokeAPITypes.BerryFirmness[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.BerryFirmness>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.BerryFirmness>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getBerryFlavorByName(nameOrId: string | number, callback?: (result: PokeAPITypes.BerryFlavor, error?: any) => any): Promise<PokeAPITypes.BerryFlavor>;\n    getBerryFlavorByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.BerryFlavor[], error?: any) => any): Promise<PokeAPITypes.BerryFlavor[]>;\n    async getBerryFlavorByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.BerryFlavor, error?: any) => any) & ((result: PokeAPITypes.BerryFlavor[], error?: any) => any)): Promise<PokeAPITypes.BerryFlavor | PokeAPITypes.BerryFlavor[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.BerryFlavor>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-flavor/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.BerryFlavor>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-flavor/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getContestTypeByName(nameOrId: string | number, callback?: (result: PokeAPITypes.ContestType, error?: any) => any): Promise<PokeAPITypes.ContestType>;\n    getContestTypeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.ContestType[], error?: any) => any): Promise<PokeAPITypes.ContestType[]>;\n    async getContestTypeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.ContestType, error?: any) => any) & ((result: PokeAPITypes.ContestType[], error?: any) => any)): Promise<PokeAPITypes.ContestType | PokeAPITypes.ContestType[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.ContestType>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-type/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.ContestType>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-type/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getContestEffectById(id: number, callback?: (result: PokeAPITypes.ContestEffect, error?: any) => any): Promise<PokeAPITypes.ContestEffect>;\n    getContestEffectById(id: number[], callback?: (result: PokeAPITypes.ContestEffect[], error?: any) => any): Promise<PokeAPITypes.ContestEffect[]>;\n    async getContestEffectById(id: number | number[], callback?: ((result: PokeAPITypes.ContestEffect, error?: any) => any) & ((result: PokeAPITypes.ContestEffect[], error?: any) => any)): Promise<PokeAPITypes.ContestEffect | PokeAPITypes.ContestEffect[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n              throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n            throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n              return getJSON<PokeAPITypes.ContestEffect>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-effect/${id}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids: number | number[]) => {\n              const queryRes = await getJSON<PokeAPITypes.ContestEffect>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-effect/${ids}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getSuperContestEffectById(id: number, callback?: (result: PokeAPITypes.SuperContestEffect, error?: any) => any): Promise<PokeAPITypes.SuperContestEffect>;\n    getSuperContestEffectById(id: number[], callback?: (result: PokeAPITypes.SuperContestEffect[], error?: any) => any): Promise<PokeAPITypes.SuperContestEffect[]>;\n    async getSuperContestEffectById(id: number | number[], callback?: ((result: PokeAPITypes.SuperContestEffect, error?: any) => any) & ((result: PokeAPITypes.SuperContestEffect[], error?: any) => any)): Promise<PokeAPITypes.SuperContestEffect | PokeAPITypes.SuperContestEffect[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n              throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n            throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n              return getJSON<PokeAPITypes.SuperContestEffect>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}super-contest-effect/${id}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids: number | number[]) => {\n              const queryRes = await getJSON<PokeAPITypes.SuperContestEffect>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}super-contest-effect/${ids}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getEncounterMethodByName(nameOrId: string | number, callback?: (result: PokeAPITypes.EncounterMethod, error?: any) => any): Promise<PokeAPITypes.EncounterMethod>;\n    getEncounterMethodByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.EncounterMethod[], error?: any) => any): Promise<PokeAPITypes.EncounterMethod[]>;\n    async getEncounterMethodByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.EncounterMethod, error?: any) => any) & ((result: PokeAPITypes.EncounterMethod[], error?: any) => any)): Promise<PokeAPITypes.EncounterMethod | PokeAPITypes.EncounterMethod[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.EncounterMethod>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-method/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.EncounterMethod>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-method/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getEncounterConditionByName(nameOrId: string | number, callback?: (result: PokeAPITypes.EncounterCondition, error?: any) => any): Promise<PokeAPITypes.EncounterCondition>;\n    getEncounterConditionByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.EncounterCondition[], error?: any) => any): Promise<PokeAPITypes.EncounterCondition[]>;\n    async getEncounterConditionByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.EncounterCondition, error?: any) => any) & ((result: PokeAPITypes.EncounterCondition[], error?: any) => any)): Promise<PokeAPITypes.EncounterCondition | PokeAPITypes.EncounterCondition[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.EncounterCondition>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.EncounterCondition>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getEncounterConditionValueByName(nameOrId: string | number, callback?: (result: PokeAPITypes.EncounterConditionValue, error?: any) => any): Promise<PokeAPITypes.EncounterConditionValue>;\n    getEncounterConditionValueByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.EncounterConditionValue[], error?: any) => any): Promise<PokeAPITypes.EncounterConditionValue[]>;\n    async getEncounterConditionValueByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.EncounterConditionValue, error?: any) => any) & ((result: PokeAPITypes.EncounterConditionValue[], error?: any) => any)): Promise<PokeAPITypes.EncounterConditionValue | PokeAPITypes.EncounterConditionValue[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.EncounterConditionValue>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition-value/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.EncounterConditionValue>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition-value/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getEvolutionChainById(id: number, callback?: (result: PokeAPITypes.EvolutionChain, error?: any) => any): Promise<PokeAPITypes.EvolutionChain>;\n    getEvolutionChainById(id: number[], callback?: (result: PokeAPITypes.EvolutionChain[], error?: any) => any): Promise<PokeAPITypes.EvolutionChain[]>;\n    async getEvolutionChainById(id: number | number[], callback?: ((result: PokeAPITypes.EvolutionChain, error?: any) => any) & ((result: PokeAPITypes.EvolutionChain[], error?: any) => any)): Promise<PokeAPITypes.EvolutionChain | PokeAPITypes.EvolutionChain[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n              throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n            throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n              return getJSON<PokeAPITypes.EvolutionChain>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-chain/${id}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids: number | number[]) => {\n              const queryRes = await getJSON<PokeAPITypes.EvolutionChain>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-chain/${ids}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getEvolutionTriggerByName(nameOrId: string | number, callback?: (result: PokeAPITypes.EvolutionTrigger, error?: any) => any): Promise<PokeAPITypes.EvolutionTrigger>;\n    getEvolutionTriggerByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.EvolutionTrigger[], error?: any) => any): Promise<PokeAPITypes.EvolutionTrigger[]>;\n    async getEvolutionTriggerByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.EvolutionTrigger, error?: any) => any) & ((result: PokeAPITypes.EvolutionTrigger[], error?: any) => any)): Promise<PokeAPITypes.EvolutionTrigger | PokeAPITypes.EvolutionTrigger[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.EvolutionTrigger>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-trigger/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.EvolutionTrigger>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-trigger/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getGenerationByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Generation, error?: any) => any): Promise<PokeAPITypes.Generation>;\n    getGenerationByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Generation[], error?: any) => any): Promise<PokeAPITypes.Generation[]>;\n    async getGenerationByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Generation, error?: any) => any) & ((result: PokeAPITypes.Generation[], error?: any) => any)): Promise<PokeAPITypes.Generation | PokeAPITypes.Generation[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Generation>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}generation/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Generation>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}generation/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokedexByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Pokedex, error?: any) => any): Promise<PokeAPITypes.Pokedex>;\n    getPokedexByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Pokedex[], error?: any) => any): Promise<PokeAPITypes.Pokedex[]>;\n    async getPokedexByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Pokedex, error?: any) => any) & ((result: PokeAPITypes.Pokedex[], error?: any) => any)): Promise<PokeAPITypes.Pokedex | PokeAPITypes.Pokedex[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Pokedex>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Pokedex>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getVersionByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Version, error?: any) => any): Promise<PokeAPITypes.Version>;\n    getVersionByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Version[], error?: any) => any): Promise<PokeAPITypes.Version[]>;\n    async getVersionByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Version, error?: any) => any) & ((result: PokeAPITypes.Version[], error?: any) => any)): Promise<PokeAPITypes.Version | PokeAPITypes.Version[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Version>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Version>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getVersionGroupByName(nameOrId: string | number, callback?: (result: PokeAPITypes.VersionGroup, error?: any) => any): Promise<PokeAPITypes.VersionGroup>;\n    getVersionGroupByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.VersionGroup[], error?: any) => any): Promise<PokeAPITypes.VersionGroup[]>;\n    async getVersionGroupByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.VersionGroup, error?: any) => any) & ((result: PokeAPITypes.VersionGroup[], error?: any) => any)): Promise<PokeAPITypes.VersionGroup | PokeAPITypes.VersionGroup[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.VersionGroup>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version-group/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.VersionGroup>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version-group/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getItemByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Item, error?: any) => any): Promise<PokeAPITypes.Item>;\n    getItemByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Item[], error?: any) => any): Promise<PokeAPITypes.Item[]>;\n    async getItemByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Item, error?: any) => any) & ((result: PokeAPITypes.Item[], error?: any) => any)): Promise<PokeAPITypes.Item | PokeAPITypes.Item[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Item>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Item>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getItemAttributeByName(nameOrId: string | number, callback?: (result: PokeAPITypes.ItemAttribute, error?: any) => any): Promise<PokeAPITypes.ItemAttribute>;\n    getItemAttributeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.ItemAttribute[], error?: any) => any): Promise<PokeAPITypes.ItemAttribute[]>;\n    async getItemAttributeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.ItemAttribute, error?: any) => any) & ((result: PokeAPITypes.ItemAttribute[], error?: any) => any)): Promise<PokeAPITypes.ItemAttribute | PokeAPITypes.ItemAttribute[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.ItemAttribute>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-attribute/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.ItemAttribute>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-attribute/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getItemCategoryByName(nameOrId: string | number, callback?: (result: PokeAPITypes.ItemCategory, error?: any) => any): Promise<PokeAPITypes.ItemCategory>;\n    getItemCategoryByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.ItemCategory[], error?: any) => any): Promise<PokeAPITypes.ItemCategory[]>;\n    async getItemCategoryByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.ItemCategory, error?: any) => any) & ((result: PokeAPITypes.ItemCategory[], error?: any) => any)): Promise<PokeAPITypes.ItemCategory | PokeAPITypes.ItemCategory[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.ItemCategory>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-category/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.ItemCategory>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-category/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getItemFlingEffectByName(nameOrId: string | number, callback?: (result: PokeAPITypes.ItemFlingEffect, error?: any) => any): Promise<PokeAPITypes.ItemFlingEffect>;\n    getItemFlingEffectByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.ItemFlingEffect[], error?: any) => any): Promise<PokeAPITypes.ItemFlingEffect[]>;\n    async getItemFlingEffectByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.ItemFlingEffect, error?: any) => any) & ((result: PokeAPITypes.ItemFlingEffect[], error?: any) => any)): Promise<PokeAPITypes.ItemFlingEffect | PokeAPITypes.ItemFlingEffect[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.ItemFlingEffect>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-fling-effect/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.ItemFlingEffect>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-fling-effect/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getItemPocketByName(nameOrId: string | number, callback?: (result: PokeAPITypes.ItemPocket, error?: any) => any): Promise<PokeAPITypes.ItemPocket>;\n    getItemPocketByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.ItemPocket[], error?: any) => any): Promise<PokeAPITypes.ItemPocket[]>;\n    async getItemPocketByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.ItemPocket, error?: any) => any) & ((result: PokeAPITypes.ItemPocket[], error?: any) => any)): Promise<PokeAPITypes.ItemPocket | PokeAPITypes.ItemPocket[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.ItemPocket>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-pocket/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.ItemPocket>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-pocket/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMachineById(id: number, callback?: (result: PokeAPITypes.Machine, error?: any) => any): Promise<PokeAPITypes.Machine>;\n    getMachineById(id: number[], callback?: (result: PokeAPITypes.Machine[], error?: any) => any): Promise<PokeAPITypes.Machine[]>;\n    async getMachineById(id: number | number[], callback?: ((result: PokeAPITypes.Machine, error?: any) => any) & ((result: PokeAPITypes.Machine[], error?: any) => any)): Promise<PokeAPITypes.Machine | PokeAPITypes.Machine[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n              throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n            throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n              return getJSON<PokeAPITypes.Machine>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}machine/${id}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids: number | number[]) => {\n              const queryRes = await getJSON<PokeAPITypes.Machine>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}machine/${ids}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Move, error?: any) => any): Promise<PokeAPITypes.Move>;\n    getMoveByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Move[], error?: any) => any): Promise<PokeAPITypes.Move[]>;\n    async getMoveByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Move, error?: any) => any) & ((result: PokeAPITypes.Move[], error?: any) => any)): Promise<PokeAPITypes.Move | PokeAPITypes.Move[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Move>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Move>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveAilmentByName(nameOrId: string | number, callback?: (result: PokeAPITypes.MoveAilment, error?: any) => any): Promise<PokeAPITypes.MoveAilment>;\n    getMoveAilmentByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.MoveAilment[], error?: any) => any): Promise<PokeAPITypes.MoveAilment[]>;\n    async getMoveAilmentByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.MoveAilment, error?: any) => any) & ((result: PokeAPITypes.MoveAilment[], error?: any) => any)): Promise<PokeAPITypes.MoveAilment | PokeAPITypes.MoveAilment[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.MoveAilment>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-ailment/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.MoveAilment>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-ailment/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveBattleStyleByName(nameOrId: string | number, callback?: (result: PokeAPITypes.MoveBattleStyle, error?: any) => any): Promise<PokeAPITypes.MoveBattleStyle>;\n    getMoveBattleStyleByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.MoveBattleStyle[], error?: any) => any): Promise<PokeAPITypes.MoveBattleStyle[]>;\n    async getMoveBattleStyleByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.MoveBattleStyle, error?: any) => any) & ((result: PokeAPITypes.MoveBattleStyle[], error?: any) => any)): Promise<PokeAPITypes.MoveBattleStyle | PokeAPITypes.MoveBattleStyle[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.MoveBattleStyle>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-battle-style/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.MoveBattleStyle>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-battle-style/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveCategoryByName(nameOrId: string | number, callback?: (result: PokeAPITypes.MoveCategory, error?: any) => any): Promise<PokeAPITypes.MoveCategory>;\n    getMoveCategoryByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.MoveCategory[], error?: any) => any): Promise<PokeAPITypes.MoveCategory[]>;\n    async getMoveCategoryByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.MoveCategory, error?: any) => any) & ((result: PokeAPITypes.MoveCategory[], error?: any) => any)): Promise<PokeAPITypes.MoveCategory | PokeAPITypes.MoveCategory[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.MoveCategory>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-category/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.MoveCategory>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-category/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveDamageClassByName(nameOrId: string | number, callback?: (result: PokeAPITypes.MoveDamageClass, error?: any) => any): Promise<PokeAPITypes.MoveDamageClass>;\n    getMoveDamageClassByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.MoveDamageClass[], error?: any) => any): Promise<PokeAPITypes.MoveDamageClass[]>;\n    async getMoveDamageClassByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.MoveDamageClass, error?: any) => any) & ((result: PokeAPITypes.MoveDamageClass[], error?: any) => any)): Promise<PokeAPITypes.MoveDamageClass | PokeAPITypes.MoveDamageClass[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.MoveDamageClass>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-damage-class/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.MoveDamageClass>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-damage-class/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveLearnMethodByName(nameOrId: string | number, callback?: (result: PokeAPITypes.MoveLearnMethod, error?: any) => any): Promise<PokeAPITypes.MoveLearnMethod>;\n    getMoveLearnMethodByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.MoveLearnMethod[], error?: any) => any): Promise<PokeAPITypes.MoveLearnMethod[]>;\n    async getMoveLearnMethodByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.MoveLearnMethod, error?: any) => any) & ((result: PokeAPITypes.MoveLearnMethod[], error?: any) => any)): Promise<PokeAPITypes.MoveLearnMethod | PokeAPITypes.MoveLearnMethod[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.MoveLearnMethod>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-learn-method/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.MoveLearnMethod>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-learn-method/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getMoveTargetByName(nameOrId: string | number, callback?: (result: PokeAPITypes.MoveTarget, error?: any) => any): Promise<PokeAPITypes.MoveTarget>;\n    getMoveTargetByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.MoveTarget[], error?: any) => any): Promise<PokeAPITypes.MoveTarget[]>;\n    async getMoveTargetByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.MoveTarget, error?: any) => any) & ((result: PokeAPITypes.MoveTarget[], error?: any) => any)): Promise<PokeAPITypes.MoveTarget | PokeAPITypes.MoveTarget[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.MoveTarget>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-target/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.MoveTarget>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-target/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getLocationByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Location, error?: any) => any): Promise<PokeAPITypes.Location>;\n    getLocationByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Location[], error?: any) => any): Promise<PokeAPITypes.Location[]>;\n    async getLocationByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Location, error?: any) => any) & ((result: PokeAPITypes.Location[], error?: any) => any)): Promise<PokeAPITypes.Location | PokeAPITypes.Location[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Location>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Location>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getLocationAreaByName(nameOrId: string | number, callback?: (result: PokeAPITypes.LocationArea, error?: any) => any): Promise<PokeAPITypes.LocationArea>;\n    getLocationAreaByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.LocationArea[], error?: any) => any): Promise<PokeAPITypes.LocationArea[]>;\n    async getLocationAreaByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.LocationArea, error?: any) => any) & ((result: PokeAPITypes.LocationArea[], error?: any) => any)): Promise<PokeAPITypes.LocationArea | PokeAPITypes.LocationArea[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.LocationArea>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location-area/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.LocationArea>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location-area/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPalParkAreaByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PalParkArea, error?: any) => any): Promise<PokeAPITypes.PalParkArea>;\n    getPalParkAreaByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PalParkArea[], error?: any) => any): Promise<PokeAPITypes.PalParkArea[]>;\n    async getPalParkAreaByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PalParkArea, error?: any) => any) & ((result: PokeAPITypes.PalParkArea[], error?: any) => any)): Promise<PokeAPITypes.PalParkArea | PokeAPITypes.PalParkArea[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PalParkArea>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pal-park-area/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PalParkArea>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pal-park-area/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getRegionByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Region, error?: any) => any): Promise<PokeAPITypes.Region>;\n    getRegionByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Region[], error?: any) => any): Promise<PokeAPITypes.Region[]>;\n    async getRegionByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Region, error?: any) => any) & ((result: PokeAPITypes.Region[], error?: any) => any)): Promise<PokeAPITypes.Region | PokeAPITypes.Region[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Region>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}region/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Region>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}region/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getAbilityByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Ability, error?: any) => any): Promise<PokeAPITypes.Ability>;\n    getAbilityByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Ability[], error?: any) => any): Promise<PokeAPITypes.Ability[]>;\n    async getAbilityByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Ability, error?: any) => any) & ((result: PokeAPITypes.Ability[], error?: any) => any)): Promise<PokeAPITypes.Ability | PokeAPITypes.Ability[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Ability>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}ability/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Ability>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}ability/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getCharacteristicById(id: number, callback?: (result: PokeAPITypes.Characteristic, error?: any) => any): Promise<PokeAPITypes.Characteristic>;\n    getCharacteristicById(id: number[], callback?: (result: PokeAPITypes.Characteristic[], error?: any) => any): Promise<PokeAPITypes.Characteristic[]>;\n    async getCharacteristicById(id: number | number[], callback?: ((result: PokeAPITypes.Characteristic, error?: any) => any) & ((result: PokeAPITypes.Characteristic[], error?: any) => any)): Promise<PokeAPITypes.Characteristic | PokeAPITypes.Characteristic[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!id) {\n              throw new Error('Param \"id\" is required (Must be a number or array of numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(id) && typeof id !== 'number' && typeof id !== 'string') {\n            throw new Error('Param \"id\" must be a number or array of numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof id === 'number' || typeof id === 'string') {\n              return getJSON<PokeAPITypes.Characteristic>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}characteristic/${id}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (ids: number | number[]) => {\n              const queryRes = await getJSON<PokeAPITypes.Characteristic>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}characteristic/${ids}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(id, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getEggGroupByName(nameOrId: string | number, callback?: (result: PokeAPITypes.EggGroup, error?: any) => any): Promise<PokeAPITypes.EggGroup>;\n    getEggGroupByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.EggGroup[], error?: any) => any): Promise<PokeAPITypes.EggGroup[]>;\n    async getEggGroupByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.EggGroup, error?: any) => any) & ((result: PokeAPITypes.EggGroup[], error?: any) => any)): Promise<PokeAPITypes.EggGroup | PokeAPITypes.EggGroup[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.EggGroup>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}egg-group/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.EggGroup>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}egg-group/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getGenderByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Gender, error?: any) => any): Promise<PokeAPITypes.Gender>;\n    getGenderByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Gender[], error?: any) => any): Promise<PokeAPITypes.Gender[]>;\n    async getGenderByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Gender, error?: any) => any) & ((result: PokeAPITypes.Gender[], error?: any) => any)): Promise<PokeAPITypes.Gender | PokeAPITypes.Gender[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Gender>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}gender/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Gender>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}gender/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getGrowthRateByName(nameOrId: string | number, callback?: (result: PokeAPITypes.GrowthRate, error?: any) => any): Promise<PokeAPITypes.GrowthRate>;\n    getGrowthRateByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.GrowthRate[], error?: any) => any): Promise<PokeAPITypes.GrowthRate[]>;\n    async getGrowthRateByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.GrowthRate, error?: any) => any) & ((result: PokeAPITypes.GrowthRate[], error?: any) => any)): Promise<PokeAPITypes.GrowthRate | PokeAPITypes.GrowthRate[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.GrowthRate>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}growth-rate/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.GrowthRate>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}growth-rate/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getNatureByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Nature, error?: any) => any): Promise<PokeAPITypes.Nature>;\n    getNatureByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Nature[], error?: any) => any): Promise<PokeAPITypes.Nature[]>;\n    async getNatureByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Nature, error?: any) => any) & ((result: PokeAPITypes.Nature[], error?: any) => any)): Promise<PokeAPITypes.Nature | PokeAPITypes.Nature[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Nature>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}nature/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Nature>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}nature/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokeathlonStatByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PokeathlonStat, error?: any) => any): Promise<PokeAPITypes.PokeathlonStat>;\n    getPokeathlonStatByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PokeathlonStat[], error?: any) => any): Promise<PokeAPITypes.PokeathlonStat[]>;\n    async getPokeathlonStatByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PokeathlonStat, error?: any) => any) & ((result: PokeAPITypes.PokeathlonStat[], error?: any) => any)): Promise<PokeAPITypes.PokeathlonStat | PokeAPITypes.PokeathlonStat[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PokeathlonStat>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokeathlon-stat/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PokeathlonStat>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokeathlon-stat/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokemonByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Pokemon, error?: any) => any): Promise<PokeAPITypes.Pokemon>;\n    getPokemonByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Pokemon[], error?: any) => any): Promise<PokeAPITypes.Pokemon[]>;\n    async getPokemonByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Pokemon, error?: any) => any) & ((result: PokeAPITypes.Pokemon[], error?: any) => any)): Promise<PokeAPITypes.Pokemon | PokeAPITypes.Pokemon[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Pokemon>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Pokemon>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokemonColorByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PokemonColor, error?: any) => any): Promise<PokeAPITypes.PokemonColor>;\n    getPokemonColorByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PokemonColor[], error?: any) => any): Promise<PokeAPITypes.PokemonColor[]>;\n    async getPokemonColorByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PokemonColor, error?: any) => any) & ((result: PokeAPITypes.PokemonColor[], error?: any) => any)): Promise<PokeAPITypes.PokemonColor | PokeAPITypes.PokemonColor[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PokemonColor>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-color/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PokemonColor>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-color/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokemonFormByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PokemonForm, error?: any) => any): Promise<PokeAPITypes.PokemonForm>;\n    getPokemonFormByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PokemonForm[], error?: any) => any): Promise<PokeAPITypes.PokemonForm[]>;\n    async getPokemonFormByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PokemonForm, error?: any) => any) & ((result: PokeAPITypes.PokemonForm[], error?: any) => any)): Promise<PokeAPITypes.PokemonForm | PokeAPITypes.PokemonForm[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PokemonForm>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-form/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PokemonForm>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-form/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokemonHabitatByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PokemonHabitat, error?: any) => any): Promise<PokeAPITypes.PokemonHabitat>;\n    getPokemonHabitatByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PokemonHabitat[], error?: any) => any): Promise<PokeAPITypes.PokemonHabitat[]>;\n    async getPokemonHabitatByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PokemonHabitat, error?: any) => any) & ((result: PokeAPITypes.PokemonHabitat[], error?: any) => any)): Promise<PokeAPITypes.PokemonHabitat | PokeAPITypes.PokemonHabitat[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PokemonHabitat>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-habitat/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PokemonHabitat>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-habitat/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokemonShapeByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PokemonShape, error?: any) => any): Promise<PokeAPITypes.PokemonShape>;\n    getPokemonShapeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PokemonShape[], error?: any) => any): Promise<PokeAPITypes.PokemonShape[]>;\n    async getPokemonShapeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PokemonShape, error?: any) => any) & ((result: PokeAPITypes.PokemonShape[], error?: any) => any)): Promise<PokeAPITypes.PokemonShape | PokeAPITypes.PokemonShape[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PokemonShape>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-shape/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PokemonShape>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-shape/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getPokemonSpeciesByName(nameOrId: string | number, callback?: (result: PokeAPITypes.PokemonSpecies, error?: any) => any): Promise<PokeAPITypes.PokemonSpecies>;\n    getPokemonSpeciesByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.PokemonSpecies[], error?: any) => any): Promise<PokeAPITypes.PokemonSpecies[]>;\n    async getPokemonSpeciesByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.PokemonSpecies, error?: any) => any) & ((result: PokeAPITypes.PokemonSpecies[], error?: any) => any)): Promise<PokeAPITypes.PokemonSpecies | PokeAPITypes.PokemonSpecies[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.PokemonSpecies>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-species/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.PokemonSpecies>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-species/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getStatByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Stat, error?: any) => any): Promise<PokeAPITypes.Stat>;\n    getStatByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Stat[], error?: any) => any): Promise<PokeAPITypes.Stat[]>;\n    async getStatByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Stat, error?: any) => any) & ((result: PokeAPITypes.Stat[], error?: any) => any)): Promise<PokeAPITypes.Stat | PokeAPITypes.Stat[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Stat>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}stat/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Stat>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}stat/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getTypeByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Type, error?: any) => any): Promise<PokeAPITypes.Type>;\n    getTypeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Type[], error?: any) => any): Promise<PokeAPITypes.Type[]>;\n    async getTypeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Type, error?: any) => any) & ((result: PokeAPITypes.Type[], error?: any) => any)): Promise<PokeAPITypes.Type | PokeAPITypes.Type[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Type>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}type/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Type>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}type/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    getLanguageByName(nameOrId: string | number, callback?: (result: PokeAPITypes.Language, error?: any) => any): Promise<PokeAPITypes.Language>;\n    getLanguageByName(nameOrId: Array<string | number>, callback?: (result: PokeAPITypes.Language[], error?: any) => any): Promise<PokeAPITypes.Language[]>;\n    async getLanguageByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPITypes.Language, error?: any) => any) & ((result: PokeAPITypes.Language[], error?: any) => any)): Promise<PokeAPITypes.Language | PokeAPITypes.Language[]> {\n        try {\n            // Fail if the param is not supplied\n            if (!nameOrId) {\n              throw new Error('Param \"nameOrId\" is required (Must be a string, array of strings or array of string and/or numbers )');\n            }\n\n            // Fail if the input types aren't accepted\n            if (!Array.isArray(nameOrId) && typeof nameOrId !== 'number' && typeof nameOrId !== 'string') {\n            throw new Error('Param \"nameOrId\" must be a string, array of strings or array of string and/or numbers');\n            }\n\n            // If the user has submitted a Name or an ID, return the JSON promise\n            if (typeof nameOrId === 'number' || typeof nameOrId === 'string') {\n              return getJSON<PokeAPITypes.Language>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}language/${nameOrId}/`, callback);\n            }\n\n            // If the user has submitted an Array return a new promise which will resolve when all getJSON calls are ended\n            const mapper = async (nameOrIds: string | number | Array<string | number>) => {\n              const queryRes = await getJSON<PokeAPITypes.Language>(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}language/${nameOrIds}/`);\n              return queryRes;\n            };\n\n            // Fetch data asynchronously to be faster\n            const mappedResults = await pMap(nameOrId, mapper, { concurrency: 4 });\n\n            // Invoke the callback if we have one\n            if (callback) {\n              callback(mappedResults);\n            }\n\n            return mappedResults;\n        } catch (error) {\n            handleError(error, callback);\n        }\n    }\n\n    async getBerriesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getBerriesFirmnessList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    /** @deprecated will be removed on a future version. Use {@link getBerriesFirmnessList} instead */\n    async getBerriesFirmnesssList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-firmness/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getBerriesFlavorsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}berry-flavor/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getContestTypesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-type/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getContestEffectsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.APIResourceList, error?: any) => any): Promise<PokeAPITypes.APIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}contest-effect/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getSuperContestEffectsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.APIResourceList, error?: any) => any): Promise<PokeAPITypes.APIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}super-contest-effect/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEncounterMethodsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-method/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEncounterConditionsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEncounterConditionValuesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}encounter-condition-value/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEvolutionChainsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.APIResourceList, error?: any) => any): Promise<PokeAPITypes.APIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-chain/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEvolutionTriggersList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}evolution-trigger/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getGenerationsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}generation/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    /** @deprecated will be removed on a future version. Use {@link getPokedexList} instead */\n    async getPokedexsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokedexList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokedex/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getVersionsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getVersionGroupsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}version-group/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getItemsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getItemAttributesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-attribute/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getItemCategoriesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-category/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getItemFlingEffectsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-fling-effect/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getItemPocketsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}item-pocket/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMachinesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.APIResourceList, error?: any) => any): Promise<PokeAPITypes.APIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}machine/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMovesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMoveAilmentsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-ailment/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMoveBattleStylesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-battle-style/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMoveCategoriesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-category/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMoveDamageClassesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-damage-class/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMoveLearnMethodsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-learn-method/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getMoveTargetsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}move-target/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getLocationsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getLocationAreasList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}location-area/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPalParkAreasList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pal-park-area/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getRegionsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}region/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getAbilitiesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}ability/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getCharacteristicsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.APIResourceList, error?: any) => any): Promise<PokeAPITypes.APIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}characteristic/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEggGroupsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}egg-group/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getGendersList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}gender/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getGrowthRatesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}growth-rate/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getNaturesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}nature/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokeathlonStatsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokeathlon-stat/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokemonsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokemonColorsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-color/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokemonFormsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-form/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokemonHabitatsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-habitat/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokemonShapesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-shape/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getPokemonSpeciesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}pokemon-species/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getStatsList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}stat/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getTypesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}type/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getLanguagesList(interval?: ListEndpointOptions, callback?: (result: PokeAPITypes.NamedAPIResourceList, error?: any) => any): Promise<PokeAPITypes.NamedAPIResourceList> {\n        try {\n            let { limit, offset } = this.options;\n\n            if (interval) {\n              if (interval.hasOwnProperty('limit')) {\n                limit = interval.limit;\n              }\n\n              if (interval.hasOwnProperty('offset')) {\n                offset = interval.offset;\n              }\n            }\n\n            return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}language/?limit=${limit}&offset=${offset}`, callback);\n          } catch (error) {\n            handleError(error, callback);\n          }\n    }\n\n    async getEndpointsList(interval?: ListEndpointOptions, callback?: (result: any, error?: any) => any): Promise<PokeAPITypes.EndpointsList> {\n\n        try {\n          let { limit, offset } = this.options;\n\n          if (interval) {\n            if (interval.hasOwnProperty('limit')) {\n              limit = interval.limit;\n            }\n\n            if (interval.hasOwnProperty('offset')) {\n              offset = interval.offset;\n            }\n          }\n\n          return getJSON(this.options, `${this.options.protocol}${this.options.hostName}${this.options.versionPath}?limit=${limit}&offset=${offset}`, callback);\n        } catch (error) {\n          handleError(error, callback);\n        }\n    }\n\n    /** Retrieve the configs used */\n    getConfig() {\n        return this.options;\n    }\n\n    /** Retuns the current number of entries in the cache */\n    getCachedItemsCount() {\n        return this.options.cache.stats.keys;\n    }\n\n    /** @deprecated use {@link getCachedItemsCount} */\n    cacheSize() {\n        return this.options.cache.stats.keys;\n    }\n\n    /** Deletes all keys in cache */\n    clearCache() {\n        this.options.cache.flushAll();\n    }\n}\n"
  },
  {
    "path": "src/interfaces/ListEndpointOptions.d.ts",
    "content": "interface ListEndpointOptions {\n  /** The offset to be used in the request */\n  offset?: number,\n  /** The limit to be used in the request */\n  limit?: number,\n  /** The limit of the cache in milliseconds */\n  cacheLimit?: number,\n}\n\nexport default ListEndpointOptions;\n"
  },
  {
    "path": "src/interfaces/PokeAPIOptions.ts",
    "content": "import NodeCache from 'node-cache';\n\nclass PokeAPIOptions {\n  /** The protocol to be used\n   * @default 'https'\n   */\n  protocol?: 'https' | 'http';\n\n  /** The hostname of the PokeAPI instance\n   * @default 'pokeapi.co'\n  */\n  hostName?: string;\n\n  /** The version path of the API\n   * @default '/api/v2/'\n  */\n  versionPath?: string;\n\n  /** The offset to be used in list requests\n   * @default 0\n  */\n  offset?: number;\n\n  /** The limit to be used in list requests\n   * @default 100000\n  */\n  limit?: number;\n\n  /** The timeout of a response in milliseconds\n   * @default 10 * 1000 // (10 seconds)\n   */\n  timeout?: number;\n\n  /** The limit of the cache in milliseconds\n   * @default 1000000 * 1000 // (11 days)\n  */\n  cacheLimit?: number;\n\n  /** The version path of the API (e.g. '/api/v2/') */\n  cache?: NodeCache;\n\n   \n  constructor(config: PokeAPIOptions = {}, cache: NodeCache) {\n    this.protocol = 'https';\n    this.hostName = '://pokeapi.co';\n    this.versionPath = '/api/v2/';\n    this.offset = 0;\n    this.limit = 100000;\n    this.timeout = 10 * 1000; // 10 seconds\n    this.cacheLimit = 1000000 * 1000; // 11 days\n    this.cache = cache;\n\n    if (config.protocol) {\n      this.protocol = config.protocol;\n    }\n    if (config.hostName) {\n      this.hostName = `://${config.hostName}`;\n    }\n    if (config.versionPath) {\n      this.versionPath = config.versionPath;\n    }\n    if (config.offset) {\n      this.offset = config.offset - 1;\n    }\n    if (config.limit) {\n      this.limit = config.limit;\n    }\n    if (config.timeout) {\n      this.timeout = (config as PokeAPIOptions).timeout;\n    }\n    if (config.cacheLimit) {\n      this.cacheLimit = (config as PokeAPIOptions).cacheLimit;\n    }\n  }\n}\n\nexport default PokeAPIOptions;\n"
  },
  {
    "path": "src/utils/Endpoints.ts",
    "content": "const endpoints: string[][] = [\n  ['getBerryByName', 'berry'],\n  ['getBerryFirmnessByName', 'berry-firmness'],\n  ['getBerryFlavorByName', 'berry-flavor'],\n  ['getContestTypeByName', 'contest-type'],\n  ['getContestEffectById', 'contest-effect'],\n  ['getSuperContestEffectById', 'super-contest-effect'],\n  ['getEncounterMethodByName', 'encounter-method'],\n  ['getEncounterConditionByName', 'encounter-condition'],\n  ['getEncounterConditionValueByName', 'encounter-condition-value'],\n  ['getEvolutionChainById', 'evolution-chain'],\n  ['getEvolutionTriggerByName', 'evolution-trigger'],\n  ['getGenerationByName', 'generation'],\n  ['getPokedexByName', 'pokedex'],\n  ['getVersionByName', 'version'],\n  ['getVersionGroupByName', 'version-group'],\n  ['getItemByName', 'item'],\n  ['getItemAttributeByName', 'item-attribute'],\n  ['getItemCategoryByName', 'item-category'],\n  ['getItemFlingEffectByName', 'item-fling-effect'],\n  ['getItemPocketByName', 'item-pocket'],\n  ['getMachineById', 'machine'],\n  ['getMoveByName', 'move'],\n  ['getMoveAilmentByName', 'move-ailment'],\n  ['getMoveBattleStyleByName', 'move-battle-style'],\n  ['getMoveCategoryByName', 'move-category'],\n  ['getMoveDamageClassByName', 'move-damage-class'],\n  ['getMoveLearnMethodByName', 'move-learn-method'],\n  ['getMoveTargetByName', 'move-target'],\n  ['getLocationByName', 'location'],\n  ['getLocationAreaByName', 'location-area'],\n  ['getPalParkAreaByName', 'pal-park-area'],\n  ['getRegionByName', 'region'],\n  ['getAbilityByName', 'ability'],\n  ['getCharacteristicById', 'characteristic'],\n  ['getEggGroupByName', 'egg-group'],\n  ['getGenderByName', 'gender'],\n  ['getGrowthRateByName', 'growth-rate'],\n  ['getNatureByName', 'nature'],\n  ['getPokeathlonStatByName', 'pokeathlon-stat'],\n  ['getPokemonByName', 'pokemon'],\n  ['getPokemonColorByName', 'pokemon-color'],\n  ['getPokemonFormByName', 'pokemon-form'],\n  ['getPokemonHabitatByName', 'pokemon-habitat'],\n  ['getPokemonShapeByName', 'pokemon-shape'],\n  ['getPokemonSpeciesByName', 'pokemon-species'],\n  ['getStatByName', 'stat'],\n  ['getTypeByName', 'type'],\n  ['getLanguageByName', 'language'],\n];\n\nexport default endpoints;\n"
  },
  {
    "path": "src/utils/ErrorHandler.ts",
    "content": " \n \nfunction handleError(error: any, callback?: (result: any, error?: boolean | any) => any) {\n  if (callback) {\n    callback('Pokedex-promise-v2 error', error);\n  } else {\n    throw error;\n  }\n}\n\nexport default handleError;\n"
  },
  {
    "path": "src/utils/Getter.ts",
    "content": "import axios, { AxiosResponse } from 'axios';\n\nimport handleError from './ErrorHandler.js';\nimport PokeAPIOptions from '../interfaces/PokeAPIOptions.js';\n\nasync function getJSON<T>(\n  values: PokeAPIOptions,\n  url: string,\n   \n  callback?: (result: any, error?: any) => any,\n): Promise<T> {\n  const options = {\n    baseURL: `${values.protocol}${values.hostName}/`,\n    timeout: values.timeout,\n  };\n\n  try {\n    // Retrieve possible content from memory-cache\n    const cachedResult = values.cache.get<T>(url);\n\n    // If we have in cache\n    if (callback && cachedResult) {\n      // Call callback without errors\n      callback(cachedResult);\n    }\n\n    // Return the cache\n    if (cachedResult) {\n      return cachedResult;\n    }\n\n    // If we don't have in cache\n    // get the data from the API\n    const response: AxiosResponse<T, any> = await axios.get<T>(url, options);\n\n    // If there is an error on the request\n    if (response.status !== 200) {\n      throw response;\n    }\n\n    // If everything was good\n    // set the data\n    const responseData = response.data;\n\n    // Cache the object in memory-cache\n    // only if cacheLimit > 0\n    if (values.cacheLimit > 0) {\n      values.cache.set<T>(url, responseData, values.cacheLimit);\n    }\n\n    // If a callback is present\n    if (callback) {\n      // Call it, without errors\n      callback(responseData);\n    }\n\n    return responseData;\n  } catch (error) {\n    handleError(error, callback);\n  }\n\n  // If we return nothing and the error handler fails\n  // reject the promise\n  return Promise.reject();\n}\n\nexport default getJSON;\n"
  },
  {
    "path": "src/utils/RootEndpoints.ts",
    "content": "const rootEndpoints = [\n  ['getEndpointsList', ''],\n  ['getBerriesList', 'berry/'],\n  ['getBerriesFirmnessList', 'berry-firmness/'],\n  ['getBerriesFirmnesssList', 'berry-firmness/', '@deprecated will be removed on a future version. Use {@link getBerriesFirmnessList} instead'],\n  ['getBerriesFlavorsList', 'berry-flavor/'],\n  ['getContestTypesList', 'contest-type/'],\n  ['getContestEffectsList', 'contest-effect/'],\n  ['getSuperContestEffectsList', 'super-contest-effect/'],\n  ['getEncounterMethodsList', 'encounter-method/'],\n  ['getEncounterConditionsList', 'encounter-condition/'],\n  ['getEncounterConditionValuesList', 'encounter-condition-value/'],\n  ['getEvolutionChainsList', 'evolution-chain/'],\n  ['getEvolutionTriggersList', 'evolution-trigger/'],\n  ['getGenerationsList', 'generation/'],\n  ['getPokedexsList', 'pokedex/', '@deprecated will be removed on a future version. Use {@link getPokedexList} instead'],\n  ['getPokedexList', 'pokedex/'],\n  ['getVersionsList', 'version/'],\n  ['getVersionGroupsList', 'version-group/'],\n  ['getItemsList', 'item/'],\n  ['getItemAttributesList', 'item-attribute/'],\n  ['getItemCategoriesList', 'item-category/'],\n  ['getItemFlingEffectsList', 'item-fling-effect/'],\n  ['getItemPocketsList', 'item-pocket/'],\n  ['getMachinesList', 'machine/'],\n  ['getMovesList', 'move/'],\n  ['getMoveAilmentsList', 'move-ailment/'],\n  ['getMoveBattleStylesList', 'move-battle-style/'],\n  ['getMoveCategoriesList', 'move-category/'],\n  ['getMoveDamageClassesList', 'move-damage-class/'],\n  ['getMoveLearnMethodsList', 'move-learn-method/'],\n  ['getMoveTargetsList', 'move-target/'],\n  ['getLocationsList', 'location/'],\n  ['getLocationAreasList', 'location-area/'],\n  ['getPalParkAreasList', 'pal-park-area/'],\n  ['getRegionsList', 'region/'],\n  ['getAbilitiesList', 'ability/'],\n  ['getCharacteristicsList', 'characteristic/'],\n  ['getEggGroupsList', 'egg-group/'],\n  ['getGendersList', 'gender/'],\n  ['getGrowthRatesList', 'growth-rate/'],\n  ['getNaturesList', 'nature/'],\n  ['getPokeathlonStatsList', 'pokeathlon-stat/'],\n  ['getPokemonsList', 'pokemon/'],\n  ['getPokemonColorsList', 'pokemon-color/'],\n  ['getPokemonFormsList', 'pokemon-form/'],\n  ['getPokemonHabitatsList', 'pokemon-habitat/'],\n  ['getPokemonShapesList', 'pokemon-shape/'],\n  ['getPokemonSpeciesList', 'pokemon-species/'],\n  ['getStatsList', 'stat/'],\n  ['getTypesList', 'type/'],\n  ['getLanguagesList', 'language/'],\n];\n\nexport default rootEndpoints;\n"
  },
  {
    "path": "test/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"import/no-unresolved\": \"off\",\n    \"no-undef\": \"off\",\n    \"func-names\": \"off\",\n    \"no-console\": \"off\"\n  }\n}"
  },
  {
    "path": "test/Async.spec.ts",
    "content": "import assert from 'assert';\n\nimport Pokedex from '../src/index.js';\n\nconst P = new Pokedex({\n  protocol: 'https',\n  hostName: 'pokeapi.co',\n  versionPath: '/api/v2/',\n});\n\n(async () => {\n  try {\n    const berry = await P.getBerryByName(1);\n    assert.equal(berry.name, 'cheri');\n  } catch (error) {\n    console.log(error);\n  }\n})();\n"
  },
  {
    "path": "test/Base.spec.ts",
    "content": "import chai from 'chai';\nimport chaiThings from 'chai-things';\nimport chaiAsPromised from 'chai-as-promised';\nimport Pokedex from '../src/index.js';\n\n// order matters: github.com/chaijs/chai-things/issues/4#issuecomment-87801365\nchai.use(chaiThings);\nchai.use(chaiAsPromised);\n\ndescribe('Create Pokedex Instance', function () {\n  const P = new Pokedex({\n    protocol: 'https',\n    hostName: 'pokeapi.co',\n    versionPath: '/api/v2/',\n  });\n  this.timeout(10000);\n\n  describe('P', () => {\n    it('should be an object', () => chai.expect(P).to.be.an('object'));\n    it('should have getPokemonByName function', () => chai.expect(P).to.have.property('getPokemonByName'));\n    it('should have getPokemonsList function', () => chai.expect(P).to.have.property('getPokemonsList'));\n  });\n});\n"
  },
  {
    "path": "test/ClearCache.spec.ts",
    "content": "import assert from 'assert';\n\nimport Pokedex from '../src/index.js';\n\nconst P = new Pokedex();\n\n(async () => {\n  try {\n    let { name } = await P.getPokemonByName('eevee');\n    assert.strictEqual(name, 'eevee');\n\n    assert.strictEqual(P.cacheSize(), 1);\n\n    P.clearCache();\n\n    assert.strictEqual(P.cacheSize(), 0);\n\n    name = (await P.getPokemonByName('eevee')).name;\n    assert.strictEqual(name, 'eevee');\n\n    assert.strictEqual(P.cacheSize(), 1);\n  } catch (error) {\n    throw new Error(error);\n  }\n})();\n"
  },
  {
    "path": "test/CommonCalls.spec.ts",
    "content": "import chai from 'chai';\nimport chaiThings from 'chai-things';\nimport chaiAsPromised from 'chai-as-promised';\nimport Pokedex from '../src/index.js';\n\n// order matters: github.com/chaijs/chai-things/issues/4#issuecomment-87801365\nchai.use(chaiThings);\nchai.use(chaiAsPromised);\n\ndescribe('Common Calls', function () {\n  let promise;\n  const id = 2;\n  const P = new Pokedex({\n    protocol: 'https',\n    hostName: 'pokeapi.co',\n    versionPath: '/api/v2/',\n  });\n  this.timeout(10000);\n\n  describe('.getBerryByName(Array: string)', () => {\n    before(() => {\n      promise = P.getBerryByName(['cheri', 'chesto', 'pecha']);\n    });\n    it('should succeed', () => promise);\n    it('should have length 3', () => chai.expect(promise).to.eventually.have.length(3));\n    // @ts-ignore\n    it('berries should have property growth_time', () => chai.expect(promise).to.eventually.all.have.property('growth_time'));\n  });\n\n  describe('.getBerryByName(Array: int)', () => {\n    before(() => {\n      promise = P.getBerryByName([1, 3, 5]);\n    });\n    it('should succeed', () => promise);\n    it('should have length 3', () => chai.expect(promise).to.eventually.have.length(3));\n    // @ts-ignore\n    it('berries should have property growth_time', () => chai.expect(promise).to.eventually.all.have.property('growth_time'));\n  });\n\n  describe('.getPokemonByName(Array: int)', () => {\n    before(() => {\n      promise = P.getPokemonByName([15, 35, 433, 444]);\n    });\n    it('should succeed', () => promise);\n    it('should have length 4', () => chai.expect(promise).to.eventually.have.length(4));\n    // @ts-ignore\n    it('pokemons should have property height', () => chai.expect(promise).to.eventually.all.have.property('height'));\n  });\n\n  describe('.getBerryByName(Id: int)', () => {\n    before(() => {\n      promise = P.getBerryByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getBerryByName(Id: int) cached', () => {\n    before(() => {\n      promise = P.getBerryByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getBerryFirmnessByName(Id: int)', () => {\n    before(() => {\n      promise = P.getBerryFirmnessByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getBerryFlavorByName(Id: int)', () => {\n    before(() => {\n      promise = P.getBerryFlavorByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getContestTypeByName(Id: int)', () => {\n    before(() => {\n      promise = P.getContestTypeByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getContestEffectById(Id: int)', () => {\n    before(() => {\n      promise = P.getContestEffectById(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property id', () => chai.expect(promise).to.eventually.have.property('id'));\n  });\n\n  describe('.getSuperContestEffectById(Id: int)', () => {\n    before(() => {\n      promise = P.getSuperContestEffectById(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property id', () => chai.expect(promise).to.eventually.have.property('id'));\n  });\n\n  describe('.getEncounterMethodByName(Id: int)', () => {\n    before(() => {\n      promise = P.getEncounterMethodByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getEncounterConditionByName(Id: int)', () => {\n    before(() => {\n      promise = P.getEncounterConditionByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getEncounterConditionValueByName(Id: int)', () => {\n    before(() => {\n      promise = P.getEncounterConditionValueByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getEvolutionchaiById(Id: int)', () => {\n    before(() => {\n      promise = P.getEvolutionChainById(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('id'));\n  });\n\n  describe('.getEvolutionTriggerByName(Id: int)', () => {\n    before(() => {\n      promise = P.getEvolutionTriggerByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getGenerationByName(Id: int)', () => {\n    before(() => {\n      promise = P.getGenerationByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokedexByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokedexByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getVersionByName(Id: int)', () => {\n    before(() => {\n      promise = P.getVersionByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getVersionGroupByName(Id: int)', () => {\n    before(() => {\n      promise = P.getVersionGroupByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getItemByName(Id: int)', () => {\n    before(() => {\n      promise = P.getItemByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getItemAttributeByName(Id: int)', () => {\n    before(() => {\n      promise = P.getItemAttributeByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getItemCategoryByName(Id: int)', () => {\n    before(() => {\n      promise = P.getItemCategoryByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getItemFlingEffectByName(Id: int)', () => {\n    before(() => {\n      promise = P.getItemFlingEffectByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getItemPocketByName(Id: int)', () => {\n    before(() => {\n      promise = P.getItemPocketByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getMachineById(Id: int)', () => {\n    before(() => {\n      promise = P.getMachineById(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property id', () => chai.expect(promise).to.eventually.have.property('id'));\n  });\n\n  describe('.getMoveByName(Id: int)', () => {\n    before(() => {\n      promise = P.getMoveByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getMoveAilmentByName(Id: int)', () => {\n    before(() => {\n      promise = P.getMoveAilmentByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getMoveBattleStyleByName(Id: int)', () => {\n    before(() => {\n      promise = P.getMoveBattleStyleByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getMoveCategoryByName(Id: int)', () => {\n    before(() => {\n      promise = P.getMoveCategoryByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getMoveDamageClassByName(Id: int)', () => {\n    before(() => {\n      promise = P.getMoveDamageClassByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getMoveTargetByName(Id: int)', () => {\n    before(() => {\n      promise = P.getMoveTargetByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getLocationByName(Id: int)', () => {\n    before(() => {\n      promise = P.getLocationByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getLocationAreaByName(Id: int)', () => {\n    before(() => {\n      promise = P.getLocationAreaByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPalParkAreaByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPalParkAreaByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getRegionByName(Id: int)', () => {\n    before(() => {\n      promise = P.getRegionByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getAbilityByName(Id: int)', () => {\n    before(() => {\n      promise = P.getAbilityByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getCharacteristicById(Id: int)', () => {\n    before(() => {\n      promise = P.getCharacteristicById(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('id'));\n  });\n\n  describe('.getEggGroupByName(Id: int)', () => {\n    before(() => {\n      promise = P.getEggGroupByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getGenderByName(Id: int)', () => {\n    before(() => {\n      promise = P.getGenderByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getGrowthRateByName(Id: int)', () => {\n    before(() => {\n      promise = P.getGrowthRateByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getNatureByName(Id: int)', () => {\n    before(() => {\n      promise = P.getNatureByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokeathlonStatByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokeathlonStatByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokemonByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokemonByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokemonColorByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokemonColorByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokemonFormByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokemonFormByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokemonHabitatByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokemonHabitatByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokemonShapeByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokemonShapeByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getPokemonSpeciesByName(Id: int)', () => {\n    before(() => {\n      promise = P.getPokemonSpeciesByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getStatByName(Id: int)', () => {\n    before(() => {\n      promise = P.getStatByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getTypeByName(Id: int)', () => {\n    before(() => {\n      promise = P.getTypeByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getLanguageByName(Id: int)', () => {\n    before(() => {\n      promise = P.getLanguageByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getBerryByName(Name: string)', () => {\n    before(() => {\n      promise = P.getBerryByName('sfgfsgsfggsfg');\n    });\n    it('should fail', () => chai.expect(promise).rejected);\n  });\n});\n"
  },
  {
    "path": "test/CustomUncommonCalls.spec.ts",
    "content": "import chai from 'chai';\nimport chaiThings from 'chai-things';\nimport chaiAsPromised from 'chai-as-promised';\nimport Pokedex from '../src/index.js';\n\n// order matters: github.com/chaijs/chai-things/issues/4#issuecomment-87801365\nchai.use(chaiThings);\nchai.use(chaiAsPromised);\n\ndescribe('Custom Uncommon Calls', function () {\n  let promise;\n  const id = 2;\n  const P = new Pokedex({\n    protocol: 'https',\n    hostName: 'pokeapi.co',\n    versionPath: '/api/v2/',\n  });\n  this.timeout(10000);\n\n  describe('.getLanguagesList() with callback cached and offset', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getLanguagesList({ offset: 2 }, (data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('should have property count', () => chai.expect(resultAsCallback).to.have.property('count'));\n  });\n\n  describe('.getLanguagesList() with callback, 0 cached and offset', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getLanguagesList({ offset: 2, cacheLimit: 0 }, (data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('should have property count', () => chai.expect(resultAsCallback).to.have.property('count'));\n  });\n\n  describe('.getLanguagesList() with callback, negative cached and offset', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getLanguagesList({ offset: 2, cacheLimit: -1 }, (data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('should have property count', () => chai.expect(resultAsCallback).to.have.property('count'));\n  });\n\n  describe('.getItemCategoryByName(Id: int) secure (with ssl)', () => {\n    before(() => {\n      promise = P.getItemCategoryByName(id);\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.getBerryFirmnessByName(Id: int) with callback', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getBerryFirmnessByName(id, (data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('should have property name', () => chai.expect(resultAsCallback).to.have.property('name'));\n  });\n\n  describe('.getBerryByName(Array: mixed) with callback', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getBerryByName(['cheri', 'chesto', 5], (data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('result in callback should have length 3', () => chai.expect(resultAsCallback).to.have.length(3));\n    // @ts-ignore\n    it('berries should have property max_harvest', () => chai.expect(resultAsCallback).to.all.have.property('max_harvest'));\n  });\n\n  describe('.getBerryByName(Array: mixed) cached', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getBerryByName(['cheri', 'chesto', 5]).then((data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('result in callback should have length 3', () => chai.expect(resultAsCallback).to.have.length(3));\n    // @ts-ignore\n    it('berries should have property soil_dryness', () => chai.expect(resultAsCallback).to.all.have.property('soil_dryness'));\n  });\n\n  describe('.getBerryByName(String: name) invalid with callback', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getBerryByName('asd', (data, error) => {\n        if (error) {\n          resultAsCallback = error;\n        }\n        done();\n      });\n    });\n    it('should fail with an error that has response property', () => chai.expect(resultAsCallback).to.have.property('response'));\n  });\n\n  describe('.getBerryByName(String: name) invalid', () => {\n    it('should fail', () => chai.expect(P.getBerryByName('das')).to.be.rejected);\n    it('should fail with an error that has response property', () => chai.expect(P.getBerryByName('das')).to.be.eventually.rejectedWith(Error).and.have.property('response'));\n  });\n});\n"
  },
  {
    "path": "test/Resource.spec.ts",
    "content": "import chai from 'chai';\nimport chaiThings from 'chai-things';\nimport chaiAsPromised from 'chai-as-promised';\nimport Pokedex from '../src/index.js';\n\n// order matters: github.com/chaijs/chai-things/issues/4#issuecomment-87801365\nchai.use(chaiThings);\nchai.use(chaiAsPromised);\n\ndescribe('getResource', function () {\n  let promise;\n  const P = new Pokedex({\n    protocol: 'https',\n    hostName: 'pokeapi.co',\n    versionPath: '/api/v2/',\n  });\n  this.timeout(10000);\n\n  describe('.resource(Mixed: Array) with callback', () => {\n    let resultAsCallback;\n    before((done) => {\n      promise = P.getResource(['https://pokeapi.co/api/v2/berry/12', 'https://pokeapi.co/api/v2/berry/11', 'https://pokeapi.co/api/v2/pokemon/12'], (data) => {\n        resultAsCallback = data;\n        done();\n      });\n    });\n    it('result in callback should have length 3', () => chai.expect(resultAsCallback).to.have.length(3));\n    // @ts-ignore\n    it('should all have property name', () => chai.expect(resultAsCallback).to.all.have.property('name'));\n  });\n\n  describe('.resource(Url: String) secure (with ssl)', () => {\n    before(() => {\n      promise = P.getResource('https://pokeapi.co/api/v2/berry/12');\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.resource(Path: String) secure (with ssl)', () => {\n    before(() => {\n      promise = P.getResource('/api/v2/berry/13');\n    });\n    it('should succeed', () => promise);\n    it('should have property name', () => chai.expect(promise).to.eventually.have.property('name'));\n  });\n\n  describe('.resource(Mixed: Array) secure (with ssl)', () => {\n    before(() => {\n      promise = P.getResource(['/api/v2/berry/15', 'https://pokeapi.co/api/v2/berry/14']);\n    });\n    it('should succeed', () => promise);\n    it('should have length 2', () => chai.expect(promise).to.eventually.have.length(2));\n    // @ts-ignore\n    it('should have property name', () => chai.expect(promise).to.eventually.all.have.property('name'));\n  });\n});\n"
  },
  {
    "path": "test/RootEndpoints.spec.ts",
    "content": "import chai from 'chai';\nimport chaiThings from 'chai-things';\nimport chaiAsPromised from 'chai-as-promised';\nimport Pokedex from '../src/index.js';\n\n// order matters: github.com/chaijs/chai-things/issues/4#issuecomment-87801365\nchai.use(chaiThings);\nchai.use(chaiAsPromised);\n\ndescribe('Root Endpoints', function () {\n  let promise;\n  const P = new Pokedex({\n    protocol: 'https',\n    hostName: 'pokeapi.co',\n    versionPath: '/api/v2/',\n  });\n  this.timeout(10000);\n\n  describe('.getEndpointsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEndpointsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property pokedex', () => chai.expect(promise).to.eventually.have.property('pokedex'));\n  });\n\n  describe('.getBerriesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getBerriesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getBerriesFirmnessList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getBerriesFirmnessList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getBerriesFlavorsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getBerriesFlavorsList();\n    });\n    it('should succeed', () => promise);\n\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getContestTypesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getContestTypesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getContestEffectsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getContestEffectsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getSuperContestEffectsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getSuperContestEffectsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getEncounterMethodsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEncounterMethodsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getEncounterConditionsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEncounterConditionsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getEncounterConditionValuesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEncounterConditionValuesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getEvolutionchaisList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEvolutionChainsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getEvolutionTriggersList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEvolutionTriggersList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getGenerationsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getGenerationsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokedexList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokedexList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getVersionsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getVersionsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getVersionGroupsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getVersionGroupsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getItemsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getItemsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getItemAttributesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getItemAttributesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getItemCategoriesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getItemCategoriesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getItemFlingEffectsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getItemFlingEffectsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getItemPocketsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getItemPocketsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMachinesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMachinesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMovesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMovesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMoveAilmentsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMoveAilmentsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMoveBattleStylesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMoveBattleStylesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMoveCategoriesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMoveCategoriesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMoveDamageClassesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMoveDamageClassesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMoveLearnMethodsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMoveLearnMethodsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getMoveTargetsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getMoveTargetsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getLocationsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getLocationsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getLocationAreasList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getLocationAreasList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPalParkAreasList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPalParkAreasList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getRegionsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getRegionsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getAbilitiesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getAbilitiesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getCharacteristicsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getCharacteristicsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getEggGroupsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getEggGroupsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getGendersList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getGendersList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getGrowthRatesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getGrowthRatesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getNaturesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getNaturesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokeathlonStatsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokeathlonStatsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokemonsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokemonsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokemonColorsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokemonColorsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokemonFormsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokemonFormsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokemonHabitatsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokemonHabitatsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokemonShapesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokemonShapesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getPokemonSpeciesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getPokemonSpeciesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getStatsList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getStatsList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getTypesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getTypesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n\n  describe('.getLanguagesList() secure (with ssl)', () => {\n    before(() => {\n      promise = P.getLanguagesList();\n    });\n    it('should succeed', () => promise);\n    it('should have property count', () => chai.expect(promise).to.eventually.have.property('count'));\n  });\n});\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"es2020\",\n    \"moduleResolution\": \"node\",\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"lib\": [\n      \"es2020\",\n      \"dom\"\n    ],\n    \"outDir\": \"dist\"\n  },\n  \"include\": [\n    \"src/**/*.ts\",\n    \"types/**/*.ts\",\n    \"test/**/*.ts\",\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ]\n}\n"
  },
  {
    "path": "types/index.d.ts",
    "content": "/*\n* Type definitions for pokedex-promise-v2 v4.x\n* DO NOT MODIFY, THIS IS AUTO GENERATED\n* Code by: HRKings <https://github.com/HRKings/>\n* And: Christian Garza <https://github.com/C-Garza/>\n* Code inspired by: Mudkip <https://github.com/mudkipme/>\n* Execute `npm run generate:types` to regenerate\n*/\ndeclare module 'pokedex-promise-v2' {\n    namespace PokeAPI {\n        interface APIResource {\n            /** The URL of the referenced resource. */\n            url: string;\n            [property: string]: any;\n        }\n\n        interface APIResourceList {\n            /** The total number of resources available from this API. */\n            count: number;\n            /** The URL for the next page in the list. */\n            next: null | string;\n            /** The URL for the previous page in the list. */\n            previous: null | string;\n            /** A list of unnamed API resources. */\n            results: APIResource[];\n            [property: string]: any;\n        }\n\n        interface Description {\n            /** The localized description for an API resource in a specific language. */\n            description: string;\n            /** The language this name is in. */\n            language: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface Effect {\n            /** The localized effect text for an API resource in a specific language. */\n            effect: string;\n            /** The language this effect is in. */\n            language: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface Encounter {\n            /** Percent chance that this encounter will occur. */\n            chance: number;\n            /** A list of condition values that must be in effect for this encounter to occur. */\n            condition_values: NamedAPIResource[];\n            /** The highest level the Pokémon could be encountered at. */\n            max_level: number;\n            /** The method by which this encounter happens. */\n            method: NamedAPIResource;\n            /** The lowest level the Pokémon could be encountered at. */\n            min_level: number;\n            [property: string]: any;\n        }\n\n        interface FlavorText {\n            /** The localized flavor text for an API resource in a specific language. Note that this text is left unprocessed as it is found in game files. This means that it contains special characters that one might want to replace with their visible decodable version. Please check out this <a href='https://github.com/veekun/pokedex/issues/218#issuecomment-339841781' >issue</a> to find out more. */\n            flavor_text: string;\n            /** The language this name is in. */\n            language: NamedAPIResource;\n            version_group: null | NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface GenerationGameIndex {\n            /** The internal id of an API resource within game data. */\n            game_index: number;\n            /** The generation relevent to this game index. */\n            generation: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface EndpointsList {\n            ability: string;\n            berry: string;\n            \"berry-firmness\": string;\n            \"berry-flavor\": string;\n            characteristic: string;\n            \"contest-effect\": string;\n            \"contest-type\": string;\n            \"egg-group\": string;\n            \"encounter-condition\": string;\n            \"encounter-condition-value\": string;\n            \"encounter-method\": string;\n            \"evolution-chain\": string;\n            \"evolution-trigger\": string;\n            gender: string;\n            generation: string;\n            \"growth-rate\": string;\n            item: string;\n            \"item-attribute\": string;\n            \"item-category\": string;\n            \"item-fling-effect\": string;\n            \"item-pocket\": string;\n            language: string;\n            location: string;\n            \"location-area\": string;\n            machine: string;\n            move: string;\n            \"move-ailment\": string;\n            \"move-battle-style\": string;\n            \"move-category\": string;\n            \"move-damage-class\": string;\n            \"move-learn-method\": string;\n            \"move-target\": string;\n            nature: string;\n            \"pal-park-area\": string;\n            \"pokeathlon-stat\": string;\n            pokedex: string;\n            pokemon: string;\n            \"pokemon-color\": string;\n            \"pokemon-form\": string;\n            \"pokemon-habitat\": string;\n            \"pokemon-shape\": string;\n            \"pokemon-species\": string;\n            region: string;\n            stat: string;\n            \"super-contest-effect\": string;\n            type: string;\n            version: string;\n            \"version-group\": string;\n            [property: string]: any;\n        }\n\n        interface MachineVersionDetail {\n            /** The machine that teaches a move from an item. */\n            machine: APIResource;\n            /** The version group of this specific machine. */\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface Name {\n            /** The language this name is in. */\n            language: NamedAPIResource;\n            /** The localized name for an API resource in a specific language. */\n            name: string;\n            [property: string]: any;\n        }\n\n        interface NamedAPIResource {\n            /** The name of the referenced resource. */\n            name: string;\n            /** The URL of the referenced resource. */\n            url: string;\n            [property: string]: any;\n        }\n\n        interface NamedAPIResourceList {\n            /** The total number of resources available from this API. */\n            count: number;\n            /** The URL for the next page in the list. */\n            next: null | string;\n            /** The URL for the previous page in the list. */\n            previous: null | string;\n            /** A list of named API resources. */\n            results: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        interface VerboseEffect {\n            /** The localized effect text for an API resource in a specific language. */\n            effect: string;\n            /** The language this effect is in. */\n            language: NamedAPIResource;\n            /** The localized effect text in brief. */\n            short_effect: string;\n            [property: string]: any;\n        }\n\n        interface VersionEncounterDetail {\n            /** A list of encounters and their specifics. */\n            encounter_details: Encounter[];\n            /** The total percentage of all encounter potential. */\n            max_chance: number;\n            /** The game version this encounter happens in. */\n            version: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface VersionGameIndex {\n            /** The internal id of an API resource within game data. */\n            game_index: number;\n            /** The version relevent to this game index. */\n            version: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface VersionGroupFlavorText {\n            /** The language this name is in. */\n            language: NamedAPIResource;\n            /** The localized name for an API resource in a specific language. */\n            text: string;\n            /** The version group which uses this flavor text. */\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Abilities provide passive effects for Pokémon in battle or in the overworld. Pokémon have multiple possible abilities but can have only one ability at a time. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Ability) for greater detail. */\n        interface Ability {\n            /** The list of previous effects this ability has had across version groups. */\n            effect_changes: EffectChange[];\n            /** The effect of this ability listed in different languages. */\n            effect_entries: VerboseEffect[];\n            /** The flavor text of this ability listed in different languages. */\n            flavor_text_entries: FlavorText[];\n            /** The generation this ability originated in. */\n            generation: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** Whether or not this ability originated in the main series of the video games. */\n            is_main_series: boolean;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of Pokémon that could potentially have this ability. */\n            pokemon: AbilityPokemon[];\n            [property: string]: any;\n        }\n\n        interface EffectChange {\n            /** The previous effect of this ability listed in different languages. */\n            effect_entries: Effect[];\n            /** The version group in which the previous effect of this ability originated. */\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface AbilityPokemon {\n            /** Whether or not this a hidden ability for the referenced Pokémon. */\n            is_hidden: boolean;\n            /** The Pokémon this ability could belong to. */\n            pokemon: NamedAPIResource;\n            /** Pokémon have 3 ability 'slots' which hold references to possible abilities they could have. This is the slot of this ability for the referenced pokemon. */\n            slot: number;\n            [property: string]: any;\n        }\n\n        /** Berries are small fruits that can provide HP and status condition restoration, stat enhancement, and even damage negation when eaten by Pokémon. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Berry) for greater detail. */\n        interface Berry {\n            /** The firmness of this berry, used in making Pokéblocks or Poffins. */\n            firmness: NamedAPIResource;\n            /** A list of references to each flavor a berry can have and the potency of each of those flavors in regard to this berry. */\n            flavors: Flavor[];\n            /** Time it takes the tree to grow one stage, in hours. Berry trees go through four of these growth stages before they can be picked. */\n            growth_time: number;\n            /** The identifier for this resource. */\n            id: number;\n            /** Berries are actually items. This is a reference to the item specific data for this berry. */\n            item: NamedAPIResource;\n            /** The maximum number of these berries that can grow on one tree in Generation IV. */\n            max_harvest: number;\n            /** The name for this resource. */\n            name: string;\n            /** The power of the move \"Natural Gift\" when used with this Berry. */\n            natural_gift_power: number;\n            /** The type inherited by \"Natural Gift\" when used with this Berry. */\n            natural_gift_type: NamedAPIResource;\n            /** The size of this Berry, in millimeters. */\n            size: number;\n            /** The smoothness of this Berry, used in making Pokéblocks or Poffins. */\n            smoothness: number;\n            /** The speed at which this Berry dries out the soil as it grows. A higher rate means the soil dries more quickly. */\n            soil_dryness: number;\n            [property: string]: any;\n        }\n\n        interface Flavor {\n            flavor: NamedAPIResource;\n            potency: number;\n            [property: string]: any;\n        }\n\n        /** Berries can be soft or hard. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Category:Berries_by_firmness) for greater detail. */\n        interface BerryFirmness {\n            /** A list of the berries with this firmness. */\n            berries: NamedAPIResource[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Flavors determine whether a Pokémon will benefit or suffer from eating a berry based on their [nature](#natures). Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Flavor) for greater detail. */\n        interface BerryFlavor {\n            /** A list of the berries with this flavor. */\n            berries: BerryElement[];\n            /** The contest type that correlates with this berry flavor. */\n            contest_type: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        interface BerryElement {\n            berry: NamedAPIResource;\n            potency: number;\n            [property: string]: any;\n        }\n\n        /** Characteristics indicate which stat contains a Pokémon's highest IV. A Pokémon's Characteristic is determined by the remainder of its highest IV divided by 5 (gene_modulo). Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Characteristic) for greater detail. */\n        interface Characteristic {\n            /** The descriptions of this characteristic listed in different languages. */\n            descriptions: Description[];\n            /** The remainder of the highest stat/IV divided by 5. */\n            gene_modulo: number;\n            /** The stat which results in this characteristic. */\n            highest_stat: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** The possible values of the highest stat that would result in a Pokémon recieving this characteristic when divided by 5. */\n            possible_values: number[];\n            [property: string]: any;\n        }\n\n        /** Contest effects refer to the effects of moves when used in contests. */\n        interface ContestEffect {\n            /** The base number of hearts the user of this move gets. */\n            appeal: number;\n            /** The result of this contest effect listed in different languages. */\n            effect_entries: Effect[];\n            /** The flavor text of this contest effect listed in different languages. */\n            flavor_text_entries: FlavorText[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The base number of hearts the user's opponent loses. */\n            jam: number;\n            [property: string]: any;\n        }\n\n        /** Contest types are categories judges used to weigh a Pokémon's condition in Pokémon contests. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Contest_condition) for greater detail. */\n        interface ContestType {\n            /** The berry flavor that correlates with this contest type. */\n            berry_flavor: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this contest type listed in different languages. */\n            names: ContestTypeName[];\n            [property: string]: any;\n        }\n\n        interface ContestTypeName extends Name {\n            color: string;\n        }\n\n        /** Egg Groups are categories which determine which Pokémon are able to interbreed. Pokémon may belong to either one or two Egg Groups. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Egg_Group) for greater detail. */\n        interface EggGroup {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of all Pokémon species that are members of this egg group. */\n            pokemon_species: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Conditions which affect what pokemon might appear in the wild, e.g., day or night. */\n        interface EncounterCondition {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of possible values for this encounter condition. */\n            values: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Encounter condition values are the various states that an encounter condition can have, i.e., time of day can be either day or night. */\n        interface EncounterConditionValue {\n            /** The condition this encounter condition value pertains to. */\n            condition: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Methods by which the player might can encounter Pokémon in the wild, e.g., walking in tall grass. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Wild_Pok%C3%A9mon) for greater detail. */\n        interface EncounterMethod {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A good value for sorting. */\n            order: number;\n            [property: string]: any;\n        }\n\n        /** Evolution chains are essentially family trees. They start with the lowest stage within a family and detail evolution conditions for each as well as Pokémon they can evolve into up through the hierarchy. */\n        interface EvolutionChain {\n            /** The item that a Pokémon would be holding when mating that would trigger the egg hatching a baby Pokémon rather than a basic Pokémon. */\n            baby_trigger_item: null | NamedAPIResource;\n            /** The base chain link object. Each link contains evolution details for a Pokémon in the chain. Each link references the next Pokémon in the natural evolution order. */\n            chain: Chain;\n            /** The identifier for this resource. */\n            id: number;\n            [property: string]: any;\n        }\n\n        interface Chain {\n            evolution_details: EvolutionDetail[];\n            evolves_to: Chain[];\n            is_baby: boolean;\n            species: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface EvolutionDetail {\n            /** The id of the gender of the evolving Pokémon species must be in order to evolve into this Pokémon species. */\n            gender: number | null;\n            /** The item the evolving Pokémon species must be holding during the evolution trigger event to evolve into this Pokémon species. */\n            held_item: null | NamedAPIResource;\n            /** The item required to cause evolution this into Pokémon species. */\n            item: null | NamedAPIResource;\n            /** The move that must be known by the evolving Pokémon species during the evolution trigger event in order to evolve into this Pokémon species. */\n            known_move: null | NamedAPIResource;\n            /** The evolving Pokémon species must know a move with this type during the evolution trigger event in order to evolve into this Pokémon species. */\n            known_move_type: null | NamedAPIResource;\n            /** The location the evolution must be triggered at. */\n            location: null | NamedAPIResource;\n            /** The minimum required level of affection the evolving Pokémon species to evolve into this Pokémon species. */\n            min_affection: number | null;\n            /** The minimum required level of beauty the evolving Pokémon species to evolve into this Pokémon species. */\n            min_beauty: number | null;\n            /** The minimum required level of happiness the evolving Pokémon species to evolve into this Pokémon species. */\n            min_happiness: number | null;\n            /** The minimum required level of the evolving Pokémon species to evolve into this Pokémon species. */\n            min_level: number | null;\n            /** Whether or not it must be raining in the overworld to cause evolution this Pokémon species. */\n            needs_overworld_rain: boolean;\n            /** The Pokémon species that must be in the players party in order for the evolving Pokémon species to evolve into this Pokémon species. */\n            party_species: null | NamedAPIResource;\n            /** The player must have a Pokémon of this type in their party during the evolution trigger event in order for the evolving Pokémon species to evolve into this Pokémon species. */\n            party_type: null | NamedAPIResource;\n            /** The required relation between the Pokémon's Attack and Defense stats. 1 means Attack > Defense. 0 means Attack = Defense. -1 means Attack < Defense. */\n            relative_physical_stats: number | null;\n            /** The required time of day. Day or night. */\n            time_of_day: string;\n            /** Pokémon species for which this one must be traded. */\n            trade_species: null | NamedAPIResource;\n            /** The type of event that triggers evolution into this Pokémon species. */\n            trigger: NamedAPIResource;\n            /** Whether or not the 3DS needs to be turned upside-down as this Pokémon levels up. */\n            turn_upside_down: boolean;\n            [property: string]: any;\n        }\n\n        /** Evolution triggers are the events and conditions that cause a Pokémon to evolve. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Methods_of_evolution) for greater detail. */\n        interface EvolutionTrigger {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of pokemon species that result from this evolution trigger. */\n            pokemon_species: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Genders were introduced in Generation II for the purposes of breeding Pokémon but can also result in visual differences or even different evolutionary lines. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Gender) for greater detail. */\n        interface Gender {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** A list of Pokémon species that can be this gender and how likely it is that they will be. */\n            pokemon_species_details: PokemonSpeciesDetail[];\n            /** A list of Pokémon species that required this gender in order for a Pokémon to evolve into them. */\n            required_for_evolution: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        interface PokemonSpeciesDetail {\n            pokemon_species: NamedAPIResource;\n            rate: number;\n            [property: string]: any;\n        }\n\n        /** A generation is a grouping of the Pokémon games that separates them based on the Pokémon they include. In each generation, a new set of Pokémon, Moves, Abilities and Types that did not exist in the previous generation are released. */\n        interface Generation {\n            /** A list of abilities that were introduced in this generation. */\n            abilities: NamedAPIResource[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The main region travelled in this generation. */\n            main_region: NamedAPIResource;\n            /** A list of moves that were introduced in this generation. */\n            moves: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of Pokémon species that were introduced in this generation. */\n            pokemon_species: NamedAPIResource[];\n            /** A list of types that were introduced in this generation. */\n            types: NamedAPIResource[];\n            /** A list of version groups that were introduced in this generation. */\n            version_groups: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Growth rates are the speed with which Pokémon gain levels through experience. Check out [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Experience) for greater detail. */\n        interface GrowthRate {\n            /** The descriptions of this characteristic listed in different languages. */\n            descriptions: Description[];\n            /** The formula used to calculate the rate at which the Pokémon species gains level. */\n            formula: string;\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of levels and the amount of experienced needed to atain them based on this growth rate. */\n            levels: Level[];\n            /** The name for this resource. */\n            name: string;\n            /** A list of Pokémon species that gain levels at this growth rate. */\n            pokemon_species: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        interface Level {\n            experience: number;\n            level: number;\n            [property: string]: any;\n        }\n\n        /** An item is an object in the games which the player can pick up, keep in their bag, and use in some manner. They have various uses, including healing, powering up, helping catch Pokémon, or to access a new area. */\n        interface Item {\n            /** A list of attributes this item has. */\n            attributes: NamedAPIResource[];\n            /** An evolution chain this item requires to produce a bay during mating. */\n            baby_trigger_for: null | APIResource;\n            /** The category of items this item falls into. */\n            category: NamedAPIResource;\n            /** The price of this item in stores. */\n            cost: number;\n            /** The effect of this ability listed in different languages. */\n            effect_entries: VerboseEffect[];\n            /** The flavor text of this ability listed in different languages. */\n            flavor_text_entries: VersionGroupFlavorText[];\n            /** The effect of the move Fling when used with this item. */\n            fling_effect: null | NamedAPIResource;\n            /** The power of the move Fling when used with this item. */\n            fling_power: number | null;\n            /** A list of game indices relevent to this item by generation. */\n            game_indices: GenerationGameIndex[];\n            /** A list of Pokémon that might be found in the wild holding this item. */\n            held_by_pokemon: HeldByPokemon[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of the machines related to this item. */\n            machines: MachineVersionDetail[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this item listed in different languages. */\n            names: Name[];\n            /** A set of sprites used to depict this item in the game. */\n            sprites: ItemSprites;\n            [property: string]: any;\n        }\n\n        interface RarityVersion {\n          rarity: number;\n          version: NamedAPIResource;\n          [property: string]: any;\n      }\n\n        interface HeldByPokemon {\n            pokemon: NamedAPIResource;\n            version_details: RarityVersion[];\n            [property: string]: any;\n        }\n\n        interface ItemSprites {\n            /** The default depiction of this item. */\n            default: null | string;\n            [property: string]: any;\n        }\n\n        /** Item attributes define particular aspects of items, e.g. \"usable in battle\" or \"consumable\". */\n        interface ItemAttribute {\n            /** The description of this item attribute listed in different languages. */\n            descriptions: Description[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of items that have this attribute. */\n            items: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this item attribute listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Item categories determine where items will be placed in the players bag. */\n        interface ItemCategory {\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of items that are a part of this category. */\n            items: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this item category listed in different languages. */\n            names: Name[];\n            /** The pocket items in this category would be put in. */\n            pocket: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** The various effects of the move \"Fling\" when used with different items. */\n        interface ItemFlingEffect {\n            /** The result of this fling effect listed in different languages. */\n            effect_entries: Effect[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of items that have this fling effect. */\n            items: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            [property: string]: any;\n        }\n\n        /** Pockets within the players bag used for storing items by category. */\n        interface ItemPocket {\n            /** A list of item categories that are relevant to this item pocket. */\n            categories: NamedAPIResource[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Languages for translations of API resource information. */\n        interface Language {\n            /** The identifier for this resource. */\n            id: number;\n            /** The two-letter code of the language. Note that it is not unique. */\n            iso3166: string;\n            /** The two-letter code of the country where this language is spoken. Note that it is not unique. */\n            iso639: string;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** Whether or not the games are published in this language. */\n            official: boolean;\n            [property: string]: any;\n        }\n\n        /** Locations that can be visited within the games. Locations make up sizable portions of regions, like cities or routes. */\n        interface Location {\n            /** Areas that can be found within this location. */\n            areas: NamedAPIResource[];\n            /** A list of game indices relevant to this location by generation. */\n            game_indices: GenerationGameIndex[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** The region this location can be found in. */\n            region: null | NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Location areas are sections of areas, such as floors in a building or cave. Each area has its own set of possible Pokémon encounters. */\n        interface LocationArea {\n            /** A list of methods in which Pokémon may be encountered in this area and how likely the method will occur depending on the version of the game. */\n            encounter_method_rates: EncounterMethodRate[];\n            /** The internal id of an API resource within game data. */\n            game_index: number;\n            /** The identifier for this resource. */\n            id: number;\n            /** The region this location area can be found in. */\n            location: NamedAPIResource;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of Pokémon that can be encountered in this area along with version specific details about the encounter. */\n            pokemon_encounters: LocationAreaPokemonEncounter[];\n            [property: string]: any;\n        }\n\n        interface EncounterMethodRate {\n            /** The method in which Pokémon may be encountered in an area.. */\n            encounter_method: NamedAPIResource;\n            /** The chance of the encounter to occur on a version of the game. */\n            version_details: EncounterMethodRateVersionDetail[];\n            [property: string]: any;\n        }\n\n        interface EncounterMethodRateVersionDetail {\n            rate: number;\n            version: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface LocationAreaPokemonEncounter {\n            /** The Pokémon being encountered. */\n            pokemon: NamedAPIResource;\n            /** A list of versions and encounters with Pokémon that might happen in the referenced location area. */\n            version_details: VersionEncounterDetail[];\n            [property: string]: any;\n        }\n\n        /** Machines are the representation of items that teach moves to Pokémon. They vary from version to version, so it is not certain that one specific TM or HM corresponds to a single Machine. */\n        interface Machine {\n            /** The identifier for this resource. */\n            id: number;\n            /** The TM or HM item that corresponds to this machine. */\n            item: NamedAPIResource;\n            /** The move that is taught by this machine. */\n            move: NamedAPIResource;\n            /** The version group that this machine applies to. */\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Moves are the skills of Pokémon in battle. In battle, a Pokémon uses one move each turn. Some moves (including those learned by Hidden Machine) can be used outside of battle as well, usually for the purpose of removing obstacles or exploring new areas. */\n        interface Move {\n            /** The percent value of how likely this move is to be successful. */\n            accuracy: number | null;\n            /** A detail of normal and super contest combos that require this move. */\n            contest_combos: null | ContestCombos;\n            /** The effect the move has when used in a contest. */\n            contest_effect: null | APIResource;\n            /** The type of appeal this move gives a Pokémon when used in a contest. */\n            contest_type: null | NamedAPIResource;\n            /** The type of damage the move inflicts on the target, e.g. physical. */\n            damage_class: NamedAPIResource;\n            /** The percent value of how likely it is this moves effect will happen. */\n            effect_chance: number | null;\n            /** The list of previous effects this move has had across version groups of the games. */\n            effect_changes: EffectChange[];\n            /** The effect of this move listed in different languages. */\n            effect_entries: VerboseEffect[];\n            /** The flavor text of this move listed in different languages. */\n            flavor_text_entries: FlavorText[];\n            /** The generation in which this move was introduced. */\n            generation: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** List of Pokemon that can learn the move */\n            learned_by_pokemon: NamedAPIResource[];\n            /** A list of the machines that teach this move. */\n            machines: MachineVersionDetail[];\n            /** Metadata about this move */\n            meta: null | Meta;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of move resource value changes across version groups of the game. */\n            past_values: Move[];\n            /** The base power of this move with a value of 0 if it does not have a base power. */\n            power: number | null;\n            /** Power points. The number of times this move can be used. */\n            pp: number | null;\n            /** A value between -8 and 8. Sets the order in which moves are executed during battle. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Priority) for greater detail. */\n            priority: number;\n            /** A list of stats this moves effects and how much it effects them. */\n            stat_changes: StatChange[];\n            /** The effect the move has when used in a super contest. */\n            super_contest_effect: null | APIResource;\n            /** The type of target that will receive the effects of the attack. */\n            target: NamedAPIResource;\n            /** The elemental type of this move. */\n            type: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface ContestCombos {\n            normal: ComboDetail;\n            super: ComboDetail;\n            [property: string]: any;\n        }\n\n        interface ComboDetail {\n            use_after: NamedAPIResource[] | null;\n            use_before: NamedAPIResource[] | null;\n            [property: string]: any;\n        }\n\n        interface Meta {\n            ailment: NamedAPIResource;\n            ailment_chance: number;\n            category: NamedAPIResource;\n            crit_rate: number;\n            drain: number;\n            flinch_chance: number;\n            healing: number;\n            max_hits: number | null;\n            max_turns: number | null;\n            min_hits: number | null;\n            min_turns: number | null;\n            stat_chance: number;\n            [property: string]: any;\n        }\n\n        interface StatChange {\n            change: number;\n            stat: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Move Ailments are status conditions caused by moves used during battle. See [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Status_condition) for greater detail. */\n        interface MoveAilment {\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of moves that cause this ailment. */\n            moves: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Styles of moves when used in the Battle Palace. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Battle_Frontier_(Generation_III)) for greater detail. */\n        interface MoveBattleStyle {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Very general categories that loosely group move effects. */\n        interface MoveCategory {\n            /** The description of this resource listed in different languages. */\n            descriptions: Description[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of moves that fall into this category. */\n            moves: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            [property: string]: any;\n        }\n\n        /** Damage classes moves can have, e.g. physical, special, or non-damaging. */\n        interface MoveDamageClass {\n            /** The description of this resource listed in different languages. */\n            descriptions: Description[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of moves that fall into this damage class. */\n            moves: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Methods by which Pokémon can learn moves. */\n        interface MoveLearnMethod {\n            /** The description of this resource listed in different languages. */\n            descriptions: Description[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of version groups where moves can be learned through this method. */\n            version_groups: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Targets moves can be directed at during battle. Targets can be Pokémon, environments or even other moves. */\n        interface MoveTarget {\n            /** The description of this resource listed in different languages. */\n            descriptions: Description[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of moves that that are directed at this target. */\n            moves: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        /** Natures influence how a Pokémon's stats grow. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Nature) for greater detail. */\n        interface Nature {\n            /** The stat decreased by 10% in Pokémon with this nature. */\n            decreased_stat: null | NamedAPIResource;\n            /** The flavor hated by Pokémon with this nature. */\n            hates_flavor: null | NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** The stat increased by 10% in Pokémon with this nature. */\n            increased_stat: null | NamedAPIResource;\n            /** The flavor liked by Pokémon with this nature. */\n            likes_flavor: null | NamedAPIResource;\n            /** A list of battle styles and how likely a Pokémon with this nature is to use them in the Battle Palace or Battle Tent. */\n            move_battle_style_preferences: MoveBattleStylePreference[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of Pokéathlon stats this nature effects and how much it effects them. */\n            pokeathlon_stat_changes: PokeathlonStatChange[];\n            [property: string]: any;\n        }\n\n        interface MoveBattleStylePreference {\n            /** Chance of using the move, in percent, if HP is over one half. */\n            high_hp_preference: number;\n            /** Chance of using the move, in percent, if HP is under one half. */\n            low_hp_preference: number;\n            /** The move battle style. */\n            move_battle_style: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PokeathlonStatChange {\n            max_change: number;\n            pokeathlon_stat: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Areas used for grouping Pokémon encounters in Pal Park. They're like habitats that are specific to [Pal Park](https://bulbapedia.bulbagarden.net/wiki/Pal_Park). */\n        interface PalParkArea {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of Pokémon encountered in thi pal park area along with details. */\n            pokemon_encounters: PalParkAreaPokemonEncounter[];\n            [property: string]: any;\n        }\n\n        interface PalParkAreaPokemonEncounter {\n            base_score: number;\n            pokemon_species: NamedAPIResource;\n            rate: number;\n            [property: string]: any;\n        }\n\n        /** Pokeathlon Stats are different attributes of a Pokémon's performance in Pokéathlons. In Pokéathlons, competitions happen on different courses; one for each of the different Pokéathlon stats. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9athlon) for greater detail. */\n        interface PokeathlonStat {\n            /** A detail of natures which affect this Pokéathlon stat positively or negatively. */\n            affecting_natures: PokeathlonStatAffectingNatures;\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        interface PokeathlonStatAffectingNatures {\n            decrease: AffectingNaturesChange[];\n            increase: AffectingNaturesChange[];\n            [property: string]: any;\n        }\n\n        interface AffectingNaturesChange {\n            max_change: number;\n            nature: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** A Pokédex is a handheld electronic encyclopedia device; one which is capable of recording and retaining information of the various Pokémon in a given region with the exception of the national dex and some smaller dexes related to portions of a region. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pokedex) for greater detail. */\n        interface Pokedex {\n            /** The description of this resource listed in different languages. */\n            descriptions: Description[];\n            /** The identifier for this resource. */\n            id: number;\n            /** Whether or not this Pokédex originated in the main series of the video games. */\n            is_main_series: boolean;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of Pokémon catalogued in this Pokédex and their indexes. */\n            pokemon_entries: PokemonEntry[];\n            /** The region this Pokédex catalogues Pokémon for. */\n            region: null | NamedAPIResource;\n            /** A list of version groups this Pokédex is relevant to. */\n            version_groups: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        interface PokemonEntry {\n            /** The index of this Pokémon species entry within the Pokédex. */\n            entry_number: number;\n            /** The Pokémon species being encountered. */\n            pokemon_species: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PokemonEncounter {\n            location_area: NamedAPIResource;\n            version_details: VersionEncounterDetail[];\n            [property: string]: any;\n        }\n\n        /** Pokémon are the creatures that inhabit the world of the Pokémon games. They can be caught using Pokéballs and trained by battling with other Pokémon.  Each Pokémon belongs to a specific species but may take on a variant which makes it differ from other Pokémon of the same species, such as base stats, available abilities and typings. See [Bulbapedia](http://bulbapedia.bulbagarden.net/wiki/Pok%C3%A9mon_(species)) for greater detail. */\n        interface Pokemon {\n            /** A list of abilities this Pokémon could potentially have. */\n            abilities: PokemonAbility[];\n            /** The base experience gained for defeating this Pokémon. */\n            base_experience: number;\n            /** A set of cries used to depict this Pokémon in the game. A visual representation of the various cries can be found at <a href='https://github.com/PokeAPI/cries#cries'>PokeAPI/cries</a> */\n            cries: Cries;\n            /** A list of forms this Pokémon can take on. */\n            forms: NamedAPIResource[];\n            /** A list of game indices relevent to Pokémon item by generation. */\n            game_indices: VersionGameIndex[];\n            /** The height of this Pokémon in decimetres. */\n            height: number;\n            /** A list of items this Pokémon may be holding when encountered. */\n            held_items: HeldItem[];\n            /** The identifier for this resource. */\n            id: number;\n            /** Set for exactly one Pokémon used as the default for each species. */\n            is_default: boolean;\n            /** A link to a list of location areas, as well as encounter details pertaining to specific versions. */\n            location_area_encounters: string;\n            /** A list of moves along with learn methods and level details pertaining to specific version groups. */\n            moves: MoveElement[];\n            /** The name for this resource. */\n            name: string;\n            /** Order for sorting. Almost national order, except families are grouped together. */\n            order: number;\n            past_abilities: PastAbility[];\n            /** A list of details showing types this pokémon had in previous generations */\n            past_types: PastType[];\n            /** The species this Pokémon belongs to. */\n            species: NamedAPIResource;\n            /** A set of sprites used to depict this Pokémon in the game. A visual representation of the various sprites can be found at <a href='https://github.com/PokeAPI/sprites#sprites'>PokeAPI/sprites</a> */\n            sprites: PokemonSprites;\n            /** A list of base stat values for this Pokémon. */\n            stats: StatElement[];\n            /** A list of details showing types this Pokémon has. */\n            types: PokemonType[];\n            /** The weight of this Pokémon in hectograms. */\n            weight: number;\n            [property: string]: any;\n        }\n\n        interface PokemonAbility {\n            /** The ability the Pokémon may have. */\n            ability: NamedAPIResource;\n            /** Whether or not this is a hidden ability. */\n            is_hidden: boolean;\n            /** The slot this ability occupies in this Pokémon species. */\n            slot: number;\n            [property: string]: any;\n        }\n\n        interface Cries {\n            latest: string;\n            legacy: null | string;\n            [property: string]: any;\n        }\n\n        interface HeldItem {\n            item: NamedAPIResource;\n            version_details: RarityVersion[];\n            [property: string]: any;\n        }\n\n        interface MoveElement {\n            move: NamedAPIResource;\n            version_group_details: VersionGroupDetail[];\n            [property: string]: any;\n        }\n\n        interface VersionGroupDetail {\n            level_learned_at: number;\n            move_learn_method: NamedAPIResource;\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PastAbility {\n            abilities: PastAbilityAbility[];\n            generation: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PastAbilityAbility {\n            ability: NamedAPIResource;\n            is_hidden: boolean;\n            slot: number;\n            [property: string]: any;\n        }\n\n        interface PastType {\n            generation: NamedAPIResource;\n            types: PastTypeType[];\n            [property: string]: any;\n        }\n\n        interface PastTypeType {\n            slot: number;\n            type: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PokemonSprites {\n            /** The default depiction of this Pokémon from the back in battle. */\n            back_default: null | string;\n            /** The female depiction of this Pokémon from the back in battle. */\n            back_female: null | string;\n            /** The shiny depiction of this Pokémon from the back in battle. */\n            back_shiny: null | string;\n            /** The shiny female depiction of this Pokémon from the back in battle. */\n            back_shiny_female: null | string;\n            /** The default depiction of this Pokémon from the front in battle. */\n            front_default: null | string;\n            /** The female depiction of this Pokémon from the front in battle. */\n            front_female: null | string;\n            /** The shiny depiction of this Pokémon from the front in battle. */\n            front_shiny: null | string;\n            /** The shiny female depiction of this Pokémon from the front in battle. */\n            front_shiny_female: null | string;\n            other: Other;\n            versions: SpriteVersions;\n            [property: string]: any;\n        }\n\n        interface Other {\n            dream_world: DreamWorld;\n            home: Home;\n            \"official-artwork\": OfficialArtwork;\n            showdown: Showdown;\n            [property: string]: any;\n        }\n\n        interface DreamWorld {\n            front_default: null | string;\n            front_female: null | string;\n            [property: string]: any;\n        }\n\n        interface Home {\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n        interface OfficialArtwork {\n            front_default: null | string;\n            front_shiny: null | string;\n            [property: string]: any;\n        }\n\n        interface Showdown {\n            back_default: null | string;\n            back_female: null | string;\n            back_shiny: null | string;\n            back_shiny_female: null;\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n        interface SpriteVersions {\n            \"generation-i\": GenerationI;\n            \"generation-ii\": GenerationIi;\n            \"generation-iii\": GenerationIii;\n            \"generation-iv\": GenerationIv;\n            \"generation-v\": GenerationV;\n            \"generation-vi\": GenerationVi;\n            \"generation-vii\": GenerationVii;\n            \"generation-viii\": GenerationViii;\n            [property: string]: any;\n        }\n\n        interface GenerationI {\n            \"red-blue\": GenerationISprite;\n            yellow: GenerationISprite;\n            [property: string]: any;\n        }\n\n        interface GenerationISprite {\n            back_default: null | string;\n            back_gray: null | string;\n            back_transparent: null | string;\n            front_default: null | string;\n            front_gray: null | string;\n            front_transparent: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationIi {\n            crystal: GenerationIiSpriteExtra;\n            gold: GenerationIiSprite;\n            silver: GenerationIiSprite;\n            [property: string]: any;\n        }\n\n        interface GenerationIiSpriteExtra {\n            back_default: null | string;\n            back_shiny: null | string;\n            back_shiny_transparent: null | string;\n            back_transparent: null | string;\n            front_default: null | string;\n            front_shiny: null | string;\n            front_shiny_transparent: null | string;\n            front_transparent: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationIiSprite {\n            back_default: null | string;\n            back_shiny: null | string;\n            front_default: null | string;\n            front_shiny: null | string;\n            front_transparent: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationIii {\n            emerald: GenerationIiiSpriteBasic;\n            \"firered-leafgreen\": GenerationIiiSprite;\n            \"ruby-sapphire\": GenerationIiiSprite;\n            [property: string]: any;\n        }\n\n        interface GenerationIiiSpriteBasic {\n            front_default: null | string;\n            front_shiny: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationIiiSprite {\n            back_default: null | string;\n            back_shiny: null | string;\n            front_default: null | string;\n            front_shiny: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationIv {\n            \"diamond-pearl\": GenerationIvSprite;\n            \"heartgold-soulsilver\": GenerationIvSprite;\n            platinum: GenerationIvSprite;\n            [property: string]: any;\n        }\n\n        interface GenerationIvSprite {\n            back_default: null | string;\n            back_female: null | string;\n            back_shiny: null | string;\n            back_shiny_female: null | string;\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n\n        interface GenerationV {\n            \"black-white\": GenerationVSprite;\n            [property: string]: any;\n        }\n\n        interface GenerationVSprite {\n            animated: Animated;\n            back_default: null | string;\n            back_female: null | string;\n            back_shiny: null | string;\n            back_shiny_female: null | string;\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n        interface Animated {\n            back_default: null | string;\n            back_female: null | string;\n            back_shiny: null | string;\n            back_shiny_female: null | string;\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationVi {\n            \"omegaruby-alphasapphire\": GenerationViSprite;\n            \"x-y\": GenerationViSprite;\n            [property: string]: any;\n        }\n\n        interface GenerationViSprite {\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n        interface GenerationVii {\n            icons: GenerationViiIcons;\n            \"ultra-sun-ultra-moon\": GenerationViiSprite;\n            [property: string]: any;\n        }\n\n        interface GenerationViiIcons {\n            front_default: null | string;\n            front_female: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationViiSprite {\n            front_default: null | string;\n            front_female: null | string;\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n        interface GenerationViii {\n            icons: GenerationViiiIcons;\n            [property: string]: any;\n        }\n\n        interface GenerationViiiIcons {\n            front_default: null | string;\n            front_female: null | string;\n            [property: string]: any;\n        }\n\n        interface StatElement {\n            base_stat: number;\n            effort: number;\n            stat: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PokemonType {\n            /** The order the Pokémon's types are listed in. */\n            slot: number;\n            /** The type the referenced Pokémon has. */\n            type: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Colors used for sorting Pokémon in a Pokédex. The color listed in the Pokédex is usually the color most apparent or covering each Pokémon's body. No orange category exists; Pokémon that are primarily orange are listed as red or brown. */\n        interface PokemonColor {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of the Pokémon species that have this color. */\n            pokemon_species: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Some Pokémon may appear in one of multiple, visually different forms. These differences are purely cosmetic. For variations within a Pokémon species, which do differ in more than just visuals, the 'Pokémon' entity is used to represent such a variety. */\n        interface PokemonForm {\n            /** The name of this form. */\n            form_name: string;\n            /** The form specific form name of this Pokémon form, or empty if the form does not have a specific name. */\n            form_names: Name[];\n            /** The order in which forms should be sorted within a species' forms. */\n            form_order: number;\n            /** The identifier for this resource. */\n            id: number;\n            /** Whether or not this form can only happen during battle. */\n            is_battle_only: boolean;\n            /** True for exactly one form used as the default for each Pokémon. */\n            is_default: boolean;\n            /** Whether or not this form requires mega evolution. */\n            is_mega: boolean;\n            /** The name for this resource. */\n            name: string;\n            /** The form specific full name of this Pokémon form, or empty if the form does not have a specific name. */\n            names: Name[];\n            /** The order in which forms should be sorted within all forms. Multiple forms may have equal order, in which case they should fall back on sorting by name. */\n            order: number;\n            /** The Pokémon that can take on this form. */\n            pokemon: NamedAPIResource;\n            /** A set of sprites used to depict this Pokémon form in the game. */\n            sprites: PokemonFormSprites;\n            /** A list of details showing types this Pokémon form has. */\n            types: PokemonFormType[];\n            /** The version group this Pokémon form was introduced in. */\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PokemonFormSprites {\n            /** The default depiction of this Pokémon form from the back in battle. */\n            back_default: null | string;\n            back_female: null | string;\n            /** The shiny depiction of this Pokémon form from the back in battle. */\n            back_shiny: null | string;\n            back_shiny_female: null | string;\n            /** The default depiction of this Pokémon form from the front in battle. */\n            front_default: null | string;\n            front_female: null | string;\n            /** The shiny depiction of this Pokémon form from the front in battle. */\n            front_shiny: null | string;\n            front_shiny_female: null | string;\n            [property: string]: any;\n        }\n\n        interface PokemonFormType {\n            /** The order the Pokémon's types are listed in. */\n            slot: number;\n            /** The type the referenced Form has. */\n            type: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Habitats are generally different terrain Pokémon can be found in but can also be areas designated for rare or legendary Pokémon. */\n        interface PokemonHabitat {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of the Pokémon species that can be found in this habitat. */\n            pokemon_species: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Shapes used for sorting Pokémon in a Pokédex. */\n        interface PokemonShape {\n            /** The \"scientific\" name of this Pokémon shape listed in different languages. */\n            awesome_names: AwesomeName[];\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of the Pokémon species that have this shape. */\n            pokemon_species: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        interface AwesomeName {\n            /** The localized \"scientific\" name for an API resource in a specific language. */\n            awesome_name: string;\n            /** The language this \"scientific\" name is in. */\n            language: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** A Pokémon Species forms the basis for at least one Pokémon. Attributes of a Pokémon species are shared across all varieties of Pokémon within the species. A good example is Wormadam; Wormadam is the species which can be found in three different varieties, Wormadam-Trash, Wormadam-Sandy and Wormadam-Plant. */\n        interface PokemonSpecies {\n            /** The happiness when caught by a normal Pokéball; up to 255. The higher the number, the happier the Pokémon. */\n            base_happiness: number | null;\n            /** The base capture rate; up to 255. The higher the number, the easier the catch. */\n            capture_rate: number;\n            /** The color of this Pokémon for Pokédex search. */\n            color: NamedAPIResource;\n            /** A list of egg groups this Pokémon species is a member of. */\n            egg_groups: NamedAPIResource[];\n            /** The evolution chain this Pokémon species is a member of. */\n            evolution_chain: APIResource;\n            /** The Pokémon species that evolves into this Pokemon_species. */\n            evolves_from_species: null | NamedAPIResource;\n            /** A list of flavor text entries for this Pokémon species. */\n            flavor_text_entries: FlavorText[];\n            /** Descriptions of different forms Pokémon take on within the Pokémon species. */\n            form_descriptions: Description[];\n            /** Whether or not this Pokémon has multiple forms and can switch between them. */\n            forms_switchable: boolean;\n            /** The chance of this Pokémon being female, in eighths; or -1 for genderless. */\n            gender_rate: number;\n            /** The genus of this Pokémon species listed in multiple languages. */\n            genera: Genus[];\n            /** The generation this Pokémon species was introduced in. */\n            generation: NamedAPIResource;\n            /** The rate at which this Pokémon species gains levels. */\n            growth_rate: NamedAPIResource;\n            /** The habitat this Pokémon species can be encountered in. */\n            habitat: null | NamedAPIResource;\n            /** Whether or not this Pokémon has visual gender differences. */\n            has_gender_differences: boolean;\n            /** Initial hatch counter: one must walk Y × (hatch_counter + 1) steps before this Pokémon's egg hatches, unless utilizing bonuses like Flame Body's. Y varies per generation. In Generations II, III, and VII, Egg cycles are 256 steps long. In Generation IV, Egg cycles are 255 steps long. In Pokémon Brilliant Diamond and Shining Pearl, Egg cycles are also 255 steps long, but are shorter on special dates. In Generations V and VI, Egg cycles are 257 steps long. In Pokémon Sword and Shield, and in Pokémon Scarlet and Violet, Egg cycles are 128 steps long. */\n            hatch_counter: number | null;\n            /** The identifier for this resource. */\n            id: number;\n            /** Whether or not this is a baby Pokémon. */\n            is_baby: boolean;\n            /** Whether or not this is a legendary Pokémon. */\n            is_legendary: boolean;\n            /** Whether or not this is a mythical Pokémon. */\n            is_mythical: boolean;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** The order in which species should be sorted. Based on National Dex order, except families are grouped together and sorted by stage. */\n            order: number;\n            /** A list of encounters that can be had with this Pokémon species in pal park. */\n            pal_park_encounters: PalParkEncounter[];\n            /** A list of Pokedexes and the indexes reserved within them for this Pokémon species. */\n            pokedex_numbers: PokedexNumber[];\n            /** The shape of this Pokémon for Pokédex search. */\n            shape: NamedAPIResource;\n            /** A list of the Pokémon that exist within this Pokémon species. */\n            varieties: Variety[];\n            [property: string]: any;\n        }\n\n        interface Genus {\n            /** The localized genus for the referenced Pokémon species */\n            genus: string;\n            /** The language this genus is in. */\n            language: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface PalParkEncounter {\n            area: NamedAPIResource;\n            base_score: number;\n            rate: number;\n            [property: string]: any;\n        }\n\n        interface PokedexNumber {\n            entry_number: number;\n            pokedex: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface Variety {\n            is_default: boolean;\n            pokemon: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** A region is an organized area of the Pokémon world. Most often, the main difference between regions is the species of Pokémon that can be encountered within them. */\n        interface Region {\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of locations that can be found in this region. */\n            locations: NamedAPIResource[];\n            /** The generation this region was introduced in. */\n            main_generation: null | NamedAPIResource;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of pokédexes that catalogue Pokémon in this region. */\n            pokedexes: NamedAPIResource[];\n            /** A list of version groups where this region can be visited. */\n            version_groups: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Stats determine certain aspects of battles. Each Pokémon has a value for each stat which grows as they gain levels and can be altered momentarily by effects in battles. */\n        interface Stat {\n            /** A detail of moves which affect this stat positively or negatively. */\n            affecting_moves: AffectingMoves;\n            /** A detail of natures which affect this stat positively or negatively. */\n            affecting_natures: StatAffectingNatures;\n            /** A list of characteristics that are set on a Pokémon when its highest base stat is this stat. */\n            characteristics: APIResource[];\n            /** ID the games use for this stat. */\n            game_index: number;\n            /** The identifier for this resource. */\n            id: number;\n            /** Whether this stat only exists within a battle. */\n            is_battle_only: boolean;\n            /** The class of damage this stat is directly related to. */\n            move_damage_class: null | NamedAPIResource;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            [property: string]: any;\n        }\n\n        interface AffectingMoves {\n            decrease: AffectingMovesChange[];\n            increase: AffectingMovesChange[];\n            [property: string]: any;\n        }\n\n        interface AffectingMovesChange {\n            change: number;\n            move: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface StatAffectingNatures {\n            decrease: NamedAPIResource[];\n            increase: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Super contest effects refer to the effects of moves when used in super contests. */\n        interface SuperContestEffect {\n            /** The level of appeal this super contest effect has. */\n            appeal: number;\n            /** The flavor text of this super contest effect listed in different languages. */\n            flavor_text_entries: FlavorText[];\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of moves that have the effect when used in super contests. */\n            moves: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        /** Types are properties for Pokémon and their moves. Each type has three properties: which types of Pokémon it is super effective against, which types of Pokémon it is not very effective against, and which types of Pokémon it is completely ineffective against. */\n        interface Type {\n            /** A detail of how effective this type is toward others and vice versa. */\n            damage_relations: DamageRelations;\n            /** A list of game indices relevent to this item by generation. */\n            game_indices: GenerationGameIndex[];\n            /** The generation this type was introduced in. */\n            generation: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** The class of damage inflicted by this type. */\n            move_damage_class: null | NamedAPIResource;\n            /** A list of moves that have this type. */\n            moves: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** A list of details of how effective this type was toward others and vice versa in previous generations */\n            past_damage_relations: PastDamageRelation[];\n            /** A list of details of Pokémon that have this type. */\n            pokemon: TypePokemon[];\n            sprites: TypeSprites;\n            [property: string]: any;\n        }\n\n        interface DamageRelations {\n            double_damage_from: NamedAPIResource[];\n            double_damage_to: NamedAPIResource[];\n            half_damage_from: NamedAPIResource[];\n            half_damage_to: NamedAPIResource[];\n            no_damage_from: NamedAPIResource[];\n            no_damage_to: NamedAPIResource[];\n            [property: string]: any;\n        }\n\n        interface PastDamageRelation {\n            damage_relations: DamageRelations;\n            generation: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        interface TypePokemon {\n            /** The Pokémon that has the referenced type. */\n            pokemon: NamedAPIResource;\n            /** The order the Pokémon's types are listed in. */\n            slot: number;\n            [property: string]: any;\n        }\n\n        interface TypeSprites {\n            \"generation-iii\": IconsGenerationIii;\n            \"generation-iv\": IconsGenerationIv;\n            \"generation-ix\": IconsGenerationIx;\n            \"generation-v\": IconsGenerationV;\n            \"generation-vi\": IconsGenerationVi;\n            \"generation-vii\": IconsGenerationVii;\n            \"generation-viii\": IconsGenerationViii;\n            [property: string]: any;\n        }\n\n        interface IconName {\n          name_icon: null | string;\n          [property: string]: any;\n        }\n\n        interface IconsGenerationIii {\n            colosseum: IconName;\n            emerald: IconName;\n            \"firered-leafgreen\": IconName;\n            \"ruby-saphire\": IconName;\n            xd: IconName;\n            [property: string]: any;\n        }\n\n        interface IconsGenerationIv {\n            \"diamond-pearl\": IconName;\n            \"heartgold-soulsilver\": IconName;\n            platinum: IconName;\n            [property: string]: any;\n        }\n\n        interface IconsGenerationIx {\n            \"scarlet-violet\": IconName;\n            [property: string]: any;\n        }\n\n        interface IconsGenerationV {\n            \"black-2-white-2\": IconName;\n            \"black-white\": IconName;\n            [property: string]: any;\n        }\n\n        interface IconsGenerationVi {\n            \"omega-ruby-alpha-sapphire\": IconName;\n            \"x-y\": IconName;\n            [property: string]: any;\n        }\n\n        interface IconsGenerationVii {\n            \"lets-go-pikachu-lets-go-eevee\": IconName;\n            \"sun-moon\": IconName;\n            \"ultra-sun-ultra-moon\": IconName;\n            [property: string]: any;\n        }\n\n        interface IconsGenerationViii {\n            \"brilliant-diamond-and-shining-pearl\": IconName;\n            \"legends-arceus\": IconName;\n            \"sword-shield\": IconName;\n            [property: string]: any;\n        }\n\n        /** Versions of the games, e.g., Red, Blue or Yellow. */\n        interface Version {\n            /** The identifier for this resource. */\n            id: number;\n            /** The name for this resource. */\n            name: string;\n            /** The name of this resource listed in different languages. */\n            names: Name[];\n            /** The version group this version belongs to. */\n            version_group: NamedAPIResource;\n            [property: string]: any;\n        }\n\n        /** Version groups categorize highly similar versions of the games. */\n        interface VersionGroup {\n            /** The generation this version was introduced in. */\n            generation: NamedAPIResource;\n            /** The identifier for this resource. */\n            id: number;\n            /** A list of methods in which Pokémon can learn moves in this version group. */\n            move_learn_methods: NamedAPIResource[];\n            /** The name for this resource. */\n            name: string;\n            /** Order for sorting. Almost by date of release, except similar versions are grouped together. */\n            order: number;\n            /** A list of Pokédexes introduces in this version group. */\n            pokedexes: NamedAPIResource[];\n            /** A list of regions that can be visited in this version group. */\n            regions: NamedAPIResource[];\n            /** The versions this version group owns. */\n            versions: NamedAPIResource[];\n            [property: string]: any;\n        }\n    }\n\n    interface ListEndpointOptions {\n        /** The offset to be used in the request */\n        offset?: number;\n        /** The limit to be used in the request */\n        limit?: number;\n        /** The limit of the cache in milliseconds */\n        cacheLimit?: number;\n    }\n\n    interface PokeAPIOptions {\n        /** The protocol to be used */\n        /** @default 'https' */\n        protocol?: 'https' | 'http';\n        /** The hostname of the PokeAPI instance */\n        /** @default 'pokeapi.co' */\n        hostName?: string;\n        /** The version path of the API */\n        /** @default '/api/v2/' */\n        versionPath?: string;\n        /** The offset to be used in list requests */\n        /** @default 0 */\n        offset?: number;\n        /** The limit to be used in list requests */\n        /** @default 100000 */\n        limit?: number;\n        /** The timeout of a response in milliseconds */\n        /** @default 10 * 1000 // (10 seconds) */\n        timeout?: number;\n        /** The limit of the cache in milliseconds */\n        /** @default 1000000 * 1000 // (11 days) */\n        cacheLimit?: number;\n    }\n\n    class PokeAPI {\n        constructor(options?: PokeAPIOptions);\n        getResource(endpoint: string, callback?: (result: any, error?: any) => any): Promise<any>;\n        getResource(endpoint: string[], callback?: (result: any[], error?: any) => any): Promise<any[]>;\n        getResource(endpoint: string | string[], callback?: (result: any | any[], error?: any) => any): Promise<any | any[]>;\n        /** @deprecated - will be removed on the next version. Use {@link getResource} instead */\n        resource(endpoint: string, callback?: (result: any, error?: any) => any): Promise<any>;\n        resource(endpoint: string[], callback?: (result: any[], error?: any) => any): Promise<any[]>;\n        resource(endpoint: string | string[], callback?: (result: any | any[], error?: any) => any): Promise<any | any[]>;\n        getBerryByName(nameOrId: string | number, callback?: (result: PokeAPI.Berry, error?: any) => any): Promise<PokeAPI.Berry>;\n        getBerryByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Berry[], error?: any) => any): Promise<PokeAPI.Berry[]>;\n        getBerryByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Berry, error?: any) => any) & ((result: PokeAPI.Berry[], error?: any) => any)): Promise<PokeAPI.Berry | PokeAPI.Berry[]>;\n        getBerryFirmnessByName(nameOrId: string | number, callback?: (result: PokeAPI.BerryFirmness, error?: any) => any): Promise<PokeAPI.BerryFirmness>;\n        getBerryFirmnessByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.BerryFirmness[], error?: any) => any): Promise<PokeAPI.BerryFirmness[]>;\n        getBerryFirmnessByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.BerryFirmness, error?: any) => any) & ((result: PokeAPI.BerryFirmness[], error?: any) => any)): Promise<PokeAPI.BerryFirmness | PokeAPI.BerryFirmness[]>;\n        getBerryFlavorByName(nameOrId: string | number, callback?: (result: PokeAPI.BerryFlavor, error?: any) => any): Promise<PokeAPI.BerryFlavor>;\n        getBerryFlavorByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.BerryFlavor[], error?: any) => any): Promise<PokeAPI.BerryFlavor[]>;\n        getBerryFlavorByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.BerryFlavor, error?: any) => any) & ((result: PokeAPI.BerryFlavor[], error?: any) => any)): Promise<PokeAPI.BerryFlavor | PokeAPI.BerryFlavor[]>;\n        getContestTypeByName(nameOrId: string | number, callback?: (result: PokeAPI.ContestType, error?: any) => any): Promise<PokeAPI.ContestType>;\n        getContestTypeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.ContestType[], error?: any) => any): Promise<PokeAPI.ContestType[]>;\n        getContestTypeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.ContestType, error?: any) => any) & ((result: PokeAPI.ContestType[], error?: any) => any)): Promise<PokeAPI.ContestType | PokeAPI.ContestType[]>;\n        getContestEffectById(id: number, callback?: (result: PokeAPI.ContestEffect, error?: any) => any): Promise<PokeAPI.ContestEffect>;\n        getContestEffectById(id: number[], callback?: (result: PokeAPI.ContestEffect[], error?: any) => any): Promise<PokeAPI.ContestEffect[]>;\n        getContestEffectById(id: number | number[], callback?: ((result: PokeAPI.ContestEffect, error?: any) => any) & ((result: PokeAPI.ContestEffect[], error?: any) => any)): Promise<PokeAPI.ContestEffect | PokeAPI.ContestEffect[]>;\n        getSuperContestEffectById(id: number, callback?: (result: PokeAPI.SuperContestEffect, error?: any) => any): Promise<PokeAPI.SuperContestEffect>;\n        getSuperContestEffectById(id: number[], callback?: (result: PokeAPI.SuperContestEffect[], error?: any) => any): Promise<PokeAPI.SuperContestEffect[]>;\n        getSuperContestEffectById(id: number | number[], callback?: ((result: PokeAPI.SuperContestEffect, error?: any) => any) & ((result: PokeAPI.SuperContestEffect[], error?: any) => any)): Promise<PokeAPI.SuperContestEffect | PokeAPI.SuperContestEffect[]>;\n        getEncounterMethodByName(nameOrId: string | number, callback?: (result: PokeAPI.EncounterMethod, error?: any) => any): Promise<PokeAPI.EncounterMethod>;\n        getEncounterMethodByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.EncounterMethod[], error?: any) => any): Promise<PokeAPI.EncounterMethod[]>;\n        getEncounterMethodByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.EncounterMethod, error?: any) => any) & ((result: PokeAPI.EncounterMethod[], error?: any) => any)): Promise<PokeAPI.EncounterMethod | PokeAPI.EncounterMethod[]>;\n        getEncounterConditionByName(nameOrId: string | number, callback?: (result: PokeAPI.EncounterCondition, error?: any) => any): Promise<PokeAPI.EncounterCondition>;\n        getEncounterConditionByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.EncounterCondition[], error?: any) => any): Promise<PokeAPI.EncounterCondition[]>;\n        getEncounterConditionByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.EncounterCondition, error?: any) => any) & ((result: PokeAPI.EncounterCondition[], error?: any) => any)): Promise<PokeAPI.EncounterCondition | PokeAPI.EncounterCondition[]>;\n        getEncounterConditionValueByName(nameOrId: string | number, callback?: (result: PokeAPI.EncounterConditionValue, error?: any) => any): Promise<PokeAPI.EncounterConditionValue>;\n        getEncounterConditionValueByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.EncounterConditionValue[], error?: any) => any): Promise<PokeAPI.EncounterConditionValue[]>;\n        getEncounterConditionValueByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.EncounterConditionValue, error?: any) => any) & ((result: PokeAPI.EncounterConditionValue[], error?: any) => any)): Promise<PokeAPI.EncounterConditionValue | PokeAPI.EncounterConditionValue[]>;\n        getEvolutionChainById(id: number, callback?: (result: PokeAPI.EvolutionChain, error?: any) => any): Promise<PokeAPI.EvolutionChain>;\n        getEvolutionChainById(id: number[], callback?: (result: PokeAPI.EvolutionChain[], error?: any) => any): Promise<PokeAPI.EvolutionChain[]>;\n        getEvolutionChainById(id: number | number[], callback?: ((result: PokeAPI.EvolutionChain, error?: any) => any) & ((result: PokeAPI.EvolutionChain[], error?: any) => any)): Promise<PokeAPI.EvolutionChain | PokeAPI.EvolutionChain[]>;\n        getEvolutionTriggerByName(nameOrId: string | number, callback?: (result: PokeAPI.EvolutionTrigger, error?: any) => any): Promise<PokeAPI.EvolutionTrigger>;\n        getEvolutionTriggerByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.EvolutionTrigger[], error?: any) => any): Promise<PokeAPI.EvolutionTrigger[]>;\n        getEvolutionTriggerByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.EvolutionTrigger, error?: any) => any) & ((result: PokeAPI.EvolutionTrigger[], error?: any) => any)): Promise<PokeAPI.EvolutionTrigger | PokeAPI.EvolutionTrigger[]>;\n        getGenerationByName(nameOrId: string | number, callback?: (result: PokeAPI.Generation, error?: any) => any): Promise<PokeAPI.Generation>;\n        getGenerationByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Generation[], error?: any) => any): Promise<PokeAPI.Generation[]>;\n        getGenerationByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Generation, error?: any) => any) & ((result: PokeAPI.Generation[], error?: any) => any)): Promise<PokeAPI.Generation | PokeAPI.Generation[]>;\n        getPokedexByName(nameOrId: string | number, callback?: (result: PokeAPI.Pokedex, error?: any) => any): Promise<PokeAPI.Pokedex>;\n        getPokedexByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Pokedex[], error?: any) => any): Promise<PokeAPI.Pokedex[]>;\n        getPokedexByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Pokedex, error?: any) => any) & ((result: PokeAPI.Pokedex[], error?: any) => any)): Promise<PokeAPI.Pokedex | PokeAPI.Pokedex[]>;\n        getVersionByName(nameOrId: string | number, callback?: (result: PokeAPI.Version, error?: any) => any): Promise<PokeAPI.Version>;\n        getVersionByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Version[], error?: any) => any): Promise<PokeAPI.Version[]>;\n        getVersionByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Version, error?: any) => any) & ((result: PokeAPI.Version[], error?: any) => any)): Promise<PokeAPI.Version | PokeAPI.Version[]>;\n        getVersionGroupByName(nameOrId: string | number, callback?: (result: PokeAPI.VersionGroup, error?: any) => any): Promise<PokeAPI.VersionGroup>;\n        getVersionGroupByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.VersionGroup[], error?: any) => any): Promise<PokeAPI.VersionGroup[]>;\n        getVersionGroupByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.VersionGroup, error?: any) => any) & ((result: PokeAPI.VersionGroup[], error?: any) => any)): Promise<PokeAPI.VersionGroup | PokeAPI.VersionGroup[]>;\n        getItemByName(nameOrId: string | number, callback?: (result: PokeAPI.Item, error?: any) => any): Promise<PokeAPI.Item>;\n        getItemByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Item[], error?: any) => any): Promise<PokeAPI.Item[]>;\n        getItemByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Item, error?: any) => any) & ((result: PokeAPI.Item[], error?: any) => any)): Promise<PokeAPI.Item | PokeAPI.Item[]>;\n        getItemAttributeByName(nameOrId: string | number, callback?: (result: PokeAPI.ItemAttribute, error?: any) => any): Promise<PokeAPI.ItemAttribute>;\n        getItemAttributeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.ItemAttribute[], error?: any) => any): Promise<PokeAPI.ItemAttribute[]>;\n        getItemAttributeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.ItemAttribute, error?: any) => any) & ((result: PokeAPI.ItemAttribute[], error?: any) => any)): Promise<PokeAPI.ItemAttribute | PokeAPI.ItemAttribute[]>;\n        getItemCategoryByName(nameOrId: string | number, callback?: (result: PokeAPI.ItemCategory, error?: any) => any): Promise<PokeAPI.ItemCategory>;\n        getItemCategoryByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.ItemCategory[], error?: any) => any): Promise<PokeAPI.ItemCategory[]>;\n        getItemCategoryByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.ItemCategory, error?: any) => any) & ((result: PokeAPI.ItemCategory[], error?: any) => any)): Promise<PokeAPI.ItemCategory | PokeAPI.ItemCategory[]>;\n        getItemFlingEffectByName(nameOrId: string | number, callback?: (result: PokeAPI.ItemFlingEffect, error?: any) => any): Promise<PokeAPI.ItemFlingEffect>;\n        getItemFlingEffectByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.ItemFlingEffect[], error?: any) => any): Promise<PokeAPI.ItemFlingEffect[]>;\n        getItemFlingEffectByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.ItemFlingEffect, error?: any) => any) & ((result: PokeAPI.ItemFlingEffect[], error?: any) => any)): Promise<PokeAPI.ItemFlingEffect | PokeAPI.ItemFlingEffect[]>;\n        getItemPocketByName(nameOrId: string | number, callback?: (result: PokeAPI.ItemPocket, error?: any) => any): Promise<PokeAPI.ItemPocket>;\n        getItemPocketByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.ItemPocket[], error?: any) => any): Promise<PokeAPI.ItemPocket[]>;\n        getItemPocketByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.ItemPocket, error?: any) => any) & ((result: PokeAPI.ItemPocket[], error?: any) => any)): Promise<PokeAPI.ItemPocket | PokeAPI.ItemPocket[]>;\n        getMachineById(id: number, callback?: (result: PokeAPI.Machine, error?: any) => any): Promise<PokeAPI.Machine>;\n        getMachineById(id: number[], callback?: (result: PokeAPI.Machine[], error?: any) => any): Promise<PokeAPI.Machine[]>;\n        getMachineById(id: number | number[], callback?: ((result: PokeAPI.Machine, error?: any) => any) & ((result: PokeAPI.Machine[], error?: any) => any)): Promise<PokeAPI.Machine | PokeAPI.Machine[]>;\n        getMoveByName(nameOrId: string | number, callback?: (result: PokeAPI.Move, error?: any) => any): Promise<PokeAPI.Move>;\n        getMoveByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Move[], error?: any) => any): Promise<PokeAPI.Move[]>;\n        getMoveByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Move, error?: any) => any) & ((result: PokeAPI.Move[], error?: any) => any)): Promise<PokeAPI.Move | PokeAPI.Move[]>;\n        getMoveAilmentByName(nameOrId: string | number, callback?: (result: PokeAPI.MoveAilment, error?: any) => any): Promise<PokeAPI.MoveAilment>;\n        getMoveAilmentByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.MoveAilment[], error?: any) => any): Promise<PokeAPI.MoveAilment[]>;\n        getMoveAilmentByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.MoveAilment, error?: any) => any) & ((result: PokeAPI.MoveAilment[], error?: any) => any)): Promise<PokeAPI.MoveAilment | PokeAPI.MoveAilment[]>;\n        getMoveBattleStyleByName(nameOrId: string | number, callback?: (result: PokeAPI.MoveBattleStyle, error?: any) => any): Promise<PokeAPI.MoveBattleStyle>;\n        getMoveBattleStyleByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.MoveBattleStyle[], error?: any) => any): Promise<PokeAPI.MoveBattleStyle[]>;\n        getMoveBattleStyleByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.MoveBattleStyle, error?: any) => any) & ((result: PokeAPI.MoveBattleStyle[], error?: any) => any)): Promise<PokeAPI.MoveBattleStyle | PokeAPI.MoveBattleStyle[]>;\n        getMoveCategoryByName(nameOrId: string | number, callback?: (result: PokeAPI.MoveCategory, error?: any) => any): Promise<PokeAPI.MoveCategory>;\n        getMoveCategoryByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.MoveCategory[], error?: any) => any): Promise<PokeAPI.MoveCategory[]>;\n        getMoveCategoryByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.MoveCategory, error?: any) => any) & ((result: PokeAPI.MoveCategory[], error?: any) => any)): Promise<PokeAPI.MoveCategory | PokeAPI.MoveCategory[]>;\n        getMoveDamageClassByName(nameOrId: string | number, callback?: (result: PokeAPI.MoveDamageClass, error?: any) => any): Promise<PokeAPI.MoveDamageClass>;\n        getMoveDamageClassByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.MoveDamageClass[], error?: any) => any): Promise<PokeAPI.MoveDamageClass[]>;\n        getMoveDamageClassByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.MoveDamageClass, error?: any) => any) & ((result: PokeAPI.MoveDamageClass[], error?: any) => any)): Promise<PokeAPI.MoveDamageClass | PokeAPI.MoveDamageClass[]>;\n        getMoveLearnMethodByName(nameOrId: string | number, callback?: (result: PokeAPI.MoveLearnMethod, error?: any) => any): Promise<PokeAPI.MoveLearnMethod>;\n        getMoveLearnMethodByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.MoveLearnMethod[], error?: any) => any): Promise<PokeAPI.MoveLearnMethod[]>;\n        getMoveLearnMethodByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.MoveLearnMethod, error?: any) => any) & ((result: PokeAPI.MoveLearnMethod[], error?: any) => any)): Promise<PokeAPI.MoveLearnMethod | PokeAPI.MoveLearnMethod[]>;\n        getMoveTargetByName(nameOrId: string | number, callback?: (result: PokeAPI.MoveTarget, error?: any) => any): Promise<PokeAPI.MoveTarget>;\n        getMoveTargetByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.MoveTarget[], error?: any) => any): Promise<PokeAPI.MoveTarget[]>;\n        getMoveTargetByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.MoveTarget, error?: any) => any) & ((result: PokeAPI.MoveTarget[], error?: any) => any)): Promise<PokeAPI.MoveTarget | PokeAPI.MoveTarget[]>;\n        getLocationByName(nameOrId: string | number, callback?: (result: PokeAPI.Location, error?: any) => any): Promise<PokeAPI.Location>;\n        getLocationByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Location[], error?: any) => any): Promise<PokeAPI.Location[]>;\n        getLocationByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Location, error?: any) => any) & ((result: PokeAPI.Location[], error?: any) => any)): Promise<PokeAPI.Location | PokeAPI.Location[]>;\n        getLocationAreaByName(nameOrId: string | number, callback?: (result: PokeAPI.LocationArea, error?: any) => any): Promise<PokeAPI.LocationArea>;\n        getLocationAreaByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.LocationArea[], error?: any) => any): Promise<PokeAPI.LocationArea[]>;\n        getLocationAreaByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.LocationArea, error?: any) => any) & ((result: PokeAPI.LocationArea[], error?: any) => any)): Promise<PokeAPI.LocationArea | PokeAPI.LocationArea[]>;\n        getPalParkAreaByName(nameOrId: string | number, callback?: (result: PokeAPI.PalParkArea, error?: any) => any): Promise<PokeAPI.PalParkArea>;\n        getPalParkAreaByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PalParkArea[], error?: any) => any): Promise<PokeAPI.PalParkArea[]>;\n        getPalParkAreaByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PalParkArea, error?: any) => any) & ((result: PokeAPI.PalParkArea[], error?: any) => any)): Promise<PokeAPI.PalParkArea | PokeAPI.PalParkArea[]>;\n        getRegionByName(nameOrId: string | number, callback?: (result: PokeAPI.Region, error?: any) => any): Promise<PokeAPI.Region>;\n        getRegionByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Region[], error?: any) => any): Promise<PokeAPI.Region[]>;\n        getRegionByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Region, error?: any) => any) & ((result: PokeAPI.Region[], error?: any) => any)): Promise<PokeAPI.Region | PokeAPI.Region[]>;\n        getAbilityByName(nameOrId: string | number, callback?: (result: PokeAPI.Ability, error?: any) => any): Promise<PokeAPI.Ability>;\n        getAbilityByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Ability[], error?: any) => any): Promise<PokeAPI.Ability[]>;\n        getAbilityByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Ability, error?: any) => any) & ((result: PokeAPI.Ability[], error?: any) => any)): Promise<PokeAPI.Ability | PokeAPI.Ability[]>;\n        getCharacteristicById(id: number, callback?: (result: PokeAPI.Characteristic, error?: any) => any): Promise<PokeAPI.Characteristic>;\n        getCharacteristicById(id: number[], callback?: (result: PokeAPI.Characteristic[], error?: any) => any): Promise<PokeAPI.Characteristic[]>;\n        getCharacteristicById(id: number | number[], callback?: ((result: PokeAPI.Characteristic, error?: any) => any) & ((result: PokeAPI.Characteristic[], error?: any) => any)): Promise<PokeAPI.Characteristic | PokeAPI.Characteristic[]>;\n        getEggGroupByName(nameOrId: string | number, callback?: (result: PokeAPI.EggGroup, error?: any) => any): Promise<PokeAPI.EggGroup>;\n        getEggGroupByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.EggGroup[], error?: any) => any): Promise<PokeAPI.EggGroup[]>;\n        getEggGroupByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.EggGroup, error?: any) => any) & ((result: PokeAPI.EggGroup[], error?: any) => any)): Promise<PokeAPI.EggGroup | PokeAPI.EggGroup[]>;\n        getGenderByName(nameOrId: string | number, callback?: (result: PokeAPI.Gender, error?: any) => any): Promise<PokeAPI.Gender>;\n        getGenderByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Gender[], error?: any) => any): Promise<PokeAPI.Gender[]>;\n        getGenderByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Gender, error?: any) => any) & ((result: PokeAPI.Gender[], error?: any) => any)): Promise<PokeAPI.Gender | PokeAPI.Gender[]>;\n        getGrowthRateByName(nameOrId: string | number, callback?: (result: PokeAPI.GrowthRate, error?: any) => any): Promise<PokeAPI.GrowthRate>;\n        getGrowthRateByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.GrowthRate[], error?: any) => any): Promise<PokeAPI.GrowthRate[]>;\n        getGrowthRateByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.GrowthRate, error?: any) => any) & ((result: PokeAPI.GrowthRate[], error?: any) => any)): Promise<PokeAPI.GrowthRate | PokeAPI.GrowthRate[]>;\n        getNatureByName(nameOrId: string | number, callback?: (result: PokeAPI.Nature, error?: any) => any): Promise<PokeAPI.Nature>;\n        getNatureByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Nature[], error?: any) => any): Promise<PokeAPI.Nature[]>;\n        getNatureByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Nature, error?: any) => any) & ((result: PokeAPI.Nature[], error?: any) => any)): Promise<PokeAPI.Nature | PokeAPI.Nature[]>;\n        getPokeathlonStatByName(nameOrId: string | number, callback?: (result: PokeAPI.PokeathlonStat, error?: any) => any): Promise<PokeAPI.PokeathlonStat>;\n        getPokeathlonStatByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PokeathlonStat[], error?: any) => any): Promise<PokeAPI.PokeathlonStat[]>;\n        getPokeathlonStatByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PokeathlonStat, error?: any) => any) & ((result: PokeAPI.PokeathlonStat[], error?: any) => any)): Promise<PokeAPI.PokeathlonStat | PokeAPI.PokeathlonStat[]>;\n        getPokemonByName(nameOrId: string | number, callback?: (result: PokeAPI.Pokemon, error?: any) => any): Promise<PokeAPI.Pokemon>;\n        getPokemonByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Pokemon[], error?: any) => any): Promise<PokeAPI.Pokemon[]>;\n        getPokemonByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Pokemon, error?: any) => any) & ((result: PokeAPI.Pokemon[], error?: any) => any)): Promise<PokeAPI.Pokemon | PokeAPI.Pokemon[]>;\n        getPokemonColorByName(nameOrId: string | number, callback?: (result: PokeAPI.PokemonColor, error?: any) => any): Promise<PokeAPI.PokemonColor>;\n        getPokemonColorByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PokemonColor[], error?: any) => any): Promise<PokeAPI.PokemonColor[]>;\n        getPokemonColorByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PokemonColor, error?: any) => any) & ((result: PokeAPI.PokemonColor[], error?: any) => any)): Promise<PokeAPI.PokemonColor | PokeAPI.PokemonColor[]>;\n        getPokemonFormByName(nameOrId: string | number, callback?: (result: PokeAPI.PokemonForm, error?: any) => any): Promise<PokeAPI.PokemonForm>;\n        getPokemonFormByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PokemonForm[], error?: any) => any): Promise<PokeAPI.PokemonForm[]>;\n        getPokemonFormByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PokemonForm, error?: any) => any) & ((result: PokeAPI.PokemonForm[], error?: any) => any)): Promise<PokeAPI.PokemonForm | PokeAPI.PokemonForm[]>;\n        getPokemonHabitatByName(nameOrId: string | number, callback?: (result: PokeAPI.PokemonHabitat, error?: any) => any): Promise<PokeAPI.PokemonHabitat>;\n        getPokemonHabitatByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PokemonHabitat[], error?: any) => any): Promise<PokeAPI.PokemonHabitat[]>;\n        getPokemonHabitatByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PokemonHabitat, error?: any) => any) & ((result: PokeAPI.PokemonHabitat[], error?: any) => any)): Promise<PokeAPI.PokemonHabitat | PokeAPI.PokemonHabitat[]>;\n        getPokemonShapeByName(nameOrId: string | number, callback?: (result: PokeAPI.PokemonShape, error?: any) => any): Promise<PokeAPI.PokemonShape>;\n        getPokemonShapeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PokemonShape[], error?: any) => any): Promise<PokeAPI.PokemonShape[]>;\n        getPokemonShapeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PokemonShape, error?: any) => any) & ((result: PokeAPI.PokemonShape[], error?: any) => any)): Promise<PokeAPI.PokemonShape | PokeAPI.PokemonShape[]>;\n        getPokemonSpeciesByName(nameOrId: string | number, callback?: (result: PokeAPI.PokemonSpecies, error?: any) => any): Promise<PokeAPI.PokemonSpecies>;\n        getPokemonSpeciesByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.PokemonSpecies[], error?: any) => any): Promise<PokeAPI.PokemonSpecies[]>;\n        getPokemonSpeciesByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.PokemonSpecies, error?: any) => any) & ((result: PokeAPI.PokemonSpecies[], error?: any) => any)): Promise<PokeAPI.PokemonSpecies | PokeAPI.PokemonSpecies[]>;\n        getStatByName(nameOrId: string | number, callback?: (result: PokeAPI.Stat, error?: any) => any): Promise<PokeAPI.Stat>;\n        getStatByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Stat[], error?: any) => any): Promise<PokeAPI.Stat[]>;\n        getStatByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Stat, error?: any) => any) & ((result: PokeAPI.Stat[], error?: any) => any)): Promise<PokeAPI.Stat | PokeAPI.Stat[]>;\n        getTypeByName(nameOrId: string | number, callback?: (result: PokeAPI.Type, error?: any) => any): Promise<PokeAPI.Type>;\n        getTypeByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Type[], error?: any) => any): Promise<PokeAPI.Type[]>;\n        getTypeByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Type, error?: any) => any) & ((result: PokeAPI.Type[], error?: any) => any)): Promise<PokeAPI.Type | PokeAPI.Type[]>;\n        getLanguageByName(nameOrId: string | number, callback?: (result: PokeAPI.Language, error?: any) => any): Promise<PokeAPI.Language>;\n        getLanguageByName(nameOrId: Array<string | number>, callback?: (result: PokeAPI.Language[], error?: any) => any): Promise<PokeAPI.Language[]>;\n        getLanguageByName(nameOrId: string | number | Array<string | number>, callback?: ((result: PokeAPI.Language, error?: any) => any) & ((result: PokeAPI.Language[], error?: any) => any)): Promise<PokeAPI.Language | PokeAPI.Language[]>;\n        getBerriesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getBerriesFirmnessList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        /** @deprecated will be removed on a future version. Use {@link getBerriesFirmnessList} instead */\n        getBerriesFirmnesssList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getBerriesFlavorsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getContestTypesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getContestEffectsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.APIResourceList, error?: any) => any): Promise<PokeAPI.APIResourceList>;\n        getSuperContestEffectsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.APIResourceList, error?: any) => any): Promise<PokeAPI.APIResourceList>;\n        getEncounterMethodsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getEncounterConditionsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getEncounterConditionValuesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getEvolutionChainsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.APIResourceList, error?: any) => any): Promise<PokeAPI.APIResourceList>;\n        getEvolutionTriggersList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getGenerationsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        /** @deprecated will be removed on a future version. Use {@link getPokedexList} instead */\n        getPokedexsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokedexList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getVersionsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getVersionGroupsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getItemsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getItemAttributesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getItemCategoriesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getItemFlingEffectsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getItemPocketsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMachinesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.APIResourceList, error?: any) => any): Promise<PokeAPI.APIResourceList>;\n        getMovesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMoveAilmentsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMoveBattleStylesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMoveCategoriesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMoveDamageClassesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMoveLearnMethodsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getMoveTargetsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getLocationsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getLocationAreasList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPalParkAreasList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getRegionsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getAbilitiesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getCharacteristicsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.APIResourceList, error?: any) => any): Promise<PokeAPI.APIResourceList>;\n        getEggGroupsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getGendersList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getGrowthRatesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getNaturesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokeathlonStatsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokemonsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokemonColorsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokemonFormsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokemonHabitatsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokemonShapesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getPokemonSpeciesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getStatsList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getTypesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getLanguagesList(interval?: ListEndpointOptions, callback?: (result: PokeAPI.NamedAPIResourceList, error?: any) => any): Promise<PokeAPI.NamedAPIResourceList>;\n        getEndpointsList(interval?: ListEndpointOptions, callback?: (result: any, error?: any) => any): Promise<PokeAPI.EndpointsList>;\n    }\n\n    export = PokeAPI;\n}\n"
  }
]