borsajs 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -39,6 +39,8 @@ const cryptoList = await cryptoSymbols(); // → ['BTCTRY', 'ETHTRY', ...] (173
39
39
 
40
40
  ### Ticker (Stocks)
41
41
 
42
+ **Get real-time BIST stock prices and volume data in seconds.** The Ticker API provides instant access to current price, daily change, volume, and OHLC (Open-High-Low-Close) values for any stock. Perfect for technical analysis, portfolio tracking, or automated trading strategies.
43
+
42
44
  ```typescript
43
45
  import { Ticker } from 'borsajs';
44
46
 
@@ -83,6 +85,8 @@ const history = await stock.getHistory({ period: '5d', interval: '1d' });
83
85
 
84
86
  ### FX (Forex & Commodities)
85
87
 
88
+ **Track live exchange rates and commodity prices effortlessly.** Access real-time data for major currencies (USD, EUR, GBP) and precious metals (gold, silver). Essential for currency arbitrage, gold investment strategies, or exchange rate monitoring.
89
+
86
90
  ```typescript
87
91
  import { FX, fxSymbols } from 'borsajs';
88
92
 
@@ -107,6 +111,8 @@ const current = await usd.getCurrent();
107
111
 
108
112
  ### Crypto
109
113
 
114
+ **Live data from Turkey's largest crypto exchange, BtcTurk.** Access price, volume, and change information for 173 cryptocurrency pairs. The fastest way to track Bitcoin, Ethereum, and other cryptos in Turkish Lira.
115
+
110
116
  ```typescript
111
117
  import { Crypto, cryptoSymbols } from 'borsajs';
112
118
 
@@ -136,6 +142,8 @@ const current = await btc.getCurrent();
136
142
 
137
143
  ### Index
138
144
 
145
+ **Monitor BIST indices in real-time.** Get current values and percentage changes for market and sector indices like XU100, XU030, XBANK. Essential for analyzing market trends and comparing sectoral performance.
146
+
139
147
  ```typescript
140
148
  import { Index, indexSymbols } from 'borsajs';
141
149
 
@@ -163,6 +171,8 @@ const info = await xu100.getInfo();
163
171
 
164
172
  ### Fund (Investment Funds)
165
173
 
174
+ **Search and track Turkish investment funds from TEFAS.** Access fund prices, returns, and performance metrics. Compare funds and make informed investment decisions with official data.
175
+
166
176
  ```typescript
167
177
  import { Fund, searchFunds } from 'borsajs';
168
178
 
@@ -186,6 +196,8 @@ const info = await fund.getInfo();
186
196
 
187
197
  ### Inflation
188
198
 
199
+ **Access official inflation data directly from TCMB (Central Bank).** Query monthly and annual CPI rates, or calculate inflation between any two dates. Critical for evaluating investments on a real return basis.
200
+
189
201
  ```typescript
190
202
  import { Inflation } from 'borsajs';
191
203
 
@@ -218,8 +230,99 @@ const calc = await inflation.calculate(100000, '2020-01', '2024-01');
218
230
  }
219
231
  ```
220
232
 
233
+ ### KAP (Public Disclosure Platform)
234
+
235
+ **One-stop access to official company announcements and disclosures.** Query disclosures, expected report calendars, and corporate information for all 731 BIST companies. Make investment decisions based on official company statements.
236
+
237
+ **Features:**
238
+ - 🏢 **731 BIST Companies** - Complete list with details
239
+ - 📢 **Live Disclosures** - All company announcements
240
+ - 📅 **Disclosure Calendar** - Financial report dates
241
+ - 🏛️ **Corporate Info** - Sector, market, website
242
+
243
+ ```typescript
244
+ import { getKapProvider } from 'borsajs';
245
+
246
+ const kap = getKapProvider();
247
+ const companies = await kap.getCompanies();
248
+ const search = await kap.search('türk hava');
249
+ ```
250
+
251
+ **Response (Companies):**
252
+ ```json
253
+ [
254
+ {
255
+ "ticker": "THYAO",
256
+ "name": "TÜRK HAVA YOLLARI A.O.",
257
+ "city": "İSTANBUL"
258
+ }
259
+ ]
260
+ ```
261
+
262
+ **Response (Search):**
263
+ ```json
264
+ [
265
+ {
266
+ "ticker": "THYAO",
267
+ "name": "TÜRK HAVA YOLLARI A.O.",
268
+ "city": "İSTANBUL"
269
+ }
270
+ ]
271
+ ```
272
+
273
+ **KAP Disclosures:**
274
+ ```typescript
275
+ const disclosures = await kap.getDisclosures('THYAO', 5);
276
+ ```
277
+
278
+ **Response (Disclosures):**
279
+ ```json
280
+ [
281
+ {
282
+ "date": "29.12.2025 19:21:18",
283
+ "title": "Haber ve Söylentilere İlişkin Açıklama",
284
+ "disclosureIndex": 1530826,
285
+ "url": "https://www.kap.org.tr/tr/Bildirim/1530826"
286
+ }
287
+ ]
288
+ ```
289
+
290
+ **Expected Disclosure Calendar:**
291
+ ```typescript
292
+ const calendar = await kap.getCalendar('THYAO');
293
+ ```
294
+
295
+ **Response (Calendar):**
296
+ ```json
297
+ [
298
+ {
299
+ "startDate": "01.01.2026",
300
+ "endDate": "11.03.2026",
301
+ "subject": "Finansal Rapor",
302
+ "period": "Yıllık",
303
+ "year": "2025"
304
+ }
305
+ ]
306
+ ```
307
+
308
+ **Company Details:**
309
+ ```typescript
310
+ const details = await kap.getCompanyDetails('THYAO');
311
+ ```
312
+
313
+ **Response (Company Details):**
314
+ ```json
315
+ {
316
+ "sector": "ULAŞTIRMA VE DEPOLAMA",
317
+ "market": "YILDIZ PAZAR",
318
+ "website": "www.turkishairlines.com / http://investor.turkishairlines.com"
319
+ }
320
+ ```
321
+
221
322
  ### Symbols
222
323
 
324
+ **Access all market symbols in a single call.** Get comprehensive lists of stocks, cryptocurrencies, currencies, and indices. Perfect starting point for automated data collection or screening algorithms.
325
+
223
326
  ```typescript
