pokenode-ts 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/lib/index.cjs +16 -1
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +1571 -1765
- package/lib/index.d.ts +1571 -1765
- package/lib/index.js +16 -1
- package/lib/index.js.map +1 -1
- package/lib/rolldown-runtime-C_bSAL1r.js +16 -0
- package/package.json +20 -3
- package/lib/rolldown-runtime-DK3Fl9T5.js +0 -1
package/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/constants/base.ts","../src/constants/berries.ts","../src/constants/contests.ts","../src/constants/currencies.ts","../src/constants/encounters.ts","../src/constants/endpoints.ts","../src/constants/evolutions.ts","../src/constants/games.ts","../src/constants/items.ts","../src/constants/locations.ts","../src/constants/moves.ts","../src/constants/pokemons.ts","../src/constants/utilities.ts","../src/constants/index.ts","../src/config/cache.ts","../src/config/errors.ts","../src/clients/base.ts","../src/clients/berry.client.ts","../src/clients/contest.client.ts","../src/clients/currency.client.ts","../src/clients/encounter.client.ts","../src/clients/evolution.client.ts","../src/clients/game.client.ts","../src/clients/item.client.ts","../src/clients/location.client.ts","../src/clients/machine.client.ts","../src/clients/move.client.ts","../src/clients/pokemon.client.ts","../src/clients/utility.client.ts","../src/clients/main.client.ts","../src/config/logger.ts"],"sourcesContent":["export const BASE_URL = {\n REST: \"https://pokeapi.co/api/v2\",\n} as const;\n","/** Enum of Berries (NAME - ID) */\nexport const BERRIES = {\n CHERI: 1,\n CHESTO: 2,\n PECHA: 3,\n RAWST: 4,\n ASPEAR: 5,\n LEPPA: 6,\n ORAN: 7,\n PERSIM: 8,\n LUM: 9,\n SITRUS: 10,\n FIGY: 11,\n WIKI: 12,\n MAGO: 13,\n AGUAV: 14,\n IAPAPA: 15,\n RAZZ: 16,\n BLUK: 17,\n NANAB: 18,\n WEPEAR: 19,\n PINAP: 20,\n POMEG: 21,\n KELPSY: 22,\n QUALOT: 23,\n HONDEW: 24,\n GREPA: 25,\n TAMATO: 26,\n CORNN: 27,\n MAGOST: 28,\n RABUTA: 29,\n NOMEL: 30,\n SPELON: 31,\n PAMTRE: 32,\n WATMEL: 33,\n DURIN: 34,\n BELUE: 35,\n OCCA: 36,\n PASSHO: 37,\n WACAN: 38,\n RINDO: 39,\n YACHE: 40,\n CHOPLE: 41,\n KEBIA: 42,\n SHUCA: 43,\n COBA: 44,\n PAYAPA: 45,\n TANGA: 46,\n CHARTI: 47,\n KASIB: 48,\n HABAN: 49,\n COLBUR: 50,\n BABIRI: 51,\n CHILAN: 52,\n LIECHI: 53,\n GANLON: 54,\n SALAC: 55,\n PETAYA: 56,\n APICOT: 57,\n LANSAT: 58,\n STARF: 59,\n ENIGMA: 60,\n MICLE: 61,\n CUSTAP: 62,\n JABOCA: 63,\n ROWAP: 64,\n} as const;\n\n/** Enum of Berry Firmnesses (NAME - ID) */\nexport const BERRY_FIRMNESSES = {\n VERY_SOFT: 1,\n SOFT: 2,\n HARD: 3,\n VERY_HARD: 4,\n SUPER_HARD: 5,\n} as const;\n\nexport const BERRY_FLAVORS = {\n SPICY: 1,\n DRY: 2,\n SWEET: 3,\n BITTER: 4,\n SOUR: 5,\n} as const;\n","export const CONTEST_TYPES = {\n COOL: 1,\n BEAUTY: 2,\n CUTE: 3,\n SMART: 4,\n TOUGH: 5,\n} as const;\n","export const CURRENCIES = {\n POKE_DOLLAR: 1,\n COIN: 2,\n VOLCANIC_ASH: 3,\n POKE_COUPON: 4,\n BERRY_POWDER: 5,\n BATTLE_POINT: 6,\n SPHERE: 7,\n CASTLE_POINT: 8,\n WATT: 9,\n ATHLETE_POINT: 10,\n DREAM_POINT: 11,\n DREAM_WORLD_BERRY: 12,\n POKE_MILE: 13,\n FESTIVAL_COIN: 14,\n POKE_BEAN: 15,\n HOME_POINT: 16,\n MERIT_POINT: 17,\n LEAGUE_POINT: 18,\n BLUEBERRY_POINT: 19,\n} as const;\n","export const ENCOUNTER_METHODS = {\n WALK: 1,\n OLD_ROD: 2,\n GOOD_ROD: 3,\n SUPER_ROD: 4,\n SURF: 5,\n ROCK_SMASH: 6,\n HEADBUTT: 7,\n DARK_GRASS: 8,\n GRASS_SPOTS: 9,\n CAVE_SPOTS: 10,\n BRIDGE_SPOTS: 11,\n SUPER_ROD_SPOTS: 12,\n SURF_SPOTS: 13,\n YELLOW_FLOWERS: 14,\n PURPLE_FLOWERS: 15,\n RED_FLOWERS: 16,\n ROUGH_TERRAIN: 17,\n GIFT: 18,\n GIFT_EGG: 19,\n ONLY_ONE: 20,\n POKEFLUTE: 21,\n HEADBUTT_LOW: 22,\n HEADBUTT_NORMAL: 23,\n HEADBUT_HIGH: 24,\n SQUIRT_BOTTLE: 25,\n WAILMER_PAIL: 26,\n SEAWEED: 27,\n} as const;\n\nexport const ENCOUNTER_CONDITIONS = {\n SWARM: 1,\n TIME: 2,\n RADAR: 3,\n SLOT2: 4,\n RADIO: 5,\n SEASON: 6,\n STARTER: 7,\n TV_OPTION: 8,\n STORY_PROGRESS: 9,\n OTHER: 10,\n} as const;\n\nexport const ENCOUNTER_CONDITION_VALUES = {\n SWARM_YES: 1,\n SWARM_NO: 2,\n TIME_MORNING: 3,\n TIME_DAY: 4,\n TIME_NIGHT: 5,\n RADAR_ON: 6,\n RADAR_OFF: 7,\n SLOT2_NONE: 8,\n SLOT2_RUBY: 9,\n SLOT2_SAPHIRE: 10,\n SLOT2_EMERALD: 11,\n SLOT2_FIRERED: 12,\n SLOT2_LEAFGREEN: 13,\n RADIO_OFF: 14,\n RADIO_HOEN: 15,\n RADIO_SINNOH: 16,\n SEASON_SPRING: 17,\n SEASON_SUMMER: 18,\n SWASON_AUTUMN: 19,\n SEASON_WINTER: 20,\n STARTER_BULBASAUR: 21,\n STARTER_SQUIRTLE: 22,\n STARTER_CHARMANDER: 23,\n STARTER_CHESPIN: 24,\n STARTER_FENNEKIN: 25,\n STARTER_FROAKIE: 26,\n TV_OPTION_BLUE: 27,\n TV_OPTION_RED: 28,\n STORY_PROGRESS_AWAKENED_BEASTS: 29,\n STORY_PROGRESS_BEAT_GALACTIC_CORONET: 30,\n STORY_PROGRESS_OAK_ETERNA_CITY: 31,\n STORY_PROGRESS_OAK_VERMILION_COPYCAT: 32,\n STORY_PROGRESS_MET_TORNADUS_THUNDURUS: 33,\n STORY_PROGRESS_BEAT_ELITE_FOUR_ROUND_TWO: 34,\n STORY_PROGRESS_HALL_OF_FAME: 35,\n STORY_PROGRESS_NONE: 36,\n STORY_PROGRESS_NATIONAL_DEX: 37,\n OTHER_NONE: 38,\n OTHER_SNORLAX_LL_BEAT_LEAGUE: 39,\n} as const;\n","/**\n * Endpoints of the PokéAPI\n */\nexport const ENDPOINTS = {\n BERRY: \"/berry\",\n BERRY_FIRMNESS: \"/berry-firmness\",\n BERRY_FLAVOR: \"/berry-flavor\",\n CONTEST_TYPE: \"/contest-type\",\n CONTEST_EFFECT: \"/contest-effect\",\n SUPER_CONTEST_EFFECT: \"/super-contest-effect\",\n CURRENCY: \"/currency\",\n ENCOUNTER_METHOD: \"/encounter-method\",\n ENCOUNTER_CONDITION: \"/encounter-condition\",\n ENCOUNTER_CONDITION_VALUE: \"/encounter-condition-value\",\n EVOLUTION_CHAIN: \"/evolution-chain\",\n EVOLUTION_TRIGGER: \"/evolution-trigger\",\n GENERATION: \"/generation\",\n POKEDEX: \"/pokedex\",\n VERSION: \"/version\",\n VERSION_GROUP: \"/version-group\",\n ITEM: \"/item\",\n ITEM_ATTRIBUTE: \"/item-attribute\",\n ITEM_CATEGORY: \"/item-category\",\n ITEM_FLING_EFFECT: \"/item-fling-effect\",\n ITEM_POCKET: \"/item-pocket\",\n LOCATION: \"/location\",\n LOCATION_AREA: \"/location-area\",\n PALPARK_AREA: \"/pal-park-area\",\n REGION: \"/region\",\n MACHINE: \"/machine\",\n MOVE: \"/move\",\n MOVE_AILMENT: \"/move-ailment\",\n MOVE_BATTLE_STYLE: \"/move-battle-style\",\n MOVE_CATEGORY: \"/move-category\",\n MOVE_DAMAGE_CLASS: \"/move-damage-class\",\n MOVE_LEARN_METHOD: \"/move-learn-method\",\n MOVE_TARGET: \"/move-target\",\n ABILITY: \"/ability\",\n CHARACTERISTIC: \"/characteristic\",\n EGG_GROUP: \"/egg-group\",\n GENDER: \"/gender\",\n GROWTH_RATE: \"/growth-rate\",\n NATURE: \"/nature\",\n POKEATHLON_STAT: \"/pokeathlon-stat\",\n POKEMON: \"/pokemon\",\n POKEMON_COLOR: \"/pokemon-color\",\n POKEMON_FORM: \"/pokemon-form\",\n POKEMON_HABITAT: \"/pokemon-habitat\",\n POKEMON_SHAPE: \"/pokemon-shape\",\n POKEMON_SPECIES: \"/pokemon-species\",\n STAT: \"/stat\",\n TYPE: \"/type\",\n LANGUAGE: \"/language\",\n} as const;\n\ntype ObjectValue<T> = T[keyof T];\nexport type Endpoint = ObjectValue<typeof ENDPOINTS>;\n","export const EVOLUTION_TRIGGERS = {\n LEVEL_UP: 1,\n TRADE: 2,\n USE_ITEM: 3,\n SHED: 4,\n SPIN: 5,\n TOWER_OF_DARKNESS: 6,\n TOWER_OF_WATER: 7,\n THREE_CRITICAL_HITS: 8,\n TAKE_DAMAGE: 9,\n OTHER: 10,\n} as const;\n","export const GENERATIONS = {\n GENERATION_I: 1,\n GENERATION_II: 2,\n GENERATION_III: 3,\n GENERATION_IV: 4,\n GENERATION_V: 5,\n GENERATION_VI: 6,\n GENERATION_VII: 7,\n GENERATION_VIII: 8,\n} as const;\n\nexport const POKEDEXES = {\n NATIONAL: 1,\n KANTO: 2,\n ORIGINAL_JOHTO: 3,\n HOENN: 4,\n ORIGINAL_SINNOH: 5,\n EXTENDED_SINNOH: 6,\n UPDATED_JOHTO: 7,\n ORIGINAL_UNOVA: 8,\n UPDATED_UNOVA: 9,\n CONQUEST_GALLERY: 11,\n KALOS_CENTRAL: 12,\n KALOS_COASTAL: 13,\n KALOS_MONTAIN: 14,\n UPDATED_HOENN: 15,\n ORIGINAL_ALOLA: 16,\n ORIGINAL_MELEMELE: 17,\n ORIGINAL_AKALA: 18,\n ORIGINAL_ULAULA: 19,\n ORIGINAL_PONI: 20,\n UPDATED_ALOLA: 21,\n UPDATED_MELEMELE: 22,\n UPDATED_AKALA: 23,\n UPDATED_ULAULA: 24,\n UPDATED_PONI: 25,\n UPDATED_KANTO: 26,\n GALAR: 27,\n ISLE_OF_ARMOR: 28,\n CROWN_TUNDRA: 29,\n} as const;\n\nexport const VERSIONS = {\n RED: 1,\n BLUE: 2,\n YELLOW: 3,\n GOLD: 4,\n SILVER: 5,\n CRYSTAL: 6,\n RUBY: 7,\n SAPPHIRE: 8,\n EMERALD: 9,\n FIRERED: 10,\n LEAFGREEN: 11,\n DIAMOND: 12,\n PEARL: 13,\n PLATINUM: 14,\n HEARTGOLD: 15,\n SOULSILVER: 16,\n BLACK: 17,\n WHITE: 18,\n COLOSSEUM: 19,\n XD: 20,\n BLACK_2: 21,\n WHITE_2: 22,\n X: 23,\n Y: 24,\n OMEGA_RUBY: 25,\n ALPHA_SAPPHIRE: 26,\n SUN: 27,\n MOON: 28,\n ULTRA_SUN: 29,\n ULTRA_MOON: 30,\n LETS_GO_PIKACHU: 31,\n LETS_GO_EEVEE: 32,\n SWORD: 33,\n SHIELD: 34,\n THE_ISLE_OF_ARMOR: 35,\n THE_CROWN_TUNDRA: 36,\n BRILLIANT_DIAMOND: 37,\n SHINING_PEARL: 38,\n LEGENDS_ARCEUS: 39,\n} as const;\n\nexport const VERSION_GROUPS = {\n RED_BLUE: 1,\n YELLOW: 2,\n GOLD_SILVER: 3,\n CRYSTAL: 4,\n RUBY_SAPPHIRE: 5,\n EMERALD: 6,\n FIRERED_LEAFGREEN: 7,\n DIAMOND_PEARL: 8,\n PLATINUM: 9,\n HEARTGOLD_SOULSILVER: 10,\n BLACK_WHITE: 11,\n COLOSSEUM: 12,\n XD: 13,\n BLACK_2_WHITE_2: 14,\n X_Y: 15,\n OMEGA_RUBY_ALPHA_SAPPHIRE: 16,\n SUN_MOON: 17,\n ULTRA_SUN_ULTRA_MOON: 18,\n LETS_GO: 19,\n SWORD_SHIELD: 20,\n THE_ISLE_OF_ARMOR: 21,\n THE_CROWN_TUNDRA: 22,\n BRILLIANT_DIAMOND_AND_SHINING_PEARL: 23,\n LEGENDS_ARCEUS: 24,\n} as const;\n","export const ITEM_ATTRIBUTES = {\n COUNTABLE: 1,\n CONSUMABLE: 2,\n USABLE_OVERWORLD: 3,\n USABLE_IN_BATTLE: 4,\n HOLDABLE: 5,\n HOLDABLE_PASSIVE: 6,\n HOLDABLE_ACTIVE: 7,\n UNDERGROUND: 8,\n} as const;\n\nexport const ITEM_CATEGORIES = {\n STAT_BOOSTS: 1,\n EFFORT_DROP: 2,\n MEDICINE: 3,\n OTHER: 4,\n IN_A_PINCH: 5,\n PICKY_HEALING: 6,\n TYPE_PROTECTION: 7,\n BAKING_ONLY: 8,\n COLLECTIBLES: 9,\n EVOLUTION: 10,\n SPELUNKING: 11,\n HELD_ITEMS: 12,\n CHOICE: 13,\n EFFORT_TRAINING: 14,\n BAD_HELD_ITEMS: 15,\n TRAINING: 16,\n PLATES: 17,\n SPECIES_SPECIFIC: 18,\n TYPE_ENHANCEMENT: 19,\n EVENT_ITEMS: 20,\n GAMEPLAY: 21,\n PLOT_ADVANCEMENT: 22,\n UNUSED: 23,\n LOOT: 24,\n ALL_MAIL: 25,\n VITAMINS: 26,\n HEALING: 27,\n PP_RECOVERY: 28,\n REVIVAL: 29,\n STATUS_CURES: 30,\n MULCH: 32,\n SPECIAL_BALLS: 33,\n STANDARD_BALLS: 34,\n DEX_COMPLETION: 35,\n SCARVES: 36,\n ALL_MACHINES: 37,\n FLUTES: 38,\n APRICORN_BALLS: 39,\n APRICORN_BOX: 40,\n DATA_CARDS: 41,\n JEWELS: 42,\n MIRACLE_SHOOTER: 43,\n MEGA_STONES: 44,\n MEMORIES: 45,\n Z_CRYSTALS: 46,\n SPECIES_CANDIES: 47,\n CATCHING_BONUS: 48,\n DYNAMAX_CRISTALS: 49,\n NATURE_MINTS: 50,\n CURRY_INGREDIENTS: 51,\n} as const;\n\nexport const ITEM_FLING_EFFECTS = {\n BADLY_POISON: 1,\n BURN: 2,\n BERRY_EFFECT: 3,\n HERB_EFFECT: 4,\n PARALYZE: 5,\n POISON: 6,\n FLINCH: 7,\n} as const;\n\nexport const ITEM_POCKETS = {\n MISC: 1,\n MEDICINE: 2,\n POKEBALLS: 3,\n MACHINES: 4,\n BERRIES: 5,\n MAIL: 6,\n BATTLE: 7,\n KEY: 8,\n} as const;\n","export const REGIONS = {\n KANTO: 1,\n JOHTO: 2,\n HOENN: 3,\n SINNOH: 4,\n UNOVA: 5,\n KALOS: 6,\n ALOLA: 7,\n GALAR: 8,\n HISUI: 9,\n} as const;\n\nexport const PAL_PARK_AREAS = {\n FOREST: 1,\n FIELD: 2,\n MOUNTAIN: 3,\n POND: 4,\n SEA: 5,\n} as const;\n","export const MOVE_AILMENTS = {\n UNKNOWN: -1,\n NONE: 0,\n PARALYSIS: 1,\n SLEEP: 2,\n FREEZE: 3,\n BURN: 4,\n POISON: 5,\n CONFUSION: 6,\n INFATUATION: 7,\n TRAP: 8,\n NIGHTMARE: 9,\n TORMENT: 12,\n DISABLE: 13,\n YAWN: 14,\n HEAL_BLOCK: 15,\n NO_TYPE_IMMUNITY: 17,\n LEECH_SEED: 18,\n EMBARGO: 19,\n PERISH_SONG: 20,\n INGRAIN: 21,\n SILENCE: 24,\n TAR_SHOT: 42,\n} as const;\n\nexport const MOVE_BATTLE_STYLES = {\n ATTACK: 1,\n DEFENSE: 2,\n SUPPORT: 3,\n} as const;\n\nexport const MOVE_CATEGORIES = {\n DAMAGE: 0,\n AILMENT: 1,\n NET_GOOD_STATS: 2,\n HEAL: 3,\n DAMAGE_AILMENT: 4,\n SWAGGER: 5,\n DAMAGE_LOWER: 6,\n DAMAGE_RAISE: 7,\n DAMAGE_HEAL: 8,\n OHKO: 9,\n WHOLE_FIELD_EFFECT: 10,\n FIELD_EFFECT: 11,\n FORCE_SWITCH: 12,\n UNIQUE: 13,\n} as const;\n\nexport const MOVE_DAMAGE_CLASSES = {\n STATUS: 1,\n PHYSICAL: 2,\n SPECIAL: 3,\n} as const;\n\nexport const MOVE_LEARN_METHODS = {\n LEVEL_UP: 1,\n EGG: 2,\n TUTOR: 3,\n MACHINE: 4,\n STADIUM_SURFING_PIKACHU: 5,\n LIGHT_BALL_EGG: 6,\n COLOSSEUM_PURIFICATION: 7,\n XD_SHADOW: 8,\n XD_PURIFICATION: 9,\n FORM_CHANGE: 10,\n} as const;\n\nexport const MOVE_TARGETS = {\n SPECIFIC_MOVE: 1,\n SELECTED_POKEMON_ME_FIRST: 2,\n ALLY: 3,\n USERS_FIELD: 4,\n USER_OR_ALLY: 5,\n OPPONENTS_FIELD: 6,\n USER: 7,\n RANDOM_OPPONENT: 8,\n ALL_OTHER_POKEMON: 9,\n SELECTED_POKEMON: 10,\n ALL_OPPONENTS: 11,\n ENTIRE_FIELD: 12,\n USER_AND_ALIES: 13,\n ALL_POKEMON: 14,\n ALL_ALLIES: 15,\n} as const;\n","export const EGG_GROUPS = {\n MONSTER: 1,\n WATER1: 2,\n BUG: 3,\n FLYING: 4,\n GROUND: 5,\n FAIRY: 6,\n PLANT: 7,\n HUMANSHAPE: 8,\n WATER3: 9,\n MINERAL: 10,\n INDETERMINATE: 11,\n WATER2: 12,\n DITTO: 13,\n DRAGON: 14,\n NO_EGGS: 15,\n} as const;\n\nexport const GENDERS = {\n FEMALE: 1,\n MALE: 2,\n GENDERLESS: 3,\n} as const;\n\nexport const GROWTH_RATES = {\n SLOW: 1,\n MEDIUM: 2,\n FAST: 3,\n MEDIUM_SLOW: 4,\n SLOW_THEN_VERY_FAST: 5,\n FAST_THEN_VERY_SLOW: 6,\n} as const;\n\nexport const NATURES = {\n HARDY: 1,\n BOLD: 2,\n MODEST: 3,\n CALM: 4,\n TIMID: 5,\n LONELY: 6,\n DOCILE: 7,\n MILD: 8,\n GENTLE: 9,\n HASTY: 10,\n ADAMANT: 11,\n IMPISH: 12,\n BASHFUL: 13,\n CAREFUL: 14,\n RASH: 15,\n JOLLY: 16,\n NAUGHTY: 17,\n LAX: 18,\n QUIRKY: 19,\n NAIVE: 20,\n BRAVE: 21,\n RELAXED: 22,\n QUIET: 23,\n SASSY: 24,\n SERIOUS: 25,\n} as const;\n\nexport const POKEATHLON_STATS = {\n SPEED: 1,\n POWER: 2,\n SKILL: 3,\n STAMINA: 4,\n JUMP: 5,\n} as const;\n\nexport const POKEMON_COLORS = {\n BLACK: 1,\n BLUE: 2,\n BROWN: 3,\n GRAY: 4,\n GREEN: 5,\n PINK: 6,\n PURPLE: 7,\n RED: 8,\n WHITE: 9,\n YELLOW: 10,\n} as const;\n\nexport const POKEMON_HABITATS = {\n CAVE: 1,\n FOREST: 2,\n GRASSLAND: 3,\n MONTAIN: 4,\n RARE: 5,\n ROUGH_TERRAIN: 6,\n SEA: 7,\n URBAN: 8,\n WATERS_EDGE: 9,\n} as const;\n\nexport const POKEMON_SHAPES = {\n BALL: 1,\n SQUIGGLE: 2,\n FISH: 3,\n ARMS: 4,\n BLOB: 5,\n UPRIGHT: 6,\n LEGS: 7,\n QUADRUPED: 8,\n WINGS: 9,\n TENTACLES: 10,\n HEADS: 11,\n HUMANOID: 12,\n BUG_WINGS: 13,\n ARMOR: 14,\n} as const;\n\nexport const STATS = {\n HP: 1,\n ATTACK: 2,\n DEFENSE: 3,\n SPECIAL_ATTACK: 4,\n SPECIAL_DEFENSE: 5,\n SPEED: 6,\n ACCURACY: 7,\n EVASION: 8,\n} as const;\n\nexport const TYPES = {\n NORMAL: 1,\n FIGHTING: 2,\n FLYING: 3,\n POISON: 4,\n GROUND: 5,\n ROCK: 6,\n BUG: 7,\n GHOST: 8,\n STEEL: 9,\n FIRE: 10,\n WATER: 11,\n GRASS: 12,\n ELECTRIC: 13,\n PSYCHIC: 14,\n ICE: 15,\n DRAGON: 16,\n DARK: 17,\n FAIRY: 18,\n UNKNOWN: 10_001,\n SHADOW: 10_002,\n} as const;\n","export const LANGUAGES = {\n JA_HRKT: 1,\n JA_ROMA: 2,\n KO: 3,\n ZH_HANT: 4,\n FR: 5,\n DE: 6,\n ES: 7,\n IT: 8,\n EN: 9,\n CS: 10,\n JA: 11,\n ZH_HANS: 12,\n PT_BR: 13,\n} as const;\n","export * from \"./base\";\nexport * from \"./berries\";\nexport * from \"./contests\";\nexport * from \"./currencies\";\nexport * from \"./encounters\";\nexport * from \"./endpoints\";\nexport * from \"./evolutions\";\nexport * from \"./games\";\nexport * from \"./items\";\nexport * from \"./locations\";\nexport * from \"./moves\";\nexport * from \"./pokemons\";\nexport * from \"./utilities\";\n","/** Five minutes. */\nconst DEFAULT_TTL = 300_000;\nconst DEFAULT_MAX_ENTRIES = 500;\n\n/**\n * ## Cache Store\n * The contract a client uses to cache responses, keyed by request URL.\n *\n * Every method may return a promise, so remote backends (Redis, KV stores) work\n * as-is. Values cross this boundary as parsed objects; expiry is the store's own\n * business.\n */\nexport interface CacheStore {\n get(key: string): unknown | Promise<unknown>;\n set(key: string, value: unknown): void | Promise<void>;\n delete?(key: string): void | Promise<void>;\n clear?(): void | Promise<void>;\n}\n\n/**\n * ## Memory Cache Options\n * Used to configure the default in-memory store.\n */\nexport interface MemoryCacheOptions {\n /** How long a cached response stays fresh, in milliseconds. Defaults to 5 minutes. */\n ttl?: number;\n /** Maximum number of responses kept. The least recently used entry is evicted. Defaults to 500. */\n maxEntries?: number;\n}\n\ninterface CacheEntry {\n value: unknown;\n expiresAt: number;\n}\n\n/**\n * ## Memory Cache\n * The default {@link CacheStore}: a bounded, time-to-live cache held in memory.\n *\n * Values are stored and returned by reference — mutating a response also mutates\n * what later cache hits return, so treat responses as read-only.\n */\nexport class MemoryCache implements CacheStore {\n private readonly entries = new Map<string, CacheEntry>();\n private readonly ttl: number;\n private readonly maxEntries: number;\n\n constructor(options?: MemoryCacheOptions) {\n this.ttl = options?.ttl ?? DEFAULT_TTL;\n this.maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;\n }\n\n get(key: string): unknown {\n const entry = this.entries.get(key);\n\n if (!entry) {\n return undefined;\n }\n\n if (entry.expiresAt <= Date.now()) {\n this.entries.delete(key);\n return undefined;\n }\n\n // Re-insert so `entries` stays ordered least- to most-recently used.\n this.entries.delete(key);\n this.entries.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: unknown): void {\n // Delete first so an update moves the key to the most-recently-used end.\n this.entries.delete(key);\n\n if (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next();\n if (!oldest.done) {\n this.entries.delete(oldest.value);\n }\n }\n\n this.entries.set(key, { value, expiresAt: Date.now() + this.ttl });\n }\n\n delete(key: string): void {\n this.entries.delete(key);\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n","/**\n * Brands the error, so the guard can match on it instead of the prototype chain:\n * a tree loading both the ESM and the CJS build has two distinct classes.\n */\nconst ERROR_KIND = \"pokenode:http\";\n\n/**\n * ## Pokenode Error\n * Thrown when the PokéAPI answers with a non-2xx status. Transport failures are\n * not wrapped — the native error propagates untouched.\n */\nexport class PokenodeError extends Error {\n override readonly name = \"PokenodeError\";\n readonly kind = ERROR_KIND;\n\n /** HTTP status code of the response. */\n readonly status: number;\n /** HTTP status text of the response. */\n readonly statusText: string;\n /** URL that produced the error. */\n readonly url: string;\n /** Parsed response body, when the error response carried JSON. */\n readonly body: unknown;\n\n constructor(response: Response, body: unknown) {\n super(`Request to ${response.url} failed with status ${response.status}`);\n\n this.status = response.status;\n this.statusText = response.statusText;\n this.url = response.url;\n this.body = body;\n }\n\n /** Whether the error came from a pokenode-ts client. */\n static isPokenodeError(error: unknown): error is PokenodeError {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"kind\" in error &&\n (error as { kind: unknown }).kind === ERROR_KIND\n );\n }\n}\n\n/**\n * Builds a {@link PokenodeError} from a failed response, reading the body when\n * it is JSON. The PokéAPI answers 404s with plain text, so a parse failure is\n * expected and leaves `body` undefined.\n */\nexport const toPokenodeError = async (response: Response): Promise<PokenodeError> => {\n let body: unknown;\n\n try {\n body = await response.json();\n } catch {\n body = undefined;\n }\n\n return new PokenodeError(response, body);\n};\n","import { type CacheStore, MemoryCache } from \"../config/cache\";\nimport { toPokenodeError } from \"../config/errors\";\nimport type { Logger } from \"../config/logger\";\nimport { BASE_URL, type Endpoint } from \"../constants\";\nimport type { NamedAPIResourceList } from \"../models/Common/resource\";\n\nconst trimTrailingSlash = (url: string): string => url.replace(/\\/+$/, \"\");\n\n/**\n * Drops the trailing slash from a request URL, leaving any query string alone.\n *\n * Both call paths must produce one cache key: `getResource` builds `/berry/1`,\n * while the PokéAPI's own links end in a slash.\n */\nconst normalizeURL = (url: string): string => url.replace(/\\/+(?=\\?|$)/, \"\");\n\n/** A path segment naming an API version, as in `/api/v2/berry/1`. */\nconst API_VERSION_SEGMENT = /^v\\d+$/;\n\n/**\n * Reduces an absolute resource URL to the endpoint path to request.\n *\n * When the URL belongs to `baseURL`, the path is simply what follows it.\n * Otherwise — a link from pokeapi.co handed to a client aimed at a self-hosted\n * instance — the path after the API version segment is used, so the resource is\n * re-resolved against the client's own base rather than fetched from elsewhere.\n *\n * The version segment is matched on parsed URL components: a raw-string search\n * also matches a host like `api.v2.example.com`.\n */\nconst toEndpointPath = (resourceURL: string, baseURL: string): string => {\n const resource = new URL(resourceURL);\n const base = new URL(baseURL);\n const basePath = trimTrailingSlash(base.pathname);\n\n if (\n resource.origin === base.origin &&\n (resource.pathname === basePath || resource.pathname.startsWith(`${basePath}/`))\n ) {\n return `${resource.pathname.slice(basePath.length)}${resource.search}`;\n }\n\n const segments = resource.pathname.split(\"/\");\n const version = segments.findIndex((segment) => API_VERSION_SEGMENT.test(segment));\n\n if (version === -1) {\n throw new TypeError(`Cannot resolve \"${resourceURL}\" against the base URL \"${baseURL}\"`);\n }\n\n return `/${segments.slice(version + 1).join(\"/\")}${resource.search}`;\n};\n\n/**\n * ## Fetch Like\n * A `fetch` implementation taking a string URL, as every client call does.\n */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/**\n * ## Client Options\n * Optional configuration accepted by every client.\n */\nexport interface ClientOptions {\n /**\n * Where the request lifecycle is reported. Leave empty to log nothing, or pass\n * {@link consoleLogger} to write it to the console.\n */\n logger?: Logger;\n /**\n * Response cache. Leave empty for an in-memory {@link MemoryCache}, pass `false`\n * to disable caching, or supply your own {@link CacheStore}.\n */\n cache?: CacheStore | false;\n /** Location of the PokéAPI. Leave empty to use the official PokéAPI instance. */\n baseURL?: string;\n /**\n * Custom `fetch` implementation, for proxies, retries, cancellation or\n * instrumentation. Defaults to the global `fetch`.\n *\n * Requests carry no timeout of their own: supply an `AbortSignal` here if you\n * want one.\n */\n fetch?: FetchLike;\n}\n\n/**\n * ## Base Client\n * Base class for every section client. Handles requests to the PokéAPI, along\n * with caching and logging.\n */\nexport class BaseClient {\n /** The store backing this client, or `undefined` when caching is disabled. */\n public readonly cache: CacheStore | undefined;\n\n private readonly baseURL: string;\n private readonly logger: Logger | undefined;\n private readonly fetch: FetchLike;\n /** Requests already on the wire, so concurrent callers share one round trip. */\n private readonly inFlight = new Map<string, Promise<unknown>>();\n\n constructor(clientOptions?: ClientOptions) {\n this.baseURL = trimTrailingSlash(clientOptions?.baseURL ?? BASE_URL.REST);\n this.cache =\n clientOptions?.cache === false ? undefined : (clientOptions?.cache ?? new MemoryCache());\n this.logger = clientOptions?.logger;\n this.fetch = clientOptions?.fetch ?? ((input, init) => globalThis.fetch(input, init));\n }\n\n /**\n * Drops every cached response. A {@link CacheStore} that does not implement\n * `clear` is left alone.\n */\n public async clearCache(): Promise<void> {\n await this.cache?.clear?.();\n }\n\n /**\n * Resolves a resource through the cache, then through any identical request\n * already in flight, and only then over the network.\n *\n * The URL is joined by concatenation: `new URL(path, base)` would discard the\n * base's own `/api/v2` path.\n */\n private async request<T>(path: string, baseURL = this.baseURL): Promise<T> {\n const url = normalizeURL(\n `${trimTrailingSlash(baseURL)}${path.startsWith(\"/\") ? path : `/${path}`}`,\n );\n\n this.logger?.request(\"get\", url);\n\n const cached = await this.cache?.get(url);\n\n if (cached !== undefined) {\n this.logger?.response(200, true);\n return cached as T;\n }\n\n const pending = this.inFlight.get(url);\n\n if (pending) {\n return pending as Promise<T>;\n }\n\n const request = this.fetchResource<T>(url).finally(() => this.inFlight.delete(url));\n\n this.inFlight.set(url, request);\n\n return request;\n }\n\n private async fetchResource<T>(url: string): Promise<T> {\n try {\n const response = await this.fetch(url, { headers: { Accept: \"application/json\" } });\n\n if (!response.ok) {\n throw await toPokenodeError(response);\n }\n\n const data = (await response.json()) as T;\n\n this.logger?.response(response.status, false);\n\n await this.cache?.set(url, data);\n\n return data;\n } catch (error) {\n this.logger?.error(error);\n throw error;\n }\n }\n\n /**\n * Retrieves a single resource from the PokéAPI by its endpoint and identifier.\n *\n * @template T - The type of the resource to be returned.\n * @param endpoint - The endpoint of the resource.\n * @param identifier - The identifier of the resource, or a path below the endpoint.\n * Omit it to address the endpoint itself.\n * @returns A promise that resolves to the requested resource.\n */\n protected async getResource<T>(endpoint: Endpoint, identifier?: string | number): Promise<T> {\n return this.request<T>(identifier === undefined ? endpoint : `${endpoint}/${identifier}`);\n }\n\n /**\n * Retrieves a resource by its URL.\n *\n * @template T - The type of the resource to be returned.\n * @param url - The URL of the resource.\n * @param baseURL - The base URL to use. Defaults to the one the client was built with.\n * @returns A promise that resolves to the requested resource.\n * @throws {TypeError} If `url` is not a valid URL, or names no endpoint under `baseURL`.\n */\n protected async getResourceByURL<T>(url: string, baseURL = this.baseURL): Promise<T> {\n return this.request<T>(toEndpointPath(url, baseURL), baseURL);\n }\n\n /**\n * Retrieves a list of resources from the PokéAPI with pagination support.\n *\n * @param endpoint - The endpoint of the resource.\n * @param offset - The offset for pagination. Defaults to 0.\n * @param limit - The limit for pagination. Defaults to 20.\n * @returns A promise that resolves to a list of named API resources.\n */\n protected async getListResource(\n endpoint: Endpoint,\n offset = 0,\n limit = 20,\n ): Promise<NamedAPIResourceList> {\n const query = new URLSearchParams({ offset: String(offset), limit: String(limit) });\n return this.request<NamedAPIResourceList>(`${endpoint}?${query}`);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Berry, BerryFirmness, BerryFlavor, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Berry Client\n *\n * Client used to access the Berry Endpoints:\n * - [Berries](https://pokeapi.co/docs/v2#berries)\n * - [Berry Firmnesses](https://pokeapi.co/docs/v2#berry-firmnesses)\n * - [Berry Flavors](https://pokeapi.co/docs/v2#berry-flavors)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#berries-section)\n */\nexport class BerryClient extends BaseClient {\n /**\n * Get a Berry by its name.\n * @param name The Berry name.\n * @returns The matching Berry.\n */\n public async getBerryByName(name: string): Promise<Berry> {\n return this.getResource(ENDPOINTS.BERRY, name);\n }\n\n /**\n * Get a Berry by its ID.\n * @param id The Berry ID.\n * @returns The matching Berry.\n */\n public async getBerryById(id: number): Promise<Berry> {\n return this.getResource(ENDPOINTS.BERRY, id);\n }\n\n /**\n * Get a Berry Firmness by its ID.\n * @param id The Berry Firmness ID.\n * @returns The matching Berry Firmness.\n */\n public async getBerryFirmnessById(id: number): Promise<BerryFirmness> {\n return this.getResource(ENDPOINTS.BERRY_FIRMNESS, id);\n }\n\n /**\n * Get a Berry Firmness by its name.\n * @param name The Berry Firmness name.\n * @returns The matching Berry Firmness.\n */\n public async getBerryFirmnessByName(name: string): Promise<BerryFirmness> {\n return this.getResource(ENDPOINTS.BERRY_FIRMNESS, name);\n }\n\n /**\n * Get a Berry Flavor by its ID.\n *\n * Flavors determine whether a Pokémon benefits or suffers from eating a berry,\n * based on its nature. See\n * [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Flavor) for greater detail.\n * @param id The Berry Flavor ID.\n * @returns The matching Berry Flavor.\n */\n public async getBerryFlavorById(id: number): Promise<BerryFlavor> {\n return this.getResource(ENDPOINTS.BERRY_FLAVOR, id);\n }\n\n /**\n * Get a Berry Flavor by its name.\n *\n * Flavors determine whether a Pokémon benefits or suffers from eating a berry,\n * based on its nature. See\n * [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Flavor) for greater detail.\n * @param name The Berry Flavor name.\n * @returns The matching Berry Flavor.\n */\n public async getBerryFlavorByName(name: string): Promise<BerryFlavor> {\n return this.getResource(ENDPOINTS.BERRY_FLAVOR, name);\n }\n\n /**\n * List Berries.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Berries.\n */\n public async listBerries(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.BERRY, offset, limit);\n }\n\n /**\n * List Berry Firmnesses.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Berry Firmnesses.\n */\n public async listBerryFirmnesses(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.BERRY_FIRMNESS, offset, limit);\n }\n\n /**\n * List Berry Flavors.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Berry Flavors.\n */\n public async listBerryFlavors(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.BERRY_FLAVOR, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { ContestEffect, ContestType, NamedAPIResourceList, SuperContestEffect } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Contest Client\n *\n * Client used to access the Contest Endpoints:\n * - [Contest Types](https://pokeapi.co/docs/v2#contest-types)\n * - [Contest Effects](https://pokeapi.co/docs/v2#contest-effects)\n * - [Super Contest Effects](https://pokeapi.co/docs/v2#super-contest-effects)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#contests-section)\n */\nexport class ContestClient extends BaseClient {\n /**\n * Get a Contest Type by its name.\n * @param name The Contest Type name.\n * @returns The matching Contest Type.\n */\n public async getContestTypeByName(name: string): Promise<ContestType> {\n return this.getResource(ENDPOINTS.CONTEST_TYPE, name);\n }\n\n /**\n * Get a Contest Type by its ID.\n * @param id The Contest Type ID.\n * @returns The matching Contest Type.\n */\n public async getContestTypeById(id: number): Promise<ContestType> {\n return this.getResource(ENDPOINTS.CONTEST_TYPE, id);\n }\n\n /**\n * Get a Contest Effect by its ID.\n * @param id The Contest Effect ID.\n * @returns The matching Contest Effect.\n */\n public async getContestEffectById(id: number): Promise<ContestEffect> {\n return this.getResource(ENDPOINTS.CONTEST_EFFECT, id);\n }\n\n /**\n * Get a Super Contest Effect by its ID.\n * @param id The Super Contest Effect ID.\n * @returns The matching Super Contest Effect.\n */\n public async getSuperContestEffectById(id: number): Promise<SuperContestEffect> {\n return this.getResource(ENDPOINTS.SUPER_CONTEST_EFFECT, id);\n }\n\n /**\n * List Contest Types.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Contest Types.\n */\n public async listContestTypes(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.CONTEST_TYPE, offset, limit);\n }\n\n /**\n * List Contest Effects.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Contest Effects.\n */\n public async listContestEffects(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.CONTEST_EFFECT, offset, limit);\n }\n\n /**\n * List Super Contest Effects.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Super Contest Effects.\n */\n public async listSuperContestEffects(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.SUPER_CONTEST_EFFECT, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Currency, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Currency Client\n *\n * Client used to access the Currency Endpoints:\n * - [Currencies](https://pokeapi.co/docs/v2#currencies)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#currencies-section)\n */\nexport class CurrencyClient extends BaseClient {\n /**\n * Get a Currency by its name.\n * @param name The Currency name.\n * @returns The matching Currency.\n */\n public async getCurrencyByName(name: string): Promise<Currency> {\n return this.getResource(ENDPOINTS.CURRENCY, name);\n }\n\n /**\n * Get a Currency by its ID.\n * @param id The Currency ID.\n * @returns The matching Currency.\n */\n public async getCurrencyById(id: number): Promise<Currency> {\n return this.getResource(ENDPOINTS.CURRENCY, id);\n }\n\n /**\n * List Currencies.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Currencies.\n */\n public async listCurrencies(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.CURRENCY, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n EncounterCondition,\n EncounterConditionValue,\n EncounterMethod,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Encounter Client\n *\n * Client used to access the Encounter Endpoints:\n * - [Encounter Methods](https://pokeapi.co/docs/v2#encounter-methods)\n * - [Encounter Conditions](https://pokeapi.co/docs/v2#encounter-conditions)\n * - [Encounter Condition Values](https://pokeapi.co/docs/v2#encounter-condition-values)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#encounters-section)\n */\nexport class EncounterClient extends BaseClient {\n /**\n * Get an Encounter Method by its name.\n * @param name The Encounter Method name.\n * @returns The matching Encounter Method.\n */\n public async getEncounterMethodByName(name: string): Promise<EncounterMethod> {\n return this.getResource<EncounterMethod>(ENDPOINTS.ENCOUNTER_METHOD, name);\n }\n\n /**\n * Get an Encounter Method by its ID.\n * @param id The Encounter Method ID.\n * @returns The matching Encounter Method.\n */\n public async getEncounterMethodById(id: number): Promise<EncounterMethod> {\n return this.getResource<EncounterMethod>(ENDPOINTS.ENCOUNTER_METHOD, id);\n }\n\n /**\n * Get an Encounter Condition by its ID.\n * @param id The Encounter Condition ID.\n * @returns The matching Encounter Condition.\n */\n public async getEncounterConditionById(id: number): Promise<EncounterCondition> {\n return this.getResource<EncounterCondition>(ENDPOINTS.ENCOUNTER_CONDITION, id);\n }\n\n /**\n * Get an Encounter Condition by its name.\n * @param name The Encounter Condition name.\n * @returns The matching Encounter Condition.\n */\n public async getEncounterConditionByName(name: string): Promise<EncounterCondition> {\n return this.getResource<EncounterCondition>(ENDPOINTS.ENCOUNTER_CONDITION, name);\n }\n\n /**\n * Get an Encounter Condition Value by its name.\n * @param name The Encounter Condition Value name.\n * @returns The matching Encounter Condition Value.\n */\n public async getEncounterConditionValueByName(name: string): Promise<EncounterConditionValue> {\n return this.getResource<EncounterConditionValue>(ENDPOINTS.ENCOUNTER_CONDITION_VALUE, name);\n }\n\n /**\n * Get an Encounter Condition Value by its ID.\n * @param id The Encounter Condition Value ID.\n * @returns The matching Encounter Condition Value.\n */\n public async getEncounterConditionValueById(id: number): Promise<EncounterConditionValue> {\n return this.getResource<EncounterConditionValue>(ENDPOINTS.ENCOUNTER_CONDITION_VALUE, id);\n }\n\n /**\n * List Encounter Methods.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Encounter Methods.\n */\n public async listEncounterMethods(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ENCOUNTER_METHOD, offset, limit);\n }\n\n /**\n * List Encounter Conditions.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Encounter Conditions.\n */\n public async listEncounterConditions(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ENCOUNTER_CONDITION, offset, limit);\n }\n\n /**\n * List Encounter Condition Values.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Encounter Condition Values.\n */\n public async listEncounterConditionValues(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ENCOUNTER_CONDITION_VALUE, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { EvolutionChain, EvolutionTrigger, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Evolution Client\n *\n * Client used to access the Evolution Endpoints:\n * - [Evolution Chains](https://pokeapi.co/docs/v2#evolution-chains)\n * - [Evolution Triggers](https://pokeapi.co/docs/v2#evolution-triggers)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#evolution-section)\n */\nexport class EvolutionClient extends BaseClient {\n /**\n * Get an Evolution Chain by its ID.\n * @param id The Evolution Chain ID.\n * @returns The matching Evolution Chain.\n */\n public async getEvolutionChainById(id: number): Promise<EvolutionChain> {\n return this.getResource(ENDPOINTS.EVOLUTION_CHAIN, id);\n }\n\n /**\n * Get an Evolution Trigger by its ID.\n * @param id The Evolution Trigger ID.\n * @returns The matching Evolution Trigger.\n */\n public async getEvolutionTriggerById(id: number): Promise<EvolutionTrigger> {\n return this.getResource(ENDPOINTS.EVOLUTION_TRIGGER, id);\n }\n\n /**\n * Get an Evolution Trigger by its name.\n * @param name The Evolution Trigger name.\n * @returns The matching Evolution Trigger.\n */\n public async getEvolutionTriggerByName(name: string): Promise<EvolutionTrigger> {\n return this.getResource(ENDPOINTS.EVOLUTION_TRIGGER, name);\n }\n\n /**\n * List Evolution Chains.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Evolution Chains.\n */\n public async listEvolutionChains(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.EVOLUTION_CHAIN, offset, limit);\n }\n\n /**\n * List Evolution Triggers.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Evolution Triggers.\n */\n public async listEvolutionTriggers(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.EVOLUTION_TRIGGER, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Generation, NamedAPIResourceList, Pokedex, Version, VersionGroup } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Game Client\n *\n * Client used to access the Game Endpoints:\n * - [Generations](https://pokeapi.co/docs/v2#generations)\n * - [Pokédexes](https://pokeapi.co/docs/v2#pokedexes)\n * - [Versions](https://pokeapi.co/docs/v2#version)\n * - [Version Groups](https://pokeapi.co/docs/v2#version-groups)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#games-section)\n */\nexport class GameClient extends BaseClient {\n /**\n * Get a Generation by its name.\n * @param name The Generation name.\n * @returns The matching Generation.\n */\n public async getGenerationByName(name: string): Promise<Generation> {\n return this.getResource(ENDPOINTS.GENERATION, name);\n }\n\n /**\n * Get a Generation by its ID.\n * @param id The Generation ID.\n * @returns The matching Generation.\n */\n public async getGenerationById(id: number): Promise<Generation> {\n return this.getResource(ENDPOINTS.GENERATION, id);\n }\n\n /**\n * Get a Pokédex by its name.\n * @param name The Pokédex name.\n * @returns The matching Pokédex.\n */\n public async getPokedexByName(name: string): Promise<Pokedex> {\n return this.getResource(ENDPOINTS.POKEDEX, name);\n }\n\n /**\n * Get a Pokédex by its ID.\n * @param id The Pokédex ID.\n * @returns The matching Pokédex.\n */\n public async getPokedexById(id: number): Promise<Pokedex> {\n return this.getResource(ENDPOINTS.POKEDEX, id);\n }\n\n /**\n * Get a Version by its name.\n * @param name The Version name.\n * @returns The matching Version.\n */\n public async getVersionByName(name: string): Promise<Version> {\n return this.getResource(ENDPOINTS.VERSION, name);\n }\n\n /**\n * Get a Version by its ID.\n * @param id The Version ID.\n * @returns The matching Version.\n */\n public async getVersionById(id: number): Promise<Version> {\n return this.getResource(ENDPOINTS.VERSION, id);\n }\n\n /**\n * Get a Version Group by its name.\n * @param name The Version Group name.\n * @returns The matching Version Group.\n */\n public async getVersionGroupByName(name: string): Promise<VersionGroup> {\n return this.getResource(ENDPOINTS.VERSION_GROUP, name);\n }\n\n /**\n * Get a Version Group by its ID.\n * @param id The Version Group ID.\n * @returns The matching Version Group.\n */\n public async getVersionGroupById(id: number): Promise<VersionGroup> {\n return this.getResource(ENDPOINTS.VERSION_GROUP, id);\n }\n\n /**\n * List Generations.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Generations.\n */\n public async listGenerations(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.GENERATION, offset, limit);\n }\n\n /**\n * List Pokédexes.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokédexes.\n */\n public async listPokedexes(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEDEX, offset, limit);\n }\n\n /**\n * List Versions.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Versions.\n */\n public async listVersions(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.VERSION, offset, limit);\n }\n\n /**\n * List Version Groups.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Version Groups.\n */\n public async listVersionGroups(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.VERSION_GROUP, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n Item,\n ItemAttribute,\n ItemCategory,\n ItemFlingEffect,\n ItemPocket,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Item Client\n *\n * Client used to access the Item Endpoints:\n * - [Items](https://pokeapi.co/docs/v2#item)\n * - [Item Attributes](https://pokeapi.co/docs/v2#item-attributes)\n * - [Item Categories](https://pokeapi.co/docs/v2#item-categories)\n * - [Item Fling Effects](https://pokeapi.co/docs/v2#item-fling-effects)\n * - [Item Pockets](https://pokeapi.co/docs/v2#item-pockets)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#items-section)\n */\nexport class ItemClient extends BaseClient {\n /**\n * Get an Item by its name.\n * @param name The Item name.\n * @returns The matching Item.\n */\n public async getItemByName(name: string): Promise<Item> {\n return this.getResource(ENDPOINTS.ITEM, name);\n }\n\n /**\n * Get an Item by its ID.\n * @param id The Item ID.\n * @returns The matching Item.\n */\n public async getItemById(id: number): Promise<Item> {\n return this.getResource(ENDPOINTS.ITEM, id);\n }\n\n /**\n * Get an Item Attribute by its name.\n * @param name The Item Attribute name.\n * @returns The matching Item Attribute.\n */\n public async getItemAttributeByName(name: string): Promise<ItemAttribute> {\n return this.getResource(ENDPOINTS.ITEM_ATTRIBUTE, name);\n }\n\n /**\n * Get an Item Attribute by its ID.\n * @param id The Item Attribute ID.\n * @returns The matching Item Attribute.\n */\n public async getItemAttributeById(id: number): Promise<ItemAttribute> {\n return this.getResource(ENDPOINTS.ITEM_ATTRIBUTE, id);\n }\n\n /**\n * Get an Item Category by its name.\n * @param name The Item Category name.\n * @returns The matching Item Category.\n */\n public async getItemCategoryByName(name: string): Promise<ItemCategory> {\n return this.getResource(ENDPOINTS.ITEM_CATEGORY, name);\n }\n\n /**\n * Get an Item Category by its ID.\n * @param id The Item Category ID.\n * @returns The matching Item Category.\n */\n public async getItemCategoryById(id: number): Promise<ItemCategory> {\n return this.getResource(ENDPOINTS.ITEM_CATEGORY, id);\n }\n\n /**\n * Get an Item Fling Effect by its name.\n * @param name The Item Fling Effect name.\n * @returns The matching Item Fling Effect.\n */\n public async getItemFlingEffectByName(name: string): Promise<ItemFlingEffect> {\n return this.getResource(ENDPOINTS.ITEM_FLING_EFFECT, name);\n }\n\n /**\n * Get an Item Fling Effect by its ID.\n * @param id The Item Fling Effect ID.\n * @returns The matching Item Fling Effect.\n */\n public async getItemFlingEffectById(id: number): Promise<ItemFlingEffect> {\n return this.getResource(ENDPOINTS.ITEM_FLING_EFFECT, id);\n }\n\n /**\n * Get an Item Pocket by its name.\n * @param name The Item Pocket name.\n * @returns The matching Item Pocket.\n */\n public async getItemPocketByName(name: string): Promise<ItemPocket> {\n return this.getResource(ENDPOINTS.ITEM_POCKET, name);\n }\n\n /**\n * Get an Item Pocket by its ID.\n * @param id The Item Pocket ID.\n * @returns The matching Item Pocket.\n */\n public async getItemPocketById(id: number): Promise<ItemPocket> {\n return this.getResource(ENDPOINTS.ITEM_POCKET, id);\n }\n\n /**\n * List Items.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Items.\n */\n public async listItems(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ITEM, offset, limit);\n }\n\n /**\n * List Item Attributes.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Item Attributes.\n */\n public async listItemAttributes(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ITEM_ATTRIBUTE, offset, limit);\n }\n\n /**\n * List Item Categories.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Item Categories.\n */\n public async listItemCategories(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ITEM_CATEGORY, offset, limit);\n }\n\n /**\n * List Item Fling Effects.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Item Fling Effects.\n */\n public async listItemFlingEffects(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ITEM_FLING_EFFECT, offset, limit);\n }\n\n /**\n * List Item Pockets.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Item Pockets.\n */\n public async listItemPockets(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ITEM_POCKET, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Location, LocationArea, NamedAPIResourceList, PalParkArea, Region } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Location Client\n *\n * Client used to access the Location Endpoints:\n * - [Locations](https://pokeapi.co/docs/v2#locations)\n * - [Location Areas](https://pokeapi.co/docs/v2#location-areas)\n * - [Pal Park Areas](https://pokeapi.co/docs/v2#pal-park-areas)\n * - [Regions](https://pokeapi.co/docs/v2#regions)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#locations-section)\n */\nexport class LocationClient extends BaseClient {\n /**\n * Get a Location by its name.\n * @param name The Location name.\n * @returns The matching Location.\n */\n public async getLocationByName(name: string): Promise<Location> {\n return this.getResource(ENDPOINTS.LOCATION, name);\n }\n\n /**\n * Get a Location by its ID.\n * @param id The Location ID.\n * @returns The matching Location.\n */\n public async getLocationById(id: number): Promise<Location> {\n return this.getResource(ENDPOINTS.LOCATION, id);\n }\n\n /**\n * Get a Location Area by its name.\n * @param name The Location Area name.\n * @returns The matching Location Area.\n */\n public async getLocationAreaByName(name: string): Promise<LocationArea> {\n return this.getResource(ENDPOINTS.LOCATION_AREA, name);\n }\n\n /**\n * Get a Location Area by its ID.\n * @param id The Location Area ID.\n * @returns The matching Location Area.\n */\n public async getLocationAreaById(id: number): Promise<LocationArea> {\n return this.getResource(ENDPOINTS.LOCATION_AREA, id);\n }\n\n /**\n * Get a Pal Park Area by its name.\n * @param name The Pal Park Area name.\n * @returns The matching Pal Park Area.\n */\n public async getPalParkAreaByName(name: string): Promise<PalParkArea> {\n return this.getResource(ENDPOINTS.PALPARK_AREA, name);\n }\n\n /**\n * Get a Pal Park Area by its ID.\n * @param id The Pal Park Area ID.\n * @returns The matching Pal Park Area.\n */\n public async getPalParkAreaById(id: number): Promise<PalParkArea> {\n return this.getResource(ENDPOINTS.PALPARK_AREA, id);\n }\n\n /**\n * Get a Region by its name.\n * @param name The Region name.\n * @returns The matching Region.\n */\n public async getRegionByName(name: string): Promise<Region> {\n return this.getResource(ENDPOINTS.REGION, name);\n }\n\n /**\n * Get a Region by its ID.\n * @param id The Region ID.\n * @returns The matching Region.\n */\n public async getRegionById(id: number): Promise<Region> {\n return this.getResource(ENDPOINTS.REGION, id);\n }\n\n /**\n * List Locations.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Locations.\n */\n public async listLocations(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.LOCATION, offset, limit);\n }\n\n /**\n * List Location Areas.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Location Areas.\n */\n public async listLocationAreas(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.LOCATION_AREA, offset, limit);\n }\n\n /**\n * List Pal Park Areas.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pal Park Areas.\n */\n public async listPalParkAreas(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.PALPARK_AREA, offset, limit);\n }\n\n /**\n * List Regions.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Regions.\n */\n public async listRegions(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.REGION, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Machine, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Machine Client\n *\n * Client used to access the Machine Endpoints:\n * - [Machines](https://pokeapi.co/docs/v2#machines)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#machines-section)\n */\nexport class MachineClient extends BaseClient {\n /**\n * Get a Machine by its ID.\n * @param id The Machine ID.\n * @returns The matching Machine.\n */\n public async getMachineById(id: number): Promise<Machine> {\n return this.getResource(ENDPOINTS.MACHINE, id);\n }\n\n /**\n * List Machines.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Machines.\n */\n public async listMachines(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MACHINE, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n Move,\n MoveAilment,\n MoveBattleStyle,\n MoveCategory,\n MoveDamageClass,\n MoveLearnMethod,\n MoveTarget,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Move Client\n *\n * Client used to access the Move Endpoints:\n * - [Moves](https://pokeapi.co/docs/v2#moves)\n * - [Move Ailments](https://pokeapi.co/docs/v2#move-ailments)\n * - [Move Battle Styles](https://pokeapi.co/docs/v2#move-battle-styles)\n * - [Move Categories](https://pokeapi.co/docs/v2#move-categories)\n * - [Move Damage Classes](https://pokeapi.co/docs/v2#move-damage-classes)\n * - [Move Learn Methods](https://pokeapi.co/docs/v2#move-learn-methods)\n * - [Move Targets](https://pokeapi.co/docs/v2#move-targets)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#moves-section)\n */\nexport class MoveClient extends BaseClient {\n /**\n * Get a Move by its name.\n * @param name The Move name.\n * @returns The matching Move.\n */\n public async getMoveByName(name: string): Promise<Move> {\n return this.getResource(ENDPOINTS.MOVE, name);\n }\n\n /**\n * Get a Move by its ID.\n * @param id The Move ID.\n * @returns The matching Move.\n */\n public async getMoveById(id: number): Promise<Move> {\n return this.getResource(ENDPOINTS.MOVE, id);\n }\n\n /**\n * Get a Move Ailment by its name.\n * @param name The Move Ailment name.\n * @returns The matching Move Ailment.\n */\n public async getMoveAilmentByName(name: string): Promise<MoveAilment> {\n return this.getResource(ENDPOINTS.MOVE_AILMENT, name);\n }\n\n /**\n * Get a Move Ailment by its ID.\n * @param id The Move Ailment ID.\n * @returns The matching Move Ailment.\n */\n public async getMoveAilmentById(id: number): Promise<MoveAilment> {\n return this.getResource(ENDPOINTS.MOVE_AILMENT, id);\n }\n\n /**\n * Get a Move Battle Style by its name.\n * @param name The Move Battle Style name.\n * @returns The matching Move Battle Style.\n */\n public async getMoveBattleStyleByName(name: string): Promise<MoveBattleStyle> {\n return this.getResource(ENDPOINTS.MOVE_BATTLE_STYLE, name);\n }\n\n /**\n * Get a Move Battle Style by its ID.\n * @param id The Move Battle Style ID.\n * @returns The matching Move Battle Style.\n */\n public async getMoveBattleStyleById(id: number): Promise<MoveBattleStyle> {\n return this.getResource(ENDPOINTS.MOVE_BATTLE_STYLE, id);\n }\n\n /**\n * Get a Move Category by its name.\n * @param name The Move Category name.\n * @returns The matching Move Category.\n */\n public async getMoveCategoryByName(name: string): Promise<MoveCategory> {\n return this.getResource(ENDPOINTS.MOVE_CATEGORY, name);\n }\n\n /**\n * Get a Move Category by its ID.\n * @param id The Move Category ID.\n * @returns The matching Move Category.\n */\n public async getMoveCategoryById(id: number): Promise<MoveCategory> {\n return this.getResource(ENDPOINTS.MOVE_CATEGORY, id);\n }\n\n /**\n * Get a Move Damage Class by its name.\n * @param name The Move Damage Class name.\n * @returns The matching Move Damage Class.\n */\n public async getMoveDamageClassByName(name: string): Promise<MoveDamageClass> {\n return this.getResource(ENDPOINTS.MOVE_DAMAGE_CLASS, name);\n }\n\n /**\n * Get a Move Damage Class by its ID.\n * @param id The Move Damage Class ID.\n * @returns The matching Move Damage Class.\n */\n public async getMoveDamageClassById(id: number): Promise<MoveDamageClass> {\n return this.getResource(ENDPOINTS.MOVE_DAMAGE_CLASS, id);\n }\n\n /**\n * Get a Move Learn Method by its name.\n * @param name The Move Learn Method name.\n * @returns The matching Move Learn Method.\n */\n public async getMoveLearnMethodByName(name: string): Promise<MoveLearnMethod> {\n return this.getResource(ENDPOINTS.MOVE_LEARN_METHOD, name);\n }\n\n /**\n * Get a Move Learn Method by its ID.\n * @param id The Move Learn Method ID.\n * @returns The matching Move Learn Method.\n */\n public async getMoveLearnMethodById(id: number): Promise<MoveLearnMethod> {\n return this.getResource(ENDPOINTS.MOVE_LEARN_METHOD, id);\n }\n\n /**\n * Get a Move Target by its name.\n * @param name The Move Target name.\n * @returns The matching Move Target.\n */\n public async getMoveTargetByName(name: string): Promise<MoveTarget> {\n return this.getResource(ENDPOINTS.MOVE_TARGET, name);\n }\n\n /**\n * Get a Move Target by its ID.\n * @param id The Move Target ID.\n * @returns The matching Move Target.\n */\n public async getMoveTargetById(id: number): Promise<MoveTarget> {\n return this.getResource(ENDPOINTS.MOVE_TARGET, id);\n }\n\n /**\n * List Moves.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Moves.\n */\n public async listMoves(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE, offset, limit);\n }\n\n /**\n * List Move Ailments.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Move Ailments.\n */\n public async listMoveAilments(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE_AILMENT, offset, limit);\n }\n\n /**\n * List Move Battle Styles.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Move Battle Styles.\n */\n public async listMoveBattleStyles(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE_BATTLE_STYLE, offset, limit);\n }\n\n /**\n * List Move Categories.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Move Categories.\n */\n public async listMoveCategories(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE_CATEGORY, offset, limit);\n }\n\n /**\n * List Move Damage Classes.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Move Damage Classes.\n */\n public async listMoveDamageClasses(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE_DAMAGE_CLASS, offset, limit);\n }\n\n /**\n * List Move Learn Methods.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Move Learn Methods.\n */\n public async listMoveLearnMethods(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE_LEARN_METHOD, offset, limit);\n }\n\n /**\n * List Move Targets.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Move Targets.\n */\n public async listMoveTargets(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.MOVE_TARGET, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n Ability,\n Characteristic,\n EggGroup,\n Gender,\n GrowthRate,\n LocationAreaEncounter,\n NamedAPIResourceList,\n Nature,\n PokeathlonStat,\n Pokemon,\n PokemonColor,\n PokemonForm,\n PokemonHabitat,\n PokemonShape,\n PokemonSpecies,\n Stat,\n Type,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Pokémon Client\n *\n * Client used to access the Pokémon Endpoints:\n * - [Abilities](https://pokeapi.co/docs/v2#abilities)\n * - [Characteristics](https://pokeapi.co/docs/v2#characteristics)\n * - [Egg Groups](https://pokeapi.co/docs/v2#egg-groups)\n * - [Genders](https://pokeapi.co/docs/v2#genders)\n * - [Growth Rates](https://pokeapi.co/docs/v2#growth-rates)\n * - [Natures](https://pokeapi.co/docs/v2#natures)\n * - [Pokéathlon Stats](https://pokeapi.co/docs/v2#pokeathlon-stats)\n * - [Pokémon](https://pokeapi.co/docs/v2#pokemon)\n * - [Pokémon Location Areas](https://pokeapi.co/docs/v2#pokemon-location-areas)\n * - [Pokémon Colors](https://pokeapi.co/docs/v2#pokemon-colors)\n * - [Pokémon Forms](https://pokeapi.co/docs/v2#pokemon-forms)\n * - [Pokémon Habitats](https://pokeapi.co/docs/v2#pokemon-habitats)\n * - [Pokémon Shapes](https://pokeapi.co/docs/v2#pokemon-shapes)\n * - [Pokémon Species](https://pokeapi.co/docs/v2#pokemon-species)\n * - [Stats](https://pokeapi.co/docs/v2#stats)\n * - [Types](https://pokeapi.co/docs/v2#types)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#pokemon-section)\n */\nexport class PokemonClient extends BaseClient {\n /**\n * Get an Ability by its name.\n * @param name The Ability name.\n * @returns The matching Ability.\n */\n public async getAbilityByName(name: string): Promise<Ability> {\n return this.getResource(ENDPOINTS.ABILITY, name);\n }\n\n /**\n * Get an Ability by its ID.\n * @param id The Ability ID.\n * @returns The matching Ability.\n */\n public async getAbilityById(id: number): Promise<Ability> {\n return this.getResource(ENDPOINTS.ABILITY, id);\n }\n\n /**\n * Get a Characteristic by its ID.\n * @param id The Characteristic ID.\n * @returns The matching Characteristic.\n */\n public async getCharacteristicById(id: number): Promise<Characteristic> {\n return this.getResource(ENDPOINTS.CHARACTERISTIC, id);\n }\n\n /**\n * Get an Egg Group by its name.\n * @param name The Egg Group name.\n * @returns The matching Egg Group.\n */\n public async getEggGroupByName(name: string): Promise<EggGroup> {\n return this.getResource(ENDPOINTS.EGG_GROUP, name);\n }\n\n /**\n * Get an Egg Group by its ID.\n * @param id The Egg Group ID.\n * @returns The matching Egg Group.\n */\n public async getEggGroupById(id: number): Promise<EggGroup> {\n return this.getResource(ENDPOINTS.EGG_GROUP, id);\n }\n\n /**\n * Get a Gender by its name.\n * @param name The Gender name.\n * @returns The matching Gender.\n */\n public async getGenderByName(name: string): Promise<Gender> {\n return this.getResource(ENDPOINTS.GENDER, name);\n }\n\n /**\n * Get a Gender by its ID.\n * @param id The Gender ID.\n * @returns The matching Gender.\n */\n public async getGenderById(id: number): Promise<Gender> {\n return this.getResource(ENDPOINTS.GENDER, id);\n }\n\n /**\n * Get a Growth Rate by its name.\n * @param name The Growth Rate name.\n * @returns The matching Growth Rate.\n */\n public async getGrowthRateByName(name: string): Promise<GrowthRate> {\n return this.getResource(ENDPOINTS.GROWTH_RATE, name);\n }\n\n /**\n * Get a Growth Rate by its ID.\n * @param id The Growth Rate ID.\n * @returns The matching Growth Rate.\n */\n public async getGrowthRateById(id: number): Promise<GrowthRate> {\n return this.getResource(ENDPOINTS.GROWTH_RATE, id);\n }\n\n /**\n * Get a Nature by its name.\n * @param name The Nature name.\n * @returns The matching Nature.\n */\n public async getNatureByName(name: string): Promise<Nature> {\n return this.getResource(ENDPOINTS.NATURE, name);\n }\n\n /**\n * Get a Nature by its ID.\n * @param id The Nature ID.\n * @returns The matching Nature.\n */\n public async getNatureById(id: number): Promise<Nature> {\n return this.getResource(ENDPOINTS.NATURE, id);\n }\n\n /**\n * Get a Pokéathlon Stat by its name.\n * @param name The Pokéathlon Stat name.\n * @returns The matching Pokéathlon Stat.\n */\n public async getPokeathlonStatByName(name: string): Promise<PokeathlonStat> {\n return this.getResource(ENDPOINTS.POKEATHLON_STAT, name);\n }\n\n /**\n * Get a Pokéathlon Stat by its ID.\n * @param id The Pokéathlon Stat ID.\n * @returns The matching Pokéathlon Stat.\n */\n public async getPokeathlonStatById(id: number): Promise<PokeathlonStat> {\n return this.getResource(ENDPOINTS.POKEATHLON_STAT, id);\n }\n\n /**\n * Get a Pokémon by its name.\n * @param name The Pokémon name.\n * @returns The matching Pokémon.\n */\n public async getPokemonByName(name: string): Promise<Pokemon> {\n return this.getResource(ENDPOINTS.POKEMON, name);\n }\n\n /**\n * Get a Pokémon by its ID.\n * @param id The Pokémon ID.\n * @returns The matching Pokémon.\n */\n public async getPokemonById(id: number): Promise<Pokemon> {\n return this.getResource(ENDPOINTS.POKEMON, id);\n }\n\n /**\n * Get the areas a Pokémon can be encountered in, by its ID.\n * @param id The Pokémon ID.\n * @returns Every location area the Pokémon appears in, with its encounter details.\n */\n public async getPokemonLocationAreaById(id: number): Promise<LocationAreaEncounter[]> {\n // Encounters hang off a single Pokémon rather than being an endpoint of\n // their own, so the path below `/pokemon` is addressed directly.\n return this.getResource(ENDPOINTS.POKEMON, `${id}/encounters`);\n }\n\n /**\n * Get a Pokémon Color by its name.\n * @param name The Pokémon Color name.\n * @returns The matching Pokémon Color.\n */\n public async getPokemonColorByName(name: string): Promise<PokemonColor> {\n return this.getResource(ENDPOINTS.POKEMON_COLOR, name);\n }\n\n /**\n * Get a Pokémon Color by its ID.\n * @param id The Pokémon Color ID.\n * @returns The matching Pokémon Color.\n */\n public async getPokemonColorById(id: number): Promise<PokemonColor> {\n return this.getResource(ENDPOINTS.POKEMON_COLOR, id);\n }\n\n /**\n * Get a Pokémon Form by its name.\n * @param name The Pokémon Form name.\n * @returns The matching Pokémon Form.\n */\n public async getPokemonFormByName(name: string): Promise<PokemonForm> {\n return this.getResource(ENDPOINTS.POKEMON_FORM, name);\n }\n\n /**\n * Get a Pokémon Form by its ID.\n * @param id The Pokémon Form ID.\n * @returns The matching Pokémon Form.\n */\n public async getPokemonFormById(id: number): Promise<PokemonForm> {\n return this.getResource(ENDPOINTS.POKEMON_FORM, id);\n }\n\n /**\n * Get a Pokémon Habitat by its name.\n * @param name The Pokémon Habitat name.\n * @returns The matching Pokémon Habitat.\n */\n public async getPokemonHabitatByName(name: string): Promise<PokemonHabitat> {\n return this.getResource(ENDPOINTS.POKEMON_HABITAT, name);\n }\n\n /**\n * Get a Pokémon Habitat by its ID.\n * @param id The Pokémon Habitat ID.\n * @returns The matching Pokémon Habitat.\n */\n public async getPokemonHabitatById(id: number): Promise<PokemonHabitat> {\n return this.getResource(ENDPOINTS.POKEMON_HABITAT, id);\n }\n\n /**\n * Get a Pokémon Shape by its name.\n * @param name The Pokémon Shape name.\n * @returns The matching Pokémon Shape.\n */\n public async getPokemonShapeByName(name: string): Promise<PokemonShape> {\n return this.getResource(ENDPOINTS.POKEMON_SHAPE, name);\n }\n\n /**\n * Get a Pokémon Shape by its ID.\n * @param id The Pokémon Shape ID.\n * @returns The matching Pokémon Shape.\n */\n public async getPokemonShapeById(id: number): Promise<PokemonShape> {\n return this.getResource(ENDPOINTS.POKEMON_SHAPE, id);\n }\n\n /**\n * Get a Pokémon Species by its name.\n * @param name The Pokémon Species name.\n * @returns The matching Pokémon Species.\n */\n public async getPokemonSpeciesByName(name: string): Promise<PokemonSpecies> {\n return this.getResource(ENDPOINTS.POKEMON_SPECIES, name);\n }\n\n /**\n * Get a Pokémon Species by its ID.\n * @param id The Pokémon Species ID.\n * @returns The matching Pokémon Species.\n */\n public async getPokemonSpeciesById(id: number): Promise<PokemonSpecies> {\n return this.getResource(ENDPOINTS.POKEMON_SPECIES, id);\n }\n\n /**\n * Get a Stat by its name.\n * @param name The Stat name.\n * @returns The matching Stat.\n */\n public async getStatByName(name: string): Promise<Stat> {\n return this.getResource(ENDPOINTS.STAT, name);\n }\n\n /**\n * Get a Stat by its ID.\n * @param id The Stat ID.\n * @returns The matching Stat.\n */\n public async getStatById(id: number): Promise<Stat> {\n return this.getResource(ENDPOINTS.STAT, id);\n }\n\n /**\n * Get a Type by its name.\n * @param name The Type name.\n * @returns The matching Type.\n */\n public async getTypeByName(name: string): Promise<Type> {\n return this.getResource(ENDPOINTS.TYPE, name);\n }\n\n /**\n * Get a Type by its ID.\n * @param id The Type ID.\n * @returns The matching Type.\n */\n public async getTypeById(id: number): Promise<Type> {\n return this.getResource(ENDPOINTS.TYPE, id);\n }\n\n /**\n * List Abilities.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Abilities.\n */\n public async listAbilities(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.ABILITY, offset, limit);\n }\n\n /**\n * List Characteristics.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Characteristics.\n */\n public async listCharacteristics(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.CHARACTERISTIC, offset, limit);\n }\n\n /**\n * List Egg Groups.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Egg Groups.\n */\n public async listEggGroups(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.EGG_GROUP, offset, limit);\n }\n\n /**\n * List Genders.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Genders.\n */\n public async listGenders(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.GENDER, offset, limit);\n }\n\n /**\n * List Growth Rates.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Growth Rates.\n */\n public async listGrowthRates(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.GROWTH_RATE, offset, limit);\n }\n\n /**\n * List Natures.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Natures.\n */\n public async listNatures(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.NATURE, offset, limit);\n }\n\n /**\n * List Pokéathlon Stats.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokéathlon Stats.\n */\n public async listPokeathlonStats(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEATHLON_STAT, offset, limit);\n }\n\n /**\n * List Pokémon.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokémon.\n */\n public async listPokemons(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEMON, offset, limit);\n }\n\n /**\n * List Pokémon Colors.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokémon Colors.\n */\n public async listPokemonColors(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEMON_COLOR, offset, limit);\n }\n\n /**\n * List Pokémon Forms.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokémon Forms.\n */\n public async listPokemonForms(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEMON_FORM, offset, limit);\n }\n\n /**\n * List Pokémon Habitats.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokémon Habitats.\n */\n public async listPokemonHabitats(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEMON_HABITAT, offset, limit);\n }\n\n /**\n * List Pokémon Shapes.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokémon Shapes.\n */\n public async listPokemonShapes(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEMON_SHAPE, offset, limit);\n }\n\n /**\n * List Pokémon Species.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Pokémon Species.\n */\n public async listPokemonSpecies(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.POKEMON_SPECIES, offset, limit);\n }\n\n /**\n * List Stats.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Stats.\n */\n public async listStats(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.STAT, offset, limit);\n }\n\n /**\n * List Types.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Types.\n */\n public async listTypes(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.TYPE, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Language, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Utility Client\n *\n * Client used to access the Utility Endpoints:\n * - [Languages](https://pokeapi.co/docs/v2#languages)\n * - [Resources](https://pokeapi.co/docs/v2#resource-listspagination-section)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#utility-section)\n */\nexport class UtilityClient extends BaseClient {\n /**\n * Get a Language by its ID.\n * @param id The Language ID.\n * @returns The matching Language.\n */\n public async getLanguageById(id: number): Promise<Language> {\n return this.getResource(ENDPOINTS.LANGUAGE, id);\n }\n\n /**\n * Get a Language by its name.\n * @param name The Language name.\n * @returns The matching Language.\n */\n public async getLanguageByName(name: string): Promise<Language> {\n return this.getResource(ENDPOINTS.LANGUAGE, name);\n }\n\n /**\n * Get any resource by its URL, as returned inside a PokéAPI response.\n * @param url The absolute URL of the resource.\n * @returns The resource the URL points at.\n * @throws {TypeError} If `url` is not a valid URL, or names no PokéAPI endpoint.\n */\n public async getResourceByUrl<T>(url: string): Promise<T> {\n return this.getResourceByURL<T>(url);\n }\n\n /**\n * List Languages.\n * @param offset Index of the first resource returned. Defaults to 0.\n * @param limit How many resources per page. Defaults to 20.\n * @returns A paginated list of Languages.\n */\n public listLanguages(offset?: number, limit?: number): Promise<NamedAPIResourceList> {\n return this.getListResource(ENDPOINTS.LANGUAGE, offset, limit);\n }\n}\n","import { type CacheStore, MemoryCache } from \"../config/cache\";\nimport type { ClientOptions } from \"./base\";\nimport { BerryClient } from \"./berry.client\";\nimport { ContestClient } from \"./contest.client\";\nimport { CurrencyClient } from \"./currency.client\";\nimport { EncounterClient } from \"./encounter.client\";\nimport { EvolutionClient } from \"./evolution.client\";\nimport { GameClient } from \"./game.client\";\nimport { ItemClient } from \"./item.client\";\nimport { LocationClient } from \"./location.client\";\nimport { MachineClient } from \"./machine.client\";\nimport { MoveClient } from \"./move.client\";\nimport { PokemonClient } from \"./pokemon.client\";\nimport { UtilityClient } from \"./utility.client\";\n\n/**\n * ### Main Client\n *\n * The main client used to access all the PokéAPI Endpoints:\n * - [Berries](https://pokeapi.co/docs/v2#berries-section)\n * - [Contests](https://pokeapi.co/docs/v2#contests-section)\n * - [Currencies](https://pokeapi.co/docs/v2#currencies-section)\n * - [Encounters](https://pokeapi.co/docs/v2#encounters-section)\n * - [Evolution](https://pokeapi.co/docs/v2#evolution-section)\n * - [Games](https://pokeapi.co/docs/v2#games-section)\n * - [Items](https://pokeapi.co/docs/v2#items-section)\n * - [Locations](https://pokeapi.co/docs/v2#locations-section)\n * - [Machines](https://pokeapi.co/docs/v2#machines-section)\n * - [Moves](https://pokeapi.co/docs/v2#moves-section)\n * - [Pokémon](https://pokeapi.co/docs/v2#pokemon-section)\n * - [Utility](https://pokeapi.co/docs/v2#utility-section)\n * ---\n * All the clients below share a single cache, so a resource fetched through one\n * of them is served from memory by the rest.\n *\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2)\n */\nexport class MainClient {\n public readonly cache: CacheStore | undefined;\n\n public readonly berry: BerryClient;\n public readonly contest: ContestClient;\n public readonly currency: CurrencyClient;\n public readonly encounter: EncounterClient;\n public readonly evolution: EvolutionClient;\n public readonly game: GameClient;\n public readonly item: ItemClient;\n public readonly location: LocationClient;\n public readonly machine: MachineClient;\n public readonly move: MoveClient;\n public readonly pokemon: PokemonClient;\n public readonly utility: UtilityClient;\n\n constructor(clientOptions?: ClientOptions) {\n const cache = clientOptions?.cache ?? new MemoryCache();\n const sharedOptions: ClientOptions = { ...clientOptions, cache };\n\n this.cache = cache === false ? undefined : cache;\n\n this.berry = new BerryClient(sharedOptions);\n this.contest = new ContestClient(sharedOptions);\n this.currency = new CurrencyClient(sharedOptions);\n this.encounter = new EncounterClient(sharedOptions);\n this.evolution = new EvolutionClient(sharedOptions);\n this.game = new GameClient(sharedOptions);\n this.item = new ItemClient(sharedOptions);\n this.location = new LocationClient(sharedOptions);\n this.machine = new MachineClient(sharedOptions);\n this.move = new MoveClient(sharedOptions);\n this.pokemon = new PokemonClient(sharedOptions);\n this.utility = new UtilityClient(sharedOptions);\n }\n\n /** Drops every cached response, for all the clients at once. */\n public async clearCache(): Promise<void> {\n await this.cache?.clear?.();\n }\n}\n","/**\n * ## Logger\n * Receives one call per request lifecycle event.\n *\n * Pass one as `ClientOptions.logger`; leave it unset and a client logs nothing.\n * Use {@link consoleLogger}, or forward to pino, winston, or a metrics collector.\n */\nexport interface Logger {\n /** A request is about to be resolved, from cache or over the network. */\n request(method: string, url: string): void;\n /** A response was produced. `cached` distinguishes a cache hit from a round trip. */\n response(status: number, cached: boolean): void;\n /** A request failed. The error is whatever `fetch` or the API produced. */\n error(error: unknown): void;\n}\n\n/** A {@link Logger} that writes the request lifecycle to the console. */\nexport const consoleLogger: Logger = {\n request(method, url) {\n console.log(`[ Request Config ] ${method.toUpperCase()} | ${url}`);\n },\n\n response(status, cached) {\n console.log(`[ Response ] STATUS ${status} | ${cached ? \"CACHED\" : \"NOT CACHED\"}`);\n },\n\n error(error) {\n const { name, message } =\n error instanceof Error ? error : { name: \"UNKNOWN\", message: String(error) };\n\n console.error(`[ Response Error ] CODE ${name} | ${message}`);\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/constants/base.ts","../src/constants/berries.ts","../src/constants/contests.ts","../src/constants/currencies.ts","../src/constants/encounters.ts","../src/constants/endpoints.ts","../src/constants/evolutions.ts","../src/constants/games.ts","../src/constants/items.ts","../src/constants/locations.ts","../src/constants/moves.ts","../src/constants/pokemons.ts","../src/constants/utilities.ts","../src/constants/index.ts","../src/config/cache.ts","../src/config/errors.ts","../src/config/logger.ts","../src/clients/base.ts","../src/clients/berry.client.ts","../src/clients/contest.client.ts","../src/clients/currency.client.ts","../src/clients/encounter.client.ts","../src/clients/evolution.client.ts","../src/clients/game.client.ts","../src/clients/item.client.ts","../src/clients/location.client.ts","../src/clients/machine.client.ts","../src/clients/move.client.ts","../src/clients/pokemon.client.ts","../src/clients/utility.client.ts","../src/clients/main.client.ts","../src/utils/sprites.ts"],"sourcesContent":["export const BASE_URL = {\n REST: \"https://pokeapi.co/api/v2\",\n /** Root of the sprite repository the API's own sprite URLs point at. */\n SPRITES: \"https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites\",\n} as const;\n","/** Enum of Berries (NAME - ID) */\nexport const BERRIES = {\n CHERI: 1,\n CHESTO: 2,\n PECHA: 3,\n RAWST: 4,\n ASPEAR: 5,\n LEPPA: 6,\n ORAN: 7,\n PERSIM: 8,\n LUM: 9,\n SITRUS: 10,\n FIGY: 11,\n WIKI: 12,\n MAGO: 13,\n AGUAV: 14,\n IAPAPA: 15,\n RAZZ: 16,\n BLUK: 17,\n NANAB: 18,\n WEPEAR: 19,\n PINAP: 20,\n POMEG: 21,\n KELPSY: 22,\n QUALOT: 23,\n HONDEW: 24,\n GREPA: 25,\n TAMATO: 26,\n CORNN: 27,\n MAGOST: 28,\n RABUTA: 29,\n NOMEL: 30,\n SPELON: 31,\n PAMTRE: 32,\n WATMEL: 33,\n DURIN: 34,\n BELUE: 35,\n OCCA: 36,\n PASSHO: 37,\n WACAN: 38,\n RINDO: 39,\n YACHE: 40,\n CHOPLE: 41,\n KEBIA: 42,\n SHUCA: 43,\n COBA: 44,\n PAYAPA: 45,\n TANGA: 46,\n CHARTI: 47,\n KASIB: 48,\n HABAN: 49,\n COLBUR: 50,\n BABIRI: 51,\n CHILAN: 52,\n LIECHI: 53,\n GANLON: 54,\n SALAC: 55,\n PETAYA: 56,\n APICOT: 57,\n LANSAT: 58,\n STARF: 59,\n ENIGMA: 60,\n MICLE: 61,\n CUSTAP: 62,\n JABOCA: 63,\n ROWAP: 64,\n} as const;\n\n/** Enum of Berry Firmnesses (NAME - ID) */\nexport const BERRY_FIRMNESSES = {\n VERY_SOFT: 1,\n SOFT: 2,\n HARD: 3,\n VERY_HARD: 4,\n SUPER_HARD: 5,\n} as const;\n\nexport const BERRY_FLAVORS = {\n SPICY: 1,\n DRY: 2,\n SWEET: 3,\n BITTER: 4,\n SOUR: 5,\n} as const;\n","export const CONTEST_TYPES = {\n COOL: 1,\n BEAUTY: 2,\n CUTE: 3,\n SMART: 4,\n TOUGH: 5,\n} as const;\n","export const CURRENCIES = {\n POKE_DOLLAR: 1,\n COIN: 2,\n VOLCANIC_ASH: 3,\n POKE_COUPON: 4,\n BERRY_POWDER: 5,\n BATTLE_POINT: 6,\n SPHERE: 7,\n CASTLE_POINT: 8,\n WATT: 9,\n ATHLETE_POINT: 10,\n DREAM_POINT: 11,\n DREAM_WORLD_BERRY: 12,\n POKE_MILE: 13,\n FESTIVAL_COIN: 14,\n POKE_BEAN: 15,\n HOME_POINT: 16,\n MERIT_POINT: 17,\n LEAGUE_POINT: 18,\n BLUEBERRY_POINT: 19,\n} as const;\n","export const ENCOUNTER_METHODS = {\n WALK: 1,\n OLD_ROD: 2,\n GOOD_ROD: 3,\n SUPER_ROD: 4,\n SURF: 5,\n ROCK_SMASH: 6,\n HEADBUTT: 7,\n DARK_GRASS: 8,\n GRASS_SPOTS: 9,\n CAVE_SPOTS: 10,\n BRIDGE_SPOTS: 11,\n SUPER_ROD_SPOTS: 12,\n SURF_SPOTS: 13,\n YELLOW_FLOWERS: 14,\n PURPLE_FLOWERS: 15,\n RED_FLOWERS: 16,\n ROUGH_TERRAIN: 17,\n GIFT: 18,\n GIFT_EGG: 19,\n ONLY_ONE: 20,\n POKEFLUTE: 21,\n HEADBUTT_LOW: 22,\n HEADBUTT_NORMAL: 23,\n HEADBUT_HIGH: 24,\n SQUIRT_BOTTLE: 25,\n WAILMER_PAIL: 26,\n SEAWEED: 27,\n} as const;\n\nexport const ENCOUNTER_CONDITIONS = {\n SWARM: 1,\n TIME: 2,\n RADAR: 3,\n SLOT2: 4,\n RADIO: 5,\n SEASON: 6,\n STARTER: 7,\n TV_OPTION: 8,\n STORY_PROGRESS: 9,\n OTHER: 10,\n} as const;\n\nexport const ENCOUNTER_CONDITION_VALUES = {\n SWARM_YES: 1,\n SWARM_NO: 2,\n TIME_MORNING: 3,\n TIME_DAY: 4,\n TIME_NIGHT: 5,\n RADAR_ON: 6,\n RADAR_OFF: 7,\n SLOT2_NONE: 8,\n SLOT2_RUBY: 9,\n SLOT2_SAPHIRE: 10,\n SLOT2_EMERALD: 11,\n SLOT2_FIRERED: 12,\n SLOT2_LEAFGREEN: 13,\n RADIO_OFF: 14,\n RADIO_HOEN: 15,\n RADIO_SINNOH: 16,\n SEASON_SPRING: 17,\n SEASON_SUMMER: 18,\n SWASON_AUTUMN: 19,\n SEASON_WINTER: 20,\n STARTER_BULBASAUR: 21,\n STARTER_SQUIRTLE: 22,\n STARTER_CHARMANDER: 23,\n STARTER_CHESPIN: 24,\n STARTER_FENNEKIN: 25,\n STARTER_FROAKIE: 26,\n TV_OPTION_BLUE: 27,\n TV_OPTION_RED: 28,\n STORY_PROGRESS_AWAKENED_BEASTS: 29,\n STORY_PROGRESS_BEAT_GALACTIC_CORONET: 30,\n STORY_PROGRESS_OAK_ETERNA_CITY: 31,\n STORY_PROGRESS_OAK_VERMILION_COPYCAT: 32,\n STORY_PROGRESS_MET_TORNADUS_THUNDURUS: 33,\n STORY_PROGRESS_BEAT_ELITE_FOUR_ROUND_TWO: 34,\n STORY_PROGRESS_HALL_OF_FAME: 35,\n STORY_PROGRESS_NONE: 36,\n STORY_PROGRESS_NATIONAL_DEX: 37,\n OTHER_NONE: 38,\n OTHER_SNORLAX_LL_BEAT_LEAGUE: 39,\n} as const;\n","/**\n * Endpoints of the PokéAPI\n */\nexport const ENDPOINTS = {\n BERRY: \"/berry\",\n BERRY_FIRMNESS: \"/berry-firmness\",\n BERRY_FLAVOR: \"/berry-flavor\",\n CONTEST_TYPE: \"/contest-type\",\n CONTEST_EFFECT: \"/contest-effect\",\n SUPER_CONTEST_EFFECT: \"/super-contest-effect\",\n CURRENCY: \"/currency\",\n ENCOUNTER_METHOD: \"/encounter-method\",\n ENCOUNTER_CONDITION: \"/encounter-condition\",\n ENCOUNTER_CONDITION_VALUE: \"/encounter-condition-value\",\n EVOLUTION_CHAIN: \"/evolution-chain\",\n EVOLUTION_TRIGGER: \"/evolution-trigger\",\n GENERATION: \"/generation\",\n POKEDEX: \"/pokedex\",\n VERSION: \"/version\",\n VERSION_GROUP: \"/version-group\",\n ITEM: \"/item\",\n ITEM_ATTRIBUTE: \"/item-attribute\",\n ITEM_CATEGORY: \"/item-category\",\n ITEM_FLING_EFFECT: \"/item-fling-effect\",\n ITEM_POCKET: \"/item-pocket\",\n LOCATION: \"/location\",\n LOCATION_AREA: \"/location-area\",\n PALPARK_AREA: \"/pal-park-area\",\n REGION: \"/region\",\n MACHINE: \"/machine\",\n MOVE: \"/move\",\n MOVE_AILMENT: \"/move-ailment\",\n MOVE_BATTLE_STYLE: \"/move-battle-style\",\n MOVE_CATEGORY: \"/move-category\",\n MOVE_DAMAGE_CLASS: \"/move-damage-class\",\n MOVE_LEARN_METHOD: \"/move-learn-method\",\n MOVE_TARGET: \"/move-target\",\n ABILITY: \"/ability\",\n CHARACTERISTIC: \"/characteristic\",\n EGG_GROUP: \"/egg-group\",\n GENDER: \"/gender\",\n GROWTH_RATE: \"/growth-rate\",\n NATURE: \"/nature\",\n POKEATHLON_STAT: \"/pokeathlon-stat\",\n POKEMON: \"/pokemon\",\n POKEMON_COLOR: \"/pokemon-color\",\n POKEMON_FORM: \"/pokemon-form\",\n POKEMON_HABITAT: \"/pokemon-habitat\",\n POKEMON_SHAPE: \"/pokemon-shape\",\n POKEMON_SPECIES: \"/pokemon-species\",\n STAT: \"/stat\",\n TYPE: \"/type\",\n LANGUAGE: \"/language\",\n} as const;\n\ntype ObjectValue<T> = T[keyof T];\nexport type Endpoint = ObjectValue<typeof ENDPOINTS>;\n","export const EVOLUTION_TRIGGERS = {\n LEVEL_UP: 1,\n TRADE: 2,\n USE_ITEM: 3,\n SHED: 4,\n SPIN: 5,\n TOWER_OF_DARKNESS: 6,\n TOWER_OF_WATER: 7,\n THREE_CRITICAL_HITS: 8,\n TAKE_DAMAGE: 9,\n OTHER: 10,\n} as const;\n","export const GENERATIONS = {\n GENERATION_I: 1,\n GENERATION_II: 2,\n GENERATION_III: 3,\n GENERATION_IV: 4,\n GENERATION_V: 5,\n GENERATION_VI: 6,\n GENERATION_VII: 7,\n GENERATION_VIII: 8,\n} as const;\n\nexport const POKEDEXES = {\n NATIONAL: 1,\n KANTO: 2,\n ORIGINAL_JOHTO: 3,\n HOENN: 4,\n ORIGINAL_SINNOH: 5,\n EXTENDED_SINNOH: 6,\n UPDATED_JOHTO: 7,\n ORIGINAL_UNOVA: 8,\n UPDATED_UNOVA: 9,\n CONQUEST_GALLERY: 11,\n KALOS_CENTRAL: 12,\n KALOS_COASTAL: 13,\n KALOS_MONTAIN: 14,\n UPDATED_HOENN: 15,\n ORIGINAL_ALOLA: 16,\n ORIGINAL_MELEMELE: 17,\n ORIGINAL_AKALA: 18,\n ORIGINAL_ULAULA: 19,\n ORIGINAL_PONI: 20,\n UPDATED_ALOLA: 21,\n UPDATED_MELEMELE: 22,\n UPDATED_AKALA: 23,\n UPDATED_ULAULA: 24,\n UPDATED_PONI: 25,\n UPDATED_KANTO: 26,\n GALAR: 27,\n ISLE_OF_ARMOR: 28,\n CROWN_TUNDRA: 29,\n} as const;\n\nexport const VERSIONS = {\n RED: 1,\n BLUE: 2,\n YELLOW: 3,\n GOLD: 4,\n SILVER: 5,\n CRYSTAL: 6,\n RUBY: 7,\n SAPPHIRE: 8,\n EMERALD: 9,\n FIRERED: 10,\n LEAFGREEN: 11,\n DIAMOND: 12,\n PEARL: 13,\n PLATINUM: 14,\n HEARTGOLD: 15,\n SOULSILVER: 16,\n BLACK: 17,\n WHITE: 18,\n COLOSSEUM: 19,\n XD: 20,\n BLACK_2: 21,\n WHITE_2: 22,\n X: 23,\n Y: 24,\n OMEGA_RUBY: 25,\n ALPHA_SAPPHIRE: 26,\n SUN: 27,\n MOON: 28,\n ULTRA_SUN: 29,\n ULTRA_MOON: 30,\n LETS_GO_PIKACHU: 31,\n LETS_GO_EEVEE: 32,\n SWORD: 33,\n SHIELD: 34,\n THE_ISLE_OF_ARMOR: 35,\n THE_CROWN_TUNDRA: 36,\n BRILLIANT_DIAMOND: 37,\n SHINING_PEARL: 38,\n LEGENDS_ARCEUS: 39,\n} as const;\n\nexport const VERSION_GROUPS = {\n RED_BLUE: 1,\n YELLOW: 2,\n GOLD_SILVER: 3,\n CRYSTAL: 4,\n RUBY_SAPPHIRE: 5,\n EMERALD: 6,\n FIRERED_LEAFGREEN: 7,\n DIAMOND_PEARL: 8,\n PLATINUM: 9,\n HEARTGOLD_SOULSILVER: 10,\n BLACK_WHITE: 11,\n COLOSSEUM: 12,\n XD: 13,\n BLACK_2_WHITE_2: 14,\n X_Y: 15,\n OMEGA_RUBY_ALPHA_SAPPHIRE: 16,\n SUN_MOON: 17,\n ULTRA_SUN_ULTRA_MOON: 18,\n LETS_GO: 19,\n SWORD_SHIELD: 20,\n THE_ISLE_OF_ARMOR: 21,\n THE_CROWN_TUNDRA: 22,\n BRILLIANT_DIAMOND_AND_SHINING_PEARL: 23,\n LEGENDS_ARCEUS: 24,\n} as const;\n","export const ITEM_ATTRIBUTES = {\n COUNTABLE: 1,\n CONSUMABLE: 2,\n USABLE_OVERWORLD: 3,\n USABLE_IN_BATTLE: 4,\n HOLDABLE: 5,\n HOLDABLE_PASSIVE: 6,\n HOLDABLE_ACTIVE: 7,\n UNDERGROUND: 8,\n} as const;\n\nexport const ITEM_CATEGORIES = {\n STAT_BOOSTS: 1,\n EFFORT_DROP: 2,\n MEDICINE: 3,\n OTHER: 4,\n IN_A_PINCH: 5,\n PICKY_HEALING: 6,\n TYPE_PROTECTION: 7,\n BAKING_ONLY: 8,\n COLLECTIBLES: 9,\n EVOLUTION: 10,\n SPELUNKING: 11,\n HELD_ITEMS: 12,\n CHOICE: 13,\n EFFORT_TRAINING: 14,\n BAD_HELD_ITEMS: 15,\n TRAINING: 16,\n PLATES: 17,\n SPECIES_SPECIFIC: 18,\n TYPE_ENHANCEMENT: 19,\n EVENT_ITEMS: 20,\n GAMEPLAY: 21,\n PLOT_ADVANCEMENT: 22,\n UNUSED: 23,\n LOOT: 24,\n ALL_MAIL: 25,\n VITAMINS: 26,\n HEALING: 27,\n PP_RECOVERY: 28,\n REVIVAL: 29,\n STATUS_CURES: 30,\n MULCH: 32,\n SPECIAL_BALLS: 33,\n STANDARD_BALLS: 34,\n DEX_COMPLETION: 35,\n SCARVES: 36,\n ALL_MACHINES: 37,\n FLUTES: 38,\n APRICORN_BALLS: 39,\n APRICORN_BOX: 40,\n DATA_CARDS: 41,\n JEWELS: 42,\n MIRACLE_SHOOTER: 43,\n MEGA_STONES: 44,\n MEMORIES: 45,\n Z_CRYSTALS: 46,\n SPECIES_CANDIES: 47,\n CATCHING_BONUS: 48,\n DYNAMAX_CRISTALS: 49,\n NATURE_MINTS: 50,\n CURRY_INGREDIENTS: 51,\n} as const;\n\nexport const ITEM_FLING_EFFECTS = {\n BADLY_POISON: 1,\n BURN: 2,\n BERRY_EFFECT: 3,\n HERB_EFFECT: 4,\n PARALYZE: 5,\n POISON: 6,\n FLINCH: 7,\n} as const;\n\nexport const ITEM_POCKETS = {\n MISC: 1,\n MEDICINE: 2,\n POKEBALLS: 3,\n MACHINES: 4,\n BERRIES: 5,\n MAIL: 6,\n BATTLE: 7,\n KEY: 8,\n} as const;\n","export const REGIONS = {\n KANTO: 1,\n JOHTO: 2,\n HOENN: 3,\n SINNOH: 4,\n UNOVA: 5,\n KALOS: 6,\n ALOLA: 7,\n GALAR: 8,\n HISUI: 9,\n} as const;\n\nexport const PAL_PARK_AREAS = {\n FOREST: 1,\n FIELD: 2,\n MOUNTAIN: 3,\n POND: 4,\n SEA: 5,\n} as const;\n","export const MOVE_AILMENTS = {\n UNKNOWN: -1,\n NONE: 0,\n PARALYSIS: 1,\n SLEEP: 2,\n FREEZE: 3,\n BURN: 4,\n POISON: 5,\n CONFUSION: 6,\n INFATUATION: 7,\n TRAP: 8,\n NIGHTMARE: 9,\n TORMENT: 12,\n DISABLE: 13,\n YAWN: 14,\n HEAL_BLOCK: 15,\n NO_TYPE_IMMUNITY: 17,\n LEECH_SEED: 18,\n EMBARGO: 19,\n PERISH_SONG: 20,\n INGRAIN: 21,\n SILENCE: 24,\n TAR_SHOT: 42,\n} as const;\n\nexport const MOVE_BATTLE_STYLES = {\n ATTACK: 1,\n DEFENSE: 2,\n SUPPORT: 3,\n} as const;\n\nexport const MOVE_CATEGORIES = {\n DAMAGE: 0,\n AILMENT: 1,\n NET_GOOD_STATS: 2,\n HEAL: 3,\n DAMAGE_AILMENT: 4,\n SWAGGER: 5,\n DAMAGE_LOWER: 6,\n DAMAGE_RAISE: 7,\n DAMAGE_HEAL: 8,\n OHKO: 9,\n WHOLE_FIELD_EFFECT: 10,\n FIELD_EFFECT: 11,\n FORCE_SWITCH: 12,\n UNIQUE: 13,\n} as const;\n\nexport const MOVE_DAMAGE_CLASSES = {\n STATUS: 1,\n PHYSICAL: 2,\n SPECIAL: 3,\n} as const;\n\nexport const MOVE_LEARN_METHODS = {\n LEVEL_UP: 1,\n EGG: 2,\n TUTOR: 3,\n MACHINE: 4,\n STADIUM_SURFING_PIKACHU: 5,\n LIGHT_BALL_EGG: 6,\n COLOSSEUM_PURIFICATION: 7,\n XD_SHADOW: 8,\n XD_PURIFICATION: 9,\n FORM_CHANGE: 10,\n} as const;\n\nexport const MOVE_TARGETS = {\n SPECIFIC_MOVE: 1,\n SELECTED_POKEMON_ME_FIRST: 2,\n ALLY: 3,\n USERS_FIELD: 4,\n USER_OR_ALLY: 5,\n OPPONENTS_FIELD: 6,\n USER: 7,\n RANDOM_OPPONENT: 8,\n ALL_OTHER_POKEMON: 9,\n SELECTED_POKEMON: 10,\n ALL_OPPONENTS: 11,\n ENTIRE_FIELD: 12,\n USER_AND_ALIES: 13,\n ALL_POKEMON: 14,\n ALL_ALLIES: 15,\n} as const;\n","export const EGG_GROUPS = {\n MONSTER: 1,\n WATER1: 2,\n BUG: 3,\n FLYING: 4,\n GROUND: 5,\n FAIRY: 6,\n PLANT: 7,\n HUMANSHAPE: 8,\n WATER3: 9,\n MINERAL: 10,\n INDETERMINATE: 11,\n WATER2: 12,\n DITTO: 13,\n DRAGON: 14,\n NO_EGGS: 15,\n} as const;\n\nexport const GENDERS = {\n FEMALE: 1,\n MALE: 2,\n GENDERLESS: 3,\n} as const;\n\nexport const GROWTH_RATES = {\n SLOW: 1,\n MEDIUM: 2,\n FAST: 3,\n MEDIUM_SLOW: 4,\n SLOW_THEN_VERY_FAST: 5,\n FAST_THEN_VERY_SLOW: 6,\n} as const;\n\nexport const NATURES = {\n HARDY: 1,\n BOLD: 2,\n MODEST: 3,\n CALM: 4,\n TIMID: 5,\n LONELY: 6,\n DOCILE: 7,\n MILD: 8,\n GENTLE: 9,\n HASTY: 10,\n ADAMANT: 11,\n IMPISH: 12,\n BASHFUL: 13,\n CAREFUL: 14,\n RASH: 15,\n JOLLY: 16,\n NAUGHTY: 17,\n LAX: 18,\n QUIRKY: 19,\n NAIVE: 20,\n BRAVE: 21,\n RELAXED: 22,\n QUIET: 23,\n SASSY: 24,\n SERIOUS: 25,\n} as const;\n\nexport const POKEATHLON_STATS = {\n SPEED: 1,\n POWER: 2,\n SKILL: 3,\n STAMINA: 4,\n JUMP: 5,\n} as const;\n\nexport const POKEMON_COLORS = {\n BLACK: 1,\n BLUE: 2,\n BROWN: 3,\n GRAY: 4,\n GREEN: 5,\n PINK: 6,\n PURPLE: 7,\n RED: 8,\n WHITE: 9,\n YELLOW: 10,\n} as const;\n\nexport const POKEMON_HABITATS = {\n CAVE: 1,\n FOREST: 2,\n GRASSLAND: 3,\n MONTAIN: 4,\n RARE: 5,\n ROUGH_TERRAIN: 6,\n SEA: 7,\n URBAN: 8,\n WATERS_EDGE: 9,\n} as const;\n\nexport const POKEMON_SHAPES = {\n BALL: 1,\n SQUIGGLE: 2,\n FISH: 3,\n ARMS: 4,\n BLOB: 5,\n UPRIGHT: 6,\n LEGS: 7,\n QUADRUPED: 8,\n WINGS: 9,\n TENTACLES: 10,\n HEADS: 11,\n HUMANOID: 12,\n BUG_WINGS: 13,\n ARMOR: 14,\n} as const;\n\nexport const STATS = {\n HP: 1,\n ATTACK: 2,\n DEFENSE: 3,\n SPECIAL_ATTACK: 4,\n SPECIAL_DEFENSE: 5,\n SPEED: 6,\n ACCURACY: 7,\n EVASION: 8,\n} as const;\n\nexport const TYPES = {\n NORMAL: 1,\n FIGHTING: 2,\n FLYING: 3,\n POISON: 4,\n GROUND: 5,\n ROCK: 6,\n BUG: 7,\n GHOST: 8,\n STEEL: 9,\n FIRE: 10,\n WATER: 11,\n GRASS: 12,\n ELECTRIC: 13,\n PSYCHIC: 14,\n ICE: 15,\n DRAGON: 16,\n DARK: 17,\n FAIRY: 18,\n UNKNOWN: 10_001,\n SHADOW: 10_002,\n} as const;\n","export const LANGUAGES = {\n JA_HRKT: 1,\n JA_ROMA: 2,\n KO: 3,\n ZH_HANT: 4,\n FR: 5,\n DE: 6,\n ES: 7,\n IT: 8,\n EN: 9,\n CS: 10,\n JA: 11,\n ZH_HANS: 12,\n PT_BR: 13,\n} as const;\n","export * from \"./base\";\nexport * from \"./berries\";\nexport * from \"./contests\";\nexport * from \"./currencies\";\nexport * from \"./encounters\";\nexport * from \"./endpoints\";\nexport * from \"./evolutions\";\nexport * from \"./games\";\nexport * from \"./items\";\nexport * from \"./locations\";\nexport * from \"./moves\";\nexport * from \"./pokemons\";\nexport * from \"./utilities\";\n","/** Five minutes. */\nconst DEFAULT_TTL = 300_000;\nconst DEFAULT_MAX_ENTRIES = 500;\n\n/**\n * ## Cache Store\n * The contract a client uses to cache responses, keyed by request URL.\n *\n * Every method may return a promise, so remote backends (Redis, KV stores) work\n * as-is. Values cross this boundary as parsed objects; expiry is the store's own\n * business.\n */\nexport interface CacheStore {\n get(key: string): unknown | Promise<unknown>;\n set(key: string, value: unknown): void | Promise<void>;\n delete?(key: string): void | Promise<void>;\n clear?(): void | Promise<void>;\n}\n\n/** Default namespace for the keys {@link WebStorageCache} owns. */\nconst DEFAULT_PREFIX = \"pokenode:\";\n\n/**\n * ## Memory Cache Options\n * Used to configure the default in-memory store.\n */\nexport interface MemoryCacheOptions {\n /** How long a cached response stays fresh, in milliseconds. Defaults to 5 minutes. */\n ttl?: number;\n /** Maximum number of responses kept. The least recently used entry is evicted. Defaults to 500. */\n maxEntries?: number;\n}\n\ninterface CacheEntry {\n value: unknown;\n expiresAt: number;\n}\n\n/**\n * ## Memory Cache\n * The default {@link CacheStore}: a bounded, time-to-live cache held in memory.\n *\n * Values are stored and returned by reference — mutating a response also mutates\n * what later cache hits return, so treat responses as read-only.\n */\nexport class MemoryCache implements CacheStore {\n private readonly entries = new Map<string, CacheEntry>();\n private readonly ttl: number;\n private readonly maxEntries: number;\n\n constructor(options?: MemoryCacheOptions) {\n this.ttl = options?.ttl ?? DEFAULT_TTL;\n this.maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;\n }\n\n get(key: string): unknown {\n const entry = this.entries.get(key);\n\n if (!entry) {\n return undefined;\n }\n\n if (entry.expiresAt <= Date.now()) {\n this.entries.delete(key);\n return undefined;\n }\n\n // Re-insert so `entries` stays ordered least- to most-recently used.\n this.entries.delete(key);\n this.entries.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: unknown): void {\n // Delete first so an update moves the key to the most-recently-used end.\n this.entries.delete(key);\n\n if (this.entries.size >= this.maxEntries) {\n const oldest = this.entries.keys().next();\n if (!oldest.done) {\n this.entries.delete(oldest.value);\n }\n }\n\n this.entries.set(key, { value, expiresAt: Date.now() + this.ttl });\n }\n\n delete(key: string): void {\n this.entries.delete(key);\n }\n\n clear(): void {\n this.entries.clear();\n }\n}\n\n/**\n * ## Web Storage Like\n * The part of the browser's `Storage` interface a {@link WebStorageCache} uses.\n *\n * Declared structurally rather than as the DOM's `Storage`: the package compiles\n * without `lib.dom`, and stays usable anywhere the same shape exists.\n *\n * Every method may return a promise, so a React Native `AsyncStorage` works as-is.\n * Key enumeration is the one place the two shapes differ: `Storage` exposes\n * `length` and `key(index)`, `AsyncStorage` exposes `getAllKeys`, and a property\n * cannot be awaited — so both are accepted, and a storage offering neither still\n * caches; it just never evicts or clears.\n */\nexport interface WebStorageLike {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n /** Every key held, this store's and the application's alike. */\n getAllKeys?(): readonly string[] | Promise<readonly string[]>;\n key?(index: number): string | null;\n readonly length?: number;\n}\n\n/**\n * ## Web Storage Cache Options\n * Used to configure a store backed by `localStorage` or `sessionStorage`.\n */\nexport interface WebStorageCacheOptions {\n /**\n * Where entries are kept. Pass `localStorage`, `sessionStorage`, a React Native\n * `AsyncStorage`, or anything else matching {@link WebStorageLike}.\n */\n storage: WebStorageLike;\n /** How long a cached response stays fresh, in milliseconds. Defaults to 5 minutes. */\n ttl?: number;\n /** Namespace for the keys this store writes. Defaults to `pokenode:`. */\n prefix?: string;\n}\n\n/**\n * ## Web Storage Cache\n * A {@link CacheStore} backed by `localStorage` or `sessionStorage`, so a cached\n * response survives a page reload.\n *\n * ```ts\n * const api = new PokemonClient({ cache: new WebStorageCache({ storage: localStorage }) });\n * ```\n *\n * Only keys under {@link WebStorageCacheOptions.prefix} are ever read, evicted or\n * cleared — the storage is assumed to be shared with the surrounding application.\n *\n * Values round-trip through JSON, so unlike {@link MemoryCache} every hit returns a\n * fresh copy. Anything a `JSON.stringify` cannot represent does not survive, which\n * covers every PokéAPI response.\n *\n * A storage that throws instead of answering is treated as empty: a read is a miss\n * and a write is dropped, because neither is worth failing the request that\n * triggered it over.\n */\nexport class WebStorageCache implements CacheStore {\n private readonly storage: WebStorageLike;\n private readonly ttl: number;\n private readonly prefix: string;\n\n constructor(options: WebStorageCacheOptions) {\n this.storage = options.storage;\n this.ttl = options.ttl ?? DEFAULT_TTL;\n this.prefix = options.prefix ?? DEFAULT_PREFIX;\n }\n\n async get(key: string): Promise<unknown> {\n const entry = await this.read(this.prefix + key);\n\n if (!entry) {\n return undefined;\n }\n\n if (entry.expiresAt <= Date.now()) {\n await this.remove(this.prefix + key);\n return undefined;\n }\n\n return entry.value;\n }\n\n async set(key: string, value: unknown): Promise<void> {\n const entry = JSON.stringify({ value, expiresAt: Date.now() + this.ttl });\n\n try {\n await this.storage.setItem(this.prefix + key, entry);\n } catch {\n // Out of quota, most likely. Make room among this store's own keys and try\n // once more; a cache write that cannot land must not fail the request that\n // triggered it, so a second failure is dropped.\n await this.evict();\n\n try {\n await this.storage.setItem(this.prefix + key, entry);\n } catch {\n return;\n }\n }\n }\n\n async delete(key: string): Promise<void> {\n await this.storage.removeItem(this.prefix + key);\n }\n\n async clear(): Promise<void> {\n for (const key of await this.ownKeys()) {\n await this.storage.removeItem(key);\n }\n }\n\n /** Reads a namespaced key, treating unreadable content as a miss. */\n private async read(key: string): Promise<CacheEntry | undefined> {\n let stored: string | null;\n\n try {\n stored = await this.storage.getItem(key);\n } catch {\n // A storage that refuses to be read — Safari with storage blocked, a shim\n // that throws — is a cache miss, not a failed request. The response the\n // caller asked for is still one fetch away.\n return undefined;\n }\n\n if (stored === null) {\n return undefined;\n }\n\n try {\n return JSON.parse(stored) as CacheEntry;\n } catch {\n // Written by an older version, or by something else under the same prefix.\n await this.remove(key);\n return undefined;\n }\n }\n\n /**\n * Frees space by dropping expired entries, falling back to the ones closest to\n * expiring when nothing has expired yet.\n */\n private async evict(): Promise<void> {\n const keys = await this.ownKeys();\n const entries = await Promise.all(\n keys.map(async (key) => ({ key, expiresAt: (await this.read(key))?.expiresAt })),\n );\n const now = Date.now();\n const expired = entries.filter(({ expiresAt }) => expiresAt === undefined || expiresAt <= now);\n\n if (expired.length > 0) {\n for (const { key } of expired) {\n await this.remove(key);\n }\n\n return;\n }\n\n const soonest = entries.sort((a, b) => (a.expiresAt ?? 0) - (b.expiresAt ?? 0));\n\n for (const { key } of soonest.slice(0, Math.ceil(soonest.length / 4))) {\n await this.remove(key);\n }\n }\n\n /**\n * Collects this store's keys before any removal: `key(index)` walks a list that\n * shifts underneath a loop that deletes as it goes.\n */\n private async ownKeys(): Promise<string[]> {\n return (await this.allKeys()).filter((key) => key.startsWith(this.prefix));\n }\n\n /**\n * Every key the storage holds, however it is willing to list them. A storage\n * offering no enumeration at all reports none, which leaves eviction and\n * `clear` as no-ops rather than an error on a path that only tidies up.\n */\n private async allKeys(): Promise<string[]> {\n try {\n if (this.storage.getAllKeys !== undefined) {\n return [...(await this.storage.getAllKeys())];\n }\n\n const { key, length } = this.storage;\n\n if (key === undefined || length === undefined) {\n return [];\n }\n\n const keys: string[] = [];\n\n for (let index = 0; index < length; index += 1) {\n const found = key.call(this.storage, index);\n\n if (found !== null) {\n keys.push(found);\n }\n }\n\n return keys;\n } catch {\n return [];\n }\n }\n\n /** Removes a key on a path that is only tidying up, where a refusal is moot. */\n private async remove(key: string): Promise<void> {\n try {\n await this.storage.removeItem(key);\n } catch {\n // The entry stays until the storage lets it go; a read of it is a miss\n // either way, since it is expired or unparseable.\n }\n }\n}\n","/**\n * Brands the error, so the guard can match on it instead of the prototype chain:\n * a tree loading both the ESM and the CJS build has two distinct classes.\n */\nconst ERROR_KIND = \"pokenode:http\";\n\n/**\n * ## Pokenode Error\n * Thrown when the PokéAPI answers with a non-2xx status. Transport failures are\n * not wrapped — the native error propagates untouched.\n */\nexport class PokenodeError extends Error {\n override readonly name = \"PokenodeError\";\n readonly kind = ERROR_KIND;\n\n /** HTTP status code of the response. */\n readonly status: number;\n /** HTTP status text of the response. */\n readonly statusText: string;\n /** URL that produced the error. */\n readonly url: string;\n /** Parsed response body, when the error response carried JSON. */\n readonly body: unknown;\n\n constructor(response: Response, body: unknown) {\n super(`Request to ${response.url} failed with status ${response.status}`);\n\n this.status = response.status;\n this.statusText = response.statusText;\n this.url = response.url;\n this.body = body;\n }\n\n /** Whether the error came from a pokenode-ts client. */\n static isPokenodeError(error: unknown): error is PokenodeError {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"kind\" in error &&\n (error as { kind: unknown }).kind === ERROR_KIND\n );\n }\n}\n\n/**\n * Builds a {@link PokenodeError} from a failed response, reading the body when\n * it is JSON. The PokéAPI answers 404s with plain text, so a parse failure is\n * expected and leaves `body` undefined.\n */\nexport const toPokenodeError = async (response: Response): Promise<PokenodeError> => {\n let body: unknown;\n\n try {\n body = await response.json();\n } catch {\n body = undefined;\n }\n\n return new PokenodeError(response, body);\n};\n","/**\n * Fields shared by every payload.\n *\n * The text is carried twice on purpose. pino, bunyan and roarr read `msg`;\n * winston reads `message`. Sending both is what lets a logger from either family\n * be passed straight in, with no adapter to write and nothing logged as\n * `undefined`.\n */\ninterface LogFields {\n /** Which point of the request lifecycle this is, for filtering. */\n event: \"request\" | \"response\" | \"error\";\n msg: string;\n message: string;\n /** The request URL, with any credentials the base URL carried removed. */\n url: string;\n}\n\n/**\n * ## Log Request Payload\n * A request is about to be resolved, from cache or over the network.\n */\nexport interface LogRequestPayload extends LogFields {\n event: \"request\";\n /** The HTTP method, uppercase, as RFC 9110 and OpenTelemetry both expect. */\n method: string;\n}\n\n/**\n * ## Log Response Payload\n * A response was produced.\n */\nexport interface LogResponsePayload extends LogFields {\n event: \"response\";\n status: number;\n /**\n * Where the response came from.\n *\n * - `network` — a round trip was made.\n * - `cache` — served by the {@link CacheStore}; nothing left the process.\n * - `in-flight` — an identical request was already on the wire and this caller\n * shared it, so it made no round trip of its own.\n *\n * Counting only `network` gives the number of requests the PokéAPI actually\n * saw. Every caller reports, so counting all three gives the number of calls\n * the application made.\n */\n source: \"network\" | \"cache\" | \"in-flight\";\n /** How long the client took to resolve the request, in milliseconds. */\n durationMs: number;\n}\n\n/**\n * ## Log Error Payload\n * A request failed.\n *\n * The error is carried twice for the same reason the message is: pino runs its\n * error serializer on `err` and nothing else, so an `Error` under any other key\n * would reach the log as `{}` — no message, no stack.\n */\nexport interface LogErrorPayload extends LogFields {\n event: \"error\";\n /** Whatever `fetch` or the API produced. */\n err: unknown;\n error: unknown;\n}\n\n/**\n * ## Logger\n * Where a client reports what it did.\n *\n * Deliberately the shape every logging library already has, so one can be passed\n * without glue:\n *\n * ```ts\n * new PokemonClient({ logger: pino() });\n * new PokemonClient({ logger: console });\n * new PokemonClient({ logger: winston.createLogger() });\n * ```\n *\n * Requests and responses go to `debug`; failures go to `error`. Nothing is\n * logged unless a logger is passed, and a client never picks a level of its own.\n */\nexport interface Logger {\n debug(payload: LogRequestPayload | LogResponsePayload): void;\n error(payload: LogErrorPayload): void;\n}\n\n/**\n * Builds the message keys both logging families expect. Internal — the payload\n * types are the public contract.\n */\nexport const logMessage = (text: string): { msg: string; message: string } => ({\n msg: text,\n message: text,\n});\n\n/**\n * A {@link Logger} that writes the request lifecycle to the console as one\n * formatted line per event.\n *\n * `console` itself is a valid {@link Logger} and logs the payload as an object;\n * this is for when the terminal should stay readable.\n */\nexport const consoleLogger: Logger = {\n debug(payload) {\n console.log(\n payload.event === \"request\"\n ? `[ Request Config ] ${payload.method} | ${payload.url}`\n : `[ Response ] STATUS ${payload.status} | ${payload.source.toUpperCase()} | ${payload.durationMs.toFixed(1)}ms`,\n );\n },\n\n error({ url, err }) {\n const { name, message } =\n err instanceof Error ? err : { name: \"UNKNOWN\", message: String(err) };\n\n console.error(`[ Response Error ] ${url} | CODE ${name} | ${message}`);\n },\n};\n","import { type CacheStore, MemoryCache } from \"../config/cache\";\nimport { toPokenodeError } from \"../config/errors\";\nimport { type Logger, type LogResponsePayload, logMessage } from \"../config/logger\";\nimport { BASE_URL, type Endpoint } from \"../constants\";\nimport type {\n APIResource,\n APIResourceList,\n NamedAPIResource,\n NamedAPIResourceList,\n} from \"../models/Common/resource\";\n\n/**\n * Scanned rather than matched with `/\\/+$/`: that pattern backtracks through\n * every slash of a long run that turns out not to end the string, which is\n * quadratic on a URL an untrusted caller supplies. This walks each character\n * once.\n */\nconst trimTrailingSlash = (url: string): string => {\n let end = url.length;\n\n while (end > 0 && url[end - 1] === \"/\") {\n end -= 1;\n }\n\n return url.slice(0, end);\n};\n\n/** Builds the paginated request path shared by both list methods. */\nconst listPath = (endpoint: Endpoint, offset: number, limit: number): string => {\n const query = new URLSearchParams({ offset: String(offset), limit: String(limit) });\n\n return `${endpoint}?${query}`;\n};\n\n/**\n * Drops the trailing slash from a request URL, leaving any query string alone.\n *\n * Both call paths must produce one cache key: `getResource` builds `/berry/1`,\n * while the PokéAPI's own links end in a slash.\n *\n * Split at the query rather than matched with a lookahead, for the reason given\n * on {@link trimTrailingSlash}.\n */\nconst normalizeURL = (url: string): string => {\n const queryAt = url.indexOf(\"?\");\n\n if (queryAt === -1) {\n return trimTrailingSlash(url);\n }\n\n return trimTrailingSlash(url.slice(0, queryAt)) + url.slice(queryAt);\n};\n\n/** A path segment naming an API version, as in `/api/v2/berry/1`. */\nconst API_VERSION_SEGMENT = /^v\\d+$/;\n\n/** Base64-encodes userinfo as RFC 7617 wants it: UTF-8 bytes, percent-decoded. */\nconst toBasicAuth = (username: string, password: string): string => {\n const userinfo = `${decodeURIComponent(username)}:${decodeURIComponent(password)}`;\n const bytes = new TextEncoder().encode(userinfo);\n let latin1 = \"\";\n\n for (const byte of bytes) {\n latin1 += String.fromCharCode(byte);\n }\n\n return `Basic ${btoa(latin1)}`;\n};\n\n/** A request URL and the `Authorization` header its userinfo became, if any. */\ninterface CredentiallessURL {\n url: string;\n authorization: string | undefined;\n}\n\n/**\n * Moves any credentials a URL carries into an `Authorization` header.\n *\n * A self-hosted instance behind basic auth is configured as\n * `https://user:secret@host/api/v2`, and that password must not reach the wire\n * as userinfo: `fetch` rejects a credentialed URL outright, and everything\n * downstream of the URL — the log payload, the cache key — would carry it.\n *\n * A URL too malformed to parse cannot carry credentials in the first place, and\n * `fetch` is about to reject it anyway, so it is passed through untouched.\n */\nconst splitCredentials = (url: string): CredentiallessURL => {\n if (!url.includes(\"@\")) {\n return { url, authorization: undefined };\n }\n\n let parsed: URL;\n\n try {\n parsed = new URL(url);\n } catch {\n return { url, authorization: undefined };\n }\n\n if (!parsed.username && !parsed.password) {\n return { url, authorization: undefined };\n }\n\n const authorization = toBasicAuth(parsed.username, parsed.password);\n\n parsed.username = \"\";\n parsed.password = \"\";\n\n return { url: parsed.toString(), authorization };\n};\n\n/**\n * Reduces an absolute resource URL to the endpoint path to request.\n *\n * When the URL belongs to `baseURL`, the path is simply what follows it.\n * Otherwise — a link from pokeapi.co handed to a client aimed at a self-hosted\n * instance — the path after the API version segment is used, so the resource is\n * re-resolved against the client's own base rather than fetched from elsewhere.\n *\n * The version segment is matched on parsed URL components: a raw-string search\n * also matches a host like `api.v2.example.com`.\n */\nconst toEndpointPath = (resourceURL: string, baseURL: string): string => {\n const resource = new URL(resourceURL);\n const base = new URL(baseURL);\n const basePath = trimTrailingSlash(base.pathname);\n\n if (\n resource.origin === base.origin &&\n (resource.pathname === basePath || resource.pathname.startsWith(`${basePath}/`))\n ) {\n return `${resource.pathname.slice(basePath.length)}${resource.search}`;\n }\n\n const segments = resource.pathname.split(\"/\");\n const version = segments.findIndex((segment) => API_VERSION_SEGMENT.test(segment));\n\n if (version === -1) {\n throw new TypeError(`Cannot resolve \"${resourceURL}\" against the base URL \"${baseURL}\"`);\n }\n\n return `/${segments.slice(version + 1).join(\"/\")}${resource.search}`;\n};\n\n/**\n * ## Fetch Like\n * A `fetch` implementation taking a string URL, as every client call does.\n */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/** A parsed response body and the status it arrived with. */\ninterface FetchedResource {\n data: unknown;\n status: number;\n}\n\n/**\n * ## Client Options\n * Optional configuration accepted by every client.\n */\nexport interface ClientOptions {\n /**\n * Where the request lifecycle is reported. Leave empty to log nothing, or pass\n * {@link consoleLogger} to write it to the console.\n */\n logger?: Logger;\n /**\n * Response cache. Leave empty for an in-memory {@link MemoryCache}, pass `false`\n * to disable caching, or supply your own {@link CacheStore}.\n */\n cache?: CacheStore | false;\n /** Location of the PokéAPI. Leave empty to use the official PokéAPI instance. */\n baseURL?: string;\n /**\n * Custom `fetch` implementation, for proxies, retries, cancellation or\n * instrumentation. Defaults to the global `fetch`.\n *\n * Requests carry no timeout of their own: supply an `AbortSignal` here if you\n * want one.\n */\n fetch?: FetchLike;\n}\n\n/**\n * ## Base Client\n * Base class for every section client. Handles requests to the PokéAPI, along\n * with caching and logging.\n */\nexport class BaseClient {\n /** The store backing this client, or `undefined` when caching is disabled. */\n public readonly cache: CacheStore | undefined;\n\n private readonly baseURL: string;\n private readonly logger: Logger | undefined;\n private readonly fetch: FetchLike;\n /** Requests already on the wire, so concurrent callers share one round trip. */\n private readonly inFlight = new Map<string, Promise<FetchedResource>>();\n\n constructor(clientOptions?: ClientOptions) {\n this.baseURL = trimTrailingSlash(clientOptions?.baseURL ?? BASE_URL.REST);\n this.cache =\n clientOptions?.cache === false ? undefined : (clientOptions?.cache ?? new MemoryCache());\n this.logger = clientOptions?.logger;\n this.fetch = clientOptions?.fetch ?? ((input, init) => globalThis.fetch(input, init));\n }\n\n /**\n * Drops every cached response. A {@link CacheStore} that does not implement\n * `clear` is left alone.\n */\n public async clearCache(): Promise<void> {\n await this.cache?.clear?.();\n }\n\n /**\n * Resolves a resource through the cache, then through any identical request\n * already in flight, and only then over the network.\n *\n * The URL is joined by concatenation: `new URL(path, base)` would discard the\n * base's own `/api/v2` path.\n */\n private async request<T>(path: string, baseURL = this.baseURL): Promise<T> {\n // Credentials leave the URL before anything else sees it: `fetch` rejects a\n // credentialed URL, and the cache key and log payload are built from this.\n const { url, authorization } = splitCredentials(\n normalizeURL(`${trimTrailingSlash(baseURL)}${path.startsWith(\"/\") ? path : `/${path}`}`),\n );\n\n const startedAt = performance.now();\n\n this.logger?.debug({\n event: \"request\",\n ...logMessage(\"pokeapi request\"),\n method: \"GET\",\n url,\n });\n\n const cached = await this.cache?.get(url);\n\n if (cached !== undefined) {\n // A hit is timed like any other resolution: the number is small, but a\n // store on the far side of a network is not guaranteed to make it so.\n this.logResponse(url, 200, \"cache\", startedAt);\n return cached as T;\n }\n\n // Every caller reports its own outcome, including one that only joined a\n // request someone else started: a `request` event with no `response` to\n // close it would make concurrent traffic unreadable. `source` is what keeps\n // the count of round trips honest when several callers share one.\n const pending = this.inFlight.get(url);\n const request = pending ?? this.dispatch(url, authorization);\n\n try {\n const { data, status } = await request;\n\n this.logResponse(url, status, pending ? \"in-flight\" : \"network\", startedAt);\n\n return data as T;\n } catch (error) {\n this.logger?.error({\n event: \"error\",\n ...logMessage(\"pokeapi request failed\"),\n url,\n err: error,\n error,\n });\n throw error;\n }\n }\n\n /** Issues a request and remembers it, so a concurrent caller can share it. */\n private dispatch(url: string, authorization?: string): Promise<FetchedResource> {\n const request = this.fetchResource(url, authorization).finally(() => this.inFlight.delete(url));\n\n this.inFlight.set(url, request);\n\n return request;\n }\n\n private async fetchResource(url: string, authorization?: string): Promise<FetchedResource> {\n const response = await this.fetch(url, {\n headers: authorization\n ? { Accept: \"application/json\", Authorization: authorization }\n : { Accept: \"application/json\" },\n });\n\n if (!response.ok) {\n throw await toPokenodeError(response);\n }\n\n const data: unknown = await response.json();\n\n await this.cache?.set(url, data);\n\n return { data, status: response.status };\n }\n\n private logResponse(\n url: string,\n status: number,\n source: LogResponsePayload[\"source\"],\n startedAt: number,\n ): void {\n this.logger?.debug({\n event: \"response\",\n ...logMessage(\"pokeapi response\"),\n url,\n status,\n source,\n durationMs: performance.now() - startedAt,\n });\n }\n\n /**\n * Retrieves a single resource from the PokéAPI by its endpoint and identifier.\n *\n * @param identifier - The identifier of the resource, or a path below the endpoint.\n * Omit it to address the endpoint itself.\n */\n protected async getResource<T>(endpoint: Endpoint, identifier?: string | number): Promise<T> {\n return this.request<T>(identifier === undefined ? endpoint : `${endpoint}/${identifier}`);\n }\n\n /**\n * Retrieves a resource by its URL, or by a link taken from another response.\n *\n * A link knows what it points at, so passing one infers `T`; a bare string\n * does not, and needs `T` named.\n *\n * @throws {TypeError} If the URL is not valid, or names no endpoint under `baseURL`.\n */\n protected async getResourceByURL<T>(\n resource: string | NamedAPIResource<T> | APIResource<T>,\n baseURL = this.baseURL,\n ): Promise<T> {\n const url = typeof resource === \"string\" ? resource : resource.url;\n\n return this.request<T>(toEndpointPath(url, baseURL), baseURL);\n }\n\n /**\n * Retrieves a list of resources from the PokéAPI with pagination support.\n *\n * @template T - What the listed links resolve to.\n */\n protected async getListResource<T = unknown>(\n endpoint: Endpoint,\n offset = 0,\n limit = 20,\n ): Promise<NamedAPIResourceList<T>> {\n return this.request<NamedAPIResourceList<T>>(listPath(endpoint, offset, limit));\n }\n\n /**\n * Retrieves a list of resources that have no name to list, with pagination support.\n *\n * @template T - What the listed links resolve to.\n */\n protected async getUnnamedListResource<T = unknown>(\n endpoint: Endpoint,\n offset = 0,\n limit = 20,\n ): Promise<APIResourceList<T>> {\n return this.request<APIResourceList<T>>(listPath(endpoint, offset, limit));\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Berry, BerryFirmness, BerryFlavor, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Berry Client\n *\n * Client used to access the Berry Endpoints:\n * - [Berries](https://pokeapi.co/docs/v2#berries)\n * - [Berry Firmnesses](https://pokeapi.co/docs/v2#berry-firmnesses)\n * - [Berry Flavors](https://pokeapi.co/docs/v2#berry-flavors)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#berries-section)\n */\nexport class BerryClient extends BaseClient {\n /** Get a Berry by its name. */\n public async getBerryByName(name: string): Promise<Berry> {\n return this.getResource(ENDPOINTS.BERRY, name);\n }\n\n /** Get a Berry by its ID. */\n public async getBerryById(id: number): Promise<Berry> {\n return this.getResource(ENDPOINTS.BERRY, id);\n }\n\n /** Get a Berry Firmness by its ID. */\n public async getBerryFirmnessById(id: number): Promise<BerryFirmness> {\n return this.getResource(ENDPOINTS.BERRY_FIRMNESS, id);\n }\n\n /** Get a Berry Firmness by its name. */\n public async getBerryFirmnessByName(name: string): Promise<BerryFirmness> {\n return this.getResource(ENDPOINTS.BERRY_FIRMNESS, name);\n }\n\n /** Get a Berry Flavor by its ID. */\n public async getBerryFlavorById(id: number): Promise<BerryFlavor> {\n return this.getResource(ENDPOINTS.BERRY_FLAVOR, id);\n }\n\n /** Get a Berry Flavor by its name. */\n public async getBerryFlavorByName(name: string): Promise<BerryFlavor> {\n return this.getResource(ENDPOINTS.BERRY_FLAVOR, name);\n }\n\n /** List Berries. Page defaults to 20 entries from offset 0. */\n public async listBerries(offset?: number, limit?: number): Promise<NamedAPIResourceList<Berry>> {\n return this.getListResource<Berry>(ENDPOINTS.BERRY, offset, limit);\n }\n\n /** List Berry Firmnesses. Page defaults to 20 entries from offset 0. */\n public async listBerryFirmnesses(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<BerryFirmness>> {\n return this.getListResource<BerryFirmness>(ENDPOINTS.BERRY_FIRMNESS, offset, limit);\n }\n\n /** List Berry Flavors. Page defaults to 20 entries from offset 0. */\n public async listBerryFlavors(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<BerryFlavor>> {\n return this.getListResource<BerryFlavor>(ENDPOINTS.BERRY_FLAVOR, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n APIResourceList,\n ContestEffect,\n ContestType,\n NamedAPIResourceList,\n SuperContestEffect,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Contest Client\n *\n * Client used to access the Contest Endpoints:\n * - [Contest Types](https://pokeapi.co/docs/v2#contest-types)\n * - [Contest Effects](https://pokeapi.co/docs/v2#contest-effects)\n * - [Super Contest Effects](https://pokeapi.co/docs/v2#super-contest-effects)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#contests-section)\n */\nexport class ContestClient extends BaseClient {\n /** Get a Contest Type by its name. */\n public async getContestTypeByName(name: string): Promise<ContestType> {\n return this.getResource(ENDPOINTS.CONTEST_TYPE, name);\n }\n\n /** Get a Contest Type by its ID. */\n public async getContestTypeById(id: number): Promise<ContestType> {\n return this.getResource(ENDPOINTS.CONTEST_TYPE, id);\n }\n\n /** Get a Contest Effect by its ID. */\n public async getContestEffectById(id: number): Promise<ContestEffect> {\n return this.getResource(ENDPOINTS.CONTEST_EFFECT, id);\n }\n\n /** Get a Super Contest Effect by its ID. */\n public async getSuperContestEffectById(id: number): Promise<SuperContestEffect> {\n return this.getResource(ENDPOINTS.SUPER_CONTEST_EFFECT, id);\n }\n\n /** List Contest Types. Page defaults to 20 entries from offset 0. */\n public async listContestTypes(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<ContestType>> {\n return this.getListResource<ContestType>(ENDPOINTS.CONTEST_TYPE, offset, limit);\n }\n\n /** List Contest Effects. Page defaults to 20 entries from offset 0. */\n public async listContestEffects(\n offset?: number,\n limit?: number,\n ): Promise<APIResourceList<ContestEffect>> {\n return this.getUnnamedListResource<ContestEffect>(ENDPOINTS.CONTEST_EFFECT, offset, limit);\n }\n\n /** List Super Contest Effects. Page defaults to 20 entries from offset 0. */\n public async listSuperContestEffects(\n offset?: number,\n limit?: number,\n ): Promise<APIResourceList<SuperContestEffect>> {\n return this.getUnnamedListResource<SuperContestEffect>(\n ENDPOINTS.SUPER_CONTEST_EFFECT,\n offset,\n limit,\n );\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Currency, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Currency Client\n *\n * Client used to access the Currency Endpoints:\n * - [Currencies](https://pokeapi.co/docs/v2#currencies)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#currencies-section)\n */\nexport class CurrencyClient extends BaseClient {\n /** Get a Currency by its name. */\n public async getCurrencyByName(name: string): Promise<Currency> {\n return this.getResource(ENDPOINTS.CURRENCY, name);\n }\n\n /** Get a Currency by its ID. */\n public async getCurrencyById(id: number): Promise<Currency> {\n return this.getResource(ENDPOINTS.CURRENCY, id);\n }\n\n /** List Currencies. Page defaults to 20 entries from offset 0. */\n public async listCurrencies(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Currency>> {\n return this.getListResource<Currency>(ENDPOINTS.CURRENCY, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n EncounterCondition,\n EncounterConditionValue,\n EncounterMethod,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Encounter Client\n *\n * Client used to access the Encounter Endpoints:\n * - [Encounter Methods](https://pokeapi.co/docs/v2#encounter-methods)\n * - [Encounter Conditions](https://pokeapi.co/docs/v2#encounter-conditions)\n * - [Encounter Condition Values](https://pokeapi.co/docs/v2#encounter-condition-values)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#encounters-section)\n */\nexport class EncounterClient extends BaseClient {\n /** Get an Encounter Method by its name. */\n public async getEncounterMethodByName(name: string): Promise<EncounterMethod> {\n return this.getResource<EncounterMethod>(ENDPOINTS.ENCOUNTER_METHOD, name);\n }\n\n /** Get an Encounter Method by its ID. */\n public async getEncounterMethodById(id: number): Promise<EncounterMethod> {\n return this.getResource<EncounterMethod>(ENDPOINTS.ENCOUNTER_METHOD, id);\n }\n\n /** Get an Encounter Condition by its ID. */\n public async getEncounterConditionById(id: number): Promise<EncounterCondition> {\n return this.getResource<EncounterCondition>(ENDPOINTS.ENCOUNTER_CONDITION, id);\n }\n\n /** Get an Encounter Condition by its name. */\n public async getEncounterConditionByName(name: string): Promise<EncounterCondition> {\n return this.getResource<EncounterCondition>(ENDPOINTS.ENCOUNTER_CONDITION, name);\n }\n\n /** Get an Encounter Condition Value by its name. */\n public async getEncounterConditionValueByName(name: string): Promise<EncounterConditionValue> {\n return this.getResource<EncounterConditionValue>(ENDPOINTS.ENCOUNTER_CONDITION_VALUE, name);\n }\n\n /** Get an Encounter Condition Value by its ID. */\n public async getEncounterConditionValueById(id: number): Promise<EncounterConditionValue> {\n return this.getResource<EncounterConditionValue>(ENDPOINTS.ENCOUNTER_CONDITION_VALUE, id);\n }\n\n /** List Encounter Methods. Page defaults to 20 entries from offset 0. */\n public async listEncounterMethods(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<EncounterMethod>> {\n return this.getListResource<EncounterMethod>(ENDPOINTS.ENCOUNTER_METHOD, offset, limit);\n }\n\n /** List Encounter Conditions. Page defaults to 20 entries from offset 0. */\n public async listEncounterConditions(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<EncounterCondition>> {\n return this.getListResource<EncounterCondition>(ENDPOINTS.ENCOUNTER_CONDITION, offset, limit);\n }\n\n /** List Encounter Condition Values. Page defaults to 20 entries from offset 0. */\n public async listEncounterConditionValues(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<EncounterConditionValue>> {\n return this.getListResource<EncounterConditionValue>(\n ENDPOINTS.ENCOUNTER_CONDITION_VALUE,\n offset,\n limit,\n );\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n APIResourceList,\n EvolutionChain,\n EvolutionTrigger,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Evolution Client\n *\n * Client used to access the Evolution Endpoints:\n * - [Evolution Chains](https://pokeapi.co/docs/v2#evolution-chains)\n * - [Evolution Triggers](https://pokeapi.co/docs/v2#evolution-triggers)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#evolution-section)\n */\nexport class EvolutionClient extends BaseClient {\n /** Get an Evolution Chain by its ID. */\n public async getEvolutionChainById(id: number): Promise<EvolutionChain> {\n return this.getResource(ENDPOINTS.EVOLUTION_CHAIN, id);\n }\n\n /** Get an Evolution Trigger by its ID. */\n public async getEvolutionTriggerById(id: number): Promise<EvolutionTrigger> {\n return this.getResource(ENDPOINTS.EVOLUTION_TRIGGER, id);\n }\n\n /** Get an Evolution Trigger by its name. */\n public async getEvolutionTriggerByName(name: string): Promise<EvolutionTrigger> {\n return this.getResource(ENDPOINTS.EVOLUTION_TRIGGER, name);\n }\n\n /** List Evolution Chains. Page defaults to 20 entries from offset 0. */\n public async listEvolutionChains(\n offset?: number,\n limit?: number,\n ): Promise<APIResourceList<EvolutionChain>> {\n return this.getUnnamedListResource<EvolutionChain>(ENDPOINTS.EVOLUTION_CHAIN, offset, limit);\n }\n\n /** List Evolution Triggers. Page defaults to 20 entries from offset 0. */\n public async listEvolutionTriggers(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<EvolutionTrigger>> {\n return this.getListResource<EvolutionTrigger>(ENDPOINTS.EVOLUTION_TRIGGER, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Generation, NamedAPIResourceList, Pokedex, Version, VersionGroup } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Game Client\n *\n * Client used to access the Game Endpoints:\n * - [Generations](https://pokeapi.co/docs/v2#generations)\n * - [Pokédexes](https://pokeapi.co/docs/v2#pokedexes)\n * - [Versions](https://pokeapi.co/docs/v2#version)\n * - [Version Groups](https://pokeapi.co/docs/v2#version-groups)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#games-section)\n */\nexport class GameClient extends BaseClient {\n /** Get a Generation by its name. */\n public async getGenerationByName(name: string): Promise<Generation> {\n return this.getResource(ENDPOINTS.GENERATION, name);\n }\n\n /** Get a Generation by its ID. */\n public async getGenerationById(id: number): Promise<Generation> {\n return this.getResource(ENDPOINTS.GENERATION, id);\n }\n\n /** Get a Pokédex by its name. */\n public async getPokedexByName(name: string): Promise<Pokedex> {\n return this.getResource(ENDPOINTS.POKEDEX, name);\n }\n\n /** Get a Pokédex by its ID. */\n public async getPokedexById(id: number): Promise<Pokedex> {\n return this.getResource(ENDPOINTS.POKEDEX, id);\n }\n\n /** Get a Version by its name. */\n public async getVersionByName(name: string): Promise<Version> {\n return this.getResource(ENDPOINTS.VERSION, name);\n }\n\n /** Get a Version by its ID. */\n public async getVersionById(id: number): Promise<Version> {\n return this.getResource(ENDPOINTS.VERSION, id);\n }\n\n /** Get a Version Group by its name. */\n public async getVersionGroupByName(name: string): Promise<VersionGroup> {\n return this.getResource(ENDPOINTS.VERSION_GROUP, name);\n }\n\n /** Get a Version Group by its ID. */\n public async getVersionGroupById(id: number): Promise<VersionGroup> {\n return this.getResource(ENDPOINTS.VERSION_GROUP, id);\n }\n\n /** List Generations. Page defaults to 20 entries from offset 0. */\n public async listGenerations(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Generation>> {\n return this.getListResource<Generation>(ENDPOINTS.GENERATION, offset, limit);\n }\n\n /** List Pokédexes. Page defaults to 20 entries from offset 0. */\n public async listPokedexes(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Pokedex>> {\n return this.getListResource<Pokedex>(ENDPOINTS.POKEDEX, offset, limit);\n }\n\n /** List Versions. Page defaults to 20 entries from offset 0. */\n public async listVersions(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Version>> {\n return this.getListResource<Version>(ENDPOINTS.VERSION, offset, limit);\n }\n\n /** List Version Groups. Page defaults to 20 entries from offset 0. */\n public async listVersionGroups(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<VersionGroup>> {\n return this.getListResource<VersionGroup>(ENDPOINTS.VERSION_GROUP, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n Item,\n ItemAttribute,\n ItemCategory,\n ItemFlingEffect,\n ItemPocket,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Item Client\n *\n * Client used to access the Item Endpoints:\n * - [Items](https://pokeapi.co/docs/v2#item)\n * - [Item Attributes](https://pokeapi.co/docs/v2#item-attributes)\n * - [Item Categories](https://pokeapi.co/docs/v2#item-categories)\n * - [Item Fling Effects](https://pokeapi.co/docs/v2#item-fling-effects)\n * - [Item Pockets](https://pokeapi.co/docs/v2#item-pockets)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#items-section)\n */\nexport class ItemClient extends BaseClient {\n /** Get an Item by its name. */\n public async getItemByName(name: string): Promise<Item> {\n return this.getResource(ENDPOINTS.ITEM, name);\n }\n\n /** Get an Item by its ID. */\n public async getItemById(id: number): Promise<Item> {\n return this.getResource(ENDPOINTS.ITEM, id);\n }\n\n /** Get an Item Attribute by its name. */\n public async getItemAttributeByName(name: string): Promise<ItemAttribute> {\n return this.getResource(ENDPOINTS.ITEM_ATTRIBUTE, name);\n }\n\n /** Get an Item Attribute by its ID. */\n public async getItemAttributeById(id: number): Promise<ItemAttribute> {\n return this.getResource(ENDPOINTS.ITEM_ATTRIBUTE, id);\n }\n\n /** Get an Item Category by its name. */\n public async getItemCategoryByName(name: string): Promise<ItemCategory> {\n return this.getResource(ENDPOINTS.ITEM_CATEGORY, name);\n }\n\n /** Get an Item Category by its ID. */\n public async getItemCategoryById(id: number): Promise<ItemCategory> {\n return this.getResource(ENDPOINTS.ITEM_CATEGORY, id);\n }\n\n /** Get an Item Fling Effect by its name. */\n public async getItemFlingEffectByName(name: string): Promise<ItemFlingEffect> {\n return this.getResource(ENDPOINTS.ITEM_FLING_EFFECT, name);\n }\n\n /** Get an Item Fling Effect by its ID. */\n public async getItemFlingEffectById(id: number): Promise<ItemFlingEffect> {\n return this.getResource(ENDPOINTS.ITEM_FLING_EFFECT, id);\n }\n\n /** Get an Item Pocket by its name. */\n public async getItemPocketByName(name: string): Promise<ItemPocket> {\n return this.getResource(ENDPOINTS.ITEM_POCKET, name);\n }\n\n /** Get an Item Pocket by its ID. */\n public async getItemPocketById(id: number): Promise<ItemPocket> {\n return this.getResource(ENDPOINTS.ITEM_POCKET, id);\n }\n\n /** List Items. Page defaults to 20 entries from offset 0. */\n public async listItems(offset?: number, limit?: number): Promise<NamedAPIResourceList<Item>> {\n return this.getListResource<Item>(ENDPOINTS.ITEM, offset, limit);\n }\n\n /** List Item Attributes. Page defaults to 20 entries from offset 0. */\n public async listItemAttributes(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<ItemAttribute>> {\n return this.getListResource<ItemAttribute>(ENDPOINTS.ITEM_ATTRIBUTE, offset, limit);\n }\n\n /** List Item Categories. Page defaults to 20 entries from offset 0. */\n public async listItemCategories(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<ItemCategory>> {\n return this.getListResource<ItemCategory>(ENDPOINTS.ITEM_CATEGORY, offset, limit);\n }\n\n /** List Item Fling Effects. Page defaults to 20 entries from offset 0. */\n public async listItemFlingEffects(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<ItemFlingEffect>> {\n return this.getListResource<ItemFlingEffect>(ENDPOINTS.ITEM_FLING_EFFECT, offset, limit);\n }\n\n /** List Item Pockets. Page defaults to 20 entries from offset 0. */\n public async listItemPockets(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<ItemPocket>> {\n return this.getListResource<ItemPocket>(ENDPOINTS.ITEM_POCKET, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { Location, LocationArea, NamedAPIResourceList, PalParkArea, Region } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Location Client\n *\n * Client used to access the Location Endpoints:\n * - [Locations](https://pokeapi.co/docs/v2#locations)\n * - [Location Areas](https://pokeapi.co/docs/v2#location-areas)\n * - [Pal Park Areas](https://pokeapi.co/docs/v2#pal-park-areas)\n * - [Regions](https://pokeapi.co/docs/v2#regions)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#locations-section)\n */\nexport class LocationClient extends BaseClient {\n /** Get a Location by its name. */\n public async getLocationByName(name: string): Promise<Location> {\n return this.getResource(ENDPOINTS.LOCATION, name);\n }\n\n /** Get a Location by its ID. */\n public async getLocationById(id: number): Promise<Location> {\n return this.getResource(ENDPOINTS.LOCATION, id);\n }\n\n /** Get a Location Area by its name. */\n public async getLocationAreaByName(name: string): Promise<LocationArea> {\n return this.getResource(ENDPOINTS.LOCATION_AREA, name);\n }\n\n /** Get a Location Area by its ID. */\n public async getLocationAreaById(id: number): Promise<LocationArea> {\n return this.getResource(ENDPOINTS.LOCATION_AREA, id);\n }\n\n /** Get a Pal Park Area by its name. */\n public async getPalParkAreaByName(name: string): Promise<PalParkArea> {\n return this.getResource(ENDPOINTS.PALPARK_AREA, name);\n }\n\n /** Get a Pal Park Area by its ID. */\n public async getPalParkAreaById(id: number): Promise<PalParkArea> {\n return this.getResource(ENDPOINTS.PALPARK_AREA, id);\n }\n\n /** Get a Region by its name. */\n public async getRegionByName(name: string): Promise<Region> {\n return this.getResource(ENDPOINTS.REGION, name);\n }\n\n /** Get a Region by its ID. */\n public async getRegionById(id: number): Promise<Region> {\n return this.getResource(ENDPOINTS.REGION, id);\n }\n\n /** List Locations. Page defaults to 20 entries from offset 0. */\n public async listLocations(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Location>> {\n return this.getListResource<Location>(ENDPOINTS.LOCATION, offset, limit);\n }\n\n /** List Location Areas. Page defaults to 20 entries from offset 0. */\n public async listLocationAreas(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<LocationArea>> {\n return this.getListResource<LocationArea>(ENDPOINTS.LOCATION_AREA, offset, limit);\n }\n\n /** List Pal Park Areas. Page defaults to 20 entries from offset 0. */\n public async listPalParkAreas(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PalParkArea>> {\n return this.getListResource<PalParkArea>(ENDPOINTS.PALPARK_AREA, offset, limit);\n }\n\n /** List Regions. Page defaults to 20 entries from offset 0. */\n public async listRegions(offset?: number, limit?: number): Promise<NamedAPIResourceList<Region>> {\n return this.getListResource<Region>(ENDPOINTS.REGION, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { APIResourceList, Machine } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Machine Client\n *\n * Client used to access the Machine Endpoints:\n * - [Machines](https://pokeapi.co/docs/v2#machines)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#machines-section)\n */\nexport class MachineClient extends BaseClient {\n /** Get a Machine by its ID. */\n public async getMachineById(id: number): Promise<Machine> {\n return this.getResource(ENDPOINTS.MACHINE, id);\n }\n\n /** List Machines. Page defaults to 20 entries from offset 0. */\n public async listMachines(offset?: number, limit?: number): Promise<APIResourceList<Machine>> {\n return this.getUnnamedListResource<Machine>(ENDPOINTS.MACHINE, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n Move,\n MoveAilment,\n MoveBattleStyle,\n MoveCategory,\n MoveDamageClass,\n MoveLearnMethod,\n MoveTarget,\n NamedAPIResourceList,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Move Client\n *\n * Client used to access the Move Endpoints:\n * - [Moves](https://pokeapi.co/docs/v2#moves)\n * - [Move Ailments](https://pokeapi.co/docs/v2#move-ailments)\n * - [Move Battle Styles](https://pokeapi.co/docs/v2#move-battle-styles)\n * - [Move Categories](https://pokeapi.co/docs/v2#move-categories)\n * - [Move Damage Classes](https://pokeapi.co/docs/v2#move-damage-classes)\n * - [Move Learn Methods](https://pokeapi.co/docs/v2#move-learn-methods)\n * - [Move Targets](https://pokeapi.co/docs/v2#move-targets)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#moves-section)\n */\nexport class MoveClient extends BaseClient {\n /** Get a Move by its name. */\n public async getMoveByName(name: string): Promise<Move> {\n return this.getResource(ENDPOINTS.MOVE, name);\n }\n\n /** Get a Move by its ID. */\n public async getMoveById(id: number): Promise<Move> {\n return this.getResource(ENDPOINTS.MOVE, id);\n }\n\n /** Get a Move Ailment by its name. */\n public async getMoveAilmentByName(name: string): Promise<MoveAilment> {\n return this.getResource(ENDPOINTS.MOVE_AILMENT, name);\n }\n\n /** Get a Move Ailment by its ID. */\n public async getMoveAilmentById(id: number): Promise<MoveAilment> {\n return this.getResource(ENDPOINTS.MOVE_AILMENT, id);\n }\n\n /** Get a Move Battle Style by its name. */\n public async getMoveBattleStyleByName(name: string): Promise<MoveBattleStyle> {\n return this.getResource(ENDPOINTS.MOVE_BATTLE_STYLE, name);\n }\n\n /** Get a Move Battle Style by its ID. */\n public async getMoveBattleStyleById(id: number): Promise<MoveBattleStyle> {\n return this.getResource(ENDPOINTS.MOVE_BATTLE_STYLE, id);\n }\n\n /** Get a Move Category by its name. */\n public async getMoveCategoryByName(name: string): Promise<MoveCategory> {\n return this.getResource(ENDPOINTS.MOVE_CATEGORY, name);\n }\n\n /** Get a Move Category by its ID. */\n public async getMoveCategoryById(id: number): Promise<MoveCategory> {\n return this.getResource(ENDPOINTS.MOVE_CATEGORY, id);\n }\n\n /** Get a Move Damage Class by its name. */\n public async getMoveDamageClassByName(name: string): Promise<MoveDamageClass> {\n return this.getResource(ENDPOINTS.MOVE_DAMAGE_CLASS, name);\n }\n\n /** Get a Move Damage Class by its ID. */\n public async getMoveDamageClassById(id: number): Promise<MoveDamageClass> {\n return this.getResource(ENDPOINTS.MOVE_DAMAGE_CLASS, id);\n }\n\n /** Get a Move Learn Method by its name. */\n public async getMoveLearnMethodByName(name: string): Promise<MoveLearnMethod> {\n return this.getResource(ENDPOINTS.MOVE_LEARN_METHOD, name);\n }\n\n /** Get a Move Learn Method by its ID. */\n public async getMoveLearnMethodById(id: number): Promise<MoveLearnMethod> {\n return this.getResource(ENDPOINTS.MOVE_LEARN_METHOD, id);\n }\n\n /** Get a Move Target by its name. */\n public async getMoveTargetByName(name: string): Promise<MoveTarget> {\n return this.getResource(ENDPOINTS.MOVE_TARGET, name);\n }\n\n /** Get a Move Target by its ID. */\n public async getMoveTargetById(id: number): Promise<MoveTarget> {\n return this.getResource(ENDPOINTS.MOVE_TARGET, id);\n }\n\n /** List Moves. Page defaults to 20 entries from offset 0. */\n public async listMoves(offset?: number, limit?: number): Promise<NamedAPIResourceList<Move>> {\n return this.getListResource<Move>(ENDPOINTS.MOVE, offset, limit);\n }\n\n /** List Move Ailments. Page defaults to 20 entries from offset 0. */\n public async listMoveAilments(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<MoveAilment>> {\n return this.getListResource<MoveAilment>(ENDPOINTS.MOVE_AILMENT, offset, limit);\n }\n\n /** List Move Battle Styles. Page defaults to 20 entries from offset 0. */\n public async listMoveBattleStyles(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<MoveBattleStyle>> {\n return this.getListResource<MoveBattleStyle>(ENDPOINTS.MOVE_BATTLE_STYLE, offset, limit);\n }\n\n /** List Move Categories. Page defaults to 20 entries from offset 0. */\n public async listMoveCategories(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<MoveCategory>> {\n return this.getListResource<MoveCategory>(ENDPOINTS.MOVE_CATEGORY, offset, limit);\n }\n\n /** List Move Damage Classes. Page defaults to 20 entries from offset 0. */\n public async listMoveDamageClasses(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<MoveDamageClass>> {\n return this.getListResource<MoveDamageClass>(ENDPOINTS.MOVE_DAMAGE_CLASS, offset, limit);\n }\n\n /** List Move Learn Methods. Page defaults to 20 entries from offset 0. */\n public async listMoveLearnMethods(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<MoveLearnMethod>> {\n return this.getListResource<MoveLearnMethod>(ENDPOINTS.MOVE_LEARN_METHOD, offset, limit);\n }\n\n /** List Move Targets. Page defaults to 20 entries from offset 0. */\n public async listMoveTargets(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<MoveTarget>> {\n return this.getListResource<MoveTarget>(ENDPOINTS.MOVE_TARGET, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type {\n Ability,\n APIResourceList,\n Characteristic,\n EggGroup,\n Gender,\n GrowthRate,\n LocationAreaEncounter,\n NamedAPIResourceList,\n Nature,\n PokeathlonStat,\n Pokemon,\n PokemonColor,\n PokemonForm,\n PokemonHabitat,\n PokemonShape,\n PokemonSpecies,\n Stat,\n Type,\n} from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Pokémon Client\n *\n * Client used to access the Pokémon Endpoints:\n * - [Abilities](https://pokeapi.co/docs/v2#abilities)\n * - [Characteristics](https://pokeapi.co/docs/v2#characteristics)\n * - [Egg Groups](https://pokeapi.co/docs/v2#egg-groups)\n * - [Genders](https://pokeapi.co/docs/v2#genders)\n * - [Growth Rates](https://pokeapi.co/docs/v2#growth-rates)\n * - [Natures](https://pokeapi.co/docs/v2#natures)\n * - [Pokéathlon Stats](https://pokeapi.co/docs/v2#pokeathlon-stats)\n * - [Pokémon](https://pokeapi.co/docs/v2#pokemon)\n * - [Pokémon Location Areas](https://pokeapi.co/docs/v2#pokemon-location-areas)\n * - [Pokémon Colors](https://pokeapi.co/docs/v2#pokemon-colors)\n * - [Pokémon Forms](https://pokeapi.co/docs/v2#pokemon-forms)\n * - [Pokémon Habitats](https://pokeapi.co/docs/v2#pokemon-habitats)\n * - [Pokémon Shapes](https://pokeapi.co/docs/v2#pokemon-shapes)\n * - [Pokémon Species](https://pokeapi.co/docs/v2#pokemon-species)\n * - [Stats](https://pokeapi.co/docs/v2#stats)\n * - [Types](https://pokeapi.co/docs/v2#types)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#pokemon-section)\n */\nexport class PokemonClient extends BaseClient {\n /** Get an Ability by its name. */\n public async getAbilityByName(name: string): Promise<Ability> {\n return this.getResource(ENDPOINTS.ABILITY, name);\n }\n\n /** Get an Ability by its ID. */\n public async getAbilityById(id: number): Promise<Ability> {\n return this.getResource(ENDPOINTS.ABILITY, id);\n }\n\n /** Get a Characteristic by its ID. */\n public async getCharacteristicById(id: number): Promise<Characteristic> {\n return this.getResource(ENDPOINTS.CHARACTERISTIC, id);\n }\n\n /** Get an Egg Group by its name. */\n public async getEggGroupByName(name: string): Promise<EggGroup> {\n return this.getResource(ENDPOINTS.EGG_GROUP, name);\n }\n\n /** Get an Egg Group by its ID. */\n public async getEggGroupById(id: number): Promise<EggGroup> {\n return this.getResource(ENDPOINTS.EGG_GROUP, id);\n }\n\n /** Get a Gender by its name. */\n public async getGenderByName(name: string): Promise<Gender> {\n return this.getResource(ENDPOINTS.GENDER, name);\n }\n\n /** Get a Gender by its ID. */\n public async getGenderById(id: number): Promise<Gender> {\n return this.getResource(ENDPOINTS.GENDER, id);\n }\n\n /** Get a Growth Rate by its name. */\n public async getGrowthRateByName(name: string): Promise<GrowthRate> {\n return this.getResource(ENDPOINTS.GROWTH_RATE, name);\n }\n\n /** Get a Growth Rate by its ID. */\n public async getGrowthRateById(id: number): Promise<GrowthRate> {\n return this.getResource(ENDPOINTS.GROWTH_RATE, id);\n }\n\n /** Get a Nature by its name. */\n public async getNatureByName(name: string): Promise<Nature> {\n return this.getResource(ENDPOINTS.NATURE, name);\n }\n\n /** Get a Nature by its ID. */\n public async getNatureById(id: number): Promise<Nature> {\n return this.getResource(ENDPOINTS.NATURE, id);\n }\n\n /** Get a Pokéathlon Stat by its name. */\n public async getPokeathlonStatByName(name: string): Promise<PokeathlonStat> {\n return this.getResource(ENDPOINTS.POKEATHLON_STAT, name);\n }\n\n /** Get a Pokéathlon Stat by its ID. */\n public async getPokeathlonStatById(id: number): Promise<PokeathlonStat> {\n return this.getResource(ENDPOINTS.POKEATHLON_STAT, id);\n }\n\n /** Get a Pokémon by its name. */\n public async getPokemonByName(name: string): Promise<Pokemon> {\n return this.getResource(ENDPOINTS.POKEMON, name);\n }\n\n /** Get a Pokémon by its ID. */\n public async getPokemonById(id: number): Promise<Pokemon> {\n return this.getResource(ENDPOINTS.POKEMON, id);\n }\n\n /**\n * Get the areas a Pokémon can be encountered in, by its ID.\n * @returns Every location area the Pokémon appears in, with its encounter details.\n */\n public async getPokemonLocationAreaById(id: number): Promise<LocationAreaEncounter[]> {\n // Encounters hang off a single Pokémon rather than being an endpoint of\n // their own, so the path below `/pokemon` is addressed directly.\n return this.getResource(ENDPOINTS.POKEMON, `${id}/encounters`);\n }\n\n /** Get a Pokémon Color by its name. */\n public async getPokemonColorByName(name: string): Promise<PokemonColor> {\n return this.getResource(ENDPOINTS.POKEMON_COLOR, name);\n }\n\n /** Get a Pokémon Color by its ID. */\n public async getPokemonColorById(id: number): Promise<PokemonColor> {\n return this.getResource(ENDPOINTS.POKEMON_COLOR, id);\n }\n\n /** Get a Pokémon Form by its name. */\n public async getPokemonFormByName(name: string): Promise<PokemonForm> {\n return this.getResource(ENDPOINTS.POKEMON_FORM, name);\n }\n\n /** Get a Pokémon Form by its ID. */\n public async getPokemonFormById(id: number): Promise<PokemonForm> {\n return this.getResource(ENDPOINTS.POKEMON_FORM, id);\n }\n\n /** Get a Pokémon Habitat by its name. */\n public async getPokemonHabitatByName(name: string): Promise<PokemonHabitat> {\n return this.getResource(ENDPOINTS.POKEMON_HABITAT, name);\n }\n\n /** Get a Pokémon Habitat by its ID. */\n public async getPokemonHabitatById(id: number): Promise<PokemonHabitat> {\n return this.getResource(ENDPOINTS.POKEMON_HABITAT, id);\n }\n\n /** Get a Pokémon Shape by its name. */\n public async getPokemonShapeByName(name: string): Promise<PokemonShape> {\n return this.getResource(ENDPOINTS.POKEMON_SHAPE, name);\n }\n\n /** Get a Pokémon Shape by its ID. */\n public async getPokemonShapeById(id: number): Promise<PokemonShape> {\n return this.getResource(ENDPOINTS.POKEMON_SHAPE, id);\n }\n\n /** Get a Pokémon Species by its name. */\n public async getPokemonSpeciesByName(name: string): Promise<PokemonSpecies> {\n return this.getResource(ENDPOINTS.POKEMON_SPECIES, name);\n }\n\n /** Get a Pokémon Species by its ID. */\n public async getPokemonSpeciesById(id: number): Promise<PokemonSpecies> {\n return this.getResource(ENDPOINTS.POKEMON_SPECIES, id);\n }\n\n /** Get a Stat by its name. */\n public async getStatByName(name: string): Promise<Stat> {\n return this.getResource(ENDPOINTS.STAT, name);\n }\n\n /** Get a Stat by its ID. */\n public async getStatById(id: number): Promise<Stat> {\n return this.getResource(ENDPOINTS.STAT, id);\n }\n\n /** Get a Type by its name. */\n public async getTypeByName(name: string): Promise<Type> {\n return this.getResource(ENDPOINTS.TYPE, name);\n }\n\n /** Get a Type by its ID. */\n public async getTypeById(id: number): Promise<Type> {\n return this.getResource(ENDPOINTS.TYPE, id);\n }\n\n /** List Abilities. Page defaults to 20 entries from offset 0. */\n public async listAbilities(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Ability>> {\n return this.getListResource<Ability>(ENDPOINTS.ABILITY, offset, limit);\n }\n\n /** List Characteristics. Page defaults to 20 entries from offset 0. */\n public async listCharacteristics(\n offset?: number,\n limit?: number,\n ): Promise<APIResourceList<Characteristic>> {\n return this.getUnnamedListResource<Characteristic>(ENDPOINTS.CHARACTERISTIC, offset, limit);\n }\n\n /** List Egg Groups. Page defaults to 20 entries from offset 0. */\n public async listEggGroups(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<EggGroup>> {\n return this.getListResource<EggGroup>(ENDPOINTS.EGG_GROUP, offset, limit);\n }\n\n /** List Genders. Page defaults to 20 entries from offset 0. */\n public async listGenders(offset?: number, limit?: number): Promise<NamedAPIResourceList<Gender>> {\n return this.getListResource<Gender>(ENDPOINTS.GENDER, offset, limit);\n }\n\n /** List Growth Rates. Page defaults to 20 entries from offset 0. */\n public async listGrowthRates(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<GrowthRate>> {\n return this.getListResource<GrowthRate>(ENDPOINTS.GROWTH_RATE, offset, limit);\n }\n\n /** List Natures. Page defaults to 20 entries from offset 0. */\n public async listNatures(offset?: number, limit?: number): Promise<NamedAPIResourceList<Nature>> {\n return this.getListResource<Nature>(ENDPOINTS.NATURE, offset, limit);\n }\n\n /** List Pokéathlon Stats. Page defaults to 20 entries from offset 0. */\n public async listPokeathlonStats(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PokeathlonStat>> {\n return this.getListResource<PokeathlonStat>(ENDPOINTS.POKEATHLON_STAT, offset, limit);\n }\n\n /** List Pokémon. Page defaults to 20 entries from offset 0. */\n public async listPokemons(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<Pokemon>> {\n return this.getListResource<Pokemon>(ENDPOINTS.POKEMON, offset, limit);\n }\n\n /** List Pokémon Colors. Page defaults to 20 entries from offset 0. */\n public async listPokemonColors(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PokemonColor>> {\n return this.getListResource<PokemonColor>(ENDPOINTS.POKEMON_COLOR, offset, limit);\n }\n\n /** List Pokémon Forms. Page defaults to 20 entries from offset 0. */\n public async listPokemonForms(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PokemonForm>> {\n return this.getListResource<PokemonForm>(ENDPOINTS.POKEMON_FORM, offset, limit);\n }\n\n /** List Pokémon Habitats. Page defaults to 20 entries from offset 0. */\n public async listPokemonHabitats(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PokemonHabitat>> {\n return this.getListResource<PokemonHabitat>(ENDPOINTS.POKEMON_HABITAT, offset, limit);\n }\n\n /** List Pokémon Shapes. Page defaults to 20 entries from offset 0. */\n public async listPokemonShapes(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PokemonShape>> {\n return this.getListResource<PokemonShape>(ENDPOINTS.POKEMON_SHAPE, offset, limit);\n }\n\n /** List Pokémon Species. Page defaults to 20 entries from offset 0. */\n public async listPokemonSpecies(\n offset?: number,\n limit?: number,\n ): Promise<NamedAPIResourceList<PokemonSpecies>> {\n return this.getListResource<PokemonSpecies>(ENDPOINTS.POKEMON_SPECIES, offset, limit);\n }\n\n /** List Stats. Page defaults to 20 entries from offset 0. */\n public async listStats(offset?: number, limit?: number): Promise<NamedAPIResourceList<Stat>> {\n return this.getListResource<Stat>(ENDPOINTS.STAT, offset, limit);\n }\n\n /** List Types. Page defaults to 20 entries from offset 0. */\n public async listTypes(offset?: number, limit?: number): Promise<NamedAPIResourceList<Type>> {\n return this.getListResource<Type>(ENDPOINTS.TYPE, offset, limit);\n }\n}\n","import { ENDPOINTS } from \"@constants\";\nimport type { APIResource, Language, NamedAPIResource, NamedAPIResourceList } from \"@models\";\nimport { BaseClient } from \"./base\";\n\n/**\n * ### Utility Client\n *\n * Client used to access the Utility Endpoints:\n * - [Languages](https://pokeapi.co/docs/v2#languages)\n * - [Resources](https://pokeapi.co/docs/v2#resource-listspagination-section)\n * ---\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2#utility-section)\n */\nexport class UtilityClient extends BaseClient {\n /** Get a Language by its ID. */\n public async getLanguageById(id: number): Promise<Language> {\n return this.getResource(ENDPOINTS.LANGUAGE, id);\n }\n\n /** Get a Language by its name. */\n public async getLanguageByName(name: string): Promise<Language> {\n return this.getResource(ENDPOINTS.LANGUAGE, name);\n }\n\n /**\n * Get any resource by its URL, or by a link taken from another response.\n *\n * A link carries what it points at, so the result is typed without saying so:\n *\n * ```ts\n * const pokemon = await api.pokemon.getPokemonByName('luxray');\n * const species = await api.utility.getResourceByUrl(pokemon.species);\n * // ^? PokemonSpecies\n * ```\n *\n * @param resource The absolute URL of the resource, or a link to it.\n * @returns The resource the URL points at.\n * @throws {TypeError} If the URL is not valid, or names no PokéAPI endpoint.\n */\n public async getResourceByUrl<T>(\n resource: string | NamedAPIResource<T> | APIResource<T>,\n ): Promise<T> {\n return this.getResourceByURL<T>(resource);\n }\n\n /** List Languages. Page defaults to 20 entries from offset 0. */\n public listLanguages(offset?: number, limit?: number): Promise<NamedAPIResourceList<Language>> {\n return this.getListResource<Language>(ENDPOINTS.LANGUAGE, offset, limit);\n }\n}\n","import { type CacheStore, MemoryCache } from \"../config/cache\";\nimport type { ClientOptions } from \"./base\";\nimport { BerryClient } from \"./berry.client\";\nimport { ContestClient } from \"./contest.client\";\nimport { CurrencyClient } from \"./currency.client\";\nimport { EncounterClient } from \"./encounter.client\";\nimport { EvolutionClient } from \"./evolution.client\";\nimport { GameClient } from \"./game.client\";\nimport { ItemClient } from \"./item.client\";\nimport { LocationClient } from \"./location.client\";\nimport { MachineClient } from \"./machine.client\";\nimport { MoveClient } from \"./move.client\";\nimport { PokemonClient } from \"./pokemon.client\";\nimport { UtilityClient } from \"./utility.client\";\n\n/**\n * ### Main Client\n *\n * The main client used to access all the PokéAPI Endpoints:\n * - [Berries](https://pokeapi.co/docs/v2#berries-section)\n * - [Contests](https://pokeapi.co/docs/v2#contests-section)\n * - [Currencies](https://pokeapi.co/docs/v2#currencies-section)\n * - [Encounters](https://pokeapi.co/docs/v2#encounters-section)\n * - [Evolution](https://pokeapi.co/docs/v2#evolution-section)\n * - [Games](https://pokeapi.co/docs/v2#games-section)\n * - [Items](https://pokeapi.co/docs/v2#items-section)\n * - [Locations](https://pokeapi.co/docs/v2#locations-section)\n * - [Machines](https://pokeapi.co/docs/v2#machines-section)\n * - [Moves](https://pokeapi.co/docs/v2#moves-section)\n * - [Pokémon](https://pokeapi.co/docs/v2#pokemon-section)\n * - [Utility](https://pokeapi.co/docs/v2#utility-section)\n * ---\n * All the clients below share a single cache, so a resource fetched through one\n * of them is served from memory by the rest.\n *\n * See [PokéAPI Documentation](https://pokeapi.co/docs/v2)\n */\nexport class MainClient {\n public readonly cache: CacheStore | undefined;\n\n public readonly berry: BerryClient;\n public readonly contest: ContestClient;\n public readonly currency: CurrencyClient;\n public readonly encounter: EncounterClient;\n public readonly evolution: EvolutionClient;\n public readonly game: GameClient;\n public readonly item: ItemClient;\n public readonly location: LocationClient;\n public readonly machine: MachineClient;\n public readonly move: MoveClient;\n public readonly pokemon: PokemonClient;\n public readonly utility: UtilityClient;\n\n constructor(clientOptions?: ClientOptions) {\n const cache = clientOptions?.cache ?? new MemoryCache();\n const sharedOptions: ClientOptions = { ...clientOptions, cache };\n\n this.cache = cache === false ? undefined : cache;\n\n this.berry = new BerryClient(sharedOptions);\n this.contest = new ContestClient(sharedOptions);\n this.currency = new CurrencyClient(sharedOptions);\n this.encounter = new EncounterClient(sharedOptions);\n this.evolution = new EvolutionClient(sharedOptions);\n this.game = new GameClient(sharedOptions);\n this.item = new ItemClient(sharedOptions);\n this.location = new LocationClient(sharedOptions);\n this.machine = new MachineClient(sharedOptions);\n this.move = new MoveClient(sharedOptions);\n this.pokemon = new PokemonClient(sharedOptions);\n this.utility = new UtilityClient(sharedOptions);\n }\n\n /** Drops every cached response, for all the clients at once. */\n public async clearCache(): Promise<void> {\n await this.cache?.clear?.();\n }\n}\n","import { BASE_URL } from \"@constants\";\n\n/**\n * ## Sprite Variant\n * The sprite sets the PokéAPI publishes for a Pokémon.\n */\nexport type SpriteVariant = \"default\" | \"official-artwork\" | \"home\" | \"dream-world\" | \"showdown\";\n\n/**\n * ## Pokemon Sprite Options\n * Which sprite to build a URL for.\n *\n * The sets do not carry the same images, so the options are constrained per\n * variant: only `default` and `showdown` have back-facing sprites, and only\n * `official-artwork` has no gendered ones.\n */\nexport type PokemonSpriteOptions =\n | { variant?: \"default\"; shiny?: boolean; back?: boolean; female?: boolean }\n | { variant: \"showdown\"; shiny?: boolean; back?: boolean; female?: boolean }\n | { variant: \"home\"; shiny?: boolean; female?: boolean; back?: never }\n | { variant: \"official-artwork\"; shiny?: boolean; back?: never; female?: never }\n | { variant: \"dream-world\"; female?: boolean; shiny?: never; back?: never };\n\ninterface VariantSpec {\n /** Path under `sprites/pokemon`. Empty for the default set, which sits at the root. */\n directory: string;\n extension: string;\n}\n\nconst VARIANTS: Record<SpriteVariant, VariantSpec> = {\n default: { directory: \"\", extension: \"png\" },\n \"official-artwork\": { directory: \"other/official-artwork\", extension: \"png\" },\n home: { directory: \"other/home\", extension: \"png\" },\n \"dream-world\": { directory: \"other/dream-world\", extension: \"svg\" },\n showdown: { directory: \"other/showdown\", extension: \"gif\" },\n};\n\n/**\n * Builds the URL of a Pokémon sprite, without a request.\n *\n * ```ts\n * getPokemonSpriteUrl(25); // front, default set\n * getPokemonSpriteUrl(25, { variant: \"official-artwork\" });\n * getPokemonSpriteUrl(25, { variant: \"showdown\", back: true, shiny: true });\n * ```\n *\n * The sprite repository does not hold every combination for every Pokémon — a\n * back-facing sprite of a recent generation, or a gendered form of a species with\n * one appearance, simply does not exist. This builds a well-formed URL; it does\n * not promise the file is there.\n *\n * @param id The Pokémon ID. Names are not addressable — the sprites are keyed by ID.\n * @param options Which sprite set and which facing to build for.\n * @returns The URL of the sprite.\n */\nexport const getPokemonSpriteUrl = (id: number, options: PokemonSpriteOptions = {}): string => {\n const { variant = \"default\", shiny = false, back = false, female = false } = options;\n const { directory, extension } = VARIANTS[variant];\n\n // The repository nests the modifiers in this order, so `back/shiny/female` is\n // the only path that resolves.\n const segments = [directory, back && \"back\", shiny && \"shiny\", female && \"female\"];\n\n return [BASE_URL.SPRITES, \"pokemon\", ...segments.filter(Boolean), `${id}.${extension}`].join(\"/\");\n};\n"],"mappings":"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"}
|