@civiq/entity-resolution
Advanced tools
+66
| # 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 +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"} |
+1
-1
@@ -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"} |
+1
-1
@@ -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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"} |
+27
-5
| { | ||
| "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":"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"} |
| 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
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
No website
QualityPackage does not have a website.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
0
-100%1
-50%617325
-7.68%71
-12.35%19951
-2.88%