@sudobility/sports_api_client 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/baseball/network/api-baseball-client.d.ts.map +1 -1
- package/dist/baseball/network/api-baseball-client.js +3 -2
- package/dist/baseball/network/api-baseball-client.js.map +1 -1
- package/dist/basketball/network/api-basketball-client.d.ts.map +1 -1
- package/dist/basketball/network/api-basketball-client.js +3 -2
- package/dist/basketball/network/api-basketball-client.js.map +1 -1
- package/dist/common/api-sports-error.d.ts +22 -0
- package/dist/common/api-sports-error.d.ts.map +1 -0
- package/dist/common/api-sports-error.js +38 -0
- package/dist/common/api-sports-error.js.map +1 -0
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +1 -0
- package/dist/common/index.js.map +1 -1
- package/dist/football/network/api-football-client.d.ts.map +1 -1
- package/dist/football/network/api-football-client.js +3 -2
- package/dist/football/network/api-football-client.js.map +1 -1
- package/dist/formula1/network/api-f1-client.d.ts.map +1 -1
- package/dist/formula1/network/api-f1-client.js +3 -2
- package/dist/formula1/network/api-f1-client.js.map +1 -1
- package/dist/handball/network/api-handball-client.d.ts.map +1 -1
- package/dist/handball/network/api-handball-client.js +3 -2
- package/dist/handball/network/api-handball-client.js.map +1 -1
- package/dist/hockey/network/api-hockey-client.d.ts.map +1 -1
- package/dist/hockey/network/api-hockey-client.js +3 -2
- package/dist/hockey/network/api-hockey-client.js.map +1 -1
- package/dist/mma/network/api-mma-client.d.ts.map +1 -1
- package/dist/mma/network/api-mma-client.js +3 -2
- package/dist/mma/network/api-mma-client.js.map +1 -1
- package/dist/nfl/network/api-nfl-client.d.ts.map +1 -1
- package/dist/nfl/network/api-nfl-client.js +3 -2
- package/dist/nfl/network/api-nfl-client.js.map +1 -1
- package/dist/rugby/network/api-rugby-client.d.ts.map +1 -1
- package/dist/rugby/network/api-rugby-client.js +3 -2
- package/dist/rugby/network/api-rugby-client.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/volleyball/network/api-volleyball-client.d.ts.map +1 -1
- package/dist/volleyball/network/api-volleyball-client.js +3 -2
- package/dist/volleyball/network/api-volleyball-client.js.map +1 -1
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-baseball-client.d.ts","sourceRoot":"","sources":["../../../src/baseball/network/api-baseball-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,gBAAgB,EACjB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"api-baseball-client.d.ts","sourceRoot":"","sources":["../../../src/baseball/network/api-baseball-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAgClB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB;YA2BrD,OAAO;IA+Cf,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAoB7D,YAAY,CAChB,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAmB1C,UAAU,CACd,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IA2BjC,UAAU,CACd,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;IA6BjD,QAAQ,CACZ,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IAsB/C,iBAAiB,CACrB,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;IA8BjD,QAAQ,CACZ,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAoBvC,kBAAkB,CACtB,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IA4BvC,YAAY,CAChB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;CAMlD;AAgBD,eAAO,MAAM,uBAAuB,GAClC,eAAe,aAAa,EAC5B,QAAQ,iBAAiB,KACxB,iBAEF,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ApiSportsError, ApiSportsErrorType, classifyApiError, } from "../../common/api-sports-error";
|
|
1
2
|
import { buildQueryString } from "../../utils/query-params";
|
|
2
3
|
import { BASEBALL_API_BASE_URL, BASEBALL_DEFAULT_HEADERS, BASEBALL_ENDPOINTS, BASEBALL_RAPIDAPI_HOST, } from "./baseball-endpoints";
|
|
3
4
|
export class ApiBaseballClient {
|
|
@@ -24,14 +25,14 @@ export class ApiBaseballClient {
|
|
|
24
25
|
headers: this.headers,
|
|
25
26
|
});
|
|
26
27
|
if (response.data === undefined || response.data === null) {
|
|
27
|
-
throw new
|
|
28
|
+
throw new ApiSportsError("No data received from API-Baseball", "Baseball", ApiSportsErrorType.NO_DATA);
|
|
28
29
|
}
|
|
29
30
|
const data = response.data;
|
|
30
31
|
if (data.errors && Object.keys(data.errors).length > 0) {
|
|
31
32
|
const errorMsg = Array.isArray(data.errors)
|
|
32
33
|
? data.errors.join(", ")
|
|
33
34
|
: Object.values(data.errors).join(", ");
|
|
34
|
-
throw new
|
|
35
|
+
throw new ApiSportsError(`API-Baseball error: ${errorMsg}`, "Baseball", classifyApiError(data.errors), { errors: data.errors });
|
|
35
36
|
}
|
|
36
37
|
return data;
|
|
37
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-baseball-client.js","sourceRoot":"","sources":["../../../src/baseball/network/api-baseball-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-baseball-client\n * @description API-Baseball Client Library\n *\n * A TypeScript client for the API-Baseball API that provides type-safe\n * access to baseball data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiBaseballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiBaseballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiBaseballConfig,\n ApiBaseballResponse,\n BaseballCountriesParams,\n BaseballCountry,\n BaseballGame,\n BaseballGamesParams,\n BaseballHeadToHeadParams,\n BaseballLeagueResponse,\n BaseballLeaguesParams,\n BaseballSeasonsParams,\n BaseballStanding,\n BaseballStandingsParams,\n BaseballTeamResponse,\n BaseballTeamsParams,\n BaseballTeamStatistics,\n BaseballTeamStatisticsParams,\n BaseballTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n BASEBALL_API_BASE_URL,\n BASEBALL_DEFAULT_HEADERS,\n BASEBALL_ENDPOINTS,\n BASEBALL_RAPIDAPI_HOST,\n} from \"./baseball-endpoints\";\n\n/**\n * API-Baseball Client class\n *\n * Provides type-safe methods for all API-Baseball endpoints.\n */\nexport class ApiBaseballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiBaseballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n */\n constructor(networkClient: NetworkClient, config: ApiBaseballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || BASEBALL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...BASEBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || BASEBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...BASEBALL_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n /**\n * Make a GET request to the API\n */\n private async request<T>(endpoint: string): Promise<ApiBaseballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiBaseballResponse<T>>(url, {\n headers: this.headers,\n });\n\n if (response.data === undefined || response.data === null) {\n throw new Error(\"No data received from API-Baseball\");\n }\n\n // Check for API errors\n const data = response.data as ApiBaseballResponse<T>;\n if (data.errors && Object.keys(data.errors).length > 0) {\n const errorMsg = Array.isArray(data.errors)\n ? data.errors.join(\", \")\n : Object.values(data.errors).join(\", \");\n throw new Error(`API-Baseball error: ${errorMsg}`);\n }\n\n return data;\n }\n\n // ============================================================================\n // General Endpoints\n // ============================================================================\n\n /**\n * Get all available timezones\n */\n async getTimezone(): Promise<ApiBaseballResponse<BaseballTimezone>> {\n return this.request<BaseballTimezone>(BASEBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries\n */\n async getCountries(\n params?: BaseballCountriesParams,\n ): Promise<ApiBaseballResponse<BaseballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballCountry>(\n `${BASEBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n /**\n * Get all available seasons\n */\n async getSeasons(\n params?: BaseballSeasonsParams,\n ): Promise<ApiBaseballResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${BASEBALL_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get leagues with optional filtering\n */\n async getLeagues(\n params?: BaseballLeaguesParams,\n ): Promise<ApiBaseballResponse<BaseballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballLeagueResponse>(\n `${BASEBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams\n */\n async getTeams(\n params?: BaseballTeamsParams,\n ): Promise<ApiBaseballResponse<BaseballTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballTeamResponse>(\n `${BASEBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics\n */\n async getTeamStatistics(\n params: BaseballTeamStatisticsParams,\n ): Promise<ApiBaseballResponse<BaseballTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<BaseballTeamStatistics>(\n `${BASEBALL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get games with optional filtering\n */\n async getGames(\n params?: BaseballGamesParams,\n ): Promise<ApiBaseballResponse<BaseballGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballGame>(`${BASEBALL_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head to head games between two teams\n */\n async getGamesHeadToHead(\n params: BaseballHeadToHeadParams,\n ): Promise<ApiBaseballResponse<BaseballGame>> {\n const query = buildQueryString(params);\n return this.request<BaseballGame>(\n `${BASEBALL_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get standings for a league/season\n */\n async getStandings(\n params: BaseballStandingsParams,\n ): Promise<ApiBaseballResponse<BaseballStanding>> {\n const query = buildQueryString(params);\n return this.request<BaseballStanding>(\n `${BASEBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiBaseballClient instance\n */\nexport const createApiBaseballClient = (\n networkClient: NetworkClient,\n config: ApiBaseballConfig,\n): ApiBaseballClient => {\n return new ApiBaseballClient(networkClient, config);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"api-baseball-client.js","sourceRoot":"","sources":["../../../src/baseball/network/api-baseball-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-baseball-client\n * @description API-Baseball Client Library\n *\n * A TypeScript client for the API-Baseball API that provides type-safe\n * access to baseball data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiBaseballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiBaseballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiBaseballConfig,\n ApiBaseballResponse,\n BaseballCountriesParams,\n BaseballCountry,\n BaseballGame,\n BaseballGamesParams,\n BaseballHeadToHeadParams,\n BaseballLeagueResponse,\n BaseballLeaguesParams,\n BaseballSeasonsParams,\n BaseballStanding,\n BaseballStandingsParams,\n BaseballTeamResponse,\n BaseballTeamsParams,\n BaseballTeamStatistics,\n BaseballTeamStatisticsParams,\n BaseballTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n BASEBALL_API_BASE_URL,\n BASEBALL_DEFAULT_HEADERS,\n BASEBALL_ENDPOINTS,\n BASEBALL_RAPIDAPI_HOST,\n} from \"./baseball-endpoints\";\n\n/**\n * API-Baseball Client class\n *\n * Provides type-safe methods for all API-Baseball endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiBaseballClient\n *\n * @example\n * ```typescript\n * const client = new ApiBaseballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\nexport class ApiBaseballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiBaseballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n */\n constructor(networkClient: NetworkClient, config: ApiBaseballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || BASEBALL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...BASEBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || BASEBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...BASEBALL_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n /**\n * Make a GET request to the API\n *\n * @template T - The expected response data type\n * @param endpoint - The API endpoint path with query string\n * @returns Promise resolving to the typed API response\n * @throws {ApiSportsError} When no data is received or API returns errors\n */\n private async request<T>(endpoint: string): Promise<ApiBaseballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiBaseballResponse<T>>(url, {\n headers: this.headers,\n });\n\n if (response.data === undefined || response.data === null) {\n throw new ApiSportsError(\n \"No data received from API-Baseball\",\n \"Baseball\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiBaseballResponse<T>;\n if (data.errors && Object.keys(data.errors).length > 0) {\n const errorMsg = Array.isArray(data.errors)\n ? data.errors.join(\", \")\n : Object.values(data.errors).join(\", \");\n throw new ApiSportsError(\n `API-Baseball error: ${errorMsg}`,\n \"Baseball\",\n classifyApiError(data.errors),\n { errors: data.errors },\n );\n }\n\n return data;\n }\n\n // ============================================================================\n // General Endpoints\n // ============================================================================\n\n /**\n * Get all available timezones supported by the API\n *\n * @returns Promise resolving to array of timezone strings\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const timezones = await client.getTimezone();\n * ```\n */\n async getTimezone(): Promise<ApiBaseballResponse<BaseballTimezone>> {\n return this.request<BaseballTimezone>(BASEBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries or filter by name/code\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by country ID\n * @param params.name - Filter by country name\n * @param params.code - Filter by ISO country code\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Country objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const countries = await client.getCountries({ name: \"USA\" });\n * ```\n */\n async getCountries(\n params?: BaseballCountriesParams,\n ): Promise<ApiBaseballResponse<BaseballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballCountry>(\n `${BASEBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n /**\n * Get all available baseball seasons\n *\n * @param params - Optional filter parameters\n * @returns Promise resolving to array of season years\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const seasons = await client.getSeasons();\n * ```\n */\n async getSeasons(\n params?: BaseballSeasonsParams,\n ): Promise<ApiBaseballResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${BASEBALL_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get baseball leagues with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by league ID\n * @param params.name - Filter by league name\n * @param params.country - Filter by country name\n * @param params.season - Filter by season year\n * @param params.type - Filter by type (\"league\" or \"cup\")\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of LeagueResponse objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const mlb = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n async getLeagues(\n params?: BaseballLeaguesParams,\n ): Promise<ApiBaseballResponse<BaseballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballLeagueResponse>(\n `${BASEBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get baseball teams with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by team ID\n * @param params.name - Filter by team name\n * @param params.league - Filter by league ID\n * @param params.season - Filter by season year\n * @param params.country - Filter by country name\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of TeamResponse objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const teams = await client.getTeams({ league: 1, season: 2023 });\n * ```\n */\n async getTeams(\n params?: BaseballTeamsParams,\n ): Promise<ApiBaseballResponse<BaseballTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballTeamResponse>(\n `${BASEBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics for a specific league and season\n *\n * @param params - Required filter parameters\n * @param params.league - League ID (required)\n * @param params.season - Season year (required)\n * @param params.team - Team ID (required)\n * @returns Promise resolving to team statistics data\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const stats = await client.getTeamStatistics({ league: 1, season: 2023, team: 1 });\n * ```\n */\n async getTeamStatistics(\n params: BaseballTeamStatisticsParams,\n ): Promise<ApiBaseballResponse<BaseballTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<BaseballTeamStatistics>(\n `${BASEBALL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get baseball games with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by game ID\n * @param params.league - Filter by league ID\n * @param params.season - Filter by season year\n * @param params.team - Filter by team ID\n * @param params.date - Filter by date (YYYY-MM-DD)\n * @param params.live - Get live games (\"all\" or league IDs)\n * @param params.timezone - Timezone for date filtering\n * @returns Promise resolving to array of Game objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const liveGames = await client.getGames({ live: \"all\" });\n * ```\n */\n async getGames(\n params?: BaseballGamesParams,\n ): Promise<ApiBaseballResponse<BaseballGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BaseballGame>(`${BASEBALL_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head-to-head games between two baseball teams\n *\n * @param params - Parameters including h2h team IDs\n * @param params.h2h - Hyphen-separated team IDs (e.g., \"1-2\")\n * @param params.league - Optional league ID filter\n * @param params.season - Optional season year filter\n * @returns Promise resolving to array of Game objects for the matchup\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const h2h = await client.getGamesHeadToHead({ h2h: \"1-2\" });\n * ```\n */\n async getGamesHeadToHead(\n params: BaseballHeadToHeadParams,\n ): Promise<ApiBaseballResponse<BaseballGame>> {\n const query = buildQueryString(params);\n return this.request<BaseballGame>(\n `${BASEBALL_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get baseball standings for a league and season\n *\n * @param params - Required filter parameters\n * @param params.league - League ID (required)\n * @param params.season - Season year (required)\n * @param params.team - Optional team ID filter\n * @param params.group - Optional group filter\n * @param params.stage - Optional stage filter\n * @returns Promise resolving to array of Standing objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const standings = await client.getStandings({ league: 1, season: 2023 });\n * ```\n */\n async getStandings(\n params: BaseballStandingsParams,\n ): Promise<ApiBaseballResponse<BaseballStanding>> {\n const query = buildQueryString(params);\n return this.request<BaseballStanding>(\n `${BASEBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiBaseballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiBaseballClient instance\n *\n * @example\n * ```typescript\n * const client = createApiBaseballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiBaseballClient = (\n networkClient: NetworkClient,\n config: ApiBaseballConfig,\n): ApiBaseballClient => {\n return new ApiBaseballClient(networkClient, config);\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-basketball-client.d.ts","sourceRoot":"","sources":["../../../src/basketball/network/api-basketball-client.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EACnB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"api-basketball-client.d.ts","sourceRoot":"","sources":["../../../src/basketball/network/api-basketball-client.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAC9B,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAsClB,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB;YA2BvD,OAAO;IAqDf,WAAW,IAAI,OAAO,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;IAoBjE,YAAY,CAChB,MAAM,CAAC,EAAE,yBAAyB,GACjC,OAAO,CAAC,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;IAmB9C,UAAU,CACd,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IA4BnC,UAAU,CACd,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,wBAAwB,CAAC,CAAC;IA6BrD,QAAQ,CACZ,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,sBAAsB,CAAC,CAAC;IAsBnD,iBAAiB,CACrB,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAAC,qBAAqB,CAAC,wBAAwB,CAAC,CAAC;IA+BrD,QAAQ,CACZ,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IAsB3C,kBAAkB,CACtB,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IA4B3C,YAAY,CAChB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;CAMtD;AAgBD,eAAO,MAAM,yBAAyB,GACpC,eAAe,aAAa,EAC5B,QAAQ,mBAAmB,KAC1B,mBAEF,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ApiSportsError, ApiSportsErrorType, classifyApiError, } from "../../common/api-sports-error";
|
|
1
2
|
import { buildQueryString } from "../../utils/query-params";
|
|
2
3
|
import { BASKETBALL_API_BASE_URL, BASKETBALL_DEFAULT_HEADERS, BASKETBALL_ENDPOINTS, BASKETBALL_RAPIDAPI_HOST, } from "./basketball-endpoints";
|
|
3
4
|
export class ApiBasketballClient {
|
|
@@ -24,14 +25,14 @@ export class ApiBasketballClient {
|
|
|
24
25
|
headers: this.headers,
|
|
25
26
|
});
|
|
26
27
|
if (response.data === undefined || response.data === null) {
|
|
27
|
-
throw new
|
|
28
|
+
throw new ApiSportsError("No data received from API-Basketball", "Basketball", ApiSportsErrorType.NO_DATA);
|
|
28
29
|
}
|
|
29
30
|
const data = response.data;
|
|
30
31
|
if (data.errors && Object.keys(data.errors).length > 0) {
|
|
31
32
|
const errorMsg = Array.isArray(data.errors)
|
|
32
33
|
? data.errors.join(", ")
|
|
33
34
|
: Object.values(data.errors).join(", ");
|
|
34
|
-
throw new
|
|
35
|
+
throw new ApiSportsError(`API-Basketball error: ${errorMsg}`, "Basketball", classifyApiError(data.errors), { errors: data.errors });
|
|
35
36
|
}
|
|
36
37
|
return data;
|
|
37
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-basketball-client.js","sourceRoot":"","sources":["../../../src/basketball/network/api-basketball-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-basketball-client\n * @description API-Basketball Client Library\n *\n * A TypeScript client for the API-Basketball API that provides type-safe\n * access to basketball data including leagues, teams, games, standings, and more.\n *\n * Uses dependency injection for network requests, making it compatible with\n * both React (web) and React Native applications.\n *\n * @example\n * ```typescript\n * import { ApiBasketballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiBasketballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiBasketballConfig,\n ApiBasketballResponse,\n BasketballCountriesParams,\n BasketballCountry,\n BasketballGame,\n BasketballGamesParams,\n BasketballHeadToHeadParams,\n BasketballLeagueResponse,\n BasketballLeaguesParams,\n BasketballSeasonsParams,\n BasketballStanding,\n BasketballStandingsParams,\n BasketballTeamResponse,\n BasketballTeamsParams,\n BasketballTeamStatistics,\n BasketballTeamStatisticsParams,\n BasketballTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n BASKETBALL_API_BASE_URL,\n BASKETBALL_DEFAULT_HEADERS,\n BASKETBALL_ENDPOINTS,\n BASKETBALL_RAPIDAPI_HOST,\n} from \"./basketball-endpoints\";\n\n/**\n * API-Basketball Client class\n *\n * Provides type-safe methods for all API-Basketball endpoints.\n */\nexport class ApiBasketballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiBasketballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n */\n constructor(networkClient: NetworkClient, config: ApiBasketballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || BASKETBALL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...BASKETBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || BASKETBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...BASKETBALL_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n /**\n * Make a GET request to the API\n */\n private async request<T>(\n endpoint: string,\n ): Promise<ApiBasketballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiBasketballResponse<T>>(\n url,\n {\n headers: this.headers,\n },\n );\n\n if (response.data === undefined || response.data === null) {\n throw new Error(\"No data received from API-Basketball\");\n }\n\n // Check for API errors\n const data = response.data as ApiBasketballResponse<T>;\n if (data.errors && Object.keys(data.errors).length > 0) {\n const errorMsg = Array.isArray(data.errors)\n ? data.errors.join(\", \")\n : Object.values(data.errors).join(\", \");\n throw new Error(`API-Basketball error: ${errorMsg}`);\n }\n\n return data;\n }\n\n // ============================================================================\n // General Endpoints\n // ============================================================================\n\n /**\n * Get all available timezones\n */\n async getTimezone(): Promise<ApiBasketballResponse<BasketballTimezone>> {\n return this.request<BasketballTimezone>(BASKETBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries\n */\n async getCountries(\n params?: BasketballCountriesParams,\n ): Promise<ApiBasketballResponse<BasketballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballCountry>(\n `${BASKETBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n /**\n * Get all available seasons\n */\n async getSeasons(\n params?: BasketballSeasonsParams,\n ): Promise<ApiBasketballResponse<string>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<string>(`${BASKETBALL_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get leagues with optional filtering\n */\n async getLeagues(\n params?: BasketballLeaguesParams,\n ): Promise<ApiBasketballResponse<BasketballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballLeagueResponse>(\n `${BASKETBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams\n */\n async getTeams(\n params?: BasketballTeamsParams,\n ): Promise<ApiBasketballResponse<BasketballTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballTeamResponse>(\n `${BASKETBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics\n */\n async getTeamStatistics(\n params: BasketballTeamStatisticsParams,\n ): Promise<ApiBasketballResponse<BasketballTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<BasketballTeamStatistics>(\n `${BASKETBALL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get games with optional filtering\n */\n async getGames(\n params?: BasketballGamesParams,\n ): Promise<ApiBasketballResponse<BasketballGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballGame>(\n `${BASKETBALL_ENDPOINTS.GAMES}${query}`,\n );\n }\n\n /**\n * Get head to head games between two teams\n */\n async getGamesHeadToHead(\n params: BasketballHeadToHeadParams,\n ): Promise<ApiBasketballResponse<BasketballGame>> {\n const query = buildQueryString(params);\n return this.request<BasketballGame>(\n `${BASKETBALL_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get standings for a league/season\n */\n async getStandings(\n params: BasketballStandingsParams,\n ): Promise<ApiBasketballResponse<BasketballStanding>> {\n const query = buildQueryString(params);\n return this.request<BasketballStanding>(\n `${BASKETBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiBasketballClient instance\n */\nexport const createApiBasketballClient = (\n networkClient: NetworkClient,\n config: ApiBasketballConfig,\n): ApiBasketballClient => {\n return new ApiBasketballClient(networkClient, config);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"api-basketball-client.js","sourceRoot":"","sources":["../../../src/basketball/network/api-basketball-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-basketball-client\n * @description API-Basketball Client Library\n *\n * A TypeScript client for the API-Basketball API that provides type-safe\n * access to basketball data including leagues, teams, games, standings, and more.\n *\n * Uses dependency injection for network requests, making it compatible with\n * both React (web) and React Native applications.\n *\n * @example\n * ```typescript\n * import { ApiBasketballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiBasketballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiBasketballConfig,\n ApiBasketballResponse,\n BasketballCountriesParams,\n BasketballCountry,\n BasketballGame,\n BasketballGamesParams,\n BasketballHeadToHeadParams,\n BasketballLeagueResponse,\n BasketballLeaguesParams,\n BasketballSeasonsParams,\n BasketballStanding,\n BasketballStandingsParams,\n BasketballTeamResponse,\n BasketballTeamsParams,\n BasketballTeamStatistics,\n BasketballTeamStatisticsParams,\n BasketballTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n BASKETBALL_API_BASE_URL,\n BASKETBALL_DEFAULT_HEADERS,\n BASKETBALL_ENDPOINTS,\n BASKETBALL_RAPIDAPI_HOST,\n} from \"./basketball-endpoints\";\n\n/**\n * API-Basketball Client class\n *\n * Provides type-safe methods for all API-Basketball endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiBasketballClient\n *\n * @example\n * ```typescript\n * // Direct API authentication\n * const client = new ApiBasketballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * // RapidAPI authentication\n * const rapidClient = new ApiBasketballClient(networkClient, {\n * apiKey: \"YOUR_RAPIDAPI_KEY\",\n * useRapidApi: true,\n * rapidApiHost: \"api-basketball-v1.p.rapidapi.com\",\n * });\n * ```\n */\nexport class ApiBasketballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiBasketballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n */\n constructor(networkClient: NetworkClient, config: ApiBasketballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || BASKETBALL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...BASKETBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || BASKETBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...BASKETBALL_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n /**\n * Make a GET request to the API\n *\n * @template T - The expected response data type\n * @param endpoint - The API endpoint path with query string\n * @returns Promise resolving to the typed API response\n * @throws {ApiSportsError} When no data is received or API returns errors\n */\n private async request<T>(\n endpoint: string,\n ): Promise<ApiBasketballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiBasketballResponse<T>>(\n url,\n {\n headers: this.headers,\n },\n );\n\n if (response.data === undefined || response.data === null) {\n throw new ApiSportsError(\n \"No data received from API-Basketball\",\n \"Basketball\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiBasketballResponse<T>;\n if (data.errors && Object.keys(data.errors).length > 0) {\n const errorMsg = Array.isArray(data.errors)\n ? data.errors.join(\", \")\n : Object.values(data.errors).join(\", \");\n throw new ApiSportsError(\n `API-Basketball error: ${errorMsg}`,\n \"Basketball\",\n classifyApiError(data.errors),\n { errors: data.errors },\n );\n }\n\n return data;\n }\n\n // ============================================================================\n // General Endpoints\n // ============================================================================\n\n /**\n * Get all available timezones supported by the API\n *\n * @returns Promise resolving to array of timezone strings (e.g., \"Europe/London\")\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const timezones = await client.getTimezone();\n * console.log(timezones.response); // [\"Europe/London\", \"America/New_York\", ...]\n * ```\n */\n async getTimezone(): Promise<ApiBasketballResponse<BasketballTimezone>> {\n return this.request<BasketballTimezone>(BASKETBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries or filter by name/code\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by country ID\n * @param params.name - Filter by country name\n * @param params.code - Filter by ISO country code\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Country objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const countries = await client.getCountries({ search: \"usa\" });\n * ```\n */\n async getCountries(\n params?: BasketballCountriesParams,\n ): Promise<ApiBasketballResponse<BasketballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballCountry>(\n `${BASKETBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n /**\n * Get all available seasons for basketball leagues\n *\n * @param params - Optional filter parameters\n * @returns Promise resolving to array of season strings (e.g., [\"2022-2023\", \"2023-2024\"])\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const seasons = await client.getSeasons();\n * ```\n */\n async getSeasons(\n params?: BasketballSeasonsParams,\n ): Promise<ApiBasketballResponse<string>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<string>(`${BASKETBALL_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get basketball leagues with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by league ID\n * @param params.name - Filter by league name\n * @param params.country - Filter by country name\n * @param params.season - Filter by season\n * @param params.type - Filter by type (\"league\" or \"cup\")\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of LeagueResponse objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const nba = await client.getLeagues({ id: 12 });\n * const usaLeagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n async getLeagues(\n params?: BasketballLeaguesParams,\n ): Promise<ApiBasketballResponse<BasketballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballLeagueResponse>(\n `${BASKETBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get basketball teams with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by team ID\n * @param params.name - Filter by team name\n * @param params.league - Filter by league ID\n * @param params.season - Filter by season\n * @param params.country - Filter by country name\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of TeamResponse objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const teams = await client.getTeams({ league: 12, season: \"2023-2024\" });\n * ```\n */\n async getTeams(\n params?: BasketballTeamsParams,\n ): Promise<ApiBasketballResponse<BasketballTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballTeamResponse>(\n `${BASKETBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics for a specific league and season\n *\n * @param params - Required filter parameters\n * @param params.league - League ID (required)\n * @param params.season - Season string (required)\n * @param params.team - Team ID (required)\n * @returns Promise resolving to team statistics data\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const stats = await client.getTeamStatistics({ league: 12, season: \"2023-2024\", team: 137 });\n * ```\n */\n async getTeamStatistics(\n params: BasketballTeamStatisticsParams,\n ): Promise<ApiBasketballResponse<BasketballTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<BasketballTeamStatistics>(\n `${BASKETBALL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get basketball games with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by game ID\n * @param params.league - Filter by league ID\n * @param params.season - Filter by season\n * @param params.team - Filter by team ID\n * @param params.date - Filter by date (YYYY-MM-DD)\n * @param params.live - Get live games (\"all\" or league IDs)\n * @param params.timezone - Timezone for date filtering\n * @returns Promise resolving to array of Game objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const liveGames = await client.getGames({ live: \"all\" });\n * const todayGames = await client.getGames({ date: \"2024-01-15\" });\n * ```\n */\n async getGames(\n params?: BasketballGamesParams,\n ): Promise<ApiBasketballResponse<BasketballGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<BasketballGame>(\n `${BASKETBALL_ENDPOINTS.GAMES}${query}`,\n );\n }\n\n /**\n * Get head-to-head games between two basketball teams\n *\n * @param params - Parameters including h2h team IDs\n * @param params.h2h - Hyphen-separated team IDs (e.g., \"137-139\")\n * @param params.league - Optional league ID filter\n * @param params.season - Optional season filter\n * @returns Promise resolving to array of Game objects for the matchup\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const h2h = await client.getGamesHeadToHead({ h2h: \"137-139\" });\n * ```\n */\n async getGamesHeadToHead(\n params: BasketballHeadToHeadParams,\n ): Promise<ApiBasketballResponse<BasketballGame>> {\n const query = buildQueryString(params);\n return this.request<BasketballGame>(\n `${BASKETBALL_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get basketball standings for a league and season\n *\n * @param params - Required filter parameters\n * @param params.league - League ID (required)\n * @param params.season - Season string (required)\n * @param params.team - Optional team ID filter\n * @param params.group - Optional group filter\n * @param params.stage - Optional stage filter\n * @returns Promise resolving to array of Standing objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const standings = await client.getStandings({ league: 12, season: \"2023-2024\" });\n * ```\n */\n async getStandings(\n params: BasketballStandingsParams,\n ): Promise<ApiBasketballResponse<BasketballStanding>> {\n const query = buildQueryString(params);\n return this.request<BasketballStanding>(\n `${BASKETBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiBasketballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiBasketballClient instance\n *\n * @example\n * ```typescript\n * const client = createApiBasketballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiBasketballClient = (\n networkClient: NetworkClient,\n config: ApiBasketballConfig,\n): ApiBasketballClient => {\n return new ApiBasketballClient(networkClient, config);\n};\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare enum ApiSportsErrorType {
|
|
2
|
+
NO_DATA = "NO_DATA",
|
|
3
|
+
API_ERROR = "API_ERROR",
|
|
4
|
+
AUTH_FAILURE = "AUTH_FAILURE",
|
|
5
|
+
RATE_LIMIT = "RATE_LIMIT",
|
|
6
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
7
|
+
UNKNOWN = "UNKNOWN"
|
|
8
|
+
}
|
|
9
|
+
export declare class ApiSportsError extends Error {
|
|
10
|
+
readonly errorType: ApiSportsErrorType;
|
|
11
|
+
readonly statusCode?: number;
|
|
12
|
+
readonly sport: string;
|
|
13
|
+
readonly errors?: string[] | Record<string, string>;
|
|
14
|
+
readonly cause?: unknown;
|
|
15
|
+
constructor(message: string, sport: string, errorType?: ApiSportsErrorType, options?: {
|
|
16
|
+
statusCode?: number;
|
|
17
|
+
errors?: string[] | Record<string, string>;
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export declare function classifyApiError(errors: string[] | Record<string, string>): ApiSportsErrorType;
|
|
22
|
+
//# sourceMappingURL=api-sports-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-sports-error.d.ts","sourceRoot":"","sources":["../../src/common/api-sports-error.ts"],"names":[],"mappings":"AA8BA,oBAAY,kBAAkB;IAE5B,OAAO,YAAY;IAEnB,SAAS,cAAc;IAEvB,YAAY,iBAAiB;IAE7B,UAAU,eAAe;IAEzB,aAAa,kBAAkB;IAE/B,OAAO,YAAY;CACpB;AA4BD,qBAAa,cAAe,SAAQ,KAAK;IAEvC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAEvC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAcvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,kBAA+C,EAC1D,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CAUJ;AAWD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACxC,kBAAkB,CAwBpB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export var ApiSportsErrorType;
|
|
2
|
+
(function (ApiSportsErrorType) {
|
|
3
|
+
ApiSportsErrorType["NO_DATA"] = "NO_DATA";
|
|
4
|
+
ApiSportsErrorType["API_ERROR"] = "API_ERROR";
|
|
5
|
+
ApiSportsErrorType["AUTH_FAILURE"] = "AUTH_FAILURE";
|
|
6
|
+
ApiSportsErrorType["RATE_LIMIT"] = "RATE_LIMIT";
|
|
7
|
+
ApiSportsErrorType["NETWORK_ERROR"] = "NETWORK_ERROR";
|
|
8
|
+
ApiSportsErrorType["UNKNOWN"] = "UNKNOWN";
|
|
9
|
+
})(ApiSportsErrorType || (ApiSportsErrorType = {}));
|
|
10
|
+
export class ApiSportsError extends Error {
|
|
11
|
+
constructor(message, sport, errorType = ApiSportsErrorType.UNKNOWN, options) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "ApiSportsError";
|
|
14
|
+
this.sport = sport;
|
|
15
|
+
this.errorType = errorType;
|
|
16
|
+
this.statusCode = options?.statusCode;
|
|
17
|
+
this.errors = options?.errors;
|
|
18
|
+
this.cause = options?.cause;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function classifyApiError(errors) {
|
|
22
|
+
const errorMessages = Array.isArray(errors) ? errors : Object.values(errors);
|
|
23
|
+
const combined = errorMessages.join(" ").toLowerCase();
|
|
24
|
+
if (combined.includes("rate limit") ||
|
|
25
|
+
combined.includes("too many requests") ||
|
|
26
|
+
combined.includes("quota")) {
|
|
27
|
+
return ApiSportsErrorType.RATE_LIMIT;
|
|
28
|
+
}
|
|
29
|
+
if (combined.includes("unauthorized") ||
|
|
30
|
+
combined.includes("invalid") ||
|
|
31
|
+
combined.includes("api key") ||
|
|
32
|
+
combined.includes("authentication") ||
|
|
33
|
+
combined.includes("forbidden")) {
|
|
34
|
+
return ApiSportsErrorType.AUTH_FAILURE;
|
|
35
|
+
}
|
|
36
|
+
return ApiSportsErrorType.API_ERROR;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=api-sports-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-sports-error.js","sourceRoot":"","sources":["../../src/common/api-sports-error.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAN,IAAY,kBAaX;AAbD,WAAY,kBAAkB;IAE5B,yCAAmB,CAAA;IAEnB,6CAAuB,CAAA;IAEvB,mDAA6B,CAAA;IAE7B,+CAAyB,CAAA;IAEzB,qDAA+B,CAAA;IAE/B,yCAAmB,CAAA;AACrB,CAAC,EAbW,kBAAkB,KAAlB,kBAAkB,QAa7B;AA4BD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAuBvC,YACE,OAAe,EACf,KAAa,EACb,YAAgC,kBAAkB,CAAC,OAAO,EAC1D,OAIC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF;AAWD,MAAM,UAAU,gBAAgB,CAC9B,MAAyC;IAEzC,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAEvD,IACE,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC1B,CAAC;QACD,OAAO,kBAAkB,CAAC,UAAU,CAAC;IACvC,CAAC;IAED,IACE,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5B,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,CAAC;QACD,OAAO,kBAAkB,CAAC,YAAY,CAAC;IACzC,CAAC;IAED,OAAO,kBAAkB,CAAC,SAAS,CAAC;AACtC,CAAC","sourcesContent":["/**\n * @module common/api-sports-error\n * @description Typed error class for all api-sports.io API errors\n *\n * Provides a typed error class that replaces generic `Error` throws in API clients.\n * Enables consumers to discriminate between different error types (rate limit,\n * authentication failure, not found, etc.) using the `errorType` property.\n *\n * @example\n * ```typescript\n * import { ApiSportsError, ApiSportsErrorType } from \"@sudobility/sports_api_client\";\n *\n * try {\n * const leagues = await client.getLeagues();\n * } catch (error) {\n * if (error instanceof ApiSportsError) {\n * if (error.errorType === ApiSportsErrorType.RATE_LIMIT) {\n * console.log(\"Rate limited, retry after backoff\");\n * } else if (error.errorType === ApiSportsErrorType.AUTH_FAILURE) {\n * console.log(\"Invalid API key\");\n * }\n * console.log(`Status: ${error.statusCode}, Sport: ${error.sport}`);\n * }\n * }\n * ```\n */\n\n/**\n * Enum representing the type of API error encountered\n */\nexport enum ApiSportsErrorType {\n /** No data received from the API */\n NO_DATA = \"NO_DATA\",\n /** API returned an error response */\n API_ERROR = \"API_ERROR\",\n /** Authentication failed (invalid or missing API key) */\n AUTH_FAILURE = \"AUTH_FAILURE\",\n /** Rate limit exceeded */\n RATE_LIMIT = \"RATE_LIMIT\",\n /** Network or connection error */\n NETWORK_ERROR = \"NETWORK_ERROR\",\n /** Unknown or unclassified error */\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Typed error class for api-sports.io API errors\n *\n * Extends the native Error class with structured properties for\n * error type discrimination, status codes, and sport identification.\n *\n * @example\n * ```typescript\n * try {\n * await client.getLeagues();\n * } catch (error) {\n * if (error instanceof ApiSportsError) {\n * switch (error.errorType) {\n * case ApiSportsErrorType.RATE_LIMIT:\n * // Handle rate limiting\n * break;\n * case ApiSportsErrorType.AUTH_FAILURE:\n * // Handle auth failure\n * break;\n * default:\n * console.error(error.message);\n * }\n * }\n * }\n * ```\n */\nexport class ApiSportsError extends Error {\n /** The type of API error for programmatic discrimination */\n readonly errorType: ApiSportsErrorType;\n /** HTTP status code if available */\n readonly statusCode?: number;\n /** The sport API that produced the error (e.g., \"Football\", \"Basketball\") */\n readonly sport: string;\n /** Raw error details from the API response */\n readonly errors?: string[] | Record<string, string>;\n /** The original error that caused this error, if any */\n readonly cause?: unknown;\n\n /**\n * Create a new ApiSportsError\n *\n * @param message - Human-readable error message\n * @param sport - The sport API name (e.g., \"Football\", \"Basketball\")\n * @param errorType - The classified error type\n * @param options - Additional error options\n * @param options.statusCode - HTTP status code if available\n * @param options.errors - Raw error details from the API response\n * @param options.cause - The original error that caused this error\n */\n constructor(\n message: string,\n sport: string,\n errorType: ApiSportsErrorType = ApiSportsErrorType.UNKNOWN,\n options?: {\n statusCode?: number;\n errors?: string[] | Record<string, string>;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name = \"ApiSportsError\";\n this.sport = sport;\n this.errorType = errorType;\n this.statusCode = options?.statusCode;\n this.errors = options?.errors;\n this.cause = options?.cause;\n }\n}\n\n/**\n * Classify an API error based on error messages\n *\n * Inspects error messages from the API response and classifies them\n * into a specific error type for easier handling.\n *\n * @param errors - Error messages or error object from the API response\n * @returns The classified error type\n */\nexport function classifyApiError(\n errors: string[] | Record<string, string>,\n): ApiSportsErrorType {\n const errorMessages = Array.isArray(errors) ? errors : Object.values(errors);\n\n const combined = errorMessages.join(\" \").toLowerCase();\n\n if (\n combined.includes(\"rate limit\") ||\n combined.includes(\"too many requests\") ||\n combined.includes(\"quota\")\n ) {\n return ApiSportsErrorType.RATE_LIMIT;\n }\n\n if (\n combined.includes(\"unauthorized\") ||\n combined.includes(\"invalid\") ||\n combined.includes(\"api key\") ||\n combined.includes(\"authentication\") ||\n combined.includes(\"forbidden\")\n ) {\n return ApiSportsErrorType.AUTH_FAILURE;\n }\n\n return ApiSportsErrorType.API_ERROR;\n}\n"]}
|
package/dist/common/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAMA,YAAY,EACV,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAMA,YAAY,EACV,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC"}
|
package/dist/common/index.js
CHANGED
package/dist/common/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Common module exports\n *\n * Shared types and utilities used across all sport API clients.\n */\n\nexport type {\n BaseApiResponse,\n BaseApiPaging,\n BaseApiConfig,\n} from \"./base-types\";\n\nexport { BASE_DEFAULT_HEADERS } from \"./base-types\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC","sourcesContent":["/**\n * Common module exports\n *\n * Shared types and utilities used across all sport API clients.\n */\n\nexport type {\n BaseApiResponse,\n BaseApiPaging,\n BaseApiConfig,\n} from \"./base-types\";\n\nexport { BASE_DEFAULT_HEADERS } from \"./base-types\";\n\nexport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"./api-sports-error\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-football-client.d.ts","sourceRoot":"","sources":["../../../src/football/network/api-football-client.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,2BAA2B,EAC3B,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,+BAA+B,EAC/B,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,oBAAoB,EACrB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"api-football-client.d.ts","sourceRoot":"","sources":["../../../src/football/network/api-football-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ApiSportsError, ApiSportsErrorType, classifyApiError, } from "../../common/api-sports-error";
|
|
1
2
|
import { buildQueryString } from "../../utils/query-params";
|
|
2
3
|
import { FOOTBALL_API_BASE_URL, FOOTBALL_DEFAULT_HEADERS, FOOTBALL_ENDPOINTS, FOOTBALL_RAPIDAPI_HOST, } from "./football-endpoints";
|
|
3
4
|
export class ApiFootballClient {
|
|
@@ -24,14 +25,14 @@ export class ApiFootballClient {
|
|
|
24
25
|
headers: this.headers,
|
|
25
26
|
});
|
|
26
27
|
if (response.data === undefined || response.data === null) {
|
|
27
|
-
throw new
|
|
28
|
+
throw new ApiSportsError("No data received from API-Football", "Football", ApiSportsErrorType.NO_DATA);
|
|
28
29
|
}
|
|
29
30
|
const data = response.data;
|
|
30
31
|
if (data.errors && Object.keys(data.errors).length > 0) {
|
|
31
32
|
const errorMsg = Array.isArray(data.errors)
|
|
32
33
|
? data.errors.join(", ")
|
|
33
34
|
: Object.values(data.errors).join(", ");
|
|
34
|
-
throw new
|
|
35
|
+
throw new ApiSportsError(`API-Football error: ${errorMsg}`, "Football", classifyApiError(data.errors), { errors: data.errors });
|
|
35
36
|
}
|
|
36
37
|
return data;
|
|
37
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-football-client.js","sourceRoot":"","sources":["../../../src/football/network/api-football-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-football-client\n * @description API-Football v3 Client Library\n *\n * A TypeScript client for the API-Football v3 API that provides type-safe\n * access to football data including leagues, teams, fixtures, players, and more.\n *\n * Uses dependency injection for network requests, making it compatible with\n * both React (web) and React Native applications.\n *\n * @example\n * ```typescript\n * import { ApiFootballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiFootballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"England\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiFootballConfig,\n ApiFootballResponse,\n FootballCoach,\n FootballCoachsParams,\n FootballCountriesParams,\n FootballCountry,\n FootballFixtureEvent,\n FootballFixtureEventsParams,\n FootballFixtureLineup,\n FootballFixtureLineupsParams,\n FootballFixturePlayersParams,\n FootballFixturePlayerStats,\n FootballFixtureResponse,\n FootballFixturesParams,\n FootballFixtureStatistics,\n FootballFixtureStatisticsParams,\n FootballHeadToHeadParams,\n FootballInjuriesParams,\n FootballInjury,\n FootballLeagueResponse,\n FootballLeaguesParams,\n FootballPlayerResponse,\n FootballPlayersParams,\n FootballPlayersSeasonParams,\n FootballSidelined,\n FootballSidelinedParams,\n FootballSquadResponse,\n FootballSquadsParams,\n FootballStandingsParams,\n FootballStandingsResponse,\n FootballTeamResponse,\n FootballTeamsParams,\n FootballTeamStatistics,\n FootballTeamStatisticsParams,\n FootballTimezone,\n FootballTopAssistsParams,\n FootballTopCardsParams,\n FootballTopScorersParams,\n FootballTransferResponse,\n FootballTransfersParams,\n FootballTrophiesParams,\n FootballTrophy,\n FootballVenue,\n FootballVenuesParams,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n FOOTBALL_API_BASE_URL,\n FOOTBALL_DEFAULT_HEADERS,\n FOOTBALL_ENDPOINTS,\n FOOTBALL_RAPIDAPI_HOST,\n} from \"./football-endpoints\";\n\n/**\n * API-Football Client class\n *\n * Provides type-safe methods for all API-Football v3 endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiFootballClient\n *\n * @example\n * ```typescript\n * // Direct API authentication\n * const client = new ApiFootballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * // RapidAPI authentication\n * const rapidClient = new ApiFootballClient(networkClient, {\n * apiKey: \"YOUR_RAPIDAPI_KEY\",\n * useRapidApi: true,\n * rapidApiHost: \"api-football-v1.p.rapidapi.com\",\n * });\n * ```\n */\nexport class ApiFootballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiFootballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n */\n constructor(networkClient: NetworkClient, config: ApiFootballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || FOOTBALL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...FOOTBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || FOOTBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...FOOTBALL_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n /**\n * Make a GET request to the API\n */\n private async request<T>(endpoint: string): Promise<ApiFootballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiFootballResponse<T>>(url, {\n headers: this.headers,\n });\n\n if (response.data === undefined || response.data === null) {\n throw new Error(\"No data received from API-Football\");\n }\n\n // Check for API errors\n const data = response.data as ApiFootballResponse<T>;\n if (data.errors && Object.keys(data.errors).length > 0) {\n const errorMsg = Array.isArray(data.errors)\n ? data.errors.join(\", \")\n : Object.values(data.errors).join(\", \");\n throw new Error(`API-Football error: ${errorMsg}`);\n }\n\n return data;\n }\n\n // ============================================================================\n // General Endpoints\n // ============================================================================\n\n /**\n * Get all available timezones supported by the API\n *\n * @returns Promise resolving to array of timezone strings (e.g., \"Europe/London\")\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * const timezones = await client.getTimezone();\n * console.log(timezones.response); // [\"Europe/London\", \"America/New_York\", ...]\n * ```\n */\n async getTimezone(): Promise<ApiFootballResponse<FootballTimezone>> {\n return this.request<FootballTimezone>(FOOTBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries or filter by name/code\n *\n * @param params - Optional filter parameters\n * @param params.name - Filter by country name\n * @param params.code - Filter by ISO 3166-1 alpha-2 code\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Country objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get all countries\n * const allCountries = await client.getCountries();\n *\n * // Search for countries\n * const results = await client.getCountries({ search: \"eng\" });\n * ```\n */\n async getCountries(\n params?: FootballCountriesParams,\n ): Promise<ApiFootballResponse<FootballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballCountry>(\n `${FOOTBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get all available seasons (years) in the API\n *\n * @returns Promise resolving to array of season years (e.g., [2020, 2021, 2022, 2023])\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * const seasons = await client.getSeasons();\n * const currentSeason = Math.max(...seasons.response);\n * ```\n */\n async getSeasons(): Promise<ApiFootballResponse<number>> {\n return this.request<number>(FOOTBALL_ENDPOINTS.LEAGUES_SEASONS);\n }\n\n /**\n * Get leagues and cups with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by league ID\n * @param params.name - Filter by league name\n * @param params.country - Filter by country name\n * @param params.season - Filter by season year\n * @param params.team - Filter by team ID\n * @param params.type - Filter by type (\"league\" or \"cup\")\n * @param params.current - Get only current leagues\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of LeagueResponse objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get Premier League\n * const pl = await client.getLeagues({ id: 39 });\n *\n * // Get all English leagues\n * const english = await client.getLeagues({ country: \"England\" });\n * ```\n */\n async getLeagues(\n params?: FootballLeaguesParams,\n ): Promise<ApiFootballResponse<FootballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballLeagueResponse>(\n `${FOOTBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams with optional filtering\n *\n * @param params - Filter parameters (id, name, league, season, country, code, venue, search)\n * @returns Promise resolving to array of TeamResponse objects\n * @throws Error if API returns an error or no data\n */\n async getTeams(\n params: FootballTeamsParams,\n ): Promise<ApiFootballResponse<FootballTeamResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballTeamResponse>(\n `${FOOTBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics for a league/season\n *\n * @param params - Required filter parameters (league, season, team; optional date)\n * @returns Promise resolving to team statistics data\n * @throws Error if API returns an error or no data\n */\n async getTeamStatistics(\n params: FootballTeamStatisticsParams,\n ): Promise<ApiFootballResponse<FootballTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<FootballTeamStatistics>(\n `${FOOTBALL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n /**\n * Get venues/stadiums with optional filtering\n *\n * @param params - Optional filter parameters (id, name, city, country, search)\n * @returns Promise resolving to array of Venue objects\n * @throws Error if API returns an error or no data\n */\n async getVenues(\n params?: FootballVenuesParams,\n ): Promise<ApiFootballResponse<FootballVenue>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballVenue>(`${FOOTBALL_ENDPOINTS.VENUES}${query}`);\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get league standings/table for a season\n *\n * @param params - Required filter parameters\n * @param params.league - League ID (required)\n * @param params.season - Season year (required)\n * @param params.team - Filter by team ID\n * @returns Promise resolving to array of StandingsResponse objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get Premier League 2023 standings\n * const standings = await client.getStandings({ league: 39, season: 2023 });\n * const table = standings.response[0]?.league.standings[0];\n * ```\n */\n async getStandings(\n params: FootballStandingsParams,\n ): Promise<ApiFootballResponse<FootballStandingsResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballStandingsResponse>(\n `${FOOTBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n\n // ============================================================================\n // Fixtures Endpoints\n // ============================================================================\n\n /**\n * Get fixtures (matches) with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by fixture ID\n * @param params.live - Get live fixtures (\"all\" or league IDs)\n * @param params.date - Filter by date (YYYY-MM-DD)\n * @param params.league - Filter by league ID\n * @param params.season - Filter by season year\n * @param params.team - Filter by team ID\n * @param params.last - Get last N fixtures\n * @param params.next - Get next N fixtures\n * @param params.from - Filter from date (YYYY-MM-DD)\n * @param params.to - Filter to date (YYYY-MM-DD)\n * @returns Promise resolving to array of FixtureResponse objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get live fixtures\n * const live = await client.getFixtures({ live: \"all\" });\n *\n * // Get fixtures for a date\n * const today = await client.getFixtures({ date: \"2024-01-15\" });\n *\n * // Get next 5 fixtures for a team\n * const next = await client.getFixtures({ team: 33, next: 5 });\n * ```\n */\n async getFixtures(\n params?: FootballFixturesParams,\n ): Promise<ApiFootballResponse<FootballFixtureResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballFixtureResponse>(\n `${FOOTBALL_ENDPOINTS.FIXTURES}${query}`,\n );\n }\n\n /**\n * Get head-to-head fixtures between two teams\n *\n * @param params - Parameters including h2h (team IDs), optional date/league/season filters\n * @returns Promise resolving to array of FixtureResponse objects\n * @throws Error if API returns an error or no data\n */\n async getFixturesHeadToHead(\n params: FootballHeadToHeadParams,\n ): Promise<ApiFootballResponse<FootballFixtureResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureResponse>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n /**\n * Get statistics for a specific fixture\n *\n * @param params - Parameters including fixture ID, optional team and stat type filters\n * @returns Promise resolving to array of FixtureStatistics objects\n * @throws Error if API returns an error or no data\n */\n async getFixtureStatistics(\n params: FootballFixtureStatisticsParams,\n ): Promise<ApiFootballResponse<FootballFixtureStatistics>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureStatistics>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_STATISTICS}${query}`,\n );\n }\n\n /**\n * Get fixture events (goals, cards, substitutions, VAR decisions)\n *\n * @param params - Parameters including fixture ID, optional team/player/type filters\n * @returns Promise resolving to array of FixtureEvent objects\n * @throws Error if API returns an error or no data\n */\n async getFixtureEvents(\n params: FootballFixtureEventsParams,\n ): Promise<ApiFootballResponse<FootballFixtureEvent>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureEvent>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_EVENTS}${query}`,\n );\n }\n\n /**\n * Get starting lineups for a fixture\n *\n * @param params - Parameters including fixture ID, optional team/player/type filters\n * @returns Promise resolving to array of FixtureLineup objects\n * @throws Error if API returns an error or no data\n */\n async getFixtureLineups(\n params: FootballFixtureLineupsParams,\n ): Promise<ApiFootballResponse<FootballFixtureLineup>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureLineup>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_LINEUPS}${query}`,\n );\n }\n\n /**\n * Get player statistics for a specific fixture\n *\n * @param params - Parameters including fixture ID, optional team filter\n * @returns Promise resolving to array of FixturePlayerStats objects\n * @throws Error if API returns an error or no data\n */\n async getFixturePlayers(\n params: FootballFixturePlayersParams,\n ): Promise<ApiFootballResponse<FootballFixturePlayerStats>> {\n const query = buildQueryString(params);\n return this.request<FootballFixturePlayerStats>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_PLAYERS}${query}`,\n );\n }\n\n // ============================================================================\n // Players Endpoints\n // ============================================================================\n\n /**\n * Get players with optional filtering\n *\n * @param params - Filter parameters (id, team, league, season, search, page)\n * @returns Promise resolving to array of PlayerResponse objects\n * @throws Error if API returns an error or no data\n */\n async getPlayers(\n params: FootballPlayersParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS}${query}`,\n );\n }\n\n /**\n * Get available seasons for a player\n *\n * @param params - Optional filter parameters (player ID)\n * @returns Promise resolving to array of season years\n * @throws Error if API returns an error or no data\n */\n async getPlayersSeasons(\n params?: FootballPlayersSeasonParams,\n ): Promise<ApiFootballResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_SEASONS}${query}`,\n );\n }\n\n /**\n * Get team squads or a player's teams\n *\n * @param params - Filter parameters (team ID or player ID)\n * @returns Promise resolving to array of SquadResponse objects\n * @throws Error if API returns an error or no data\n */\n async getSquads(\n params: FootballSquadsParams,\n ): Promise<ApiFootballResponse<FootballSquadResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballSquadResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_SQUADS}${query}`,\n );\n }\n\n /**\n * Get top scorers for a league and season\n *\n * @param params - Required parameters (league ID, season year)\n * @returns Promise resolving to array of PlayerResponse objects ranked by goals\n * @throws Error if API returns an error or no data\n */\n async getTopScorers(\n params: FootballTopScorersParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_TOP_SCORERS}${query}`,\n );\n }\n\n /**\n * Get top assists for a league and season\n *\n * @param params - Required parameters (league ID, season year)\n * @returns Promise resolving to array of PlayerResponse objects ranked by assists\n * @throws Error if API returns an error or no data\n */\n async getTopAssists(\n params: FootballTopAssistsParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_TOP_ASSISTS}${query}`,\n );\n }\n\n /**\n * Get most carded players for a league and season\n *\n * @param params - Required parameters (league ID, season year)\n * @returns Promise resolving to array of PlayerResponse objects ranked by cards\n * @throws Error if API returns an error or no data\n */\n async getTopCards(\n params: FootballTopCardsParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_TOP_CARDS}${query}`,\n );\n }\n\n // ============================================================================\n // Transfers Endpoints\n // ============================================================================\n\n /**\n * Get player transfers\n *\n * @param params - Filter parameters (player ID or team ID)\n * @returns Promise resolving to array of TransferResponse objects\n * @throws Error if API returns an error or no data\n */\n async getTransfers(\n params: FootballTransfersParams,\n ): Promise<ApiFootballResponse<FootballTransferResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballTransferResponse>(\n `${FOOTBALL_ENDPOINTS.TRANSFERS}${query}`,\n );\n }\n\n // ============================================================================\n // Trophies Endpoints\n // ============================================================================\n\n /**\n * Get trophies won by a player or coach\n *\n * @param params - Filter parameters (player ID or coach ID)\n * @returns Promise resolving to array of Trophy objects\n * @throws Error if API returns an error or no data\n */\n async getTrophies(\n params: FootballTrophiesParams,\n ): Promise<ApiFootballResponse<FootballTrophy>> {\n const query = buildQueryString(params);\n return this.request<FootballTrophy>(\n `${FOOTBALL_ENDPOINTS.TROPHIES}${query}`,\n );\n }\n\n // ============================================================================\n // Sidelined Endpoints\n // ============================================================================\n\n /**\n * Get sidelined players (injured or suspended)\n *\n * @param params - Filter parameters (player ID or coach ID)\n * @returns Promise resolving to array of Sidelined objects\n * @throws Error if API returns an error or no data\n */\n async getSidelined(\n params: FootballSidelinedParams,\n ): Promise<ApiFootballResponse<FootballSidelined>> {\n const query = buildQueryString(params);\n return this.request<FootballSidelined>(\n `${FOOTBALL_ENDPOINTS.SIDELINED}${query}`,\n );\n }\n\n // ============================================================================\n // Coachs Endpoints\n // ============================================================================\n\n /**\n * Get coach information\n *\n * @param params - Filter parameters (id, team, search)\n * @returns Promise resolving to array of Coach objects\n * @throws Error if API returns an error or no data\n */\n async getCoachs(\n params: FootballCoachsParams,\n ): Promise<ApiFootballResponse<FootballCoach>> {\n const query = buildQueryString(params);\n return this.request<FootballCoach>(`${FOOTBALL_ENDPOINTS.COACHS}${query}`);\n }\n\n // ============================================================================\n // Injuries Endpoints\n // ============================================================================\n\n /**\n * Get injury information\n *\n * @param params - Filter parameters (league, season, fixture, team, player, date, timezone)\n * @returns Promise resolving to array of Injury objects\n * @throws Error if API returns an error or no data\n */\n async getInjuries(\n params: FootballInjuriesParams,\n ): Promise<ApiFootballResponse<FootballInjury>> {\n const query = buildQueryString(params);\n return this.request<FootballInjury>(\n `${FOOTBALL_ENDPOINTS.INJURIES}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiFootballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiFootballClient instance\n *\n * @example\n * ```typescript\n * const client = createApiFootballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiFootballClient = (\n networkClient: NetworkClient,\n config: ApiFootballConfig,\n): ApiFootballClient => {\n return new ApiFootballClient(networkClient, config);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"api-football-client.js","sourceRoot":"","sources":["../../../src/football/network/api-football-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-football-client\n * @description API-Football v3 Client Library\n *\n * A TypeScript client for the API-Football v3 API that provides type-safe\n * access to football data including leagues, teams, fixtures, players, and more.\n *\n * Uses dependency injection for network requests, making it compatible with\n * both React (web) and React Native applications.\n *\n * @example\n * ```typescript\n * import { ApiFootballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiFootballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"England\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiFootballConfig,\n ApiFootballResponse,\n FootballCoach,\n FootballCoachsParams,\n FootballCountriesParams,\n FootballCountry,\n FootballFixtureEvent,\n FootballFixtureEventsParams,\n FootballFixtureLineup,\n FootballFixtureLineupsParams,\n FootballFixturePlayersParams,\n FootballFixturePlayerStats,\n FootballFixtureResponse,\n FootballFixturesParams,\n FootballFixtureStatistics,\n FootballFixtureStatisticsParams,\n FootballHeadToHeadParams,\n FootballInjuriesParams,\n FootballInjury,\n FootballLeagueResponse,\n FootballLeaguesParams,\n FootballPlayerResponse,\n FootballPlayersParams,\n FootballPlayersSeasonParams,\n FootballSidelined,\n FootballSidelinedParams,\n FootballSquadResponse,\n FootballSquadsParams,\n FootballStandingsParams,\n FootballStandingsResponse,\n FootballTeamResponse,\n FootballTeamsParams,\n FootballTeamStatistics,\n FootballTeamStatisticsParams,\n FootballTimezone,\n FootballTopAssistsParams,\n FootballTopCardsParams,\n FootballTopScorersParams,\n FootballTransferResponse,\n FootballTransfersParams,\n FootballTrophiesParams,\n FootballTrophy,\n FootballVenue,\n FootballVenuesParams,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n FOOTBALL_API_BASE_URL,\n FOOTBALL_DEFAULT_HEADERS,\n FOOTBALL_ENDPOINTS,\n FOOTBALL_RAPIDAPI_HOST,\n} from \"./football-endpoints\";\n\n/**\n * API-Football Client class\n *\n * Provides type-safe methods for all API-Football v3 endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiFootballClient\n *\n * @example\n * ```typescript\n * // Direct API authentication\n * const client = new ApiFootballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * // RapidAPI authentication\n * const rapidClient = new ApiFootballClient(networkClient, {\n * apiKey: \"YOUR_RAPIDAPI_KEY\",\n * useRapidApi: true,\n * rapidApiHost: \"api-football-v1.p.rapidapi.com\",\n * });\n * ```\n */\nexport class ApiFootballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiFootballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n */\n constructor(networkClient: NetworkClient, config: ApiFootballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || FOOTBALL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...FOOTBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || FOOTBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...FOOTBALL_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n /**\n * Make a GET request to the API\n *\n * @template T - The expected response data type\n * @param endpoint - The API endpoint path with query string\n * @returns Promise resolving to the typed API response\n * @throws {ApiSportsError} When no data is received or API returns errors\n */\n private async request<T>(endpoint: string): Promise<ApiFootballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiFootballResponse<T>>(url, {\n headers: this.headers,\n });\n\n if (response.data === undefined || response.data === null) {\n throw new ApiSportsError(\n \"No data received from API-Football\",\n \"Football\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiFootballResponse<T>;\n if (data.errors && Object.keys(data.errors).length > 0) {\n const errorMsg = Array.isArray(data.errors)\n ? data.errors.join(\", \")\n : Object.values(data.errors).join(\", \");\n throw new ApiSportsError(\n `API-Football error: ${errorMsg}`,\n \"Football\",\n classifyApiError(data.errors),\n { errors: data.errors },\n );\n }\n\n return data;\n }\n\n // ============================================================================\n // General Endpoints\n // ============================================================================\n\n /**\n * Get all available timezones supported by the API\n *\n * @returns Promise resolving to array of timezone strings (e.g., \"Europe/London\")\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * const timezones = await client.getTimezone();\n * console.log(timezones.response); // [\"Europe/London\", \"America/New_York\", ...]\n * ```\n */\n async getTimezone(): Promise<ApiFootballResponse<FootballTimezone>> {\n return this.request<FootballTimezone>(FOOTBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries or filter by name/code\n *\n * @param params - Optional filter parameters\n * @param params.name - Filter by country name\n * @param params.code - Filter by ISO 3166-1 alpha-2 code\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Country objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get all countries\n * const allCountries = await client.getCountries();\n *\n * // Search for countries\n * const results = await client.getCountries({ search: \"eng\" });\n * ```\n */\n async getCountries(\n params?: FootballCountriesParams,\n ): Promise<ApiFootballResponse<FootballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballCountry>(\n `${FOOTBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get all available seasons (years) in the API\n *\n * @returns Promise resolving to array of season years (e.g., [2020, 2021, 2022, 2023])\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * const seasons = await client.getSeasons();\n * const currentSeason = Math.max(...seasons.response);\n * ```\n */\n async getSeasons(): Promise<ApiFootballResponse<number>> {\n return this.request<number>(FOOTBALL_ENDPOINTS.LEAGUES_SEASONS);\n }\n\n /**\n * Get leagues and cups with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by league ID\n * @param params.name - Filter by league name\n * @param params.country - Filter by country name\n * @param params.season - Filter by season year\n * @param params.team - Filter by team ID\n * @param params.type - Filter by type (\"league\" or \"cup\")\n * @param params.current - Get only current leagues\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of LeagueResponse objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get Premier League\n * const pl = await client.getLeagues({ id: 39 });\n *\n * // Get all English leagues\n * const english = await client.getLeagues({ country: \"England\" });\n * ```\n */\n async getLeagues(\n params?: FootballLeaguesParams,\n ): Promise<ApiFootballResponse<FootballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballLeagueResponse>(\n `${FOOTBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams with optional filtering\n *\n * @param params - Filter parameters (id, name, league, season, country, code, venue, search)\n * @returns Promise resolving to array of TeamResponse objects\n * @throws Error if API returns an error or no data\n */\n async getTeams(\n params: FootballTeamsParams,\n ): Promise<ApiFootballResponse<FootballTeamResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballTeamResponse>(\n `${FOOTBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics for a league/season\n *\n * @param params - Required filter parameters (league, season, team; optional date)\n * @returns Promise resolving to team statistics data\n * @throws Error if API returns an error or no data\n */\n async getTeamStatistics(\n params: FootballTeamStatisticsParams,\n ): Promise<ApiFootballResponse<FootballTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<FootballTeamStatistics>(\n `${FOOTBALL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n /**\n * Get venues/stadiums with optional filtering\n *\n * @param params - Optional filter parameters (id, name, city, country, search)\n * @returns Promise resolving to array of Venue objects\n * @throws Error if API returns an error or no data\n */\n async getVenues(\n params?: FootballVenuesParams,\n ): Promise<ApiFootballResponse<FootballVenue>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballVenue>(`${FOOTBALL_ENDPOINTS.VENUES}${query}`);\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get league standings/table for a season\n *\n * @param params - Required filter parameters\n * @param params.league - League ID (required)\n * @param params.season - Season year (required)\n * @param params.team - Filter by team ID\n * @returns Promise resolving to array of StandingsResponse objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get Premier League 2023 standings\n * const standings = await client.getStandings({ league: 39, season: 2023 });\n * const table = standings.response[0]?.league.standings[0];\n * ```\n */\n async getStandings(\n params: FootballStandingsParams,\n ): Promise<ApiFootballResponse<FootballStandingsResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballStandingsResponse>(\n `${FOOTBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n\n // ============================================================================\n // Fixtures Endpoints\n // ============================================================================\n\n /**\n * Get fixtures (matches) with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by fixture ID\n * @param params.live - Get live fixtures (\"all\" or league IDs)\n * @param params.date - Filter by date (YYYY-MM-DD)\n * @param params.league - Filter by league ID\n * @param params.season - Filter by season year\n * @param params.team - Filter by team ID\n * @param params.last - Get last N fixtures\n * @param params.next - Get next N fixtures\n * @param params.from - Filter from date (YYYY-MM-DD)\n * @param params.to - Filter to date (YYYY-MM-DD)\n * @returns Promise resolving to array of FixtureResponse objects\n * @throws Error if API returns an error or no data\n *\n * @example\n * ```typescript\n * // Get live fixtures\n * const live = await client.getFixtures({ live: \"all\" });\n *\n * // Get fixtures for a date\n * const today = await client.getFixtures({ date: \"2024-01-15\" });\n *\n * // Get next 5 fixtures for a team\n * const next = await client.getFixtures({ team: 33, next: 5 });\n * ```\n */\n async getFixtures(\n params?: FootballFixturesParams,\n ): Promise<ApiFootballResponse<FootballFixtureResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<FootballFixtureResponse>(\n `${FOOTBALL_ENDPOINTS.FIXTURES}${query}`,\n );\n }\n\n /**\n * Get head-to-head fixtures between two teams\n *\n * @param params - Parameters including h2h (team IDs), optional date/league/season filters\n * @returns Promise resolving to array of FixtureResponse objects\n * @throws Error if API returns an error or no data\n */\n async getFixturesHeadToHead(\n params: FootballHeadToHeadParams,\n ): Promise<ApiFootballResponse<FootballFixtureResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureResponse>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n /**\n * Get statistics for a specific fixture\n *\n * @param params - Parameters including fixture ID, optional team and stat type filters\n * @returns Promise resolving to array of FixtureStatistics objects\n * @throws Error if API returns an error or no data\n */\n async getFixtureStatistics(\n params: FootballFixtureStatisticsParams,\n ): Promise<ApiFootballResponse<FootballFixtureStatistics>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureStatistics>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_STATISTICS}${query}`,\n );\n }\n\n /**\n * Get fixture events (goals, cards, substitutions, VAR decisions)\n *\n * @param params - Parameters including fixture ID, optional team/player/type filters\n * @returns Promise resolving to array of FixtureEvent objects\n * @throws Error if API returns an error or no data\n */\n async getFixtureEvents(\n params: FootballFixtureEventsParams,\n ): Promise<ApiFootballResponse<FootballFixtureEvent>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureEvent>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_EVENTS}${query}`,\n );\n }\n\n /**\n * Get starting lineups for a fixture\n *\n * @param params - Parameters including fixture ID, optional team/player/type filters\n * @returns Promise resolving to array of FixtureLineup objects\n * @throws Error if API returns an error or no data\n */\n async getFixtureLineups(\n params: FootballFixtureLineupsParams,\n ): Promise<ApiFootballResponse<FootballFixtureLineup>> {\n const query = buildQueryString(params);\n return this.request<FootballFixtureLineup>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_LINEUPS}${query}`,\n );\n }\n\n /**\n * Get player statistics for a specific fixture\n *\n * @param params - Parameters including fixture ID, optional team filter\n * @returns Promise resolving to array of FixturePlayerStats objects\n * @throws Error if API returns an error or no data\n */\n async getFixturePlayers(\n params: FootballFixturePlayersParams,\n ): Promise<ApiFootballResponse<FootballFixturePlayerStats>> {\n const query = buildQueryString(params);\n return this.request<FootballFixturePlayerStats>(\n `${FOOTBALL_ENDPOINTS.FIXTURES_PLAYERS}${query}`,\n );\n }\n\n // ============================================================================\n // Players Endpoints\n // ============================================================================\n\n /**\n * Get players with optional filtering\n *\n * @param params - Filter parameters (id, team, league, season, search, page)\n * @returns Promise resolving to array of PlayerResponse objects\n * @throws Error if API returns an error or no data\n */\n async getPlayers(\n params: FootballPlayersParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS}${query}`,\n );\n }\n\n /**\n * Get available seasons for a player\n *\n * @param params - Optional filter parameters (player ID)\n * @returns Promise resolving to array of season years\n * @throws Error if API returns an error or no data\n */\n async getPlayersSeasons(\n params?: FootballPlayersSeasonParams,\n ): Promise<ApiFootballResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_SEASONS}${query}`,\n );\n }\n\n /**\n * Get team squads or a player's teams\n *\n * @param params - Filter parameters (team ID or player ID)\n * @returns Promise resolving to array of SquadResponse objects\n * @throws Error if API returns an error or no data\n */\n async getSquads(\n params: FootballSquadsParams,\n ): Promise<ApiFootballResponse<FootballSquadResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballSquadResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_SQUADS}${query}`,\n );\n }\n\n /**\n * Get top scorers for a league and season\n *\n * @param params - Required parameters (league ID, season year)\n * @returns Promise resolving to array of PlayerResponse objects ranked by goals\n * @throws Error if API returns an error or no data\n */\n async getTopScorers(\n params: FootballTopScorersParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_TOP_SCORERS}${query}`,\n );\n }\n\n /**\n * Get top assists for a league and season\n *\n * @param params - Required parameters (league ID, season year)\n * @returns Promise resolving to array of PlayerResponse objects ranked by assists\n * @throws Error if API returns an error or no data\n */\n async getTopAssists(\n params: FootballTopAssistsParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_TOP_ASSISTS}${query}`,\n );\n }\n\n /**\n * Get most carded players for a league and season\n *\n * @param params - Required parameters (league ID, season year)\n * @returns Promise resolving to array of PlayerResponse objects ranked by cards\n * @throws Error if API returns an error or no data\n */\n async getTopCards(\n params: FootballTopCardsParams,\n ): Promise<ApiFootballResponse<FootballPlayerResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballPlayerResponse>(\n `${FOOTBALL_ENDPOINTS.PLAYERS_TOP_CARDS}${query}`,\n );\n }\n\n // ============================================================================\n // Transfers Endpoints\n // ============================================================================\n\n /**\n * Get player transfers\n *\n * @param params - Filter parameters (player ID or team ID)\n * @returns Promise resolving to array of TransferResponse objects\n * @throws Error if API returns an error or no data\n */\n async getTransfers(\n params: FootballTransfersParams,\n ): Promise<ApiFootballResponse<FootballTransferResponse>> {\n const query = buildQueryString(params);\n return this.request<FootballTransferResponse>(\n `${FOOTBALL_ENDPOINTS.TRANSFERS}${query}`,\n );\n }\n\n // ============================================================================\n // Trophies Endpoints\n // ============================================================================\n\n /**\n * Get trophies won by a player or coach\n *\n * @param params - Filter parameters (player ID or coach ID)\n * @returns Promise resolving to array of Trophy objects\n * @throws Error if API returns an error or no data\n */\n async getTrophies(\n params: FootballTrophiesParams,\n ): Promise<ApiFootballResponse<FootballTrophy>> {\n const query = buildQueryString(params);\n return this.request<FootballTrophy>(\n `${FOOTBALL_ENDPOINTS.TROPHIES}${query}`,\n );\n }\n\n // ============================================================================\n // Sidelined Endpoints\n // ============================================================================\n\n /**\n * Get sidelined players (injured or suspended)\n *\n * @param params - Filter parameters (player ID or coach ID)\n * @returns Promise resolving to array of Sidelined objects\n * @throws Error if API returns an error or no data\n */\n async getSidelined(\n params: FootballSidelinedParams,\n ): Promise<ApiFootballResponse<FootballSidelined>> {\n const query = buildQueryString(params);\n return this.request<FootballSidelined>(\n `${FOOTBALL_ENDPOINTS.SIDELINED}${query}`,\n );\n }\n\n // ============================================================================\n // Coachs Endpoints\n // ============================================================================\n\n /**\n * Get coach information\n *\n * @param params - Filter parameters (id, team, search)\n * @returns Promise resolving to array of Coach objects\n * @throws Error if API returns an error or no data\n */\n async getCoachs(\n params: FootballCoachsParams,\n ): Promise<ApiFootballResponse<FootballCoach>> {\n const query = buildQueryString(params);\n return this.request<FootballCoach>(`${FOOTBALL_ENDPOINTS.COACHS}${query}`);\n }\n\n // ============================================================================\n // Injuries Endpoints\n // ============================================================================\n\n /**\n * Get injury information\n *\n * @param params - Filter parameters (league, season, fixture, team, player, date, timezone)\n * @returns Promise resolving to array of Injury objects\n * @throws Error if API returns an error or no data\n */\n async getInjuries(\n params: FootballInjuriesParams,\n ): Promise<ApiFootballResponse<FootballInjury>> {\n const query = buildQueryString(params);\n return this.request<FootballInjury>(\n `${FOOTBALL_ENDPOINTS.INJURIES}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiFootballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiFootballClient instance\n *\n * @example\n * ```typescript\n * const client = createApiFootballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiFootballClient = (\n networkClient: NetworkClient,\n config: ApiFootballConfig,\n): ApiFootballClient => {\n return new ApiFootballClient(networkClient, config);\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-f1-client.d.ts","sourceRoot":"","sources":["../../../src/formula1/network/api-f1-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,aAAa,EACb,eAAe,EACf,MAAM,EACN,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,UAAU,EACX,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"api-f1-client.d.ts","sourceRoot":"","sources":["../../../src/formula1/network/api-f1-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,aAAa,EACb,eAAe,EACf,MAAM,EACN,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,UAAU,EACX,MAAM,UAAU,CAAC;AAkClB,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW;YA2B/C,OAAO;IA0Cf,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAgBjD,UAAU,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IA0BpE,WAAW,CACf,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IA2B9B,eAAe,CACnB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAwBlC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IA0BhE,UAAU,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IA6BtE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAsBhE,iBAAiB,CACrB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAoBpC,eAAe,CACnB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAyBlC,WAAW,CACf,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;CAIrC;AAgBD,eAAO,MAAM,iBAAiB,GAC5B,eAAe,aAAa,EAC5B,QAAQ,WAAW,KAClB,WAEF,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ApiSportsError, ApiSportsErrorType, classifyApiError, } from "../../common/api-sports-error";
|
|
1
2
|
import { buildQueryString } from "../../utils/query-params";
|
|
2
3
|
import { F1_API_BASE_URL, F1_DEFAULT_HEADERS, F1_ENDPOINTS, F1_RAPIDAPI_HOST, } from "./f1-endpoints";
|
|
3
4
|
export class ApiF1Client {
|
|
@@ -24,14 +25,14 @@ export class ApiF1Client {
|
|
|
24
25
|
headers: this.headers,
|
|
25
26
|
});
|
|
26
27
|
if (response.data === undefined || response.data === null) {
|
|
27
|
-
throw new
|
|
28
|
+
throw new ApiSportsError("No data received from API-Formula-1", "Formula1", ApiSportsErrorType.NO_DATA);
|
|
28
29
|
}
|
|
29
30
|
const data = response.data;
|
|
30
31
|
if (data.errors && Object.keys(data.errors).length > 0) {
|
|
31
32
|
const errorMsg = Array.isArray(data.errors)
|
|
32
33
|
? data.errors.join(", ")
|
|
33
34
|
: Object.values(data.errors).join(", ");
|
|
34
|
-
throw new
|
|
35
|
+
throw new ApiSportsError(`API-Formula-1 error: ${errorMsg}`, "Formula1", classifyApiError(data.errors), { errors: data.errors });
|
|
35
36
|
}
|
|
36
37
|
return data;
|
|
37
38
|
}
|