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 +82 -0
- package/README.md +82 -0
- package/dist/providers/kap.d.ts +24 -3
- package/dist/providers/kap.d.ts.map +1 -1
- package/dist/providers/kap.js +180 -7
- package/dist/providers/kap.js.map +1 -1
- package/package.json +2 -2
- package/src/providers/kap.ts +216 -7
- package/test/demo.ts +36 -0
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
|
package/dist/providers/kap.d.ts
CHANGED
|
@@ -5,17 +5,38 @@ export interface Company {
|
|
|
5
5
|
city: string;
|
|
6
6
|
}
|
|
7
7
|
export interface Disclosure {
|
|
8
|
-
|
|
9
|
-
date: Date;
|
|
8
|
+
date: string;
|
|
10
9
|
title: string;
|
|
11
|
-
|
|
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,
|
|
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"}
|
package/dist/providers/kap.js
CHANGED
|
@@ -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-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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":"AAAA;;GAEG;AACH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAmB,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAO5C,MAAM,OAAO,WAAY,SAAQ,YAAY;IACjC,MAAM,CAAU,QAAQ,GAAG,wBAAwB,CAAC;IACpD,MAAM,CAAU,cAAc,GAAG,gDAAgD,CAAC;IAClF,MAAM,CAAU,gBAAgB,GAAG,+DAA+D,CAAC;IACnG,MAAM,CAAU,gBAAgB,GAAG,6CAA6C,CAAC;IACjF,MAAM,GAA+B,IAAI,CAAC;IAC1C,YAAY,GAAW,CAAC,CAAC;IAChB,cAAc,GAAG,QAAQ,CAAC,CAAC,iBAAiB;IAE7D,YAAY,OAAyB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1D,KAAK,CAAC,YAAY;QACd,MAAM,QAAQ,GAAG,eAAe,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAY,QAAQ,CAAC,CAAC;QAClD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAS,GAAG,WAAW,CAAC,QAAQ,oBAAoB,EAAE,EAAE,YAAY,EAAE,MAAe,EAAE,CAAC,CAAC;YAExH,wCAAwC;YACxC,uIAAuI;YACvI,MAAM,OAAO,GAAG,6IAA6I,CAAC;YAE9J,MAAM,SAAS,GAAc,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEhD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE5B,+CAA+C;gBAC/C,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACzD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC3B,IAAI,MAAM,EAAE,CAAC;4BACT,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC/C,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3D,CAAC;YACL,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;YACrD,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,QAAQ,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACtB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC7B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE/B,cAAc;QACd,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC3C,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAS,GAAG,WAAW,CAAC,QAAQ,oBAAoB,EAAE,EAAE,YAAY,EAAE,MAAe,EAAE,CAAC,CAAC;YAExH,2DAA2D;YAC3D,MAAM,OAAO,GAAG,wEAAwE,CAAC;YACzF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEhD,2CAA2C;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACxB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAE1B,yDAAyD;gBACzD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChC,IAAI,WAAW,EAAE,CAAC;wBACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBACtC,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;YAChC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,QAAgB,EAAE;QACnD,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnE,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;QAED,6BAA6B;QAC7B,MAAM,OAAO,GAAG,GAAG,WAAW,CAAC,cAAc,WAAW,SAAS,EAAE,CAAC;QAEpE,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAS,OAAO,EAAE,EAAE,YAAY,EAAE,MAAe,EAAE,CAAC,CAAC;YAEpF,+CAA+C;YAC/C,+FAA+F;YAC/F,MAAM,OAAO,GAAG,sFAAsF,CAAC;YACvG,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAE5D,MAAM,WAAW,GAAiB,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEvB,WAAW,CAAC,IAAI,CAAC;oBACb,IAAI;oBACJ,KAAK;oBACL,eAAe,EAAE,GAAG;oBACpB,GAAG,EAAE,sCAAsC,GAAG,EAAE;iBACnD,CAAC,CAAC;YACP,CAAC;YAED,OAAO,WAAW,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC,mCAAmC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc;QAC5B,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnE,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;QAED,mDAAmD;QACnD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhG,0CAA0C;QAC1C,MAAM,OAAO,GAAG;YACZ,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE,kBAAkB;YAClC,QAAQ,EAAE,oBAAoB;YAC9B,SAAS,EAAE,+CAA+C;SAC7D,CAAC;QAEF,MAAM,OAAO,GAAG;YACZ,SAAS;YACT,OAAO;YACP,WAAW,EAAE,CAAC,KAAK,CAAC;YACpB,gBAAgB,EAAE,CAAC,SAAS,CAAC;YAC7B,eAAe,EAAE,EAAE;YACnB,QAAQ,EAAE,EAAE;YACZ,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE;SACf,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAQ,WAAW,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAoB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC;oBACR,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;oBAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;oBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;oBAC3B,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;oBAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;iBACxB,CAAC,CAAC;YACP,CAAC;YAED,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAAC,gCAAgC,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAClC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnE,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;QAED,0BAA0B;QAC1B,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,gBAAgB,IAAI,SAAS,EAAE,CAAC;QAE3D,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAS,GAAG,EAAE,EAAE,YAAY,EAAE,MAAe,EAAE,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE3B,MAAM,MAAM,GAAmB,EAAE,CAAC;YAElC,kEAAkE;YAClE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACpF,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,CAAC;YAED,iEAAiE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACnF,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,CAAC;YAED,iDAAiD;YACjD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC7E,IAAI,YAAY,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,CAAC;YAED,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;;AAKL,MAAM,OAAO,YAAa,SAAQ,YAAY;IAClC,MAAM,CAAU,QAAQ,GAAG,mEAAmE,CAAC;IACvG,YAAY,OAAyB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE1D,KAAK,CAAC,UAAU,CAAC,WAAiE,KAAK;QACnF,MAAM,QAAQ,GAAG,gBAAgB,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAiB,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAS,YAAY,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAe,EAAE,CAAC,CAAC;YAClG,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,SAAS,GAAmB,EAAE,CAAC;YACrC,CAAC,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;gBAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO;gBAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,GAAG,GAAG,OAAO,CAAC;gBAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,GAAG,GAAG,OAAO,CAAC;qBAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,GAAG,GAAG,UAAU,CAAC;qBACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,GAAG,GAAG,WAAW,CAAC;gBACzE,IAAI,QAAQ,KAAK,KAAK,IAAI,GAAG,KAAK,QAAQ;oBAAE,OAAO;gBACnD,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChH,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7O,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,QAAQ,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAsC,KAAK;QACxD,MAAM,QAAQ,GAAG,gBAAgB,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAiB,QAAQ,CAAC,CAAC;QACvD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAS,YAAY,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAe,EAAE,CAAC,CAAC;YAClG,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,SAAS,GAAmB,EAAE,CAAC;YACrC,CAAC,CAAC,6BAA6B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;gBAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO;gBAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,GAAG,GAAG,OAAO,CAAC;gBAClB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,GAAG,GAAG,OAAO,CAAC;gBACjE,IAAI,QAAQ,KAAK,KAAK,IAAI,GAAG,KAAK,QAAQ;oBAAE,OAAO;gBACnD,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChH,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7O,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,QAAQ,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;IAChF,CAAC;;AAGL,IAAI,WAAW,GAAuB,IAAI,CAAC;AAC3C,MAAM,UAAU,cAAc,KAAkB,IAAI,CAAC,WAAW;IAAE,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;AACxH,IAAI,YAAY,GAAwB,IAAI,CAAC;AAC7C,MAAM,UAAU,eAAe,KAAmB,IAAI,CAAC,YAAY;IAAE,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "borsajs",
|
|
3
|
-
"version": "0.1.
|
|
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",
|
package/src/providers/kap.ts
CHANGED
|
@@ -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 {
|
|
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-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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!');
|