@amoutonbrady/pokeapi
Version:
An API wrapper for PokeAPI - browser use only
91 lines (76 loc) • 6.49 kB
JavaScript
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 };