@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.
Files changed (43) hide show
  1. package/dist/baseball/network/api-baseball-client.d.ts.map +1 -1
  2. package/dist/baseball/network/api-baseball-client.js +3 -2
  3. package/dist/baseball/network/api-baseball-client.js.map +1 -1
  4. package/dist/basketball/network/api-basketball-client.d.ts.map +1 -1
  5. package/dist/basketball/network/api-basketball-client.js +3 -2
  6. package/dist/basketball/network/api-basketball-client.js.map +1 -1
  7. package/dist/common/api-sports-error.d.ts +22 -0
  8. package/dist/common/api-sports-error.d.ts.map +1 -0
  9. package/dist/common/api-sports-error.js +38 -0
  10. package/dist/common/api-sports-error.js.map +1 -0
  11. package/dist/common/index.d.ts +1 -0
  12. package/dist/common/index.d.ts.map +1 -1
  13. package/dist/common/index.js +1 -0
  14. package/dist/common/index.js.map +1 -1
  15. package/dist/football/network/api-football-client.d.ts.map +1 -1
  16. package/dist/football/network/api-football-client.js +3 -2
  17. package/dist/football/network/api-football-client.js.map +1 -1
  18. package/dist/formula1/network/api-f1-client.d.ts.map +1 -1
  19. package/dist/formula1/network/api-f1-client.js +3 -2
  20. package/dist/formula1/network/api-f1-client.js.map +1 -1
  21. package/dist/handball/network/api-handball-client.d.ts.map +1 -1
  22. package/dist/handball/network/api-handball-client.js +3 -2
  23. package/dist/handball/network/api-handball-client.js.map +1 -1
  24. package/dist/hockey/network/api-hockey-client.d.ts.map +1 -1
  25. package/dist/hockey/network/api-hockey-client.js +3 -2
  26. package/dist/hockey/network/api-hockey-client.js.map +1 -1
  27. package/dist/mma/network/api-mma-client.d.ts.map +1 -1
  28. package/dist/mma/network/api-mma-client.js +3 -2
  29. package/dist/mma/network/api-mma-client.js.map +1 -1
  30. package/dist/nfl/network/api-nfl-client.d.ts.map +1 -1
  31. package/dist/nfl/network/api-nfl-client.js +3 -2
  32. package/dist/nfl/network/api-nfl-client.js.map +1 -1
  33. package/dist/rugby/network/api-rugby-client.d.ts.map +1 -1
  34. package/dist/rugby/network/api-rugby-client.js +3 -2
  35. package/dist/rugby/network/api-rugby-client.js.map +1 -1
  36. package/dist/utils/index.d.ts +1 -0
  37. package/dist/utils/index.d.ts.map +1 -1
  38. package/dist/utils/index.js +1 -0
  39. package/dist/utils/index.js.map +1 -1
  40. package/dist/volleyball/network/api-volleyball-client.d.ts.map +1 -1
  41. package/dist/volleyball/network/api-volleyball-client.js +3 -2
  42. package/dist/volleyball/network/api-volleyball-client.js.map +1 -1
  43. package/package.json +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"api-f1-client.js","sourceRoot":"","sources":["../../../src/formula1/network/api-f1-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-f1-client\n * @description API-Formula-1 Client Library\n *\n * A TypeScript client for the API-Formula-1 API that provides type-safe\n * access to F1 data including races, drivers, teams, circuits, and more.\n *\n * @example\n * ```typescript\n * import { ApiF1Client } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiF1Client(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const races = await client.getRaces({ season: 2023 });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiF1Config,\n ApiF1Response,\n F1Circuit,\n F1CircuitsParams,\n F1Competition,\n F1CompetitionsParams,\n F1Driver,\n F1DriverRanking,\n F1DriverRankingsParams,\n F1DriversParams,\n F1PitStop,\n F1PitStopsParams,\n F1Race,\n F1RacesParams,\n F1SeasonsParams,\n F1Team,\n F1TeamRanking,\n F1TeamRankingsParams,\n F1TeamsParams,\n F1Timezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n F1_API_BASE_URL,\n F1_DEFAULT_HEADERS,\n F1_ENDPOINTS,\n F1_RAPIDAPI_HOST,\n} from \"./f1-endpoints\";\n\n/**\n * API-Formula-1 Client class\n *\n * Provides type-safe methods for all API-Formula-1 endpoints.\n */\nexport class ApiF1Client {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiF1Client 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: ApiF1Config) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || F1_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...F1_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || F1_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...F1_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<ApiF1Response<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiF1Response<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-Formula-1\");\n }\n\n // Check for API errors\n const data = response.data as ApiF1Response<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-Formula-1 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<ApiF1Response<F1Timezone>> {\n return this.request<F1Timezone>(F1_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available seasons\n */\n async getSeasons(params?: F1SeasonsParams): Promise<ApiF1Response<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${F1_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Circuits Endpoints\n // ============================================================================\n\n /**\n * Get circuits with optional filtering\n */\n async getCircuits(\n params?: F1CircuitsParams,\n ): Promise<ApiF1Response<F1Circuit>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Circuit>(`${F1_ENDPOINTS.CIRCUITS}${query}`);\n }\n\n // ============================================================================\n // Competitions Endpoints\n // ============================================================================\n\n /**\n * Get competitions (Grand Prix events)\n */\n async getCompetitions(\n params?: F1CompetitionsParams,\n ): Promise<ApiF1Response<F1Competition>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Competition>(`${F1_ENDPOINTS.COMPETITIONS}${query}`);\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams (constructors)\n */\n async getTeams(params?: F1TeamsParams): Promise<ApiF1Response<F1Team>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Team>(`${F1_ENDPOINTS.TEAMS}${query}`);\n }\n\n // ============================================================================\n // Drivers Endpoints\n // ============================================================================\n\n /**\n * Get drivers\n */\n async getDrivers(params?: F1DriversParams): Promise<ApiF1Response<F1Driver>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Driver>(`${F1_ENDPOINTS.DRIVERS}${query}`);\n }\n\n // ============================================================================\n // Races Endpoints\n // ============================================================================\n\n /**\n * Get races with optional filtering\n */\n async getRaces(params?: F1RacesParams): Promise<ApiF1Response<F1Race>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Race>(`${F1_ENDPOINTS.RACES}${query}`);\n }\n\n // ============================================================================\n // Rankings Endpoints\n // ============================================================================\n\n /**\n * Get driver rankings\n */\n async getDriverRankings(\n params: F1DriverRankingsParams,\n ): Promise<ApiF1Response<F1DriverRanking>> {\n const query = buildQueryString(params);\n return this.request<F1DriverRanking>(\n `${F1_ENDPOINTS.RANKINGS_DRIVERS}${query}`,\n );\n }\n\n /**\n * Get team (constructor) rankings\n */\n async getTeamRankings(\n params: F1TeamRankingsParams,\n ): Promise<ApiF1Response<F1TeamRanking>> {\n const query = buildQueryString(params);\n return this.request<F1TeamRanking>(\n `${F1_ENDPOINTS.RANKINGS_TEAMS}${query}`,\n );\n }\n\n // ============================================================================\n // Pit Stops Endpoints\n // ============================================================================\n\n /**\n * Get pit stops for a race\n */\n async getPitStops(\n params: F1PitStopsParams,\n ): Promise<ApiF1Response<F1PitStop>> {\n const query = buildQueryString(params);\n return this.request<F1PitStop>(`${F1_ENDPOINTS.PITSTOPS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiF1Client instance\n */\nexport const createApiF1Client = (\n networkClient: NetworkClient,\n config: ApiF1Config,\n): ApiF1Client => {\n return new ApiF1Client(networkClient, config);\n};\n"]}
