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.
Files changed (276) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1005 -0
  3. package/SECURITY.md +151 -0
  4. package/package.json +131 -0
  5. package/scripts/constants/committee-indicator-map.d.ts +199 -0
  6. package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
  7. package/scripts/constants/committee-indicator-map.js +1224 -0
  8. package/scripts/constants/committee-indicator-map.js.map +1 -0
  9. package/scripts/constants/config.d.ts +38 -0
  10. package/scripts/constants/config.d.ts.map +1 -0
  11. package/scripts/constants/config.js +66 -0
  12. package/scripts/constants/config.js.map +1 -0
  13. package/scripts/constants/language-articles.d.ts +84 -0
  14. package/scripts/constants/language-articles.d.ts.map +1 -0
  15. package/scripts/constants/language-articles.js +6771 -0
  16. package/scripts/constants/language-articles.js.map +1 -0
  17. package/scripts/constants/language-core.d.ts +38 -0
  18. package/scripts/constants/language-core.d.ts.map +1 -0
  19. package/scripts/constants/language-core.js +90 -0
  20. package/scripts/constants/language-core.js.map +1 -0
  21. package/scripts/constants/language-ui.d.ts +82 -0
  22. package/scripts/constants/language-ui.d.ts.map +1 -0
  23. package/scripts/constants/language-ui.js +889 -0
  24. package/scripts/constants/language-ui.js.map +1 -0
  25. package/scripts/constants/languages.d.ts +14 -0
  26. package/scripts/constants/languages.d.ts.map +1 -0
  27. package/scripts/constants/languages.js +15 -0
  28. package/scripts/constants/languages.js.map +1 -0
  29. package/scripts/generators/analysis-builders.d.ts +266 -0
  30. package/scripts/generators/analysis-builders.d.ts.map +1 -0
  31. package/scripts/generators/analysis-builders.js +2903 -0
  32. package/scripts/generators/analysis-builders.js.map +1 -0
  33. package/scripts/generators/breaking-content.d.ts +45 -0
  34. package/scripts/generators/breaking-content.d.ts.map +1 -0
  35. package/scripts/generators/breaking-content.js +530 -0
  36. package/scripts/generators/breaking-content.js.map +1 -0
  37. package/scripts/generators/committee-helpers.d.ts +54 -0
  38. package/scripts/generators/committee-helpers.d.ts.map +1 -0
  39. package/scripts/generators/committee-helpers.js +154 -0
  40. package/scripts/generators/committee-helpers.js.map +1 -0
  41. package/scripts/generators/dashboard-content.d.ts +95 -0
  42. package/scripts/generators/dashboard-content.d.ts.map +1 -0
  43. package/scripts/generators/dashboard-content.js +630 -0
  44. package/scripts/generators/dashboard-content.js.map +1 -0
  45. package/scripts/generators/deep-analysis-content.d.ts +23 -0
  46. package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
  47. package/scripts/generators/deep-analysis-content.js +831 -0
  48. package/scripts/generators/deep-analysis-content.js.map +1 -0
  49. package/scripts/generators/mindmap-content.d.ts +55 -0
  50. package/scripts/generators/mindmap-content.d.ts.map +1 -0
  51. package/scripts/generators/mindmap-content.js +512 -0
  52. package/scripts/generators/mindmap-content.js.map +1 -0
  53. package/scripts/generators/motions-content.d.ts +50 -0
  54. package/scripts/generators/motions-content.d.ts.map +1 -0
  55. package/scripts/generators/motions-content.js +391 -0
  56. package/scripts/generators/motions-content.js.map +1 -0
  57. package/scripts/generators/news-enhanced.d.ts +14 -0
  58. package/scripts/generators/news-enhanced.d.ts.map +1 -0
  59. package/scripts/generators/news-enhanced.js +169 -0
  60. package/scripts/generators/news-enhanced.js.map +1 -0
  61. package/scripts/generators/news-indexes.d.ts +31 -0
  62. package/scripts/generators/news-indexes.d.ts.map +1 -0
  63. package/scripts/generators/news-indexes.js +410 -0
  64. package/scripts/generators/news-indexes.js.map +1 -0
  65. package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
  66. package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
  67. package/scripts/generators/pipeline/fetch-stage.js +1522 -0
  68. package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
  69. package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
  70. package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
  71. package/scripts/generators/pipeline/generate-stage.js +204 -0
  72. package/scripts/generators/pipeline/generate-stage.js.map +1 -0
  73. package/scripts/generators/pipeline/output-stage.d.ts +48 -0
  74. package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
  75. package/scripts/generators/pipeline/output-stage.js +145 -0
  76. package/scripts/generators/pipeline/output-stage.js.map +1 -0
  77. package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
  78. package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
  79. package/scripts/generators/pipeline/transform-stage.js +111 -0
  80. package/scripts/generators/pipeline/transform-stage.js.map +1 -0
  81. package/scripts/generators/propositions-content.d.ts +29 -0
  82. package/scripts/generators/propositions-content.d.ts.map +1 -0
  83. package/scripts/generators/propositions-content.js +90 -0
  84. package/scripts/generators/propositions-content.js.map +1 -0
  85. package/scripts/generators/sankey-content.d.ts +45 -0
  86. package/scripts/generators/sankey-content.d.ts.map +1 -0
  87. package/scripts/generators/sankey-content.js +227 -0
  88. package/scripts/generators/sankey-content.js.map +1 -0
  89. package/scripts/generators/sitemap.d.ts +66 -0
  90. package/scripts/generators/sitemap.d.ts.map +1 -0
  91. package/scripts/generators/sitemap.js +562 -0
  92. package/scripts/generators/sitemap.js.map +1 -0
  93. package/scripts/generators/strategies/article-strategy.d.ts +146 -0
  94. package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
  95. package/scripts/generators/strategies/article-strategy.js +4 -0
  96. package/scripts/generators/strategies/article-strategy.js.map +1 -0
  97. package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
  98. package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
  99. package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
  100. package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
  101. package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
  102. package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
  103. package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
  104. package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
  105. package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
  106. package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
  107. package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
  108. package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
  109. package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
  110. package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
  111. package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
  112. package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
  113. package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
  114. package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
  115. package/scripts/generators/strategies/motions-strategy.js +215 -0
  116. package/scripts/generators/strategies/motions-strategy.js.map +1 -0
  117. package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
  118. package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
  119. package/scripts/generators/strategies/propositions-strategy.js +257 -0
  120. package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
  121. package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
  122. package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
  123. package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
  124. package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
  125. package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
  126. package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
  127. package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
  128. package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
  129. package/scripts/generators/swot-content.d.ts +42 -0
  130. package/scripts/generators/swot-content.d.ts.map +1 -0
  131. package/scripts/generators/swot-content.js +366 -0
  132. package/scripts/generators/swot-content.js.map +1 -0
  133. package/scripts/generators/week-ahead-content.d.ts +103 -0
  134. package/scripts/generators/week-ahead-content.d.ts.map +1 -0
  135. package/scripts/generators/week-ahead-content.js +610 -0
  136. package/scripts/generators/week-ahead-content.js.map +1 -0
  137. package/scripts/index.d.ts +40 -0
  138. package/scripts/index.d.ts.map +1 -0
  139. package/scripts/index.js +53 -0
  140. package/scripts/index.js.map +1 -0
  141. package/scripts/mcp/ep-mcp-client.d.ts +471 -0
  142. package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
  143. package/scripts/mcp/ep-mcp-client.js +734 -0
  144. package/scripts/mcp/ep-mcp-client.js.map +1 -0
  145. package/scripts/mcp/mcp-connection.d.ts +264 -0
  146. package/scripts/mcp/mcp-connection.d.ts.map +1 -0
  147. package/scripts/mcp/mcp-connection.js +790 -0
  148. package/scripts/mcp/mcp-connection.js.map +1 -0
  149. package/scripts/mcp/mcp-health.d.ts +75 -0
  150. package/scripts/mcp/mcp-health.d.ts.map +1 -0
  151. package/scripts/mcp/mcp-health.js +78 -0
  152. package/scripts/mcp/mcp-health.js.map +1 -0
  153. package/scripts/mcp/mcp-retry.d.ts +94 -0
  154. package/scripts/mcp/mcp-retry.d.ts.map +1 -0
  155. package/scripts/mcp/mcp-retry.js +127 -0
  156. package/scripts/mcp/mcp-retry.js.map +1 -0
  157. package/scripts/mcp/wb-mcp-client.d.ts +38 -0
  158. package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
  159. package/scripts/mcp/wb-mcp-client.js +112 -0
  160. package/scripts/mcp/wb-mcp-client.js.map +1 -0
  161. package/scripts/templates/article-template.d.ts +9 -0
  162. package/scripts/templates/article-template.d.ts.map +1 -0
  163. package/scripts/templates/article-template.js +378 -0
  164. package/scripts/templates/article-template.js.map +1 -0
  165. package/scripts/templates/section-builders.d.ts +28 -0
  166. package/scripts/templates/section-builders.d.ts.map +1 -0
  167. package/scripts/templates/section-builders.js +142 -0
  168. package/scripts/templates/section-builders.js.map +1 -0
  169. package/scripts/types/analysis.d.ts +115 -0
  170. package/scripts/types/analysis.d.ts.map +1 -0
  171. package/scripts/types/analysis.js +4 -0
  172. package/scripts/types/analysis.js.map +1 -0
  173. package/scripts/types/common.d.ts +584 -0
  174. package/scripts/types/common.d.ts.map +1 -0
  175. package/scripts/types/common.js +96 -0
  176. package/scripts/types/common.js.map +1 -0
  177. package/scripts/types/generation.d.ts +104 -0
  178. package/scripts/types/generation.d.ts.map +1 -0
  179. package/scripts/types/generation.js +4 -0
  180. package/scripts/types/generation.js.map +1 -0
  181. package/scripts/types/index.d.ts +24 -0
  182. package/scripts/types/index.d.ts.map +1 -0
  183. package/scripts/types/index.js +16 -0
  184. package/scripts/types/index.js.map +1 -0
  185. package/scripts/types/intelligence.d.ts +129 -0
  186. package/scripts/types/intelligence.d.ts.map +1 -0
  187. package/scripts/types/intelligence.js +4 -0
  188. package/scripts/types/intelligence.js.map +1 -0
  189. package/scripts/types/mcp.d.ts +418 -0
  190. package/scripts/types/mcp.d.ts.map +1 -0
  191. package/scripts/types/mcp.js +4 -0
  192. package/scripts/types/mcp.js.map +1 -0
  193. package/scripts/types/parliament.d.ts +388 -0
  194. package/scripts/types/parliament.d.ts.map +1 -0
  195. package/scripts/types/parliament.js +4 -0
  196. package/scripts/types/parliament.js.map +1 -0
  197. package/scripts/types/quality.d.ts +114 -0
  198. package/scripts/types/quality.d.ts.map +1 -0
  199. package/scripts/types/quality.js +4 -0
  200. package/scripts/types/quality.js.map +1 -0
  201. package/scripts/types/stakeholder.d.ts +88 -0
  202. package/scripts/types/stakeholder.d.ts.map +1 -0
  203. package/scripts/types/stakeholder.js +16 -0
  204. package/scripts/types/stakeholder.js.map +1 -0
  205. package/scripts/types/visualization.d.ts +708 -0
  206. package/scripts/types/visualization.d.ts.map +1 -0
  207. package/scripts/types/visualization.js +4 -0
  208. package/scripts/types/visualization.js.map +1 -0
  209. package/scripts/types/world-bank.d.ts +85 -0
  210. package/scripts/types/world-bank.d.ts.map +1 -0
  211. package/scripts/types/world-bank.js +4 -0
  212. package/scripts/types/world-bank.js.map +1 -0
  213. package/scripts/utils/article-category.d.ts +18 -0
  214. package/scripts/utils/article-category.d.ts.map +1 -0
  215. package/scripts/utils/article-category.js +49 -0
  216. package/scripts/utils/article-category.js.map +1 -0
  217. package/scripts/utils/article-quality-scorer.d.ts +87 -0
  218. package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
  219. package/scripts/utils/article-quality-scorer.js +1048 -0
  220. package/scripts/utils/article-quality-scorer.js.map +1 -0
  221. package/scripts/utils/content-metadata.d.ts +34 -0
  222. package/scripts/utils/content-metadata.d.ts.map +1 -0
  223. package/scripts/utils/content-metadata.js +249 -0
  224. package/scripts/utils/content-metadata.js.map +1 -0
  225. package/scripts/utils/content-validator.d.ts +94 -0
  226. package/scripts/utils/content-validator.d.ts.map +1 -0
  227. package/scripts/utils/content-validator.js +489 -0
  228. package/scripts/utils/content-validator.js.map +1 -0
  229. package/scripts/utils/copy-test-reports.d.ts +9 -0
  230. package/scripts/utils/copy-test-reports.d.ts.map +1 -0
  231. package/scripts/utils/copy-test-reports.js +508 -0
  232. package/scripts/utils/copy-test-reports.js.map +1 -0
  233. package/scripts/utils/file-utils.d.ts +144 -0
  234. package/scripts/utils/file-utils.d.ts.map +1 -0
  235. package/scripts/utils/file-utils.js +374 -0
  236. package/scripts/utils/file-utils.js.map +1 -0
  237. package/scripts/utils/fix-articles.d.ts +27 -0
  238. package/scripts/utils/fix-articles.d.ts.map +1 -0
  239. package/scripts/utils/fix-articles.js +510 -0
  240. package/scripts/utils/fix-articles.js.map +1 -0
  241. package/scripts/utils/generate-docs-index.d.ts +8 -0
  242. package/scripts/utils/generate-docs-index.d.ts.map +1 -0
  243. package/scripts/utils/generate-docs-index.js +275 -0
  244. package/scripts/utils/generate-docs-index.js.map +1 -0
  245. package/scripts/utils/html-sanitize.d.ts +18 -0
  246. package/scripts/utils/html-sanitize.d.ts.map +1 -0
  247. package/scripts/utils/html-sanitize.js +57 -0
  248. package/scripts/utils/html-sanitize.js.map +1 -0
  249. package/scripts/utils/intelligence-analysis.d.ts +173 -0
  250. package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
  251. package/scripts/utils/intelligence-analysis.js +936 -0
  252. package/scripts/utils/intelligence-analysis.js.map +1 -0
  253. package/scripts/utils/intelligence-index.d.ts +126 -0
  254. package/scripts/utils/intelligence-index.d.ts.map +1 -0
  255. package/scripts/utils/intelligence-index.js +731 -0
  256. package/scripts/utils/intelligence-index.js.map +1 -0
  257. package/scripts/utils/metadata-utils.d.ts +14 -0
  258. package/scripts/utils/metadata-utils.d.ts.map +1 -0
  259. package/scripts/utils/metadata-utils.js +18 -0
  260. package/scripts/utils/metadata-utils.js.map +1 -0
  261. package/scripts/utils/news-metadata.d.ts +47 -0
  262. package/scripts/utils/news-metadata.d.ts.map +1 -0
  263. package/scripts/utils/news-metadata.js +259 -0
  264. package/scripts/utils/news-metadata.js.map +1 -0
  265. package/scripts/utils/validate-articles.d.ts +2 -0
  266. package/scripts/utils/validate-articles.d.ts.map +1 -0
  267. package/scripts/utils/validate-articles.js +284 -0
  268. package/scripts/utils/validate-articles.js.map +1 -0
  269. package/scripts/utils/validate-ep-api.d.ts +51 -0
  270. package/scripts/utils/validate-ep-api.d.ts.map +1 -0
  271. package/scripts/utils/validate-ep-api.js +160 -0
  272. package/scripts/utils/validate-ep-api.js.map +1 -0
  273. package/scripts/utils/world-bank-data.d.ts +84 -0
  274. package/scripts/utils/world-bank-data.d.ts.map +1 -0
  275. package/scripts/utils/world-bank-data.js +311 -0
  276. 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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"}