turkiyemonitor 1.1.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/LICENSE +21 -0
- package/README.md +54 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +58 -0
- package/dist/cli.js.map +1 -0
- package/dist/collectors/crypto.d.ts +3 -0
- package/dist/collectors/crypto.js +37 -0
- package/dist/collectors/crypto.js.map +1 -0
- package/dist/collectors/earthquakes.d.ts +3 -0
- package/dist/collectors/earthquakes.js +53 -0
- package/dist/collectors/earthquakes.js.map +1 -0
- package/dist/collectors/economic-news.d.ts +3 -0
- package/dist/collectors/economic-news.js +49 -0
- package/dist/collectors/economic-news.js.map +1 -0
- package/dist/collectors/eksi-sozluk.d.ts +3 -0
- package/dist/collectors/eksi-sozluk.js +38 -0
- package/dist/collectors/eksi-sozluk.js.map +1 -0
- package/dist/collectors/exchange-rates.d.ts +3 -0
- package/dist/collectors/exchange-rates.js +36 -0
- package/dist/collectors/exchange-rates.js.map +1 -0
- package/dist/collectors/fuel-prices.d.ts +3 -0
- package/dist/collectors/fuel-prices.js +70 -0
- package/dist/collectors/fuel-prices.js.map +1 -0
- package/dist/collectors/magnificent-seven-stocks.d.ts +3 -0
- package/dist/collectors/magnificent-seven-stocks.js +40 -0
- package/dist/collectors/magnificent-seven-stocks.js.map +1 -0
- package/dist/collectors/politics.d.ts +3 -0
- package/dist/collectors/politics.js +35 -0
- package/dist/collectors/politics.js.map +1 -0
- package/dist/collectors/stocks.d.ts +3 -0
- package/dist/collectors/stocks.js +76 -0
- package/dist/collectors/stocks.js.map +1 -0
- package/dist/collectors/tuik-stats.d.ts +3 -0
- package/dist/collectors/tuik-stats.js +36 -0
- package/dist/collectors/tuik-stats.js.map +1 -0
- package/dist/collectors/twitter-trends.d.ts +3 -0
- package/dist/collectors/twitter-trends.js +25 -0
- package/dist/collectors/twitter-trends.js.map +1 -0
- package/dist/collectors/weather.d.ts +3 -0
- package/dist/collectors/weather.js +67 -0
- package/dist/collectors/weather.js.map +1 -0
- package/dist/collectors/youtube-trends.d.ts +3 -0
- package/dist/collectors/youtube-trends.js +40 -0
- package/dist/collectors/youtube-trends.js.map +1 -0
- package/dist/core/formatter.d.ts +3 -0
- package/dist/core/formatter.js +315 -0
- package/dist/core/formatter.js.map +1 -0
- package/dist/core/i18n.d.ts +3 -0
- package/dist/core/i18n.js +100 -0
- package/dist/core/i18n.js.map +1 -0
- package/dist/core/runner.d.ts +4 -0
- package/dist/core/runner.js +90 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/domain/agenda-result.d.ts +24 -0
- package/dist/domain/agenda-result.js +59 -0
- package/dist/domain/agenda-result.js.map +1 -0
- package/dist/domain/types.d.ts +94 -0
- package/dist/domain/types.js +3 -0
- package/dist/domain/types.js.map +1 -0
- package/dist/services/browser.d.ts +7 -0
- package/dist/services/browser.js +64 -0
- package/dist/services/browser.js.map +1 -0
- package/dist/services/http-client.d.ts +2 -0
- package/dist/services/http-client.js +20 -0
- package/dist/services/http-client.js.map +1 -0
- package/package.json +66 -0
- package/screenshot.png +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Stores the localized strings used by TurkiyeMonitor terminal output.
|
|
2
|
+
const translations = {
|
|
3
|
+
tr: {
|
|
4
|
+
appTitle: '🇹🇷 Türkiye Durum Özeti',
|
|
5
|
+
fetchingModule: 'Veriler alınıyor',
|
|
6
|
+
moduleComplete: 'tamamlandı',
|
|
7
|
+
moduleFailed: 'hata oluştu',
|
|
8
|
+
remaining: 'kalan',
|
|
9
|
+
errorOccurred: 'Bu bölümde veri alınamadı',
|
|
10
|
+
sections: {
|
|
11
|
+
exchangeRates: '💱 Döviz Kurları',
|
|
12
|
+
stocks: '📈 Dünya Piyasaları',
|
|
13
|
+
crypto: '🪙 Kripto Varlıklar',
|
|
14
|
+
fuelPrices: '⛽ Yakıt Fiyatları',
|
|
15
|
+
tuikStats: '📊 TÜİK Göstergeleri',
|
|
16
|
+
economicNews: '📰 Ekonomi Haberleri',
|
|
17
|
+
twitterTrends: '🐦 Twitter Trendleri',
|
|
18
|
+
politics: '🏛️ Siyaset Haberleri',
|
|
19
|
+
eksiSozluk: '💬 Ekşi Sözlük Gündem',
|
|
20
|
+
earthquakes: '🌍 Son Depremler (4+)',
|
|
21
|
+
youtubeTrends: '🎥 YouTube Trendleri',
|
|
22
|
+
weather: '🌦️ Hava Durumu',
|
|
23
|
+
magnificentSevenStocks: '🏆 Muhteşem 7',
|
|
24
|
+
},
|
|
25
|
+
noData: 'Veri bulunamadı',
|
|
26
|
+
fuelNote: '📍 Istanbul Avrupa',
|
|
27
|
+
tuikCpi: 'Tüketici Fiyat Endeksi Yıllık (%)',
|
|
28
|
+
tuikUnemployment: 'İşsizlik Oranı (%)',
|
|
29
|
+
tuikCpiLabel: 'TÜFE',
|
|
30
|
+
tuikUnemploymentLabel: 'İşsizlik',
|
|
31
|
+
tuikGdpLabel: 'GSYH Büyüme',
|
|
32
|
+
tuikConsumerConfidenceLabel: 'Tük. Güven',
|
|
33
|
+
months: {
|
|
34
|
+
1: 'Ocak',
|
|
35
|
+
2: 'Şubat',
|
|
36
|
+
3: 'Mart',
|
|
37
|
+
4: 'Nisan',
|
|
38
|
+
5: 'Mayıs',
|
|
39
|
+
6: 'Haziran',
|
|
40
|
+
7: 'Temmuz',
|
|
41
|
+
8: 'Ağustos',
|
|
42
|
+
9: 'Eylül',
|
|
43
|
+
10: 'Ekim',
|
|
44
|
+
11: 'Kasım',
|
|
45
|
+
12: 'Aralık',
|
|
46
|
+
},
|
|
47
|
+
generatedAt: 'Oluşturulma zamanı',
|
|
48
|
+
},
|
|
49
|
+
en: {
|
|
50
|
+
appTitle: '🇹🇷 Turkiye Monitor Snapshot',
|
|
51
|
+
fetchingModule: 'Fetching data',
|
|
52
|
+
moduleComplete: 'completed',
|
|
53
|
+
moduleFailed: 'failed',
|
|
54
|
+
remaining: 'remaining',
|
|
55
|
+
errorOccurred: 'Failed to fetch data for this section',
|
|
56
|
+
sections: {
|
|
57
|
+
exchangeRates: '💱 Exchange Rates',
|
|
58
|
+
stocks: '📈 World Markets',
|
|
59
|
+
crypto: '🪙 Crypto Assets',
|
|
60
|
+
fuelPrices: '⛽ Fuel Prices',
|
|
61
|
+
tuikStats: '📊 TUIK Indicators',
|
|
62
|
+
economicNews: '📰 Economic News',
|
|
63
|
+
twitterTrends: '🐦 Twitter Trends',
|
|
64
|
+
politics: '🏛️ Politics News',
|
|
65
|
+
eksiSozluk: '💬 Eksi Sozluk Agenda',
|
|
66
|
+
earthquakes: '🌍 Recent Earthquakes (4+)',
|
|
67
|
+
youtubeTrends: '🎥 YouTube Trends',
|
|
68
|
+
weather: '🌦️ Weather',
|
|
69
|
+
magnificentSevenStocks: '🏆 Magnificent Seven',
|
|
70
|
+
},
|
|
71
|
+
noData: 'No data found',
|
|
72
|
+
fuelNote: '📍 Istanbul Europe',
|
|
73
|
+
tuikCpi: 'CPI Annual (%)',
|
|
74
|
+
tuikUnemployment: 'Unemployment Rate (%)',
|
|
75
|
+
tuikCpiLabel: 'CPI',
|
|
76
|
+
tuikUnemploymentLabel: 'Unemployment',
|
|
77
|
+
tuikGdpLabel: 'GDP Growth',
|
|
78
|
+
tuikConsumerConfidenceLabel: 'Cons. Conf.',
|
|
79
|
+
months: {
|
|
80
|
+
1: 'January',
|
|
81
|
+
2: 'February',
|
|
82
|
+
3: 'March',
|
|
83
|
+
4: 'April',
|
|
84
|
+
5: 'May',
|
|
85
|
+
6: 'June',
|
|
86
|
+
7: 'July',
|
|
87
|
+
8: 'August',
|
|
88
|
+
9: 'September',
|
|
89
|
+
10: 'October',
|
|
90
|
+
11: 'November',
|
|
91
|
+
12: 'December',
|
|
92
|
+
},
|
|
93
|
+
generatedAt: 'Generated at',
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
/** Returns translations for a supported language with English as the fallback. */
|
|
97
|
+
export function getTranslations(language) {
|
|
98
|
+
return translations[language] ?? translations.en;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=i18n.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/core/i18n.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAIvE,MAAM,YAAY,GAAwC;IACxD,EAAE,EAAE;QACF,QAAQ,EAAE,0BAA0B;QACpC,cAAc,EAAE,kBAAkB;QAClC,cAAc,EAAE,YAAY;QAC5B,YAAY,EAAE,aAAa;QAC3B,SAAS,EAAE,OAAO;QAClB,aAAa,EAAE,2BAA2B;QAC1C,QAAQ,EAAE;YACR,aAAa,EAAE,kBAAkB;YACjC,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,qBAAqB;YAC7B,UAAU,EAAE,mBAAmB;YAC/B,SAAS,EAAE,sBAAsB;YACjC,YAAY,EAAE,sBAAsB;YACpC,aAAa,EAAE,sBAAsB;YACrC,QAAQ,EAAE,uBAAuB;YACjC,UAAU,EAAE,uBAAuB;YACnC,WAAW,EAAE,uBAAuB;YACpC,aAAa,EAAE,sBAAsB;YACrC,OAAO,EAAE,iBAAiB;YAC1B,sBAAsB,EAAE,eAAe;SACxC;QACD,MAAM,EAAE,iBAAiB;QACzB,QAAQ,EAAE,oBAAoB;QAC9B,OAAO,EAAE,mCAAmC;QAC5C,gBAAgB,EAAE,oBAAoB;QACtC,YAAY,EAAE,MAAM;QACpB,qBAAqB,EAAE,UAAU;QACjC,YAAY,EAAE,aAAa;QAC3B,2BAA2B,EAAE,YAAY;QACzC,MAAM,EAAE;YACN,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,OAAO;YACV,EAAE,EAAE,MAAM;YACV,EAAE,EAAE,OAAO;YACX,EAAE,EAAE,QAAQ;SACb;QACD,WAAW,EAAE,oBAAoB;KAClC;IACD,EAAE,EAAE;QACF,QAAQ,EAAE,+BAA+B;QACzC,cAAc,EAAE,eAAe;QAC/B,cAAc,EAAE,WAAW;QAC3B,YAAY,EAAE,QAAQ;QACtB,SAAS,EAAE,WAAW;QACtB,aAAa,EAAE,uCAAuC;QACtD,QAAQ,EAAE;YACR,aAAa,EAAE,mBAAmB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,eAAe;YAC3B,SAAS,EAAE,oBAAoB;YAC/B,YAAY,EAAE,kBAAkB;YAChC,aAAa,EAAE,mBAAmB;YAClC,QAAQ,EAAE,mBAAmB;YAC7B,UAAU,EAAE,uBAAuB;YACnC,WAAW,EAAE,4BAA4B;YACzC,aAAa,EAAE,mBAAmB;YAClC,OAAO,EAAE,aAAa;YACtB,sBAAsB,EAAE,sBAAsB;SAC/C;QACD,MAAM,EAAE,eAAe;QACvB,QAAQ,EAAE,oBAAoB;QAC9B,OAAO,EAAE,gBAAgB;QACzB,gBAAgB,EAAE,uBAAuB;QACzC,YAAY,EAAE,KAAK;QACnB,qBAAqB,EAAE,cAAc;QACrC,YAAY,EAAE,YAAY;QAC1B,2BAA2B,EAAE,aAAa;QAC1C,MAAM,EAAE;YACN,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,UAAU;YACb,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,KAAK;YACR,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,WAAW;YACd,EAAE,EAAE,SAAS;YACb,EAAE,EAAE,UAAU;YACd,EAAE,EAAE,UAAU;SACf;QACD,WAAW,EAAE,cAAc;KAC5B;CACF,CAAC;AAEF,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { AgendaResult } from '../domain/agenda-result.js';
|
|
2
|
+
import type { Language } from '../domain/types.js';
|
|
3
|
+
/** Runs every agenda collector and returns a normalized agenda snapshot. */
|
|
4
|
+
export declare function runAgendaCollectors(language: Language): Promise<AgendaResult>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Coordinates all agenda collectors and returns a single normalized result.
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import cliProgress from 'cli-progress';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import * as cryptoCollector from '../collectors/crypto.js';
|
|
8
|
+
import * as earthquakesCollector from '../collectors/earthquakes.js';
|
|
9
|
+
import * as economicNewsCollector from '../collectors/economic-news.js';
|
|
10
|
+
import * as eksisozlukCollector from '../collectors/eksi-sozluk.js';
|
|
11
|
+
import * as exchangeRatesCollector from '../collectors/exchange-rates.js';
|
|
12
|
+
import * as fuelPricesCollector from '../collectors/fuel-prices.js';
|
|
13
|
+
import * as magnificentSevenCollector from '../collectors/magnificent-seven-stocks.js';
|
|
14
|
+
import * as politicsCollector from '../collectors/politics.js';
|
|
15
|
+
import * as stocksCollector from '../collectors/stocks.js';
|
|
16
|
+
import * as tuikStatsCollector from '../collectors/tuik-stats.js';
|
|
17
|
+
import * as twitterTrendsCollector from '../collectors/twitter-trends.js';
|
|
18
|
+
import * as weatherCollector from '../collectors/weather.js';
|
|
19
|
+
import * as youtubeTrendsCollector from '../collectors/youtube-trends.js';
|
|
20
|
+
import { AgendaResult } from '../domain/agenda-result.js';
|
|
21
|
+
import { closeBrowser } from '../services/browser.js';
|
|
22
|
+
import { getTranslations } from './i18n.js';
|
|
23
|
+
const collectors = [
|
|
24
|
+
{ key: 'exchangeRates', collector: exchangeRatesCollector, section: 'exchangeRates' },
|
|
25
|
+
{ key: 'stocks', collector: stocksCollector, section: 'stocks' },
|
|
26
|
+
{ key: 'crypto', collector: cryptoCollector, section: 'crypto' },
|
|
27
|
+
{ key: 'fuelPrices', collector: fuelPricesCollector, section: 'fuelPrices' },
|
|
28
|
+
{ key: 'tuikStats', collector: tuikStatsCollector, section: 'tuikStats' },
|
|
29
|
+
{ key: 'economicNews', collector: economicNewsCollector, section: 'economicNews' },
|
|
30
|
+
{ key: 'twitterTrends', collector: twitterTrendsCollector, section: 'twitterTrends' },
|
|
31
|
+
{ key: 'politics', collector: politicsCollector, section: 'politics' },
|
|
32
|
+
{ key: 'eksiSozluk', collector: eksisozlukCollector, section: 'eksiSozluk' },
|
|
33
|
+
{ key: 'earthquakes', collector: earthquakesCollector, section: 'earthquakes' },
|
|
34
|
+
{ key: 'youtubeTrends', collector: youtubeTrendsCollector, section: 'youtubeTrends' },
|
|
35
|
+
{ key: 'weather', collector: weatherCollector, section: 'weather' },
|
|
36
|
+
{ key: 'magnificentSevenStocks', collector: magnificentSevenCollector, section: 'magnificentSevenStocks' },
|
|
37
|
+
];
|
|
38
|
+
const currentDirectory = path.dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const logFilePath = path.join(currentDirectory, '..', '..', 'log.txt');
|
|
40
|
+
/** Appends collector errors to the package log file without breaking the CLI. */
|
|
41
|
+
function logCollectorError(collectorName, error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
const timestamp = new Date().toISOString();
|
|
44
|
+
try {
|
|
45
|
+
fs.appendFileSync(logFilePath, `[${timestamp}] [${collectorName}] ${message}\n`, 'utf8');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Logging must never prevent the CLI from producing partial results.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Creates the progress bar used while collectors run in parallel. */
|
|
52
|
+
function createProgressBar() {
|
|
53
|
+
return new cliProgress.SingleBar({
|
|
54
|
+
format: `${chalk.cyan('{bar}')} | {percentage}% | {value}/{total} | ${chalk.yellow('{module}')}`,
|
|
55
|
+
barCompleteChar: '█',
|
|
56
|
+
barIncompleteChar: '░',
|
|
57
|
+
hideCursor: true,
|
|
58
|
+
clearOnComplete: true,
|
|
59
|
+
}, cliProgress.Presets.shades_grey);
|
|
60
|
+
}
|
|
61
|
+
/** Runs every agenda collector and returns a normalized agenda snapshot. */
|
|
62
|
+
export async function runAgendaCollectors(language) {
|
|
63
|
+
const translations = getTranslations(language);
|
|
64
|
+
const resultData = {};
|
|
65
|
+
const progressBar = createProgressBar();
|
|
66
|
+
let completedCount = 0;
|
|
67
|
+
console.log(chalk.bold.cyan(`${translations.fetchingModule}...`));
|
|
68
|
+
progressBar.start(collectors.length, 0, { module: '...' });
|
|
69
|
+
const tasks = collectors.map(async (definition) => {
|
|
70
|
+
try {
|
|
71
|
+
resultData[definition.key] = await definition.collector.fetch();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
resultData[definition.key] = null;
|
|
75
|
+
logCollectorError(definition.key, error);
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
completedCount += 1;
|
|
79
|
+
progressBar.update(completedCount, {
|
|
80
|
+
module: translations.sections[definition.section] ?? definition.key,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
await Promise.all(tasks);
|
|
85
|
+
progressBar.stop();
|
|
86
|
+
console.log(chalk.green(`✓ ${translations.moduleComplete}`));
|
|
87
|
+
await closeBrowser();
|
|
88
|
+
return new AgendaResult(resultData);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/core/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgendaResultData, AgendaResultLike } from './types.js';
|
|
2
|
+
/** Represents a complete agenda snapshot with nullable sections. */
|
|
3
|
+
export declare class AgendaResult implements AgendaResultLike {
|
|
4
|
+
exchangeRates: import("./types.js").MarketQuote[] | null;
|
|
5
|
+
stocks: import("./types.js").MarketQuote[] | null;
|
|
6
|
+
crypto: import("./types.js").MarketQuote[] | null;
|
|
7
|
+
fuelPrices: import("./types.js").FuelPrice[] | null;
|
|
8
|
+
tuikStats: import("./types.js").TuikStats | null;
|
|
9
|
+
economicNews: import("./types.js").NewsItem[] | null;
|
|
10
|
+
twitterTrends: import("./types.js").TrendTopic[] | null;
|
|
11
|
+
politics: import("./types.js").NewsItem[] | null;
|
|
12
|
+
eksiSozluk: import("./types.js").TrendTopic[] | null;
|
|
13
|
+
earthquakes: import("./types.js").Earthquake[] | null;
|
|
14
|
+
youtubeTrends: import("./types.js").YoutubeVideo[] | null;
|
|
15
|
+
weather: import("./types.js").WeatherForecast[] | null;
|
|
16
|
+
magnificentSevenStocks: import("./types.js").MarketQuote[] | null;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
/** Creates a normalized agenda result from partial collector output. */
|
|
19
|
+
constructor(data?: Partial<AgendaResultData>);
|
|
20
|
+
/** Serializes the agenda result into a plain JSON-safe object. */
|
|
21
|
+
toJSON(): AgendaResultData;
|
|
22
|
+
/** Recreates an agenda result from a JSON-safe object. */
|
|
23
|
+
static fromJSON(json: Partial<AgendaResultData>): AgendaResult;
|
|
24
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Defines the normalized agenda snapshot returned by all collectors.
|
|
2
|
+
/** Represents a complete agenda snapshot with nullable sections. */
|
|
3
|
+
export class AgendaResult {
|
|
4
|
+
exchangeRates;
|
|
5
|
+
stocks;
|
|
6
|
+
crypto;
|
|
7
|
+
fuelPrices;
|
|
8
|
+
tuikStats;
|
|
9
|
+
economicNews;
|
|
10
|
+
twitterTrends;
|
|
11
|
+
politics;
|
|
12
|
+
eksiSozluk;
|
|
13
|
+
earthquakes;
|
|
14
|
+
youtubeTrends;
|
|
15
|
+
weather;
|
|
16
|
+
magnificentSevenStocks;
|
|
17
|
+
timestamp;
|
|
18
|
+
/** Creates a normalized agenda result from partial collector output. */
|
|
19
|
+
constructor(data = {}) {
|
|
20
|
+
this.exchangeRates = data.exchangeRates ?? null;
|
|
21
|
+
this.stocks = data.stocks ?? null;
|
|
22
|
+
this.crypto = data.crypto ?? null;
|
|
23
|
+
this.fuelPrices = data.fuelPrices ?? null;
|
|
24
|
+
this.tuikStats = data.tuikStats ?? null;
|
|
25
|
+
this.economicNews = data.economicNews ?? null;
|
|
26
|
+
this.twitterTrends = data.twitterTrends ?? null;
|
|
27
|
+
this.politics = data.politics ?? null;
|
|
28
|
+
this.eksiSozluk = data.eksiSozluk ?? null;
|
|
29
|
+
this.earthquakes = data.earthquakes ?? null;
|
|
30
|
+
this.youtubeTrends = data.youtubeTrends ?? null;
|
|
31
|
+
this.weather = data.weather ?? null;
|
|
32
|
+
this.magnificentSevenStocks = data.magnificentSevenStocks ?? null;
|
|
33
|
+
this.timestamp = data.timestamp ?? new Date().toISOString();
|
|
34
|
+
}
|
|
35
|
+
/** Serializes the agenda result into a plain JSON-safe object. */
|
|
36
|
+
toJSON() {
|
|
37
|
+
return {
|
|
38
|
+
exchangeRates: this.exchangeRates,
|
|
39
|
+
stocks: this.stocks,
|
|
40
|
+
crypto: this.crypto,
|
|
41
|
+
fuelPrices: this.fuelPrices,
|
|
42
|
+
tuikStats: this.tuikStats,
|
|
43
|
+
economicNews: this.economicNews,
|
|
44
|
+
twitterTrends: this.twitterTrends,
|
|
45
|
+
politics: this.politics,
|
|
46
|
+
eksiSozluk: this.eksiSozluk,
|
|
47
|
+
earthquakes: this.earthquakes,
|
|
48
|
+
youtubeTrends: this.youtubeTrends,
|
|
49
|
+
weather: this.weather,
|
|
50
|
+
magnificentSevenStocks: this.magnificentSevenStocks,
|
|
51
|
+
timestamp: this.timestamp,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Recreates an agenda result from a JSON-safe object. */
|
|
55
|
+
static fromJSON(json) {
|
|
56
|
+
return new AgendaResult(json);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=agenda-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agenda-result.js","sourceRoot":"","sources":["../../src/domain/agenda-result.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,oEAAoE;AACpE,MAAM,OAAO,YAAY;IACvB,aAAa,CAAC;IACd,MAAM,CAAC;IACP,MAAM,CAAC;IACP,UAAU,CAAC;IACX,SAAS,CAAC;IACV,YAAY,CAAC;IACb,aAAa,CAAC;IACd,QAAQ,CAAC;IACT,UAAU,CAAC;IACX,WAAW,CAAC;IACZ,aAAa,CAAC;IACd,OAAO,CAAC;IACR,sBAAsB,CAAC;IACvB,SAAS,CAAC;IAEV,wEAAwE;IACxE,YAAY,OAAkC,EAAE;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACpC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9D,CAAC;IAED,kEAAkE;IAClE,MAAM;QACJ,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,QAAQ,CAAC,IAA+B;QAC7C,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export type Language = 'tr' | 'en';
|
|
2
|
+
export type SectionKey = 'exchangeRates' | 'stocks' | 'crypto' | 'fuelPrices' | 'tuikStats' | 'economicNews' | 'twitterTrends' | 'politics' | 'eksiSozluk' | 'earthquakes' | 'youtubeTrends' | 'weather' | 'magnificentSevenStocks';
|
|
3
|
+
export type ResultKey = SectionKey;
|
|
4
|
+
export type Collector<T> = {
|
|
5
|
+
fetch: () => Promise<T>;
|
|
6
|
+
};
|
|
7
|
+
export type TranslationBundle = {
|
|
8
|
+
appTitle: string;
|
|
9
|
+
fetchingModule: string;
|
|
10
|
+
moduleComplete: string;
|
|
11
|
+
moduleFailed: string;
|
|
12
|
+
remaining: string;
|
|
13
|
+
errorOccurred: string;
|
|
14
|
+
sections: Record<SectionKey, string>;
|
|
15
|
+
noData: string;
|
|
16
|
+
fuelNote: string;
|
|
17
|
+
tuikCpi: string;
|
|
18
|
+
tuikUnemployment: string;
|
|
19
|
+
tuikCpiLabel: string;
|
|
20
|
+
tuikUnemploymentLabel: string;
|
|
21
|
+
tuikGdpLabel: string;
|
|
22
|
+
tuikConsumerConfidenceLabel: string;
|
|
23
|
+
months: Record<number, string>;
|
|
24
|
+
generatedAt: string;
|
|
25
|
+
};
|
|
26
|
+
export type MarketQuote = {
|
|
27
|
+
name: string;
|
|
28
|
+
ticker?: string;
|
|
29
|
+
last?: string;
|
|
30
|
+
price?: string;
|
|
31
|
+
changePercent?: string;
|
|
32
|
+
};
|
|
33
|
+
export type FuelPrice = {
|
|
34
|
+
productName: string;
|
|
35
|
+
amount: number;
|
|
36
|
+
};
|
|
37
|
+
export type TuikIndicator = {
|
|
38
|
+
value: string | number;
|
|
39
|
+
period: string;
|
|
40
|
+
};
|
|
41
|
+
export type TuikStats = {
|
|
42
|
+
cpi?: TuikIndicator;
|
|
43
|
+
unemployment?: TuikIndicator;
|
|
44
|
+
gdp?: TuikIndicator;
|
|
45
|
+
consumerConfidence?: TuikIndicator;
|
|
46
|
+
};
|
|
47
|
+
export type NewsItem = {
|
|
48
|
+
title: string;
|
|
49
|
+
url: string;
|
|
50
|
+
};
|
|
51
|
+
export type TrendTopic = {
|
|
52
|
+
rank?: number;
|
|
53
|
+
topic?: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
tweets?: string;
|
|
56
|
+
entries?: string;
|
|
57
|
+
url?: string;
|
|
58
|
+
};
|
|
59
|
+
export type Earthquake = {
|
|
60
|
+
magnitude: number;
|
|
61
|
+
location: string;
|
|
62
|
+
depth: string;
|
|
63
|
+
time: string;
|
|
64
|
+
};
|
|
65
|
+
export type YoutubeVideo = {
|
|
66
|
+
rank: number;
|
|
67
|
+
title: string;
|
|
68
|
+
views: string;
|
|
69
|
+
channel: string;
|
|
70
|
+
date: string;
|
|
71
|
+
videoId: string;
|
|
72
|
+
};
|
|
73
|
+
export type WeatherForecast = {
|
|
74
|
+
city: string;
|
|
75
|
+
condition: string;
|
|
76
|
+
range: string;
|
|
77
|
+
};
|
|
78
|
+
export type AgendaResultData = {
|
|
79
|
+
exchangeRates: MarketQuote[] | null;
|
|
80
|
+
stocks: MarketQuote[] | null;
|
|
81
|
+
crypto: MarketQuote[] | null;
|
|
82
|
+
fuelPrices: FuelPrice[] | null;
|
|
83
|
+
tuikStats: TuikStats | null;
|
|
84
|
+
economicNews: NewsItem[] | null;
|
|
85
|
+
twitterTrends: TrendTopic[] | null;
|
|
86
|
+
politics: NewsItem[] | null;
|
|
87
|
+
eksiSozluk: TrendTopic[] | null;
|
|
88
|
+
earthquakes: Earthquake[] | null;
|
|
89
|
+
youtubeTrends: YoutubeVideo[] | null;
|
|
90
|
+
weather: WeatherForecast[] | null;
|
|
91
|
+
magnificentSevenStocks: MarketQuote[] | null;
|
|
92
|
+
timestamp: string;
|
|
93
|
+
};
|
|
94
|
+
export type AgendaResultLike = AgendaResultData;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AAAA,+EAA+E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Browser } from 'puppeteer';
|
|
2
|
+
/** Returns a shared Puppeteer browser instance for all scraping tasks. */
|
|
3
|
+
export declare function getBrowser(): Promise<Browser>;
|
|
4
|
+
/** Closes the shared browser instance when collection completes. */
|
|
5
|
+
export declare function closeBrowser(): Promise<void>;
|
|
6
|
+
/** Scrapes a browser-rendered page with an isolated tab and cache-busted URL. */
|
|
7
|
+
export declare function scrape<T>(url: string, evaluatePage: () => T, waitSelector?: string): Promise<T>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Manages the shared Puppeteer browser instance for JavaScript-rendered sources.
|
|
2
|
+
import puppeteer from 'puppeteer';
|
|
3
|
+
let browser = null;
|
|
4
|
+
let browserPromise = null;
|
|
5
|
+
/** Returns a shared Puppeteer browser instance for all scraping tasks. */
|
|
6
|
+
export async function getBrowser() {
|
|
7
|
+
if (!browserPromise) {
|
|
8
|
+
browserPromise = puppeteer
|
|
9
|
+
.launch({
|
|
10
|
+
headless: true,
|
|
11
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--disable-gpu'],
|
|
12
|
+
})
|
|
13
|
+
.then((launchedBrowser) => {
|
|
14
|
+
browser = launchedBrowser;
|
|
15
|
+
return launchedBrowser;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return browserPromise;
|
|
19
|
+
}
|
|
20
|
+
/** Closes the shared browser instance when collection completes. */
|
|
21
|
+
export async function closeBrowser() {
|
|
22
|
+
if (!browser) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
await browser.close();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Browser shutdown failures are non-critical after data collection finishes.
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
browser = null;
|
|
33
|
+
browserPromise = null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Scrapes a browser-rendered page with an isolated tab and cache-busted URL. */
|
|
37
|
+
export async function scrape(url, evaluatePage, waitSelector) {
|
|
38
|
+
const activeBrowser = await getBrowser();
|
|
39
|
+
const page = await activeBrowser.newPage();
|
|
40
|
+
await page.setViewport({ width: 1280, height: 800 });
|
|
41
|
+
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
|
|
42
|
+
try {
|
|
43
|
+
const separator = url.includes('?') ? '&' : '?';
|
|
44
|
+
await page.goto(`${url}${separator}timestamp=${Date.now()}`, {
|
|
45
|
+
waitUntil: 'domcontentloaded',
|
|
46
|
+
timeout: 30000,
|
|
47
|
+
});
|
|
48
|
+
if (waitSelector) {
|
|
49
|
+
await page.waitForSelector(waitSelector, { timeout: 15000 });
|
|
50
|
+
}
|
|
51
|
+
await new Promise((resolve) => {
|
|
52
|
+
setTimeout(resolve, 1000);
|
|
53
|
+
});
|
|
54
|
+
const result = await page.evaluate(evaluatePage);
|
|
55
|
+
if (result === null || result === undefined) {
|
|
56
|
+
throw new Error(`Scrape returned null or undefined for ${url}`);
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await page.close();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/services/browser.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,SAA2B,MAAM,WAAW,CAAC;AAEpD,IAAI,OAAO,GAAmB,IAAI,CAAC;AACnC,IAAI,cAAc,GAA4B,IAAI,CAAC;AAEnD,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,SAAS;aACvB,MAAM,CAAC;YACN,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,CAAC,cAAc,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,iCAAiC,EAAE,eAAe,CAAC;SAClI,CAAC;aACD,IAAI,CAAC,CAAC,eAAe,EAAE,EAAE;YACxB,OAAO,GAAG,eAAe,CAAC;YAC1B,OAAO,eAAe,CAAC;QACzB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,6EAA6E;IAC/E,CAAC;YAAS,CAAC;QACT,OAAO,GAAG,IAAI,CAAC;QACf,cAAc,GAAG,IAAI,CAAC;IACxB,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAI,GAAW,EAAE,YAAqB,EAAE,YAAqB;IACvF,MAAM,aAAa,GAAG,MAAM,UAAU,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IAE3C,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,IAAI,CAAC,YAAY,CAAC,iHAAiH,CAAC,CAAC;IAE3I,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChD,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,SAAS,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE;YAC3D,SAAS,EAAE,kBAAkB;YAC7B,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Creates the shared HTTP client used by HTML and API-based collectors.
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
const httpClient = axios.create({
|
|
4
|
+
timeout: 30000,
|
|
5
|
+
headers: {
|
|
6
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36',
|
|
7
|
+
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
8
|
+
'Accept-Language': 'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7',
|
|
9
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
httpClient.interceptors.request.use((config) => {
|
|
13
|
+
if (config.url) {
|
|
14
|
+
const separator = config.url.includes('?') ? '&' : '?';
|
|
15
|
+
config.url = `${config.url}${separator}timestamp=${Date.now()}`;
|
|
16
|
+
}
|
|
17
|
+
return config;
|
|
18
|
+
});
|
|
19
|
+
export default httpClient;
|
|
20
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/services/http-client.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,KAAK;IACd,OAAO,EAAE;QACP,YAAY,EAAE,iHAAiH;QAC/H,MAAM,EAAE,iEAAiE;QACzE,iBAAiB,EAAE,qCAAqC;QACxD,iBAAiB,EAAE,mBAAmB;KACvC;CACF,CAAC,CAAC;AAEH,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;IAC7C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACvD,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,eAAe,UAAU,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "turkiyemonitor",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "A professional CLI tool for monitoring Turkiye agenda data in real time.",
|
|
5
|
+
"main": "dist/cli.js",
|
|
6
|
+
"types": "dist/cli.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"turkiyemonitor": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc -p tsconfig.json",
|
|
13
|
+
"start": "npm run build && node dist/cli.js",
|
|
14
|
+
"prepack": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"turkiye",
|
|
18
|
+
"agenda",
|
|
19
|
+
"cli",
|
|
20
|
+
"news",
|
|
21
|
+
"economy",
|
|
22
|
+
"trends",
|
|
23
|
+
"monitor"
|
|
24
|
+
],
|
|
25
|
+
"author": "bariskisir",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/bariskisir/turkiyemonitor.git"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/bariskisir/turkiyemonitor/issues"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/bariskisir/turkiyemonitor#readme",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"axios": "1.15.2",
|
|
37
|
+
"chalk": "^4.1.2",
|
|
38
|
+
"cheerio": "^1.0.0",
|
|
39
|
+
"cli-progress": "^3.12.0",
|
|
40
|
+
"cli-table3": "^0.6.5",
|
|
41
|
+
"commander": "^12.1.0",
|
|
42
|
+
"puppeteer": "^24.37.5",
|
|
43
|
+
"xml2js": "^0.6.2"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/cli-progress": "^3.11.6",
|
|
47
|
+
"@types/node": "^24.10.1",
|
|
48
|
+
"@types/xml2js": "^0.4.14",
|
|
49
|
+
"typescript": "^5.9.3"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18"
|
|
53
|
+
},
|
|
54
|
+
"overrides": {
|
|
55
|
+
"basic-ftp": "5.3.1",
|
|
56
|
+
"follow-redirects": "1.16.0",
|
|
57
|
+
"ip-address": "10.2.0",
|
|
58
|
+
"undici": "7.24.1"
|
|
59
|
+
},
|
|
60
|
+
"files": [
|
|
61
|
+
"dist",
|
|
62
|
+
"README.md",
|
|
63
|
+
"LICENSE",
|
|
64
|
+
"screenshot.png"
|
|
65
|
+
]
|
|
66
|
+
}
|
package/screenshot.png
ADDED
|
Binary file
|