borsajs 0.1.2 → 0.1.4

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
@@ -218,6 +218,87 @@ const calc = await inflation.calculate(100000, '2020-01', '2024-01');
218
218
  }
219
219
  ```
220
220
 
221
+ ### KAP (Public Disclosure Platform)
222
+
223
+ ```typescript
224
+ import { getKapProvider } from 'borsajs';
225
+
226
+ const kap = getKapProvider();
227
+ const companies = await kap.getCompanies();
228
+ const search = await kap.search('türk hava');
229
+ ```
230
+
231
+ **Response (Companies):**
232
+ ```json
233
+ [
234
+ {
235
+ "ticker": "THYAO",
236
+ "name": "TÜRK HAVA YOLLARI A.O.",
237
+ "city": "İSTANBUL"
238
+ }
239
+ ]
240
+ ```
241
+
242
+ **Response (Search):**
243
+ ```json
244
+ [
245
+ {
246
+ "ticker": "THYAO",
247
+ "name": "TÜRK HAVA YOLLARI A.O.",
248
+ "city": "İSTANBUL"
249
+ }
250
+ ]
251
+ ```
252
+
253
+ **KAP Disclosures:**
254
+ ```typescript
255
+ const disclosures = await kap.getDisclosures('THYAO', 5);
256
+ ```
257
+
258
+ **Response (Disclosures):**
259
+ ```json
260
+ [
261
+ {
262
+ "date": "29.12.2025 19:21:18",
263
+ "title": "Haber ve Söylentilere İlişkin Açıklama",
264
+ "disclosureIndex": 1530826,
265
+ "url": "https://www.kap.org.tr/tr/Bildirim/1530826"
266
+ }
267
+ ]
268
+ ```
269
+
270
+ **Expected Disclosure Calendar:**
271
+ ```typescript
272
+ const calendar = await kap.getCalendar('THYAO');
273
+ ```
274
+
275
+ **Response (Calendar):**
276
+ ```json
277
+ [
278
+ {
279
+ "startDate": "01.01.2026",
280
+ "endDate": "11.03.2026",
281
+ "subject": "Finansal Rapor",
282
+ "period": "Yıllık",
283
+ "year": "2025"
284
+ }
285
+ ]
286
+ ```
287
+
288
+ **Company Details:**
289
+ ```typescript
290
+ const details = await kap.getCompanyDetails('THYAO');
291
+ ```
292
+
293
+ **Response (Company Details):**
294
+ ```json
295
+ {
296
+ "sector": "ULAŞTIRMA VE DEPOLAMA",
297
+ "market": "YILDIZ PAZAR",
298
+ "website": "www.turkishairlines.com / http://investor.turkishairlines.com"
299
+ }
300
+ ```
301
+
221
302
  ### Symbols
222
303
 
223
304
  ```typescript
