@civiq/entity-resolution 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +135 -0
- package/data/bioguide-fec-mapping.json +4186 -0
- package/data/sec-sic-data.json +10427 -0
- package/dist/__tests__/company-entity-resolver.test.d.ts +6 -0
- package/dist/__tests__/company-entity-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/company-entity-resolver.test.js +267 -0
- package/dist/__tests__/company-entity-resolver.test.js.map +1 -0
- package/dist/__tests__/entity-resolution.test.d.ts +2 -0
- package/dist/__tests__/entity-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/entity-resolution.test.js +296 -0
- package/dist/__tests__/entity-resolution.test.js.map +1 -0
- package/dist/__tests__/fec-entity-resolution.test.d.ts +2 -0
- package/dist/__tests__/fec-entity-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/fec-entity-resolution.test.js +49 -0
- package/dist/__tests__/fec-entity-resolution.test.js.map +1 -0
- package/dist/bioguide-fec-mapping.d.ts +27 -0
- package/dist/bioguide-fec-mapping.d.ts.map +1 -0
- package/dist/bioguide-fec-mapping.js +57 -0
- package/dist/bioguide-fec-mapping.js.map +1 -0
- package/dist/cache.d.ts +18 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +18 -0
- package/dist/cache.js.map +1 -0
- package/dist/committee-agency-map.d.ts +58 -0
- package/dist/committee-agency-map.d.ts.map +1 -0
- package/dist/committee-agency-map.js +658 -0
- package/dist/committee-agency-map.js.map +1 -0
- package/dist/committee-alias-table.d.ts +11 -0
- package/dist/committee-alias-table.d.ts.map +1 -0
- package/dist/committee-alias-table.js +191 -0
- package/dist/committee-alias-table.js.map +1 -0
- package/dist/company-alias-table.d.ts +36 -0
- package/dist/company-alias-table.d.ts.map +1 -0
- package/dist/company-alias-table.js +1307 -0
- package/dist/company-alias-table.js.map +1 -0
- package/dist/company-entity-resolver.d.ts +94 -0
- package/dist/company-entity-resolver.d.ts.map +1 -0
- package/dist/company-entity-resolver.js +282 -0
- package/dist/company-entity-resolver.js.map +1 -0
- package/dist/configure.d.ts +15 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +19 -0
- package/dist/configure.js.map +1 -0
- package/dist/fec-entity-resolution.d.ts +88 -0
- package/dist/fec-entity-resolution.d.ts.map +1 -0
- package/dist/fec-entity-resolution.js +407 -0
- package/dist/fec-entity-resolution.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/industry-taxonomy.d.ts +90 -0
- package/dist/industry-taxonomy.d.ts.map +1 -0
- package/dist/industry-taxonomy.js +1026 -0
- package/dist/industry-taxonomy.js.map +1 -0
- package/dist/lda-issue-policy-map.d.ts +13 -0
- package/dist/lda-issue-policy-map.d.ts.map +1 -0
- package/dist/lda-issue-policy-map.js +193 -0
- package/dist/lda-issue-policy-map.js.map +1 -0
- package/dist/lobbying-committee-resolver.d.ts +23 -0
- package/dist/lobbying-committee-resolver.d.ts.map +1 -0
- package/dist/lobbying-committee-resolver.js +158 -0
- package/dist/lobbying-committee-resolver.js.map +1 -0
- package/dist/logger.d.ts +20 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +20 -0
- package/dist/logger.js.map +1 -0
- package/dist/sic-sector-map.d.ts +32 -0
- package/dist/sic-sector-map.d.ts.map +1 -0
- package/dist/sic-sector-map.js +109 -0
- package/dist/sic-sector-map.js.map +1 -0
- package/dist/ticker-industry-resolver.d.ts +22 -0
- package/dist/ticker-industry-resolver.d.ts.map +1 -0
- package/dist/ticker-industry-resolver.js +254 -0
- package/dist/ticker-industry-resolver.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { entitiesMatch, normalizeEntity } from '../fec-entity-resolution';
|
|
3
|
+
describe('entitiesMatch - abbreviation expansion', () => {
|
|
4
|
+
it('matches J&J to Johnson & Johnson', () => {
|
|
5
|
+
expect(entitiesMatch({ name: 'J&J' }, { name: 'Johnson & Johnson' })).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
it('matches GM to General Motors Corp', () => {
|
|
8
|
+
expect(entitiesMatch({ name: 'GM' }, { name: 'General Motors Corp' })).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it('matches GE to General Electric', () => {
|
|
11
|
+
expect(entitiesMatch({ name: 'GE' }, { name: 'General Electric' })).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it('does not match IBM to Intl Business Machines (partial abbreviation not in table)', () => {
|
|
14
|
+
expect(entitiesMatch({ name: 'IBM' }, { name: 'Intl Business Machines' })).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
it('matches AT&T to AT&T Inc', () => {
|
|
17
|
+
expect(entitiesMatch({ name: 'AT&T' }, { name: 'AT&T Inc' })).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it('matches JPMorgan to JPMorgan Chase', () => {
|
|
20
|
+
expect(entitiesMatch({ name: 'JPMorgan' }, { name: 'JPMorgan Chase' })).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it('matches BofA to Bank of America', () => {
|
|
23
|
+
expect(entitiesMatch({ name: 'BofA' }, { name: 'Bank of America' })).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('entitiesMatch - existing Levenshtein behavior preserved', () => {
|
|
27
|
+
it('matches exact names', () => {
|
|
28
|
+
expect(entitiesMatch({ name: 'Google Inc' }, { name: 'Google Inc' })).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it('matches similar names above threshold', () => {
|
|
31
|
+
expect(entitiesMatch({ name: 'Google Inc' }, { name: 'Google Inc.' })).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it('rejects dissimilar names', () => {
|
|
34
|
+
expect(entitiesMatch({ name: 'Google' }, { name: 'Microsoft' })).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('normalizeEntity', () => {
|
|
38
|
+
it('normalizes organization names', () => {
|
|
39
|
+
const result = normalizeEntity('Google Inc.');
|
|
40
|
+
expect(result.entityType).toBe('organization');
|
|
41
|
+
expect(result.normalizedName).toBe('GOOGLE');
|
|
42
|
+
});
|
|
43
|
+
it('normalizes individual names from LAST, FIRST format', () => {
|
|
44
|
+
const result = normalizeEntity('SMITH, JOHN');
|
|
45
|
+
expect(result.entityType).toBe('individual');
|
|
46
|
+
expect(result.displayName).toBe('JOHN SMITH');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=fec-entity-resolution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fec-entity-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/fec-entity-resolution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-2025 Mark Sandford
|
|
3
|
+
* Licensed under the MIT License. See LICENSE and NOTICE files.
|
|
4
|
+
*/
|
|
5
|
+
export interface FECMapping {
|
|
6
|
+
fecId: string;
|
|
7
|
+
name: string;
|
|
8
|
+
state: string;
|
|
9
|
+
district?: string;
|
|
10
|
+
office: 'H' | 'S';
|
|
11
|
+
lastUpdated: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const bioguideToFECMapping: Record<string, FECMapping>;
|
|
14
|
+
export declare function getFECIdFromBioguide(bioguideId: string): string | null;
|
|
15
|
+
export declare function hasFECMapping(bioguideId: string): boolean;
|
|
16
|
+
export declare function addFECMapping(bioguideId: string, mapping: FECMapping): void;
|
|
17
|
+
export declare function getBioguideFromFEC(fecCandidateId: string): string | null;
|
|
18
|
+
export declare function getMappingByFEC(fecCandidateId: string): (FECMapping & {
|
|
19
|
+
bioguideId: string;
|
|
20
|
+
}) | null;
|
|
21
|
+
export declare function getMappingStats(): {
|
|
22
|
+
totalMappings: number;
|
|
23
|
+
houseMembers: number;
|
|
24
|
+
senateMembers: number;
|
|
25
|
+
lastUpdated: string;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=bioguide-fec-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bioguide-fec-mapping.d.ts","sourceRoot":"","sources":["../src/bioguide-fec-mapping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAG3D,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAE3E;AAQD,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAExE;AAGD,wBAAgB,eAAe,CAC7B,cAAc,EAAE,MAAM,GACrB,CAAC,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAM9C;AAGD,wBAAgB,eAAe,IAAI;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,CAQA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-2025 Mark Sandford
|
|
3
|
+
* Licensed under the MIT License. See LICENSE and NOTICE files.
|
|
4
|
+
*/
|
|
5
|
+
// Bioguide ID to FEC Candidate ID mapping
|
|
6
|
+
// This mapping helps match Congressional representatives to their FEC campaign finance records
|
|
7
|
+
// Format: bioguideId -> { fecId, name, state, district?, office, lastUpdated }
|
|
8
|
+
//
|
|
9
|
+
// AUTO-GENERATED FROM congress-legislators data on 2025-09-18
|
|
10
|
+
// Source: https://github.com/unitedstates/congress-legislators
|
|
11
|
+
// To regenerate: npm run generate-fec-mappings
|
|
12
|
+
// MANUALLY UPDATED: 2026-01-08 - Removed departed members (Greene, LaMalfa, Sherrill)
|
|
13
|
+
// Added new members (Grijalva, Van Epps, Walkinshaw)
|
|
14
|
+
// Data stored in bioguide-fec-mapping.json, loaded via JSON import
|
|
15
|
+
import jsonData from '../data/bioguide-fec-mapping.json';
|
|
16
|
+
// Complete mappings for 119th Congress (537 representatives)
|
|
17
|
+
export const bioguideToFECMapping = jsonData;
|
|
18
|
+
// Helper function to get FEC ID from Bioguide ID
|
|
19
|
+
export function getFECIdFromBioguide(bioguideId) {
|
|
20
|
+
const mapping = bioguideToFECMapping[bioguideId];
|
|
21
|
+
return mapping ? mapping.fecId : null;
|
|
22
|
+
}
|
|
23
|
+
// Helper function to check if a mapping exists
|
|
24
|
+
export function hasFECMapping(bioguideId) {
|
|
25
|
+
return bioguideId in bioguideToFECMapping;
|
|
26
|
+
}
|
|
27
|
+
// Function to add or update a mapping (for future use)
|
|
28
|
+
export function addFECMapping(bioguideId, mapping) {
|
|
29
|
+
bioguideToFECMapping[bioguideId] = mapping;
|
|
30
|
+
}
|
|
31
|
+
// Reverse mapping: FEC Candidate ID -> Bioguide ID (computed once at module load)
|
|
32
|
+
const fecToBioguideMapping = Object.fromEntries(Object.entries(bioguideToFECMapping).map(([bioguideId, mapping]) => [mapping.fecId, bioguideId]));
|
|
33
|
+
// Reverse lookup: get bioguideId from FEC candidate ID
|
|
34
|
+
export function getBioguideFromFEC(fecCandidateId) {
|
|
35
|
+
return fecToBioguideMapping[fecCandidateId] ?? null;
|
|
36
|
+
}
|
|
37
|
+
// Get the full mapping entry by FEC candidate ID
|
|
38
|
+
export function getMappingByFEC(fecCandidateId) {
|
|
39
|
+
const bioguideId = fecToBioguideMapping[fecCandidateId];
|
|
40
|
+
if (!bioguideId)
|
|
41
|
+
return null;
|
|
42
|
+
const mapping = bioguideToFECMapping[bioguideId];
|
|
43
|
+
if (!mapping)
|
|
44
|
+
return null;
|
|
45
|
+
return { ...mapping, bioguideId };
|
|
46
|
+
}
|
|
47
|
+
// Get mapping statistics
|
|
48
|
+
export function getMappingStats() {
|
|
49
|
+
const mappings = Object.values(bioguideToFECMapping);
|
|
50
|
+
return {
|
|
51
|
+
totalMappings: mappings.length,
|
|
52
|
+
houseMembers: mappings.filter(m => m.office === 'H').length,
|
|
53
|
+
senateMembers: mappings.filter(m => m.office === 'S').length,
|
|
54
|
+
lastUpdated: '2025-09-18',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=bioguide-fec-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bioguide-fec-mapping.js","sourceRoot":"","sources":["../src/bioguide-fec-mapping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,0CAA0C;AAC1C,+FAA+F;AAC/F,+EAA+E;AAC/E,EAAE;AACF,8DAA8D;AAC9D,+DAA+D;AAC/D,+CAA+C;AAC/C,sFAAsF;AACtF,mFAAmF;AACnF,mEAAmE;AAEnE,OAAO,QAAQ,MAAM,mCAAmC,CAAC;AAWzD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,oBAAoB,GAA+B,QAG/D,CAAC;AAEF,iDAAiD;AACjD,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,UAAU,IAAI,oBAAoB,CAAC;AAC5C,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,OAAmB;IACnE,oBAAoB,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;AAC7C,CAAC;AAED,kFAAkF;AAClF,MAAM,oBAAoB,GAA2B,MAAM,CAAC,WAAW,CACrE,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CACjG,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAAC,cAAsB;IACvD,OAAO,oBAAoB,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;AACtD,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAC7B,cAAsB;IAEtB,MAAM,UAAU,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC;AACpC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,eAAe;IAM7B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrD,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;QAC3D,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;QAC5D,WAAW,EAAE,YAAY;KAC1B,CAAC;AACJ,CAAC"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-2025 Mark Sandford
|
|
3
|
+
* Licensed under the MIT License. See LICENSE and NOTICE files.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Cache adapter interface for the entity-resolution package.
|
|
7
|
+
* Consumers provide their own cache via setCache() or configure().
|
|
8
|
+
* Default is a no-op cache (always misses).
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheAdapter {
|
|
11
|
+
get<T>(key: string): Promise<T | null>;
|
|
12
|
+
set(key: string, value: unknown, ttlSeconds: number): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Set the cache adapter implementation for this package. */
|
|
15
|
+
export declare function setCache(cache: CacheAdapter): void;
|
|
16
|
+
/** Get the current cache adapter. */
|
|
17
|
+
export declare function getCache(): CacheAdapter;
|
|
18
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AASD,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAElD;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,IAAI,YAAY,CAEvC"}
|
package/dist/cache.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-2025 Mark Sandford
|
|
3
|
+
* Licensed under the MIT License. See LICENSE and NOTICE files.
|
|
4
|
+
*/
|
|
5
|
+
const noopCache = {
|
|
6
|
+
get: async () => null,
|
|
7
|
+
set: async () => { },
|
|
8
|
+
};
|
|
9
|
+
let currentCache = noopCache;
|
|
10
|
+
/** Set the cache adapter implementation for this package. */
|
|
11
|
+
export function setCache(cache) {
|
|
12
|
+
currentCache = cache;
|
|
13
|
+
}
|
|
14
|
+
/** Get the current cache adapter. */
|
|
15
|
+
export function getCache() {
|
|
16
|
+
return currentCache;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,SAAS,GAAiB;IAC9B,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IACrB,GAAG,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;CACpB,CAAC;AAEF,IAAI,YAAY,GAAiB,SAAS,CAAC;AAE3C,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,KAAmB;IAC1C,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,QAAQ;IACtB,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019-2025 Mark Sandford
|
|
3
|
+
* Licensed under the MIT License. See LICENSE and NOTICE files.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Committee to Agency Mapping
|
|
7
|
+
*
|
|
8
|
+
* Maps congressional committees to the federal agencies they oversee.
|
|
9
|
+
* This enables hypertext connections between representatives (via their
|
|
10
|
+
* committee assignments) and relevant federal spending, regulations,
|
|
11
|
+
* and executive actions.
|
|
12
|
+
*/
|
|
13
|
+
export interface AgencyInfo {
|
|
14
|
+
name: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
abbreviation: string;
|
|
17
|
+
keywords: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface CommitteeMapping {
|
|
20
|
+
committeeCode: string;
|
|
21
|
+
committeeName: string;
|
|
22
|
+
chamber: 'House' | 'Senate' | 'Joint';
|
|
23
|
+
agencies: AgencyInfo[];
|
|
24
|
+
topics: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* House committee mappings
|
|
28
|
+
*/
|
|
29
|
+
export declare const HOUSE_COMMITTEE_MAPPINGS: CommitteeMapping[];
|
|
30
|
+
/**
|
|
31
|
+
* Senate committee mappings
|
|
32
|
+
*/
|
|
33
|
+
export declare const SENATE_COMMITTEE_MAPPINGS: CommitteeMapping[];
|
|
34
|
+
/**
|
|
35
|
+
* All committee mappings combined
|
|
36
|
+
*/
|
|
37
|
+
export declare const ALL_COMMITTEE_MAPPINGS: CommitteeMapping[];
|
|
38
|
+
/**
|
|
39
|
+
* Get agencies for a committee by name (fuzzy match)
|
|
40
|
+
*/
|
|
41
|
+
export declare function getAgenciesForCommittee(committeeName: string): AgencyInfo[];
|
|
42
|
+
/**
|
|
43
|
+
* Get topics for a committee by name (fuzzy match)
|
|
44
|
+
*/
|
|
45
|
+
export declare function getTopicsForCommittee(committeeName: string): string[];
|
|
46
|
+
/**
|
|
47
|
+
* Get all agencies for multiple committees
|
|
48
|
+
*/
|
|
49
|
+
export declare function getAgenciesForCommittees(committeeNames: string[]): AgencyInfo[];
|
|
50
|
+
/**
|
|
51
|
+
* Get committees that oversee a given agency (reverse lookup).
|
|
52
|
+
*/
|
|
53
|
+
export declare function getCommitteesForAgency(agencySlug: string): CommitteeMapping[];
|
|
54
|
+
/**
|
|
55
|
+
* Get all topics for multiple committees
|
|
56
|
+
*/
|
|
57
|
+
export declare function getTopicsForCommittees(committeeNames: string[]): string[];
|
|
58
|
+
//# sourceMappingURL=committee-agency-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"committee-agency-map.d.ts","sourceRoot":"","sources":["../src/committee-agency-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBAAgB,EAqTtD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAAgB,EA+QvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,gBAAgB,EAGpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAa3E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAarE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAW/E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAI7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAWzE"}
|