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,1224 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * @module Constants/CommitteeIndicatorMap
5
+ * @description Maps European Parliament committees and article categories to
6
+ * World Bank indicators for economic context enrichment.
7
+ *
8
+ * Each EP standing committee covers a specific policy domain. This module
9
+ * provides a declarative mapping from committee abbreviations (e.g. 'ECON',
10
+ * 'ENVI') and article categories (e.g. PROPOSITIONS, MONTH_AHEAD) to the
11
+ * World Bank indicators most relevant to their legislative mandates.
12
+ *
13
+ * Used by news generation strategies to automatically select the right
14
+ * economic indicators when enriching articles with World Bank data.
15
+ */
16
+ import { ArticleCategory, AnalysisPerspective } from '../types/common.js';
17
+ // ─── Priority Constants ──────────────────────────────────────────────────────
18
+ /** Priority value for indicators that should always be fetched */
19
+ const PRI = 'primary';
20
+ /** Priority value for indicators that are optional enrichment */
21
+ const SEC = 'secondary';
22
+ // ─── Human-Readable Indicator Names ──────────────────────────────────────────
23
+ /** Reusable indicator display names (prevents sonarjs/no-duplicate-string) */
24
+ const N = {
25
+ GDP_GROWTH: 'GDP Growth',
26
+ GDP: 'GDP',
27
+ GDP_PER_CAPITA: 'GDP per Capita',
28
+ INFLATION: 'Inflation',
29
+ UNEMPLOYMENT: 'Unemployment',
30
+ TRADE: 'Trade',
31
+ CO2: 'CO₂ Emissions',
32
+ RENEWABLE: 'Renewable Energy',
33
+ ENERGY: 'Energy Use',
34
+ FOREST: 'Forest Area',
35
+ POPULATION: 'Population',
36
+ POP_GROWTH: 'Population Growth',
37
+ LIFE_EXPECTANCY: 'Life Expectancy',
38
+ NET_MIGRATION: 'Net Migration',
39
+ LABOR: 'Labor Participation',
40
+ EMPLOYMENT: 'Employment Ratio',
41
+ YOUTH_UNEMP: 'Youth Unemployment',
42
+ RD: 'R&D Expenditure',
43
+ EDUCATION: 'Education Expenditure',
44
+ TERTIARY: 'Tertiary Enrollment',
45
+ HEALTH: 'Health Expenditure',
46
+ HOSPITAL: 'Hospital Beds',
47
+ AGRICULTURE: 'Agriculture (% of GDP)',
48
+ CEREAL: 'Cereal Yield',
49
+ ARABLE: 'Arable Land',
50
+ TAX: 'Tax Revenue',
51
+ GOV_EXP: 'Government Expenditure',
52
+ MILITARY: 'Military Expenditure',
53
+ INTERNET: 'Internet Users',
54
+ HIGHTECH: 'High-tech Exports',
55
+ FDI: 'FDI Net Inflows',
56
+ GNI: 'GNI per Capita',
57
+ GINI: 'GINI Index',
58
+ };
59
+ // ─── World Bank Indicator IDs ────────────────────────────────────────────────
60
+ /**
61
+ * Extended set of World Bank indicator IDs relevant to EU Parliament policy areas.
62
+ * Superset of {@link PolicyRelevantIndicators} — includes domain-specific indicators
63
+ * that map to individual committee mandates.
64
+ */
65
+ export const WB_INDICATORS = {
66
+ // ── Macro-economic ──
67
+ /** GDP (current US$) */
68
+ GDP: 'NY.GDP.MKTP.CD',
69
+ /** GDP growth (annual %) */
70
+ GDP_GROWTH: 'NY.GDP.MKTP.KD.ZG',
71
+ /** GDP per capita (current US$) */
72
+ GDP_PER_CAPITA: 'NY.GDP.PCAP.CD',
73
+ /** GNI per capita, Atlas method (current US$) */
74
+ GNI_PER_CAPITA: 'NY.GNP.PCAP.CD',
75
+ /** Inflation, consumer prices (annual %) */
76
+ INFLATION: 'FP.CPI.TOTL.ZG',
77
+ /** Unemployment, total (% of total labor force) */
78
+ UNEMPLOYMENT: 'SL.UEM.TOTL.ZS',
79
+ // ── Trade & investment ──
80
+ /** Trade (% of GDP) */
81
+ TRADE: 'NE.TRD.GNFS.ZS',
82
+ /** Exports of goods and services (% of GDP) */
83
+ EXPORTS_GDP: 'NE.EXP.GNFS.ZS',
84
+ /** Foreign direct investment, net inflows (% of GDP) */
85
+ FDI_NET: 'BX.KLT.DINV.WD.GD.ZS',
86
+ // ── Environment & energy ──
87
+ /** CO2 emissions (metric tons per capita) */
88
+ CO2_EMISSIONS: 'EN.ATM.CO2E.PC',
89
+ /** Renewable energy consumption (% of total final energy consumption) */
90
+ RENEWABLE_ENERGY: 'EG.FEC.RNEW.ZS',
91
+ /** Energy use (kg of oil equivalent per capita) */
92
+ ENERGY_USE: 'EG.USE.PCAP.KG.OE',
93
+ /** Forest area (% of land area) */
94
+ FOREST_AREA: 'AG.LND.FRST.ZS',
95
+ // ── Demographics & social ──
96
+ /** Population, total */
97
+ POPULATION: 'SP.POP.TOTL',
98
+ /** Population growth (annual %) */
99
+ POPULATION_GROWTH: 'SP.POP.GROW',
100
+ /** Life expectancy at birth, total (years) */
101
+ LIFE_EXPECTANCY: 'SP.DYN.LE00.IN',
102
+ /** Net migration */
103
+ NET_MIGRATION: 'SM.POP.NETM',
104
+ // ── Labor ──
105
+ /** Labor force participation rate, total (% of total population ages 15+) */
106
+ LABOR_PARTICIPATION: 'SL.TLF.CACT.ZS',
107
+ /** Employment to population ratio, 15+, total (%) */
108
+ EMPLOYMENT_RATIO: 'SL.EMP.TOTL.SP.ZS',
109
+ /** Youth unemployment rate (% of total labor force ages 15-24) */
110
+ YOUTH_UNEMPLOYMENT: 'SL.UEM.1524.ZS',
111
+ // ── Education & R&D ──
112
+ /** Research and development expenditure (% of GDP) */
113
+ RD_EXPENDITURE: 'GB.XPD.RSDV.GD.ZS',
114
+ /** Government expenditure on education, total (% of GDP) */
115
+ EDUCATION_EXPENDITURE: 'SE.XPD.TOTL.GD.ZS',
116
+ /** School enrollment, tertiary (% gross) */
117
+ TERTIARY_ENROLLMENT: 'SE.TER.ENRR',
118
+ // ── Health ──
119
+ /** Current health expenditure (% of GDP) */
120
+ HEALTH_EXPENDITURE: 'SH.XPD.CHEX.GD.ZS',
121
+ /** Hospital beds (per 1,000 people) */
122
+ HOSPITAL_BEDS: 'SH.MED.BEDS.ZS',
123
+ // ── Agriculture & food ──
124
+ /** Agriculture, forestry, and fishing, value added (% of GDP) */
125
+ AGRICULTURE_GDP: 'NV.AGR.TOTL.ZS',
126
+ /** Cereal yield (kg per hectare) */
127
+ CEREAL_YIELD: 'AG.YLD.CREL.KG',
128
+ /** Arable land (% of land area) */
129
+ ARABLE_LAND: 'AG.LND.ARBL.ZS',
130
+ // ── Governance & fiscal ──
131
+ /** Tax revenue (% of GDP) */
132
+ TAX_REVENUE: 'GC.TAX.TOTL.GD.ZS',
133
+ /** General government final consumption expenditure (% of GDP) */
134
+ GOV_EXPENDITURE: 'NE.CON.GOVT.ZS',
135
+ /** Military expenditure (% of GDP) */
136
+ MILITARY_EXPENDITURE: 'MS.MIL.XPND.GD.ZS',
137
+ // ── Digital & connectivity ──
138
+ /** Individuals using the Internet (% of population) */
139
+ INTERNET_USERS: 'IT.NET.USER.ZS',
140
+ /** High-technology exports (% of manufactured exports) */
141
+ HIGHTECH_EXPORTS: 'TX.VAL.TECH.MF.ZS',
142
+ // ── Inequality & poverty ──
143
+ /** GINI index (World Bank estimate) */
144
+ GINI_INDEX: 'SI.POV.GINI',
145
+ };
146
+ /**
147
+ * Maps EP committee abbreviations to their World Bank indicator mappings.
148
+ *
149
+ * Covers all 20 EP standing committees. Each entry includes:
150
+ * - Committee metadata (name, policy domain)
151
+ * - Primary indicators (core to the committee's mandate)
152
+ * - Secondary indicators (useful context)
153
+ * - Analysis perspectives for editorial framing
154
+ */
155
+ export const COMMITTEE_INDICATOR_MAP = {
156
+ // ── Economic & Financial ──
157
+ ECON: {
158
+ name: 'Economic and Monetary Affairs',
159
+ abbreviation: 'ECON',
160
+ policyDomain: 'Economic governance, monetary policy, financial regulation',
161
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.INSTITUTIONAL],
162
+ indicators: [
163
+ {
164
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
165
+ name: N.GDP_GROWTH,
166
+ relevance: 'Core metric for economic policy assessment',
167
+ usage: 'Contextualize fiscal policy debates and eurozone economic health',
168
+ priority: PRI,
169
+ },
170
+ {
171
+ indicatorId: WB_INDICATORS.INFLATION,
172
+ name: N.INFLATION,
173
+ relevance: 'Central to ECB monetary policy discussions',
174
+ usage: 'Frame debates on interest rates, price stability, and cost of living',
175
+ priority: PRI,
176
+ },
177
+ {
178
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
179
+ name: N.UNEMPLOYMENT,
180
+ relevance: 'Key indicator for economic governance resolutions',
181
+ usage: 'Assess effectiveness of EU economic coordination policies',
182
+ priority: PRI,
183
+ },
184
+ {
185
+ indicatorId: WB_INDICATORS.TAX_REVENUE,
186
+ name: N.TAX,
187
+ relevance: 'Relevant to EU tax harmonization debates',
188
+ usage: 'Compare national fiscal capacities in tax policy discussions',
189
+ priority: SEC,
190
+ },
191
+ {
192
+ indicatorId: WB_INDICATORS.GOV_EXPENDITURE,
193
+ name: N.GOV_EXP,
194
+ relevance: 'Fiscal discipline and stability pact compliance',
195
+ usage: 'Contextualize budget deficit and debt sustainability debates',
196
+ priority: SEC,
197
+ },
198
+ ],
199
+ },
200
+ BUDG: {
201
+ name: 'Budgets',
202
+ abbreviation: 'BUDG',
203
+ policyDomain: 'EU budget, Multiannual Financial Framework',
204
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.INSTITUTIONAL],
205
+ indicators: [
206
+ {
207
+ indicatorId: WB_INDICATORS.GDP,
208
+ name: N.GDP,
209
+ relevance: 'EU budget is proportional to member state GNI',
210
+ usage: 'Contextualize EU budget contributions and cohesion fund allocations',
211
+ priority: PRI,
212
+ },
213
+ {
214
+ indicatorId: WB_INDICATORS.GOV_EXPENDITURE,
215
+ name: N.GOV_EXP,
216
+ relevance: 'National spending patterns inform EU budget negotiations',
217
+ usage: 'Compare public spending priorities across member states',
218
+ priority: PRI,
219
+ },
220
+ {
221
+ indicatorId: WB_INDICATORS.TAX_REVENUE,
222
+ name: N.TAX,
223
+ relevance: 'Own resources and EU revenue discussions',
224
+ usage: 'Frame debates on new EU own resources proposals',
225
+ priority: SEC,
226
+ },
227
+ ],
228
+ },
229
+ CONT: {
230
+ name: 'Budgetary Control',
231
+ abbreviation: 'CONT',
232
+ policyDomain: 'Budget execution, audit, anti-fraud',
233
+ analysisPerspectives: [AnalysisPerspective.INSTITUTIONAL, AnalysisPerspective.ECONOMIC],
234
+ indicators: [
235
+ {
236
+ indicatorId: WB_INDICATORS.GOV_EXPENDITURE,
237
+ name: N.GOV_EXP,
238
+ relevance: 'Benchmarks for public spending efficiency',
239
+ usage: 'Assess EU fund absorption rates against national spending patterns',
240
+ priority: PRI,
241
+ },
242
+ {
243
+ indicatorId: WB_INDICATORS.GDP,
244
+ name: N.GDP,
245
+ relevance: 'Context for EU fund disbursement scale',
246
+ usage: 'Proportionality of EU recovery and cohesion fund allocations',
247
+ priority: SEC,
248
+ },
249
+ ],
250
+ },
251
+ // ── Employment & Social ──
252
+ EMPL: {
253
+ name: 'Employment and Social Affairs',
254
+ abbreviation: 'EMPL',
255
+ policyDomain: 'Employment policy, social protection, working conditions',
256
+ analysisPerspectives: [AnalysisPerspective.SOCIAL, AnalysisPerspective.ECONOMIC],
257
+ indicators: [
258
+ {
259
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
260
+ name: N.UNEMPLOYMENT,
261
+ relevance: 'Primary metric for employment policy effectiveness',
262
+ usage: 'Track labor market conditions driving legislative action',
263
+ priority: PRI,
264
+ },
265
+ {
266
+ indicatorId: WB_INDICATORS.YOUTH_UNEMPLOYMENT,
267
+ name: N.YOUTH_UNEMP,
268
+ relevance: 'Central to Youth Guarantee and skills agenda',
269
+ usage: 'Highlight generational employment gaps in social policy debates',
270
+ priority: PRI,
271
+ },
272
+ {
273
+ indicatorId: WB_INDICATORS.LABOR_PARTICIPATION,
274
+ name: N.LABOR,
275
+ relevance: 'Measures workforce engagement beyond headline unemployment',
276
+ usage: 'Assess structural employment challenges and inactivity rates',
277
+ priority: SEC,
278
+ },
279
+ {
280
+ indicatorId: WB_INDICATORS.GINI_INDEX,
281
+ name: N.GINI,
282
+ relevance: 'Income inequality drives social protection debates',
283
+ usage: 'Contextualize minimum wage and social pillar discussions',
284
+ priority: SEC,
285
+ },
286
+ {
287
+ indicatorId: WB_INDICATORS.EMPLOYMENT_RATIO,
288
+ name: N.EMPLOYMENT,
289
+ relevance: 'Broad employment health metric',
290
+ usage: 'Compare employment outcomes across member states',
291
+ priority: SEC,
292
+ },
293
+ ],
294
+ },
295
+ // ── Environment ──
296
+ ENVI: {
297
+ name: 'Environment, Public Health and Food Safety',
298
+ abbreviation: 'ENVI',
299
+ policyDomain: 'Climate, environment, public health, food safety',
300
+ analysisPerspectives: [AnalysisPerspective.ENVIRONMENTAL, AnalysisPerspective.SOCIAL],
301
+ indicators: [
302
+ {
303
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
304
+ name: N.CO2,
305
+ relevance: 'Core metric for EU Green Deal and climate targets',
306
+ usage: 'Track progress toward 55% reduction target and net-zero by 2050',
307
+ priority: PRI,
308
+ },
309
+ {
310
+ indicatorId: WB_INDICATORS.RENEWABLE_ENERGY,
311
+ name: N.RENEWABLE,
312
+ relevance: 'REPowerEU and renewable energy directive benchmarks',
313
+ usage: 'Measure clean energy transition across member states',
314
+ priority: PRI,
315
+ },
316
+ {
317
+ indicatorId: WB_INDICATORS.HEALTH_EXPENDITURE,
318
+ name: N.HEALTH,
319
+ relevance: 'EU health policy and pandemic preparedness',
320
+ usage: 'Contextualize public health legislation and EU4Health programme',
321
+ priority: PRI,
322
+ },
323
+ {
324
+ indicatorId: WB_INDICATORS.FOREST_AREA,
325
+ name: N.FOREST,
326
+ relevance: 'Biodiversity strategy and deforestation regulation',
327
+ usage: 'Assess land-use change in environmental policy debates',
328
+ priority: SEC,
329
+ },
330
+ {
331
+ indicatorId: WB_INDICATORS.ENERGY_USE,
332
+ name: N.ENERGY,
333
+ relevance: 'Energy efficiency directive benchmarks',
334
+ usage: 'Track energy consumption trends relevant to climate legislation',
335
+ priority: SEC,
336
+ },
337
+ ],
338
+ },
339
+ // ── Industry & Research ──
340
+ ITRE: {
341
+ name: 'Industry, Research and Energy',
342
+ abbreviation: 'ITRE',
343
+ policyDomain: 'Industrial policy, research, energy, digital',
344
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.ENVIRONMENTAL],
345
+ indicators: [
346
+ {
347
+ indicatorId: WB_INDICATORS.RD_EXPENDITURE,
348
+ name: N.RD,
349
+ relevance: 'Horizon Europe and 3% GDP R&D target',
350
+ usage: 'Measure innovation investment gaps across member states',
351
+ priority: PRI,
352
+ },
353
+ {
354
+ indicatorId: WB_INDICATORS.RENEWABLE_ENERGY,
355
+ name: N.RENEWABLE,
356
+ relevance: 'Energy policy and REPowerEU targets',
357
+ usage: 'Track energy transition for industrial competitiveness',
358
+ priority: PRI,
359
+ },
360
+ {
361
+ indicatorId: WB_INDICATORS.HIGHTECH_EXPORTS,
362
+ name: N.HIGHTECH,
363
+ relevance: 'EU industrial competitiveness and strategic autonomy',
364
+ usage: 'Assess technology sovereignty in trade and industrial debates',
365
+ priority: PRI,
366
+ },
367
+ {
368
+ indicatorId: WB_INDICATORS.INTERNET_USERS,
369
+ name: N.INTERNET,
370
+ relevance: 'Digital single market and connectivity targets',
371
+ usage: 'Measure digital divide and broadband access progress',
372
+ priority: SEC,
373
+ },
374
+ {
375
+ indicatorId: WB_INDICATORS.ENERGY_USE,
376
+ name: N.ENERGY,
377
+ relevance: 'Energy efficiency and industrial energy policy',
378
+ usage: 'Contextualize energy security and pricing debates',
379
+ priority: SEC,
380
+ },
381
+ ],
382
+ },
383
+ // ── Internal Market ──
384
+ IMCO: {
385
+ name: 'Internal Market and Consumer Protection',
386
+ abbreviation: 'IMCO',
387
+ policyDomain: 'Single market, consumer rights, product safety',
388
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.SOCIAL],
389
+ indicators: [
390
+ {
391
+ indicatorId: WB_INDICATORS.TRADE,
392
+ name: N.TRADE,
393
+ relevance: 'Intra-EU trade flows reflect single market health',
394
+ usage: 'Assess single market integration and barriers',
395
+ priority: PRI,
396
+ },
397
+ {
398
+ indicatorId: WB_INDICATORS.GDP_PER_CAPITA,
399
+ name: N.GDP_PER_CAPITA,
400
+ relevance: 'Consumer purchasing power across member states',
401
+ usage: 'Contextualize consumer protection and market access debates',
402
+ priority: PRI,
403
+ },
404
+ {
405
+ indicatorId: WB_INDICATORS.INTERNET_USERS,
406
+ name: N.INTERNET,
407
+ relevance: 'Digital services and e-commerce regulation',
408
+ usage: 'Frame digital market legislation with connectivity data',
409
+ priority: SEC,
410
+ },
411
+ ],
412
+ },
413
+ // ── Transport & Tourism ──
414
+ TRAN: {
415
+ name: 'Transport and Tourism',
416
+ abbreviation: 'TRAN',
417
+ policyDomain: 'Transport, mobility, tourism',
418
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.ENVIRONMENTAL],
419
+ indicators: [
420
+ {
421
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
422
+ name: N.CO2,
423
+ relevance: 'Transport is ~25% of EU emissions',
424
+ usage: 'Contextualize transport decarbonization legislation',
425
+ priority: PRI,
426
+ },
427
+ {
428
+ indicatorId: WB_INDICATORS.ENERGY_USE,
429
+ name: N.ENERGY,
430
+ relevance: 'Transport energy efficiency and alternative fuels',
431
+ usage: 'Track energy consumption trends in mobility sector',
432
+ priority: SEC,
433
+ },
434
+ {
435
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
436
+ name: N.GDP_GROWTH,
437
+ relevance: 'Tourism contribution to economic growth',
438
+ usage: 'Frame tourism recovery and cross-border mobility debates',
439
+ priority: SEC,
440
+ },
441
+ ],
442
+ },
443
+ // ── Regional Development ──
444
+ REGI: {
445
+ name: 'Regional Development',
446
+ abbreviation: 'REGI',
447
+ policyDomain: 'Cohesion policy, structural funds, territorial development',
448
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.SOCIAL],
449
+ indicators: [
450
+ {
451
+ indicatorId: WB_INDICATORS.GDP_PER_CAPITA,
452
+ name: N.GDP_PER_CAPITA,
453
+ relevance: 'Cohesion fund eligibility threshold (75% of EU average)',
454
+ usage: 'Identify convergence/divergence across EU regions',
455
+ priority: PRI,
456
+ },
457
+ {
458
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
459
+ name: N.UNEMPLOYMENT,
460
+ relevance: 'ESF+ and regional employment fund targeting',
461
+ usage: 'Map regional employment disparities for cohesion policy',
462
+ priority: PRI,
463
+ },
464
+ {
465
+ indicatorId: WB_INDICATORS.POPULATION_GROWTH,
466
+ name: N.POP_GROWTH,
467
+ relevance: 'Demographic challenges in rural/peripheral regions',
468
+ usage: 'Assess depopulation risks in territorial cohesion debates',
469
+ priority: SEC,
470
+ },
471
+ ],
472
+ },
473
+ // ── Agriculture ──
474
+ AGRI: {
475
+ name: 'Agriculture and Rural Development',
476
+ abbreviation: 'AGRI',
477
+ policyDomain: 'Common Agricultural Policy, rural development, food systems',
478
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.ENVIRONMENTAL],
479
+ indicators: [
480
+ {
481
+ indicatorId: WB_INDICATORS.AGRICULTURE_GDP,
482
+ name: N.AGRICULTURE,
483
+ relevance: 'CAP budget and agricultural sector weight',
484
+ usage: 'Contextualize CAP reform debates with sector economic data',
485
+ priority: PRI,
486
+ },
487
+ {
488
+ indicatorId: WB_INDICATORS.CEREAL_YIELD,
489
+ name: N.CEREAL,
490
+ relevance: 'Productivity and food security metrics',
491
+ usage: 'Assess agricultural productivity in food security debates',
492
+ priority: PRI,
493
+ },
494
+ {
495
+ indicatorId: WB_INDICATORS.ARABLE_LAND,
496
+ name: N.ARABLE,
497
+ relevance: 'Land use and environmental conditionality',
498
+ usage: 'Frame CAP environmental requirements with land-use data',
499
+ priority: SEC,
500
+ },
501
+ {
502
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
503
+ name: N.CO2,
504
+ relevance: 'Agricultural emissions and Farm to Fork strategy',
505
+ usage: 'Contextualize agricultural sustainability requirements',
506
+ priority: SEC,
507
+ },
508
+ ],
509
+ },
510
+ // ── Fisheries ──
511
+ PECH: {
512
+ name: 'Fisheries',
513
+ abbreviation: 'PECH',
514
+ policyDomain: 'Common Fisheries Policy, marine resources',
515
+ analysisPerspectives: [AnalysisPerspective.ENVIRONMENTAL, AnalysisPerspective.ECONOMIC],
516
+ indicators: [
517
+ {
518
+ indicatorId: WB_INDICATORS.GDP_PER_CAPITA,
519
+ name: N.GDP_PER_CAPITA,
520
+ relevance: 'Fishing community livelihoods',
521
+ usage: 'Assess economic impact of fishing quotas on coastal regions',
522
+ priority: SEC,
523
+ },
524
+ {
525
+ indicatorId: WB_INDICATORS.TRADE,
526
+ name: N.TRADE,
527
+ relevance: 'Seafood trade and market access',
528
+ usage: 'Contextualize fisheries agreements and trade impacts',
529
+ priority: SEC,
530
+ },
531
+ ],
532
+ },
533
+ // ── Culture & Education ──
534
+ CULT: {
535
+ name: 'Culture and Education',
536
+ abbreviation: 'CULT',
537
+ policyDomain: 'Education, culture, media, sport, youth',
538
+ analysisPerspectives: [AnalysisPerspective.SOCIAL, AnalysisPerspective.ECONOMIC],
539
+ indicators: [
540
+ {
541
+ indicatorId: WB_INDICATORS.EDUCATION_EXPENDITURE,
542
+ name: N.EDUCATION,
543
+ relevance: 'Erasmus+ and EU education investment benchmarks',
544
+ usage: 'Compare national education spending in skills agenda debates',
545
+ priority: PRI,
546
+ },
547
+ {
548
+ indicatorId: WB_INDICATORS.TERTIARY_ENROLLMENT,
549
+ name: N.TERTIARY,
550
+ relevance: 'Higher education access and European Education Area',
551
+ usage: 'Measure higher education participation across member states',
552
+ priority: PRI,
553
+ },
554
+ {
555
+ indicatorId: WB_INDICATORS.YOUTH_UNEMPLOYMENT,
556
+ name: N.YOUTH_UNEMP,
557
+ relevance: 'Skills mismatch and education-to-employment transition',
558
+ usage: 'Link education policy to labor market outcomes',
559
+ priority: SEC,
560
+ },
561
+ ],
562
+ },
563
+ // ── Legal Affairs ──
564
+ JURI: {
565
+ name: 'Legal Affairs',
566
+ abbreviation: 'JURI',
567
+ policyDomain: 'Legal matters, intellectual property, company law',
568
+ analysisPerspectives: [AnalysisPerspective.LEGAL, AnalysisPerspective.ECONOMIC],
569
+ indicators: [
570
+ {
571
+ indicatorId: WB_INDICATORS.GDP,
572
+ name: N.GDP,
573
+ relevance: 'Scale of economic activity subject to EU legal frameworks',
574
+ usage: 'Contextualize corporate governance and IP law proposals',
575
+ priority: SEC,
576
+ },
577
+ {
578
+ indicatorId: WB_INDICATORS.HIGHTECH_EXPORTS,
579
+ name: N.HIGHTECH,
580
+ relevance: 'IP-intensive sectors affected by legal frameworks',
581
+ usage: 'Frame AI regulation and digital IP debates with trade data',
582
+ priority: SEC,
583
+ },
584
+ ],
585
+ },
586
+ // ── Civil Liberties ──
587
+ LIBE: {
588
+ name: 'Civil Liberties, Justice and Home Affairs',
589
+ abbreviation: 'LIBE',
590
+ policyDomain: 'Fundamental rights, migration, asylum, security',
591
+ analysisPerspectives: [AnalysisPerspective.SOCIAL, AnalysisPerspective.LEGAL],
592
+ indicators: [
593
+ {
594
+ indicatorId: WB_INDICATORS.NET_MIGRATION,
595
+ name: N.NET_MIGRATION,
596
+ relevance: 'Core metric for migration and asylum policy',
597
+ usage: 'Quantify migration flows in asylum reform debates',
598
+ priority: PRI,
599
+ },
600
+ {
601
+ indicatorId: WB_INDICATORS.POPULATION,
602
+ name: N.POPULATION,
603
+ relevance: 'Demographic context for burden-sharing debates',
604
+ usage: 'Proportionality of refugee quotas relative to population',
605
+ priority: SEC,
606
+ },
607
+ {
608
+ indicatorId: WB_INDICATORS.INTERNET_USERS,
609
+ name: N.INTERNET,
610
+ relevance: 'Digital rights and surveillance regulation',
611
+ usage: 'Frame digital privacy debates with connectivity data',
612
+ priority: SEC,
613
+ },
614
+ ],
615
+ },
616
+ // ── Constitutional Affairs ──
617
+ AFCO: {
618
+ name: 'Constitutional Affairs',
619
+ abbreviation: 'AFCO',
620
+ policyDomain: 'EU treaties, institutional reform, electoral law',
621
+ analysisPerspectives: [AnalysisPerspective.INSTITUTIONAL, AnalysisPerspective.POLITICAL],
622
+ indicators: [
623
+ {
624
+ indicatorId: WB_INDICATORS.POPULATION,
625
+ name: N.POPULATION,
626
+ relevance: 'EP seat allocation proportionality',
627
+ usage: 'Contextualize electoral reform and degressive proportionality',
628
+ priority: PRI,
629
+ },
630
+ {
631
+ indicatorId: WB_INDICATORS.GDP_PER_CAPITA,
632
+ name: N.GDP_PER_CAPITA,
633
+ relevance: 'Economic divergence as treaty reform driver',
634
+ usage: 'Frame institutional reform debates with economic data',
635
+ priority: SEC,
636
+ },
637
+ ],
638
+ },
639
+ // ── Foreign Affairs ──
640
+ AFET: {
641
+ name: 'Foreign Affairs',
642
+ abbreviation: 'AFET',
643
+ policyDomain: 'EU external relations, CFSP, neighbourhood policy',
644
+ analysisPerspectives: [AnalysisPerspective.GEOPOLITICAL, AnalysisPerspective.ECONOMIC],
645
+ indicators: [
646
+ {
647
+ indicatorId: WB_INDICATORS.MILITARY_EXPENDITURE,
648
+ name: N.MILITARY,
649
+ relevance: 'Defence spending and CSDP/NATO commitments',
650
+ usage: 'Contextualize EU defence and security policy debates',
651
+ priority: PRI,
652
+ },
653
+ {
654
+ indicatorId: WB_INDICATORS.TRADE,
655
+ name: N.TRADE,
656
+ relevance: 'Trade relationships and sanctions impact',
657
+ usage: 'Assess economic dimensions of foreign policy decisions',
658
+ priority: PRI,
659
+ },
660
+ {
661
+ indicatorId: WB_INDICATORS.FDI_NET,
662
+ name: N.FDI,
663
+ relevance: 'Investment screening and economic sovereignty',
664
+ usage: 'Frame debates on foreign investment controls',
665
+ priority: SEC,
666
+ },
667
+ {
668
+ indicatorId: WB_INDICATORS.GDP,
669
+ name: N.GDP,
670
+ relevance: 'Economic weight in geopolitical negotiations',
671
+ usage: 'Compare EU economic leverage in diplomatic contexts',
672
+ priority: SEC,
673
+ },
674
+ ],
675
+ },
676
+ // ── Development ──
677
+ DEVE: {
678
+ name: 'Development',
679
+ abbreviation: 'DEVE',
680
+ policyDomain: 'Development cooperation, humanitarian aid',
681
+ analysisPerspectives: [AnalysisPerspective.GEOPOLITICAL, AnalysisPerspective.SOCIAL],
682
+ indicators: [
683
+ {
684
+ indicatorId: WB_INDICATORS.GNI_PER_CAPITA,
685
+ name: N.GNI,
686
+ relevance: 'ODA commitments (0.7% GNI target)',
687
+ usage: 'Track EU development aid commitments against GNI',
688
+ priority: PRI,
689
+ },
690
+ {
691
+ indicatorId: WB_INDICATORS.LIFE_EXPECTANCY,
692
+ name: N.LIFE_EXPECTANCY,
693
+ relevance: 'SDG health outcome benchmarks',
694
+ usage: 'Measure development progress in partner countries',
695
+ priority: SEC,
696
+ },
697
+ {
698
+ indicatorId: WB_INDICATORS.POPULATION_GROWTH,
699
+ name: N.POP_GROWTH,
700
+ relevance: 'Demographic trends in development regions',
701
+ usage: 'Contextualize development aid allocation decisions',
702
+ priority: SEC,
703
+ },
704
+ ],
705
+ },
706
+ // ── International Trade ──
707
+ INTA: {
708
+ name: 'International Trade',
709
+ abbreviation: 'INTA',
710
+ policyDomain: 'Trade agreements, trade defence, WTO',
711
+ analysisPerspectives: [AnalysisPerspective.ECONOMIC, AnalysisPerspective.GEOPOLITICAL],
712
+ indicators: [
713
+ {
714
+ indicatorId: WB_INDICATORS.TRADE,
715
+ name: N.TRADE,
716
+ relevance: 'Overall trade openness of EU economy',
717
+ usage: 'Frame trade agreement negotiations with openness metrics',
718
+ priority: PRI,
719
+ },
720
+ {
721
+ indicatorId: WB_INDICATORS.EXPORTS_GDP,
722
+ name: 'Exports (% of GDP)',
723
+ relevance: 'Export dependency and market diversification',
724
+ usage: 'Assess export exposure in trade defence instrument debates',
725
+ priority: PRI,
726
+ },
727
+ {
728
+ indicatorId: WB_INDICATORS.FDI_NET,
729
+ name: N.FDI,
730
+ relevance: 'Investment chapter of trade agreements',
731
+ usage: 'Contextualize investment protection and screening debates',
732
+ priority: PRI,
733
+ },
734
+ {
735
+ indicatorId: WB_INDICATORS.HIGHTECH_EXPORTS,
736
+ name: N.HIGHTECH,
737
+ relevance: 'Technology sovereignty in trade policy',
738
+ usage: 'Frame export controls and strategic autonomy discussions',
739
+ priority: SEC,
740
+ },
741
+ ],
742
+ },
743
+ // ── Petitions ──
744
+ PETI: {
745
+ name: 'Petitions',
746
+ abbreviation: 'PETI',
747
+ policyDomain: 'Citizen petitions, EU ombudsman, fundamental rights',
748
+ analysisPerspectives: [AnalysisPerspective.SOCIAL, AnalysisPerspective.INSTITUTIONAL],
749
+ indicators: [
750
+ {
751
+ indicatorId: WB_INDICATORS.INTERNET_USERS,
752
+ name: N.INTERNET,
753
+ relevance: 'Digital access for citizen engagement',
754
+ usage: 'Assess digital accessibility of petition process',
755
+ priority: SEC,
756
+ },
757
+ {
758
+ indicatorId: WB_INDICATORS.POPULATION,
759
+ name: N.POPULATION,
760
+ relevance: 'Petition volume proportionality',
761
+ usage: 'Normalize petition counts by member state population',
762
+ priority: SEC,
763
+ },
764
+ ],
765
+ },
766
+ // ── Security & Defence (sub-committee) ──
767
+ SEDE: {
768
+ name: 'Security and Defence',
769
+ abbreviation: 'SEDE',
770
+ policyDomain: 'CSDP, defence industry, military cooperation',
771
+ analysisPerspectives: [AnalysisPerspective.GEOPOLITICAL, AnalysisPerspective.ECONOMIC],
772
+ indicators: [
773
+ {
774
+ indicatorId: WB_INDICATORS.MILITARY_EXPENDITURE,
775
+ name: N.MILITARY,
776
+ relevance: 'NATO 2% GDP target and EU defence fund',
777
+ usage: 'Track defence spending commitments across member states',
778
+ priority: PRI,
779
+ },
780
+ {
781
+ indicatorId: WB_INDICATORS.GDP,
782
+ name: N.GDP,
783
+ relevance: 'Economic capacity for defence investment',
784
+ usage: 'Assess defence burden-sharing proportionality',
785
+ priority: SEC,
786
+ },
787
+ ],
788
+ },
789
+ // ── Human Rights (sub-committee) ──
790
+ DROI: {
791
+ name: 'Human Rights',
792
+ abbreviation: 'DROI',
793
+ policyDomain: 'Human rights, democracy, rule of law',
794
+ analysisPerspectives: [AnalysisPerspective.SOCIAL, AnalysisPerspective.GEOPOLITICAL],
795
+ indicators: [
796
+ {
797
+ indicatorId: WB_INDICATORS.GINI_INDEX,
798
+ name: N.GINI,
799
+ relevance: 'Economic inequality as rights context',
800
+ usage: 'Correlate inequality data with human rights assessments',
801
+ priority: SEC,
802
+ },
803
+ {
804
+ indicatorId: WB_INDICATORS.LIFE_EXPECTANCY,
805
+ name: N.LIFE_EXPECTANCY,
806
+ relevance: 'Right to health outcome indicator',
807
+ usage: 'Benchmark health outcomes in human rights reporting',
808
+ priority: SEC,
809
+ },
810
+ ],
811
+ },
812
+ };
813
+ /**
814
+ * Maps article categories to World Bank indicators for economic context enrichment.
815
+ *
816
+ * Not every article type benefits equally from economic data:
817
+ * - **PROPOSITIONS**: High value — legislative proposals often have direct economic impact
818
+ * - **MONTH_AHEAD/MONTH_IN_REVIEW**: High value — monthly economic overview adds depth
819
+ * - **COMMITTEE_REPORTS**: High value — each committee has domain-specific indicators
820
+ * - **WEEK_AHEAD/WEEK_IN_REVIEW**: Medium value — useful for contextualization
821
+ * - **MOTIONS**: Medium value — voting outcomes may relate to economic conditions
822
+ * - **BREAKING_NEWS**: Low value — urgency trumps enrichment
823
+ * - **DEEP_ANALYSIS**: High value — analytical depth benefits from data
824
+ */
825
+ export const CATEGORY_INDICATOR_MAP = {
826
+ [ArticleCategory.PROPOSITIONS]: {
827
+ category: ArticleCategory.PROPOSITIONS,
828
+ enrichmentStrategy: 'Map each legislative proposal to its policy domain, then fetch the 2-3 most relevant indicators for the dominant domain. Use to explain "why this legislation matters" with economic evidence.',
829
+ primaryIndicators: [
830
+ {
831
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
832
+ name: N.GDP_GROWTH,
833
+ relevance: 'Economic backdrop for legislative proposals',
834
+ usage: 'Frame the economic context driving new legislation',
835
+ priority: PRI,
836
+ },
837
+ {
838
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
839
+ name: N.UNEMPLOYMENT,
840
+ relevance: 'Employment impact of proposed legislation',
841
+ usage: 'Assess labor market implications of proposals',
842
+ priority: PRI,
843
+ },
844
+ ],
845
+ secondaryIndicators: [
846
+ {
847
+ indicatorId: WB_INDICATORS.INFLATION,
848
+ name: N.INFLATION,
849
+ relevance: 'Cost-of-living context for consumer legislation',
850
+ usage: 'Contextualize price-related regulation proposals',
851
+ priority: SEC,
852
+ },
853
+ {
854
+ indicatorId: WB_INDICATORS.TRADE,
855
+ name: N.TRADE,
856
+ relevance: 'Trade impact of market regulation proposals',
857
+ usage: 'Assess trade implications of single market legislation',
858
+ priority: SEC,
859
+ },
860
+ {
861
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
862
+ name: N.CO2,
863
+ relevance: 'Environmental proposals and Green Deal progress',
864
+ usage: 'Quantify environmental impact of green proposals',
865
+ priority: SEC,
866
+ },
867
+ ],
868
+ maxWBCalls: 3,
869
+ },
870
+ [ArticleCategory.MONTH_AHEAD]: {
871
+ category: ArticleCategory.MONTH_AHEAD,
872
+ enrichmentStrategy: 'Provide a macroeconomic snapshot for the upcoming month. Focus on 2-3 headline indicators that set the economic backdrop for upcoming parliamentary business.',
873
+ primaryIndicators: [
874
+ {
875
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
876
+ name: N.GDP_GROWTH,
877
+ relevance: 'Economic outlook for upcoming legislative agenda',
878
+ usage: 'Set the macroeconomic scene for the month ahead',
879
+ priority: PRI,
880
+ },
881
+ {
882
+ indicatorId: WB_INDICATORS.INFLATION,
883
+ name: N.INFLATION,
884
+ relevance: 'Cost-of-living pressures shaping policy priorities',
885
+ usage: 'Explain why certain issues dominate the upcoming agenda',
886
+ priority: PRI,
887
+ },
888
+ ],
889
+ secondaryIndicators: [
890
+ {
891
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
892
+ name: N.UNEMPLOYMENT,
893
+ relevance: 'Labor market context for employment legislation',
894
+ usage: 'Preview employment-related legislative activity',
895
+ priority: SEC,
896
+ },
897
+ ],
898
+ maxWBCalls: 3,
899
+ },
900
+ [ArticleCategory.MONTH_IN_REVIEW]: {
901
+ category: ArticleCategory.MONTH_IN_REVIEW,
902
+ enrichmentStrategy: 'Retrospective economic assessment: how do the month\'s legislative achievements relate to current economic conditions? Use indicators to measure the "so what" of passed legislation.',
903
+ primaryIndicators: [
904
+ {
905
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
906
+ name: N.GDP_GROWTH,
907
+ relevance: 'Economic context for legislative achievements',
908
+ usage: 'Assess whether legislation addressed economic realities',
909
+ priority: PRI,
910
+ },
911
+ {
912
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
913
+ name: N.UNEMPLOYMENT,
914
+ relevance: 'Labor market conditions during the review period',
915
+ usage: 'Evaluate employment-focused legislation effectiveness',
916
+ priority: PRI,
917
+ },
918
+ ],
919
+ secondaryIndicators: [
920
+ {
921
+ indicatorId: WB_INDICATORS.INFLATION,
922
+ name: N.INFLATION,
923
+ relevance: 'Price stability context for the reviewed period',
924
+ usage: 'Measure economic conditions during the legislative month',
925
+ priority: SEC,
926
+ },
927
+ {
928
+ indicatorId: WB_INDICATORS.FDI_NET,
929
+ name: N.FDI,
930
+ relevance: 'Investment climate during the review period',
931
+ usage: 'Assess investment implications of passed legislation',
932
+ priority: SEC,
933
+ },
934
+ ],
935
+ maxWBCalls: 3,
936
+ },
937
+ [ArticleCategory.COMMITTEE_REPORTS]: {
938
+ category: ArticleCategory.COMMITTEE_REPORTS,
939
+ enrichmentStrategy: 'Use COMMITTEE_INDICATOR_MAP to select indicators per committee. Each committee section should include 1-2 indicators from its domain mapping.',
940
+ primaryIndicators: [],
941
+ secondaryIndicators: [],
942
+ maxWBCalls: 3,
943
+ },
944
+ [ArticleCategory.WEEK_AHEAD]: {
945
+ category: ArticleCategory.WEEK_AHEAD,
946
+ enrichmentStrategy: 'Light economic context: 1-2 headline indicators to frame the upcoming parliamentary week. Only include when specific agenda items have clear economic dimensions.',
947
+ primaryIndicators: [
948
+ {
949
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
950
+ name: N.GDP_GROWTH,
951
+ relevance: 'Quick economic pulse for the week',
952
+ usage: 'One-line economic context in the article lede',
953
+ priority: PRI,
954
+ },
955
+ ],
956
+ secondaryIndicators: [
957
+ {
958
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
959
+ name: N.UNEMPLOYMENT,
960
+ relevance: 'Employment context if labor agenda items exist',
961
+ usage: 'Only include when employment topics are on the agenda',
962
+ priority: SEC,
963
+ },
964
+ ],
965
+ maxWBCalls: 2,
966
+ },
967
+ [ArticleCategory.WEEK_IN_REVIEW]: {
968
+ category: ArticleCategory.WEEK_IN_REVIEW,
969
+ enrichmentStrategy: 'Retrospective economic context for weekly review. Include when votes or decisions had clear economic implications.',
970
+ primaryIndicators: [
971
+ {
972
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
973
+ name: N.GDP_GROWTH,
974
+ relevance: "Economic backdrop for the week's decisions",
975
+ usage: 'Frame voting outcomes in economic context',
976
+ priority: PRI,
977
+ },
978
+ ],
979
+ secondaryIndicators: [
980
+ {
981
+ indicatorId: WB_INDICATORS.TRADE,
982
+ name: N.TRADE,
983
+ relevance: 'If trade-related legislation was debated',
984
+ usage: 'Only include for trade-relevant weekly activity',
985
+ priority: SEC,
986
+ },
987
+ ],
988
+ maxWBCalls: 2,
989
+ },
990
+ [ArticleCategory.MOTIONS]: {
991
+ category: ArticleCategory.MOTIONS,
992
+ enrichmentStrategy: 'Selective enrichment: only include economic data when motions/resolutions directly address economic policy. Map voting topics to relevant indicators.',
993
+ primaryIndicators: [],
994
+ secondaryIndicators: [
995
+ {
996
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
997
+ name: N.GDP_GROWTH,
998
+ relevance: 'For economy-related motions',
999
+ usage: 'Only when motions address economic governance',
1000
+ priority: SEC,
1001
+ },
1002
+ {
1003
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
1004
+ name: N.UNEMPLOYMENT,
1005
+ relevance: 'For employment-related motions',
1006
+ usage: 'Only when motions address labor policy',
1007
+ priority: SEC,
1008
+ },
1009
+ ],
1010
+ maxWBCalls: 2,
1011
+ },
1012
+ [ArticleCategory.BREAKING_NEWS]: {
1013
+ category: ArticleCategory.BREAKING_NEWS,
1014
+ enrichmentStrategy: 'Minimal enrichment — breaking news prioritizes speed over depth. Only include one indicator if the breaking event has immediate economic significance.',
1015
+ primaryIndicators: [],
1016
+ secondaryIndicators: [
1017
+ {
1018
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
1019
+ name: N.GDP_GROWTH,
1020
+ relevance: 'Economic context for market-moving decisions',
1021
+ usage: 'Only for economically significant breaking events',
1022
+ priority: SEC,
1023
+ },
1024
+ ],
1025
+ maxWBCalls: 1,
1026
+ },
1027
+ [ArticleCategory.DEEP_ANALYSIS]: {
1028
+ category: ArticleCategory.DEEP_ANALYSIS,
1029
+ enrichmentStrategy: 'Maximum enrichment — deep analysis articles should include comprehensive economic context. Use COMMITTEE_INDICATOR_MAP for the primary committee, plus 2-3 cross-cutting indicators.',
1030
+ primaryIndicators: [
1031
+ {
1032
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
1033
+ name: N.GDP_GROWTH,
1034
+ relevance: 'Macro context for deep analysis',
1035
+ usage: 'Establish economic baseline for multi-perspective analysis',
1036
+ priority: PRI,
1037
+ },
1038
+ {
1039
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
1040
+ name: N.UNEMPLOYMENT,
1041
+ relevance: 'Social dimension of policy analysis',
1042
+ usage: 'Labor market lens for 5-why analysis',
1043
+ priority: PRI,
1044
+ },
1045
+ {
1046
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
1047
+ name: N.CO2,
1048
+ relevance: 'Environmental dimension of policy analysis',
1049
+ usage: 'Environmental lens for 5-why analysis',
1050
+ priority: PRI,
1051
+ },
1052
+ ],
1053
+ secondaryIndicators: [
1054
+ {
1055
+ indicatorId: WB_INDICATORS.GINI_INDEX,
1056
+ name: N.GINI,
1057
+ relevance: 'Inequality dimension',
1058
+ usage: 'Social equity lens for distributional analysis',
1059
+ priority: SEC,
1060
+ },
1061
+ {
1062
+ indicatorId: WB_INDICATORS.TRADE,
1063
+ name: N.TRADE,
1064
+ relevance: 'External dimension',
1065
+ usage: 'Geopolitical lens for trade impact analysis',
1066
+ priority: SEC,
1067
+ },
1068
+ ],
1069
+ maxWBCalls: 5,
1070
+ },
1071
+ [ArticleCategory.YEAR_AHEAD]: {
1072
+ category: ArticleCategory.YEAR_AHEAD,
1073
+ enrichmentStrategy: 'Comprehensive economic outlook for the legislative year. Include broad macroeconomic indicators and trend analysis.',
1074
+ primaryIndicators: [
1075
+ {
1076
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
1077
+ name: N.GDP_GROWTH,
1078
+ relevance: 'Annual economic growth trajectory',
1079
+ usage: 'Set the economic scene for the legislative year',
1080
+ priority: PRI,
1081
+ },
1082
+ {
1083
+ indicatorId: WB_INDICATORS.INFLATION,
1084
+ name: N.INFLATION,
1085
+ relevance: 'Price stability outlook',
1086
+ usage: 'Frame monetary policy context for the year',
1087
+ priority: PRI,
1088
+ },
1089
+ {
1090
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
1091
+ name: N.UNEMPLOYMENT,
1092
+ relevance: 'Employment outlook',
1093
+ usage: 'Preview employment-related legislative priorities',
1094
+ priority: PRI,
1095
+ },
1096
+ ],
1097
+ secondaryIndicators: [
1098
+ {
1099
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
1100
+ name: N.CO2,
1101
+ relevance: 'Climate targets for the year',
1102
+ usage: 'Assess Green Deal progress trajectory',
1103
+ priority: SEC,
1104
+ },
1105
+ {
1106
+ indicatorId: WB_INDICATORS.RD_EXPENDITURE,
1107
+ name: N.RD,
1108
+ relevance: 'Innovation investment trends',
1109
+ usage: 'Preview technology and research policy outlook',
1110
+ priority: SEC,
1111
+ },
1112
+ ],
1113
+ maxWBCalls: 3,
1114
+ },
1115
+ [ArticleCategory.YEAR_IN_REVIEW]: {
1116
+ category: ArticleCategory.YEAR_IN_REVIEW,
1117
+ enrichmentStrategy: 'Annual retrospective with comprehensive economic assessment. Compare start-of-year vs end-of-year indicators to measure legislative impact.',
1118
+ primaryIndicators: [
1119
+ {
1120
+ indicatorId: WB_INDICATORS.GDP_GROWTH,
1121
+ name: N.GDP_GROWTH,
1122
+ relevance: 'Annual economic performance',
1123
+ usage: 'Assess legislative achievements against economic outcomes',
1124
+ priority: PRI,
1125
+ },
1126
+ {
1127
+ indicatorId: WB_INDICATORS.UNEMPLOYMENT,
1128
+ name: N.UNEMPLOYMENT,
1129
+ relevance: 'Annual employment trend',
1130
+ usage: 'Evaluate employment-focused legislative track record',
1131
+ priority: PRI,
1132
+ },
1133
+ {
1134
+ indicatorId: WB_INDICATORS.CO2_EMISSIONS,
1135
+ name: N.CO2,
1136
+ relevance: 'Annual climate progress',
1137
+ usage: 'Measure Green Deal legislative impact',
1138
+ priority: PRI,
1139
+ },
1140
+ ],
1141
+ secondaryIndicators: [
1142
+ {
1143
+ indicatorId: WB_INDICATORS.INFLATION,
1144
+ name: N.INFLATION,
1145
+ relevance: 'Price stability over the year',
1146
+ usage: 'Retrospective economic conditions assessment',
1147
+ priority: SEC,
1148
+ },
1149
+ ],
1150
+ maxWBCalls: 3,
1151
+ },
1152
+ };
1153
+ // ─── Helper Functions ────────────────────────────────────────────────────────
1154
+ /**
1155
+ * Get World Bank indicators relevant to a specific EP committee.
1156
+ *
1157
+ * @param abbreviation - Committee abbreviation (e.g. 'ECON', 'ENVI')
1158
+ * @returns Array of indicator mappings, or empty array if committee not found
1159
+ */
1160
+ export function getCommitteeIndicators(abbreviation) {
1161
+ const entry = COMMITTEE_INDICATOR_MAP[abbreviation.toUpperCase()];
1162
+ return entry?.indicators ?? [];
1163
+ }
1164
+ /**
1165
+ * Get primary (must-fetch) indicators for a committee.
1166
+ *
1167
+ * @param abbreviation - Committee abbreviation
1168
+ * @returns Array of primary indicator mappings
1169
+ */
1170
+ export function getCommitteePrimaryIndicators(abbreviation) {
1171
+ return getCommitteeIndicators(abbreviation).filter((i) => i.priority === 'primary');
1172
+ }
1173
+ /**
1174
+ * Get World Bank indicators relevant to an article category.
1175
+ *
1176
+ * @param category - Article category
1177
+ * @returns Category indicator entry with enrichment guidance
1178
+ */
1179
+ export function getCategoryIndicators(category) {
1180
+ if (!Object.hasOwn(CATEGORY_INDICATOR_MAP, category)) {
1181
+ return getCategoryIndicators(ArticleCategory.BREAKING_NEWS);
1182
+ }
1183
+ // eslint-disable-next-line security/detect-object-injection -- key validated via Object.hasOwn
1184
+ return CATEGORY_INDICATOR_MAP[category];
1185
+ }
1186
+ /**
1187
+ * Get all unique indicator IDs needed for a set of committees.
1188
+ * Useful for batch-fetching indicator data for multi-committee articles.
1189
+ *
1190
+ * @param abbreviations - Committee abbreviation array
1191
+ * @param primaryOnly - If true, only return primary indicators
1192
+ * @returns Deduplicated array of World Bank indicator IDs
1193
+ */
1194
+ export function getIndicatorIdsForCommittees(abbreviations, primaryOnly = false) {
1195
+ const ids = new Set();
1196
+ for (const abbr of abbreviations) {
1197
+ const indicators = primaryOnly
1198
+ ? getCommitteePrimaryIndicators(abbr)
1199
+ : getCommitteeIndicators(abbr);
1200
+ for (const ind of indicators) {
1201
+ ids.add(ind.indicatorId);
1202
+ }
1203
+ }
1204
+ return [...ids];
1205
+ }
1206
+ /**
1207
+ * Get all indicator IDs needed for an article category, including both
1208
+ * primary and secondary indicators.
1209
+ *
1210
+ * @param category - Article category
1211
+ * @returns Deduplicated array of World Bank indicator IDs
1212
+ */
1213
+ export function getAllCategoryIndicatorIds(category) {
1214
+ const entry = getCategoryIndicators(category);
1215
+ const ids = new Set();
1216
+ for (const ind of entry.primaryIndicators) {
1217
+ ids.add(ind.indicatorId);
1218
+ }
1219
+ for (const ind of entry.secondaryIndicators) {
1220
+ ids.add(ind.indicatorId);
1221
+ }
1222
+ return [...ids];
1223
+ }
1224
+ //# sourceMappingURL=committee-indicator-map.js.map