c8fc9f577e
Three focused P1 fixes on the Session-45 snapshot model.
- Grade card intel ROOT CAUSE: gameLogService is NBA/WNBA-only (offline Python),
so MLB props never got l5_avg/l20_avg and buildIntelFields returned {}. Wired
MLB game logs into featureCache.gameLogFeatures via mlbStatsAdapter.getPlayerStats
(pure mlbGameLogFeatures + MLB stat_type->field map). buildIntelFields gained
playerStats/projection fallbacks for partial intel.
- Player name normalization: src/utils/playerName.js (+ web/src/lib copy):
normalizeName -> {display,key}. Strips periods, de-dots suffix, accent-folds
the key. Applied in snapshotService grouping, slateAdapter grade index +
player-strip merge (variants collapse, longest name shown), and
playerIntelService. "A.J. Ewing"/"AJ Ewing" + "Jazz Chisholm"/"Jr." now merge.
- MLB starting pitchers: new GET /api/schedule/:sport/pitchers (probablePitchers
service wrapping mlbStatsAdapter.getScheduleWithPitchers + best-effort ERA).
Slate fetches it, builds a team->pitcher map (full name + mascot match),
attaches pitchers to MLB GameCardData. + Next proxy.
Backend 2100 -> 2122 tests (+22), 176 suites. Web build clean (exit 0).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 lines
772 B
JavaScript
23 lines
772 B
JavaScript
/* Player-name normalization (Session 46) — frontend copy of
|
|
src/utils/playerName.js (the Next bundle can't import from src/). Keep the two
|
|
in sync; tests/unit cross-checks they agree. CommonJS so .tsx imports it AND
|
|
Jest requires it directly. */
|
|
|
|
const SUFFIXES = new Set(['jr', 'sr', 'ii', 'iii', 'iv', 'v']);
|
|
|
|
function normalizeName(raw) {
|
|
const display = String(raw == null ? '' : raw)
|
|
.replace(/\./g, '')
|
|
.replace(/\s+/g, ' ')
|
|
.trim();
|
|
const folded = display.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();
|
|
const key = folded.split(' ').filter((t) => t && !SUFFIXES.has(t)).join(' ');
|
|
return { display, key };
|
|
}
|
|
|
|
function nameKey(raw) {
|
|
return normalizeName(raw).key;
|
|
}
|
|
|
|
module.exports = { normalizeName, nameKey, SUFFIXES };
|