euparliamentmonitor 0.8.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/LICENSE +201 -0
- package/README.md +1005 -0
- package/SECURITY.md +151 -0
- package/package.json +131 -0
- package/scripts/constants/committee-indicator-map.d.ts +199 -0
- package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
- package/scripts/constants/committee-indicator-map.js +1224 -0
- package/scripts/constants/committee-indicator-map.js.map +1 -0
- package/scripts/constants/config.d.ts +38 -0
- package/scripts/constants/config.d.ts.map +1 -0
- package/scripts/constants/config.js +66 -0
- package/scripts/constants/config.js.map +1 -0
- package/scripts/constants/language-articles.d.ts +84 -0
- package/scripts/constants/language-articles.d.ts.map +1 -0
- package/scripts/constants/language-articles.js +6771 -0
- package/scripts/constants/language-articles.js.map +1 -0
- package/scripts/constants/language-core.d.ts +38 -0
- package/scripts/constants/language-core.d.ts.map +1 -0
- package/scripts/constants/language-core.js +90 -0
- package/scripts/constants/language-core.js.map +1 -0
- package/scripts/constants/language-ui.d.ts +82 -0
- package/scripts/constants/language-ui.d.ts.map +1 -0
- package/scripts/constants/language-ui.js +889 -0
- package/scripts/constants/language-ui.js.map +1 -0
- package/scripts/constants/languages.d.ts +14 -0
- package/scripts/constants/languages.d.ts.map +1 -0
- package/scripts/constants/languages.js +15 -0
- package/scripts/constants/languages.js.map +1 -0
- package/scripts/generators/analysis-builders.d.ts +266 -0
- package/scripts/generators/analysis-builders.d.ts.map +1 -0
- package/scripts/generators/analysis-builders.js +2903 -0
- package/scripts/generators/analysis-builders.js.map +1 -0
- package/scripts/generators/breaking-content.d.ts +45 -0
- package/scripts/generators/breaking-content.d.ts.map +1 -0
- package/scripts/generators/breaking-content.js +530 -0
- package/scripts/generators/breaking-content.js.map +1 -0
- package/scripts/generators/committee-helpers.d.ts +54 -0
- package/scripts/generators/committee-helpers.d.ts.map +1 -0
- package/scripts/generators/committee-helpers.js +154 -0
- package/scripts/generators/committee-helpers.js.map +1 -0
- package/scripts/generators/dashboard-content.d.ts +95 -0
- package/scripts/generators/dashboard-content.d.ts.map +1 -0
- package/scripts/generators/dashboard-content.js +630 -0
- package/scripts/generators/dashboard-content.js.map +1 -0
- package/scripts/generators/deep-analysis-content.d.ts +23 -0
- package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
- package/scripts/generators/deep-analysis-content.js +831 -0
- package/scripts/generators/deep-analysis-content.js.map +1 -0
- package/scripts/generators/mindmap-content.d.ts +55 -0
- package/scripts/generators/mindmap-content.d.ts.map +1 -0
- package/scripts/generators/mindmap-content.js +512 -0
- package/scripts/generators/mindmap-content.js.map +1 -0
- package/scripts/generators/motions-content.d.ts +50 -0
- package/scripts/generators/motions-content.d.ts.map +1 -0
- package/scripts/generators/motions-content.js +391 -0
- package/scripts/generators/motions-content.js.map +1 -0
- package/scripts/generators/news-enhanced.d.ts +14 -0
- package/scripts/generators/news-enhanced.d.ts.map +1 -0
- package/scripts/generators/news-enhanced.js +169 -0
- package/scripts/generators/news-enhanced.js.map +1 -0
- package/scripts/generators/news-indexes.d.ts +31 -0
- package/scripts/generators/news-indexes.d.ts.map +1 -0
- package/scripts/generators/news-indexes.js +410 -0
- package/scripts/generators/news-indexes.js.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
- package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/fetch-stage.js +1522 -0
- package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
- package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
- package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/generate-stage.js +204 -0
- package/scripts/generators/pipeline/generate-stage.js.map +1 -0
- package/scripts/generators/pipeline/output-stage.d.ts +48 -0
- package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/output-stage.js +145 -0
- package/scripts/generators/pipeline/output-stage.js.map +1 -0
- package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
- package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
- package/scripts/generators/pipeline/transform-stage.js +111 -0
- package/scripts/generators/pipeline/transform-stage.js.map +1 -0
- package/scripts/generators/propositions-content.d.ts +29 -0
- package/scripts/generators/propositions-content.d.ts.map +1 -0
- package/scripts/generators/propositions-content.js +90 -0
- package/scripts/generators/propositions-content.js.map +1 -0
- package/scripts/generators/sankey-content.d.ts +45 -0
- package/scripts/generators/sankey-content.d.ts.map +1 -0
- package/scripts/generators/sankey-content.js +227 -0
- package/scripts/generators/sankey-content.js.map +1 -0
- package/scripts/generators/sitemap.d.ts +66 -0
- package/scripts/generators/sitemap.d.ts.map +1 -0
- package/scripts/generators/sitemap.js +562 -0
- package/scripts/generators/sitemap.js.map +1 -0
- package/scripts/generators/strategies/article-strategy.d.ts +146 -0
- package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/article-strategy.js +4 -0
- package/scripts/generators/strategies/article-strategy.js.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
- package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
- package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
- package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
- package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
- package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
- package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
- package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
- package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
- package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
- package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/motions-strategy.js +215 -0
- package/scripts/generators/strategies/motions-strategy.js.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
- package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/propositions-strategy.js +257 -0
- package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
- package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
- package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
- package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
- package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
- package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
- package/scripts/generators/swot-content.d.ts +42 -0
- package/scripts/generators/swot-content.d.ts.map +1 -0
- package/scripts/generators/swot-content.js +366 -0
- package/scripts/generators/swot-content.js.map +1 -0
- package/scripts/generators/week-ahead-content.d.ts +103 -0
- package/scripts/generators/week-ahead-content.d.ts.map +1 -0
- package/scripts/generators/week-ahead-content.js +610 -0
- package/scripts/generators/week-ahead-content.js.map +1 -0
- package/scripts/index.d.ts +40 -0
- package/scripts/index.d.ts.map +1 -0
- package/scripts/index.js +53 -0
- package/scripts/index.js.map +1 -0
- package/scripts/mcp/ep-mcp-client.d.ts +471 -0
- package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/ep-mcp-client.js +734 -0
- package/scripts/mcp/ep-mcp-client.js.map +1 -0
- package/scripts/mcp/mcp-connection.d.ts +264 -0
- package/scripts/mcp/mcp-connection.d.ts.map +1 -0
- package/scripts/mcp/mcp-connection.js +790 -0
- package/scripts/mcp/mcp-connection.js.map +1 -0
- package/scripts/mcp/mcp-health.d.ts +75 -0
- package/scripts/mcp/mcp-health.d.ts.map +1 -0
- package/scripts/mcp/mcp-health.js +78 -0
- package/scripts/mcp/mcp-health.js.map +1 -0
- package/scripts/mcp/mcp-retry.d.ts +94 -0
- package/scripts/mcp/mcp-retry.d.ts.map +1 -0
- package/scripts/mcp/mcp-retry.js +127 -0
- package/scripts/mcp/mcp-retry.js.map +1 -0
- package/scripts/mcp/wb-mcp-client.d.ts +38 -0
- package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
- package/scripts/mcp/wb-mcp-client.js +112 -0
- package/scripts/mcp/wb-mcp-client.js.map +1 -0
- package/scripts/templates/article-template.d.ts +9 -0
- package/scripts/templates/article-template.d.ts.map +1 -0
- package/scripts/templates/article-template.js +378 -0
- package/scripts/templates/article-template.js.map +1 -0
- package/scripts/templates/section-builders.d.ts +28 -0
- package/scripts/templates/section-builders.d.ts.map +1 -0
- package/scripts/templates/section-builders.js +142 -0
- package/scripts/templates/section-builders.js.map +1 -0
- package/scripts/types/analysis.d.ts +115 -0
- package/scripts/types/analysis.d.ts.map +1 -0
- package/scripts/types/analysis.js +4 -0
- package/scripts/types/analysis.js.map +1 -0
- package/scripts/types/common.d.ts +584 -0
- package/scripts/types/common.d.ts.map +1 -0
- package/scripts/types/common.js +96 -0
- package/scripts/types/common.js.map +1 -0
- package/scripts/types/generation.d.ts +104 -0
- package/scripts/types/generation.d.ts.map +1 -0
- package/scripts/types/generation.js +4 -0
- package/scripts/types/generation.js.map +1 -0
- package/scripts/types/index.d.ts +24 -0
- package/scripts/types/index.d.ts.map +1 -0
- package/scripts/types/index.js +16 -0
- package/scripts/types/index.js.map +1 -0
- package/scripts/types/intelligence.d.ts +129 -0
- package/scripts/types/intelligence.d.ts.map +1 -0
- package/scripts/types/intelligence.js +4 -0
- package/scripts/types/intelligence.js.map +1 -0
- package/scripts/types/mcp.d.ts +418 -0
- package/scripts/types/mcp.d.ts.map +1 -0
- package/scripts/types/mcp.js +4 -0
- package/scripts/types/mcp.js.map +1 -0
- package/scripts/types/parliament.d.ts +388 -0
- package/scripts/types/parliament.d.ts.map +1 -0
- package/scripts/types/parliament.js +4 -0
- package/scripts/types/parliament.js.map +1 -0
- package/scripts/types/quality.d.ts +114 -0
- package/scripts/types/quality.d.ts.map +1 -0
- package/scripts/types/quality.js +4 -0
- package/scripts/types/quality.js.map +1 -0
- package/scripts/types/stakeholder.d.ts +88 -0
- package/scripts/types/stakeholder.d.ts.map +1 -0
- package/scripts/types/stakeholder.js +16 -0
- package/scripts/types/stakeholder.js.map +1 -0
- package/scripts/types/visualization.d.ts +708 -0
- package/scripts/types/visualization.d.ts.map +1 -0
- package/scripts/types/visualization.js +4 -0
- package/scripts/types/visualization.js.map +1 -0
- package/scripts/types/world-bank.d.ts +85 -0
- package/scripts/types/world-bank.d.ts.map +1 -0
- package/scripts/types/world-bank.js +4 -0
- package/scripts/types/world-bank.js.map +1 -0
- package/scripts/utils/article-category.d.ts +18 -0
- package/scripts/utils/article-category.d.ts.map +1 -0
- package/scripts/utils/article-category.js +49 -0
- package/scripts/utils/article-category.js.map +1 -0
- package/scripts/utils/article-quality-scorer.d.ts +87 -0
- package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
- package/scripts/utils/article-quality-scorer.js +1048 -0
- package/scripts/utils/article-quality-scorer.js.map +1 -0
- package/scripts/utils/content-metadata.d.ts +34 -0
- package/scripts/utils/content-metadata.d.ts.map +1 -0
- package/scripts/utils/content-metadata.js +249 -0
- package/scripts/utils/content-metadata.js.map +1 -0
- package/scripts/utils/content-validator.d.ts +94 -0
- package/scripts/utils/content-validator.d.ts.map +1 -0
- package/scripts/utils/content-validator.js +489 -0
- package/scripts/utils/content-validator.js.map +1 -0
- package/scripts/utils/copy-test-reports.d.ts +9 -0
- package/scripts/utils/copy-test-reports.d.ts.map +1 -0
- package/scripts/utils/copy-test-reports.js +508 -0
- package/scripts/utils/copy-test-reports.js.map +1 -0
- package/scripts/utils/file-utils.d.ts +144 -0
- package/scripts/utils/file-utils.d.ts.map +1 -0
- package/scripts/utils/file-utils.js +374 -0
- package/scripts/utils/file-utils.js.map +1 -0
- package/scripts/utils/fix-articles.d.ts +27 -0
- package/scripts/utils/fix-articles.d.ts.map +1 -0
- package/scripts/utils/fix-articles.js +510 -0
- package/scripts/utils/fix-articles.js.map +1 -0
- package/scripts/utils/generate-docs-index.d.ts +8 -0
- package/scripts/utils/generate-docs-index.d.ts.map +1 -0
- package/scripts/utils/generate-docs-index.js +275 -0
- package/scripts/utils/generate-docs-index.js.map +1 -0
- package/scripts/utils/html-sanitize.d.ts +18 -0
- package/scripts/utils/html-sanitize.d.ts.map +1 -0
- package/scripts/utils/html-sanitize.js +57 -0
- package/scripts/utils/html-sanitize.js.map +1 -0
- package/scripts/utils/intelligence-analysis.d.ts +173 -0
- package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
- package/scripts/utils/intelligence-analysis.js +936 -0
- package/scripts/utils/intelligence-analysis.js.map +1 -0
- package/scripts/utils/intelligence-index.d.ts +126 -0
- package/scripts/utils/intelligence-index.d.ts.map +1 -0
- package/scripts/utils/intelligence-index.js +731 -0
- package/scripts/utils/intelligence-index.js.map +1 -0
- package/scripts/utils/metadata-utils.d.ts +14 -0
- package/scripts/utils/metadata-utils.d.ts.map +1 -0
- package/scripts/utils/metadata-utils.js +18 -0
- package/scripts/utils/metadata-utils.js.map +1 -0
- package/scripts/utils/news-metadata.d.ts +47 -0
- package/scripts/utils/news-metadata.d.ts.map +1 -0
- package/scripts/utils/news-metadata.js +259 -0
- package/scripts/utils/news-metadata.js.map +1 -0
- package/scripts/utils/validate-articles.d.ts +2 -0
- package/scripts/utils/validate-articles.d.ts.map +1 -0
- package/scripts/utils/validate-articles.js +284 -0
- package/scripts/utils/validate-articles.js.map +1 -0
- package/scripts/utils/validate-ep-api.d.ts +51 -0
- package/scripts/utils/validate-ep-api.d.ts.map +1 -0
- package/scripts/utils/validate-ep-api.js +160 -0
- package/scripts/utils/validate-ep-api.js.map +1 -0
- package/scripts/utils/world-bank-data.d.ts +84 -0
- package/scripts/utils/world-bank-data.d.ts.map +1 -0
- package/scripts/utils/world-bank-data.js +311 -0
- package/scripts/utils/world-bank-data.js.map +1 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2024-2026 Hack23 AB
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { escapeHTML } from './file-utils.js';
|
|
4
|
+
// ─── EU Member State → World Bank Country Code Mapping ───────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* Maps EU member state ISO 3166-1 alpha-2 codes to World Bank alpha-3 codes.
|
|
7
|
+
* Covers all 27 EU member states.
|
|
8
|
+
*/
|
|
9
|
+
export const EU_COUNTRY_CODES = {
|
|
10
|
+
AT: 'AUT', // Austria
|
|
11
|
+
BE: 'BEL', // Belgium
|
|
12
|
+
BG: 'BGR', // Bulgaria
|
|
13
|
+
HR: 'HRV', // Croatia
|
|
14
|
+
CY: 'CYP', // Cyprus
|
|
15
|
+
CZ: 'CZE', // Czech Republic
|
|
16
|
+
DK: 'DNK', // Denmark
|
|
17
|
+
EE: 'EST', // Estonia
|
|
18
|
+
FI: 'FIN', // Finland
|
|
19
|
+
FR: 'FRA', // France
|
|
20
|
+
DE: 'DEU', // Germany
|
|
21
|
+
GR: 'GRC', // Greece
|
|
22
|
+
HU: 'HUN', // Hungary
|
|
23
|
+
IE: 'IRL', // Ireland
|
|
24
|
+
IT: 'ITA', // Italy
|
|
25
|
+
LV: 'LVA', // Latvia
|
|
26
|
+
LT: 'LTU', // Lithuania
|
|
27
|
+
LU: 'LUX', // Luxembourg
|
|
28
|
+
MT: 'MLT', // Malta
|
|
29
|
+
NL: 'NLD', // Netherlands
|
|
30
|
+
PL: 'POL', // Poland
|
|
31
|
+
PT: 'PRT', // Portugal
|
|
32
|
+
RO: 'ROU', // Romania
|
|
33
|
+
SK: 'SVK', // Slovakia
|
|
34
|
+
SI: 'SVN', // Slovenia
|
|
35
|
+
ES: 'ESP', // Spain
|
|
36
|
+
SE: 'SWE', // Sweden
|
|
37
|
+
};
|
|
38
|
+
/** EU aggregate code in World Bank (European Union) */
|
|
39
|
+
export const EU_AGGREGATE_CODE = 'EUU';
|
|
40
|
+
/**
|
|
41
|
+
* World Bank indicator IDs relevant to EU Parliament policy analysis.
|
|
42
|
+
* These indicators map to common policy areas discussed in EP legislation.
|
|
43
|
+
*/
|
|
44
|
+
export const POLICY_INDICATORS = {
|
|
45
|
+
gdp: 'NY.GDP.MKTP.CD',
|
|
46
|
+
gdpGrowth: 'NY.GDP.MKTP.KD.ZG',
|
|
47
|
+
inflation: 'FP.CPI.TOTL.ZG',
|
|
48
|
+
unemployment: 'SL.UEM.TOTL.ZS',
|
|
49
|
+
trade: 'NE.TRD.GNFS.ZS',
|
|
50
|
+
co2Emissions: 'EN.ATM.CO2E.PC',
|
|
51
|
+
population: 'SP.POP.TOTL',
|
|
52
|
+
rdExpenditure: 'GB.XPD.RSDV.GD.ZS',
|
|
53
|
+
};
|
|
54
|
+
// ─── CSV Parsing ─────────────────────────────────────────────────────────────
|
|
55
|
+
/** Known CSV header aliases for each World Bank field */
|
|
56
|
+
const HEADER_ALIASES = {
|
|
57
|
+
country: ['country.id', 'countryiso3code', 'country_id'],
|
|
58
|
+
countryName: ['country.value', 'country_name', 'country'],
|
|
59
|
+
indicator: ['indicator.id', 'indicator_id'],
|
|
60
|
+
indicatorName: ['indicator.value', 'indicator_name', 'indicator'],
|
|
61
|
+
date: ['date', 'year'],
|
|
62
|
+
value: ['value'],
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Find the column index for a field by matching header aliases.
|
|
66
|
+
*
|
|
67
|
+
* @param headers - Lowercase header names
|
|
68
|
+
* @param aliases - Allowed header aliases for the field
|
|
69
|
+
* @returns Column index or -1 if not found
|
|
70
|
+
*/
|
|
71
|
+
function findColumnIndex(headers, aliases) {
|
|
72
|
+
return headers.findIndex((h) => aliases.includes(h));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Safely read a column value from a row.
|
|
76
|
+
*
|
|
77
|
+
* @param cols - Split row columns
|
|
78
|
+
* @param idx - Column index (-1 means absent)
|
|
79
|
+
* @returns Column value or empty string
|
|
80
|
+
*/
|
|
81
|
+
function readCol(cols, idx) {
|
|
82
|
+
return idx >= 0 ? (cols[idx] ?? '') : '';
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Split a CSV line respecting quoted fields (RFC 4180).
|
|
86
|
+
* Commas inside double-quoted values are preserved as part of the field.
|
|
87
|
+
* Escaped quotes (`""`) inside a quoted field are treated as a literal `"`.
|
|
88
|
+
*
|
|
89
|
+
* @param line - A single CSV row
|
|
90
|
+
* @returns Array of field values with surrounding quotes removed
|
|
91
|
+
*/
|
|
92
|
+
function splitCSVLine(line) {
|
|
93
|
+
const fields = [];
|
|
94
|
+
let current = '';
|
|
95
|
+
let inQuotes = false;
|
|
96
|
+
for (let i = 0; i < line.length; i++) {
|
|
97
|
+
const ch = line[i];
|
|
98
|
+
if (ch === '"') {
|
|
99
|
+
if (inQuotes && i + 1 < line.length && line[i + 1] === '"') {
|
|
100
|
+
// RFC 4180 escaped quote: "" → literal "
|
|
101
|
+
current += '"';
|
|
102
|
+
i++; // skip the second quote
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
inQuotes = !inQuotes;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (ch === ',' && !inQuotes) {
|
|
109
|
+
fields.push(current.trim());
|
|
110
|
+
current = '';
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
current += ch;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
fields.push(current.trim());
|
|
117
|
+
return fields;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Parse CSV data from World Bank MCP response into structured indicator objects.
|
|
121
|
+
* The World Bank MCP server returns indicator data as CSV text via pandas.
|
|
122
|
+
* Handles quoted fields that may contain commas (e.g., indicator names).
|
|
123
|
+
*
|
|
124
|
+
* @param csvText - Raw CSV text from the MCP tool response (accepts null/undefined for convenience)
|
|
125
|
+
* @returns Array of parsed World Bank indicator data points
|
|
126
|
+
*/
|
|
127
|
+
export function parseWorldBankCSV(csvText) {
|
|
128
|
+
if (!csvText || typeof csvText !== 'string') {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const lines = csvText.trim().split(/\r?\n/);
|
|
132
|
+
if (lines.length < 2) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const headers = splitCSVLine(lines[0]).map((h) => h.toLowerCase());
|
|
136
|
+
const colMap = Object.fromEntries(Object.entries(HEADER_ALIASES).map(([key, aliases]) => [key, findColumnIndex(headers, aliases)]));
|
|
137
|
+
const results = [];
|
|
138
|
+
for (let i = 1; i < lines.length; i++) {
|
|
139
|
+
const cols = splitCSVLine(lines[i]);
|
|
140
|
+
const rawValue = readCol(cols, colMap['value'] ?? -1);
|
|
141
|
+
const parsedValue = rawValue !== '' ? Number(rawValue) : null;
|
|
142
|
+
const yearStr = readCol(cols, colMap['date'] ?? -1);
|
|
143
|
+
const year = yearStr ? parseInt(yearStr, 10) : 0;
|
|
144
|
+
if (year > 0) {
|
|
145
|
+
results.push({
|
|
146
|
+
countryId: readCol(cols, colMap['country'] ?? -1),
|
|
147
|
+
countryName: readCol(cols, colMap['countryName'] ?? -1),
|
|
148
|
+
indicatorId: readCol(cols, colMap['indicator'] ?? -1),
|
|
149
|
+
indicatorName: readCol(cols, colMap['indicatorName'] ?? -1),
|
|
150
|
+
year,
|
|
151
|
+
value: Number.isFinite(parsedValue) ? parsedValue : null,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return results;
|
|
156
|
+
}
|
|
157
|
+
// ─── Value Formatting ────────────────────────────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* Format a numeric value for display based on the indicator type.
|
|
160
|
+
*
|
|
161
|
+
* @param value - The numeric value to format
|
|
162
|
+
* @param indicatorId - The World Bank indicator ID (determines formatting style)
|
|
163
|
+
* @returns Formatted display string
|
|
164
|
+
*/
|
|
165
|
+
export function formatIndicatorValue(value, indicatorId) {
|
|
166
|
+
if (value === null || !Number.isFinite(value)) {
|
|
167
|
+
return 'N/A';
|
|
168
|
+
}
|
|
169
|
+
// GDP - format as currency with magnitude suffix
|
|
170
|
+
if (indicatorId === POLICY_INDICATORS.gdp) {
|
|
171
|
+
if (Math.abs(value) >= 1e12) {
|
|
172
|
+
return `$${(value / 1e12).toFixed(1)}T`;
|
|
173
|
+
}
|
|
174
|
+
if (Math.abs(value) >= 1e9) {
|
|
175
|
+
return `$${(value / 1e9).toFixed(1)}B`;
|
|
176
|
+
}
|
|
177
|
+
if (Math.abs(value) >= 1e6) {
|
|
178
|
+
return `$${(value / 1e6).toFixed(1)}M`;
|
|
179
|
+
}
|
|
180
|
+
return `$${value.toFixed(0)}`;
|
|
181
|
+
}
|
|
182
|
+
// Population - format with magnitude suffix
|
|
183
|
+
if (indicatorId === POLICY_INDICATORS.population) {
|
|
184
|
+
if (Math.abs(value) >= 1e9) {
|
|
185
|
+
return `${(value / 1e9).toFixed(2)}B`;
|
|
186
|
+
}
|
|
187
|
+
if (Math.abs(value) >= 1e6) {
|
|
188
|
+
return `${(value / 1e6).toFixed(1)}M`;
|
|
189
|
+
}
|
|
190
|
+
return `${value.toFixed(0)}`;
|
|
191
|
+
}
|
|
192
|
+
// Percentage indicators
|
|
193
|
+
if (indicatorId === POLICY_INDICATORS.gdpGrowth ||
|
|
194
|
+
indicatorId === POLICY_INDICATORS.inflation ||
|
|
195
|
+
indicatorId === POLICY_INDICATORS.unemployment ||
|
|
196
|
+
indicatorId === POLICY_INDICATORS.trade ||
|
|
197
|
+
indicatorId === POLICY_INDICATORS.rdExpenditure) {
|
|
198
|
+
return `${value.toFixed(1)}%`;
|
|
199
|
+
}
|
|
200
|
+
// CO2 emissions - metric tons per capita
|
|
201
|
+
if (indicatorId === POLICY_INDICATORS.co2Emissions) {
|
|
202
|
+
return `${value.toFixed(1)} t/cap`;
|
|
203
|
+
}
|
|
204
|
+
return value.toFixed(2);
|
|
205
|
+
}
|
|
206
|
+
// ─── Most Recent Value ───────────────────────────────────────────────────────
|
|
207
|
+
/**
|
|
208
|
+
* Extract the most recent non-null data point from a series of World Bank indicators.
|
|
209
|
+
*
|
|
210
|
+
* @param indicators - Array of indicator data points
|
|
211
|
+
* @returns The most recent data point with a non-null value, or null if none found
|
|
212
|
+
*/
|
|
213
|
+
export function getMostRecentValue(indicators) {
|
|
214
|
+
const withValues = indicators.filter((i) => i.value !== null);
|
|
215
|
+
if (withValues.length === 0) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
withValues.sort((a, b) => b.year - a.year);
|
|
219
|
+
return withValues[0] ?? null;
|
|
220
|
+
}
|
|
221
|
+
// ─── Economic Context Builder ────────────────────────────────────────────────
|
|
222
|
+
/**
|
|
223
|
+
* Build an economic context summary from raw World Bank indicator data.
|
|
224
|
+
*
|
|
225
|
+
* @param countryCode - EU member state ISO2 code
|
|
226
|
+
* @param countryName - Country display name
|
|
227
|
+
* @param indicatorData - Map of indicator ID to parsed data points
|
|
228
|
+
* @returns Structured economic context for article enrichment
|
|
229
|
+
*/
|
|
230
|
+
export function buildEconomicContext(countryCode, countryName, indicatorData) {
|
|
231
|
+
const indicators = [];
|
|
232
|
+
const indicatorNames = {
|
|
233
|
+
[POLICY_INDICATORS.gdp]: 'GDP',
|
|
234
|
+
[POLICY_INDICATORS.gdpGrowth]: 'GDP Growth',
|
|
235
|
+
[POLICY_INDICATORS.inflation]: 'Inflation',
|
|
236
|
+
[POLICY_INDICATORS.unemployment]: 'Unemployment',
|
|
237
|
+
[POLICY_INDICATORS.trade]: 'Trade (% of GDP)',
|
|
238
|
+
[POLICY_INDICATORS.co2Emissions]: 'CO₂ Emissions',
|
|
239
|
+
[POLICY_INDICATORS.population]: 'Population',
|
|
240
|
+
[POLICY_INDICATORS.rdExpenditure]: 'R&D Expenditure',
|
|
241
|
+
};
|
|
242
|
+
for (const [indicatorId, dataPoints] of indicatorData) {
|
|
243
|
+
const recent = getMostRecentValue(dataPoints);
|
|
244
|
+
if (recent) {
|
|
245
|
+
indicators.push({
|
|
246
|
+
name: indicatorNames[indicatorId] ?? indicatorId,
|
|
247
|
+
indicatorId,
|
|
248
|
+
value: recent.value,
|
|
249
|
+
year: recent.year,
|
|
250
|
+
formatted: formatIndicatorValue(recent.value, indicatorId),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
countryCode,
|
|
256
|
+
countryName,
|
|
257
|
+
indicators,
|
|
258
|
+
dataTimestamp: new Date().toISOString(),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// ─── EU Country Lookup ───────────────────────────────────────────────────────
|
|
262
|
+
/**
|
|
263
|
+
* Get the World Bank country code for an EU member state.
|
|
264
|
+
*
|
|
265
|
+
* @param iso2Code - EU member state ISO 3166-1 alpha-2 code (e.g., 'DE', 'FR')
|
|
266
|
+
* @returns World Bank alpha-3 code or null if not an EU member state
|
|
267
|
+
*/
|
|
268
|
+
export function getWorldBankCountryCode(iso2Code) {
|
|
269
|
+
const upper = iso2Code.toUpperCase();
|
|
270
|
+
return EU_COUNTRY_CODES[upper] ?? null;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Check if a country code corresponds to an EU member state.
|
|
274
|
+
*
|
|
275
|
+
* @param iso2Code - ISO 3166-1 alpha-2 country code
|
|
276
|
+
* @returns True if the country is an EU member state
|
|
277
|
+
*/
|
|
278
|
+
export function isEUMemberState(iso2Code) {
|
|
279
|
+
return iso2Code.toUpperCase() in EU_COUNTRY_CODES;
|
|
280
|
+
}
|
|
281
|
+
// ─── HTML Context Section ────────────────────────────────────────────────────
|
|
282
|
+
/**
|
|
283
|
+
* Generate an HTML section with economic context data for article embedding.
|
|
284
|
+
*
|
|
285
|
+
* Note: UI strings are currently in English. A future enhancement should accept
|
|
286
|
+
* a `lang` parameter and use localized string maps (similar to `WEEK_AHEAD_STRINGS`)
|
|
287
|
+
* to support all 14 article languages.
|
|
288
|
+
*
|
|
289
|
+
* @param context - Economic context data
|
|
290
|
+
* @returns Sanitized HTML string for the economic context section
|
|
291
|
+
*/
|
|
292
|
+
export function buildEconomicContextHTML(context) {
|
|
293
|
+
if (context.indicators.length === 0) {
|
|
294
|
+
return '';
|
|
295
|
+
}
|
|
296
|
+
const rows = context.indicators
|
|
297
|
+
.map((ind) => `<tr><td>${escapeHTML(ind.name)}</td><td>${escapeHTML(ind.formatted)}</td><td>${escapeHTML(String(ind.year))}</td></tr>`)
|
|
298
|
+
.join('\n');
|
|
299
|
+
return `<section class="economic-context" aria-label="Economic indicators for ${escapeHTML(context.countryName)}">
|
|
300
|
+
<h2>Economic Context: ${escapeHTML(context.countryName)}</h2>
|
|
301
|
+
<table>
|
|
302
|
+
<caption>Economic indicators for ${escapeHTML(context.countryName)}</caption>
|
|
303
|
+
<thead><tr><th scope="col">Indicator</th><th scope="col">Value</th><th scope="col">Year</th></tr></thead>
|
|
304
|
+
<tbody>
|
|
305
|
+
${rows}
|
|
306
|
+
</tbody>
|
|
307
|
+
</table>
|
|
308
|
+
<p class="data-source">Source: World Bank Open Data</p>
|
|
309
|
+
</section>`;
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=world-bank-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world-bank-data.js","sourceRoot":"","sources":["../../src/utils/world-bank-data.ts"],"names":[],"mappings":"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"}
|