{"version":3,"sources":["../src/api/util.ts","../src/api/client.ts"],"names":["formatDate","date","isEmpty","value","TefasClient","proxy","code","kind","startDate","endDate","kindParam","startDateParam","endDateParam","codeUppercase","formattedStartDate","formattedEndDate","response","data","headers","responseInfo","responseDetails","name","map","dataInfo","item","fundData","dataDetail","fund","error","term","count","termParam","countParam","query","result","kinds","r","json"],"mappings":"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","sourcesContent":["export const formatDate = (date: Date) => {\n  return date.toLocaleDateString('tr-TR', { day: '2-digit', month: '2-digit', year: 'numeric' })\n}\n\nexport const isEmpty = (value: string | undefined | null): boolean => {\n  return (value ?? '').trim() === ''\n}\n","import type { Fund, FundData, SearchData, SearchResult } from '@/types'\nimport { formatDate, isEmpty } from './util'\n\nexport type FundKind = 'YAT' | 'EMK' | 'BYF'\n\nexport class TefasClient {\n  private readonly proxy: boolean = false;\n  private readonly baseUrl: string = 'https://fundturkey.com.tr'\n  private readonly proxyBaseUrl: string = 'https://tefas-proxy.firstthumb.workers.dev'\n\n  private readonly headers: Record<string, string> = {\n    Connection: 'keep-alive',\n    'X-Requested-With': 'XMLHttpRequest',\n    Accept: 'application/json, text/javascript, */*; q=0.01',\n    Origin: 'https://fundturkey.com.tr',\n    Referer: 'https://fundturkey.com.tr/TarihselVeriler.aspx',\n    'User-Agent':\n      'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',\n  }\n\n  constructor(proxy = false) {\n    this.proxy = proxy\n  }\n\n  async getFund(\n    code: string,\n    kind?: FundKind,\n    startDate?: Date,\n    endDate?: Date,\n  ): Promise<Fund | null> {\n    if (isEmpty(code)) {\n      return null\n    }\n\n    const kindParam = kind ?? 'YAT'\n    const startDateParam = startDate ?? new Date()\n    const endDateParam = endDate ?? new Date()\n\n    try {\n      const codeUppercase = code.toUpperCase()\n      const formattedStartDate = formatDate(startDateParam)\n      const formattedEndDate = formatDate(endDateParam)\n\n      if (this.proxy) {\n        const response = await fetch(`${this.proxyBaseUrl}/funds/${codeUppercase}?kind=${kindParam}&startDate=${formattedStartDate}&endDate=${formattedEndDate}`)\n        if (response.status === 200) {\n          return await response.json() as Fund\n        } \n      } else {\n        const data = new URLSearchParams()\n        data.append('fontip', kindParam)\n        data.append('bastarih', formattedStartDate)\n        data.append('bitTarih', formattedEndDate)\n        data.append('fonkod', codeUppercase)\n\n        const headers = new Headers(this.headers)\n        headers.append('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')\n\n        const responseInfo = await fetch(`${this.baseUrl}/api/DB/BindHistoryInfo`, {\n          method: 'POST',\n          headers,\n          body: data,\n        })\n\n        const responseDetails = await fetch(`${this.baseUrl}/api/DB/BindHistoryAllocation`, {\n          method: 'POST',\n          headers,\n          body: data,\n        })\n\n        if (responseInfo.status === 200 && responseDetails.status === 200) {\n          let code = null\n          let name = null\n          const map = new Map<string, FundData>()\n\n          const dataInfo = await responseInfo.json()\n          for (const item of dataInfo.data) {\n            if (!code) {\n              code = item.FONKODU\n            }\n            if (!name) {\n              name = item.FONUNVAN\n            }\n            const fundData: FundData = {\n              date: item.TARIH,\n              dateStr: formatDate(new Date(Number.parseInt(item.TARIH))),\n              price: item.FIYAT,\n              shares: item.TEDPAYSAYISI,\n              investors: item.KISISAYISI,\n              cap: item.PORTFOYBUYUKLUK,\n            }\n            map.set(item.FONKODU + item.TARIH, fundData)\n          }\n\n          const dataDetail = await responseDetails.json()\n          for (const item of dataDetail.data) {\n            const fund = map.get(item.FONKODU + item.TARIH)\n            if (fund) {\n              fund.bankBills = item.BB\n              fund.etf = item.BYF\n              fund.other = item.D\n              fund.fxPayableBills = item.DB\n              fund.governmentBond = item.DT\n              fund.foreignCurrencyBills = item.DÖT\n              fund.eurobonds = item.EUT\n              fund.commercialPaper = item.FB\n              fund.fundParticipationCertificate = item.FKB\n              fund.realEstateCertificate = item.GAS\n              fund.ventureCapitalInvestmentFundParticipation = item.GSYKB\n              fund.realEstateInvestmentFundParticipation = item.GYKB\n              fund.treasuryBill = item.HB\n              fund.stock = item.HS\n              fund.governmentBondsAndBillsFx = item.KBA\n              fund.participationAccount = item.KH\n              fund.participationAccountAU = item.KHAU\n              fund.participationAccountD = item.KHD\n              fund.participationAccountTL = item.KHTL\n              fund.governmentLeaseCertificates = item.KKS\n              fund.governmentLeaseCertificatesD = item.KKSD\n              fund.governmentLeaseCertificatesTL = item.KKSTL\n              fund.governmentLeaseCertificatesForeign = item.KKSYD\n              fund.preciousMetals = item.KM\n              fund.preciousMetalsBYF = item.KMBYF\n              fund.preciousMetalsKBA = item.KMKBA\n              fund.preciousMetalsKKS = item.KMKKS\n              fund.publicDomesticDebtInstruments = item.KİBD\n              fund.privateSectorLeaseCertificates = item.OSKS\n              fund.privateSectorBond = item.OST\n              fund.repo = item.R\n              fund.derivatives = item.T\n              fund.tmm = item.TPP\n              fund.reverseRepo = item.TR\n              fund.assetBackedSecurities = item.VDM\n              fund.termDeposit = item.VM\n              fund.termDepositAU = item.VMAU\n              fund.termDepositD = item.VMD\n              fund.termDepositTL = item.VMTL\n              fund.futuresCashCollateral = item.VİNT\n              fund.foreignDebtInstruments = item.YBA\n              fund.foreignDomesticDebtInstruments = item.YBKB\n              fund.foreignPrivateSectorDebtInstruments = item.YBOSB\n              fund.foreignExchangeTradedFunds = item.YBYF\n              fund.foreignEquity = item.YHS\n              fund.foreignSecurities = item.YMK\n              fund.foreignInvestmentFundParticipationShares = item.YYF\n              fund.privateSectorInternationalLeaseCertificate = item.ÖKSYD\n              fund.privateSectorForeignDebtInstruments = item.ÖSDB\n            }\n          }\n\n          return code && name ? { code, name, data: [...map.values()] } : null\n        }\n      }\n    } catch (error) {\n      console.error(error)\n    }\n\n    return null\n  }\n\n  async search(term: string, kind?: FundKind, count?: number, ): Promise<SearchResult | null> {\n    if (isEmpty(term)) {\n      return null\n    }\n\n    const termParam = term.toUpperCase()\n    const countParam = count ?? 10\n\n    try {\n      const headers = new Headers(this.headers)\n      headers.append('Content-Type', 'application/json; charset=UTF-8')\n      if (this.proxy) {\n        const response = await fetch(`${this.proxyBaseUrl}/funds/search?q=${termParam}&kind=${kind}&count=${countParam}`, {\n          method: 'GET',\n          headers,\n        })\n        if (response.status === 200) {\n          return await response.json()\n        }\n      } else {\n        return await this._search(termParam, kind, countParam)\n      }\n    } catch (error) {\n      console.error(error)\n    }\n\n    return null\n  }\n\n  private async _search(query: string, kind?: FundKind, count?: number): Promise<SearchResult | null> {\n    const result = [] as SearchData[]\n\n    const headers = new Headers(this.headers)\n    headers.append('Content-Type', 'application/json; charset=UTF-8')\n    \n    const kinds = kind ? [kind] : ['YAT', 'EMK', 'BYF']\n\n    for (const kind of kinds) {\n      const response = await fetch('https://www.tefas.gov.tr/Service.asmx/GetAllFunds', {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({\n          prefixText: query,\n          count: count,\n          contextKey: kind,\n        })\n      })\n      if (response.status === 200) {\n        const data = await response.json()\n        const r = data.d.map((item: any) => {\n          const json = JSON.parse(item)\n          return {\n            name: json.First,\n            code: json.Second,\n            kind\n          }\n        }) as SearchData[]\n        result.push(...r)\n      }\n    }\n\n    return {\n      data: result\n    }\n  }\n}\n"]}