224
327
  import { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from 'borsajs';
225
328
 
@@ -239,17 +342,52 @@ console.log(indexSymbols); // → 19 indices
239
342
 
240
343
  ### VIOP (Derivatives)
241
344
 
345
+ **Track Turkish derivatives market (futures and options).** Access real-time data for stock futures, index futures, currency futures, and options contracts. Essential for hedging strategies and derivatives trading.
346
+
242
347
  ```typescript
243
348
  import { VIOP } from 'borsajs';
244
349
 
245
350
  const viop = new VIOP();
351
+
352
+ // Get all futures
246
353
  const futures = await viop.getFutures();
354
+
355
+ // Stock futures
356
+ const stockFutures = await viop.getStockFutures();
357
+
358
+ // Index futures (XU100, XU030, etc.)
359
+ const indexFutures = await viop.getIndexFutures();
360
+
361
+ // Currency futures (USD, EUR)
362
+ const currencyFutures = await viop.getCurrencyFutures();
363
+
364
+ // Commodity futures (Gold)
365
+ const commodityFutures = await viop.getCommodityFutures();
366
+
367
+ // Options
247
368
  const options = await viop.getOptions();
248
- const thyao = await viop.getBySymbol('THYAO');
369
+
370
+ // Contracts for specific stock
371
+ const thyaoContracts = await viop.getBySymbol('THYAO');
372
+ ```
373
+
374
+ **Response (Contract Data):**
375
+ ```json
376
+ {
377
+ "code": "THYAO",
378
+ "contract": "THYAO0226",
379
+ "price": 275.5,
380
+ "change": 1.25,
381
+ "volumeTl": 15420000,
382
+ "volumeQty": 56000,
383
+ "category": "stock"
384
+ }
249
385
  ```
250
386
 
251
387
  ### Download (Multiple Tickers)
252
388
 
389
+ **Batch download historical data for multiple stocks at once.** Efficient way to collect OHLCV data for portfolio analysis or backtesting strategies. Get data for dozens of stocks in a single request.
390
+
253
391
  ```typescript
254
392
  import { download, Tickers } from 'borsajs';
255
393
 
@@ -269,6 +407,7 @@ This library accesses publicly available data from the following sources:
269
407
  | Crypto | BtcTurk | [btcturk.com](https://www.btcturk.com/) | Cryptocurrency data |
270
408
  | Fund | TEFAS | [tefas.gov.tr](https://www.tefas.gov.tr/) | Investment fund data |
271
409
  | Inflation | TCMB | [tcmb.gov.tr](https://www.tcmb.gov.tr/) | Inflation data |
410
+ | KAP | KAP | [kap.org.tr](https://www.kap.org.tr/) | Company information |
272
411
  | VIOP | İş Yatırım | [isyatirim.com.tr](https://www.isyatirim.com.tr/) | Futures and options |
273
412
 
274
413
  ## ⚠️ Important Notices
package/README.md CHANGED
@@ -39,6 +39,8 @@ const cryptoList = await cryptoSymbols(); // → ['BTCTRY', 'ETHTRY', ...] (173
39
39
 
40
40
  ### Ticker (Hisse Senedi)
41
41
 
42
+ **BIST hisselerinin anlık fiyat ve hacim verilerine saniyeler içinde ulaşın.** Ticker API, bir hisse senedinin güncel fiyatı, günlük değişimi, işlem hacmi ve OHLC (açılış-en yüksek-en düşük-kapanış) değerlerini kolayca almanızı sağlar. Teknik analiz, portföy takibi veya otomatik alım-satım stratejileri için ideal.
43
+
42
44
  ```typescript
43
45
  import { Ticker } from 'borsajs';
44
46
 
@@ -65,6 +67,8 @@ const info = await stock.getInfo();
65
67
 
66
68
  ### FX (Döviz & Emtia)
67
69
 
70
+ **Döviz kurları ve emtia fiyatlarını canlı takip edin.** FX API ile USD, EUR gibi döviz kurlarının yanı sıra altın, gümüş ve ons fiyatlarına anında erişebilirsiniz. Kur takibi, döviz arbitrajı veya altın yatırım stratejileri için güvenilir veri kaynağı.
71
+
68
72
  ```typescript
69
73
  import { FX, fxSymbols } from 'borsajs';
70
74
 
@@ -89,6 +93,8 @@ const current = await usd.getCurrent();
89
93
 
90
94
  ### Crypto (Kripto Para)
91
95
 
96
+ **Türkiye'nin en büyük kripto borsası BtcTurk'ten anlık veriler.** 173 kripto para çiftinin fiyat, hacim ve değişim bilgilerine erişin. Bitcoin, Ethereum ve diğer kripto paraların TRY karşılığını takip etmek için en hızlı yol.
97
+
92
98
  ```typescript
93
99
  import { Crypto, cryptoSymbols } from 'borsajs';
94
100
 
@@ -118,6 +124,8 @@ const current = await btc.getCurrent();
118
124
 
119
125
  ### Index (Endeksler)
120
126
 
127
+ **BIST endekslerini gerçek zamanlı izleyin.** XU100, XU030, XBANK gibi sektör ve piyasa endekslerinin güncel değerleri ve yüzdesel değişimlerini alın. Piyasa trendlerini analiz etmek ve sektörel performansı karşılaştırmak için vazgeçilmez.
128
+
121
129
  ```typescript
122
130
  import { Index, indexSymbols } from 'borsajs';
123
131
 
@@ -145,6 +153,8 @@ const info = await xu100.getInfo();
145
153
 
146
154
  ### Inflation (Enflasyon)
147
155
 
156
+ **TCMB'nin resmi enflasyon verilerine doğrudan erişin.** Aylık ve yıllık TÜFE oranlarını sorgulayın veya geçmiş tarihler arasında enflasyon hesaplayın. Yatırım kararlarınızı reel getiri bazında değerlendirmek için kritik.
157
+
148
158
  ```typescript
149
159
  import { Inflation } from 'borsajs';
150
160
 
@@ -177,8 +187,143 @@ const calc = await inflation.calculate(100000, '2020-01', '2024-01');
177
187
  }
