turkiyem 1.5.0 → 1.6.0

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.md CHANGED
@@ -1,17 +1,59 @@
1
1
  # turkiyem
2
2
 
3
- Turkiye Toplu Tasima ve Deprem CLI araci.
4
-
5
- AFAD deprem verileri, EGO (Ankara) otobus saatleri ve IETT (Istanbul) hat/saat bilgilerini terminalden sorgulayabilirsiniz.
6
- Open-Meteo ile API key gerektirmeden guncel hava, saatlik tahmin ve hava kalitesi sorgulayabilirsiniz.
3
+ Türkiye için modern, terminal tabanlı bir **toplu taşıma + deprem + hava durumu** CLI aracı.
4
+
5
+ `turkiyem`; AFAD deprem verileri, EGO (Ankara) hat saatleri, IETT (İstanbul) hat bilgileri / planlanan sefer saatleri / canlı konum akışları ve Open-Meteo hava verilerini tek komutta toplar.
6
+
7
+ ## İçindekiler
8
+
9
+ - [Özellikler](#özellikler)
10
+ - [Kurulum](#kurulum)
11
+ - [Hızlı Başlangıç](#hızlı-başlangıç)
12
+ - [Komut Referansı](#komut-referansı)
13
+ - [Veri Kaynakları](#veri-kaynakları)
14
+ - [Mimari ve Proje Yapısı](#mimari-ve-proje-yapısı)
15
+ - [Yapılandırma ve Cache](#yapılandırma-ve-cache)
16
+ - [Hata Yönetimi](#hata-yönetimi)
17
+ - [Geliştirme](#geliştirme)
18
+ - [Yayınlama (npm)](#yayınlama-npm)
19
+ - [Sık Karşılaşılan Sorunlar](#sık-karşılaşılan-sorunlar)
20
+ - [Lisans](#lisans)
21
+
22
+ ## Özellikler
23
+
24
+ - **Deprem (AFAD):**
25
+ - Son 24 saat / son 7 gün deprem listesi
26
+ - Büyüklüğe göre filtreleme
27
+ - `>= 4.0` depremler için renkli vurgu
28
+ - **Toplu taşıma (Ankara / EGO):**
29
+ - Hat bilgileri
30
+ - Gün tipine göre sefer saatleri (Hafta içi / Cumartesi / Pazar)
31
+ - **Toplu taşıma (İstanbul / IETT):**
32
+ - GTFS tabanlı hat özeti
33
+ - SOAP tabanlı planlanan sefer saatleri
34
+ - SOAP başarısız olduğunda GTFS özete otomatik fallback
35
+ - `hat canli` ile canlı araç konumu (servis erişimine bağlı)
36
+ - **Hava durumu (Open-Meteo):**
37
+ - API key gerektirmeden güncel hava
38
+ - Saatlik tahmin (1-7 gün)
39
+ - Hava kalitesi (PM10, PM2.5, CO, NO2)
40
+ - **Ekonomi:**
41
+ - TCMB güncel döviz kurları listesi
42
+ - **CLI UX:**
43
+ - Komut bazlı spinner
44
+ - Tablo tabanlı okunabilir terminal çıktısı
45
+ - Global şehir ayarı (`~/.turkiyem/config.json`)
46
+ - Bellek içi cache ile performans optimizasyonu
7
47
 
8
48
  ## Kurulum
9
49
 
50
+ ### Global (önerilen)
51
+
10
52
  ```bash
11
53
  npm install -g turkiyem
12
54
  ```
13
55
 
14
- Veya yerel olarak:
56
+ ### Yerel geliştirme
15
57
 
16
58
  ```bash
17
59
  git clone <repo-url>
@@ -20,156 +62,197 @@ npm install
20
62
  npm link
21
63
  ```
22
64
 
23
- ## Gereksinimler
65
+ ### Gereksinim
66
+
67
+ - Node.js `20+`
24
68
 
25
- - Node.js 20+
69
+ ## Hızlı Başlangıç
70
+
71
+ ```bash
72
+ turkiyem
73
+ turkiyem sehir istanbul
74
+ turkiyem hat 34AS
75
+ turkiyem deprem son24
76
+ turkiyem hava guncel
77
+ turkiyem doviz
78
+ ```
26
79
 
27
- ## Kullanim
80
+ ## Komut Referansı
28
81
 
29
- ### Banner ve Yardim
82
+ ### Genel
30
83
 
31
84
  ```bash
32
85
  turkiyem
33
86
  turkiyem help
87
+ turkiyem --version
88
+ turkiyem temizle
34
89
  ```
35
90
 
36
- ### Sehir Secimi
37
-
38
- Hat sorgulama icin once sehir secmelisiniz:
91
+ ### Şehir seçimi
39
92
 
40
93
  ```bash
41
94
  turkiyem sehir ankara
42
95
  turkiyem sehir istanbul
43
96
  ```
44
97
 
45
- ### Hat Sorgulama
98
+ > `hat` komutları seçili şehre göre çalışır.
46
99
 
47
- Secili sehre gore hat bilgilerini sorgular:
100
+ ### Hat sorgulama
48
101
 
49
102
  ```bash
50
103
  # Ankara (EGO)
51
104
  turkiyem sehir ankara
52
105
  turkiyem hat 340
53
106
 
54
- # Istanbul (IETT)
107
+ # İstanbul (IETT)
55
108
  turkiyem sehir istanbul
56
109
  turkiyem hat 34AS
110
+ ```
57
111
 
58
- # IETT canli arac konumu (ozet)
112
+ İstanbul akışı:
113
+ - 1) GTFS hat özeti
114
+ - 2) SOAP planlanan sefer saatleri
115
+ - 3) SOAP erişilemezse GTFS özeti + bilgilendirme mesajı
116
+
117
+ ### IETT canlı konum
118
+
119
+ ```bash
120
+ # Özet çıktı
59
121
  turkiyem hat canli 34AS
60
122
 
61
- # IETT canli arac konumu (detay)
123
+ # Detay çıktı
62
124
  turkiyem hat canli 34AS --detay
63
125
  ```
64
126
 
65
- Ankara icin EGO web sitesinden sefer saatleri cekilir.
66
- Istanbul icin once IETT SOAP Planlanan Sefer Saati servisi ile kalkis saatleri getirilir.
67
- SOAP servisi gecici olarak erisilemezse otomatik olarak GTFS ozet verisine dusulur.
127
+ > Not: Canlı konum sadece `istanbul` şehir seçiliyken anlamlıdır ve servis erişimine bağlıdır.
68
128
 
69
- Istanbul cikti sirasi:
70
- - Hat bilgileri (GTFS)
71
- - Planlanan sefer saatleri (SOAP)
72
- - SOAP hatasinda: yalnizca GTFS ozet + uyari
73
-
74
- Canli konum ozelligi:
75
- - `turkiyem hat canli <numara>` varsayilan olarak ozet verir
76
- - `--detay` ile arac bazli konum tablosu acilir
77
- - Sadece `istanbul` seciliyken kullanilir
78
-
79
- ### Deprem Sorgulama
80
-
81
- AFAD API uzerinden gercek zamanli deprem verileri:
129
+ ### Deprem (AFAD)
82
130
 
83
131
  ```bash
84
- # Son 24 saat
85
132
  turkiyem deprem son24
86
-
87
- # Son 7 gun
88
133
  turkiyem deprem 7gun
89
-
90
- # Buyukluge gore filtrele (ornegin >= 4.0)
91
134
  turkiyem deprem buyukluk 4.0
92
135
  ```
93
136
 
94
- Buyuklugu 4.0 ve ustu olan depremler kirmizi ile vurgulanir.
95
-
96
- ### Hava Durumu ve Hava Kalitesi
97
-
98
- Open-Meteo uzerinden API key gerektirmeden sorgu yapar:
137
+ ### Hava durumu ve hava kalitesi (Open-Meteo)
99
138
 
100
139
  ```bash
101
- # Secili sehir icin guncel hava
140
+ # Seçili şehir
102
141
  turkiyem hava guncel
103
142
 
104
- # Sehir bazli guncel hava
143
+ # Şehir adıyla
105
144
  turkiyem hava guncel istanbul
145
+ turkiyem hava saatlik ankara --gun 3
146
+ turkiyem hava kalite izmir
106
147
 
107
- # Koordinat bazli guncel hava
148
+ # Koordinatla
108
149
  turkiyem hava guncel 41.0082,28.9784
150
+ ```
109
151
 
110
- # Saatlik tahmin (varsayilan 2 gun)
111
- turkiyem hava saatlik istanbul
152
+ ### Ekonomi (TCMB)
112
153
 
113
- # Saatlik tahmin gun sayisi (1-7)
114
- turkiyem hava saatlik istanbul --gun 3
154
+ ```bash
155
+ # Sık kullanılan kurlar (USD, EUR vb.)
156
+ turkiyem doviz
115
157
 
116
- # Hava kalitesi
117
- turkiyem hava kalite ankara
158
+ # Tüm kurlar listesi
159
+ turkiyem doviz --tum
118
160
  ```
119
161
 
120
- ### Temizleme
121
-
122
- Cache ve yapilandirmayi sifirlar:
123
-
124
- ```bash
125
- turkiyem temizle
162
+ ## Veri Kaynakları
163
+
164
+ | Kaynak | Kullanım |
165
+ |---|---|
166
+ | AFAD | Deprem verileri |
167
+ | EGO | Ankara hat/sefer saatleri |
168
+ | IETT GTFS | İstanbul hat özeti |
169
+ | IETT SOAP (PlanlananSeferSaati) | İstanbul planlanan sefer saatleri |
170
+ | IETT SOAP (SeferGerceklesme) | İstanbul canlı araç konumu |
171
+ | Open-Meteo Forecast | Güncel hava + saatlik tahmin |
172
+ | Open-Meteo Air Quality | Hava kalitesi |
173
+ | TCMB | Döviz kurları |
174
+
175
+ ## Mimari ve Proje Yapısı
176
+
177
+ ```text
178
+ src/
179
+ commands/ # CLI komut handler'ları
180
+ services/ # Dış API / scraping / SOAP katmanı
181
+ utils/ # Tablo, cache, config, banner yardımcıları
182
+ index.js # Commander giriş noktası
126
183
  ```
127
184
 
128
- ### Versiyon
185
+ Mimari prensipleri:
186
+ - Komut katmanı ile servis katmanı ayrımı
187
+ - API bağımlılıklarının servis içinde izole edilmesi
188
+ - Tekrarlanan işlerin util katmanına alınması
189
+ - Tüm dış isteklerde timeout + anlamlı hata mesajı
129
190
 
130
- ```bash
131
- turkiyem --version
132
- ```
191
+ ## Yapılandırma ve Cache
133
192
 
134
- ## Yapilandirma
193
+ - Seçili şehir dosyası:
194
+ - `~/.turkiyem/config.json`
195
+ - Varsayılan cache:
196
+ - Bellek içi (`node-cache`)
197
+ - Kaynak bazlı TTL (ör. IETT SOAP, hava durumu vb.)
135
198
 
136
- Secili sehir `~/.turkiyem/config.json` dosyasinda saklanir. Bu dosya otomatik olusturulur.
199
+ Temizleme:
137
200
 
138
- ## Veri Kaynaklari
201
+ ```bash
202
+ turkiyem temizle
203
+ ```
139
204
 
140
- | Kaynak | Aciklama |
141
- |--------|----------|
142
- | AFAD | Deprem verileri (deprem.afad.gov.tr) |
143
- | EGO | Ankara otobus sefer saatleri (ego.gov.tr) |
144
- | IETT | Istanbul GTFS hat verileri (data.ibb.gov.tr) |
145
- | IETT SOAP | Planlanan sefer saatleri (api.ibb.gov.tr) |
146
- | IETT Live SOAP | Hat bazli canli arac konumu (api.ibb.gov.tr) |
147
- | Open-Meteo | Guncel hava ve saatlik tahmin (api.open-meteo.com) |
148
- | Open-Meteo AQ | Hava kalitesi (air-quality-api.open-meteo.com) |
205
+ ## Hata Yönetimi
149
206
 
150
- ## npm Publish
207
+ Projede:
208
+ - `unhandledRejection` ve `uncaughtException` yakalanır
209
+ - API hataları kullanıcı dostu mesajlara çevrilir
210
+ - Ağ timeout / bağlantı sorunları için özel açıklamalar verilir
211
+ - Erişilemeyen kaynaklarda mümkün olan yerlerde fallback uygulanır
151
212
 
152
- 1. npm hesabiniza giris yapin:
213
+ ## Geliştirme
153
214
 
154
215
  ```bash
155
- npm login
216
+ npm install
217
+ npm start
156
218
  ```
157
219
 
158
- 2. package.json icindeki `name`, `version`, `author` alanlarini duzenleyin.
159
-
160
- 3. Yayinlayin:
220
+ Örnek geliştirme doğrulama komutları:
161
221
 
162
222
  ```bash
163
- npm publish
223
+ node src/index.js help
224
+ node src/index.js deprem son24
225
+ node src/index.js hava guncel istanbul
226
+ node src/index.js hat 34AS
164
227
  ```
165
228
 
166
- 4. Guncelleme icin versiyonu artirin:
229
+ ## Yayınlama (npm)
167
230
 
168
231
  ```bash
232
+ # 1) sürüm artır
169
233
  npm version patch
170
- npm publish
234
+
235
+ # 2) publish
236
+ npm publish --access public
237
+
238
+ # 3) kontrol
239
+ npm view turkiyem version
171
240
  ```
172
241
 
242
+ ## Sık Karşılaşılan Sorunlar
243
+
244
+ ### `npm publish` 403 (aynı sürüm)
245
+ Önceden yayınlanmış bir sürüm numarasını tekrar gönderemezsiniz.
246
+ Çözüm: `npm version patch|minor|major` sonrası tekrar publish.
247
+
248
+ ### `npm publish` 403 (2FA / token)
249
+ NPM hesabınız için 2FA veya granular token gereksinimi olabilir.
250
+ Çözüm: NPM hesabında token/2FA ayarlarını tamamlayın.
251
+
252
+ ### IETT canlı konum 500
253
+ SOAP servis tarafı geçici olarak hata döndürebilir.
254
+ Bu durumda kısa süre sonra tekrar deneyin.
255
+
173
256
  ## Lisans
174
257
 
175
258
  MIT
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "turkiyem",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Türkiye Toplu Taşıma ve Deprem CLI aracı - AFAD deprem verileri, EGO hat saatleri ve IETT SOAP/GTFS bilgileri",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
7
7
  "bin": {
8
- "turkiyem": "./src/index.js"
8
+ "turkiyem": "src/index.js"
9
9
  },
10
10
  "scripts": {
11
11
  "start": "node src/index.js",
@@ -0,0 +1,26 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { fetchExchangeRates } from '../services/tcmbService.js';
4
+ import { createDovizTable } from '../utils/display.js';
5
+
6
+ export async function dovizKurlari(options) {
7
+ const spinner = ora('TCMB döviz kurları alınıyor...').start();
8
+
9
+ try {
10
+ const result = await fetchExchangeRates();
11
+ spinner.succeed(`TCMB kurları alındı (Tarih: ${result.date || '-'})`);
12
+
13
+ const popular = ['USD', 'EUR', 'GBP', 'CHF', 'JPY', 'CAD', 'AUD', 'DKK', 'SEK', 'NOK'];
14
+ const kurlar = options.tum ? result.currencies : result.currencies.filter(c => popular.includes(c.kodu));
15
+
16
+ console.log('');
17
+ console.log(createDovizTable({ ...result, currencies: kurlar }));
18
+
19
+ if (!options.tum) {
20
+ console.log('');
21
+ console.log(chalk.gray(' Tüm kurları görmek için: turkiyem doviz --tum'));
22
+ }
23
+ } catch (err) {
24
+ spinner.fail(chalk.red(err.message));
25
+ }
26
+ }
package/src/index.js CHANGED
@@ -9,6 +9,7 @@ import { hatCanliSorgula, hatSorgula } from './commands/hat.js';
9
9
  import { depremSon24, deprem7Gun, depremBuyukluk } from './commands/deprem.js';
10
10
  import { havaGuncel, havaKalitesi, havaSaatlik } from './commands/hava.js';
11
11
  import { temizle } from './commands/temizle.js';
12
+ import { dovizKurlari } from './commands/doviz.js';
12
13
 
13
14
  const require = createRequire(import.meta.url);
14
15
  const pkg = require('../package.json');
@@ -113,6 +114,14 @@ program
113
114
  temizle();
114
115
  });
115
116
 
117
+ program
118
+ .command('doviz')
119
+ .description('TCMB güncel döviz kurlarını sorgula')
120
+ .option('--tum', 'Tüm kurları göster')
121
+ .action(async (options) => {
122
+ await dovizKurlari(options);
123
+ });
124
+
116
125
  program
117
126
  .command('help')
118
127
  .description('Yardım göster')
@@ -0,0 +1,47 @@
1
+ import axios from 'axios';
2
+ import * as cheerio from 'cheerio';
3
+ import { getCached, setCached } from '../utils/cache.js';
4
+
5
+ const CACHE_KEY = 'tcmb_kur';
6
+ const CACHE_TTL = 3600; // 1 saat
7
+ const URL = 'https://www.tcmb.gov.tr/kurlar/today.xml';
8
+
9
+ export async function fetchExchangeRates() {
10
+ const cached = getCached(CACHE_KEY);
11
+ if (cached) return cached;
12
+
13
+ try {
14
+ const response = await axios.get(URL, { timeout: 10000 });
15
+ const $ = cheerio.load(response.data, { xmlMode: true });
16
+
17
+ const date = $('Tarih_Date').attr('Tarih');
18
+ const bultenNo = $('Tarih_Date').attr('Bulten_No');
19
+
20
+ const currencies = [];
21
+
22
+ $('Currency').each((_, el) => {
23
+ const isim = $(el).find('Isim').text().trim();
24
+ const code = $(el).attr('CurrencyCode');
25
+ const alis = $(el).find('ForexBuying').text().trim();
26
+ const satis = $(el).find('ForexSelling').text().trim();
27
+
28
+ if (isim && code) {
29
+ currencies.push({
30
+ isim,
31
+ kodu: code,
32
+ alis,
33
+ satis
34
+ });
35
+ }
36
+ });
37
+
38
+ const result = { date, bultenNo, currencies };
39
+ setCached(CACHE_KEY, result, CACHE_TTL);
40
+ return result;
41
+ } catch (error) {
42
+ if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
43
+ throw new Error('TCMB servisine erişilemedi (Zaman aşımı).');
44
+ }
45
+ throw new Error(`TCMB veri hatası: ${error.message}`);
46
+ }
47
+ }
@@ -29,6 +29,7 @@ export function printHelp() {
29
29
  console.log(chalk.cyan(' turkiyem deprem son24') + chalk.gray(' Son 24 saat depremler'));
30
30
  console.log(chalk.cyan(' turkiyem deprem 7gun') + chalk.gray(' Son 7 gün depremler'));
31
31
  console.log(chalk.cyan(' turkiyem deprem buyukluk <deger>') + chalk.gray(' Büyüklüğe göre filtrele'));
32
+ console.log(chalk.cyan(' turkiyem doviz [--tum]') + chalk.gray(' TCMB Döviz kurları'));
32
33
  console.log(chalk.cyan(' turkiyem temizle') + chalk.gray(' Cache ve config temizle'));
33
34
  console.log(chalk.cyan(' turkiyem --version') + chalk.gray(' Versiyon göster'));
34
35
  console.log('');
@@ -247,3 +247,28 @@ export function createIettLiveDetailTable(liveData) {
247
247
 
248
248
  return table.toString();
249
249
  }
250
+
251
+ export function createDovizTable(result) {
252
+ const table = new Table({
253
+ head: [
254
+ chalk.white.bold('Kod'),
255
+ chalk.white.bold('Döviz Cinsi'),
256
+ chalk.white.bold('Alış (TL)'),
257
+ chalk.white.bold('Satış (TL)'),
258
+ ],
259
+ colWidths: [8, 30, 15, 15],
260
+ style: { head: [], border: ['gray'] },
261
+ });
262
+
263
+ for (const c of result.currencies) {
264
+ if (!c.alis && !c.satis) continue;
265
+ table.push([
266
+ chalk.cyan(c.kodu),
267
+ c.isim,
268
+ c.alis || '-',
269
+ c.satis || '-'
270
+ ]);
271
+ }
272
+
273
+ return table.toString();
274
+ }