UNPKG

@amoutonbrady/pokeapi

Version:
91 lines (76 loc) 6.49 kB
import { Store, get, set } from 'idb-keyval'; import axios from 'redaxios'; var endpoints = [["getBerryByName", "berry"], ["getBerryFirmnessByName", "berry-firmness"], ["getBerryFlavorByName", "berry-flavor"], ["getContestTypeByName", "contest-type"], ["getContestEffectById", "contest-effect"], ["getSuperContestEffectById", "super-contest-effect"], ["getEncounterMethodByName", "encounter-method"], ["getEncounterConditionByName", "encounter-condition"], ["getEncounterConditionValueByName", "encounter-condition-value"], ["getEvolutionChainById", "evolution-chain"], ["getEvolutionTriggerByName", "evolution-trigger"], ["getGenerationByName", "generation"], ["getPokedexByName", "pokedex"], ["getVersionByName", "version"], ["getVersionGroupByName", "version-group"], ["getItemByName", "item"], ["getItemAttributeByName", "item-attribute"], ["getItemCategoryByName", "item-category"], ["getItemFlingEffectByName", "item-fling-effect"], ["getItemPocketByName", "item-pocket"], ["getMachineById", "machine"], ["getMoveByName", "move"], ["getMoveAilmentByName", "move-ailment"], ["getMoveBattleStyleByName", "move-battle-style"], ["getMoveCategoryByName", "move-category"], ["getMoveDamageClassByName", "move-damage-class"], ["getMoveLearnMethodByName", "move-learn-method"], ["getMoveTargetByName", "move-target"], ["getLocationByName", "location"], ["getLocationAreaByName", "location-area"], ["getPalParkAreaByName", "pal-park-area"], ["getRegionByName", "region"], ["getAbilityByName", "ability"], ["getCharacteristicById", "characteristic"], ["getEggGroupByName", "egg-group"], ["getGenderByName", "gender"], ["getGrowthRateByName", "growth-rate"], ["getNatureByName", "nature"], ["getPokeathlonStatByName", "pokeathlon-stat"], ["getPokemonByName", "pokemon"], ["getPokemonColorByName", "pokemon-color"], ["getPokemonFormByName", "pokemon-form"], ["getPokemonHabitatByName", "pokemon-habitat"], ["getPokemonShapeByName", "pokemon-shape"], ["getPokemonSpeciesByName", "pokemon-species"], ["getStatByName", "stat"], ["getTypeByName", "type"], ["getLanguageByName", "language"]]; var rootEndpoints = [["getEndpointsList", ""], ["getBerriesList", "berry/"], ["getBerriesFirmnesssList", "berry-firmness/"], ["getBerriesFlavorsList", "berry-flavor/"], ["getContestTypesList", "contest-type/"], ["getContestEffectsList", "contest-effect/"], ["getSuperContestEffectsList", "super-contest-effect/"], ["getEncounterMethodsList", "encounter-method/"], ["getEncounterConditionsList", "encounter-condition/"], ["getEncounterConditionValuesList", "encounter-condition-value/"], ["getEvolutionChainsList", "evolution-chain/"], ["getEvolutionTriggersList", "evolution-trigger/"], ["getGenerationsList", "generation/"], ["getPokedexsList", "pokedex/"], ["getVersionsList", "version/"], ["getVersionGroupsList", "version-group/"], ["getItemsList", "item/"], ["getItemAttributesList", "item-attribute/"], ["getItemCategoriesList", "item-category/"], ["getItemFlingEffectsList", "item-fling-effect/"], ["getItemPocketsList", "item-pocket/"], ["getMachinesList", "machine/"], ["getMovesList", "move/"], ["getMoveAilmentsList", "move-ailment/"], ["getMoveBattleStylesList", "move-battle-style/"], ["getMoveCategoriesList", "move-category/"], ["getMoveDamageClassesList", "move-damage-class/"], ["getMoveLearnMethodsList", "move-learn-method/"], ["getMoveTargetsList", "move-target/"], ["getLocationsList", "location/"], ["getLocationAreasList", "location-area/"], ["getPalParkAreasList", "pal-park-area/"], ["getRegionsList", "region/"], ["getAbilitiesList", "ability/"], ["getCharacteristicsList", "characteristic/"], ["getEggGroupsList", "egg-group/"], ["getGendersList", "gender/"], ["getGrowthRatesList", "growth-rate/"], ["getNaturesList", "nature/"], ["getPokeathlonStatsList", "pokeathlon-stat/"], ["getPokemonsList", "pokemon/"], ["getPokemonColorsList", "pokemon-color/"], ["getPokemonFormsList", "pokemon-form/"], ["getPokemonHabitatsList", "pokemon-habitat/"], ["getPokemonShapesList", "pokemon-shape/"], ["getPokemonSpeciesList", "pokemon-species/"], ["getStatsList", "stat/"], ["getTypesList", "type/"], ["getLanguagesList", "language/"]]; class Pokedex { constructor(config = {}) { this.store = new Store("pokeapi-js-wrapper", "pokeapi-js-wrapper"); this.config = { // Pokedex config cache: true, timeout: 20 * 1000, baseUrl: "https://pokeapi.co/api/v2/", // Endpoint configuration offset: 0, limit: 100000, ...config }; for (const [endpointName, endpoint] of endpoints) { this[endpointName] = input => { if (!input) return; if (["number", "string"].includes(typeof input)) { return this.loadResource(`${endpoint}/${input}/`); } else if (Array.isArray(input)) { return Promise.all(this.mapResources(endpoint, input)); } }; } for (const [rootEndpointName, endpoint] of rootEndpoints) { this[rootEndpointName] = (config = {}) => { const limit = "limit" in config ? config.limit : this.config.limit; const offset = "offset" in config ? config.offset : this.config.offset; return this.loadResource(`${endpoint}?limit=${limit}&offset=${offset}`); }; } } resource(path) { if (typeof path === "string") { return this.loadResource(path); } else if (Array.isArray(path)) { return Promise.all(path.map(p => this.loadResource(p))); } throw new Error("String or Array is required"); } mapResources(endpoint, input) { return input.map(res => this.loadResource(`${endpoint}/${res}/`)); } loadResource(url) { return new Promise(async (resolve, reject) => { try { const value = await get(url, this.store); if ([null, undefined].includes(value)) { this.loadUrl(url).then(res => resolve(res)).catch(err => reject(err)); } else resolve(value); } catch { this.loadUrl(url).then(res => resolve(res)).catch(err => reject(err)); } }); } loadUrl(url) { return new Promise((resolve, reject) => { const options = { baseURL: this.config.baseUrl, timeout: this.config.timeout }; axios.get(url, options).then(response => { if (response.status >= 400) { reject(response); } else { if (this.config.cache) set(url, response.data, this.store); resolve(response.data); } }).catch(reject); }); } } export { Pokedex };