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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +58 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/collectors/crypto.d.ts +3 -0
  7. package/dist/collectors/crypto.js +37 -0
  8. package/dist/collectors/crypto.js.map +1 -0
  9. package/dist/collectors/earthquakes.d.ts +3 -0
  10. package/dist/collectors/earthquakes.js +53 -0
  11. package/dist/collectors/earthquakes.js.map +1 -0
  12. package/dist/collectors/economic-news.d.ts +3 -0
  13. package/dist/collectors/economic-news.js +49 -0
  14. package/dist/collectors/economic-news.js.map +1 -0
  15. package/dist/collectors/eksi-sozluk.d.ts +3 -0
  16. package/dist/collectors/eksi-sozluk.js +38 -0
  17. package/dist/collectors/eksi-sozluk.js.map +1 -0
  18. package/dist/collectors/exchange-rates.d.ts +3 -0
  19. package/dist/collectors/exchange-rates.js +36 -0
  20. package/dist/collectors/exchange-rates.js.map +1 -0
  21. package/dist/collectors/fuel-prices.d.ts +3 -0
  22. package/dist/collectors/fuel-prices.js +70 -0
  23. package/dist/collectors/fuel-prices.js.map +1 -0
  24. package/dist/collectors/magnificent-seven-stocks.d.ts +3 -0
  25. package/dist/collectors/magnificent-seven-stocks.js +40 -0
  26. package/dist/collectors/magnificent-seven-stocks.js.map +1 -0
  27. package/dist/collectors/politics.d.ts +3 -0
  28. package/dist/collectors/politics.js +35 -0
  29. package/dist/collectors/politics.js.map +1 -0
  30. package/dist/collectors/stocks.d.ts +3 -0
  31. package/dist/collectors/stocks.js +76 -0
  32. package/dist/collectors/stocks.js.map +1 -0
  33. package/dist/collectors/tuik-stats.d.ts +3 -0
  34. package/dist/collectors/tuik-stats.js +36 -0
  35. package/dist/collectors/tuik-stats.js.map +1 -0
  36. package/dist/collectors/twitter-trends.d.ts +3 -0
  37. package/dist/collectors/twitter-trends.js +25 -0
  38. package/dist/collectors/twitter-trends.js.map +1 -0
  39. package/dist/collectors/weather.d.ts +3 -0
  40. package/dist/collectors/weather.js +67 -0
  41. package/dist/collectors/weather.js.map +1 -0
  42. package/dist/collectors/youtube-trends.d.ts +3 -0
  43. package/dist/collectors/youtube-trends.js +40 -0
  44. package/dist/collectors/youtube-trends.js.map +1 -0
  45. package/dist/core/formatter.d.ts +3 -0
  46. package/dist/core/formatter.js +315 -0
  47. package/dist/core/formatter.js.map +1 -0
  48. package/dist/core/i18n.d.ts +3 -0
  49. package/dist/core/i18n.js +100 -0
  50. package/dist/core/i18n.js.map +1 -0
  51. package/dist/core/runner.d.ts +4 -0
  52. package/dist/core/runner.js +90 -0
  53. package/dist/core/runner.js.map +1 -0
  54. package/dist/domain/agenda-result.d.ts +24 -0
  55. package/dist/domain/agenda-result.js +59 -0
  56. package/dist/domain/agenda-result.js.map +1 -0
  57. package/dist/domain/types.d.ts +94 -0
  58. package/dist/domain/types.js +3 -0
  59. package/dist/domain/types.js.map +1 -0
  60. package/dist/services/browser.d.ts +7 -0
  61. package/dist/services/browser.js +64 -0
  62. package/dist/services/browser.js.map +1 -0
  63. package/dist/services/http-client.d.ts +2 -0
  64. package/dist/services/http-client.js +20 -0
  65. package/dist/services/http-client.js.map +1 -0
  66. package/package.json +66 -0
  67. package/screenshot.png +0 -0
