resolve-team
Version:
Resolve NBA & NFL sports team names and information via fuzzy search
606 lines (599 loc) • 16.8 kB
JavaScript
import Fuse from 'fuse.js';
const defaultOptions = {
sport: "all",
threshold: 0.4,
full: false
};
const teamList = {
nba: [
{
name: "Atlanta Hawks",
colors: ["#E03A3E", "#C1D32F", "#000000"],
nicknames: ["hawks", "atlanta", "atl"],
abbrev: ["ATL"],
sport: "nba"
},
{
name: "Boston Celtics",
colors: ["#007A33", "#BA9653", "#000000"],
nicknames: ["celtics", "boston", "bos", "celt"],
abbrev: ["BOS"],
sport: "nba"
},
{
name: "Brooklyn Nets",
colors: ["#000000", "#FFFFFF", "#000000"],
nicknames: ["nets", "brooklyn", "bkn"],
abbrev: ["BKN"],
sport: "nba"
},
{
name: "Charlotte Hornets",
colors: ["#1D1160", "#00788C", "#000000"],
nicknames: ["hornets", "charlotte", "cha"],
abbrev: ["CHA"],
sport: "nba"
},
{
name: "Chicago Bulls",
colors: ["#CE1141", "#000000", "#000000"],
nicknames: ["bulls", "chicago", "chi"],
abbrev: ["CHI"],
sport: "nba"
},
{
name: "Cleveland Cavaliers",
colors: ["#860038", "#041E42", "#000000"],
nicknames: ["cavaliers", "cleveland", "cle"],
abbrev: ["CLE"],
sport: "nba"
},
{
name: "Dallas Mavericks",
colors: ["#00538C", "#B8C4CA", "#000000"],
nicknames: ["mavericks", "dallas", "dal"],
abbrev: ["DAL"],
sport: "nba"
},
{
name: "Denver Nuggets",
colors: ["#0E2240", "#FEC524", "#000000"],
nicknames: ["nuggets", "denver", "den"],
abbrev: ["DEN"],
sport: "nba"
},
{
name: "Detroit Pistons",
colors: ["#C8102E", "#1D42BA", "#000000"],
nicknames: ["pistons", "detroit", "det"],
abbrev: ["DET"],
sport: "nba"
},
{
name: "Golden State Warriors",
colors: ["#1D428A", "#FFC72C", "#000000"],
nicknames: ["warriors", "golden state", "gs"],
abbrev: ["GSW"],
sport: "nba"
},
{
name: "Houston Rockets",
colors: ["#CE1141", "#000000", "#000000"],
nicknames: ["rockets", "houston", "hou"],
abbrev: ["HOU"],
sport: "nba"
},
{
name: "Indiana Pacers",
colors: ["#002D62", "#FDBB30", "#000000"],
nicknames: ["pacers", "indiana", "ind"],
abbrev: ["IND"],
sport: "nba"
},
{
name: "Los Angeles Clippers",
colors: ["#ED174C", "#006BB6", "#000000"],
nicknames: ["clippers", "la clippers", "lac"],
abbrev: ["LAC"],
sport: "nba"
},
{
name: "Los Angeles Lakers",
colors: ["#552583", "#FDB927", "#000000"],
nicknames: ["lakers", "la lakers", "lal"],
abbrev: ["LAL"],
sport: "nba"
},
{
name: "Memphis Grizzlies",
colors: ["#5D76A9", "#12173F", "#000000"],
nicknames: ["grizzlies", "memphis", "mem"],
abbrev: ["MEM"],
sport: "nba"
},
{
name: "Miami Heat",
colors: ["#98002E", "#F9A01B", "#000000"],
nicknames: ["heat", "miami", "mia"],
abbrev: ["MIA"],
sport: "nba"
},
{
name: "Milwaukee Bucks",
colors: ["#00471B", "#EEE1C6", "#000000"],
nicknames: ["bucks", "milwaukee", "mil"],
abbrev: ["MIL"],
sport: "nba"
},
{
name: "Minnesota Timberwolves",
colors: ["#0C2340", "#236192", "#000000"],
nicknames: ["timberwolves", "minnesota", "min"],
abbrev: ["MIN"],
sport: "nba"
},
{
name: "New Orleans Pelicans",
colors: ["#002B5C", "#B4975A", "#E31837", "#85714D"],
nicknames: ["pelicans", "new orleans", "no"],
abbrev: ["NOP"],
sport: "nba"
},
{
name: "New York Knicks",
colors: ["#006BB6", "#F58426", "#BEC0C2"],
nicknames: ["knicks", "ny knicks", "nyk"],
abbrev: ["NYK"],
sport: "nba"
},
{
name: "Oklahoma City Thunder",
colors: ["#007AC1", "#F05133", "#002D62", "#EF3B24", "#C4CED4"],
nicknames: ["thunder", "oklahoma city", "okc"],
abbrev: ["OKC"],
sport: "nba"
},
{
name: "Orlando Magic",
colors: ["#0077C0", "#C4CED4", "#000000"],
nicknames: ["magic", "orlando", "orl"],
abbrev: ["ORL"],
sport: "nba"
},
{
name: "Philadelphia 76ers",
colors: ["#006BB6", "#ED174C", "#002B5C"],
nicknames: ["76ers", "sixers", "philadelphia", "philly"],
abbrev: ["PHI"],
sport: "nba"
},
{
name: "Phoenix Suns",
colors: ["#1D1160", "#E56020", "#63727A"],
nicknames: ["suns", "phoenix", "phx"],
abbrev: ["PHX"],
sport: "nba"
},
{
name: "Portland Trail Blazers",
colors: ["#E03A3E", "#000000", "#FFFFFF"],
nicknames: ["trail blazers", "portland", "por"],
abbrev: ["POR"],
sport: "nba"
},
{
name: "Sacramento Kings",
colors: ["#5A2D81", "#63727A", "#BEC0C2"],
nicknames: ["kings", "sacramento", "sac"],
abbrev: ["SAC"],
sport: "nba"
},
{
name: "San Antonio Spurs",
colors: ["#000000", "#C4CED4", "#BAC3C9", "#AC1A2F"],
nicknames: ["spurs", "san antonio", "sa"],
abbrev: ["SAS"],
sport: "nba"
},
{
name: "Toronto Raptors",
colors: ["#CE1141", "#000000", "#A1A1A4", "#B4975A"],
nicknames: ["raptors", "toronto", "tor"],
abbrev: ["TOR"],
sport: "nba"
},
{
name: "Utah Jazz",
colors: ["#002B5C", "#00471B", "#F9A01B", "#FFFFFF"],
nicknames: ["jazz", "utah", "uta"],
abbrev: ["UTA"],
sport: "nba"
},
{
name: "Washington Wizards",
colors: ["#002B5C", "#E31837", "#C4CED4", "#002244"],
nicknames: ["wizards", "washington", "was"],
abbrev: ["WAS"],
sport: "nba"
}
],
nfl: [
{
name: "Arizona Cardinals",
colors: ["#97233F", "#000000"],
nicknames: ["cardinals", "cards", "ari"],
abbrev: ["ARI"],
sport: "nfl"
},
{
name: "Atlanta Falcons",
colors: ["#A71930", "#000000", "#A5ACAF"],
nicknames: ["falcons", "atlanta", "atl"],
abbrev: ["ATL"],
sport: "nfl"
},
{
name: "Baltimore Ravens",
colors: ["#241773", "#9E7C0C", "#000000"],
nicknames: ["ravens", "baltimore", "bal"],
abbrev: ["BAL"],
sport: "nfl"
},
{
name: "Buffalo Bills",
colors: ["#00338D", "#C60C30"],
nicknames: ["bills", "buffalo", "buf"],
abbrev: ["BUF"],
sport: "nfl"
},
{
name: "Carolina Panthers",
colors: ["#0085CA", "#101820", "#A5ACAF"],
nicknames: ["panthers", "carolina", "car"],
abbrev: ["CAR"],
sport: "nfl"
},
{
name: "Chicago Bears",
colors: ["#0B162A", "#C83803"],
nicknames: ["bears", "chicago", "chi"],
abbrev: ["CHI"],
sport: "nfl"
},
{
name: "Cincinnati Bengals",
colors: ["#FB4F14", "#000000"],
nicknames: ["bengals", "cincinnati", "cin"],
abbrev: ["CIN"],
sport: "nfl"
},
{
name: "Cleveland Browns",
colors: ["#311D00", "#FF3C00"],
nicknames: ["browns", "cleveland", "cle"],
abbrev: ["CLE"],
sport: "nfl"
},
{
name: "Dallas Cowboys",
colors: ["#003594", "#041E42", "#A5ACAF"],
nicknames: ["cowboys", "dallas", "dal"],
abbrev: ["DAL"],
sport: "nfl"
},
{
name: "Denver Broncos",
colors: ["#FB4F14", "#002244"],
nicknames: ["broncos", "denver", "den"],
abbrev: ["DEN"],
sport: "nfl"
},
{
name: "Detroit Lions",
colors: ["#0076B6", "#B0B7BC", "#000000"],
nicknames: ["lions", "detroit", "det"],
abbrev: ["DET"],
sport: "nfl"
},
{
name: "Green Bay Packers",
colors: ["#203731", "#FFB612"],
nicknames: ["packers", "green bay", "gb"],
abbrev: ["GB"],
sport: "nfl"
},
{
name: "Houston Texans",
colors: ["#03202F", "#A71930", "#FFFFFF"],
nicknames: ["texans", "houston", "hou"],
abbrev: ["HOU"],
sport: "nfl"
},
{
name: "Indianapolis Colts",
colors: ["#002C5F", "#A5ACAF", "#FFFFFF"],
nicknames: ["colts", "indianapolis", "ind"],
abbrev: ["IND"],
sport: "nfl"
},
{
name: "Jacksonville Jaguars",
colors: ["#006778", "#D7A22A", "#9F792C", "#000000"],
nicknames: ["jaguars", "jacksonville", "jax"],
abbrev: ["JAX"],
sport: "nfl"
},
{
name: "Kansas City Chiefs",
colors: ["#E31837", "#FFB81C"],
nicknames: ["chiefs", "kansas city", "kc"],
abbrev: ["KC"],
sport: "nfl"
},
{
name: "Las Vegas Raiders",
colors: ["#000000", "#A5ACAF", "#C4C9CC"],
nicknames: ["raiders", "las vegas", "lv"],
abbrev: ["LV"],
sport: "nfl"
},
{
name: "Los Angeles Chargers",
colors: ["#0072C6", "#FFC20E", "#000000"],
nicknames: ["chargers", "la chargers", "lac"],
abbrev: ["LAC"],
sport: "nfl"
},
{
name: "Los Angeles Rams",
colors: ["#002244", "#869397", "#FFFFFF"],
nicknames: ["rams", "la rams", "lar"],
abbrev: ["LAR"],
sport: "nfl"
},
{
name: "Miami Dolphins",
colors: ["#008E97", "#F58220", "#005778", "#FB4F14"],
nicknames: ["dolphins", "miami", "mia"],
abbrev: ["MIA"],
sport: "nfl"
},
{
name: "Minnesota Vikings",
colors: ["#4F2683", "#FFC62F", "#FFFFFF"],
nicknames: ["vikings", "minnesota", "min"],
abbrev: ["MIN"],
sport: "nfl"
},
{
name: "New England Patriots",
colors: ["#002244", "#C60C30", "#B0B7BC", "#FFFFFF"],
nicknames: ["patriots", "new england", "ne"],
abbrev: ["NE"],
sport: "nfl"
},
{
name: "New Orleans Saints",
colors: ["#D3BC8D", "#000000"],
nicknames: ["saints", "new orleans", "no"],
abbrev: ["NO"],
sport: "nfl"
},
{
name: "New York Giants",
colors: ["#0B2265", "#A71930", "#A5ACAF"],
nicknames: ["giants", "ny giants", "nyg"],
abbrev: ["NYG"],
sport: "nfl"
},
{
name: "New York Jets",
colors: ["#0C371D", "#FFFFFF"],
nicknames: ["jets", "ny jets", "nyj"],
abbrev: ["NYJ"],
sport: "nfl"
},
{
name: "Philadelphia Eagles",
colors: ["#004C54", "#A5ACAF", "#000000", "#FFD814"],
nicknames: ["eagles", "philadelphia", "phi"],
abbrev: ["PHI"],
sport: "nfl"
},
{
name: "Pittsburgh Steelers",
colors: ["#101820", "#FFB81C"],
nicknames: ["steelers", "pittsburgh", "pit"],
abbrev: ["PIT"],
sport: "nfl"
},
{
name: "San Francisco 49ers",
colors: ["#AA0000", "#B3995D"],
nicknames: ["49ers", "san francisco", "sf"],
abbrev: ["SF"],
sport: "nfl"
},
{
name: "Seattle Seahawks",
colors: ["#002244", "#69BE28", "#A5ACAF"],
nicknames: ["seahawks", "seattle", "sea"],
abbrev: ["SEA"],
sport: "nfl"
},
{
name: "Tampa Bay Buccaneers",
colors: ["#D50A0A", "#34302B", "#FF7900", "#B1BABF", "#FFFFFF"],
nicknames: ["buccaneers", "bucs", "tampa bay", "tb"],
abbrev: ["TB"],
sport: "nfl"
},
{
name: "Tennessee Titans",
colors: ["#0C2340", "#4B92DB", "#C8102E", "#B3995D"],
nicknames: ["titans", "tennessee", "ten"],
abbrev: ["TEN"],
sport: "nfl"
},
{
name: "Washington Commanders",
colors: ["#773141", "#FFB612", "#FFFFFF"],
nicknames: [
"cmdrs",
"washington",
"wash cmdrs",
"was cmndrs",
"was",
"wash commanders"
],
abbrev: ["WAS"],
sport: "nfl"
}
]
};
async function initializeFuse(options) {
const { sport, threshold } = options;
const sportSanitized = sport?.toLowerCase();
const teams = sportSanitized === "all" || !sportSanitized ? Object.values(teamList).flat() : teamList[sportSanitized];
const searchOptions = {
isCaseSensitive: false,
shouldSort: true,
minMatchCharLength: 3,
threshold: threshold ?? defaultOptions.threshold,
keys: ["name", "nicknames", "abbrev"],
useExtendedSearch: threshold === 0
};
return new Fuse(teams, searchOptions);
}
async function validateInputs(team, sport = "all") {
if (!(sport in teamList) && sport !== "all") {
return "Invalid sport category. Please choose from " + (await listValidSports()).join(", ") + ".";
}
if (typeof team !== "string" || team.trim().length === 0) {
return "Invalid query. Please provide a non-empty string for the team name.";
}
return null;
}
async function listValidSports() {
return Object.keys(teamList);
}
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
class TeamResolver {
/**
* Creates a new TeamResolver instance with optional default options.
*
* @param {Options} [options=defaultOptions] - Default options to use for all resolver operations
*/
constructor(options = defaultOptions) {
__publicField(this, "fuseInstance", null);
__publicField(this, "lastOptions", null);
__publicField(this, "options");
this.options = { ...defaultOptions, ...options };
}
async resolve(query, options = this.options) {
const finalOptions = { ...this.options, ...options };
const invalidInput = await validateInputs(
query,
finalOptions.sport?.toLowerCase()
);
if (invalidInput) {
throw new Error(invalidInput);
}
const fuse = await this.getFuseInstance(finalOptions);
const result = fuse.search(query);
if (result.length === 0) {
return null;
}
const item = result[0]?.item;
if (!item) {
return null;
}
return finalOptions.full ? item : item.name;
}
async compare(team1, team2, options = this.options) {
const finalOptions = { ...this.options, ...options, full: true };
const result1 = await this.resolve(team1, finalOptions);
const result2 = await this.resolve(team2, finalOptions);
if (!result1 || !result2) {
return false;
}
if (result1.name !== result2.name) {
return false;
}
return options.full === true ? result1 : true;
}
/**
* Returns an array of team names for the specified sport league.
*
* @param {keyof TeamList} sport - The sport league to get teams for ('nba' or 'nfl')
* @returns {string[]} Array of team names for the specified league
* @throws {Error} If invalid sport is provided
*
* @example
* ```ts
* const resolver = new TeamResolver()
* const nbaTeams = resolver.getTeamsByLeague('nba')
* console.log(nbaTeams) // ['Atlanta Hawks', 'Boston Celtics', ...]
* ```
*/
async getTeamsByLeague(sport) {
const teams = teamList[sport.toLowerCase()];
if (!teams) {
const validSports = await listValidSports();
throw new Error(
`Invalid sport: ${sport}. Must be one of: ${validSports.join(", ")}`
);
}
return teams.map((team) => team.name);
}
/**
* Returns an array of all NBA team names.
*
* @returns {string[]} Array of all NBA team names
*
* @example
* ```ts
* const resolver = new TeamResolver()
* const nbaTeams = resolver.getNbaTeams()
* console.log(nbaTeams) // ['Atlanta Hawks', 'Boston Celtics', ...]
* ```
*/
async getNbaTeams() {
return this.getTeamsByLeague("nba");
}
/**
* Returns an array of all NFL team names.
*
* @returns {string[]} Array of all NFL team names
*
* @example
* ```ts
* const resolver = new TeamResolver()
* const nflTeams = resolver.getNflTeams()
* console.log(nflTeams) // ['Arizona Cardinals', 'Atlanta Falcons', ...]
* ```
*/
async getNflTeams() {
return this.getTeamsByLeague("nfl");
}
/**
* Gets or initializes the Fuse instance for fuzzy searching.
* @private
*/
async getFuseInstance(options) {
const optionsChanged = !this.lastOptions || this.lastOptions.sport !== options.sport || this.lastOptions.threshold !== options.threshold;
if (!this.fuseInstance || optionsChanged) {
this.fuseInstance = await initializeFuse(options);
this.lastOptions = { ...options };
}
return this.fuseInstance;
}
}
const teamResolver = new TeamResolver();
async function resolveTeam(query, options = defaultOptions) {
const resolver = new TeamResolver(options);
return resolver.resolve(query, options);
}
export { resolveTeam, teamResolver };