import {z} from 'zod' export type LoLArmor = number; export type LoLArmorPerLevel = number; export type LoLAttackDamage = number; export type LoLAttackDamagePerLevel = number; export type LoLAttackRange = number; export type LoLAttackSpeedOffset = number; export type LoLAttackSpeedPerLevel = number; export type LoLCrit = number; export type LoLCritPerLevel = number; export type LoLHP = number; export type LoLHPPerLevel = number; export type LoLHPRegen = number; export type LoLHPRegenPerLevel = number; export type LoLChampionID = number; export type LoLMoveSpeed = number; export type LoLMP = number; export type LoLMPPerLevel = number; export type LoLMPRegen = number; export type LoLMPRegenPerLevel = number; export type LoLChampionName = string; export type LoLChampionSlug = string; export type LoLMagicResist = number; export type LoLMagicResistPerLevel = number; export type FilterOverLoLChampions = {armor?: Array | undefined, armorperlevel?: Array | undefined, attackdamage?: Array | undefined, attackdamageperlevel?: Array | undefined, attackrange?: Array | undefined, attackspeedoffset?: Array | undefined, attackspeedperlevel?: Array | undefined, crit?: Array | undefined, critperlevel?: Array | undefined, hp?: Array | undefined, hpperlevel?: Array | undefined, hpregen?: Array | undefined, hpregenperlevel?: Array | undefined, id?: Array | undefined, movespeed?: Array | undefined, mp?: Array | undefined, mpperlevel?: Array | undefined, mpregen?: Array | undefined, mpregenperlevel?: Array | undefined, name?: Array | undefined, slug?: Array | undefined, spellblock?: Array | undefined, spellblockperlevel?: Array | undefined, videogame_version: unknown}; export type RangeOverLoLChampions = {armor?: Array | undefined, armorperlevel?: Array | undefined, attackdamage?: Array | undefined, attackdamageperlevel?: Array | undefined, attackrange?: Array | undefined, attackspeedoffset?: Array | undefined, attackspeedperlevel?: Array | undefined, crit?: Array | undefined, critperlevel?: Array | undefined, hp?: Array | undefined, hpperlevel?: Array | undefined, hpregen?: Array | undefined, hpregenperlevel?: Array | undefined, id?: Array | undefined, movespeed?: Array | undefined, mp?: Array | undefined, mpperlevel?: Array | undefined, mpregen?: Array | undefined, mpregenperlevel?: Array | undefined, name?: Array | undefined, spellblock?: Array | undefined, spellblockperlevel?: Array | undefined}; export type SortOverLoLChampions = Array<'armor' | '-armor' | 'armorperlevel' | '-armorperlevel' | 'attackdamage' | '-attackdamage' | 'attackdamageperlevel' | '-attackdamageperlevel' | 'attackrange' | '-attackrange' | 'attackspeedoffset' | '-attackspeedoffset' | 'attackspeedperlevel' | '-attackspeedperlevel' | 'crit' | '-crit' | 'critperlevel' | '-critperlevel' | 'hp' | '-hp' | 'hpperlevel' | '-hpperlevel' | 'hpregen' | '-hpregen' | 'hpregenperlevel' | '-hpregenperlevel' | 'id' | '-id' | 'movespeed' | '-movespeed' | 'mp' | '-mp' | 'mpperlevel' | '-mpperlevel' | 'mpregen' | '-mpregen' | 'mpregenperlevel' | '-mpregenperlevel' | 'name' | '-name' | 'spellblock' | '-spellblock' | 'spellblockperlevel' | '-spellblockperlevel'>; export type SearchOverLoLChampions = {name?: LoLChampionName | undefined}; export type GetApiLolChampionsArgs = {filter?: FilterOverLoLChampions | undefined, range?: RangeOverLoLChampions | undefined, sort?: SortOverLoLChampions | undefined, search?: SearchOverLoLChampions | undefined, page?: (number | {number?: number | undefined, size?: number | undefined}) | undefined, per_page?: number | undefined}; export type GetApiLolChampionsOptions = {baseUrl?: string | undefined, BearerToken?: string | undefined, fetch?: typeof fetch | undefined}; export const loLArmor = z.number().gte(0); export const loLArmorPerLevel = z.number().gte(0); export const loLAttackDamage = z.number().gte(0); export const loLAttackDamagePerLevel = z.number().gte(0); export const loLAttackRange = z.number().gte(0); export const loLAttackSpeedPerLevel = z.number().gte(0); export const loLChampionBigImageURL = z.string(); export const loLCrit = z.number().gte(0); export const loLCritPerLevel = z.number().gte(0); export const loLHP = z.number().gte(0); export const loLHPPerLevel = z.number().gte(0); export const loLHPRegen = z.number().gte(0); export const loLHPRegenPerLevel = z.number().gte(0); export const loLChampionID = z.number().int().gte(1); export const loLChampionImageURL = z.string(); export const loLMoveSpeed = z.number().gte(0); export const loLMP = z.number().gte(0); export const loLMPPerLevel = z.number().gte(0); export const loLMPRegen = z.number().gte(0); export const loLMPRegenPerLevel = z.number().gte(0); export const loLChampionName = z.string(); export const loLChampionSlug = z.string(); export const loLMagicResist = z.number().gte(0); export const loLMagicResistPerLevel = z.number().gte(0); export const videogameVersion = z.string(); export const videogameVersions = z.array(videogameVersion); export const loLChampion = z.object({armor: loLArmor, armorperlevel: loLArmorPerLevel, attackdamage: loLAttackDamage, attackdamageperlevel: loLAttackDamagePerLevel, attackrange: loLAttackRange, attackspeedoffset: z.number().nullable(), attackspeedperlevel: loLAttackSpeedPerLevel, big_image_url: loLChampionBigImageURL, crit: loLCrit, critperlevel: loLCritPerLevel, hp: loLHP, hpperlevel: loLHPPerLevel, hpregen: loLHPRegen, hpregenperlevel: loLHPRegenPerLevel, id: loLChampionID, image_url: loLChampionImageURL, movespeed: loLMoveSpeed, mp: loLMP, mpperlevel: loLMPPerLevel, mpregen: loLMPRegen, mpregenperlevel: loLMPRegenPerLevel, name: loLChampionName, slug: loLChampionSlug, spellblock: loLMagicResist, spellblockperlevel: loLMagicResistPerLevel, videogame_versions: videogameVersions}); export const loLChampions = z.array(loLChampion); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * List champions * * GET /lol/champions * * Also accepts auth: QueryToken */ export const getApiLolChampions = async (args: GetApiLolChampionsArgs, options?: GetApiLolChampionsOptions) => { const {baseUrl = "https://api.pandascore.co", fetch: fetchFn = fetch, BearerToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.filter != null) query.append("filter", JSON.stringify(args.filter)) if (args.range != null) query.append("range", JSON.stringify(args.range)) for (const item of args.sort ?? []) query.append("sort", String(item)) if (args.search != null) query.append("search", JSON.stringify(args.search)) if (args.page != null) query.append("page", String(args.page)) if (args.per_page != null) query.append("per_page", String(args.per_page)) if (BearerToken !== undefined) headers.set('authorization', `Bearer ${BearerToken}`) const url = `${baseUrl.replace(/\/+$/, '')}/lol/champions${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(loLChampions, await res.json()) };