@@ -0,0 +1,76 @@
1
+ // Collects major global stock-index quotes with BIST 100 prioritized.
2
+ import { scrape } from '../services/browser.js';
3
+ const targetIndices = ['BIST 100', 'Nasdaq', 'S&P 500', 'Dow Jones', 'DAX'];
4
+ /** Fetches major stock index quotes for the market section. */
5
+ export async function fetch() {
6
+ const [scrapedIndices, bistIndex] = await Promise.all([scrapeMajorIndices(), scrapeBistIndex()]);
7
+ const indices = [...scrapedIndices];
8
+ if (bistIndex && !indices.some((index) => index.name.includes('BIST'))) {
9
+ indices.unshift(bistIndex);
10
+ }
11
+ const filtered = selectTargetIndices(indices);
12
+ if (filtered.length === 0) {
13
+ throw new Error('No stock indices data found');
14
+ }
15
+ return filtered.slice(0, 5);
16
+ }
17
+ /** Selects preferred indices first and fills remaining slots from scraped data. */
18
+ function selectTargetIndices(indices) {
19
+ const selected = [];
20
+ for (const target of targetIndices) {
21
+ const found = indices.find((index) => index.name.toLowerCase().includes(target.toLowerCase()));
22
+ if (found) {
23
+ selected.push(found);
24
+ }
25
+ }
26
+ if (selected.length < 3) {
27
+ for (const index of indices) {
28
+ if (!selected.some((item) => item.name === index.name)) {
29
+ selected.push(index);
30
+ }
31
+ if (selected.length >= 5) {
32
+ break;
33
+ }
34
+ }
35
+ }
36
+ return selected;
37
+ }
38
+ /** Scrapes the Investing.com major indices table. */
39
+ async function scrapeMajorIndices() {
40
+ try {
41
+ return await scrape('https://www.investing.com/indices/major-indices', () => {
42
+ const data = [];
43
+ const rows = document.querySelectorAll('table tbody tr');
44
+ rows.forEach((row) => {
45
+ const cells = row.querySelectorAll('td');
46
+ if (cells.length < 7) {
47
+ return;
48
+ }
49
+ const name = cells[1]?.textContent?.trim()?.split('\n')[0];
50
+ const last = cells[2]?.textContent?.trim();
51
+ const changePercent = cells[6]?.textContent?.trim();
52
+ if (name && last) {
53
+ data.push({ name, last, changePercent: changePercent || '-' });
54
+ }
55
+ });
56
+ return data;
57
+ }, 'table tbody tr');
58
+ }
59
+ catch {
60
+ return [];
61
+ }
62
+ }
63
+ /** Scrapes the dedicated BIST 100 quote page as a fallback source. */
64
+ async function scrapeBistIndex() {
65
+ try {
66
+ return await scrape('https://www.investing.com/indices/ise-100', () => {
67
+ const last = document.querySelector('[data-test="instrument-price-last"]')?.textContent?.trim();
68
+ const changePercent = document.querySelector('[data-test="instrument-price-change-percent"]')?.textContent?.trim();
69
+ return last ? { name: 'BIST 100', last, changePercent: changePercent || '-' } : null;
70
+ }, '[data-test="instrument-price-last"]');
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ //# sourceMappingURL=stocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stocks.js","sourceRoot":"","sources":["../../src/collectors/stocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TuikStats } from '../domain/types.js';
2
+ /** Fetches CPI, unemployment, GDP, and confidence indicators from TUIK. */
3
+ export declare function fetch(): Promise<TuikStats>;
@@ -0,0 +1,36 @@
1
+ // Collects selected macroeconomic indicators from the TUIK data portal.
2
+ import httpClient from '../services/http-client.js';
3
+ /** Fetches CPI, unemployment, GDP, and confidence indicators from TUIK. */
4
+ export async function fetch() {
5
+ const response = await httpClient.get('https://veriportali.tuik.gov.tr/api/tr/press/indicators', {
6
+ headers: { 'X-Requested-With': 'XMLHttpRequest' },
7
+ });
8
+ const items = Array.isArray(response.data) ? response.data : response.data.data ?? [];
9
+ const result = {};
10
+ assignIndicator(result, 'cpi', findByTitle(items, ['Tüketici Fiyat Endeksi']));
11
+ assignIndicator(result, 'unemployment', findByTitle(items, ['İşsizlik']));
12
+ assignIndicator(result, 'gdp', findByTitle(items, ['Gayrisafi Yurt İçi Hasıla', 'GSYH', 'Büyüme']));
13
+ assignIndicator(result, 'consumerConfidence', findByTitle(items, ['Tüketici Güven']));
14
+ if (!result.cpi && !result.unemployment && !result.gdp && !result.consumerConfidence) {
15
+ throw new Error('No TUIK indicators found');
16
+ }
17
+ return result;
18
+ }
19
+ /** Finds the first TUIK item whose title contains one of the requested terms. */
20
+ function findByTitle(items, titleParts) {
21
+ return items.find((item) => {
22
+ const title = item.graphics?.[0]?.title || '';
23
+ return titleParts.some((part) => title.includes(part));
24
+ });
25
+ }
26
+ /** Assigns a TUIK item to the normalized result when it has usable fields. */
27
+ function assignIndicator(result, key, item) {
28
+ if (item?.value === undefined || !item.date) {
29
+ return;
30
+ }
31
+ result[key] = {
32
+ value: item.value,
33
+ period: item.date,
34
+ };
35
+ }
36
+ //# sourceMappingURL=tuik-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuik-stats.js","sourceRoot":"","sources":["../../src/collectors/tuik-stats.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAGxE,OAAO,UAAU,MAAM,4BAA4B,CAAC;AAQpD,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAA2C,yDAAyD,EAAE;QACzI,OAAO,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;KAClD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IACtF,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;IAC/E,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1E,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,2BAA2B,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpG,eAAe,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAEtF,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AACjF,SAAS,WAAW,CAAC,KAAoB,EAAE,UAAoB;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAS,eAAe,CAAC,MAAiB,EAAE,GAAoB,EAAE,IAA6B;IAC7F,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,GAAG;QACZ,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,IAAI;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TrendTopic } from '../domain/types.js';
2
+ /** Fetches the current Twitter trend table for Turkiye. */
3
+ export declare function fetch(): Promise<TrendTopic[]>;
@@ -0,0 +1,25 @@
1
+ // Collects current Turkiye Twitter trends from GetDayTrends.
2
+ import * as cheerio from 'cheerio';
3
+ import httpClient from '../services/http-client.js';
4
+ /** Fetches the current Twitter trend table for Turkiye. */
5
+ export async function fetch() {
6
+ const response = await httpClient.get('https://getdaytrends.com/tr/turkey/');
7
+ const $ = cheerio.load(response.data);
8
+ const trends = [];
9
+ $('#trends tbody tr').each((_, row) => {
10
+ if (trends.length >= 10) {
11
+ return;
12
+ }
13
+ const tableRow = $(row);
14
+ const topic = tableRow.find('td:nth-child(2) a').text().trim();
15
+ const tweets = tableRow.find('td:nth-child(3)').text().trim();
16
+ if (topic) {
17
+ trends.push({ rank: trends.length + 1, topic, tweets: tweets || '-' });
18
+ }
19
+ });
20
+ if (trends.length === 0) {
21
+ throw new Error('No Twitter trends found');
22
+ }
23
+ return trends;
24
+ }
25
+ //# sourceMappingURL=twitter-trends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter-trends.js","sourceRoot":"","sources":["../../src/collectors/twitter-trends.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,UAAU,MAAM,4BAA4B,CAAC;AAEpD,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAS,qCAAqC,CAAC,CAAC;IACrF,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACpC,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAE9D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { WeatherForecast } from '../domain/types.js';
2
+ /** Fetches weather forecasts for selected Turkish cities. */
3
+ export declare function fetch(): Promise<WeatherForecast[]>;
@@ -0,0 +1,67 @@
1
+ // Collects short-term weather forecasts from the Turkish Meteorological Service.
2
+ import { scrape } from '../services/browser.js';
3
+ const cities = ['İstanbul', 'Ankara', 'İzmir', 'Çanakkale', 'Bursa', 'Antalya', 'Adana'];
4
+ /** Fetches weather forecasts for selected Turkish cities. */
5
+ export async function fetch() {
6
+ const forecasts = [];
7
+ for (const city of cities) {
8
+ const forecast = await scrapeCityForecast(city);
9
+ if (forecast) {
10
+ forecasts.push(forecast);
11
+ }
12
+ }
13
+ if (forecasts.length === 0) {
14
+ throw new Error('No weather data found');
15
+ }
16
+ return forecasts;
17
+ }
18
+ /** Scrapes a single city forecast from MGM. */
19
+ async function scrapeCityForecast(city) {
20
+ try {
21
+ const data = await scrape(`https://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?il=${encodeURIComponent(city)}`, () => {
22
+ const row = document.querySelector('#_4_5gunluk table tbody tr');
23
+ if (!row) {
24
+ return null;
25
+ }
26
+ const cells = row.querySelectorAll('td');
27
+ if (cells.length < 5) {
28
+ return null;
29
+ }
30
+ const condition = cells[1].querySelector('img')?.getAttribute('title') || 'Bilinmiyor';
31
+ const min = cells[2].textContent?.trim() || '-';
32
+ const max = cells[3].textContent?.trim() || '-';
33
+ return { condition, min, max };
34
+ }, '#_4_5gunluk table tbody tr');
35
+ return data
36
+ ? {
37
+ city,
38
+ condition: `${resolveConditionIcon(data.condition)} ${data.condition}`,
39
+ range: `${data.max}°C ${data.min}°C`,
40
+ }
41
+ : null;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /** Maps a Turkish weather condition string to a compact icon. */
48
+ function resolveConditionIcon(condition) {
49
+ const normalizedCondition = condition.toLowerCase();
50
+ if (normalizedCondition.includes('açık') || normalizedCondition.includes('güneş')) {
51
+ return '☀️';
52
+ }
53
+ if (normalizedCondition.includes('yağmur') || normalizedCondition.includes('sağanak')) {
54
+ return '🌧️';
55
+ }
56
+ if (normalizedCondition.includes('kar')) {
57
+ return '❄️';
58
+ }
59
+ if (normalizedCondition.includes('sis')) {
60
+ return '🌫️';
61
+ }
62
+ if (normalizedCondition.includes('fırtına')) {
63
+ return '⛈️';
64
+ }
65
+ return '⛅';
66
+ }
67
+ //# sourceMappingURL=weather.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weather.js","sourceRoot":"","sources":["../../src/collectors/weather.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { YoutubeVideo } from '../domain/types.js';
2
+ /** Fetches YouTube trend videos for Turkiye. */
3
+ export declare function fetch(): Promise<YoutubeVideo[]>;
@@ -0,0 +1,40 @@
1
+ // Collects trending YouTube videos for Turkiye from yttrendz.com.
2
+ import * as cheerio from 'cheerio';
3
+ import httpClient from '../services/http-client.js';
4
+ /** Fetches YouTube trend videos for Turkiye. */
5
+ export async function fetch() {
6
+ const response = await httpClient.get('https://yttrendz.com/youtube-trends/turkey');
7
+ const $ = cheerio.load(response.data);
8
+ const videos = [];
9
+ $('.feed-box-wp .feed-box').each((_, box) => {
10
+ if (videos.length >= 5) {
11
+ return;
12
+ }
13
+ const parsedVideo = parseVideoBox($, $(box), videos.length + 1);
14
+ if (parsedVideo) {
15
+ videos.push(parsedVideo);
16
+ }
17
+ });
18
+ if (videos.length === 0) {
19
+ throw new Error('No YouTube trends found');
20
+ }
21
+ return videos;
22
+ }
23
+ /** Parses a yttrendz video card into a normalized video record. */
24
+ function parseVideoBox($, box, fallbackRank) {
25
+ const rank = box.find('.feed-count span').text().trim();
26
+ const titleElement = box.find('.feed-title a').first();
27
+ const title = titleElement.attr('title') || titleElement.text().trim();
28
+ if (!title) {
29
+ return null;
30
+ }
31
+ return {
32
+ rank: Number.parseInt(rank, 10) || fallbackRank,
33
+ title,
34
+ views: box.find('.feed-view-figure').first().text().trim() || '-',
35
+ channel: box.find('.feed-author').first().text().replace('Upload by :', '').replace('Upload by:', '').trim() || '-',
36
+ date: box.find('.feed-date').first().text().replace('on ', '').trim() || '-',
37
+ videoId: titleElement.attr('data-videoid') || '',
38
+ };
39
+ }
40
+ //# sourceMappingURL=youtube-trends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube-trends.js","sourceRoot":"","sources":["../../src/collectors/youtube-trends.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,OAAO,UAAU,MAAM,4BAA4B,CAAC;AAEpD,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAS,4CAA4C,CAAC,CAAC;IAC5F,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,CAAC,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mEAAmE;AACnE,SAAS,aAAa,CAAC,CAAqB,EAAE,GAA6B,EAAE,YAAoB;IAC/F,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAEvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY;QAC/C,KAAK;QACL,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG;QACjE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG;QACnH,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG;QAC5E,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgendaResultLike, Language } from '../domain/types.js';
2
+ /** Formats an agenda result for terminal output. */
3
+ export declare function formatOutput(result: AgendaResultLike, language: Language): string;
@@ -0,0 +1,315 @@
1
+ // Formats collected agenda data into a compact three-column terminal report.
2
+ import chalk from 'chalk';
3
+ import { getTranslations } from './i18n.js';
4
+ const ANSI_PATTERN = /\u001b\[[0-9;]*m/g;
5
+ /** Formats an agenda result for terminal output. */
6
+ export function formatOutput(result, language) {
7
+ const translations = getTranslations(language);
8
+ const width = Math.floor((process.stdout.columns || 150) * 0.98);
9
+ const firstColumnWidth = Math.floor((width - 4) * 0.25);
10
+ const secondColumnWidth = Math.floor((width - 4) * 0.45);
11
+ const thirdColumnWidth = Math.floor((width - 4) * 0.3);
12
+ const lines = [];
13
+ const firstColumn = [];
14
+ const secondColumn = [];
15
+ const thirdColumn = [];
16
+ lines.push(chalk.bold.cyan(` ${translations.appTitle} | ${new Date().toLocaleString(language === 'tr' ? 'tr-TR' : 'en-US')} `));
17
+ lines.push(chalk.gray('═'.repeat(Math.min(width, 200))));
18
+ buildExchangeRates(firstColumn, result.exchangeRates, translations);
19
+ buildStocks(firstColumn, result.stocks, translations);
20
+ buildMagnificentSeven(firstColumn, result.magnificentSevenStocks, translations);
21
+ buildCrypto(firstColumn, result.crypto, translations);
22
+ buildFuelPrices(firstColumn, result.fuelPrices, translations);
23
+ buildEconomicNews(secondColumn, result.economicNews, translations, secondColumnWidth);
24
+ buildPolitics(secondColumn, result.politics, translations, secondColumnWidth);
25
+ buildTuikStats(secondColumn, result.tuikStats, translations);
26
+ buildEarthquakes(secondColumn, result.earthquakes, translations);
27
+ buildTwitterTrends(thirdColumn, result.twitterTrends, translations, thirdColumnWidth);
28
+ buildEksiSozluk(thirdColumn, result.eksiSozluk, translations);
29
+ buildYoutubeTrends(thirdColumn, result.youtubeTrends, translations);
30
+ buildWeather(thirdColumn, result.weather, translations);
31
+ const maxLength = Math.max(firstColumn.length, secondColumn.length, thirdColumn.length);
32
+ const separator = chalk.gray(' ║ ');
33
+ for (let index = 0; index < maxLength; index += 1) {
34
+ const first = padToWidth(firstColumn[index] ?? dottedPadding(firstColumnWidth), firstColumnWidth);
35
+ const second = padToWidth(secondColumn[index] ?? dottedPadding(secondColumnWidth), secondColumnWidth);
36
+ const third = padToWidth(thirdColumn[index] ?? dottedPadding(thirdColumnWidth), thirdColumnWidth);
37
+ lines.push(`${first}${separator}${second}${separator}${third}`);
38
+ }
39
+ lines.push(chalk.gray('═'.repeat(Math.min(width, 200))));
40
+ return lines.join('\n');
41
+ }
42
+ /** Removes ANSI escape sequences from a string. */
43
+ function stripAnsi(value) {
44
+ return value.replace(ANSI_PATTERN, '');
45
+ }
46
+ /** Calculates the visible terminal width of a formatted string. */
47
+ function visibleLength(value) {
48
+ return Array.from(stripAnsi(value)).length;
49
+ }
50
+ /** Creates a subtle placeholder line for an empty table cell. */
51
+ function dottedPadding(width) {
52
+ return chalk.dim.gray(` ${'· '.repeat(Math.max(0, Math.floor((width - 2) / 2)))}`);
53
+ }
54
+ /** Pads or truncates a string to a target visible terminal width. */
55
+ function padToWidth(value, width) {
56
+ const visible = visibleLength(value);
57
+ if (visible >= width) {
58
+ return truncateToWidth(value, width);
59
+ }
60
+ return `${value}${' '.repeat(width - visible)}`;
61
+ }
62
+ /** Truncates a possibly colorized string without breaking ANSI color codes. */
63
+ function truncateToWidth(value, width) {
64
+ const output = [];
65
+ let visible = 0;
66
+ let inEscapeSequence = false;
67
+ let escapeBuffer = '';
68
+ for (const character of value) {
69
+ if (character === '\u001b') {
70
+ inEscapeSequence = true;
71
+ escapeBuffer = character;
72
+ continue;
73
+ }
74
+ if (inEscapeSequence) {
75
+ escapeBuffer += character;
76
+ if (character === 'm') {
77
+ output.push(escapeBuffer);
78
+ inEscapeSequence = false;
79
+ escapeBuffer = '';
80
+ }
81
+ continue;
82
+ }
83
+ if (visible >= width - 1) {
84
+ output.push('…');
85
+ break;
86
+ }
87
+ output.push(character);
88
+ visible += 1;
89
+ }
90
+ while (visible < width) {
91
+ output.push(' ');
92
+ visible += 1;
93
+ }
94
+ return output.join('');
95
+ }
96
+ /** Formats a section heading for terminal output. */
97
+ function sectionHeader(title) {
98
+ return chalk.dim.yellow(`▸ ${title}`);
99
+ }
100
+ /** Formats the standard section-level error message. */
101
+ function errorMessage(translations) {
102
+ return chalk.dim.red(` ⚠ ${translations.errorOccurred}`);
103
+ }
104
+ /** Applies positive, negative, or neutral color to numeric change values. */
105
+ function colorizeValue(text) {
106
+ if (!text || text === '-') {
107
+ return text || '-';
108
+ }
109
+ const numericValue = Number.parseFloat(String(text).replace(/[%,\s+()]/g, '').replace(',', '.'));
110
+ if (Number.isNaN(numericValue)) {
111
+ return text;
112
+ }
113
+ if (numericValue > 0) {
114
+ return chalk.green(text.replace(/[()]/g, ''));
115
+ }
116
+ if (numericValue < 0) {
117
+ return chalk.red(text.replace(/[()]/g, ''));
118
+ }
119
+ return chalk.gray(text);
120
+ }
121
+ /** Truncates a plain string to the requested character length. */
122
+ function truncate(value, length) {
123
+ if (!value) {
124
+ return '-';
125
+ }
126
+ return value.length <= length ? value : `${value.substring(0, length - 3)}…`;
127
+ }
128
+ /** Appends exchange-rate rows to a formatter column. */
129
+ function buildExchangeRates(column, data, translations) {
130
+ column.push(sectionHeader(translations.sections.exchangeRates));
131
+ if (!data) {
132
+ column.push(errorMessage(translations));
133
+ return;
134
+ }
135
+ for (const item of data) {
136
+ column.push(chalk.dim(` ${item.name.padEnd(10)}${(item.last || '-').padEnd(12)}${colorizeValue(item.changePercent)}`));
137
+ }
138
+ }
139
+ /** Appends stock-index rows to a formatter column. */
140
+ function buildStocks(column, data, translations) {
141
+ column.push(sectionHeader(translations.sections.stocks));
142
+ if (!data) {
143
+ column.push(errorMessage(translations));
144
+ return;
145
+ }
146
+ for (const item of data) {
147
+ column.push(chalk.dim(` ${truncate(item.name, 11).padEnd(12)}${(item.last || '-').padEnd(10)}${colorizeValue(item.changePercent)}`));
148
+ }
149
+ }
150
+ /** Appends crypto-market rows to a formatter column. */
151
+ function buildCrypto(column, data, translations) {
152
+ column.push(sectionHeader(translations.sections.crypto));
153
+ if (!data) {
154
+ column.push(errorMessage(translations));
155
+ return;
156
+ }
157
+ for (const item of data) {
158
+ column.push(chalk.dim(` ${truncate(item.name, 5).padEnd(6)}${(item.price || '-').padEnd(10)}${colorizeValue(item.changePercent)}`));
159
+ }
160
+ }
161
+ /** Appends fuel-price rows to a formatter column. */
162
+ function buildFuelPrices(column, data, translations) {
163
+ column.push(sectionHeader(translations.sections.fuelPrices));
164
+ if (!data) {
165
+ column.push(errorMessage(translations));
166
+ return;
167
+ }
168
+ for (const item of data) {
169
+ const displayName = item.productName.split(' ').slice(1).join(' ') || item.productName;
170
+ column.push(chalk.dim(` ${displayName.padEnd(16)} ${item.amount} ₺`));
171
+ }
172
+ }
173
+ /** Appends TUIK indicator rows to a formatter column. */
174
+ function buildTuikStats(column, data, translations) {
175
+ column.push(sectionHeader(translations.sections.tuikStats));
176
+ if (!data) {
177
+ column.push(errorMessage(translations));
178
+ return;
179
+ }
180
+ if (data.cpi) {
181
+ column.push(chalk.dim(` ${translations.tuikCpiLabel}: %${data.cpi.value} (${formatPeriod(data.cpi.period, translations)})`));
182
+ }
183
+ if (data.unemployment) {
184
+ column.push(chalk.dim(` ${translations.tuikUnemploymentLabel}: %${data.unemployment.value} (${formatPeriod(data.unemployment.period, translations)})`));
185
+ }
186
+ if (data.gdp) {
187
+ column.push(chalk.dim(` ${translations.tuikGdpLabel}: %${data.gdp.value} (${formatPeriod(data.gdp.period, translations)})`));
188
+ }
189
+ if (data.consumerConfidence) {
190
+ column.push(chalk.dim(` ${translations.tuikConsumerConfidenceLabel}: ${data.consumerConfidence.value} (${formatPeriod(data.consumerConfidence.period, translations)})`));
191
+ }
192
+ }
193
+ /** Appends economic-news rows to a formatter column. */
194
+ function buildEconomicNews(column, data, translations, columnWidth) {
195
+ appendNewsSection(column, data, translations.sections.economicNews, translations, columnWidth, 8);
196
+ }
197
+ /** Appends politics-news rows to a formatter column. */
198
+ function buildPolitics(column, data, translations, columnWidth) {
199
+ appendNewsSection(column, data, translations.sections.politics, translations, columnWidth, 6);
200
+ }
201
+ /** Appends a wrapped news section to a formatter column. */
202
+ function appendNewsSection(column, data, title, translations, columnWidth, limit) {
203
+ column.push(sectionHeader(title));
204
+ if (!data) {
205
+ column.push(errorMessage(translations));
206
+ return;
207
+ }
208
+ for (const item of data.slice(0, limit)) {
209
+ const fullTitle = `- ${item.title}`;
210
+ const maxPerLine = columnWidth - 3;
211
+ if (fullTitle.length > maxPerLine) {
212
+ column.push(chalk.dim(` ${fullTitle.substring(0, maxPerLine)}`));
213
+ column.push(chalk.dim(` ${truncate(fullTitle.substring(maxPerLine), maxPerLine)}`));
214
+ continue;
215
+ }
216
+ column.push(chalk.dim(` ${fullTitle}`));
217
+ }
218
+ }
219
+ /** Appends earthquake rows to a formatter column. */
220
+ function buildEarthquakes(column, data, translations) {
221
+ column.push(sectionHeader(translations.sections.earthquakes));
222
+ if (!data) {
223
+ column.push(errorMessage(translations));
224
+ return;
225
+ }
226
+ if (data.length === 0) {
227
+ column.push(chalk.dim.gray(` ${translations.noData}`));
228
+ return;
229
+ }
230
+ for (const earthquake of data) {
231
+ const magnitude = earthquake.magnitude >= 5 ? chalk.red.bold(earthquake.magnitude.toFixed(1)) : chalk.yellow(earthquake.magnitude.toFixed(1));
232
+ const location = truncate(earthquake.location, 27).padEnd(28);
233
+ const time = earthquake.time.split(' ')[1] || earthquake.time;
234
+ column.push(chalk.dim(` ${magnitude} ${location}${truncate(time, 16)}`));
235
+ }
236
+ }
237
+ /** Appends Twitter trend rows to a formatter column. */
238
+ function buildTwitterTrends(column, data, translations, columnWidth) {
239
+ column.push(sectionHeader(translations.sections.twitterTrends));
240
+ if (!data) {
241
+ column.push(errorMessage(translations));
242
+ return;
243
+ }
244
+ const words = data.map((trend) => trend.topic).join(' | ').split(' ');
245
+ let currentLine = '';
246
+ for (const word of words) {
247
+ if (currentLine.length + word.length + 1 > columnWidth - 2) {
248
+ column.push(chalk.dim(` ${currentLine}`));
249
+ currentLine = word;
250
+ continue;
251
+ }
252
+ currentLine += `${currentLine.length === 0 ? '' : ' '}${word}`;
253
+ }
254
+ if (currentLine) {
255
+ column.push(chalk.dim(` ${currentLine}`));
256
+ }
257
+ }
258
+ /** Appends Eksi Sozluk agenda rows to a formatter column. */
259
+ function buildEksiSozluk(column, data, translations) {
260
+ column.push(sectionHeader(translations.sections.eksiSozluk));
261
+ if (!data) {
262
+ column.push(errorMessage(translations));
263
+ return;
264
+ }
265
+ for (const topic of data) {
266
+ column.push(chalk.dim(` ${truncate(topic.title, 45).padEnd(46)}${topic.entries || '-'}`));
267
+ }
268
+ }
269
+ /** Appends YouTube trend rows to a formatter column. */
270
+ function buildYoutubeTrends(column, data, translations) {
271
+ column.push(sectionHeader(translations.sections.youtubeTrends));
272
+ if (!data) {
273
+ column.push(errorMessage(translations));
274
+ return;
275
+ }
276
+ for (const video of data) {
277
+ column.push(chalk.dim(` ${truncate(video.title, 55)}`));
278
+ }
279
+ }
280
+ /** Appends weather forecast rows to a formatter column. */
281
+ function buildWeather(column, data, translations) {
282
+ column.push(sectionHeader(translations.sections.weather));
283
+ if (!data) {
284
+ column.push(errorMessage(translations));
285
+ return;
286
+ }
287
+ for (const forecast of data) {
288
+ const city = `${forecast.city}${' '.repeat(Math.max(1, 10 - visibleLength(forecast.city)))}`;
289
+ column.push(chalk.dim(` ${city} ${forecast.range.padStart(11)} ${truncate(forecast.condition, 30)}`));
290
+ }
291
+ }
292
+ /** Converts numeric month periods to localized month names. */
293
+ function formatPeriod(dateText, translations) {
294
+ if (!dateText) {
295
+ return '-';
296
+ }
297
+ const parts = dateText.split('/');
298
+ if (parts.length === 2) {
299
+ const monthName = translations.months[Number.parseInt(parts[1], 10)] || parts[1];
300
+ return `${parts[0]} ${monthName}`;
301
+ }
302
+ return dateText;
303
+ }
304
+ /** Appends Magnificent Seven stock rows to a formatter column. */
305
+ function buildMagnificentSeven(column, data, translations) {
306
+ column.push(sectionHeader(translations.sections.magnificentSevenStocks));
307
+ if (!data) {
308
+ column.push(errorMessage(translations));
309
+ return;
310
+ }
311
+ for (const item of data) {
312
+ column.push(chalk.dim(` ${item.ticker?.padEnd(6) ?? item.name.padEnd(6)}${(item.price || '-').padEnd(10)}${colorizeValue(item.changePercent)}`));
313
+ }
314
+ }
315
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/core/formatter.ts"],"names":[],"mappings":"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"}