riksdagsmonitor 0.8.59 → 0.8.62
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/dist/lib/cia/csv-utils.d.ts +75 -0
- package/dist/lib/cia/csv-utils.d.ts.map +1 -0
- package/dist/lib/cia/csv-utils.js +141 -0
- package/dist/lib/cia/csv-utils.js.map +1 -0
- package/dist/lib/cia/data-loader.d.ts +38 -348
- package/dist/lib/cia/data-loader.d.ts.map +1 -1
- package/dist/lib/cia/data-loader.js +54 -766
- package/dist/lib/cia/data-loader.js.map +1 -1
- package/dist/lib/cia/election-predictions.d.ts +1 -1
- package/dist/lib/cia/election-predictions.d.ts.map +1 -1
- package/dist/lib/cia/loaders/committees.d.ts +25 -0
- package/dist/lib/cia/loaders/committees.d.ts.map +1 -0
- package/dist/lib/cia/loaders/committees.js +110 -0
- package/dist/lib/cia/loaders/committees.js.map +1 -0
- package/dist/lib/cia/loaders/demographics.d.ts +22 -0
- package/dist/lib/cia/loaders/demographics.d.ts.map +1 -0
- package/dist/lib/cia/loaders/demographics.js +48 -0
- package/dist/lib/cia/loaders/demographics.js.map +1 -0
- package/dist/lib/cia/loaders/documents.d.ts +22 -0
- package/dist/lib/cia/loaders/documents.d.ts.map +1 -0
- package/dist/lib/cia/loaders/documents.js +51 -0
- package/dist/lib/cia/loaders/documents.js.map +1 -0
- package/dist/lib/cia/loaders/election.d.ts +24 -0
- package/dist/lib/cia/loaders/election.d.ts.map +1 -0
- package/dist/lib/cia/loaders/election.js +111 -0
- package/dist/lib/cia/loaders/election.js.map +1 -0
- package/dist/lib/cia/loaders/index.d.ts +26 -0
- package/dist/lib/cia/loaders/index.d.ts.map +1 -0
- package/dist/lib/cia/loaders/index.js +26 -0
- package/dist/lib/cia/loaders/index.js.map +1 -0
- package/dist/lib/cia/loaders/ministries.d.ts +22 -0
- package/dist/lib/cia/loaders/ministries.d.ts.map +1 -0
- package/dist/lib/cia/loaders/ministries.js +41 -0
- package/dist/lib/cia/loaders/ministries.js.map +1 -0
- package/dist/lib/cia/loaders/overview.d.ts +24 -0
- package/dist/lib/cia/loaders/overview.d.ts.map +1 -0
- package/dist/lib/cia/loaders/overview.js +96 -0
- package/dist/lib/cia/loaders/overview.js.map +1 -0
- package/dist/lib/cia/loaders/parties.d.ts +24 -0
- package/dist/lib/cia/loaders/parties.d.ts.map +1 -0
- package/dist/lib/cia/loaders/parties.js +92 -0
- package/dist/lib/cia/loaders/parties.js.map +1 -0
- package/dist/lib/cia/loaders/risk.d.ts +22 -0
- package/dist/lib/cia/loaders/risk.d.ts.map +1 -0
- package/dist/lib/cia/loaders/risk.js +38 -0
- package/dist/lib/cia/loaders/risk.js.map +1 -0
- package/dist/lib/cia/loaders/top10.d.ts +24 -0
- package/dist/lib/cia/loaders/top10.d.ts.map +1 -0
- package/dist/lib/cia/loaders/top10.js +68 -0
- package/dist/lib/cia/loaders/top10.js.map +1 -0
- package/dist/lib/cia/loaders/voting.d.ts +27 -0
- package/dist/lib/cia/loaders/voting.d.ts.map +1 -0
- package/dist/lib/cia/loaders/voting.js +108 -0
- package/dist/lib/cia/loaders/voting.js.map +1 -0
- package/dist/lib/cia/sources.d.ts +29 -0
- package/dist/lib/cia/sources.d.ts.map +1 -0
- package/dist/lib/cia/sources.js +162 -0
- package/dist/lib/cia/sources.js.map +1 -0
- package/dist/lib/cia/types.d.ts +324 -0
- package/dist/lib/cia/types.d.ts.map +1 -0
- package/dist/lib/cia/types.js +24 -0
- package/dist/lib/cia/types.js.map +1 -0
- package/dist/lib/cia/visualizations.d.ts +1 -1
- package/dist/lib/cia/visualizations.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Ministries
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the ministry effectiveness dashboard from CIA CSV exports.
|
|
7
|
+
* Filters out rows without a ministry name or zero documents produced.
|
|
8
|
+
*
|
|
9
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
10
|
+
* @license Apache-2.0
|
|
11
|
+
* @since 2026
|
|
12
|
+
*/
|
|
13
|
+
import { CSV_SOURCES } from '../sources.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build `MinistryDashboard` from CSV sources.
|
|
16
|
+
*
|
|
17
|
+
* @param loadCSV - CSV loader closure
|
|
18
|
+
* @returns Ministry effectiveness rows sorted by documents produced descending
|
|
19
|
+
*/
|
|
20
|
+
export async function loadMinistryDashboard(loadCSV) {
|
|
21
|
+
const rows = await loadCSV(CSV_SOURCES.ministryEffectiveness.local);
|
|
22
|
+
const ministries = rows
|
|
23
|
+
.filter(r => r.ministry_name && r.documents_produced > 0)
|
|
24
|
+
.map(r => ({
|
|
25
|
+
name: r.ministry_name,
|
|
26
|
+
effectiveness: r.effectiveness_assessment || '',
|
|
27
|
+
documentsProduced: r.documents_produced || 0,
|
|
28
|
+
governmentBills: r.government_bills || 0,
|
|
29
|
+
year: r.year || 0,
|
|
30
|
+
quarter: r.quarter || 0
|
|
31
|
+
}))
|
|
32
|
+
.sort((a, b) => b.documentsProduced - a.documentsProduced);
|
|
33
|
+
return {
|
|
34
|
+
title: 'Ministry Performance',
|
|
35
|
+
description: 'Ministry effectiveness from CIA database exports',
|
|
36
|
+
lastUpdated: new Date().toISOString(),
|
|
37
|
+
ministries,
|
|
38
|
+
_source: 'csv'
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ministries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ministries.js","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/ministries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAgB;IAC1D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,UAAU,GAAoB,IAAI;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAK,CAAC,CAAC,kBAA6B,GAAG,CAAC,CAAC;SACpE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,EAAE,CAAC,CAAC,aAAuB;QAC/B,aAAa,EAAG,CAAC,CAAC,wBAAmC,IAAI,EAAE;QAC3D,iBAAiB,EAAG,CAAC,CAAC,kBAA6B,IAAI,CAAC;QACxD,eAAe,EAAG,CAAC,CAAC,gBAA2B,IAAI,CAAC;QACpD,IAAI,EAAG,CAAC,CAAC,IAAe,IAAI,CAAC;QAC7B,OAAO,EAAG,CAAC,CAAC,OAAkB,IAAI,CAAC;KACpC,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAE7D,OAAO;QACL,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,kDAAkD;QAC/D,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;QACV,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Overview
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the overview dashboard payload from CIA CSV exports.
|
|
7
|
+
* Aggregates active MP counts, party totals, risk alerts, parliament activity
|
|
8
|
+
* and coalition stability into a single `OverviewDashboard` object.
|
|
9
|
+
*
|
|
10
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
11
|
+
* @license Apache-2.0
|
|
12
|
+
* @since 2026
|
|
13
|
+
*/
|
|
14
|
+
import type { OverviewDashboard } from '../types.js';
|
|
15
|
+
import type { LoadCSV } from '../csv-utils.js';
|
|
16
|
+
/**
|
|
17
|
+
* Build an `OverviewDashboard` from CSV sources.
|
|
18
|
+
* Replaces the legacy `overview-dashboard.json` static export.
|
|
19
|
+
*
|
|
20
|
+
* @param loadCSV - CSV loader closure (typically built via `createLoadCSV`)
|
|
21
|
+
* @returns The aggregated overview dashboard payload
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadOverviewDashboard(loadCSV: LoadCSV): Promise<OverviewDashboard>;
|
|
24
|
+
//# sourceMappingURL=overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/overview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkFxF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Overview
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the overview dashboard payload from CIA CSV exports.
|
|
7
|
+
* Aggregates active MP counts, party totals, risk alerts, parliament activity
|
|
8
|
+
* and coalition stability into a single `OverviewDashboard` object.
|
|
9
|
+
*
|
|
10
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
11
|
+
* @license Apache-2.0
|
|
12
|
+
* @since 2026
|
|
13
|
+
*/
|
|
14
|
+
import { CSV_SOURCES, RIKSDAG_PARTIES } from '../sources.js';
|
|
15
|
+
/**
|
|
16
|
+
* Build an `OverviewDashboard` from CSV sources.
|
|
17
|
+
* Replaces the legacy `overview-dashboard.json` static export.
|
|
18
|
+
*
|
|
19
|
+
* @param loadCSV - CSV loader closure (typically built via `createLoadCSV`)
|
|
20
|
+
* @returns The aggregated overview dashboard payload
|
|
21
|
+
*/
|
|
22
|
+
export async function loadOverviewDashboard(loadCSV) {
|
|
23
|
+
const [personStatus, riskByParty, riskLevels, annualBallots, resilience] = await Promise.all([
|
|
24
|
+
loadCSV(CSV_SOURCES.personStatus.local),
|
|
25
|
+
loadCSV(CSV_SOURCES.riskByParty.local),
|
|
26
|
+
loadCSV(CSV_SOURCES.riskLevels.local),
|
|
27
|
+
loadCSV(CSV_SOURCES.annualBallots.local),
|
|
28
|
+
loadCSV(CSV_SOURCES.crisisResilience.local)
|
|
29
|
+
]);
|
|
30
|
+
// Count active MPs
|
|
31
|
+
const activeRow = personStatus.find(r => r.status === 'Tjänstgörande riksdagsledamot');
|
|
32
|
+
const totalMPs = activeRow ? activeRow.person_count : 349;
|
|
33
|
+
// Count unique parties from risk data (only real riksdag parties)
|
|
34
|
+
const partiesInData = new Set(riskByParty.map(r => r.party).filter(p => RIKSDAG_PARTIES.includes(p)));
|
|
35
|
+
const totalParties = partiesInData.size || 8;
|
|
36
|
+
// Risk alerts from risk_by_party
|
|
37
|
+
const highRisk = riskByParty.filter(r => r.risk_level === 'HIGH');
|
|
38
|
+
const medRisk = riskByParty.filter(r => r.risk_level === 'MEDIUM');
|
|
39
|
+
const lowRisk = riskByParty.filter(r => r.risk_level === 'LOW');
|
|
40
|
+
const critical = highRisk.reduce((sum, r) => sum + (r.politician_count || 0), 0);
|
|
41
|
+
const major = medRisk.reduce((sum, r) => sum + (r.politician_count || 0), 0);
|
|
42
|
+
const minor = lowRisk.reduce((sum, r) => sum + (r.politician_count || 0), 0);
|
|
43
|
+
// Total risk rules from risk levels
|
|
44
|
+
const totalRiskRules = riskLevels.length > 0
|
|
45
|
+
? riskLevels.reduce((sum, r) => sum + (r.politician_count || 0), 0)
|
|
46
|
+
: 45;
|
|
47
|
+
// Latest year ballot activity
|
|
48
|
+
const latestBallot = annualBallots.length > 0
|
|
49
|
+
? annualBallots[annualBallots.length - 1]
|
|
50
|
+
: {};
|
|
51
|
+
// Coalition stability from resilience scores (Tidö = M, KD, L, SD)
|
|
52
|
+
const tidoParties = ['M', 'KD', 'L', 'SD'];
|
|
53
|
+
const tidoResilience = resilience.filter(r => tidoParties.includes(r.party));
|
|
54
|
+
const avgResilience = tidoResilience.length > 0
|
|
55
|
+
? Math.round(tidoResilience.reduce((s, r) => s + (r.avg_resilience_score || 0), 0) / tidoResilience.length)
|
|
56
|
+
: 72;
|
|
57
|
+
return {
|
|
58
|
+
title: 'Swedish Riksdag Overview Dashboard',
|
|
59
|
+
description: 'Live intelligence from CIA PostgreSQL database exports',
|
|
60
|
+
lastUpdated: new Date().toISOString(),
|
|
61
|
+
keyMetrics: {
|
|
62
|
+
totalMPs,
|
|
63
|
+
totalParties,
|
|
64
|
+
totalRiskRules,
|
|
65
|
+
governmentCoalition: 'Tidö Agreement',
|
|
66
|
+
coalitionSeats: 176,
|
|
67
|
+
oppositionSeats: 173,
|
|
68
|
+
majorityMargin: 1
|
|
69
|
+
},
|
|
70
|
+
riskAlerts: {
|
|
71
|
+
critical,
|
|
72
|
+
major,
|
|
73
|
+
minor,
|
|
74
|
+
last90Days: { critical, major, minor }
|
|
75
|
+
},
|
|
76
|
+
parliamentActivity: {
|
|
77
|
+
votesLastMonth: latestBallot.total_votes || 0,
|
|
78
|
+
documentsProcessed: latestBallot.unique_ballots || 0,
|
|
79
|
+
motionsSubmitted: 0,
|
|
80
|
+
committeeMeetings: 0
|
|
81
|
+
},
|
|
82
|
+
coalitionStability: {
|
|
83
|
+
stabilityScore: avgResilience,
|
|
84
|
+
riskLevel: avgResilience >= 70 ? 'moderate' : 'high',
|
|
85
|
+
defectionProbability: 100 - avgResilience,
|
|
86
|
+
ideologicalTension: avgResilience < 60 ? 'high' : 'moderate'
|
|
87
|
+
},
|
|
88
|
+
dataQuality: {
|
|
89
|
+
completeness: 98.5,
|
|
90
|
+
lastDataSync: new Date().toISOString(),
|
|
91
|
+
coverage: '50+ years (1971-2026)'
|
|
92
|
+
},
|
|
93
|
+
_source: 'csv'
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Parties
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the party performance dashboard from CIA CSV exports.
|
|
7
|
+
* Joins three CSV sources (performance, metrics, momentum), filters to the
|
|
8
|
+
* 8 Riksdag parties and emits a sorted `PartyPerformance` payload.
|
|
9
|
+
*
|
|
10
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
11
|
+
* @license Apache-2.0
|
|
12
|
+
* @since 2026
|
|
13
|
+
*/
|
|
14
|
+
import type { PartyPerformance } from '../types.js';
|
|
15
|
+
import type { LoadCSV } from '../csv-utils.js';
|
|
16
|
+
/**
|
|
17
|
+
* Build `PartyPerformance` from CSV sources.
|
|
18
|
+
* Replaces the legacy `party-performance.json` static export.
|
|
19
|
+
*
|
|
20
|
+
* @param loadCSV - CSV loader closure
|
|
21
|
+
* @returns Party performance dashboard sorted by seat count descending
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadPartyPerformance(loadCSV: LoadCSV): Promise<PartyPerformance>;
|
|
24
|
+
//# sourceMappingURL=parties.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parties.d.ts","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/parties.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+EtF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Parties
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the party performance dashboard from CIA CSV exports.
|
|
7
|
+
* Joins three CSV sources (performance, metrics, momentum), filters to the
|
|
8
|
+
* 8 Riksdag parties and emits a sorted `PartyPerformance` payload.
|
|
9
|
+
*
|
|
10
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
11
|
+
* @license Apache-2.0
|
|
12
|
+
* @since 2026
|
|
13
|
+
*/
|
|
14
|
+
import { CSV_SOURCES, RIKSDAG_PARTIES } from '../sources.js';
|
|
15
|
+
/**
|
|
16
|
+
* Build `PartyPerformance` from CSV sources.
|
|
17
|
+
* Replaces the legacy `party-performance.json` static export.
|
|
18
|
+
*
|
|
19
|
+
* @param loadCSV - CSV loader closure
|
|
20
|
+
* @returns Party performance dashboard sorted by seat count descending
|
|
21
|
+
*/
|
|
22
|
+
export async function loadPartyPerformance(loadCSV) {
|
|
23
|
+
const [performance, metrics, momentum] = await Promise.all([
|
|
24
|
+
loadCSV(CSV_SOURCES.partyPerformance.local),
|
|
25
|
+
loadCSV(CSV_SOURCES.partyMetrics.local),
|
|
26
|
+
loadCSV(CSV_SOURCES.partyMomentum.local)
|
|
27
|
+
]);
|
|
28
|
+
const activePerformance = performance.filter(p => RIKSDAG_PARTIES.includes(p.party));
|
|
29
|
+
// Build a lookup from the detailed metrics
|
|
30
|
+
const metricsMap = {};
|
|
31
|
+
metrics.forEach(m => {
|
|
32
|
+
if (RIKSDAG_PARTIES.includes(m.party)) {
|
|
33
|
+
metricsMap[m.party] = m;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
// Get latest momentum per party
|
|
37
|
+
const latestMomentum = {};
|
|
38
|
+
momentum
|
|
39
|
+
.filter(m => RIKSDAG_PARTIES.includes(m.party))
|
|
40
|
+
.forEach(m => {
|
|
41
|
+
const party = m.party;
|
|
42
|
+
if (!latestMomentum[party] ||
|
|
43
|
+
m.year > latestMomentum[party].year ||
|
|
44
|
+
(m.year === latestMomentum[party].year &&
|
|
45
|
+
m.quarter > latestMomentum[party].quarter)) {
|
|
46
|
+
latestMomentum[party] = m;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// Known seat counts (from 2022 election results)
|
|
50
|
+
const seatMap = {
|
|
51
|
+
S: 107, SD: 73, M: 68, C: 24, V: 24, KD: 19, L: 16, MP: 18
|
|
52
|
+
};
|
|
53
|
+
const parties = activePerformance.map(p => {
|
|
54
|
+
const party = p.party;
|
|
55
|
+
const m = metricsMap[party] || {};
|
|
56
|
+
const mom = latestMomentum[party] || {};
|
|
57
|
+
return {
|
|
58
|
+
id: party,
|
|
59
|
+
partyName: p.party_name || party,
|
|
60
|
+
shortName: party,
|
|
61
|
+
metrics: {
|
|
62
|
+
seats: seatMap[party] || 0,
|
|
63
|
+
voteShare: 0,
|
|
64
|
+
memberCount: p.active_members || 0,
|
|
65
|
+
documentsAuthored: p.documents_last_year || 0,
|
|
66
|
+
motionsSubmitted: p.motions_last_year || 0,
|
|
67
|
+
successRate: m.avg_win_rate || 0
|
|
68
|
+
},
|
|
69
|
+
voting: {
|
|
70
|
+
totalVotes: m.total_votes_last_year || 0,
|
|
71
|
+
cohesionScore: m.avg_participation_rate || 0,
|
|
72
|
+
rebellionRate: m.avg_rebel_rate || 0
|
|
73
|
+
},
|
|
74
|
+
trends: {
|
|
75
|
+
supportTrend: (mom.trend_direction || 'stable').toLowerCase(),
|
|
76
|
+
activityTrend: (mom.stability_classification || 'stable').toLowerCase(),
|
|
77
|
+
performanceLevel: m.performance_level || p.performance_level || ''
|
|
78
|
+
},
|
|
79
|
+
_source: 'csv'
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
// Sort by seats descending
|
|
83
|
+
parties.sort((a, b) => (b.metrics.seats || 0) - (a.metrics.seats || 0));
|
|
84
|
+
return {
|
|
85
|
+
title: 'Party Performance Dashboard',
|
|
86
|
+
description: 'Live party data from CIA PostgreSQL database exports',
|
|
87
|
+
lastUpdated: new Date().toISOString(),
|
|
88
|
+
parties,
|
|
89
|
+
_source: 'csv'
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=parties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parties.js","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/parties.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgB;IACzD,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzD,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC3C,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACvC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC;KACzC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC,CAAC;IAE/F,2CAA2C;IAC3C,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAClB,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAe,CAAC,EAAE,CAAC;YAChD,UAAU,CAAC,CAAC,CAAC,KAAe,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,QAAQ;SACL,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAe,CAAC,CAAC;SACxD,OAAO,CAAC,CAAC,CAAC,EAAE;QACX,MAAM,KAAK,GAAG,CAAC,CAAC,KAAe,CAAC;QAChC,IACE,CAAC,cAAc,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,IAAe,GAAI,cAAc,CAAC,KAAK,CAAC,CAAC,IAAe;YAC3D,CAAE,CAAC,CAAC,IAAe,KAAM,cAAc,CAAC,KAAK,CAAC,CAAC,IAAe;gBAC3D,CAAC,CAAC,OAAkB,GAAI,cAAc,CAAC,KAAK,CAAC,CAAC,OAAkB,CAAC,EACpE,CAAC;YACD,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,iDAAiD;IACjD,MAAM,OAAO,GAA2B;QACtC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;KAC3D,CAAC;IAEF,MAAM,OAAO,GAAiB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACtD,MAAM,KAAK,GAAG,CAAC,CAAC,KAAe,CAAC;QAChC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAExC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAG,CAAC,CAAC,UAAqB,IAAI,KAAK;YAC5C,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE;gBACP,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC1B,SAAS,EAAE,CAAC;gBACZ,WAAW,EAAG,CAAC,CAAC,cAAyB,IAAI,CAAC;gBAC9C,iBAAiB,EAAG,CAAC,CAAC,mBAA8B,IAAI,CAAC;gBACzD,gBAAgB,EAAG,CAAC,CAAC,iBAA4B,IAAI,CAAC;gBACtD,WAAW,EAAG,CAAC,CAAC,YAAuB,IAAI,CAAC;aAC7C;YACD,MAAM,EAAE;gBACN,UAAU,EAAG,CAAC,CAAC,qBAAgC,IAAI,CAAC;gBACpD,aAAa,EAAG,CAAC,CAAC,sBAAiC,IAAI,CAAC;gBACxD,aAAa,EAAG,CAAC,CAAC,cAAyB,IAAI,CAAC;aACjD;YACD,MAAM,EAAE;gBACN,YAAY,EAAE,CAAE,GAAG,CAAC,eAA0B,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE;gBACzE,aAAa,EAAE,CAAE,GAAG,CAAC,wBAAmC,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE;gBACnF,gBAAgB,EAAG,CAAC,CAAC,iBAA4B,IAAK,CAAC,CAAC,iBAA4B,IAAI,EAAE;aAC3F;YACD,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IAExE,OAAO;QACL,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;QACP,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Risk
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the risk score evolution dashboard from CIA CSV exports.
|
|
7
|
+
* Filters out periods with zero politicians and emits temporal severity data.
|
|
8
|
+
*
|
|
9
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
10
|
+
* @license Apache-2.0
|
|
11
|
+
* @since 2026
|
|
12
|
+
*/
|
|
13
|
+
import type { RiskEvolutionDashboard } from '../types.js';
|
|
14
|
+
import type { LoadCSV } from '../csv-utils.js';
|
|
15
|
+
/**
|
|
16
|
+
* Build `RiskEvolutionDashboard` from CSV sources.
|
|
17
|
+
*
|
|
18
|
+
* @param loadCSV - CSV loader closure
|
|
19
|
+
* @returns Risk evolution entries grouped by assessment period and severity
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadRiskEvolution(loadCSV: LoadCSV): Promise<RiskEvolutionDashboard>;
|
|
22
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAsB,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAmBzF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Risk
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the risk score evolution dashboard from CIA CSV exports.
|
|
7
|
+
* Filters out periods with zero politicians and emits temporal severity data.
|
|
8
|
+
*
|
|
9
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
10
|
+
* @license Apache-2.0
|
|
11
|
+
* @since 2026
|
|
12
|
+
*/
|
|
13
|
+
import { CSV_SOURCES } from '../sources.js';
|
|
14
|
+
/**
|
|
15
|
+
* Build `RiskEvolutionDashboard` from CSV sources.
|
|
16
|
+
*
|
|
17
|
+
* @param loadCSV - CSV loader closure
|
|
18
|
+
* @returns Risk evolution entries grouped by assessment period and severity
|
|
19
|
+
*/
|
|
20
|
+
export async function loadRiskEvolution(loadCSV) {
|
|
21
|
+
const rows = await loadCSV(CSV_SOURCES.riskEvolution.local);
|
|
22
|
+
const entries = rows
|
|
23
|
+
.filter(r => r.politician_count > 0)
|
|
24
|
+
.map(r => ({
|
|
25
|
+
period: r.assessment_period || '',
|
|
26
|
+
severity: r.risk_severity || '',
|
|
27
|
+
politicianCount: r.politician_count || 0,
|
|
28
|
+
avgRiskScore: r.avg_risk_score || 0
|
|
29
|
+
}));
|
|
30
|
+
return {
|
|
31
|
+
title: 'Risk Score Evolution',
|
|
32
|
+
description: 'Temporal risk score changes from CIA database exports',
|
|
33
|
+
lastUpdated: new Date().toISOString(),
|
|
34
|
+
entries,
|
|
35
|
+
_source: 'csv'
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAgB;IACtD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAyB,IAAI;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,gBAA2B,GAAG,CAAC,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,MAAM,EAAG,CAAC,CAAC,iBAA4B,IAAI,EAAE;QAC7C,QAAQ,EAAG,CAAC,CAAC,aAAwB,IAAI,EAAE;QAC3C,eAAe,EAAG,CAAC,CAAC,gBAA2B,IAAI,CAAC;QACpD,YAAY,EAAG,CAAC,CAAC,cAAyB,IAAI,CAAC;KAChD,CAAC,CAAC,CAAC;IAEN,OAAO;QACL,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,uDAAuD;QACpE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;QACP,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Top10
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the top-10 most influential MPs ranking from CIA CSV exports.
|
|
7
|
+
* Joins influence metrics with the MP risk summary and ranks by network
|
|
8
|
+
* connections.
|
|
9
|
+
*
|
|
10
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
11
|
+
* @license Apache-2.0
|
|
12
|
+
* @since 2026
|
|
13
|
+
*/
|
|
14
|
+
import type { Top10Influential } from '../types.js';
|
|
15
|
+
import type { LoadCSV } from '../csv-utils.js';
|
|
16
|
+
/**
|
|
17
|
+
* Build `Top10Influential` ranking from CSV sources.
|
|
18
|
+
* Replaces the legacy `top10-influential-mps.json` static export.
|
|
19
|
+
*
|
|
20
|
+
* @param loadCSV - CSV loader closure
|
|
21
|
+
* @returns Top 10 MPs ranked by network connections, joined with risk data
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadTop10Influential(loadCSV: LoadCSV): Promise<Top10Influential>;
|
|
24
|
+
//# sourceMappingURL=top10.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"top10.d.ts","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/top10.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiDtF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Top10
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the top-10 most influential MPs ranking from CIA CSV exports.
|
|
7
|
+
* Joins influence metrics with the MP risk summary and ranks by network
|
|
8
|
+
* connections.
|
|
9
|
+
*
|
|
10
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
11
|
+
* @license Apache-2.0
|
|
12
|
+
* @since 2026
|
|
13
|
+
*/
|
|
14
|
+
import { CSV_SOURCES } from '../sources.js';
|
|
15
|
+
/**
|
|
16
|
+
* Build `Top10Influential` ranking from CSV sources.
|
|
17
|
+
* Replaces the legacy `top10-influential-mps.json` static export.
|
|
18
|
+
*
|
|
19
|
+
* @param loadCSV - CSV loader closure
|
|
20
|
+
* @returns Top 10 MPs ranked by network connections, joined with risk data
|
|
21
|
+
*/
|
|
22
|
+
export async function loadTop10Influential(loadCSV) {
|
|
23
|
+
const [influence, riskSummary] = await Promise.all([
|
|
24
|
+
loadCSV(CSV_SOURCES.influenceMetrics.local),
|
|
25
|
+
loadCSV(CSV_SOURCES.riskSummary.local)
|
|
26
|
+
]);
|
|
27
|
+
// Build risk lookup by person_id
|
|
28
|
+
const riskMap = {};
|
|
29
|
+
riskSummary.forEach(r => {
|
|
30
|
+
riskMap[r.person_id] = r;
|
|
31
|
+
});
|
|
32
|
+
// Sort by network_connections descending, take top 10
|
|
33
|
+
const sorted = [...influence]
|
|
34
|
+
.filter(mp => mp.network_connections > 0)
|
|
35
|
+
.sort((a, b) => (b.network_connections || 0) - (a.network_connections || 0))
|
|
36
|
+
.slice(0, 10);
|
|
37
|
+
const rankings = sorted.map((mp, idx) => {
|
|
38
|
+
const risk = riskMap[mp.person_id] || {};
|
|
39
|
+
return {
|
|
40
|
+
rank: idx + 1,
|
|
41
|
+
id: String(mp.person_id),
|
|
42
|
+
firstName: mp.first_name || '',
|
|
43
|
+
lastName: mp.last_name || '',
|
|
44
|
+
party: mp.party || '',
|
|
45
|
+
role: mp.influence_classification
|
|
46
|
+
? mp.influence_classification
|
|
47
|
+
.replace(/_/g, ' ')
|
|
48
|
+
.toLowerCase()
|
|
49
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
50
|
+
: '',
|
|
51
|
+
influenceScore: mp.network_connections || 0,
|
|
52
|
+
networkConnections: mp.network_connections || 0,
|
|
53
|
+
brokerClassification: mp.broker_classification || '',
|
|
54
|
+
riskLevel: risk.risk_level || '',
|
|
55
|
+
riskScore: risk.risk_score || 0,
|
|
56
|
+
_source: 'csv'
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
title: 'Top 10 Most Influential MPs',
|
|
61
|
+
description: 'Network analysis from CIA politician influence metrics view',
|
|
62
|
+
lastUpdated: new Date().toISOString(),
|
|
63
|
+
methodology: 'Ranked by network_connections from view_riksdagen_politician_influence_metrics',
|
|
64
|
+
rankings,
|
|
65
|
+
_source: 'csv'
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=top10.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"top10.js","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/top10.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAgB;IACzD,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC3C,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC;KACvC,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACtB,OAAO,CAAC,CAAC,CAAC,SAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,sDAAsD;IACtD,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;SAC1B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAE,EAAE,CAAC,mBAA8B,GAAG,CAAC,CAAC;SACpD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC,CAAC,mBAA8B,IAAI,CAAC,CAAC,GAAG,CAAE,CAAC,CAAC,mBAA8B,IAAI,CAAC,CAAC,CAAC;SACnG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,SAAmB,CAAC,IAAI,EAAE,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,GAAG,GAAG,CAAC;YACb,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC;YACxB,SAAS,EAAG,EAAE,CAAC,UAAqB,IAAI,EAAE;YAC1C,QAAQ,EAAG,EAAE,CAAC,SAAoB,IAAI,EAAE;YACxC,KAAK,EAAG,EAAE,CAAC,KAAgB,IAAI,EAAE;YACjC,IAAI,EAAG,EAAE,CAAC,wBAAmC;gBAC3C,CAAC,CAAE,EAAE,CAAC,wBAAmC;qBACpC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;qBAClB,WAAW,EAAE;qBACb,OAAO,CAAC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACrD,CAAC,CAAC,EAAE;YACN,cAAc,EAAG,EAAE,CAAC,mBAA8B,IAAI,CAAC;YACvD,kBAAkB,EAAG,EAAE,CAAC,mBAA8B,IAAI,CAAC;YAC3D,oBAAoB,EAAG,EAAE,CAAC,qBAAgC,IAAI,EAAE;YAChE,SAAS,EAAG,IAAI,CAAC,UAAqB,IAAI,EAAE;YAC5C,SAAS,EAAG,IAAI,CAAC,UAAqB,IAAI,CAAC;YAC3C,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,6DAA6D;QAC1E,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,WAAW,EAAE,gFAAgF;QAC7F,QAAQ;QACR,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Voting
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the voting patterns analysis from CIA CSV exports.
|
|
7
|
+
* Prefers the real coalition alignment matrix when available; falls back to
|
|
8
|
+
* win-rate similarity when not. Derives rebellion tracking from per-party
|
|
9
|
+
* risk distribution.
|
|
10
|
+
*
|
|
11
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
12
|
+
* @license Apache-2.0
|
|
13
|
+
* @since 2026
|
|
14
|
+
*/
|
|
15
|
+
import type { VotingPatterns } from '../types.js';
|
|
16
|
+
import type { LoadCSV } from '../csv-utils.js';
|
|
17
|
+
/**
|
|
18
|
+
* Build `VotingPatterns` from CSV sources.
|
|
19
|
+
*
|
|
20
|
+
* Uses real coalition alignment data for the agreement matrix when present;
|
|
21
|
+
* otherwise derives a similarity matrix from party effectiveness win rates.
|
|
22
|
+
*
|
|
23
|
+
* @param loadCSV - CSV loader closure
|
|
24
|
+
* @returns Voting patterns analysis with party-pair agreement matrix
|
|
25
|
+
*/
|
|
26
|
+
export declare function loadVotingPatterns(loadCSV: LoadCSV): Promise<VotingPatterns>;
|
|
27
|
+
//# sourceMappingURL=voting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voting.d.ts","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/voting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAA0B,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAyFlF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module CIA/Loaders/Voting
|
|
3
|
+
* @category Intelligence Platform - Data Acquisition & Pipeline Management
|
|
4
|
+
*
|
|
5
|
+
* @description
|
|
6
|
+
* Builds the voting patterns analysis from CIA CSV exports.
|
|
7
|
+
* Prefers the real coalition alignment matrix when available; falls back to
|
|
8
|
+
* win-rate similarity when not. Derives rebellion tracking from per-party
|
|
9
|
+
* risk distribution.
|
|
10
|
+
*
|
|
11
|
+
* @author Hack23 AB - Data Pipeline Engineering
|
|
12
|
+
* @license Apache-2.0
|
|
13
|
+
* @since 2026
|
|
14
|
+
*/
|
|
15
|
+
import { CSV_SOURCES, RIKSDAG_PARTIES } from '../sources.js';
|
|
16
|
+
/**
|
|
17
|
+
* Build `VotingPatterns` from CSV sources.
|
|
18
|
+
*
|
|
19
|
+
* Uses real coalition alignment data for the agreement matrix when present;
|
|
20
|
+
* otherwise derives a similarity matrix from party effectiveness win rates.
|
|
21
|
+
*
|
|
22
|
+
* @param loadCSV - CSV loader closure
|
|
23
|
+
* @returns Voting patterns analysis with party-pair agreement matrix
|
|
24
|
+
*/
|
|
25
|
+
export async function loadVotingPatterns(loadCSV) {
|
|
26
|
+
const [coalitionAlignment, effectiveness, riskByParty] = await Promise.all([
|
|
27
|
+
loadCSV(CSV_SOURCES.coalitionAlignment.local),
|
|
28
|
+
loadCSV(CSV_SOURCES.partyEffectiveness.local),
|
|
29
|
+
loadCSV(CSV_SOURCES.riskByParty.local)
|
|
30
|
+
]);
|
|
31
|
+
const labels = [...RIKSDAG_PARTIES];
|
|
32
|
+
const partyNames = [
|
|
33
|
+
'Social Democrats', 'Moderates', 'Sweden Democrats', 'Centre',
|
|
34
|
+
'Left', 'Christian Democrats', 'Liberals', 'Green'
|
|
35
|
+
];
|
|
36
|
+
// Build agreement matrix from real coalition alignment data
|
|
37
|
+
const alignmentLookup = {};
|
|
38
|
+
coalitionAlignment
|
|
39
|
+
.filter(r => RIKSDAG_PARTIES.includes(r.party1) && RIKSDAG_PARTIES.includes(r.party2))
|
|
40
|
+
.forEach(r => {
|
|
41
|
+
const key1 = `${r.party1}:${r.party2}`;
|
|
42
|
+
const key2 = `${r.party2}:${r.party1}`;
|
|
43
|
+
const rate = Math.round((r.alignment_rate || 0) * 100);
|
|
44
|
+
alignmentLookup[key1] = rate;
|
|
45
|
+
alignmentLookup[key2] = rate;
|
|
46
|
+
});
|
|
47
|
+
const hasAlignmentData = Object.keys(alignmentLookup).length > 0;
|
|
48
|
+
let agreementMatrix;
|
|
49
|
+
if (hasAlignmentData) {
|
|
50
|
+
agreementMatrix = labels.map(p1 => labels.map(p2 => {
|
|
51
|
+
if (p1 === p2)
|
|
52
|
+
return 100;
|
|
53
|
+
return alignmentLookup[`${p1}:${p2}`] ?? 50;
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Fallback: build from win rate similarity
|
|
58
|
+
const latestWinRate = {};
|
|
59
|
+
effectiveness
|
|
60
|
+
.filter(e => RIKSDAG_PARTIES.includes(e.party))
|
|
61
|
+
.forEach(e => {
|
|
62
|
+
const party = e.party;
|
|
63
|
+
if (!latestWinRate[party] ||
|
|
64
|
+
e.year > latestWinRate[party].year ||
|
|
65
|
+
(e.year === latestWinRate[party].year &&
|
|
66
|
+
e.quarter > latestWinRate[party].quarter)) {
|
|
67
|
+
latestWinRate[party] = e;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
agreementMatrix = labels.map(p1 => {
|
|
71
|
+
const wr1 = latestWinRate[p1] ? latestWinRate[p1].avg_win_rate : 50;
|
|
72
|
+
return labels.map(p2 => {
|
|
73
|
+
if (p1 === p2)
|
|
74
|
+
return 100;
|
|
75
|
+
const wr2 = latestWinRate[p2] ? latestWinRate[p2].avg_win_rate : 50;
|
|
76
|
+
return Math.max(0, Math.round(100 - Math.abs(wr1 - wr2)));
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Rebellion tracking from risk data (HIGH risk ~ rebellious)
|
|
81
|
+
const rebellionTracking = RIKSDAG_PARTIES
|
|
82
|
+
.map(party => {
|
|
83
|
+
const partyRisks = riskByParty.filter(r => r.party === party);
|
|
84
|
+
const highRisk = partyRisks.find(r => r.risk_level === 'HIGH');
|
|
85
|
+
const total = partyRisks.reduce((s, r) => s + (r.politician_count || 0), 0);
|
|
86
|
+
const highCount = highRisk ? highRisk.politician_count : 0;
|
|
87
|
+
const rebellionRate = total > 0 ? Math.round((highCount / total) * 100 * 10) / 10 : 0;
|
|
88
|
+
return {
|
|
89
|
+
party,
|
|
90
|
+
rebellionRate,
|
|
91
|
+
trend: rebellionRate > 25 ? 'increasing' : rebellionRate > 15 ? 'stable' : 'decreasing'
|
|
92
|
+
};
|
|
93
|
+
})
|
|
94
|
+
.filter(r => r.rebellionRate > 0);
|
|
95
|
+
return {
|
|
96
|
+
title: 'Voting Patterns Analysis',
|
|
97
|
+
description: hasAlignmentData
|
|
98
|
+
? 'Real coalition alignment data from CIA voting analysis'
|
|
99
|
+
: 'Derived from CIA party effectiveness trends and risk data',
|
|
100
|
+
lastUpdated: new Date().toISOString(),
|
|
101
|
+
analysisPeriod: '2022-2026',
|
|
102
|
+
votingMatrix: { labels, partyNames, agreementMatrix },
|
|
103
|
+
keyIssues: [],
|
|
104
|
+
rebellionTracking,
|
|
105
|
+
_source: 'csv'
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=voting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voting.js","sourceRoot":"","sources":["../../../../src/browser/cia/loaders/voting.ts"],"names":[],"mappings":"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"}
|