{"version":3,"sources":["../index.ts"],"sourcesContent":["const latest = import('./latest.json');\nconst LATEST = (latest as unknown) as Promise<{\n  [id: string]: [string, number] | [[string, number], [string, number]];\n}>;\n\nexport type ID = '' | (string & { __isID: true });\nexport type GenerationNum = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\nexport type TypeName =\n  'Normal' | 'Fighting' | 'Flying' | 'Poison' | 'Ground' | 'Rock' | 'Bug' | 'Ghost' | 'Steel' |\n  'Fire' | 'Water' | 'Grass' | 'Electric' | 'Psychic' | 'Ice' | 'Dragon' | 'Dark' | 'Fairy' | '???';\n\nexport type StatID = 'hp' | 'atk' | 'def' | 'spa' | 'spd' | 'spe';\nexport type StatsTable<T = number> = { [stat in StatID]: T };\n\nexport interface Analysis {\n  format: string;\n  outdated: string | null;\n  overview: string;\n  comments: string;\n  movesets: Moveset[];\n  credits: Credits;\n}\n\nexport interface Moveset {\n  name: string;\n  description: string;\n  pokemon: string;\n  levels: number[];\n  abilities: string[];\n  items: string[];\n  moveslots: Array<Array<{ move: string; type: TypeName | null }>>;\n  evconfigs: StatsTable[];\n  ivconfigs: StatsTable[];\n  natures: string[];\n  teratypes: TypeName[];\n}\n\nexport interface Credits {\n  teams: Array<{\n    name: string;\n    members: Member[];\n  }>;\n  writtenBy: Member[];\n}\n\nexport interface Member {\n  user_id: number;\n  username: string;\n}\n\nexport interface UsageStatistics {\n  info: {\n    metagame: string;\n    cutoff: number;\n    'cutoff deviation': 0;\n    'team type': ID | null;\n    'number of battles': number;\n  };\n  data: { [name: string]: MovesetStatistics };\n}\n\nexport interface MovesetStatistics {\n  'Raw count': number;\n  usage: number;\n  // num GXE, max GXE, 1% GXE, 20% GXE\n  'Viability Ceiling': [number, number, number, number];\n  Abilities: { [ability: string]: number };\n  Items: { [item: string]: number };\n  Spreads: { [spread: string]: number };\n  Happiness?: { [happiness: string]: number };\n  Moves: { [move: string]: number };\n  Teammates: { [pokemon: string]: number };\n  // n = sum(POKE1_KOED...DOUBLE_SWITCH)\n  // p = POKE1_KOED + POKE1_SWITCHED_OUT / n\n  // d = sqrt((p * (1 - p)) / n)\n  'Checks and Counters': { [pokemon: string]: [number, number, number] };\n}\n\ninterface DexSettings {\n  injectRpcs: [\n    unknown, // 'dump-gens'\n    unknown, // 'dump-basics'\n    [\n      // 'dump-pokemon'\n      string, // key\n      DexDumpPokemonResponse\n    ]\n  ];\n}\n\ninterface DexDumpPokemonResponse {\n  languages: string[];\n  learnset: string[];\n  strategies: Analysis[];\n}\n\nconst GENS = ['rb', 'gs', 'rs', 'dp', 'bw', 'xy', 'sm', 'ss', 'sv'];\n\nconst PARSE_REGEX = /dexSettings = ({.*})/;\n\nfunction toID(text: any): ID {\n  return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as ID;\n}\n\nfunction toAlias(text: any) {\n  return ('' + text).toLowerCase().replace(/[ _]+/, '-').replace(/[^a-z0-9-]+/g, '');\n}\n\nfunction toPokemonAlias(text: any) {\n  const alias = toAlias(text);\n  return alias === 'meowstic' ? 'meowstic-m' : alias; // sigh\n}\n\nexport const Analyses = new (class {\n  readonly URL = 'https://www.smogon.com/dex/';\n  readonly RPC = '_rpc/dump-pokemon';\n\n  /**\n   * Returns the Analysis URL for a given pokemon and gen.\n   * @deprecated use Analyses.request\n   */\n  url(pokemon: string, gen: GenerationNum = 9) {\n    return `${Analyses.URL}${Analyses.gen(gen)}/pokemon/${toPokemonAlias(pokemon)}/`;\n  }\n\n  /**\n   * Returns the Analysis RPC URL and request configuration for a given pokemon and gen.\n   */\n  request(pokemon: string, gen: GenerationNum = 9, language = 'en') {\n    return {\n      url: `${Analyses.URL}${Analyses.RPC}`,\n      init: {\n        method: 'POST',\n        headers: {\n          'content-type': 'application/json',\n        },\n        body: JSON.stringify({gen: Analyses.gen(gen), alias: toPokemonAlias(pokemon), language}),\n      },\n    };\n  }\n\n  /**\n   * Parses out the DexSettings object embedded in the raw HTML retrieved from the Smogon dex.\n   */\n  parse(raw: string) {\n    const match = PARSE_REGEX.exec(raw);\n    if (!match) return undefined;\n    return JSON.parse(match[1]) as DexSettings;\n  }\n\n  /**\n   * Given either the raw HTML retrieved from the Smogon dex, the parsed DexSettings object, or\n   * an RPC response, returns a map of Analysis objects keyed by format or undefined if its input\n   * was invalid.\n   */\n  process(ds: string | DexSettings | DexDumpPokemonResponse) {\n    const parsed = typeof ds === 'string' ? Analyses.parse(ds) : ds;\n    if (!parsed) return undefined;\n\n    let strategies: Analysis[];\n    if ('injectRpcs' in parsed) {\n      const valid = parsed.injectRpcs[2]?.[1]?.['strategies'];\n      if (!valid) return undefined;\n      strategies = valid;\n    } else {\n      strategies = parsed.strategies;\n    }\n\n    const analysesByFormat: Map<string, Analysis[]> = new Map();\n    for (const analysis of strategies) {\n      let analyses = analysesByFormat.get(analysis.format);\n      if (!analyses) {\n        analyses = [];\n        analysesByFormat.set(analysis.format, analyses);\n      }\n      analyses.push(analysis);\n    }\n\n    return analysesByFormat;\n  }\n\n  /**\n   * Returns Smogon's display representation of the given gen.\n   */\n  gen(gen: GenerationNum) {\n    return GENS[gen - 1];\n  }\n})();\n\n// Metagames which continued to be played after gen6, transitioning from a bare unqualified\n// name to a 'gen6'-qualified one. Most migrated over on 2017-07, though the LATE metagames\n// below were only given qualification from 2018 and onward.\nconst LEGACY = new Set([\n  '1v1', 'anythinggoes', 'battlespotdoubles', 'battlespotsingles', 'battlespottriples',\n  'cap', 'lc', 'monotype', 'nu', 'ou', 'pu', 'randombattle', 'ru', 'ubers', 'uu',\n  'balancedhackmons', 'doublesou', 'doublesuu', 'battlefactory', 'mixandmega', 'vgc2016',\n  'ounoteampreview', 'customgame', 'doublescustomgame', 'triplescustomgame', 'purehackmons',\n  'almostanyability',\n]);\n\nexport type Report = 'usage' | 'leads' | 'moveset' | 'metagame' | 'chaos';\n\nexport const Statistics = new (class {\n  readonly URL = 'https://www.smogon.com/stats/';\n\n  /**\n   * Given the HTML page returned from querying the Statistics.URL, returns the most recent\n   * date stats are available for. This should usually be the beginning of the current month,\n   * but this approach is more robust due to timezone differences and delays in publishing.\n   */\n  latest(page: string): string {\n    const lines = page.split('\\n');\n    let i = lines.length;\n    while (i--) {\n      const line = lines[i];\n      if (line.startsWith('<a href=')) {\n        return line.slice(9, 16);\n      }\n    }\n    throw new Error('Unexpected format for index');\n  }\n\n  /**\n   * Given the HTML page returned from querying a URL listing available reports, returns the list of\n   * available formats.\n   */\n  formats(page: string): string[] {\n    const lines = page.split('\\n');\n    const formats: string[] = [];\n    for (const line of lines) {\n      if (line.startsWith('<a href=')) {\n        const quote = line.indexOf('\"', 9);\n        const split = line.slice(9, quote).split('-');\n        if (split.length !== 2) continue;\n        if (!formats.length || formats[formats.length - 1] !== split[0]) formats.push(split[0]);\n      }\n    }\n    return formats;\n  }\n\n  /**\n   * Returns the URL of the reports for the given date and format, defaulting to providing the\n   * highest detailed ('chaos') weighted stats available for the format in question. Unweighted\n   * stats or stats of a specific weight or alternative reports may also be requested, though may be\n   * absent depending on the date and format.\n   */\n  url(date: string, format: string, weighted: number | boolean = true, report: Report = 'chaos') {\n    let formatid = toID(format);\n    // When Gen 7 was released the naming scheme for 'current' formats was changed from\n    // 'x' => 'genNx'. formatFor will translate between the two as approriate, but there\n    // is an edge case for 2016-12 where both randombattle and gen6randombattle exist\n    if (!(date === '2016-12' && ['gen6randombattle', 'randombattle'].includes(formatid))) {\n      formatid = formatFor(formatid, date);\n    }\n\n    // If we've been given a weight then we use that, otherwise we use weightFor to\n    // figure out what the highest weight cutoff for the format was (usually 1630 or 1695)\n    const rating = weighted\n      ? typeof weighted === 'number' ? weighted\n      : weightFor(formatid, date)\n      : 0;\n\n    if (report === 'usage') return `${Statistics.URL}${date}/${formatid}-${rating}.txt`;\n    const ext = report === 'chaos' ? 'json' : 'txt';\n    return `${Statistics.URL}${date}/${report}/${formatid}-${rating}.${ext}`;\n  }\n\n  /**\n   * Returns the date and count of the latest stats available for the given format at the time\n   * this package was published. If best is provided, it will return the date and count for the\n   * most recent month where a substantial enough amount of data was gathered. Returns undefined\n   * if there is no data present. Note the accuracy of this function depends on the data in\n   * latest.json being kept up to date.\n   */\n  async latestDate(format: string, best = false) {\n    format = Statistics.canonicalize(toID(format));\n    const data = (await LATEST)[format];\n    if (!data) return undefined;\n    const [date, count] = (Array.isArray(data[0]) ? data[+best] : data) as [string, number];\n    return {date, count};\n  }\n\n  /**\n   * Returns the canconical format name for the given format.\n   */\n  canonicalize(format: string) {\n    return LEGACY.has(format) ? `gen6${format}` : format;\n  }\n\n  /**\n   * Processes what was fetched from the URL returned by Statistics.url into UsageStatistics.\n   */\n  process(raw: string) {\n    return JSON.parse(raw) as UsageStatistics;\n  }\n})();\n\n// Formats which were popular enough to use higher weightings when they were the current gen.\nconst POPULAR = {\n  6: [\n    'ou', 'oususpecttest', 'doublesou', 'randombattle',\n    'smogondoubles', 'doublesou', 'doublesoususpecttest',\n  ],\n  7: [\n    'gen7ou', 'gen7oususpecttest', 'gen7doublesou', 'gen7doublesoususpecttest',\n    'gen7pokebankou', 'gen7pokebankoususpecttest', 'gen7pokebankdoublesou',\n  ],\n  8: ['gen8doublesou', 'gen8doublesoususpect', 'gen8ou', 'gen8oususpecttest'],\n  9: ['gen9doublesou', 'gen9doublesoususpect', 'gen9ou', 'gen9oususpecttest'],\n};\n\nfunction weightFor(format: ID, date: string) {\n  // NOTE: Legacy format notation is signficant here: gen6ou was only 'popular' while it was still\n  // called 'ou' and thus we don't really care about the date.\n  if (POPULAR[6].includes(format)) return 1695;\n  // Gen 7 formats ceased to be 'popular' from 2020-02 onwards, though we need to check\n  // gen7doublesou first as it had a weird discontinuity at the beginning of the format.\n  if (format === 'gen7doublesou' && date < '2017-02') return 1630;\n  if (POPULAR[7].includes(format)) return date > '2020-01' ? 1630 : 1695;\n  // smogondoublessuspecttest only has two months of date, but 2015-04 had a higher weighting.\n  if (format === 'smogondoublessuspecttest' && date === '2015-04') return 1695;\n  if (POPULAR[8].includes(format)) return date > '2022-10' ? 1630 : 1695;\n  return POPULAR[9].includes(format) ? 1695 : 1630;\n}\n\nconst LATE = ['1v1', 'cap', 'monotype', 'balancedhackmons', 'mixandmega'];\n\nconst FORMAT_REGEX = /gen(\\d)(.*)/;\n\nfunction formatFor(format: ID, date: string) {\n  // 2017-01/02 mark the last random battle statistics, at which point randombattle has been\n  // renamed to its qualified form several months before the other formats\n  if (['gen6randombattle', 'randombattle'].includes(format) && date > '2016-12') {\n    return 'gen6randombattle' as ID;\n  }\n\n  const m = FORMAT_REGEX.exec(format);\n  // Return if we've been given a format with the standard notation and its not Gen 6\n  if (m && m[1] !== '6') return format;\n  // Return the unqualified metagame if the format starts with 'gen6' but has been discontinued\n  if (m && !LEGACY.has(m[2])) return m[2] as ID;\n\n  if (m) {\n    // If the format is 'gen6'-qualified but the date requested is before the standard 2017-06/07\n    // migration (or was a late-migrating metagame and before 2017-12/2018-01), remove the qualifier\n    return date < '2017-07' || (date < '2018-01' && LATE.includes(m[2])) ? (m[2] as ID) : format;\n  } else {\n    // If the format unqualified but the date requested is after the standard 2017-06/07 migration\n    // (or was a late-migrating metagame and after 2017-12/2018-01), add the 'gen6'-qualifier\n    return date > '2017-12' || (date > '2017-06' && !LATE.includes(format))\n      ? (`gen6${format}` as ID)\n      : format;\n  }\n}\n"],"mappings":"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","names":[]}