🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@civiq/entity-resolution

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@civiq/entity-resolution - npm Package Compare versions

Comparing version
0.1.0
to
0.1.1
+66
CHANGELOG.md
# Changelog
All notable changes to `@civiq/entity-resolution` are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows [SemVer](https://semver.org/).
## [0.1.1] — 2026-04-17
### Changed
- Publish metadata: correct repository URL (`git+https://github.com/civdotiq/civ.iq.git`) with `directory` key, added `homepage`, `bugs`, `engines.node>=20`, and `publishConfig` with provenance attestation.
- Tarball no longer ships compiled test files (saves ~10 files, no API change).
### Fixed
- `tsconfig.json` excludes `src/__tests__` from compilation output.
## [0.1.0] — 2026-04-16
Initial public release. Extracted from CIV.IQ so any civic-data project can reuse the same resolvers, alias tables, and taxonomy.
### Added — industry taxonomy
- `categorizeContribution(employer?, occupation?)` — keyword-based classification into the 13-sector OpenSecrets-inspired taxonomy.
- `categorizePACByName(name?)` — PAC/committee classification by name.
- `categorizeContributionSmart(...)` — tries employer, occupation, and name in order.
- `aggregateByIndustrySector(contributions)` and `getTopCategories(...)` — sector-level aggregation helpers.
### Added — committee-agency map
- `ALL_COMMITTEE_MAPPINGS` — 29 House and Senate standing committees with the federal agencies they oversee.
- `getAgenciesForCommittee(name)`, `getCommitteesForAgency(slug)`, `getTopicsForCommittee(name)`.
### Added — lobbying resolution
- `resolveGovernmentEntity(entity)` — 3-tier resolver (noise → exact → fuzzy) for LDA `government_entities` strings.
- `resolveFilingEntities(entities)` — batch resolution.
- `getResolvedCommittees(resolutions)` — extract committee codes for downstream joins.
### Added — ticker / SIC / LDA issue resolution
- `resolveTickerIndustry(ticker)` — stock ticker → `IndustrySector` via SEC EDGAR + bundled SIC data.
- `sicToSector(sicCode)` — SIC code → `IndustrySector`.
- `getLDAIssueLabel(code)`, `getPolicyAreasForLDAIssue(code)` — LDA issue code ↔ human label ↔ Congress.gov policy area.
### Added — FEC entity resolution
- `deduplicateContributions(contributions)` and `deduplicateDisbursements(disbursements)` — merge name variants (e.g., "GOLDMAN SACHS" and "Goldman, Sachs & Co.") via Levenshtein similarity.
- `entitiesMatch(a, b, threshold?)` — similarity test with configurable threshold.
### Added — bioguide ↔ FEC mapping
- `getFECIdFromBioguide(id)` and `getBioguideFromFEC(id)` — canonical mapping bundled as `data/bioguide-fec-mapping.json`. Refreshed weekly by CIV.IQ's sync workflow; consumers can override via `configure({ bioguideFecMapping })` if they maintain their own.
### Added — configuration
- `configure({ logger?, cache? })` — optional hooks for a project's logger and cache (e.g., Redis). Default no-ops keep the library standalone.
### Subpath exports
- `@civiq/entity-resolution/industry-taxonomy` and `@civiq/entity-resolution/committee-agency-map` are importable directly for callers that want only one slice.
### Notes
- Tested against Node 20+ with vitest.
- ESM-only. Bundled as `.js` + `.d.ts`; no CJS build.
- Single runtime dep: `fuse.js` for fuzzy matching.
- Bundled data: `data/bioguide-fec-mapping.json` (~88 KB), `data/sec-sic-data.json` (~196 KB).
# Methodology
## Industry Taxonomy
Based on the OpenSecrets 13-sector classification model. Contributors are categorized by:
1. **Employer keywords** (high confidence) — e.g., "Goldman Sachs" matches Finance
2. **Occupation keywords** (medium confidence) — e.g., "Software Engineer" matches Communications/Electronics
3. **Contributor name** (for PACs) — e.g., "NRA" matches Ideology/Single-Issue
Non-informative employers like "SELF-EMPLOYED", "NONE", "N/A" are skipped, falling through to occupation matching.
## Lobbying Committee Resolution
Three-tier resolution for LDA `government_entities` strings:
1. **Noise filter** — Skip generic entries ("SENATE", "U.S. Congress", "White House")
2. **Exact alias match** — Static lookup against 200+ aliases per committee/agency
3. **Fuzzy match** — Fuse.js with threshold 0.15 (85%+ similarity) against committee names
Agency resolutions are converted to oversight committees via `getCommitteesForAgency()`, with slightly reduced confidence (0.9x).
## SIC Code Mapping
Maps 4-digit Standard Industrial Classification codes to IndustrySector:
- SIC ranges are ordered specific-to-broad (first match wins)
- Manufacturing is split: pharmaceuticals (2800s) → Health, petroleum (2900s) → Energy, etc.
- Defense catches aircraft/missile manufacturing (3720-3799)
## Ticker Resolution
Flow: `ticker → CIK (static lookup) → SIC code (SEC API) → IndustrySector`
- Static ticker-to-CIK mapping from SEC EDGAR `company_tickers.json` (~10K entries)
- SIC codes fetched from SEC submissions API with 30-day cache TTL
- Known ETF/fund tickers return null immediately (SPY, QQQ, etc.)
- Unresolvable tickers are cached as null to avoid repeated lookups
## FEC Entity Deduplication
Name matching uses Levenshtein distance with a default threshold of 0.85 (85% similarity). Additional metadata (employer, state, city) provides confirmation when available — at least 50% of checked metadata fields must match.
Name standardization:
- Individual names: "SMITH, JOHN" → "John Smith"
- Organization names: Remove corporate suffixes (Inc., LLC, Corp.)
- Normalize multiple spaces, strip punctuation
+1
-1

@@ -1,1 +0,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"}
{"version":3,"file":"bioguide-fec-mapping.d.ts","sourceRoot":"","sources":["../src/bioguide-fec-mapping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,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"}

@@ -5,12 +5,17 @@ /**

*/
// Bioguide ID to FEC Candidate ID mapping
// This mapping helps match Congressional representatives to their FEC campaign finance records
// Bioguide ID to FEC Candidate ID mapping.
// Maps Congressional representatives to their FEC campaign finance records.
// Format: bioguideId -> { fecId, name, state, district?, office, lastUpdated }
//
// AUTO-GENERATED FROM congress-legislators data on 2025-09-18
// Source: https://github.com/unitedstates/congress-legislators
// To regenerate: npm run generate-fec-mappings
// MANUALLY UPDATED: 2026-01-08 - Removed departed members (Greene, LaMalfa, Sherrill)
// Added new members (Grijalva, Van Epps, Walkinshaw)
// Data stored in bioguide-fec-mapping.json, loaded via JSON import
// Kept current by the weekly `sync-bioguide-fec` GitHub Action, which pulls
// legislators-current.yaml from unitedstates/congress-legislators and falls
// back to Congress.gov + FEC candidate search for members not yet in the
// YAML. Do not edit the JSON by hand — run `npm run sync:bioguide-fec` or
// wait for the scheduled workflow.
//
// Sources:
// - https://github.com/unitedstates/congress-legislators
// - https://api.congress.gov/
// - https://api.open.fec.gov/
// Data stored in bioguide-fec-mapping.json, loaded via JSON import.
import jsonData from '../data/bioguide-fec-mapping.json';

@@ -17,0 +22,0 @@ // Complete mappings for 119th Congress (537 representatives)

@@ -1,1 +0,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"}
{"version":3,"file":"bioguide-fec-mapping.js","sourceRoot":"","sources":["../src/bioguide-fec-mapping.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,2CAA2C;AAC3C,4EAA4E;AAC5E,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,yEAAyE;AACzE,0EAA0E;AAC1E,mCAAmC;AACnC,EAAE;AACF,WAAW;AACX,2DAA2D;AAC3D,gCAAgC;AAChC,gCAAgC;AAChC,oEAAoE;AAEpE,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"}

@@ -19,3 +19,3 @@ /**

export { resolveGovernmentEntity, resolveFilingEntities, getResolvedCommittees, } from './lobbying-committee-resolver';
export { sicToSector } from './sic-sector-map';
export { sicToSector, sectorToSicRanges } from './sic-sector-map';
export { resolveTickerIndustry, resolveTickerIndustries } from './ticker-industry-resolver';

@@ -22,0 +22,0 @@ export { LDA_ISSUE_POLICY_MAP, getLDAIssueLabel, getPolicyAreasForLDAIssue, getAllLDAIssueCodes, } from './lda-issue-policy-map';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,YAAY,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG5E,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGrF,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG5F,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGpF,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,YAAY,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG5E,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGrF,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG3E,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG5F,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChF,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGpF,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC"}

@@ -20,3 +20,3 @@ /**

// ── SIC Sector Map ───────────────────────────────────────────────────
export { sicToSector } from './sic-sector-map';
export { sicToSector, sectorToSicRanges } from './sic-sector-map';
// ── Ticker Industry Resolver ─────────────────────────────────────────

@@ -23,0 +23,0 @@ export { resolveTickerIndustry, resolveTickerIndustries } from './ticker-industry-resolver';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM7C,wEAAwE;AACxE,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,wEAAwE;AACxE,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,wEAAwE;AACxE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AACxE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAEvC,wEAAwE;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,wEAAwE;AACxE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE5F,wEAAwE;AACxE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,wEAAwE;AACxE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAGnC,uEAAuE;AACvE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhF,wEAAwE;AACxE,OAAO,EACL,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAGjC,wEAAwE;AACxE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wEAAwE;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM7C,wEAAwE;AACxE,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,wEAAwE;AACxE,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,wEAAwE;AACxE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AACxE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAEvC,wEAAwE;AACxE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElE,wEAAwE;AACxE,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE5F,wEAAwE;AACxE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,wEAAwE;AACxE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAGnC,uEAAuE;AACvE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAGhF,wEAAwE;AACxE,OAAO,EACL,aAAa,EACb,eAAe,EACf,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAGjC,wEAAwE;AACxE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,eAAe,GAChB,MAAM,wBAAwB,CAAC"}

@@ -28,2 +28,10 @@ /**

/**
* Reverse lookup: given an IndustrySector, return all SIC code ranges that map to it.
* Returns an empty array if no ranges match.
*/
export declare function sectorToSicRanges(sector: IndustrySector): {
start: number;
end: number;
}[];
/**
* Resolve a 4-digit SIC code string to an IndustrySector.

@@ -30,0 +38,0 @@ * Returns null if the code is invalid or falls outside all known ranges.

@@ -1,1 +0,1 @@

{"version":3,"file":"sic-sector-map.d.ts","sourceRoot":"","sources":["../src/sic-sector-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA6GrD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAalE"}
{"version":3,"file":"sic-sector-map.d.ts","sourceRoot":"","sources":["../src/sic-sector-map.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA6GrD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAE1F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAalE"}

@@ -94,2 +94,9 @@ /**

/**
* Reverse lookup: given an IndustrySector, return all SIC code ranges that map to it.
* Returns an empty array if no ranges match.
*/
export function sectorToSicRanges(sector) {
return SIC_RANGES.filter(r => r.sector === sector).map(({ start, end }) => ({ start, end }));
}
/**
* Resolve a 4-digit SIC code string to an IndustrySector.

@@ -96,0 +103,0 @@ * Returns null if the code is invalid or falls outside all known ranges.

@@ -1,1 +0,1 @@

{"version":3,"file":"sic-sector-map.js","sourceRoot":"","sources":["../src/sic-sector-map.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"sic-sector-map.js","sourceRoot":"","sources":["../src/sic-sector-map.ts"],"names":[],"mappings":"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"}
{
"name": "@civiq/entity-resolution",
"version": "0.1.0",
"version": "0.1.1",
"description": "Entity resolution for civic data — committee/agency alias matching, industry taxonomy, ticker-to-sector resolution, FEC entity deduplication",

@@ -24,8 +24,14 @@ "type": "module",

"dist",
"data"
"data",
"README.md",
"LICENSE",
"CHANGELOG.md",
"METHODOLOGY.md"
],
"sideEffects": false,
"scripts": {
"build": "tsc",
"test": "vitest run",
"clean": "rm -rf dist"
"clean": "rm -rf dist",
"prepublishOnly": "npm run clean && npm run build && npm run test"
},

@@ -40,6 +46,18 @@ "dependencies": {

"author": "Mark Sandford",
"homepage": "https://github.com/civdotiq/civ.iq/tree/main/packages/entity-resolution#readme",
"bugs": {
"url": "https://github.com/civdotiq/civ.iq/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/civiq/entity-resolution"
"url": "git+https://github.com/civdotiq/civ.iq.git",
"directory": "packages/entity-resolution"
},
"publishConfig": {
"access": "public",
"provenance": true
},
"engines": {
"node": ">=20.0.0"
},
"keywords": [

@@ -51,4 +69,8 @@ "entity-resolution",

"fec",
"civic-tech"
"civic-tech",
"civiq",
"industry-taxonomy",
"lobbying",
"opensecrets"
]
}
/**
* Copyright (c) 2019-2025 Mark Sandford
* Licensed under the MIT License. See LICENSE and NOTICE files.
*/
export {};
//# sourceMappingURL=company-entity-resolver.test.d.ts.map
{"version":3,"file":"company-entity-resolver.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/company-entity-resolver.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
/**
* Copyright (c) 2019-2025 Mark Sandford
* Licensed under the MIT License. See LICENSE and NOTICE files.
*/
import { describe, it, expect } from 'vitest';
import { normalizeCompanyName, resolveCompanyName, resolveCompanyNames, companiesMatch, validateTokenOverlap, similarityRatio, } from '../company-entity-resolver';
import { findCompanyByAlias } from '../company-alias-table';
import { IndustrySector } from '../industry-taxonomy';
// ── normalizeCompanyName ────────────────────────────────────────────
describe('normalizeCompanyName', () => {
it('strips corporate suffixes', () => {
expect(normalizeCompanyName('Dow Chemical Co')).toBe('DOW CHEMICAL');
expect(normalizeCompanyName('PFIZER INC.')).toBe('PFIZER');
expect(normalizeCompanyName('Johnson & Johnson Inc')).toBe('JOHNSON AND JOHNSON');
});
it('normalizes ampersand to AND', () => {
expect(normalizeCompanyName('AT&T')).toBe('AT AND T');
});
it('removes punctuation', () => {
expect(normalizeCompanyName('J.P. Morgan')).toBe('JP MORGAN');
});
it('expands known abbreviations', () => {
expect(normalizeCompanyName('JNJ')).toBe('JOHNSON AND JOHNSON');
expect(normalizeCompanyName('MSFT')).toBe('MICROSOFT');
expect(normalizeCompanyName('GOOG')).toBe('ALPHABET');
});
it('collapses whitespace', () => {
expect(normalizeCompanyName(' DOW CHEMICAL ')).toBe('DOW CHEMICAL');
});
it('handles empty and whitespace-only input', () => {
expect(normalizeCompanyName('')).toBe('');
expect(normalizeCompanyName(' ')).toBe('');
});
});
// ── Cross-API Matching ──────────────────────────────────────────────
describe('cross-API company matching', () => {
it('matches EPA "DOW CHEMICAL CO" with SEC "Dow Inc." via alias table', () => {
const result = companiesMatch('DOW CHEMICAL CO', 'Dow Inc.');
expect(result.match).toBe(true);
expect(result.confidence).toBeGreaterThanOrEqual(0.8);
});
it('matches EPA "DOW CHEMICAL CO TEXAS OPERATIONS" with FEC "DOW INC"', () => {
const aliasA = findCompanyByAlias('DOW CHEMICAL CO TEXAS OPERATIONS');
const aliasB = findCompanyByAlias('DOW INC');
expect(aliasA).not.toBeNull();
expect(aliasB).not.toBeNull();
expect(aliasA.canonicalName).toBe(aliasB.canonicalName);
});
it('matches "EXXONMOBIL" with "EXXON MOBIL CORP" via alias table', () => {
const result = companiesMatch('EXXONMOBIL', 'EXXON MOBIL CORP');
expect(result.match).toBe(true);
});
it('matches "JOHNSON & JOHNSON" with "JNJ" via abbreviation + alias', () => {
const aliasA = findCompanyByAlias('JOHNSON & JOHNSON');
const aliasB = findCompanyByAlias('JNJ');
expect(aliasA).not.toBeNull();
expect(aliasB).not.toBeNull();
expect(aliasA.canonicalName).toBe('JOHNSON AND JOHNSON');
expect(aliasB.canonicalName).toBe('JOHNSON AND JOHNSON');
});
it('matches "LOCKHEED MARTIN CORP" with "LOCKHEED MARTIN CORPORATION"', () => {
const result = companiesMatch('LOCKHEED MARTIN CORP', 'LOCKHEED MARTIN CORPORATION');
expect(result.match).toBe(true);
expect(result.confidence).toBeGreaterThanOrEqual(0.9);
});
it('matches "RAYTHEON CO" with "RAYTHEON TECHNOLOGIES" via alias table', () => {
const aliasA = findCompanyByAlias('RAYTHEON CO');
const aliasB = findCompanyByAlias('RAYTHEON TECHNOLOGIES');
expect(aliasA).not.toBeNull();
expect(aliasB).not.toBeNull();
expect(aliasA.canonicalName).toBe(aliasB.canonicalName);
});
it('matches "FACEBOOK" with "META PLATFORMS" via alias table', () => {
const aliasA = findCompanyByAlias('FACEBOOK');
const aliasB = findCompanyByAlias('META PLATFORMS INC');
expect(aliasA).not.toBeNull();
expect(aliasB).not.toBeNull();
expect(aliasA.canonicalName).toBe(aliasB.canonicalName);
});
it('matches "WAL-MART STORES INC" with "WALMART"', () => {
const aliasA = findCompanyByAlias('WAL-MART STORES INC');
const aliasB = findCompanyByAlias('WALMART');
expect(aliasA).not.toBeNull();
expect(aliasB).not.toBeNull();
expect(aliasA.canonicalName).toBe(aliasB.canonicalName);
});
});
// ── False Positive Rejection ────────────────────────────────────────
describe('false positive rejection', () => {
it('rejects "American Health Association" vs "American Heart Association"', () => {
expect(validateTokenOverlap('AMERICAN HEALTH ASSOCIATION', 'AMERICAN HEART ASSOCIATION')).toBe(false);
});
it('rejects "American Health Association" via companiesMatch', () => {
const result = companiesMatch('American Health Association', 'American Heart Association');
expect(result.match).toBe(false);
});
it('rejects "Goldman Sachs" vs "Goldman Stanley"', () => {
const result = companiesMatch('Goldman Sachs', 'Goldman Stanley');
expect(result.match).toBe(false);
});
it('rejects "Apple" vs "Alphabet"', () => {
const result = companiesMatch('APPLE INC', 'ALPHABET INC');
expect(result.match).toBe(false);
});
it('rejects "FORD MOTOR" vs "FORD FOUNDATION"', () => {
const result = companiesMatch('FORD MOTOR CO', 'FORD FOUNDATION');
expect(result.match).toBe(false);
});
});
// ── SIC Code Boost ──────────────────────────────────────────────────
describe('SIC code cross-validation', () => {
it('boosts confidence when SIC sectors match', () => {
// "PFIZER PHARMA" vs "PFIZER HEALTH" — same SIC sector (Health)
const withSic = companiesMatch('PFIZER PHARMACEUTICALS', 'PFIZER HEALTHCARE', {
sicCodeA: '2834', // Chemicals/Pharmaceuticals → Health
sicCodeB: '2834',
});
const withoutSic = companiesMatch('PFIZER PHARMACEUTICALS', 'PFIZER HEALTHCARE');
expect(withSic.confidence).toBeGreaterThanOrEqual(withoutSic.confidence);
});
it('does not boost when SIC sectors differ', () => {
const result = companiesMatch('SOME ENERGY CORP', 'SOME ENERGY CORP', {
sicCodeA: '2911', // Petroleum → Energy
sicCodeB: '6020', // Banking → Finance
});
// Exact match still works regardless
expect(result.match).toBe(true);
});
});
// ── resolveCompanyName ──────────────────────────────────────────────
describe('resolveCompanyName', () => {
it('resolves known company via alias table', () => {
const result = resolveCompanyName('DOW CHEMICAL CO');
expect(result).not.toBeNull();
expect(result.canonicalName).toBe('DOW');
expect(result.confidence).toBeGreaterThanOrEqual(0.8);
expect(result.sector).toBe(IndustrySector.MISC_BUSINESS);
});
it('resolves with SIC context', () => {
const result = resolveCompanyName('PFIZER INC', { sicCode: '2834' });
expect(result).not.toBeNull();
expect(result.canonicalName).toBe('PFIZER');
expect(result.sector).toBe(IndustrySector.HEALTH);
expect(result.confidence).toBe(0.95);
});
it('returns normalized form for unknown companies', () => {
const result = resolveCompanyName('Acme Widget Corp');
expect(result).not.toBeNull();
expect(result.canonicalName).toBe('ACME WIDGET');
expect(result.confidence).toBe(0.5);
});
it('returns null for empty input', () => {
expect(resolveCompanyName('')).toBeNull();
expect(resolveCompanyName(' ')).toBeNull();
});
});
// ── resolveCompanyNames (batch) ─────────────────────────────────────
describe('resolveCompanyNames', () => {
it('deduplicates entries that resolve to the same company', () => {
const results = resolveCompanyNames([
{ name: 'DOW CHEMICAL CO', source: 'EPA' },
{ name: 'Dow Inc.', source: 'SEC' },
{ name: 'DOW INC', source: 'FEC' },
]);
expect(results.size).toBe(1);
const dow = results.get('DOW');
expect(dow).toBeDefined();
expect(dow.aliases.length).toBeGreaterThanOrEqual(2);
});
it('keeps distinct companies separate', () => {
const results = resolveCompanyNames([
{ name: 'PFIZER INC', source: 'FEC' },
{ name: 'MERCK & CO', source: 'SEC' },
]);
expect(results.size).toBe(2);
});
it('merges SIC codes from multiple sources', () => {
const results = resolveCompanyNames([
{ name: 'Johnson & Johnson', source: 'FEC', context: { sicCode: '2834' } },
{ name: 'JNJ', source: 'SEC', context: { sicCode: '3841' } },
]);
const jnj = results.get('JOHNSON AND JOHNSON');
expect(jnj).toBeDefined();
// Should have both SIC codes from alias table
expect(jnj.sicCodes.length).toBeGreaterThanOrEqual(2);
});
});
// ── Batch Performance ───────────────────────────────────────────────
describe('batch performance', () => {
it('resolves 100 names in under 100ms', () => {
const names = Array.from({ length: 100 }, (_, i) => ({
name: `Company ${i} Inc`,
source: 'test',
}));
const start = performance.now();
resolveCompanyNames(names);
const elapsed = performance.now() - start;
expect(elapsed).toBeLessThan(100);
});
});
// ── similarityRatio ─────────────────────────────────────────────────
describe('similarityRatio', () => {
it('returns 1.0 for identical strings', () => {
expect(similarityRatio('PFIZER', 'PFIZER')).toBe(1.0);
});
it('returns 0 for completely different strings', () => {
expect(similarityRatio('ABC', 'XYZ')).toBe(0);
});
it('returns high ratio for similar strings', () => {
expect(similarityRatio('NORTHROP', 'NORTHRUP')).toBeGreaterThan(0.8);
});
it('returns 1.0 for two empty strings', () => {
expect(similarityRatio('', '')).toBe(1.0);
});
});
// ── validateTokenOverlap ────────────────────────────────────────────
describe('validateTokenOverlap', () => {
it('rejects words that differ by one character but are different words', () => {
expect(validateTokenOverlap('american health association', 'american heart association')).toBe(false);
});
it('accepts names with corporate suffix differences', () => {
expect(validateTokenOverlap('lockheed martin', 'lockheed martin corporation')).toBe(true);
});
it('accepts single-word matches', () => {
expect(validateTokenOverlap('boeing', 'the boeing company')).toBe(true);
});
it('handles typos gracefully', () => {
expect(validateTokenOverlap('northrop grumman', 'northrup grumman')).toBe(true);
});
it('returns false for empty strings', () => {
expect(validateTokenOverlap('', '')).toBe(false);
});
});
// ── findCompanyByAlias ──────────────────────────────────────────────
describe('findCompanyByAlias', () => {
it('finds by canonical name', () => {
const result = findCompanyByAlias('PFIZER');
expect(result).not.toBeNull();
expect(result.canonicalName).toBe('PFIZER');
});
it('finds by known alias', () => {
const result = findCompanyByAlias('GOOGLE');
expect(result).not.toBeNull();
expect(result.canonicalName).toBe('ALPHABET');
});
it('finds after stripping suffixes', () => {
const result = findCompanyByAlias('Boeing Company');
expect(result).not.toBeNull();
expect(result.canonicalName).toBe('BOEING');
});
it('returns null for unknown companies', () => {
expect(findCompanyByAlias('Acme Widget Corp')).toBeNull();
});
it('returns null for empty input', () => {
expect(findCompanyByAlias('')).toBeNull();
expect(findCompanyByAlias(' ')).toBeNull();
});
it('has correct sector for known companies', () => {
const pfizer = findCompanyByAlias('PFIZER');
expect(pfizer.sector).toBe(IndustrySector.HEALTH);
const exxon = findCompanyByAlias('EXXONMOBIL');
expect(exxon.sector).toBe(IndustrySector.ENERGY_NATURAL_RESOURCES);
const jpmorgan = findCompanyByAlias('JPMORGAN CHASE');
expect(jpmorgan.sector).toBe(IndustrySector.FINANCE_INSURANCE_REAL_ESTATE);
});
});
//# sourceMappingURL=company-entity-resolver.test.js.map
{"version":3,"file":"company-entity-resolver.test.js","sourceRoot":"","sources":["../../src/__tests__/company-entity-resolver.test.ts"],"names":[],"mappings":"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"}
export {};
//# sourceMappingURL=entity-resolution.test.d.ts.map
{"version":3,"file":"entity-resolution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/entity-resolution.test.ts"],"names":[],"mappings":""}
import { describe, it, expect } from 'vitest';
import {
// Industry taxonomy
IndustrySector, categorizeContribution, categorizePACByName,
// Committee-agency map
HOUSE_COMMITTEE_MAPPINGS, SENATE_COMMITTEE_MAPPINGS, ALL_COMMITTEE_MAPPINGS, getAgenciesForCommittee, getTopicsForCommittee, getCommitteesForAgency,
// Committee aliases
COMMITTEE_ALIASES, getAllCommitteeAliasNames,
// Lobbying resolver
resolveGovernmentEntity, resolveFilingEntities, getResolvedCommittees,
// SIC sector map
sicToSector,
// LDA issue map
LDA_ISSUE_POLICY_MAP, getLDAIssueLabel, getPolicyAreasForLDAIssue, getAllLDAIssueCodes,
// Bioguide-FEC mapping
getFECIdFromBioguide, hasFECMapping, getBioguideFromFEC, getMappingStats, } from '../index';
// ── Industry Taxonomy ────────────────────────────────────────────────
describe('IndustrySector enum', () => {
it('has 13 sectors', () => {
const values = Object.values(IndustrySector);
expect(values).toHaveLength(13);
});
it('includes expected sector values', () => {
expect(IndustrySector.DEFENSE).toBe('Defense');
expect(IndustrySector.HEALTH).toBe('Health');
expect(IndustrySector.ENERGY_NATURAL_RESOURCES).toBe('Energy/Natural Resources');
expect(IndustrySector.FINANCE_INSURANCE_REAL_ESTATE).toBe('Finance/Insurance/Real Estate');
});
});
describe('categorizeContribution', () => {
it('categorizes a defense contractor by employer', () => {
const result = categorizeContribution('LOCKHEED MARTIN', 'ENGINEER');
expect(result.sector).toBe(IndustrySector.DEFENSE);
expect(result.confidence).toBe('high');
expect(result.matchSource).toBe('employer');
});
it('categorizes a hospital employee by employer', () => {
const result = categorizeContribution('JOHNS HOPKINS HOSPITAL', 'NURSE');
expect(result.sector).toBe(IndustrySector.HEALTH);
});
it('categorizes by occupation when employer is generic', () => {
const result = categorizeContribution('SELF-EMPLOYED', 'ATTORNEY');
expect(result.sector).toBe(IndustrySector.LAWYERS_LOBBYISTS);
expect(result.matchSource).toBe('occupation');
});
it('returns Other for unrecognizable employer/occupation', () => {
const result = categorizeContribution('ACME WIDGETS', 'WIDGET MAKER');
expect(result.sector).toBe(IndustrySector.OTHER);
});
it('handles empty strings', () => {
const result = categorizeContribution('', '');
expect(result.sector).toBe(IndustrySector.OTHER);
});
});
describe('categorizePACByName', () => {
it('categorizes a defense PAC', () => {
const result = categorizePACByName('RAYTHEON COMPANY PAC');
expect(result.sector).toBe(IndustrySector.DEFENSE);
});
it('categorizes a labor PAC', () => {
const result = categorizePACByName('AFL-CIO PAC');
expect(result.sector).toBe(IndustrySector.LABOR);
});
it('returns Other for unknown PAC', () => {
const result = categorizePACByName('OBSCURE FRIENDS PAC');
expect(result.sector).toBe(IndustrySector.OTHER);
});
});
// ── Committee-Agency Map ─────────────────────────────────────────────
describe('committee-agency map', () => {
it('has House committee mappings', () => {
expect(HOUSE_COMMITTEE_MAPPINGS.length).toBeGreaterThan(5);
expect(HOUSE_COMMITTEE_MAPPINGS.every(m => m.chamber === 'House')).toBe(true);
});
it('has Senate committee mappings', () => {
expect(SENATE_COMMITTEE_MAPPINGS.length).toBeGreaterThan(5);
expect(SENATE_COMMITTEE_MAPPINGS.every(m => m.chamber === 'Senate')).toBe(true);
});
it('ALL_COMMITTEE_MAPPINGS includes both chambers', () => {
expect(ALL_COMMITTEE_MAPPINGS.length).toBe(HOUSE_COMMITTEE_MAPPINGS.length + SENATE_COMMITTEE_MAPPINGS.length);
});
it('each mapping has required fields', () => {
for (const m of ALL_COMMITTEE_MAPPINGS) {
expect(m.committeeCode).toBeTruthy();
expect(m.committeeName).toBeTruthy();
expect(['House', 'Senate', 'Joint']).toContain(m.chamber);
expect(m.agencies.length).toBeGreaterThan(0);
expect(m.topics.length).toBeGreaterThan(0);
}
});
});
describe('getAgenciesForCommittee', () => {
it('returns agencies for a known committee name', () => {
// Function takes committee NAME, not code — does string matching
const agencies = getAgenciesForCommittee('Armed Services');
expect(agencies.length).toBeGreaterThan(0);
expect(agencies.some(a => a.slug === 'department-of-defense')).toBe(true);
});
it('returns empty array for unknown committee name', () => {
expect(getAgenciesForCommittee('Galactic Federation')).toEqual([]);
});
});
describe('getTopicsForCommittee', () => {
it('returns topics for a known committee name', () => {
const topics = getTopicsForCommittee('Armed Services');
expect(topics.length).toBeGreaterThan(0);
expect(topics).toContain('defense');
});
it('returns empty array for unknown committee', () => {
expect(getTopicsForCommittee('ZZZZ')).toEqual([]);
});
});
describe('getCommitteesForAgency', () => {
it('finds committees overseeing DOD', () => {
const committees = getCommitteesForAgency('department-of-defense');
expect(committees.length).toBeGreaterThan(0);
expect(committees.some(c => c.committeeCode === 'HSAS')).toBe(true);
});
it('returns empty for unknown agency', () => {
expect(getCommitteesForAgency('fake-agency')).toEqual([]);
});
});
// ── Committee Aliases ────────────────────────────────────────────────
describe('COMMITTEE_ALIASES', () => {
it('is a Map with entries', () => {
expect(COMMITTEE_ALIASES).toBeInstanceOf(Map);
expect(COMMITTEE_ALIASES.size).toBeGreaterThan(20);
});
it('resolves formal committee names', () => {
expect(COMMITTEE_ALIASES.get('senate armed services')).toBe('SSAS');
expect(COMMITTEE_ALIASES.get('house judiciary')).toBe('HSJU');
});
it('getAllCommitteeAliasNames returns strings', () => {
const names = getAllCommitteeAliasNames();
expect(names.length).toBeGreaterThan(20);
expect(typeof names[0]).toBe('string');
});
});
// ── Lobbying Committee Resolver ──────────────────────────────────────
describe('resolveGovernmentEntity', () => {
it('resolves noise entities', () => {
const result = resolveGovernmentEntity('U.S. Congress');
expect(result.type).toBe('noise');
expect(result.confidence).toBe(0);
});
it('filters blank strings as noise', () => {
expect(resolveGovernmentEntity('').type).toBe('noise');
expect(resolveGovernmentEntity(' ').type).toBe('noise');
});
it('resolves exact committee alias match', () => {
const result = resolveGovernmentEntity('Senate Armed Services');
expect(result.type).toBe('committee');
expect(result.committeeCode).toBe('SSAS');
expect(result.confidence).toBe(1.0);
});
it('resolves exact agency alias match', () => {
const result = resolveGovernmentEntity('Department of Energy');
expect(result.type).toBe('agency');
expect(result.agencySlug).toBeTruthy();
expect(result.confidence).toBe(1.0);
});
it('returns unresolved for unknown entities', () => {
const result = resolveGovernmentEntity('Galactic Federation of Planets');
expect(result.type).toBe('unresolved');
expect(result.confidence).toBe(0);
});
it('preserves raw text in result', () => {
const result = resolveGovernmentEntity('Senate Armed Services');
expect(result.rawText).toBe('Senate Armed Services');
});
});
describe('resolveFilingEntities', () => {
it('resolves an array of entities', () => {
const results = resolveFilingEntities([
'Senate Armed Services',
'U.S. Congress',
'Unknown Entity',
]);
expect(results).toHaveLength(3);
expect(results[0].type).toBe('committee');
expect(results[1].type).toBe('noise');
expect(results[2].type).toBe('unresolved');
});
});
describe('getResolvedCommittees', () => {
it('extracts committees from resolved entities', () => {
const resolutions = resolveFilingEntities(['Senate Armed Services', 'House Judiciary']);
const committees = getResolvedCommittees(resolutions);
expect(committees.length).toBe(2);
expect(committees.some(c => c.committeeCode === 'SSAS')).toBe(true);
expect(committees.some(c => c.committeeCode === 'HSJU')).toBe(true);
});
it('derives committees from agency resolutions', () => {
const resolutions = resolveFilingEntities(['Department of Defense']);
const committees = getResolvedCommittees(resolutions);
// DOD oversight should include Armed Services committees
expect(committees.length).toBeGreaterThan(0);
// Agency-derived committees have reduced confidence
expect(committees.every(c => c.confidence <= 0.9)).toBe(true);
});
it('deduplicates committee codes taking highest confidence', () => {
const resolutions = resolveFilingEntities([
'Senate Armed Services',
'Senate Armed Services Committee',
]);
const committees = getResolvedCommittees(resolutions);
const ssasCodes = committees.filter(c => c.committeeCode === 'SSAS');
expect(ssasCodes).toHaveLength(1);
});
});
// ── SIC Sector Map ───────────────────────────────────────────────────
describe('sicToSector', () => {
it('maps agriculture SIC codes to Agribusiness', () => {
expect(sicToSector('0100')).toBe(IndustrySector.AGRIBUSINESS);
expect(sicToSector('0999')).toBe(IndustrySector.AGRIBUSINESS);
});
it('maps mining SIC codes to Energy/Natural Resources', () => {
expect(sicToSector('1000')).toBe(IndustrySector.ENERGY_NATURAL_RESOURCES);
});
it('maps construction SIC codes to Construction', () => {
expect(sicToSector('1500')).toBe(IndustrySector.CONSTRUCTION);
});
it('maps banking SIC codes to Finance', () => {
expect(sicToSector('6000')).toBe(IndustrySector.FINANCE_INSURANCE_REAL_ESTATE);
});
it('returns a sector or null for edge-case SIC codes', () => {
// Empty and non-numeric should return null
expect(sicToSector('')).toBeNull();
expect(sicToSector('abcd')).toBeNull();
// 9999 may map to a sector (public administration range) — just verify it returns a string or null
const result = sicToSector('9999');
if (result !== null) {
expect(Object.values(IndustrySector)).toContain(result);
}
});
});
// ── LDA Issue Policy Map ─────────────────────────────────────────────
describe('LDA issue mapping', () => {
it('exports the mapping object', () => {
expect(LDA_ISSUE_POLICY_MAP).toBeDefined();
expect(Object.keys(LDA_ISSUE_POLICY_MAP).length).toBeGreaterThan(20);
});
it('getLDAIssueLabel returns labels for known codes', () => {
expect(getLDAIssueLabel('DEF')).toBe('Defense');
expect(getLDAIssueLabel('HCR')).toBe('Health Issues');
expect(getLDAIssueLabel('AGR')).toBe('Agriculture');
});
it('getLDAIssueLabel returns the code itself for unknown codes', () => {
// Unknown codes fall through to returning the raw code
expect(getLDAIssueLabel('ZZZ')).toBe('ZZZ');
});
it('getPolicyAreasForLDAIssue returns policy areas', () => {
const areas = getPolicyAreasForLDAIssue('DEF');
expect(areas).not.toBeNull();
expect(areas.length).toBeGreaterThan(0);
expect(areas.some(a => a.includes('Security') || a.includes('Defense'))).toBe(true);
});
it('getAllLDAIssueCodes returns all codes', () => {
const codes = getAllLDAIssueCodes();
expect(codes.length).toBeGreaterThan(20);
expect(codes).toContain('DEF');
expect(codes).toContain('HCR');
});
});
// ── Bioguide-FEC Mapping ─────────────────────────────────────────────
describe('bioguide-FEC mapping', () => {
it('getMappingStats returns counts', () => {
const stats = getMappingStats();
expect(stats.totalMappings).toBeGreaterThan(400); // 537 members expected
expect(stats.houseMembers).toBeGreaterThan(200);
expect(stats.senateMembers).toBeGreaterThan(50);
});
it('hasFECMapping returns true for known members', () => {
// Nancy Pelosi's bioguide ID
expect(hasFECMapping('P000197')).toBe(true);
});
it('hasFECMapping returns false for unknown IDs', () => {
expect(hasFECMapping('ZZZZZZ')).toBe(false);
});
it('getFECIdFromBioguide returns FEC ID for known members', () => {
const fecId = getFECIdFromBioguide('P000197');
expect(fecId).not.toBeNull();
expect(fecId.length).toBeGreaterThan(0);
});
it('getFECIdFromBioguide returns null for unknown members', () => {
expect(getFECIdFromBioguide('ZZZZZZ')).toBeNull();
});
it('getBioguideFromFEC does reverse lookup', () => {
const fecId = getFECIdFromBioguide('P000197');
if (fecId) {
const bioguide = getBioguideFromFEC(fecId);
expect(bioguide).toBe('P000197');
}
});
});
//# sourceMappingURL=entity-resolution.test.js.map
{"version":3,"file":"entity-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/entity-resolution.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO;AACL,oBAAoB;AACpB,cAAc,EACd,sBAAsB,EACtB,mBAAmB;AACnB,uBAAuB;AACvB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB;AACtB,oBAAoB;AACpB,iBAAiB,EACjB,yBAAyB;AACzB,oBAAoB;AACpB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB;AACrB,iBAAiB;AACjB,WAAW;AACX,gBAAgB;AAChB,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB;AACnB,uBAAuB;AACvB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,wEAAwE;AAExE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjF,MAAM,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,sBAAsB,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,sBAAsB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,sBAAsB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,sBAAsB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,CACxC,wBAAwB,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CACnE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,KAAK,MAAM,CAAC,IAAI,sBAAsB,EAAE,CAAC;YACvC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,iEAAiE;QACjE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,UAAU,GAAG,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;QACnE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,yBAAyB,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,uBAAuB,CAAC,gCAAgC,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,uBAAuB,CAAC,uBAAuB,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,OAAO,GAAG,qBAAqB,CAAC;YACpC,uBAAuB;YACvB,eAAe;YACf,gBAAgB;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,WAAW,GAAG,qBAAqB,CAAC,CAAC,uBAAuB,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACxF,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,WAAW,GAAG,qBAAqB,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACtD,yDAAyD;QACzD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,oDAAoD;QACpD,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,WAAW,GAAG,qBAAqB,CAAC;YACxC,uBAAuB;YACvB,iCAAiC;SAClC,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC9D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,2CAA2C;QAC3C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvC,mGAAmG;QACnG,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,oBAAoB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,uDAAuD;QACvD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AAExE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,uBAAuB;QACzE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,6BAA6B;QAC7B,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
export {};
//# sourceMappingURL=fec-entity-resolution.test.d.ts.map
{"version":3,"file":"fec-entity-resolution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/fec-entity-resolution.test.ts"],"names":[],"mappings":""}
import { describe, it, expect } from 'vitest';
import { entitiesMatch, normalizeEntity } from '../fec-entity-resolution';
describe('entitiesMatch - abbreviation expansion', () => {
it('matches J&J to Johnson & Johnson', () => {
expect(entitiesMatch({ name: 'J&J' }, { name: 'Johnson & Johnson' })).toBe(true);
});
it('matches GM to General Motors Corp', () => {
expect(entitiesMatch({ name: 'GM' }, { name: 'General Motors Corp' })).toBe(true);
});
it('matches GE to General Electric', () => {
expect(entitiesMatch({ name: 'GE' }, { name: 'General Electric' })).toBe(true);
});
it('does not match IBM to Intl Business Machines (partial abbreviation not in table)', () => {
expect(entitiesMatch({ name: 'IBM' }, { name: 'Intl Business Machines' })).toBe(false);
});
it('matches AT&T to AT&T Inc', () => {
expect(entitiesMatch({ name: 'AT&T' }, { name: 'AT&T Inc' })).toBe(true);
});
it('matches JPMorgan to JPMorgan Chase', () => {
expect(entitiesMatch({ name: 'JPMorgan' }, { name: 'JPMorgan Chase' })).toBe(true);
});
it('matches BofA to Bank of America', () => {
expect(entitiesMatch({ name: 'BofA' }, { name: 'Bank of America' })).toBe(true);
});
});
describe('entitiesMatch - existing Levenshtein behavior preserved', () => {
it('matches exact names', () => {
expect(entitiesMatch({ name: 'Google Inc' }, { name: 'Google Inc' })).toBe(true);
});
it('matches similar names above threshold', () => {
expect(entitiesMatch({ name: 'Google Inc' }, { name: 'Google Inc.' })).toBe(true);
});
it('rejects dissimilar names', () => {
expect(entitiesMatch({ name: 'Google' }, { name: 'Microsoft' })).toBe(false);
});
});
describe('normalizeEntity', () => {
it('normalizes organization names', () => {
const result = normalizeEntity('Google Inc.');
expect(result.entityType).toBe('organization');
expect(result.normalizedName).toBe('GOOGLE');
});
it('normalizes individual names from LAST, FIRST format', () => {
const result = normalizeEntity('SMITH, JOHN');
expect(result.entityType).toBe('individual');
expect(result.displayName).toBe('JOHN SMITH');
});
});
//# sourceMappingURL=fec-entity-resolution.test.js.map
{"version":3,"file":"fec-entity-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/fec-entity-resolution.test.ts"],"names":[],"mappings":"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"}

Sorry, the diff of this file is too big to display