178
188
  ```
179
189
 
190
+ ### KAP (Kamu Aydınlatma Platformu)
191
+
192
+ **Şirketlerin resmi açıklamalarına ve bildirimlerine tek noktadan ulaşın.** KAP API ile 731 BIST şirketinin bildirimlerini, beklenen rapor takvimlerini ve kurumsal bilgilerini sorgulayabilirsiniz. Yatırım kararlarınızı şirketlerin resmi açıklamaları ışığında alın.
193
+
194
+ **Özellikler:**
195
+ - 🏢 **731 BIST şirketi** - Tüm halka açık şirketlerin listesi ve bilgileri
196
+ - 📢 **Anlık Bildirimler** - Şirketlerin KAP'a yaptığı tüm açıklamalar
197
+ - 📅 **Bildirim Takvimi** - Finansal rapor ve açıklama tarihleri
198
+ - 🏛️ **Kurumsal Bilgiler** - Sektör, pazar, web sitesi bilgileri
199
+
200
+ ```typescript
201
+ import { getKapProvider } from 'borsajs';
202
+
203
+ const kap = getKapProvider();
204
+ const companies = await kap.getCompanies();
205
+ const search = await kap.search('türk hava');
206
+ ```
207
+
208
+ **Response (Companies):**
209
+ ```json
210
+ [
211
+ {
212
+ "ticker": "THYAO",
213
+ "name": "TÜRK HAVA YOLLARI A.O.",
214
+ "city": "İSTANBUL"
215
+ }
216
+ ]
217
+ ```
218
+
219
+ **Response (Search):**
220
+ ```json
221
+ [
222
+ {
223
+ "ticker": "THYAO",
224
+ "name": "TÜRK HAVA YOLLARI A.O.",
225
+ "city": "İSTANBUL"
226
+ }
227
+ ]
228
+ ```
229
+
230
+ **KAP Bildirimleri:**
231
+ ```typescript
232
+ const disclosures = await kap.getDisclosures('THYAO', 5);
233
+ ```
234
+
235
+ **Response (Disclosures):**
236
+ ```json
237
+ [
238
+ {
239
+ "date": "29.12.2025 19:21:18",
240
+ "title": "Haber ve Söylentilere İlişkin Açıklama",
241
+ "disclosureIndex": 1530826,
242
+ "url": "https://www.kap.org.tr/tr/Bildirim/1530826"
243
+ }
244
+ ]
245
+ ```
246
+
247
+ **Beklenen Bildirim Takvimi:**
248
+ ```typescript
249
+ const calendar = await kap.getCalendar('THYAO');
250
+ ```
251
+
252
+ **Response (Calendar):**
253
+ ```json
254
+ [
255
+ {
256
+ "startDate": "01.01.2026",
257
+ "endDate": "11.03.2026",
258
+ "subject": "Finansal Rapor",
259
+ "period": "Yıllık",
260
+ "year": "2025"
261
+ }
262
+ ]
263
+ ```
264
+
265
+ **Şirket Detayları:**
266
+ ```typescript
267
+ const details = await kap.getCompanyDetails('THYAO');
268
+ ```
269
+
270
+ **Response (Company Details):**
271
+ ```json
272
+ {
273
+ "sector": "ULAŞTIRMA VE DEPOLAMA",
274
+ "market": "YILDIZ PAZAR",
275
+ "website": "www.turkishairlines.com / http://investor.turkishairlines.com"
276
+ }
277
+ ```
278
+
279
+ ### VIOP (Vadeli İşlem ve Opsiyon Piyasası)
280
+
281
+ **Türk türev piyasasını gerçek zamanlı takip edin.** Hisse senedi vadeli işlemleri, endeks vadeli işlemleri, döviz ve emtia kontratlarına anında erişin. Riskten korunma (hedging) stratejileri ve türev ürün ticareti için vazgeçilmez.
282
+
283
+ ```typescript
284
+ import { VIOP } from 'borsajs';
285
+
286
+ const viop = new VIOP();
287
+
288
+ // Tüm vadeli işlemleri al
289
+ const futures = await viop.getFutures();
290
+
291
+ // Hisse senedi vadeli işlemleri
292
+ const stockFutures = await viop.getStockFutures();
293
+
294
+ // Endeks vadeli işlemleri
295
+ const indexFutures = await viop.getIndexFutures();
296
+
297
+ // Döviz vadeli işlemleri
298
+ const currencyFutures = await viop.getCurrencyFutures();
299
+
300
+ // Emtia vadeli işlemleri
301
+ const commodityFutures = await viop.getCommodityFutures();
302
+
303
+ // Opsiyonlar
304
+ const options = await viop.getOptions();
305
+
306
+ // Belirli bir hisse için kontratlar
307
+ const thyaoContracts = await viop.getBySymbol('THYAO');
308
+ ```
309
+
310
+ **Response (Contract Data):**
311
+ ```json
312
+ {
313
+ "code": "THYAO",
314
+ "contract": "THYAO0226",
315
+ "price": 275.5,
316
+ "change": 1.25,
317
+ "volumeTl": 15420000,
318
+ "volumeQty": 56000,
319
+ "category": "stock"
320
+ }
321
+ ```
322
+
180
323
  ### Symbols (Sembol Listeleri)
181
324
 
325
+ **Tüm piyasa sembollerine tek çağrıda erişin.** Hisse senetleri, kripto paralar, dövizler ve endekslerin sembol listelerini alın. Otomatik veri çekme veya tarama algoritmaları için mükemmel başlangıç noktası.
326
+
182
327
  ```typescript