@@ -269,6 +350,7 @@ This library accesses publicly available data from the following sources:
269
350
  | Crypto | BtcTurk | [btcturk.com](https://www.btcturk.com/) | Cryptocurrency data |
270
351
  | Fund | TEFAS | [tefas.gov.tr](https://www.tefas.gov.tr/) | Investment fund data |
271
352
  | Inflation | TCMB | [tcmb.gov.tr](https://www.tcmb.gov.tr/) | Inflation data |
353
+ | KAP | KAP | [kap.org.tr](https://www.kap.org.tr/) | Company information |
272
354
  | VIOP | İş Yatırım | [isyatirim.com.tr](https://www.isyatirim.com.tr/) | Futures and options |
273
355
 
274
356
  ## ⚠️ Important Notices
package/README.md CHANGED
@@ -177,6 +177,87 @@ const calc = await inflation.calculate(100000, '2020-01', '2024-01');
177
177
  }
178
178
  ```
179
179
 
180
+ ### KAP (Kamu Aydınlatma Platformu)
181
+
182
+ ```typescript
183
+ import { getKapProvider } from 'borsajs';
184
+
185
+ const kap = getKapProvider();
186
+ const companies = await kap.getCompanies();
187
+ const search = await kap.search('türk hava');
188
+ ```
189
+
190
+ **Response (Companies):**
191
+ ```json
192
+ [
193
+ {
194
+ "ticker": "THYAO",
195
+ "name": "TÜRK HAVA YOLLARI A.O.",
196
+ "city": "İSTANBUL"
197
+ }
198
+ ]
199
+ ```
200
+
201
+ **Response (Search):**
202
+ ```json
203
+ [
204
+ {
205
+ "ticker": "THYAO",
206
+ "name": "TÜRK HAVA YOLLARI A.O.",
207
+ "city": "İSTANBUL"
208
+ }
209
+ ]
210
+ ```
211
+
212
+ **KAP Bildirimleri:**
213
+ ```typescript
214
+ const disclosures = await kap.getDisclosures('THYAO', 5);
215
+ ```
216
+
217
+ **Response (Disclosures):**
218
+ ```json
219
+ [
220
+ {
221
+ "date": "29.12.2025 19:21:18",
222
+ "title": "Haber ve Söylentilere İlişkin Açıklama",
223
+ "disclosureIndex": 1530826,
224
+ "url": "https://www.kap.org.tr/tr/Bildirim/1530826"
225
+ }
226
+ ]
227
+ ```
228
+
229
+ **Beklenen Bildirim Takvimi:**
230
+ ```typescript
231
+ const calendar = await kap.getCalendar('THYAO');
232
+ ```
233
+
234
+ **Response (Calendar):**
235
+ ```json
236
+ [
237
+ {
238
+ "startDate": "01.01.2026",
239
+ "endDate": "11.03.2026",
240
+ "subject": "Finansal Rapor",
241
+ "period": "Yıllık",
242
+ "year": "2025"
243
+ }
244
+ ]
245
+ ```
246
+
247
+ **Şirket Detayları:**
248
+ ```typescript
249
+ const details = await kap.getCompanyDetails('THYAO');
250
+ ```
251
+
252
+ **Response (Company Details):**
253
+ ```json
254
+ {
255
+ "sector": "ULAŞTIRMA VE DEPOLAMA",
256
+ "market": "YILDIZ PAZAR",
257
+ "website": "www.turkishairlines.com / http://investor.turkishairlines.com"
258
+ }
259
+ ```
260
+
180
261
  ### Symbols (Sembol Listeleri)
181
262
 
182
263
  ```typescript
@@ -208,6 +289,7 @@ Bu kütüphane aşağıdaki kamuya açık veri kaynaklarından yararlanmaktadır
208
289
  | Crypto | BtcTurk | [btcturk.com](https://www.btcturk.com/) | Kripto para verileri |
209
290
  | Fund | TEFAS | [tefas.gov.tr](https://www.tefas.gov.tr/) | Yatırım fonu verileri |
210
291
  | Inflation | TCMB | [tcmb.gov.tr](https://www.tcmb.gov.tr/) | Enflasyon verileri |
292
+ | KAP | KAP | [kap.org.tr](https://www.kap.org.tr/) | Şirket bilgileri |
211
293
  | VIOP | İş Yatırım | [isyatirim.com.tr](https://www.isyatirim.com.tr/) | Vadeli işlem ve opsiyon |
212
294
 
213
295
  ## ⚠️ Ö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.4",
4
+ "description": "Turkey financial markets data library, BIST stocks, KAP, 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,7 @@ 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';
12
13
 
13
14
  async function testCrypto() {
14
15
  console.log('\n🪙 CRYPTO (BtcTurk)');
@@ -117,6 +118,40 @@ async function testSymbols() {
117
118
  } catch (error) { console.error('Error:', error); }
118
119
  }
119
120
 
121
+ async function testKap() {
122
+ console.log('\n🏛️ KAP (Public Disclosure Platform)');
123
+ console.log('─'.repeat(60));
124
+ try {
125
+ const kap = getKapProvider();
126
+ const companies = await kap.getCompanies();
127
+ console.log(`Total Companies: ${companies.length}`);
128
+ console.log('Sample:', JSON.stringify(companies.slice(0, 3), null, 2));
129
+
130
+ const search = await kap.search('türk hava');
131
+ console.log('\nSearch "türk hava":', JSON.stringify(search, null, 2));
132
+
133
+ // Test disclosures
134
+ const disclosures = await kap.getDisclosures('THYAO', 5);
135
+ console.log(`\nRecent THYAO Disclosures (${disclosures.length}):`);
136
+ disclosures.forEach((d, i) => {
137
+ console.log(` ${i + 1}. [${d.date}] ${d.title}`);
138
+ console.log(` ${d.url}`);
139
+ });
140
+
141
+ // Test calendar
142
+ const calendar = await kap.getCalendar('THYAO');
143
+ console.log(`\nTHYAO Expected Disclosures (${calendar.length}):`);
144
+ calendar.slice(0, 3).forEach((c, i) => {
145
+ console.log(` ${i + 1}. ${c.subject} (${c.period} ${c.year})`);
146
+ console.log(` ${c.startDate} - ${c.endDate}`);
147
+ });
148
+
149
+ // Test company details
150
+ const details = await kap.getCompanyDetails('THYAO');
151
+ console.log('\nTHYAO Company Details:', JSON.stringify(details, null, 2));
152
+ } catch (error) { console.error('Error:', error); }
153
+ }
154
+
120
155
  async function main() {
121
156
  console.log('🚀 borsajs API Test');
122
157
  console.log('═'.repeat(60));
@@ -128,6 +163,7 @@ async function main() {
128
163
  await testFund();
129
164
  await testInflation();
130
165
  await testSymbols();
166
+ await testKap();
131
167
 
132
168
  console.log('\n' + '═'.repeat(60));
133
169
  console.log('✅ All tests completed!');