{"version":3,"sources":["../src/market.ts"],"names":["WbMarketParser","config","error","currentTime","res","el","country","id"],"mappings":"aAqCO,IAAMA,EAAN,KAAqB,CAkB1B,YAAYC,CAAwB,CAAA,CAhBpC,KAAiB,MAA4B,CAAA,OAAA,CAG7C,KAAQ,IAA2B,CAAA,GAGnC,IAAQ,CAAA,aAAA,CAAwB,EAGhC,IAAiB,CAAA,cAAA,CAAiB,EAAI,EAAK,CAAA,GAAA,CAQrCA,EAAO,aAAe,GAAA,IAAA,CAAK,eAAiBA,CAAO,CAAA,aAAA,CAAA,CACnDA,EAAO,MAAQ,GAAA,IAAA,CAAK,OAASA,CAAO,CAAA,MAAA,CAAA,CAExC,KAAK,OAAQ,EAAA,CACV,KAAK,IAAM,CACV,KAAK,MAAO,CAAA,GAAA,CAAI,gCAAgC,EAClD,CAAC,CACA,CAAA,KAAA,CAAOC,GAAU,CAChB,IAAA,CAAK,OAAO,KAAM,CAAA,4BAA4B,EAC9C,IAAK,CAAA,MAAA,CAAO,MAAMA,CAAK,EACzB,CAAC,EACL,CAWA,MAAc,OAAU,EAAA,CACtB,IAAMC,CAAc,CAAA,IAAA,CAAK,KAEzB,CAAA,GAAI,EAAAA,CAAc,CAAA,IAAA,CAAK,cAAgB,IAAK,CAAA,cAAA,EAAkB,KAAK,IAAK,CAAA,MAAA,CAAS,GAEjF,GAAI,CACF,KAAK,IAAO,CAAA,MAAM,MAAM,6DAA6D,CAAA,CAAE,KACpFC,CACQA,EAAAA,CAAAA,CAAI,IAAK,EAEpB,EACA,IAAK,CAAA,aAAA,CAAgBD,EACvB,CAASD,MAAAA,CAAAA,CAAO,CACd,MAAK,IAAA,CAAA,MAAA,CAAO,MAAM,8BAAgCA,CAAAA,CAAK,EACjDA,CACR,CACF,CAYA,MAAM,YAAA,EAAkC,CAEtC,OADa,CAAA,MAAM,KAAK,cAAe,EAAA,EAC3B,IAAKG,CACRA,EAAAA,CAAAA,CAAG,OACX,CACH,CAYA,MAAM,YAAaC,CAAAA,CAAAA,CAA+C,CAGhE,OAFa,CAAA,MAAM,KAAK,cAAe,EAAA,EACb,KAAMD,CAAOA,EAAAA,CAAAA,CAAG,UAAYC,CAAO,CAAA,EACxC,KAAS,EAAA,EAChC,CAYA,MAAM,QAAQC,CAA0C,CAAA,CAGtD,QAFa,MAAM,IAAA,CAAK,gBACE,EAAA,IAAA,CAAMF,GAAOA,CAAG,CAAA,KAAA,CAAM,KAAMA,CAAOA,EAAAA,CAAAA,CAAG,KAAOE,CAAE,CAAC,GACrD,KAAS,EAAA,EAChC,CAWA,MAAM,SAAuC,CAC3C,OAAO,KAAK,cAAe,EAC7B,CAQA,MAAc,cAAA,EAA8C,CAC1D,OAAM,MAAA,IAAA,CAAK,SACJ,CAAA,IAAA,CAAK,IACd,CACF","file":"index.cjs","sourcesContent":["import type { MarketType } from './types.ts';\r\n\r\n/**\r\n * Configuration options for the WbMarketParser\r\n */\r\nexport type WbMarketConfig = {\r\n  /**\r\n   * A number of seconds after which a re-request will take place to receive issues of issuance\r\n   * @default 24 * 60 * 60 * 1000 | 24 hours in milliseconds\r\n   */\r\n  cacheDuration?: number;\r\n  /**\r\n   * Custom logger implementation. If not provided, console will be used\r\n   */\r\n  logger?: MarketType.Logger;\r\n};\r\n\r\n/**\r\n * Parser for Wildberries market data\r\n * \r\n * This class provides methods to fetch and query market data from Wildberries API.\r\n * It includes caching mechanism to prevent excessive API calls.\r\n * \r\n * @example\r\n * ```ts\r\n * const parser = new WbMarketParser({\r\n *   cacheDuration: 3600000, // 1 hour cache\r\n *   logger: customLogger\r\n * });\r\n * \r\n * // Get all countries\r\n * const countries = await parser.getCountries();\r\n * \r\n * // Get markets for specific country\r\n * const markets = await parser.getByCountry('Россия');\r\n * ```\r\n */\r\nexport class WbMarketParser {\r\n  /** Default logger implementation */\r\n  private readonly logger: MarketType.Logger = console;\r\n\r\n  /** Cached market data */\r\n  private data: MarketType.Items[] = [];\r\n\r\n  /** Timestamp of the last successful data fetch */\r\n  private lastFetchTime: number = 0;\r\n\r\n  /** Default cache duration in milliseconds (5 minutes) */\r\n  private readonly CACHE_DURATION = 5 * 60 * 1000;\r\n\r\n  /**\r\n   * Creates a new instance of WbMarketParser\r\n   * \r\n   * @param config - Configuration options for the parser\r\n   */\r\n  constructor(config: WbMarketConfig) {\r\n    if (config.cacheDuration) this.CACHE_DURATION = config.cacheDuration;\r\n    if (config.logger) this.logger = config.logger;\r\n\r\n    this.fetcher()\r\n      .then(() => {\r\n        this.logger.log(`The list of markets is updated`);\r\n      })\r\n      .catch((error) => {\r\n        this.logger.error(`Error in obtaining markets`);\r\n        this.logger.error(error);\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Fetches market data from Wildberries API\r\n   * \r\n   * This method implements caching logic to prevent excessive API calls.\r\n   * Data will be fetched only if cache is expired or empty.\r\n   * \r\n   * @throws {Error} If the API request fails\r\n   * @private\r\n   */\r\n  private async fetcher() {\r\n    const currentTime = Date.now();\r\n\r\n    if (currentTime - this.lastFetchTime < this.CACHE_DURATION && this.data.length > 0) return;\r\n\r\n    try {\r\n      this.data = await fetch('https://static-basket-01.wb.ru/vol0/data/all-poo-fr-v8.json').then(\r\n        (res) => {\r\n          return res.json() as Promise<MarketType.Items[]>;\r\n        }\r\n      );\r\n      this.lastFetchTime = currentTime;\r\n    } catch (error) {\r\n      this.logger.error('Failed to fetch market data:', error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns a list of all available countries\r\n   * \r\n   * @returns Promise resolving to an array of country names\r\n   * @example\r\n   * ```ts\r\n   * const countries = await parser.getCountries();\r\n   * console.log(countries); // ['Россия', 'Беларусь', ...]\r\n   * ```\r\n   */\r\n  async getCountries(): Promise<string[]> {\r\n    const data = await this.getUpdatedData();\r\n    return data.map((el) => {\r\n      return el.country;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Returns markets for a specific country\r\n   * \r\n   * @param country - Country name to filter markets by\r\n   * @returns Promise resolving to an array of markets in the specified country\r\n   * @example\r\n   * ```ts\r\n   * const russianMarkets = await parser.getByCountry('Россия');\r\n   * ```\r\n   */\r\n  async getByCountry(country: string): Promise<MarketType.Market[]> {\r\n    const data = await this.getUpdatedData();\r\n    const dataFiltered = data.find((el) => el.country === country);\r\n    return dataFiltered?.items || [];\r\n  }\r\n\r\n  /**\r\n   * Returns markets by their ID\r\n   * \r\n   * @param id - Market ID to search for\r\n   * @returns Promise resolving to an array of markets with the specified ID\r\n   * @example\r\n   * ```ts\r\n   * const market = await parser.getById(123);\r\n   * ```\r\n   */\r\n  async getById(id: number): Promise<MarketType.Market[]> {\r\n    const data = await this.getUpdatedData();\r\n    const dataFiltered = data.find((el) => el.items.find((el) => el.id === id));\r\n    return dataFiltered?.items || [];\r\n  }\r\n\r\n  /**\r\n   * Returns all market data\r\n   * \r\n   * @returns Promise resolving to an array of all market items\r\n   * @example\r\n   * ```ts\r\n   * const allMarkets = await parser.markets();\r\n   * ```\r\n   */\r\n  async markets(): Promise<MarketType.Items[]> {\r\n    return this.getUpdatedData();\r\n  }\r\n\r\n  /**\r\n   * Ensures data is up to date and returns it\r\n   * \r\n   * @returns Promise resolving to the current market data\r\n   * @private\r\n   */\r\n  private async getUpdatedData(): Promise<MarketType.Items[]> {\r\n    await this.fetcher();\r\n    return this.data;\r\n  }\r\n}\r\n"]}