183
328
  import { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from 'borsajs';
184
329
 
@@ -208,6 +353,7 @@ Bu kütüphane aşağıdaki kamuya açık veri kaynaklarından yararlanmaktadır
208
353
  | Crypto | BtcTurk | [btcturk.com](https://www.btcturk.com/) | Kripto para verileri |
209
354
  | Fund | TEFAS | [tefas.gov.tr](https://www.tefas.gov.tr/) | Yatırım fonu verileri |
210
355
  | Inflation | TCMB | [tcmb.gov.tr](https://www.tcmb.gov.tr/) | Enflasyon verileri |
356
+ | KAP | KAP | [kap.org.tr](https://www.kap.org.tr/) | Şirket bilgileri |
211
357
  | VIOP | İş Yatırım | [isyatirim.com.tr](https://www.isyatirim.com.tr/) | Vadeli işlem ve opsiyon |
212
358
 
213
359
  ## ⚠️ Önemli Uyarılar
@@ -5,17 +5,38 @@ export interface Company {
5
5
  city: string;
6
6
  }
7
7
  export interface Disclosure {
8
- id: string;
9
- date: Date;
8
+ date: string;
10
9
  title: string;
11
- type: string;
10
+ disclosureIndex: number;
12
11
  url: string;
13
12
  }
13
+ export interface CalendarEvent {
14
+ startDate: string;
15
+ endDate: string;
16
+ subject: string;
17
+ period: string;
18
+ year: string;
19
+ }
20
+ export interface CompanyDetails {
21
+ sector?: string;
22
+ market?: string;
23
+ website?: string;
24
+ }
14
25
  export declare class KapProvider extends BaseProvider {
15
26
  private static readonly BASE_URL;
27
+ private static readonly DISCLOSURE_URL;
28
+ private static readonly CALENDAR_API_URL;
29
+ private static readonly COMPANY_INFO_URL;
30
+ private oidMap;
31
+ private oidCacheTime;
32
+ private readonly CACHE_DURATION;
16
33
  constructor(options?: ProviderOptions);
17
34
  getCompanies(): Promise<Company[]>;
18
35
  search(query: string): Promise<Company[]>;
36
+ getMemberOid(symbol: string): Promise<string | null>;
37
+ getDisclosures(symbol: string, limit?: number): Promise<Disclosure[]>;
38
+ getCalendar(symbol: string): Promise<CalendarEvent[]>;
39
+ getCompanyDetails(symbol: string): Promise<CompanyDetails>;
19
40
  }
20
41
  export interface ContractData {
21
42
  code: string;
@@ -1 +1 @@
1
- {"version":3,"file":"kap.d.ts","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAEjG,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;gBAChD,OAAO,CAAC,EAAE,eAAe;IAE/B,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAiBlC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAKlD;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAEvJ,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuE;gBAC3F,OAAO,CAAC,EAAE,eAAe;IAE/B,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB3G,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAsBzF;AAGD,wBAAgB,cAAc,IAAI,WAAW,CAA2E;AAExH,wBAAgB,eAAe,IAAI,YAAY,CAA+E"}
1
+ {"version":3,"file":"kap.d.ts","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAClG,MAAM,WAAW,aAAa;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACrH,MAAM,WAAW,cAAc;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAAE;AAEvF,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAoD;IAC1F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAmE;IAC3G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAiD;IACzF,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAY;gBAE/B,OAAO,CAAC,EAAE,eAAe;IAE/B,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAoClC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAMzC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuCpD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAyCzE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA2DrD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAyCnE;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAEvJ,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuE;gBAC3F,OAAO,CAAC,EAAE,eAAe;IAE/B,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB3G,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAsBzF;AAGD,wBAAgB,cAAc,IAAI,WAAW,CAA2E;AAExH,wBAAgB,eAAe,IAAI,YAAY,CAA+E"}
@@ -7,6 +7,12 @@ import { TTL } from '../cache.js';
7
7
  import { APIError } from '../exceptions.js';
8
8
  export class KapProvider extends BaseProvider {
9
9
  static BASE_URL = 'https://www.kap.org.tr';
10
+ static DISCLOSURE_URL = 'https://www.kap.org.tr/tr/bildirim-sorgu-sonuc';
11
+ static CALENDAR_API_URL = 'https://kap.org.tr/tr/api/expected-disclosure-inquiry/company';
12
+ static COMPANY_INFO_URL = 'https://kap.org.tr/tr/sirket-bilgileri/ozet';
13
+ oidMap = null;
14
+ oidCacheTime = 0;
15
+ CACHE_DURATION = 86400000; // 24 hours in ms
10
16
  constructor(options) { super(options); }
11
17
  async getCompanies() {
12
18
  const cacheKey = 'kap:companies';
@@ -14,14 +20,28 @@ export class KapProvider extends BaseProvider {
14
20
  if (cached)
15
21
  return cached;
16
22
  try {
17
- const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketleri`, { responseType: 'text' });
18
- const $ = cheerio.load(response.data);
23
+ const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' });
24
+ // Parse from Next.js embedded JSON data
25
+ // Pattern: \\"mkkMemberOid\\":\\"xxx\\",\\"kapMemberTitle\\":\\"...\\",\\"relatedMemberTitle\\":\\"...\\",\\"stockCode\\":\\"TICKER\\"
26
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",\\"kapMemberTitle\\":\\"([^\\]+)\\",\\"relatedMemberTitle\\":\\"[^\\]*\\",\\"stockCode\\":\\"([^\\]+)\\"/g;
19
27
  const companies = [];
20
- $('table.dataTable tbody tr').each((_, row) => {
21
- const cells = $(row).find('td');
22
- if (cells.length >= 3)
23
- companies.push({ ticker: $(cells[0]).text().trim(), name: $(cells[1]).text().trim(), city: $(cells[2]).text().trim() });
24
- });
28
+ const matches = response.data.matchAll(pattern);
29
+ for (const match of matches) {
30
+ const name = match[2];
31
+ const stockCodes = match[3];
32
+ // Handle multiple tickers (e.g., "GARAN, TGB")
33
+ if (stockCodes.includes(',')) {
34
+ const tickers = stockCodes.split(',').map(t => t.trim());
35
+ for (const ticker of tickers) {
36
+ if (ticker) {
37
+ companies.push({ ticker, name, city: '' });
38
+ }
39
+ }
40
+ }
41
+ else {
42
+ companies.push({ ticker: stockCodes, name, city: '' });
43
+ }
44
+ }
25
45
  this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
26
46
  return companies;
27
47
  }
@@ -34,6 +54,159 @@ export class KapProvider extends BaseProvider {
34
54
  const q = query.toLowerCase();
35
55
  return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
36
56
  }
57
+ async getMemberOid(symbol) {
58
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
59
+ const currentTime = Date.now();
60
+ // Check cache
61
+ if (this.oidMap && (currentTime - this.oidCacheTime) < this.CACHE_DURATION) {
62
+ return this.oidMap.get(symbol) || null;
63
+ }
64
+ // Fetch BIST companies list from KAP
65
+ try {
66
+ const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' });
67
+ // Parse mkkMemberOid and stockCode pairs from Next.js data
68
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",[^}]*\\"stockCode\\":\\"([^\\]+)\\"/g;
69
+ const matches = response.data.matchAll(pattern);
70
+ // Build mapping: stockCode -> mkkMemberOid
71
+ this.oidMap = new Map();
72
+ for (const match of matches) {
73
+ const oid = match[1];
74
+ const codesStr = match[2];
75
+ // Handle multiple codes per company (e.g., "GARAN, TGB")
76
+ for (const code of codesStr.split(',')) {
77
+ const trimmedCode = code.trim();
78
+ if (trimmedCode) {
79
+ this.oidMap.set(trimmedCode, oid);
80
+ }
81
+ }
82
+ }
83
+ this.oidCacheTime = currentTime;
84
+ return this.oidMap.get(symbol) || null;
85
+ }
86
+ catch (error) {
87
+ return null;
88
+ }
89
+ }
90
+ async getDisclosures(symbol, limit = 20) {
91
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
92
+ // Get KAP member OID for the symbol
93
+ const memberOid = await this.getMemberOid(symbol);
94
+ if (!memberOid) {
95
+ return [];
96
+ }
97
+ // Fetch disclosures from KAP
98
+ const discUrl = `${KapProvider.DISCLOSURE_URL}?member=${memberOid}`;
99
+ try {
100
+ const response = await this.get(discUrl, { responseType: 'text' });
101
+ // Parse disclosures from Next.js embedded data
102
+ // Pattern: publishDate\":\"29.12.2025 19:21:18\",\"disclosureIndex\":1530826...title\":\"...\"
103
+ const pattern = /publishDate\\":\\"([^\\]+)\\".*?disclosureIndex\\":(\d+).*?title\\":\\"([^\\]+)\\"/gs;
104
+ const matches = Array.from(response.data.matchAll(pattern));
105
+ const disclosures = [];
106
+ for (let i = 0; i < Math.min(matches.length, limit); i++) {
107
+ const match = matches[i];
108
+ const date = match[1];
109
+ const idx = parseInt(match[2]);
110
+ const title = match[3];
111
+ disclosures.push({
112
+ date,
113
+ title,
114
+ disclosureIndex: idx,
115
+ url: `https://www.kap.org.tr/tr/Bildirim/${idx}`
116
+ });
117
+ }
118
+ return disclosures;
119
+ }
120
+ catch (error) {
121
+ throw new APIError(`Failed to fetch disclosures for ${symbol}: ${error}`);
122
+ }
123
+ }
124
+ async getCalendar(symbol) {
125
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
126
+ // Get KAP member OID for the symbol
127
+ const memberOid = await this.getMemberOid(symbol);
128
+ if (!memberOid) {
129
+ return [];
130
+ }
131
+ // Calculate date range: today to 6 months from now
132
+ const now = new Date();
133
+ const startDate = now.toISOString().split('T')[0];
134
+ const endDate = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
135
+ // Fetch expected disclosures from KAP API
136
+ const headers = {
137
+ 'Accept': '*/*',
138
+ 'Content-Type': 'application/json',
139
+ 'Origin': 'https://kap.org.tr',
140
+ 'Referer': 'https://kap.org.tr/tr/beklenen-bildirim-sorgu'
141
+ };
142
+ const payload = {
143
+ startDate,
144
+ endDate,
145
+ memberTypes: ['IGS'],
146
+ mkkMemberOidList: [memberOid],
147
+ disclosureClass: '',
148
+ subjects: [],
149
+ mainSector: '',
150
+ sector: '',
151
+ subSector: '',
152
+ market: '',
153
+ index: '',
154
+ year: '',
155
+ term: '',
156
+ ruleType: ''
157
+ };
158
+ try {
159
+ const response = await this.post(KapProvider.CALENDAR_API_URL, payload, { headers });
160
+ const events = [];
161
+ for (const item of response.data) {
162
+ events.push({
163
+ startDate: item.startDate || '',
164
+ endDate: item.endDate || '',
165
+ subject: item.subject || '',
166
+ period: item.ruleTypeTerm || '',
167
+ year: item.year || ''
168
+ });
169
+ }
170
+ return events;
171
+ }
172
+ catch (error) {
173
+ throw new APIError(`Failed to fetch calendar for ${symbol}: ${error}`);
174
+ }
175
+ }
176
+ async getCompanyDetails(symbol) {
177
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
178
+ // Get KAP member OID for the symbol
179
+ const memberOid = await this.getMemberOid(symbol);
180
+ if (!memberOid) {
181
+ return {};
182
+ }
183
+ // Fetch company info page
184
+ const url = `${KapProvider.COMPANY_INFO_URL}/${memberOid}`;
185
+ try {
186
+ const response = await this.get(url, { responseType: 'text' });
187
+ const html = response.data;
188
+ const result = {};
189
+ // Extract sector: href="/tr/Sektorler?sector=...">SECTOR_NAME</a>
190
+ const sectorMatch = html.match(/href="\/tr\/Sektorler\?sector=[^"]*">([^<]+)<\/a>/);
191
+ if (sectorMatch) {
192
+ result.sector = sectorMatch[1].trim();
193
+ }
194
+ // Extract market: href="/tr/Pazarlar?market=...">MARKET_NAME</a>
195
+ const marketMatch = html.match(/href="\/tr\/Pazarlar\?market=[^"]*">([^<]+)<\/a>/);
196
+ if (marketMatch) {
197
+ result.market = marketMatch[1].trim();
198
+ }
199
+ // Extract website: after "İnternet Adresi" label
200
+ const websiteMatch = html.match(/İnternet Adresi<\/h3><p[^>]*>([^<]+)<\/p>/);
201
+ if (websiteMatch) {
202
+ result.website = websiteMatch[1].trim();
203
+ }
204
+ return result;
205
+ }
206
+ catch (error) {
207
+ return {};
208
+ }
209
+ }
37
210
  }
38
211
  export class ViopProvider extends BaseProvider {
39
212
  static BASE_URL = 'https://www.isyatirim.com.tr/tr-tr/analiz/Sayfalar/viop-akis.aspx';
@@ -1 +1 @@
1
- {"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "borsajs",
3
- "version": "0.1.2",
4
- "description": "Turkey financial markets data library, BIST stocks, forex, crypto, investment funds, and more",
3
+ "version": "0.1.5",
4
+ "description": "Türkiye financial markets data library, BIST stocks, KAP,VIOP, forex, crypto, investment funds, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -7,10 +7,19 @@ import { TTL } from '../cache.js';
7
7
  import { APIError } from '../exceptions.js';
8
8
 
9
9
  export interface Company { ticker: string; name: string; city: string; }
10
- export interface Disclosure { id: string; date: Date; title: string; type: string; url: string; }
10
+ export interface Disclosure { date: string; title: string; disclosureIndex: number; url: string; }
11
+ export interface CalendarEvent { startDate: string; endDate: string; subject: string; period: string; year: string; }
12
+ export interface CompanyDetails { sector?: string; market?: string; website?: string; }
11
13
 
12
14
  export class KapProvider extends BaseProvider {
13
15
  private static readonly BASE_URL = 'https://www.kap.org.tr';
16
+ private static readonly DISCLOSURE_URL = 'https://www.kap.org.tr/tr/bildirim-sorgu-sonuc';
17
+ private static readonly CALENDAR_API_URL = 'https://kap.org.tr/tr/api/expected-disclosure-inquiry/company';
18
+ private static readonly COMPANY_INFO_URL = 'https://kap.org.tr/tr/sirket-bilgileri/ozet';
19
+ private oidMap: Map<string, string> | null = null;
20
+ private oidCacheTime: number = 0;
21
+ private readonly CACHE_DURATION = 86400000; // 24 hours in ms
22
+
14
23
  constructor(options?: ProviderOptions) { super(options); }
15
24
 
16
25
  async getCompanies(): Promise<Company[]> {
@@ -18,13 +27,32 @@ export class KapProvider extends BaseProvider {
18
27
  const cached = this.cacheGet<Company[]>(cacheKey);
19
28
  if (cached) return cached;
20
29
  try {
21
- const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketleri`, { responseType: 'text' as const });
22
- const $ = cheerio.load(response.data);
30
+ const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' as const });
31
+
32
+ // Parse from Next.js embedded JSON data
33
+ // Pattern: \\"mkkMemberOid\\":\\"xxx\\",\\"kapMemberTitle\\":\\"...\\",\\"relatedMemberTitle\\":\\"...\\",\\"stockCode\\":\\"TICKER\\"
34
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",\\"kapMemberTitle\\":\\"([^\\]+)\\",\\"relatedMemberTitle\\":\\"[^\\]*\\",\\"stockCode\\":\\"([^\\]+)\\"/g;
35
+
23
36
  const companies: Company[] = [];
24
- $('table.dataTable tbody tr').each((_, row) => {
25
- const cells = $(row).find('td');
26
- if (cells.length >= 3) companies.push({ ticker: $(cells[0]).text().trim(), name: $(cells[1]).text().trim(), city: $(cells[2]).text().trim() });
27
- });
37
+ const matches = response.data.matchAll(pattern);
38
+
39
+ for (const match of matches) {
40
+ const name = match[2];
41
+ const stockCodes = match[3];
42
+
43
+ // Handle multiple tickers (e.g., "GARAN, TGB")
44
+ if (stockCodes.includes(',')) {
45
+ const tickers = stockCodes.split(',').map(t => t.trim());
46
+ for (const ticker of tickers) {
47
+ if (ticker) {
48
+ companies.push({ ticker, name, city: '' });
49
+ }
50
+ }
51
+ } else {
52
+ companies.push({ ticker: stockCodes, name, city: '' });
53
+ }
54
+ }
55
+
28
56
  this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
29
57
  return companies;
30
58
  } catch (error) { throw new APIError(`Failed to fetch companies: ${error}`); }
@@ -35,6 +63,187 @@ export class KapProvider extends BaseProvider {
35
63
  const q = query.toLowerCase();
36
64
  return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
37
65
  }
66
+
67
+ async getMemberOid(symbol: string): Promise<string | null> {
68
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
69
+ const currentTime = Date.now();
70
+
71
+ // Check cache
72
+ if (this.oidMap && (currentTime - this.oidCacheTime) < this.CACHE_DURATION) {
73
+ return this.oidMap.get(symbol) || null;
74
+ }
75
+
76
+ // Fetch BIST companies list from KAP
77
+ try {
78
+ const response = await this.get<string>(`${KapProvider.BASE_URL}/tr/bist-sirketler`, { responseType: 'text' as const });
79
+
80
+ // Parse mkkMemberOid and stockCode pairs from Next.js data
81
+ const pattern = /\\"mkkMemberOid\\":\\"([^\\]+)\\",[^}]*\\"stockCode\\":\\"([^\\]+)\\"/g;
82
+ const matches = response.data.matchAll(pattern);
83
+
84
+ // Build mapping: stockCode -> mkkMemberOid
85
+ this.oidMap = new Map();
86
+ for (const match of matches) {
87
+ const oid = match[1];
88
+ const codesStr = match[2];
89
+
90
+ // Handle multiple codes per company (e.g., "GARAN, TGB")
91
+ for (const code of codesStr.split(',')) {
92
+ const trimmedCode = code.trim();
93
+ if (trimmedCode) {
94
+ this.oidMap.set(trimmedCode, oid);
95
+ }
96
+ }
97
+ }
98
+
99
+ this.oidCacheTime = currentTime;
100
+ return this.oidMap.get(symbol) || null;
101
+ } catch (error) {
102
+ return null;
103
+ }
104
+ }
105
+
106
+ async getDisclosures(symbol: string, limit: number = 20): Promise<Disclosure[]> {
107
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
108
+
109
+ // Get KAP member OID for the symbol
110
+ const memberOid = await this.getMemberOid(symbol);
111
+ if (!memberOid) {
112
+ return [];
113
+ }
114
+
115
+ // Fetch disclosures from KAP
116
+ const discUrl = `${KapProvider.DISCLOSURE_URL}?member=${memberOid}`;
117
+
118
+ try {
119
+ const response = await this.get<string>(discUrl, { responseType: 'text' as const });
120
+
121
+ // Parse disclosures from Next.js embedded data
122
+ // Pattern: publishDate\":\"29.12.2025 19:21:18\",\"disclosureIndex\":1530826...title\":\"...\"
123
+ const pattern = /publishDate\\":\\"([^\\]+)\\".*?disclosureIndex\\":(\d+).*?title\\":\\"([^\\]+)\\"/gs;
124
+ const matches = Array.from(response.data.matchAll(pattern));
125
+
126
+ const disclosures: Disclosure[] = [];
127
+ for (let i = 0; i < Math.min(matches.length, limit); i++) {
128
+ const match = matches[i];
129
+ const date = match[1];
130
+ const idx = parseInt(match[2]);
131
+ const title = match[3];
132
+
133
+ disclosures.push({
134
+ date,
135
+ title,
136
+ disclosureIndex: idx,
137
+ url: `https://www.kap.org.tr/tr/Bildirim/${idx}`
138
+ });
139
+ }
140
+
141
+ return disclosures;
142
+ } catch (error) {
143
+ throw new APIError(`Failed to fetch disclosures for ${symbol}: ${error}`);
144
+ }
145
+ }
146
+
147
+ async getCalendar(symbol: string): Promise<CalendarEvent[]> {
148
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
149
+
150
+ // Get KAP member OID for the symbol
151
+ const memberOid = await this.getMemberOid(symbol);
152
+ if (!memberOid) {
153
+ return [];
154
+ }
155
+
156
+ // Calculate date range: today to 6 months from now
157
+ const now = new Date();
158
+ const startDate = now.toISOString().split('T')[0];
159
+ const endDate = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
160
+
161
+ // Fetch expected disclosures from KAP API
162
+ const headers = {
163
+ 'Accept': '*/*',
164
+ 'Content-Type': 'application/json',
165
+ 'Origin': 'https://kap.org.tr',
166
+ 'Referer': 'https://kap.org.tr/tr/beklenen-bildirim-sorgu'
167
+ };
168
+
169
+ const payload = {
170
+ startDate,
171
+ endDate,
172
+ memberTypes: ['IGS'],
173
+ mkkMemberOidList: [memberOid],
174
+ disclosureClass: '',
175
+ subjects: [],
176
+ mainSector: '',
177
+ sector: '',
178
+ subSector: '',
179
+ market: '',
180
+ index: '',
181
+ year: '',
182
+ term: '',
183
+ ruleType: ''
184
+ };
185
+
186
+ try {
187
+ const response = await this.post<any[]>(KapProvider.CALENDAR_API_URL, payload, { headers });
188
+
189
+ const events: CalendarEvent[] = [];
190
+ for (const item of response.data) {
191
+ events.push({
192
+ startDate: item.startDate || '',
193
+ endDate: item.endDate || '',
194
+ subject: item.subject || '',
195
+ period: item.ruleTypeTerm || '',
196
+ year: item.year || ''
197
+ });
198
+ }
199
+
200
+ return events;
201
+ } catch (error) {
202
+ throw new APIError(`Failed to fetch calendar for ${symbol}: ${error}`);
203
+ }
204
+ }
205
+
206
+ async getCompanyDetails(symbol: string): Promise<CompanyDetails> {
207
+ symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
208
+
209
+ // Get KAP member OID for the symbol
210
+ const memberOid = await this.getMemberOid(symbol);
211
+ if (!memberOid) {
212
+ return {};
213
+ }
214
+
215
+ // Fetch company info page
216
+ const url = `${KapProvider.COMPANY_INFO_URL}/${memberOid}`;
217
+
218
+ try {
219
+ const response = await this.get<string>(url, { responseType: 'text' as const });
220
+ const html = response.data;
221
+
222
+ const result: CompanyDetails = {};
223
+
224
+ // Extract sector: href="/tr/Sektorler?sector=...">SECTOR_NAME</a>
225
+ const sectorMatch = html.match(/href="\/tr\/Sektorler\?sector=[^"]*">([^<]+)<\/a>/);
226
+ if (sectorMatch) {
227
+ result.sector = sectorMatch[1].trim();
228
+ }
229
+
230
+ // Extract market: href="/tr/Pazarlar?market=...">MARKET_NAME</a>
231
+ const marketMatch = html.match(/href="\/tr\/Pazarlar\?market=[^"]*">([^<]+)<\/a>/);
232
+ if (marketMatch) {
233
+ result.market = marketMatch[1].trim();
234
+ }
235
+
236
+ // Extract website: after "İnternet Adresi" label
237
+ const websiteMatch = html.match(/İnternet Adresi<\/h3><p[^>]*>([^<]+)<\/p>/);
238
+ if (websiteMatch) {
239
+ result.website = websiteMatch[1].trim();
240
+ }
241
+
242
+ return result;
243
+ } catch (error) {
244
+ return {};
245
+ }
246
+ }
38
247
  }
39
248
 
40
249
  export interface ContractData { code: string; contract: string; price: number; change: number; volumeTl: number; volumeQty: number; category: string; }
package/test/demo.ts CHANGED
@@ -9,6 +9,8 @@ import { Index, indices } from '../src/index-class.js';
9
9
  import { Inflation } from '../src/inflation.js';
10
10
  import { Ticker } from '../src/ticker.js';
11
11
  import { symbols, searchSymbols, cryptoSymbols, fxSymbols, indexSymbols } from '../src/market.js';
12
+ import { getKapProvider } from '../src/providers/kap.js';
13
+ import { VIOP } from '../src/viop.js';
12
14
 
13
15
  async function testCrypto() {
14
16
  console.log('\n🪙 CRYPTO (BtcTurk)');
@@ -117,6 +119,69 @@ async function testSymbols() {
117
119
  } catch (error) { console.error('Error:', error); }
118
120
  }
119
121
 
122
+ async function testKap() {
123
+ console.log('\n🏛️ KAP (Public Disclosure Platform)');
124
+ console.log('─'.repeat(60));
125
+ try {
126
+ const kap = getKapProvider();
127
+ const companies = await kap.getCompanies();
128
+ console.log(`Total Companies: ${companies.length}`);
129
+ console.log('Sample:', JSON.stringify(companies.slice(0, 3), null, 2));
130
+
131
+ const search = await kap.search('türk hava');
132
+ console.log('\nSearch "türk hava":', JSON.stringify(search, null, 2));
133
+
134
+ // Test disclosures
135
+ const disclosures = await kap.getDisclosures('THYAO', 5);
136
+ console.log(`\nRecent THYAO Disclosures (${disclosures.length}):`);
137
+ disclosures.forEach((d, i) => {
138
+ console.log(` ${i + 1}. [${d.date}] ${d.title}`);
139
+ console.log(` ${d.url}`);
140
+ });
141
+
142
+ // Test calendar
143
+ const calendar = await kap.getCalendar('THYAO');
144
+ console.log(`\nTHYAO Expected Disclosures (${calendar.length}):`);
145
+ calendar.slice(0, 3).forEach((c, i) => {
146
+ console.log(` ${i + 1}. ${c.subject} (${c.period} ${c.year})`);
147
+ console.log(` ${c.startDate} - ${c.endDate}`);
148
+ });
149
+
150
+ // Test company details
151
+ const details = await kap.getCompanyDetails('THYAO');
152
+ console.log('\nTHYAO Company Details:', JSON.stringify(details, null, 2));
153
+ } catch (error) { console.error('Error:', error); }
154
+ }
155
+
156
+ async function testViop() {
157
+ console.log('\n📊 VIOP (Derivatives Market)');
158
+ console.log('─'.repeat(60));
159
+ try {
160
+ const viop = new VIOP();
161
+
162
+ // Test stock futures
163
+ const stockFutures = await viop.getStockFutures();
164
+ console.log(`Stock Futures: ${stockFutures.length} contracts`);
165
+ if (stockFutures.length > 0) {
166
+ console.log('Sample:', JSON.stringify(stockFutures.slice(0, 2), null, 2));
167
+ }
168
+
169
+ // Test index futures
170
+ const indexFutures = await viop.getIndexFutures();
171
+ console.log(`\nIndex Futures: ${indexFutures.length} contracts`);
172
+ if (indexFutures.length > 0) {
173
+ console.log('Sample:', JSON.stringify(indexFutures.slice(0, 2), null, 2));
174
+ }
175
+
176
+ // Test by symbol
177
+ const thyaoContracts = await viop.getBySymbol('THYAO');
178
+ console.log(`\nTHYAO Contracts: ${thyaoContracts.length}`);
179
+ if (thyaoContracts.length > 0) {
180
+ console.log('First:', JSON.stringify(thyaoContracts[0], null, 2));
181
+ }
182
+ } catch (error) { console.error('Error:', error); }
183
+ }
184
+
120
185
  async function main() {
121
186
  console.log('🚀 borsajs API Test');
122
187
  console.log('═'.repeat(60));
@@ -128,6 +193,8 @@ async function main() {
128
193
  await testFund();
129
194
  await testInflation();
130
195
  await testSymbols();
196
+ await testKap();
197
+ await testViop();
131
198
 
132
199
  console.log('\n' + '═'.repeat(60));
133
200
  console.log('✅ All tests completed!');