1
+ {"version":3,"file":"api-f1-client.js","sourceRoot":"","sources":["../../../src/formula1/network/api-f1-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-f1-client\n * @description API-Formula-1 Client Library\n *\n * A TypeScript client for the API-Formula-1 API that provides type-safe\n * access to F1 data including races, drivers, teams, circuits, and more.\n *\n * @example\n * ```typescript\n * import { ApiF1Client } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiF1Client(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const races = await client.getRaces({ season: 2023 });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiF1Config,\n ApiF1Response,\n F1Circuit,\n F1CircuitsParams,\n F1Competition,\n F1CompetitionsParams,\n F1Driver,\n F1DriverRanking,\n F1DriverRankingsParams,\n F1DriversParams,\n F1PitStop,\n F1PitStopsParams,\n F1Race,\n F1RacesParams,\n F1SeasonsParams,\n F1Team,\n F1TeamRanking,\n F1TeamRankingsParams,\n F1TeamsParams,\n F1Timezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n F1_API_BASE_URL,\n F1_DEFAULT_HEADERS,\n F1_ENDPOINTS,\n F1_RAPIDAPI_HOST,\n} from \"./f1-endpoints\";\n\n/**\n * API-Formula-1 Client class\n *\n * Provides type-safe methods for all API-Formula-1 endpoints including\n * circuits, competitions, drivers, teams, races, rankings, and pit stops.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiF1Client\n *\n * @example\n * ```typescript\n * const client = new ApiF1Client(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const races = await client.getRaces({ season: 2023 });\n * const drivers = await client.getDrivers({ search: \"verstappen\" });\n * ```\n */\nexport class ApiF1Client {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiF1Client 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: ApiF1Config) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || F1_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...F1_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || F1_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...F1_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<ApiF1Response<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiF1Response<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-Formula-1\",\n \"Formula1\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiF1Response<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-Formula-1 error: ${errorMsg}`,\n \"Formula1\",\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 async getTimezone(): Promise<ApiF1Response<F1Timezone>> {\n return this.request<F1Timezone>(F1_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available Formula 1 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(params?: F1SeasonsParams): Promise<ApiF1Response<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${F1_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Circuits Endpoints\n // ============================================================================\n\n /**\n * Get Formula 1 circuits with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by circuit ID\n * @param params.name - Filter by circuit name\n * @param params.country - Filter by country name\n * @param params.city - Filter by city name\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Circuit objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const circuits = await client.getCircuits({ country: \"Italy\" });\n * ```\n */\n async getCircuits(\n params?: F1CircuitsParams,\n ): Promise<ApiF1Response<F1Circuit>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Circuit>(`${F1_ENDPOINTS.CIRCUITS}${query}`);\n }\n\n // ============================================================================\n // Competitions Endpoints\n // ============================================================================\n\n /**\n * Get Formula 1 competitions (Grand Prix events)\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by competition ID\n * @param params.name - Filter by competition name\n * @param params.country - Filter by country name\n * @param params.city - Filter by city name\n * @param params.season - Filter by season year\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Competition objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const gps = await client.getCompetitions({ season: 2023 });\n * ```\n */\n async getCompetitions(\n params?: F1CompetitionsParams,\n ): Promise<ApiF1Response<F1Competition>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Competition>(`${F1_ENDPOINTS.COMPETITIONS}${query}`);\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get Formula 1 teams (constructors) 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.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Team objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const teams = await client.getTeams({ search: \"red bull\" });\n * ```\n */\n async getTeams(params?: F1TeamsParams): Promise<ApiF1Response<F1Team>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Team>(`${F1_ENDPOINTS.TEAMS}${query}`);\n }\n\n // ============================================================================\n // Drivers Endpoints\n // ============================================================================\n\n /**\n * Get Formula 1 drivers with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by driver ID\n * @param params.name - Filter by driver name\n * @param params.team - Filter by team ID\n * @param params.season - Filter by season year\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Driver objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const drivers = await client.getDrivers({ search: \"verstappen\" });\n * ```\n */\n async getDrivers(params?: F1DriversParams): Promise<ApiF1Response<F1Driver>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Driver>(`${F1_ENDPOINTS.DRIVERS}${query}`);\n }\n\n // ============================================================================\n // Races Endpoints\n // ============================================================================\n\n /**\n * Get Formula 1 races with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by race ID\n * @param params.competition - Filter by competition ID\n * @param params.season - Filter by season year\n * @param params.type - Filter by race type (e.g., \"Race\", \"Qualifying\")\n * @param params.date - Filter by date (YYYY-MM-DD)\n * @param params.next - Get next N races\n * @param params.last - Get last N races\n * @returns Promise resolving to array of Race objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const races = await client.getRaces({ season: 2023 });\n * const nextRace = await client.getRaces({ next: 1 });\n * ```\n */\n async getRaces(params?: F1RacesParams): Promise<ApiF1Response<F1Race>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<F1Race>(`${F1_ENDPOINTS.RACES}${query}`);\n }\n\n // ============================================================================\n // Rankings Endpoints\n // ============================================================================\n\n /**\n * Get Formula 1 driver championship rankings\n *\n * @param params - Required filter parameters\n * @param params.season - Season year (required)\n * @returns Promise resolving to array of DriverRanking objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const driverRankings = await client.getDriverRankings({ season: 2023 });\n * ```\n */\n async getDriverRankings(\n params: F1DriverRankingsParams,\n ): Promise<ApiF1Response<F1DriverRanking>> {\n const query = buildQueryString(params);\n return this.request<F1DriverRanking>(\n `${F1_ENDPOINTS.RANKINGS_DRIVERS}${query}`,\n );\n }\n\n /**\n * Get Formula 1 team (constructor) championship rankings\n *\n * @param params - Required filter parameters\n * @param params.season - Season year (required)\n * @returns Promise resolving to array of TeamRanking objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const teamRankings = await client.getTeamRankings({ season: 2023 });\n * ```\n */\n async getTeamRankings(\n params: F1TeamRankingsParams,\n ): Promise<ApiF1Response<F1TeamRanking>> {\n const query = buildQueryString(params);\n return this.request<F1TeamRanking>(\n `${F1_ENDPOINTS.RANKINGS_TEAMS}${query}`,\n );\n }\n\n // ============================================================================\n // Pit Stops Endpoints\n // ============================================================================\n\n /**\n * Get pit stop data for a specific race\n *\n * @param params - Required filter parameters\n * @param params.race - Race ID (required)\n * @param params.team - Optional team ID filter\n * @returns Promise resolving to array of PitStop objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const pitStops = await client.getPitStops({ race: 1 });\n * ```\n */\n async getPitStops(\n params: F1PitStopsParams,\n ): Promise<ApiF1Response<F1PitStop>> {\n const query = buildQueryString(params);\n return this.request<F1PitStop>(`${F1_ENDPOINTS.PITSTOPS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiF1Client instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiF1Client instance\n *\n * @example\n * ```typescript\n * const client = createApiF1Client(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiF1Client = (\n networkClient: NetworkClient,\n config: ApiF1Config,\n): ApiF1Client => {\n return new ApiF1Client(networkClient, config);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api-handball-client.d.ts","sourceRoot":"","sources":["../../../src/handball/network/api-handball-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAYlB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAE5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB;YAqBrD,OAAO;IAyBf,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAO9D,YAAY,CAChB,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAU1C,UAAU,CACd,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAUzC,UAAU,CACd,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;IAUjD,QAAQ,CACZ,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IAU/C,YAAY,CAChB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;IAUpD,QAAQ,CACZ,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAQvC,MAAM,CACV,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAQvC,OAAO,CACX,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;CAI9C;AAKD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CAEnB"}
1
+ {"version":3,"file":"api-handball-client.d.ts","sourceRoot":"","sources":["../../../src/handball/network/api-handball-client.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAiClB,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;YA0BrD,OAAO;IAyCf,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAoB9D,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,cAAc,CAAC,CAAC;IA6BzC,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;IA4B/C,YAAY,CAChB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;IA8BpD,QAAQ,CACZ,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAoBvC,MAAM,CACV,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAuBvC,OAAO,CACX,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;CAI9C;AAgBD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,iBAAiB,GACxB,iBAAiB,CAEnB"}
@@ -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 { HANDBALL_API_BASE_URL, HANDBALL_DEFAULT_HEADERS, HANDBALL_ENDPOINTS, HANDBALL_RAPIDAPI_HOST, } from "./handball-endpoints";
3
4
  export class ApiHandballClient {
@@ -24,14 +25,14 @@ export class ApiHandballClient {
24
25
  headers: this.headers,
25
26
  });
26
27
  if (response.data === undefined || response.data === null) {
27
- throw new Error("No data received from API-Handball");
28
+ throw new ApiSportsError("No data received from API-Handball", "Handball", 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 Error(`API-Handball error: ${errorMsg}`);
35
+ throw new ApiSportsError(`API-Handball error: ${errorMsg}`, "Handball", classifyApiError(data.errors), { errors: data.errors });
35
36
  }
36
37
  return data;
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-handball-client.js","sourceRoot":"","sources":["../../../src/handball/network/api-handball-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-handball-client\n * @description API-Handball Client Library\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiHandballConfig,\n ApiHandballResponse,\n HandballCountriesParams,\n HandballCountry,\n HandballGame,\n HandballGamesParams,\n HandballH2HParams,\n HandballLeagueResponse,\n HandballLeaguesParams,\n HandballOdds,\n HandballOddsParams,\n HandballSeason,\n HandballSeasonsParams,\n HandballStandingsParams,\n HandballStandingsResponse,\n HandballTeamResponse,\n HandballTeamsParams,\n HandballTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n HANDBALL_API_BASE_URL,\n HANDBALL_DEFAULT_HEADERS,\n HANDBALL_ENDPOINTS,\n HANDBALL_RAPIDAPI_HOST,\n} from \"./handball-endpoints\";\n\n/**\n * API-Handball Client class\n */\nexport class ApiHandballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n constructor(networkClient: NetworkClient, config: ApiHandballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || HANDBALL_API_BASE_URL;\n\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...HANDBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || HANDBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...HANDBALL_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<ApiHandballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiHandballResponse<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-Handball\");\n }\n\n const data = response.data as ApiHandballResponse<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-Handball error: ${errorMsg}`);\n }\n\n return data;\n }\n\n /**\n * Get available timezones\n */\n async getTimezones(): Promise<ApiHandballResponse<HandballTimezone>> {\n return this.request<HandballTimezone>(HANDBALL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get countries\n */\n async getCountries(\n params?: HandballCountriesParams,\n ): Promise<ApiHandballResponse<HandballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballCountry>(\n `${HANDBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n /**\n * Get seasons\n */\n async getSeasons(\n params?: HandballSeasonsParams,\n ): Promise<ApiHandballResponse<HandballSeason>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballSeason>(\n `${HANDBALL_ENDPOINTS.SEASONS}${query}`,\n );\n }\n\n /**\n * Get leagues\n */\n async getLeagues(\n params?: HandballLeaguesParams,\n ): Promise<ApiHandballResponse<HandballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballLeagueResponse>(\n `${HANDBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n /**\n * Get teams\n */\n async getTeams(\n params?: HandballTeamsParams,\n ): Promise<ApiHandballResponse<HandballTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballTeamResponse>(\n `${HANDBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get standings\n */\n async getStandings(\n params: HandballStandingsParams,\n ): Promise<ApiHandballResponse<HandballStandingsResponse>> {\n const query = buildQueryString(params);\n return this.request<HandballStandingsResponse>(\n `${HANDBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n\n /**\n * Get games\n */\n async getGames(\n params?: HandballGamesParams,\n ): Promise<ApiHandballResponse<HandballGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballGame>(`${HANDBALL_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head-to-head\n */\n async getH2H(\n params: HandballH2HParams,\n ): Promise<ApiHandballResponse<HandballGame>> {\n const query = buildQueryString(params);\n return this.request<HandballGame>(`${HANDBALL_ENDPOINTS.H2H}${query}`);\n }\n\n /**\n * Get odds\n */\n async getOdds(\n params: HandballOddsParams,\n ): Promise<ApiHandballResponse<HandballOdds>> {\n const query = buildQueryString(params);\n return this.request<HandballOdds>(`${HANDBALL_ENDPOINTS.ODDS}${query}`);\n }\n}\n\n/**\n * Create a new API-Handball client\n */\nexport function createApiHandballClient(\n networkClient: NetworkClient,\n config: ApiHandballConfig,\n): ApiHandballClient {\n return new ApiHandballClient(networkClient, config);\n}\n"]}
1
+ {"version":3,"file":"api-handball-client.js","sourceRoot":"","sources":["../../../src/handball/network/api-handball-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-handball-client\n * @description API-Handball Client Library\n *\n * A TypeScript client for the API-Handball API that provides type-safe\n * access to handball data including leagues, teams, games, standings, odds, 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 { ApiHandballClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiHandballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"Germany\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiHandballConfig,\n ApiHandballResponse,\n HandballCountriesParams,\n HandballCountry,\n HandballGame,\n HandballGamesParams,\n HandballH2HParams,\n HandballLeagueResponse,\n HandballLeaguesParams,\n HandballOdds,\n HandballOddsParams,\n HandballSeason,\n HandballSeasonsParams,\n HandballStandingsParams,\n HandballStandingsResponse,\n HandballTeamResponse,\n HandballTeamsParams,\n HandballTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n HANDBALL_API_BASE_URL,\n HANDBALL_DEFAULT_HEADERS,\n HANDBALL_ENDPOINTS,\n HANDBALL_RAPIDAPI_HOST,\n} from \"./handball-endpoints\";\n\n/**\n * API-Handball Client class\n *\n * Provides type-safe methods for all API-Handball endpoints including\n * leagues, teams, games, standings, head-to-head, and odds.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiHandballClient\n *\n * @example\n * ```typescript\n * const client = new ApiHandballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"Germany\" });\n * ```\n */\nexport class ApiHandballClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiHandballClient 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: ApiHandballConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || HANDBALL_API_BASE_URL;\n\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...HANDBALL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || HANDBALL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...HANDBALL_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<ApiHandballResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiHandballResponse<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-Handball\",\n \"Handball\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n const data = response.data as ApiHandballResponse<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-Handball error: ${errorMsg}`,\n \"Handball\",\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 async getTimezones(): Promise<ApiHandballResponse<HandballTimezone>> {\n return this.request<HandballTimezone>(HANDBALL_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: \"ger\" });\n * ```\n */\n async getCountries(\n params?: HandballCountriesParams,\n ): Promise<ApiHandballResponse<HandballCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballCountry>(\n `${HANDBALL_ENDPOINTS.COUNTRIES}${query}`,\n );\n }\n\n /**\n * Get all available handball seasons\n *\n * @param params - Optional filter parameters\n * @returns Promise resolving to array of Season objects\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?: HandballSeasonsParams,\n ): Promise<ApiHandballResponse<HandballSeason>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballSeason>(\n `${HANDBALL_ENDPOINTS.SEASONS}${query}`,\n );\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get handball 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 leagues = await client.getLeagues({ country: \"Germany\" });\n * ```\n */\n async getLeagues(\n params?: HandballLeaguesParams,\n ): Promise<ApiHandballResponse<HandballLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballLeagueResponse>(\n `${HANDBALL_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get handball 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: 1, season: 2023 });\n * ```\n */\n async getTeams(\n params?: HandballTeamsParams,\n ): Promise<ApiHandballResponse<HandballTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballTeamResponse>(\n `${HANDBALL_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get handball 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 (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 StandingsResponse 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: HandballStandingsParams,\n ): Promise<ApiHandballResponse<HandballStandingsResponse>> {\n const query = buildQueryString(params);\n return this.request<HandballStandingsResponse>(\n `${HANDBALL_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get handball 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 * ```\n */\n async getGames(\n params?: HandballGamesParams,\n ): Promise<ApiHandballResponse<HandballGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HandballGame>(`${HANDBALL_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head-to-head games between two handball 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 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.getH2H({ h2h: \"1-2\" });\n * ```\n */\n async getH2H(\n params: HandballH2HParams,\n ): Promise<ApiHandballResponse<HandballGame>> {\n const query = buildQueryString(params);\n return this.request<HandballGame>(`${HANDBALL_ENDPOINTS.H2H}${query}`);\n }\n\n // ============================================================================\n // Odds Endpoints\n // ============================================================================\n\n /**\n * Get betting odds for handball games\n *\n * @param params - Required filter parameters\n * @param params.game - Game ID (required)\n * @param params.bookmaker - Optional bookmaker ID filter\n * @returns Promise resolving to array of Odds objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const odds = await client.getOdds({ game: 12345 });\n * ```\n */\n async getOdds(\n params: HandballOddsParams,\n ): Promise<ApiHandballResponse<HandballOdds>> {\n const query = buildQueryString(params);\n return this.request<HandballOdds>(`${HANDBALL_ENDPOINTS.ODDS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiHandballClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiHandballClient instance\n *\n * @example\n * ```typescript\n * const client = createApiHandballClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport function createApiHandballClient(\n networkClient: NetworkClient,\n config: ApiHandballConfig,\n): ApiHandballClient {\n return new ApiHandballClient(networkClient, config);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api-hockey-client.d.ts","sourceRoot":"","sources":["../../../src/hockey/network/api-hockey-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACf,MAAM,UAAU,CAAC;AAclB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe;YAsBnD,OAAO;IA8Bf,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAOzD,YAAY,CAChB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAQtC,UAAU,CACd,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAY/B,UAAU,CACd,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAc7C,QAAQ,CACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAU3C,iBAAiB,CACrB,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAc7C,QAAQ,CACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAQnC,kBAAkB,CACtB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAcnC,YAAY,CAChB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;CAM9C;AAKD,eAAO,MAAM,qBAAqB,GAChC,eAAe,aAAa,EAC5B,QAAQ,eAAe,KACtB,eAEF,CAAC"}
1
+ {"version":3,"file":"api-hockey-client.d.ts","sourceRoot":"","sources":["../../../src/hockey/network/api-hockey-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACf,MAAM,UAAU,CAAC;AAsClB,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe;YA2BnD,OAAO;IAgDf,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAoBzD,YAAY,CAChB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAiBtC,UAAU,CACd,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IA2B/B,UAAU,CACd,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IA6B7C,QAAQ,CACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IAsB3C,iBAAiB,CACrB,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IA8B7C,QAAQ,CACZ,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAoBnC,kBAAkB,CACtB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IA4BnC,YAAY,CAChB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;CAM9C;AAgBD,eAAO,MAAM,qBAAqB,GAChC,eAAe,aAAa,EAC5B,QAAQ,eAAe,KACtB,eAEF,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 { HOCKEY_API_BASE_URL, HOCKEY_DEFAULT_HEADERS, HOCKEY_ENDPOINTS, HOCKEY_RAPIDAPI_HOST, } from "./hockey-endpoints";
3
4
  export class ApiHockeyClient {
@@ -24,14 +25,14 @@ export class ApiHockeyClient {
24
25
  headers: this.headers,
25
26
  });
26
27
  if (response.data === undefined || response.data === null) {
27
- throw new Error("No data received from API-Hockey");
28
+ throw new ApiSportsError("No data received from API-Hockey", "Hockey", 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 Error(`API-Hockey error: ${errorMsg}`);
35
+ throw new ApiSportsError(`API-Hockey error: ${errorMsg}`, "Hockey", classifyApiError(data.errors), { errors: data.errors });
35
36
  }
36
37
  return data;
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-hockey-client.js","sourceRoot":"","sources":["../../../src/hockey/network/api-hockey-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-hockey-client\n * @description API-Hockey Client Library\n *\n * A TypeScript client for the API-Hockey API that provides type-safe\n * access to hockey data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiHockeyClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiHockeyClient(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 ApiHockeyConfig,\n ApiHockeyResponse,\n HockeyCountriesParams,\n HockeyCountry,\n HockeyGame,\n HockeyGamesParams,\n HockeyHeadToHeadParams,\n HockeyLeagueResponse,\n HockeyLeaguesParams,\n HockeySeasonsParams,\n HockeyStanding,\n HockeyStandingsParams,\n HockeyTeamResponse,\n HockeyTeamsParams,\n HockeyTeamStatistics,\n HockeyTeamStatisticsParams,\n HockeyTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n HOCKEY_API_BASE_URL,\n HOCKEY_DEFAULT_HEADERS,\n HOCKEY_ENDPOINTS,\n HOCKEY_RAPIDAPI_HOST,\n} from \"./hockey-endpoints\";\n\n/**\n * API-Hockey Client class\n *\n * Provides type-safe methods for all API-Hockey endpoints.\n */\nexport class ApiHockeyClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiHockeyClient 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: ApiHockeyConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || HOCKEY_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...HOCKEY_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || HOCKEY_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...HOCKEY_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<ApiHockeyResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiHockeyResponse<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-Hockey\");\n }\n\n // Check for API errors\n const data = response.data as ApiHockeyResponse<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-Hockey 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<ApiHockeyResponse<HockeyTimezone>> {\n return this.request<HockeyTimezone>(HOCKEY_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries\n */\n async getCountries(\n params?: HockeyCountriesParams,\n ): Promise<ApiHockeyResponse<HockeyCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyCountry>(`${HOCKEY_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available seasons\n */\n async getSeasons(\n params?: HockeySeasonsParams,\n ): Promise<ApiHockeyResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${HOCKEY_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get leagues with optional filtering\n */\n async getLeagues(\n params?: HockeyLeaguesParams,\n ): Promise<ApiHockeyResponse<HockeyLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyLeagueResponse>(\n `${HOCKEY_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams\n */\n async getTeams(\n params?: HockeyTeamsParams,\n ): Promise<ApiHockeyResponse<HockeyTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyTeamResponse>(\n `${HOCKEY_ENDPOINTS.TEAMS}${query}`,\n );\n }\n\n /**\n * Get team statistics\n */\n async getTeamStatistics(\n params: HockeyTeamStatisticsParams,\n ): Promise<ApiHockeyResponse<HockeyTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<HockeyTeamStatistics>(\n `${HOCKEY_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?: HockeyGamesParams,\n ): Promise<ApiHockeyResponse<HockeyGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyGame>(`${HOCKEY_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head to head games between two teams\n */\n async getGamesHeadToHead(\n params: HockeyHeadToHeadParams,\n ): Promise<ApiHockeyResponse<HockeyGame>> {\n const query = buildQueryString(params);\n return this.request<HockeyGame>(\n `${HOCKEY_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: HockeyStandingsParams,\n ): Promise<ApiHockeyResponse<HockeyStanding>> {\n const query = buildQueryString(params);\n return this.request<HockeyStanding>(\n `${HOCKEY_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiHockeyClient instance\n */\nexport const createApiHockeyClient = (\n networkClient: NetworkClient,\n config: ApiHockeyConfig,\n): ApiHockeyClient => {\n return new ApiHockeyClient(networkClient, config);\n};\n"]}
1
+ {"version":3,"file":"api-hockey-client.js","sourceRoot":"","sources":["../../../src/hockey/network/api-hockey-client.ts"],"names":[],"mappings":"AAuCA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AA0B5B,MAAM,OAAO,eAAe;IAW1B,YAAY,aAA4B,EAAE,MAAuB;QAC/D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,mBAAmB,CAAC;QAGrD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG;gBACb,GAAG,sBAAsB;gBACzB,iBAAiB,EAAE,MAAM,CAAC,YAAY,IAAI,oBAAoB;gBAC9D,gBAAgB,EAAE,MAAM,CAAC,MAAM;aAChC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG;gBACb,GAAG,sBAAsB;gBACzB,iBAAiB,EAAE,MAAM,CAAC,MAAM;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAUO,KAAK,CAAC,OAAO,CAAI,QAAgB;QACvC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAuB,GAAG,EAAE;YACvE,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1D,MAAM,IAAI,cAAc,CACtB,kCAAkC,EAClC,QAAQ,EACR,kBAAkB,CAAC,OAAO,CAC3B,CAAC;QACJ,CAAC;QAGD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA4B,CAAC;QACnD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBACzC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,cAAc,CACtB,qBAAqB,QAAQ,EAAE,EAC/B,QAAQ,EACR,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAC7B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CACxB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAkBD,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAiB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC;IAkBD,KAAK,CAAC,YAAY,CAChB,MAA8B;QAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAgB,GAAG,gBAAgB,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAcD,KAAK,CAAC,UAAU,CACd,MAA4B;QAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAS,GAAG,gBAAgB,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAwBD,KAAK,CAAC,UAAU,CACd,MAA4B;QAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,gBAAgB,CAAC,OAAO,GAAG,KAAK,EAAE,CACtC,CAAC;IACJ,CAAC;IAwBD,KAAK,CAAC,QAAQ,CACZ,MAA0B;QAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,gBAAgB,CAAC,KAAK,GAAG,KAAK,EAAE,CACpC,CAAC;IACJ,CAAC;IAiBD,KAAK,CAAC,iBAAiB,CACrB,MAAkC;QAElC,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,gBAAgB,CAAC,gBAAgB,GAAG,KAAK,EAAE,CAC/C,CAAC;IACJ,CAAC;IAyBD,KAAK,CAAC,QAAQ,CACZ,MAA0B;QAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAa,GAAG,gBAAgB,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAiBD,KAAK,CAAC,kBAAkB,CACtB,MAA8B;QAE9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,gBAAgB,CAAC,kBAAkB,GAAG,KAAK,EAAE,CACjD,CAAC;IACJ,CAAC;IAuBD,KAAK,CAAC,YAAY,CAChB,MAA6B;QAE7B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,gBAAgB,CAAC,SAAS,GAAG,KAAK,EAAE,CACxC,CAAC;IACJ,CAAC;CACF;AAgBD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,aAA4B,EAC5B,MAAuB,EACN,EAAE;IACnB,OAAO,IAAI,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC,CAAC","sourcesContent":["/**\n * @module api-hockey-client\n * @description API-Hockey Client Library\n *\n * A TypeScript client for the API-Hockey API that provides type-safe\n * access to hockey data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiHockeyClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiHockeyClient(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 ApiHockeyConfig,\n ApiHockeyResponse,\n HockeyCountriesParams,\n HockeyCountry,\n HockeyGame,\n HockeyGamesParams,\n HockeyHeadToHeadParams,\n HockeyLeagueResponse,\n HockeyLeaguesParams,\n HockeySeasonsParams,\n HockeyStanding,\n HockeyStandingsParams,\n HockeyTeamResponse,\n HockeyTeamsParams,\n HockeyTeamStatistics,\n HockeyTeamStatisticsParams,\n HockeyTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n HOCKEY_API_BASE_URL,\n HOCKEY_DEFAULT_HEADERS,\n HOCKEY_ENDPOINTS,\n HOCKEY_RAPIDAPI_HOST,\n} from \"./hockey-endpoints\";\n\n/**\n * API-Hockey Client class\n *\n * Provides type-safe methods for all API-Hockey endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiHockeyClient\n *\n * @example\n * ```typescript\n * // Direct API authentication\n * const client = new ApiHockeyClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * // RapidAPI authentication\n * const rapidClient = new ApiHockeyClient(networkClient, {\n * apiKey: \"YOUR_RAPIDAPI_KEY\",\n * useRapidApi: true,\n * rapidApiHost: \"api-hockey-v1.p.rapidapi.com\",\n * });\n * ```\n */\nexport class ApiHockeyClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiHockeyClient 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: ApiHockeyConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || HOCKEY_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...HOCKEY_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || HOCKEY_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...HOCKEY_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<ApiHockeyResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiHockeyResponse<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-Hockey\",\n \"Hockey\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiHockeyResponse<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-Hockey error: ${errorMsg}`,\n \"Hockey\",\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 * console.log(timezones.response);\n * ```\n */\n async getTimezone(): Promise<ApiHockeyResponse<HockeyTimezone>> {\n return this.request<HockeyTimezone>(HOCKEY_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: \"can\" });\n * ```\n */\n async getCountries(\n params?: HockeyCountriesParams,\n ): Promise<ApiHockeyResponse<HockeyCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyCountry>(`${HOCKEY_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available seasons for hockey leagues\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?: HockeySeasonsParams,\n ): Promise<ApiHockeyResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${HOCKEY_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get hockey 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 nhl = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n async getLeagues(\n params?: HockeyLeaguesParams,\n ): Promise<ApiHockeyResponse<HockeyLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyLeagueResponse>(\n `${HOCKEY_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get hockey 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: 57, season: 2023 });\n * ```\n */\n async getTeams(\n params?: HockeyTeamsParams,\n ): Promise<ApiHockeyResponse<HockeyTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyTeamResponse>(\n `${HOCKEY_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: 57, season: 2023, team: 1 });\n * ```\n */\n async getTeamStatistics(\n params: HockeyTeamStatisticsParams,\n ): Promise<ApiHockeyResponse<HockeyTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<HockeyTeamStatistics>(\n `${HOCKEY_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get hockey 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?: HockeyGamesParams,\n ): Promise<ApiHockeyResponse<HockeyGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<HockeyGame>(`${HOCKEY_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head-to-head games between two hockey 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: HockeyHeadToHeadParams,\n ): Promise<ApiHockeyResponse<HockeyGame>> {\n const query = buildQueryString(params);\n return this.request<HockeyGame>(\n `${HOCKEY_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get hockey 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: 57, season: 2023 });\n * ```\n */\n async getStandings(\n params: HockeyStandingsParams,\n ): Promise<ApiHockeyResponse<HockeyStanding>> {\n const query = buildQueryString(params);\n return this.request<HockeyStanding>(\n `${HOCKEY_ENDPOINTS.STANDINGS}${query}`,\n );\n }\n}\n\n/**\n * Factory function to create an ApiHockeyClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiHockeyClient instance\n *\n * @example\n * ```typescript\n * const client = createApiHockeyClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiHockeyClient = (\n networkClient: NetworkClient,\n config: ApiHockeyConfig,\n): ApiHockeyClient => {\n return new ApiHockeyClient(networkClient, config);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api-mma-client.d.ts","sourceRoot":"","sources":["../../../src/mma/network/api-mma-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACZ,MAAM,UAAU,CAAC;AAYlB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAE5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY;YAkBhD,OAAO;IAqBf,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAInD,YAAY,CAChB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAKhC,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAOtE,aAAa,CACjB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAKjC,WAAW,CACf,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAKhC,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;CAI7E;AAED,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,QAAQ,YAAY,KACnB,YAEF,CAAC"}
1
+ {"version":3,"file":"api-mma-client.d.ts","sourceRoot":"","sources":["../../../src/mma/network/api-mma-client.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACZ,MAAM,UAAU,CAAC;AAkClB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY;YA0BhD,OAAO;IAwCf,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAoBnD,YAAY,CAChB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAiBhC,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IA4BtE,aAAa,CACjB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAyBjC,WAAW,CACf,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IA0BhC,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;CAI7E;AAgBD,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,QAAQ,YAAY,KACnB,YAEF,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 { MMA_API_BASE_URL, MMA_DEFAULT_HEADERS, MMA_ENDPOINTS, MMA_RAPIDAPI_HOST, } from "./mma-endpoints";
3
4
  export class ApiMmaClient {
@@ -24,14 +25,14 @@ export class ApiMmaClient {
24
25
  headers: this.headers,
25
26
  });
26
27
  if (response.data === undefined || response.data === null) {
27
- throw new Error("No data received from API-MMA");
28
+ throw new ApiSportsError("No data received from API-MMA", "MMA", 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 Error(`API-MMA error: ${errorMsg}`);
35
+ throw new ApiSportsError(`API-MMA error: ${errorMsg}`, "MMA", classifyApiError(data.errors), { errors: data.errors });
35
36
  }
36
37
  return data;
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-mma-client.js","sourceRoot":"","sources":["../../../src/mma/network/api-mma-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-mma-client\n * @description API-MMA Client Library\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiMmaConfig,\n ApiMmaResponse,\n MmaCategoriesParams,\n MmaCategory,\n MmaCountriesParams,\n MmaCountry,\n MmaFight,\n MmaFighter,\n MmaFightersParams,\n MmaFightsParams,\n MmaSeasonsParams,\n MmaTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n MMA_API_BASE_URL,\n MMA_DEFAULT_HEADERS,\n MMA_ENDPOINTS,\n MMA_RAPIDAPI_HOST,\n} from \"./mma-endpoints\";\n\n/**\n * API-MMA Client class\n */\nexport class ApiMmaClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n constructor(networkClient: NetworkClient, config: ApiMmaConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || MMA_API_BASE_URL;\n\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...MMA_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || MMA_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...MMA_DEFAULT_HEADERS,\n \"x-apisports-key\": config.apiKey,\n };\n }\n }\n\n private async request<T>(endpoint: string): Promise<ApiMmaResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n const response = await this.networkClient.get<ApiMmaResponse<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-MMA\");\n }\n\n const data = response.data as ApiMmaResponse<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-MMA error: ${errorMsg}`);\n }\n\n return data;\n }\n\n async getTimezone(): Promise<ApiMmaResponse<MmaTimezone>> {\n return this.request<MmaTimezone>(MMA_ENDPOINTS.TIMEZONE);\n }\n\n async getCountries(\n params?: MmaCountriesParams,\n ): Promise<ApiMmaResponse<MmaCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaCountry>(`${MMA_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n async getSeasons(params?: MmaSeasonsParams): Promise<ApiMmaResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${MMA_ENDPOINTS.SEASONS}${query}`);\n }\n\n // Note: MMA API does NOT have a /leagues endpoint\n\n async getCategories(\n params?: MmaCategoriesParams,\n ): Promise<ApiMmaResponse<MmaCategory>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaCategory>(`${MMA_ENDPOINTS.CATEGORIES}${query}`);\n }\n\n async getFighters(\n params?: MmaFightersParams,\n ): Promise<ApiMmaResponse<MmaFighter>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaFighter>(`${MMA_ENDPOINTS.FIGHTERS}${query}`);\n }\n\n async getFights(params?: MmaFightsParams): Promise<ApiMmaResponse<MmaFight>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaFight>(`${MMA_ENDPOINTS.FIGHTS}${query}`);\n }\n}\n\nexport const createApiMmaClient = (\n networkClient: NetworkClient,\n config: ApiMmaConfig,\n): ApiMmaClient => {\n return new ApiMmaClient(networkClient, config);\n};\n"]}
1
+ {"version":3,"file":"api-mma-client.js","sourceRoot":"","sources":["../../../src/mma/network/api-mma-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-mma-client\n * @description API-MMA Client Library\n *\n * A TypeScript client for the API-MMA API that provides type-safe\n * access to MMA data including categories, fighters, fights, and more.\n * Note: MMA API does NOT have a /leagues endpoint; it uses categories instead.\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 { ApiMmaClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiMmaClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const fighters = await client.getFighters({ search: \"mcgregor\" });\n * ```\n */\n\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n ApiMmaConfig,\n ApiMmaResponse,\n MmaCategoriesParams,\n MmaCategory,\n MmaCountriesParams,\n MmaCountry,\n MmaFight,\n MmaFighter,\n MmaFightersParams,\n MmaFightsParams,\n MmaSeasonsParams,\n MmaTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n MMA_API_BASE_URL,\n MMA_DEFAULT_HEADERS,\n MMA_ENDPOINTS,\n MMA_RAPIDAPI_HOST,\n} from \"./mma-endpoints\";\n\n/**\n * API-MMA Client class\n *\n * Provides type-safe methods for all API-MMA endpoints including\n * categories, fighters, fights, countries, and seasons.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiMmaClient\n *\n * @example\n * ```typescript\n * const client = new ApiMmaClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const categories = await client.getCategories();\n * const fighters = await client.getFighters({ search: \"mcgregor\" });\n * ```\n */\nexport class ApiMmaClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiMmaClient 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: ApiMmaConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || MMA_API_BASE_URL;\n\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...MMA_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || MMA_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...MMA_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<ApiMmaResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n const response = await this.networkClient.get<ApiMmaResponse<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-MMA\",\n \"MMA\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n const data = response.data as ApiMmaResponse<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-MMA error: ${errorMsg}`,\n \"MMA\",\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 async getTimezone(): Promise<ApiMmaResponse<MmaTimezone>> {\n return this.request<MmaTimezone>(MMA_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?: MmaCountriesParams,\n ): Promise<ApiMmaResponse<MmaCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaCountry>(`${MMA_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available MMA 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(params?: MmaSeasonsParams): Promise<ApiMmaResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${MMA_ENDPOINTS.SEASONS}${query}`);\n }\n\n // Note: MMA API does NOT have a /leagues endpoint\n\n // ============================================================================\n // Categories Endpoints\n // ============================================================================\n\n /**\n * Get MMA categories (weight classes / divisions)\n *\n * Unlike other sports that use leagues, MMA organizes events by categories.\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by category ID\n * @param params.name - Filter by category name\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Category objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const categories = await client.getCategories();\n * ```\n */\n async getCategories(\n params?: MmaCategoriesParams,\n ): Promise<ApiMmaResponse<MmaCategory>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaCategory>(`${MMA_ENDPOINTS.CATEGORIES}${query}`);\n }\n\n // ============================================================================\n // Fighters Endpoints\n // ============================================================================\n\n /**\n * Get MMA fighters with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by fighter ID\n * @param params.name - Filter by fighter name\n * @param params.category - Filter by category ID\n * @param params.search - Search by partial name (min 3 characters)\n * @returns Promise resolving to array of Fighter objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const fighters = await client.getFighters({ search: \"mcgregor\" });\n * ```\n */\n async getFighters(\n params?: MmaFightersParams,\n ): Promise<ApiMmaResponse<MmaFighter>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaFighter>(`${MMA_ENDPOINTS.FIGHTERS}${query}`);\n }\n\n // ============================================================================\n // Fights Endpoints\n // ============================================================================\n\n /**\n * Get MMA fights with optional filtering\n *\n * @param params - Optional filter parameters\n * @param params.id - Filter by fight ID\n * @param params.category - Filter by category ID\n * @param params.season - Filter by season year\n * @param params.date - Filter by date (YYYY-MM-DD)\n * @param params.fighter - Filter by fighter ID\n * @returns Promise resolving to array of Fight objects\n * @throws {ApiSportsError} If API returns an error or no data\n *\n * @example\n * ```typescript\n * const fights = await client.getFights({ date: \"2024-01-15\" });\n * ```\n */\n async getFights(params?: MmaFightsParams): Promise<ApiMmaResponse<MmaFight>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<MmaFight>(`${MMA_ENDPOINTS.FIGHTS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiMmaClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiMmaClient instance\n *\n * @example\n * ```typescript\n * const client = createApiMmaClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiMmaClient = (\n networkClient: NetworkClient,\n config: ApiMmaConfig,\n): ApiMmaClient => {\n return new ApiMmaClient(networkClient, config);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api-nfl-client.d.ts","sourceRoot":"","sources":["../../../src/nfl/network/api-nfl-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACZ,MAAM,UAAU,CAAC;AAclB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY;YAsBhD,OAAO;IA8Bf,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAOnD,YAAY,CAChB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAQhC,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAYtE,UAAU,CACd,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAYvC,QAAQ,CACZ,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAQrC,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAcvC,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAQnE,kBAAkB,CACtB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAY7B,YAAY,CAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;CAIxC;AAKD,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,QAAQ,YAAY,KACnB,YAEF,CAAC"}
1
+ {"version":3,"file":"api-nfl-client.d.ts","sourceRoot":"","sources":["../../../src/nfl/network/api-nfl-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,WAAW,EACZ,MAAM,UAAU,CAAC;AAsClB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY;YA2BhD,OAAO;IA+Cf,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAoBnD,YAAY,CAChB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAkBhC,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IA2BtE,UAAU,CACd,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IA2BvC,QAAQ,CACZ,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAoBrC,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IA+BvC,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAoBnE,kBAAkB,CACtB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IA0B7B,YAAY,CAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;CAIxC;AAgBD,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,QAAQ,YAAY,KACnB,YAEF,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 { NFL_API_BASE_URL, NFL_DEFAULT_HEADERS, NFL_ENDPOINTS, NFL_RAPIDAPI_HOST, } from "./nfl-endpoints";
3
4
  export class ApiNflClient {
@@ -24,14 +25,14 @@ export class ApiNflClient {
24
25
  headers: this.headers,
25
26
  });
26
27
  if (response.data === undefined || response.data === null) {
27
- throw new Error("No data received from API-NFL");
28
+ throw new ApiSportsError("No data received from API-NFL", "NFL", 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 Error(`API-NFL error: ${errorMsg}`);
35
+ throw new ApiSportsError(`API-NFL error: ${errorMsg}`, "NFL", classifyApiError(data.errors), { errors: data.errors });
35
36
  }
36
37
  return data;
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-nfl-client.js","sourceRoot":"","sources":["../../../src/nfl/network/api-nfl-client.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAOzB,MAAM,OAAO,YAAY;IAWvB,YAAY,aAA4B,EAAE,MAAoB;QAC5D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC;QAGlD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG;gBACb,GAAG,mBAAmB;gBACtB,iBAAiB,EAAE,MAAM,CAAC,YAAY,IAAI,iBAAiB;gBAC3D,gBAAgB,EAAE,MAAM,CAAC,MAAM;aAChC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG;gBACb,GAAG,mBAAmB;gBACtB,iBAAiB,EAAE,MAAM,CAAC,MAAM;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAKO,KAAK,CAAC,OAAO,CAAI,QAAgB;QACvC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAoB,GAAG,EAAE;YACpE,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAGD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAyB,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;gBACzC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IASD,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAc,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAKD,KAAK,CAAC,YAAY,CAChB,MAA2B;QAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAa,GAAG,aAAa,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IAKD,KAAK,CAAC,UAAU,CAAC,MAAyB;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAS,GAAG,aAAa,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IASD,KAAK,CAAC,UAAU,CACd,MAAyB;QAEzB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAoB,GAAG,aAAa,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IASD,KAAK,CAAC,QAAQ,CACZ,MAAuB;QAEvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAkB,GAAG,aAAa,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAKD,KAAK,CAAC,iBAAiB,CACrB,MAA+B;QAE/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CACjB,GAAG,aAAa,CAAC,gBAAgB,GAAG,KAAK,EAAE,CAC5C,CAAC;IACJ,CAAC;IASD,KAAK,CAAC,QAAQ,CAAC,MAAuB;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,OAAO,CAAU,GAAG,aAAa,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAKD,KAAK,CAAC,kBAAkB,CACtB,MAA2B;QAE3B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAU,GAAG,aAAa,CAAC,kBAAkB,GAAG,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IASD,KAAK,CAAC,YAAY,CAChB,MAA0B;QAE1B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAc,GAAG,aAAa,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;CACF;AAKD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,aAA4B,EAC5B,MAAoB,EACN,EAAE;IAChB,OAAO,IAAI,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC,CAAC","sourcesContent":["/**\n * @module api-nfl-client\n * @description API-American-Football (NFL) Client Library\n *\n * A TypeScript client for the API-American-Football API that provides type-safe\n * access to NFL data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiNflClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiNflClient(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 ApiNflConfig,\n ApiNflResponse,\n NflCountriesParams,\n NflCountry,\n NflGame,\n NflGamesParams,\n NflHeadToHeadParams,\n NflLeagueResponse,\n NflLeaguesParams,\n NflSeasonsParams,\n NflStanding,\n NflStandingsParams,\n NflTeamResponse,\n NflTeamsParams,\n NflTeamStatistics,\n NflTeamStatisticsParams,\n NflTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n NFL_API_BASE_URL,\n NFL_DEFAULT_HEADERS,\n NFL_ENDPOINTS,\n NFL_RAPIDAPI_HOST,\n} from \"./nfl-endpoints\";\n\n/**\n * API-NFL Client class\n *\n * Provides type-safe methods for all API-NFL endpoints.\n */\nexport class ApiNflClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiNflClient 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: ApiNflConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || NFL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...NFL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || NFL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...NFL_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<ApiNflResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiNflResponse<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-NFL\");\n }\n\n // Check for API errors\n const data = response.data as ApiNflResponse<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-NFL 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<ApiNflResponse<NflTimezone>> {\n return this.request<NflTimezone>(NFL_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries\n */\n async getCountries(\n params?: NflCountriesParams,\n ): Promise<ApiNflResponse<NflCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflCountry>(`${NFL_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available seasons\n */\n async getSeasons(params?: NflSeasonsParams): Promise<ApiNflResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${NFL_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get leagues with optional filtering\n */\n async getLeagues(\n params?: NflLeaguesParams,\n ): Promise<ApiNflResponse<NflLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflLeagueResponse>(`${NFL_ENDPOINTS.LEAGUES}${query}`);\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams\n */\n async getTeams(\n params?: NflTeamsParams,\n ): Promise<ApiNflResponse<NflTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflTeamResponse>(`${NFL_ENDPOINTS.TEAMS}${query}`);\n }\n\n /**\n * Get team statistics\n */\n async getTeamStatistics(\n params: NflTeamStatisticsParams,\n ): Promise<ApiNflResponse<NflTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<NflTeamStatistics>(\n `${NFL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get games with optional filtering\n */\n async getGames(params?: NflGamesParams): Promise<ApiNflResponse<NflGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflGame>(`${NFL_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head to head games between two teams\n */\n async getGamesHeadToHead(\n params: NflHeadToHeadParams,\n ): Promise<ApiNflResponse<NflGame>> {\n const query = buildQueryString(params);\n return this.request<NflGame>(`${NFL_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`);\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get standings for a league/season\n */\n async getStandings(\n params: NflStandingsParams,\n ): Promise<ApiNflResponse<NflStanding>> {\n const query = buildQueryString(params);\n return this.request<NflStanding>(`${NFL_ENDPOINTS.STANDINGS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiNflClient instance\n */\nexport const createApiNflClient = (\n networkClient: NetworkClient,\n config: ApiNflConfig,\n): ApiNflClient => {\n return new ApiNflClient(networkClient, config);\n};\n"]}
1
+ {"version":3,"file":"api-nfl-client.js","sourceRoot":"","sources":["../../../src/nfl/network/api-nfl-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-nfl-client\n * @description API-American-Football (NFL) Client Library\n *\n * A TypeScript client for the API-American-Football API that provides type-safe\n * access to NFL data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiNflClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiNflClient(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 ApiNflConfig,\n ApiNflResponse,\n NflCountriesParams,\n NflCountry,\n NflGame,\n NflGamesParams,\n NflHeadToHeadParams,\n NflLeagueResponse,\n NflLeaguesParams,\n NflSeasonsParams,\n NflStanding,\n NflStandingsParams,\n NflTeamResponse,\n NflTeamsParams,\n NflTeamStatistics,\n NflTeamStatisticsParams,\n NflTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n NFL_API_BASE_URL,\n NFL_DEFAULT_HEADERS,\n NFL_ENDPOINTS,\n NFL_RAPIDAPI_HOST,\n} from \"./nfl-endpoints\";\n\n/**\n * API-NFL Client class\n *\n * Provides type-safe methods for all API-American-Football (NFL) endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiNflClient\n *\n * @example\n * ```typescript\n * // Direct API authentication\n * const client = new ApiNflClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * // RapidAPI authentication\n * const rapidClient = new ApiNflClient(networkClient, {\n * apiKey: \"YOUR_RAPIDAPI_KEY\",\n * useRapidApi: true,\n * rapidApiHost: \"api-american-football-v1.p.rapidapi.com\",\n * });\n * ```\n */\nexport class ApiNflClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiNflClient 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: ApiNflConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || NFL_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...NFL_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || NFL_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...NFL_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<ApiNflResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiNflResponse<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-NFL\",\n \"NFL\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiNflResponse<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-NFL error: ${errorMsg}`,\n \"NFL\",\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<ApiNflResponse<NflTimezone>> {\n return this.request<NflTimezone>(NFL_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?: NflCountriesParams,\n ): Promise<ApiNflResponse<NflCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflCountry>(`${NFL_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available NFL 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 * const latestSeason = Math.max(...seasons.response);\n * ```\n */\n async getSeasons(params?: NflSeasonsParams): Promise<ApiNflResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${NFL_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get NFL 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 leagues = await client.getLeagues({ country: \"USA\" });\n * ```\n */\n async getLeagues(\n params?: NflLeaguesParams,\n ): Promise<ApiNflResponse<NflLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflLeagueResponse>(`${NFL_ENDPOINTS.LEAGUES}${query}`);\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get NFL 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?: NflTeamsParams,\n ): Promise<ApiNflResponse<NflTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflTeamResponse>(`${NFL_ENDPOINTS.TEAMS}${query}`);\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: NflTeamStatisticsParams,\n ): Promise<ApiNflResponse<NflTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<NflTeamStatistics>(\n `${NFL_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get NFL 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 * const sundayGames = await client.getGames({ date: \"2024-01-14\" });\n * ```\n */\n async getGames(params?: NflGamesParams): Promise<ApiNflResponse<NflGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<NflGame>(`${NFL_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head-to-head games between two NFL 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: NflHeadToHeadParams,\n ): Promise<ApiNflResponse<NflGame>> {\n const query = buildQueryString(params);\n return this.request<NflGame>(`${NFL_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`);\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get NFL 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/division 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: NflStandingsParams,\n ): Promise<ApiNflResponse<NflStanding>> {\n const query = buildQueryString(params);\n return this.request<NflStanding>(`${NFL_ENDPOINTS.STANDINGS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiNflClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiNflClient instance\n *\n * @example\n * ```typescript\n * const client = createApiNflClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiNflClient = (\n networkClient: NetworkClient,\n config: ApiNflConfig,\n): ApiNflClient => {\n return new ApiNflClient(networkClient, config);\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"api-rugby-client.d.ts","sourceRoot":"","sources":["../../../src/rugby/network/api-rugby-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACd,MAAM,UAAU,CAAC;AAclB,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc;YAsBlD,OAAO;IA8Bf,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAOvD,YAAY,CAChB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAQpC,UAAU,CACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAY9B,UAAU,CACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAc3C,QAAQ,CACZ,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAQzC,iBAAiB,CACrB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IAc3C,QAAQ,CACZ,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAQjC,kBAAkB,CACtB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAcjC,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;CAI5C;AAKD,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,QAAQ,cAAc,KACrB,cAEF,CAAC"}
1
+ {"version":3,"file":"api-rugby-client.d.ts","sourceRoot":"","sources":["../../../src/rugby/network/api-rugby-client.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACd,MAAM,UAAU,CAAC;AAgClB,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAAyB;gBAQ5B,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc;YA2BlD,OAAO;IA0Cf,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAevD,YAAY,CAChB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAYpC,UAAU,CACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IA2B9B,UAAU,CACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IA6B3C,QAAQ,CACZ,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAezC,iBAAiB,CACrB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;IA8B3C,QAAQ,CACZ,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAejC,kBAAkB,CACtB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IA2BjC,YAAY,CAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;CAI5C;AAgBD,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,QAAQ,cAAc,KACrB,cAEF,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 { RUGBY_API_BASE_URL, RUGBY_DEFAULT_HEADERS, RUGBY_ENDPOINTS, RUGBY_RAPIDAPI_HOST, } from "./rugby-endpoints";
3
4
  export class ApiRugbyClient {
@@ -24,14 +25,14 @@ export class ApiRugbyClient {
24
25
  headers: this.headers,
25
26
  });
26
27
  if (response.data === undefined || response.data === null) {
27
- throw new Error("No data received from API-Rugby");
28
+ throw new ApiSportsError("No data received from API-Rugby", "Rugby", 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 Error(`API-Rugby error: ${errorMsg}`);
35
+ throw new ApiSportsError(`API-Rugby error: ${errorMsg}`, "Rugby", classifyApiError(data.errors), { errors: data.errors });
35
36
  }
36
37
  return data;
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-rugby-client.js","sourceRoot":"","sources":["../../../src/rugby/network/api-rugby-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-rugby-client\n * @description API-Rugby Client Library\n *\n * A TypeScript client for the API-Rugby API that provides type-safe\n * access to rugby data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiRugbyClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiRugbyClient(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 ApiRugbyConfig,\n ApiRugbyResponse,\n RugbyCountriesParams,\n RugbyCountry,\n RugbyGame,\n RugbyGamesParams,\n RugbyHeadToHeadParams,\n RugbyLeagueResponse,\n RugbyLeaguesParams,\n RugbySeasonsParams,\n RugbyStanding,\n RugbyStandingsParams,\n RugbyTeamResponse,\n RugbyTeamsParams,\n RugbyTeamStatistics,\n RugbyTeamStatisticsParams,\n RugbyTimezone,\n} from \"../types\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n RUGBY_API_BASE_URL,\n RUGBY_DEFAULT_HEADERS,\n RUGBY_ENDPOINTS,\n RUGBY_RAPIDAPI_HOST,\n} from \"./rugby-endpoints\";\n\n/**\n * API-Rugby Client class\n *\n * Provides type-safe methods for all API-Rugby endpoints.\n */\nexport class ApiRugbyClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiRugbyClient 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: ApiRugbyConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || RUGBY_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...RUGBY_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || RUGBY_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...RUGBY_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<ApiRugbyResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiRugbyResponse<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-Rugby\");\n }\n\n // Check for API errors\n const data = response.data as ApiRugbyResponse<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-Rugby 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<ApiRugbyResponse<RugbyTimezone>> {\n return this.request<RugbyTimezone>(RUGBY_ENDPOINTS.TIMEZONE);\n }\n\n /**\n * Get all available countries\n */\n async getCountries(\n params?: RugbyCountriesParams,\n ): Promise<ApiRugbyResponse<RugbyCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyCountry>(`${RUGBY_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available seasons\n */\n async getSeasons(\n params?: RugbySeasonsParams,\n ): Promise<ApiRugbyResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${RUGBY_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get leagues with optional filtering\n */\n async getLeagues(\n params?: RugbyLeaguesParams,\n ): Promise<ApiRugbyResponse<RugbyLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyLeagueResponse>(\n `${RUGBY_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get teams\n */\n async getTeams(\n params?: RugbyTeamsParams,\n ): Promise<ApiRugbyResponse<RugbyTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyTeamResponse>(`${RUGBY_ENDPOINTS.TEAMS}${query}`);\n }\n\n /**\n * Get team statistics\n */\n async getTeamStatistics(\n params: RugbyTeamStatisticsParams,\n ): Promise<ApiRugbyResponse<RugbyTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<RugbyTeamStatistics>(\n `${RUGBY_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?: RugbyGamesParams,\n ): Promise<ApiRugbyResponse<RugbyGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyGame>(`${RUGBY_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head to head games between two teams\n */\n async getGamesHeadToHead(\n params: RugbyHeadToHeadParams,\n ): Promise<ApiRugbyResponse<RugbyGame>> {\n const query = buildQueryString(params);\n return this.request<RugbyGame>(\n `${RUGBY_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: RugbyStandingsParams,\n ): Promise<ApiRugbyResponse<RugbyStanding>> {\n const query = buildQueryString(params);\n return this.request<RugbyStanding>(`${RUGBY_ENDPOINTS.STANDINGS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiRugbyClient instance\n */\nexport const createApiRugbyClient = (\n networkClient: NetworkClient,\n config: ApiRugbyConfig,\n): ApiRugbyClient => {\n return new ApiRugbyClient(networkClient, config);\n};\n"]}
1
+ {"version":3,"file":"api-rugby-client.js","sourceRoot":"","sources":["../../../src/rugby/network/api-rugby-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @module api-rugby-client\n * @description API-Rugby Client Library\n *\n * A TypeScript client for the API-Rugby API that provides type-safe\n * access to rugby data including leagues, teams, games, standings, and more.\n *\n * @example\n * ```typescript\n * import { ApiRugbyClient } from \"@sudobility/sports_api_client\";\n *\n * const client = new ApiRugbyClient(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 ApiRugbyConfig,\n ApiRugbyResponse,\n RugbyCountriesParams,\n RugbyCountry,\n RugbyGame,\n RugbyGamesParams,\n RugbyHeadToHeadParams,\n RugbyLeagueResponse,\n RugbyLeaguesParams,\n RugbySeasonsParams,\n RugbyStanding,\n RugbyStandingsParams,\n RugbyTeamResponse,\n RugbyTeamsParams,\n RugbyTeamStatistics,\n RugbyTeamStatisticsParams,\n RugbyTimezone,\n} from \"../types\";\nimport {\n ApiSportsError,\n ApiSportsErrorType,\n classifyApiError,\n} from \"../../common/api-sports-error\";\nimport { buildQueryString } from \"../../utils/query-params\";\nimport {\n RUGBY_API_BASE_URL,\n RUGBY_DEFAULT_HEADERS,\n RUGBY_ENDPOINTS,\n RUGBY_RAPIDAPI_HOST,\n} from \"./rugby-endpoints\";\n\n/**\n * API-Rugby Client class\n *\n * Provides type-safe methods for all API-Rugby endpoints.\n * Uses NetworkClient from @sudobility/di for network requests, enabling\n * cross-platform compatibility between React and React Native.\n *\n * @class ApiRugbyClient\n *\n * @example\n * ```typescript\n * const client = new ApiRugbyClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n *\n * const leagues = await client.getLeagues({ country: \"England\" });\n * ```\n */\nexport class ApiRugbyClient {\n private baseUrl: string;\n private networkClient: NetworkClient;\n private headers: Record<string, string>;\n\n /**\n * Create a new ApiRugbyClient 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: ApiRugbyConfig) {\n this.networkClient = networkClient;\n this.baseUrl = config.baseUrl || RUGBY_API_BASE_URL;\n\n // Set up authentication headers\n if (config.useRapidApi && config.rapidApiHost) {\n this.headers = {\n ...RUGBY_DEFAULT_HEADERS,\n \"x-rapidapi-host\": config.rapidApiHost || RUGBY_RAPIDAPI_HOST,\n \"x-rapidapi-key\": config.apiKey,\n };\n } else {\n this.headers = {\n ...RUGBY_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<ApiRugbyResponse<T>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n const response = await this.networkClient.get<ApiRugbyResponse<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-Rugby\",\n \"Rugby\",\n ApiSportsErrorType.NO_DATA,\n );\n }\n\n // Check for API errors\n const data = response.data as ApiRugbyResponse<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-Rugby error: ${errorMsg}`,\n \"Rugby\",\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 async getTimezone(): Promise<ApiRugbyResponse<RugbyTimezone>> {\n return this.request<RugbyTimezone>(RUGBY_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 async getCountries(\n params?: RugbyCountriesParams,\n ): Promise<ApiRugbyResponse<RugbyCountry>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyCountry>(`${RUGBY_ENDPOINTS.COUNTRIES}${query}`);\n }\n\n /**\n * Get all available rugby 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 async getSeasons(\n params?: RugbySeasonsParams,\n ): Promise<ApiRugbyResponse<number>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<number>(`${RUGBY_ENDPOINTS.SEASONS}${query}`);\n }\n\n // ============================================================================\n // Leagues Endpoints\n // ============================================================================\n\n /**\n * Get rugby 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 leagues = await client.getLeagues({ country: \"England\" });\n * ```\n */\n async getLeagues(\n params?: RugbyLeaguesParams,\n ): Promise<ApiRugbyResponse<RugbyLeagueResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyLeagueResponse>(\n `${RUGBY_ENDPOINTS.LEAGUES}${query}`,\n );\n }\n\n // ============================================================================\n // Teams Endpoints\n // ============================================================================\n\n /**\n * Get rugby 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?: RugbyTeamsParams,\n ): Promise<ApiRugbyResponse<RugbyTeamResponse>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyTeamResponse>(`${RUGBY_ENDPOINTS.TEAMS}${query}`);\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 async getTeamStatistics(\n params: RugbyTeamStatisticsParams,\n ): Promise<ApiRugbyResponse<RugbyTeamStatistics>> {\n const query = buildQueryString(params);\n return this.request<RugbyTeamStatistics>(\n `${RUGBY_ENDPOINTS.TEAMS_STATISTICS}${query}`,\n );\n }\n\n // ============================================================================\n // Games Endpoints\n // ============================================================================\n\n /**\n * Get rugby 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?: RugbyGamesParams,\n ): Promise<ApiRugbyResponse<RugbyGame>> {\n const query = params ? buildQueryString(params) : \"\";\n return this.request<RugbyGame>(`${RUGBY_ENDPOINTS.GAMES}${query}`);\n }\n\n /**\n * Get head-to-head games between two rugby 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 async getGamesHeadToHead(\n params: RugbyHeadToHeadParams,\n ): Promise<ApiRugbyResponse<RugbyGame>> {\n const query = buildQueryString(params);\n return this.request<RugbyGame>(\n `${RUGBY_ENDPOINTS.GAMES_HEAD_TO_HEAD}${query}`,\n );\n }\n\n // ============================================================================\n // Standings Endpoints\n // ============================================================================\n\n /**\n * Get rugby 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 * @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: RugbyStandingsParams,\n ): Promise<ApiRugbyResponse<RugbyStanding>> {\n const query = buildQueryString(params);\n return this.request<RugbyStanding>(`${RUGBY_ENDPOINTS.STANDINGS}${query}`);\n }\n}\n\n/**\n * Factory function to create an ApiRugbyClient instance\n *\n * @param networkClient - NetworkClient instance for making HTTP requests\n * @param config - API configuration including API key\n * @returns New ApiRugbyClient instance\n *\n * @example\n * ```typescript\n * const client = createApiRugbyClient(networkClient, {\n * apiKey: \"YOUR_API_KEY\",\n * });\n * ```\n */\nexport const createApiRugbyClient = (\n networkClient: NetworkClient,\n config: ApiRugbyConfig,\n): ApiRugbyClient => {\n return new ApiRugbyClient(networkClient, config);\n};\n"]}
@@ -1,2 +1,3 @@
1
1
  export { createQueryParams, buildQueryString } from "./query-params";
2
+ export { DEFAULT_CACHE_TTL, createCacheEntry, isCacheValid, getRemainingTTL, generateCacheKey, createStorageAdapter, type CachedData, type StorageAdapter, type QueryKeyFactory, } from "./cache-utils";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { createQueryParams, buildQueryString } from "./query-params";
2
+ export { DEFAULT_CACHE_TTL, createCacheEntry, isCacheValid, getRemainingTTL, generateCacheKey, createStorageAdapter, } from "./cache-utils";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC","sourcesContent":["/**\n * @fileoverview Utility module exports.\n *\n * Provides shared utility functions for building URL query parameters.\n * Note: Cache utilities (generateCacheKey, isCacheValid, createCacheEntry, etc.)\n * are located in cache-utils.ts but are re-exported through individual sport\n * store barrel exports (e.g., football/store/index.ts), not from here.\n */\n\nexport { createQueryParams, buildQueryString } from \"./query-params\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GAIrB,MAAM,eAAe,CAAC","sourcesContent":["/**\n * @fileoverview Utility module exports.\n *\n * Provides shared utility functions for building URL query parameters\n * and cache management utilities for timestamp-based cache invalidation.\n */\n\nexport { createQueryParams, buildQueryString } from \"./query-params\";\nexport {\n DEFAULT_CACHE_TTL,\n createCacheEntry,\n isCacheValid,\n getRemainingTTL,\n generateCacheKey,\n createStorageAdapter,\n type CachedData,\n type StorageAdapter,\n type QueryKeyFactory,\n} from \"./cache-utils\";\n"]}