fansunited-data-layer 0.12.1 → 0.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/fansunited/constants.js +5 -0
- package/api/fansunited/constants.js.map +1 -0
- package/api/fansunited/football/competition/index.js +21 -0
- package/api/fansunited/football/competition/index.js.map +1 -0
- package/api/fansunited/football/competition/transformer.js +41 -0
- package/api/fansunited/football/competition/transformer.js.map +1 -0
- package/api/fansunited/football/competitions/index.js +56 -0
- package/api/fansunited/football/competitions/index.js.map +1 -0
- package/api/fansunited/football/competitions/transformer.js +68 -0
- package/api/fansunited/football/competitions/transformer.js.map +1 -0
- package/api/fansunited/football/http.js +7 -0
- package/api/fansunited/football/http.js.map +1 -0
- package/api/fansunited/football/matches/index.js +132 -0
- package/api/fansunited/football/matches/index.js.map +1 -0
- package/api/fansunited/football/matches/transformer.js +148 -0
- package/api/fansunited/football/matches/transformer.js.map +1 -0
- package/api/fansunited/football/players/index.js +60 -0
- package/api/fansunited/football/players/index.js.map +1 -0
- package/api/fansunited/football/players/transformer.js +85 -0
- package/api/fansunited/football/players/transformer.js.map +1 -0
- package/api/fansunited/football/search/index.js +64 -0
- package/api/fansunited/football/search/index.js.map +1 -0
- package/api/fansunited/football/search/transformer.js +114 -0
- package/api/fansunited/football/search/transformer.js.map +1 -0
- package/api/fansunited/football/teams/index.js +66 -0
- package/api/fansunited/football/teams/index.js.map +1 -0
- package/api/fansunited/football/teams/transformer.js +53 -0
- package/api/fansunited/football/teams/transformer.js.map +1 -0
- package/api/fansunited/http.js +74 -0
- package/api/fansunited/http.js.map +1 -0
- package/api/fansunited/search/constants.js +5 -0
- package/api/fansunited/search/constants.js.map +1 -0
- package/api/fansunited/search/http.js +7 -0
- package/api/fansunited/search/http.js.map +1 -0
- package/api/fansunited/search/index.js +308 -0
- package/api/fansunited/search/index.js.map +1 -0
- package/api/fansunited/search/transformer.js +374 -0
- package/api/fansunited/search/transformer.js.map +1 -0
- package/api/fansunited-sdk/loyalty/matches.js +21 -0
- package/api/fansunited-sdk/loyalty/matches.js.map +1 -0
- package/api/fansunited-sdk/loyalty/template.js +52 -0
- package/api/fansunited-sdk/loyalty/template.js.map +1 -0
- package/api/fansunited-sdk/odds/matches.js +109 -0
- package/api/fansunited-sdk/odds/matches.js.map +1 -0
- package/api/sportal365-sports/basketball/games/index.js +32 -0
- package/api/sportal365-sports/basketball/games/index.js.map +1 -0
- package/api/sportal365-sports/basketball/games/transformers/game.js +137 -0
- package/api/sportal365-sports/basketball/games/transformers/game.js.map +1 -0
- package/api/sportal365-sports/basketball/http.js +7 -0
- package/api/sportal365-sports/basketball/http.js.map +1 -0
- package/api/sportal365-sports/constants.js +15 -0
- package/api/sportal365-sports/constants.js.map +1 -0
- package/api/sportal365-sports/football/competitions/index.js +52 -0
- package/api/sportal365-sports/football/competitions/index.js.map +1 -0
- package/api/sportal365-sports/football/competitions/utils.js +92 -0
- package/api/sportal365-sports/football/competitions/utils.js.map +1 -0
- package/api/sportal365-sports/football/http.js +7 -0
- package/api/sportal365-sports/football/http.js.map +1 -0
- package/api/sportal365-sports/football/index.d.ts +2 -2
- package/api/sportal365-sports/football/index.d.ts.map +1 -1
- package/api/sportal365-sports/football/matches/index.js +206 -0
- package/api/sportal365-sports/football/matches/index.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/commentary.js +27 -0
- package/api/sportal365-sports/football/matches/transformers/commentary.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/lineup.js +74 -0
- package/api/sportal365-sports/football/matches/transformers/lineup.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/match-event.js +60 -0
- package/api/sportal365-sports/football/matches/transformers/match-event.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/match.js +195 -0
- package/api/sportal365-sports/football/matches/transformers/match.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/odds.js +11 -0
- package/api/sportal365-sports/football/matches/transformers/odds.js.map +1 -0
- package/api/sportal365-sports/football/matches/transformers/statistics.js +41 -0
- package/api/sportal365-sports/football/matches/transformers/statistics.js.map +1 -0
- package/api/sportal365-sports/football/search/index.js +42 -0
- package/api/sportal365-sports/football/search/index.js.map +1 -0
- package/api/sportal365-sports/football/search/search.transformer.js +166 -0
- package/api/sportal365-sports/football/search/search.transformer.js.map +1 -0
- package/api/sportal365-sports/football/standings/index.js +28 -0
- package/api/sportal365-sports/football/standings/index.js.map +1 -0
- package/api/sportal365-sports/football/standings/standing.transformer.js +107 -0
- package/api/sportal365-sports/football/standings/standing.transformer.js.map +1 -0
- package/api/sportal365-sports/football/statistics/index.d.ts +46 -1
- package/api/sportal365-sports/football/statistics/index.d.ts.map +1 -1
- package/api/sportal365-sports/football/statistics/index.js +154 -0
- package/api/sportal365-sports/football/statistics/index.js.map +1 -0
- package/api/sportal365-sports/football/statistics/player-career.transformer.d.ts +11 -0
- package/api/sportal365-sports/football/statistics/player-career.transformer.d.ts.map +1 -0
- package/api/sportal365-sports/football/statistics/player-career.transformer.js +77 -0
- package/api/sportal365-sports/football/statistics/player-career.transformer.js.map +1 -0
- package/api/sportal365-sports/football/statistics/player-career.types.d.ts +115 -0
- package/api/sportal365-sports/football/statistics/player-career.types.d.ts.map +1 -0
- package/api/sportal365-sports/football/statistics/player-recent.transformer.d.ts +11 -0
- package/api/sportal365-sports/football/statistics/player-recent.transformer.d.ts.map +1 -0
- package/api/sportal365-sports/football/statistics/player-recent.transformer.js +54 -0
- package/api/sportal365-sports/football/statistics/player-recent.transformer.js.map +1 -0
- package/api/sportal365-sports/football/statistics/player-recent.types.d.ts +31 -0
- package/api/sportal365-sports/football/statistics/player-recent.types.d.ts.map +1 -0
- package/api/sportal365-sports/football/statistics/player-season.transformer.js +147 -0
- package/api/sportal365-sports/football/statistics/player-season.transformer.js.map +1 -0
- package/api/sportal365-sports/football/teams/index.js +73 -0
- package/api/sportal365-sports/football/teams/index.js.map +1 -0
- package/api/sportal365-sports/football/teams/utils.js +196 -0
- package/api/sportal365-sports/football/teams/utils.js.map +1 -0
- package/api/sportal365-sports/http.js +58 -0
- package/api/sportal365-sports/http.js.map +1 -0
- package/api/sportal365-sports/index.d.ts +2 -2
- package/api/sportal365-sports/index.d.ts.map +1 -1
- package/api/sportal365-sports/search/http.js +7 -0
- package/api/sportal365-sports/search/http.js.map +1 -0
- package/api/sportal365-sports/search/index.js +61 -0
- package/api/sportal365-sports/search/index.js.map +1 -0
- package/api/sportal365-sports/search/search.transformer.js +254 -0
- package/api/sportal365-sports/search/search.transformer.js.map +1 -0
- package/api/sportal365-sports/shared/odds.transformer.js +65 -0
- package/api/sportal365-sports/shared/odds.transformer.js.map +1 -0
- package/api/sportal365-sports/shared/providerRef.helper.js +31 -0
- package/api/sportal365-sports/shared/providerRef.helper.js.map +1 -0
- package/api/sportal365-sports/standings/http.js +7 -0
- package/api/sportal365-sports/standings/http.js.map +1 -0
- package/api/sportal365-sports/standings/index.js +29 -0
- package/api/sportal365-sports/standings/index.js.map +1 -0
- package/api/sportal365-sports/standings/standing.transformer.js +185 -0
- package/api/sportal365-sports/standings/standing.transformer.js.map +1 -0
- package/api/sportal365-sports/statistics/http.js +7 -0
- package/api/sportal365-sports/statistics/http.js.map +1 -0
- package/api/sportal365-sports/statistics/index.js +25 -0
- package/api/sportal365-sports/statistics/index.js.map +1 -0
- package/api/sportal365-sports/statistics/team-stats.transformer.js +16 -0
- package/api/sportal365-sports/statistics/team-stats.transformer.js.map +1 -0
- package/api/sportal365-sports/tennis/http.js +7 -0
- package/api/sportal365-sports/tennis/http.js.map +1 -0
- package/api/sportal365-sports/tennis/matches/index.js +34 -0
- package/api/sportal365-sports/tennis/matches/index.js.map +1 -0
- package/api/sportal365-sports/tennis/matches/transformers/match.js +193 -0
- package/api/sportal365-sports/tennis/matches/transformers/match.js.map +1 -0
- package/cache/cache-manager.js +136 -0
- package/cache/cache-manager.js.map +1 -0
- package/cache/memory-store.js +29 -0
- package/cache/memory-store.js.map +1 -0
- package/client.js +38 -12337
- package/client.js.map +1 -0
- package/config/index.js +20 -0
- package/config/index.js.map +1 -0
- package/fansunited-data-layer.js +146 -3551
- package/fansunited-data-layer.js.map +1 -0
- package/helpers/competition.helpers.js +11 -0
- package/helpers/competition.helpers.js.map +1 -0
- package/helpers/player.helpers.js +165 -0
- package/helpers/player.helpers.js.map +1 -0
- package/helpers/player.hooks.js +34 -0
- package/helpers/player.hooks.js.map +1 -0
- package/helpers/team.helpers.js +216 -0
- package/helpers/team.helpers.js.map +1 -0
- package/index.d.ts +3 -3
- package/index.d.ts.map +1 -1
- package/package.json +6 -8
- package/providers/competition/hooks/useCompetitionStats.js +10 -0
- package/providers/competition/hooks/useCompetitionStats.js.map +1 -0
- package/providers/competition/hooks/useGoalDistribution.js +23 -0
- package/providers/competition/hooks/useGoalDistribution.js.map +1 -0
- package/providers/competition/hooks/useMatchHelpers.js +85 -0
- package/providers/competition/hooks/useMatchHelpers.js.map +1 -0
- package/providers/competition/hooks/useStandingsCalculations.js +89 -0
- package/providers/competition/hooks/useStandingsCalculations.js.map +1 -0
- package/providers/competition/hooks/useStandingsHelpers.js +61 -0
- package/providers/competition/hooks/useStandingsHelpers.js.map +1 -0
- package/providers/competition/hooks/useTeamPosition.js +15 -0
- package/providers/competition/hooks/useTeamPosition.js.map +1 -0
- package/providers/competition/hooks/useTeamResultsTable.js +86 -0
- package/providers/competition/hooks/useTeamResultsTable.js.map +1 -0
- package/providers/competition/utils/competitionStats.js +109 -0
- package/providers/competition/utils/competitionStats.js.map +1 -0
- package/providers/competition/utils/goalDistribution.js +64 -0
- package/providers/competition/utils/goalDistribution.js.map +1 -0
- package/providers/competition/utils/standingsCalculations.js +152 -0
- package/providers/competition/utils/standingsCalculations.js.map +1 -0
- package/providers/competition.context.js +14 -0
- package/providers/competition.context.js.map +1 -0
- package/providers/competition.provider.js +187 -0
- package/providers/competition.provider.js.map +1 -0
- package/providers/fansunited-config.context.js +6 -0
- package/providers/fansunited-config.context.js.map +1 -0
- package/providers/fansunited-config.hooks.js +20 -0
- package/providers/fansunited-config.hooks.js.map +1 -0
- package/providers/fansunited-config.provider.js +9 -0
- package/providers/fansunited-config.provider.js.map +1 -0
- package/providers/fansunited-sdk.hook.js +50 -0
- package/providers/fansunited-sdk.hook.js.map +1 -0
- package/providers/leaderboard/hooks/useMatchHelpers.js +30 -0
- package/providers/leaderboard/hooks/useMatchHelpers.js.map +1 -0
- package/providers/leaderboard/hooks/useTemplateHelpers.js +39 -0
- package/providers/leaderboard/hooks/useTemplateHelpers.js.map +1 -0
- package/providers/leaderboard.context.js +14 -0
- package/providers/leaderboard.context.js.map +1 -0
- package/providers/leaderboard.provider.js +98 -0
- package/providers/leaderboard.provider.js.map +1 -0
- package/providers/match/hooks/useBatchMatchOdds.js +72 -0
- package/providers/match/hooks/useBatchMatchOdds.js.map +1 -0
- package/providers/match/hooks/useEventHelpers.js +46 -0
- package/providers/match/hooks/useEventHelpers.js.map +1 -0
- package/providers/match/hooks/useHeadToHeadHelpers.js +52 -0
- package/providers/match/hooks/useHeadToHeadHelpers.js.map +1 -0
- package/providers/match/hooks/useLineupHelpers.js +53 -0
- package/providers/match/hooks/useLineupHelpers.js.map +1 -0
- package/providers/match/hooks/useMatchStandingsCalculations.js +332 -0
- package/providers/match/hooks/useMatchStandingsCalculations.js.map +1 -0
- package/providers/match/hooks/useMatchStatus.js +37 -0
- package/providers/match/hooks/useMatchStatus.js.map +1 -0
- package/providers/match/hooks/useOddsHelpers.js +54 -0
- package/providers/match/hooks/useOddsHelpers.js.map +1 -0
- package/providers/match/hooks/useScoreHelpers.js +34 -0
- package/providers/match/hooks/useScoreHelpers.js.map +1 -0
- package/providers/match/hooks/useStandingsHelpers.js +53 -0
- package/providers/match/hooks/useStandingsHelpers.js.map +1 -0
- package/providers/match/hooks/useStatisticsHelpers.js +40 -0
- package/providers/match/hooks/useStatisticsHelpers.js.map +1 -0
- package/providers/match/hooks/useTeamHelpers.js +38 -0
- package/providers/match/hooks/useTeamHelpers.js.map +1 -0
- package/providers/match/hooks/useTeamStatsHelpers.js +141 -0
- package/providers/match/hooks/useTeamStatsHelpers.js.map +1 -0
- package/providers/match.context.js +14 -0
- package/providers/match.context.js.map +1 -0
- package/providers/match.provider.js +176 -0
- package/providers/match.provider.js.map +1 -0
- package/providers/team/hooks/useFormStats.js +116 -0
- package/providers/team/hooks/useFormStats.js.map +1 -0
- package/providers/team/hooks/useMatchHelpers.js +46 -0
- package/providers/team/hooks/useMatchHelpers.js.map +1 -0
- package/providers/team/hooks/useSquadHelpers.js +67 -0
- package/providers/team/hooks/useSquadHelpers.js.map +1 -0
- package/providers/team.context.js +14 -0
- package/providers/team.context.js.map +1 -0
- package/providers/team.provider.js +98 -0
- package/providers/team.provider.js.map +1 -0
- package/types/canonical/index.d.ts +1 -1
- package/types/canonical/index.d.ts.map +1 -1
- package/types/canonical/statistics.types.d.ts +102 -0
- package/types/canonical/statistics.types.d.ts.map +1 -1
- package/utilities/stats/core/helpers.js +105 -0
- package/utilities/stats/core/helpers.js.map +1 -0
- package/utilities/stats/core/types.js +5 -0
- package/utilities/stats/core/types.js.map +1 -0
- package/utilities/stats/match/headToHead.js +83 -0
- package/utilities/stats/match/headToHead.js.map +1 -0
- package/utilities/stats/match/homeVsAway.js +140 -0
- package/utilities/stats/match/homeVsAway.js.map +1 -0
- package/utilities/stats/match/overUnder.js +91 -0
- package/utilities/stats/match/overUnder.js.map +1 -0
- package/utilities/stats/match/result.js +21 -0
- package/utilities/stats/match/result.js.map +1 -0
- package/utilities/stats/team/commonOpponents.js +77 -0
- package/utilities/stats/team/commonOpponents.js.map +1 -0
- package/utilities/stats/team/goalStats.js +50 -0
- package/utilities/stats/team/goalStats.js.map +1 -0
- package/utilities/stats/team/streaks.js +183 -0
- package/utilities/stats/team/streaks.js.map +1 -0
- package/client.cjs +0 -8
- package/fansunited-data-layer.cjs +0 -1
- package/matches-CB-dSXEA.js +0 -1633
- package/matches-DvC2VSyO.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.js","sources":["../../../../../../src/lib/api/sportal365-sports/football/matches/transformers/match.ts"],"sourcesContent":["/**\n * Match transformation utilities\n * Transforms raw API match responses to canonical FUSports types\n */\n\nimport type {\n FUSportsMatch,\n FUSportsMatchStatus,\n FUSportsMatchTiming,\n FUSportsTeamCompetitor,\n FUSportsCompetition,\n FUSportsVenue,\n FUSportsOfficial,\n FUSportsMatchScore,\n FUSportsMatchWinner,\n FUSportsMatchEvent,\n} from \"../../../../../types/canonical\";\nimport type { RawMatch, RawMatchReferee } from \"../types\";\nimport type { RawScore, RawTeamScore } from \"../../../shared/types\";\nimport { transformEvent } from \"./match-event\";\nimport { toProviderRefArray } from \"../../../shared\";\n\n/**\n * Transform raw match status to canonical format\n */\nfunction transformStatus(raw: RawMatch[\"status\"]): FUSportsMatchStatus {\n // Map raw API status codes to canonical codes\n const codeMap: Record<string, FUSportsMatchStatus[\"code\"]> = {\n finished_ap: \"finished_after_penalties\", // finished after penalties\n finished_aet: \"finished_after_extra_time\", // finished after extra time\n finished: \"finished\",\n not_started: \"not_started\",\n live: \"live\",\n interrupted: \"interrupted\",\n cancelled: \"cancelled\",\n postponed: \"postponed\",\n abandoned: \"abandoned\",\n };\n\n // Use the raw.code if available and mapped, otherwise derive from raw.type\n let code: FUSportsMatchStatus[\"code\"];\n if (raw.code && codeMap[raw.code]) {\n code = codeMap[raw.code];\n } else {\n // Fallback to type-based mapping\n const typeMap: Record<string, FUSportsMatchStatus[\"code\"]> = {\n FINISHED: \"finished\",\n NOT_STARTED: \"not_started\",\n LIVE: \"live\",\n INTERRUPTED: \"interrupted\",\n CANCELLED: \"cancelled\",\n POSTPONED: \"postponed\",\n UNKNOWN: \"not_started\",\n ABANDONED: \"abandoned\",\n };\n code = typeMap[raw.type] ?? \"not_started\";\n }\n\n return {\n code,\n name: raw.name,\n shortName: raw.short_name,\n type: raw.type as FUSportsMatchStatus[\"type\"],\n };\n}\n\n/**\n * Transform raw team to canonical competitor\n */\nfunction transformTeam(raw: RawMatch[\"home_team\"]): FUSportsTeamCompetitor {\n return {\n id: raw.id,\n name: raw.name,\n shortName: raw.short_name ?? undefined,\n threeLetterCode: raw.three_letter_code,\n slug: raw.slug,\n type: (raw.type === \"national\" ? \"national\" : \"club\") as \"club\" | \"national\",\n gender: raw.gender as FUSportsTeamCompetitor[\"gender\"],\n assets: raw.assets\n ? {\n logo: raw.assets.logo?.url,\n homeKit: raw.assets.home_kit?.url,\n awayKit: raw.assets.away_kit?.url,\n squadImage: raw.assets.squad_image?.url,\n }\n : undefined,\n metadata: raw.shirt_color\n ? {\n shirtColors: [\n {\n type: \"home\" as const,\n colorCode: raw.shirt_color,\n },\n ],\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw timing fields to canonical timing\n */\nfunction transformTiming(raw: RawMatch): FUSportsMatchTiming {\n return {\n kickoffTime: new Date(raw.kickoff_time),\n currentMinute: raw.minute?.regular_time,\n phaseStartedAt: raw.phase_started_at ? new Date(raw.phase_started_at) : undefined,\n finishedAt: raw.finished_at ? new Date(raw.finished_at) : undefined,\n firstHalfStartedAt: raw.first_half_started_at ? new Date(raw.first_half_started_at) : undefined,\n secondHalfStartedAt: raw.second_half_started_at ? new Date(raw.second_half_started_at) : undefined,\n extraTimeFirstHalfStartedAt: raw.extra_time_first_half_started_at\n ? new Date(raw.extra_time_first_half_started_at)\n : undefined,\n extraTimeSecondHalfStartedAt: raw.extra_time_second_half_started_at\n ? new Date(raw.extra_time_second_half_started_at)\n : undefined,\n };\n}\n\n/**\n * Transform raw score to canonical format\n */\nfunction transformScore(rawScore: RawScore | undefined): FUSportsMatchScore | undefined {\n if (!rawScore) return undefined;\n const toScorePair = (s?: RawTeamScore) =>\n s ? { competitorOne: String(s.home), competitorTwo: String(s.away) } : undefined;\n\n // Use after_extra_time (FT + ET) if available, otherwise fall back to regular_time\n // This ensures the main score doesn't include penalty shootout results\n const mainScore = rawScore.after_extra_time ?? rawScore.regular_time;\n\n return {\n competitorOne: mainScore?.home != null ? String(mainScore.home) : null,\n competitorTwo: mainScore?.away != null ? String(mainScore.away) : null,\n breakdown: {\n total: toScorePair(rawScore.total),\n halfTime: toScorePair(rawScore.half_time),\n regularTime: toScorePair(rawScore.regular_time),\n extraTime: toScorePair(rawScore.extra_time),\n penaltyShootout: toScorePair(rawScore.penalty_shootout),\n aggregate: toScorePair(rawScore.aggregate),\n },\n };\n}\n\n/**\n * Transform raw venue to canonical format\n */\nfunction transformVenue(raw: RawMatch[\"venue\"]): FUSportsVenue | undefined {\n if (!raw) return undefined;\n\n return {\n id: raw.id,\n name: raw.name,\n slug: raw.slug,\n assets: raw.assets?.image?.url ? { image: raw.assets.image.url } : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw referees to canonical officials\n */\nfunction transformOfficials(referees?: RawMatchReferee[]): FUSportsOfficial[] | undefined {\n if (!referees?.length) return undefined;\n\n return referees.map((ref) => ({\n id: ref.id,\n name: ref.name,\n slug: ref.slug,\n role: (ref.role as FUSportsOfficial[\"role\"]) ?? \"REFEREE\",\n gender: ref.gender,\n }));\n}\n\n/**\n * Transform raw competition to canonical format\n */\nfunction transformCompetition(raw: RawMatch): FUSportsCompetition | undefined {\n if (!raw.season?.tournament) return undefined;\n\n const { tournament, ...season } = raw.season;\n\n return {\n id: tournament.id,\n name: tournament.name,\n slug: tournament.slug,\n type: tournament.type as FUSportsCompetition[\"type\"],\n region: tournament.region as FUSportsCompetition[\"region\"],\n country: tournament.country\n ? {\n id: tournament.country.id,\n name: tournament.country.name,\n code: tournament.country.code ?? undefined,\n flag: tournament.country.assets?.flag?.url,\n providerRef: toProviderRefArray(tournament.country.uuid),\n }\n : undefined,\n season: {\n id: season.id,\n name: season.name,\n status: season.status as \"ACTIVE\" | \"INACTIVE\" | \"UPCOMING\",\n },\n stage: raw.stage\n ? {\n id: raw.stage.id,\n name: raw.stage.name,\n type: raw.stage.type,\n }\n : undefined,\n assets: tournament.assets?.logo?.url ? { logo: tournament.assets.logo.url } : undefined,\n providerRef: toProviderRefArray(tournament.uuid),\n };\n}\n\n/**\n * Transform raw winner to canonical format\n */\nfunction transformWinner(raw: RawMatch): FUSportsMatchWinner | undefined {\n if (!raw.winner?.match?.id) return undefined;\n\n const reasonMap: Record<string, FUSportsMatchWinner[\"reason\"]> = {\n \"Regular Time\": \"REGULAR_TIME\",\n \"Extra Time\": \"EXTRA_TIME\",\n Penalties: \"PENALTIES\",\n };\n\n return {\n competitorId: raw.winner.match.id,\n reason: raw.winner.match.reason?.name ? reasonMap[raw.winner.match.reason.name] : undefined,\n aggregate: !!raw.winner.aggregate,\n };\n}\n\n/**\n * Transform raw match response to canonical FUSportsMatch\n */\nexport function transformMatch(raw: RawMatch): FUSportsMatch {\n return {\n id: raw.id,\n slug: raw.slug,\n sport: \"football\",\n status: transformStatus(raw.status),\n timing: transformTiming(raw),\n\n competitorOne: transformTeam(raw.home_team),\n competitorTwo: transformTeam(raw.away_team),\n\n competition: transformCompetition(raw),\n round: raw.round\n ? {\n id: raw.round.id ?? raw.round.key,\n key: raw.round.key,\n name: raw.round.name,\n type: raw.round.type ?? \"REGULAR\",\n providerRef: toProviderRefArray(raw.round.uuid),\n }\n : undefined,\n group: raw.group\n ? {\n id: raw.group.id,\n name: raw.group.name,\n providerRef: toProviderRefArray(raw.group.uuid),\n }\n : undefined,\n\n venue: transformVenue(raw.venue),\n officials: transformOfficials(raw.referees),\n spectators: raw.spectators ?? undefined,\n\n score: transformScore(raw.score),\n\n mainEvents: raw.main_events?.map(transformEvent).filter((e): e is FUSportsMatchEvent => e !== null),\n penaltyShootoutEvents: raw.penalty_shootout_events\n ?.map(transformEvent)\n .filter((e): e is FUSportsMatchEvent => e !== null),\n\n winner: transformWinner(raw),\n\n coverage: raw.coverage === \"NOT_LIVE\" ? \"UNKNOWN\" : raw.coverage,\n lineupStatus:\n raw.lineup_status === \"UNCONFIRMED\" ? \"EXPECTED\" : (raw.lineup_status as FUSportsMatch[\"lineupStatus\"]),\n\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"odds.js","sources":["../../../../../../src/lib/api/sportal365-sports/football/matches/transformers/odds.ts"],"sourcesContent":["/**\n * Odds transformation utilities\n * Transforms raw API odds responses to canonical FUSports types\n */\n\nimport type { FUSportsMatchOdds } from \"../../../../../types/canonical\";\nimport type { RawMatchOdd } from \"../types\";\nimport { transformOdds } from \"../../../shared\";\n\n/**\n * Transform raw match odds array to canonical format\n */\nexport function transformMatchOdds(matchId: string, raw: RawMatchOdd[]): FUSportsMatchOdds {\n return {\n matchId,\n operators: transformOdds(raw),\n };\n}\n"],"names":[],"mappings":";AAYO,SAAS,mBAAmB,SAAiB,KAAuC;AACvF,SAAO;AAAA,IACH;AAAA,IACA,WAAW,cAAc,GAAG;AAAA,EAAA;AAEpC;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
function createStatEntry(key, value, label, unit) {
|
|
2
|
+
if (value === void 0 || value === null) return null;
|
|
3
|
+
return { key, value: String(value), label, unit };
|
|
4
|
+
}
|
|
5
|
+
function transformStatisticsData(competitorId, stats) {
|
|
6
|
+
const shotsTotal = (stats.shots_on ?? 0) + (stats.shots_off ?? 0) + (stats.shots_blocked ?? 0);
|
|
7
|
+
const entries = [
|
|
8
|
+
createStatEntry("possession", stats.possession, "Possession", "%"),
|
|
9
|
+
createStatEntry("shots_total", shotsTotal, "Shots"),
|
|
10
|
+
createStatEntry("shots_on_target", stats.shots_on, "Shots on Target"),
|
|
11
|
+
createStatEntry("shots_off_target", stats.shots_off, "Shots off Target"),
|
|
12
|
+
createStatEntry("shots_blocked", stats.shots_blocked, "Shots Blocked"),
|
|
13
|
+
createStatEntry("corners", stats.corners, "Corner Kicks"),
|
|
14
|
+
createStatEntry("goal_kicks", stats.goal_kicks, "Goal Kicks"),
|
|
15
|
+
createStatEntry("throw_ins", stats.throw_in, "Throw Ins"),
|
|
16
|
+
createStatEntry("offsides", stats.offside, "Offsides"),
|
|
17
|
+
createStatEntry("fouls", stats.fouls_committed, "Fouls"),
|
|
18
|
+
createStatEntry("yellow_cards", stats.yellow_cards, "Yellow Cards"),
|
|
19
|
+
createStatEntry("passes", stats.pass, "Passes"),
|
|
20
|
+
createStatEntry("crosses", stats.crosses, "Crosses")
|
|
21
|
+
];
|
|
22
|
+
return {
|
|
23
|
+
competitorId,
|
|
24
|
+
statistics: entries.filter((e) => e !== null)
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function transformStatistics(raw) {
|
|
28
|
+
const competitorOneEntry = raw.find((entry) => entry.home_team);
|
|
29
|
+
const competitorTwoEntry = raw.find((entry) => !entry.home_team);
|
|
30
|
+
if (!competitorOneEntry || !competitorTwoEntry) {
|
|
31
|
+
throw new Error("Missing competitor statistics");
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
competitorOne: transformStatisticsData(String(competitorOneEntry.team.id), competitorOneEntry.statistics),
|
|
35
|
+
competitorTwo: transformStatisticsData(String(competitorTwoEntry.team.id), competitorTwoEntry.statistics)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
transformStatistics
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=statistics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statistics.js","sources":["../../../../../../src/lib/api/sportal365-sports/football/matches/transformers/statistics.ts"],"sourcesContent":["/**\n * Statistics transformation utilities\n * Transforms raw API statistics responses to canonical FUSports types\n */\n\nimport type {\n FUSportsMatchStatistics,\n FUSportsCompetitorStatistics,\n FUSportsStatisticEntry,\n} from \"../../../../../types/canonical\";\nimport type { RawMatchStatisticsResponse, RawStatisticsData } from \"../types\";\n\n/**\n * Helper to create a statistic entry if value exists\n */\nfunction createStatEntry(\n key: string,\n value: number | undefined,\n label: string,\n unit?: string\n): FUSportsStatisticEntry | null {\n if (value === undefined || value === null) return null;\n return { key, value: String(value), label, unit };\n}\n\n/**\n * Transform raw statistics data to canonical format\n */\nfunction transformStatisticsData(competitorId: string, stats: RawStatisticsData): FUSportsCompetitorStatistics {\n const shotsTotal = (stats.shots_on ?? 0) + (stats.shots_off ?? 0) + (stats.shots_blocked ?? 0);\n\n const entries: (FUSportsStatisticEntry | null)[] = [\n createStatEntry(\"possession\", stats.possession, \"Possession\", \"%\"),\n createStatEntry(\"shots_total\", shotsTotal, \"Shots\"),\n createStatEntry(\"shots_on_target\", stats.shots_on, \"Shots on Target\"),\n createStatEntry(\"shots_off_target\", stats.shots_off, \"Shots off Target\"),\n createStatEntry(\"shots_blocked\", stats.shots_blocked, \"Shots Blocked\"),\n createStatEntry(\"corners\", stats.corners, \"Corner Kicks\"),\n createStatEntry(\"goal_kicks\", stats.goal_kicks, \"Goal Kicks\"),\n createStatEntry(\"throw_ins\", stats.throw_in, \"Throw Ins\"),\n createStatEntry(\"offsides\", stats.offside, \"Offsides\"),\n createStatEntry(\"fouls\", stats.fouls_committed, \"Fouls\"),\n createStatEntry(\"yellow_cards\", stats.yellow_cards, \"Yellow Cards\"),\n createStatEntry(\"passes\", stats.pass, \"Passes\"),\n createStatEntry(\"crosses\", stats.crosses, \"Crosses\"),\n ];\n\n return {\n competitorId,\n statistics: entries.filter((e): e is FUSportsStatisticEntry => e !== null),\n };\n}\n\n/**\n * Transform raw match statistics response to canonical format\n */\nexport function transformStatistics(raw: RawMatchStatisticsResponse): FUSportsMatchStatistics {\n const competitorOneEntry = raw.find((entry) => entry.home_team);\n const competitorTwoEntry = raw.find((entry) => !entry.home_team);\n\n if (!competitorOneEntry || !competitorTwoEntry) {\n throw new Error(\"Missing competitor statistics\");\n }\n\n return {\n competitorOne: transformStatisticsData(String(competitorOneEntry.team.id), competitorOneEntry.statistics),\n competitorTwo: transformStatisticsData(String(competitorTwoEntry.team.id), competitorTwoEntry.statistics),\n };\n}\n\n"],"names":[],"mappings":"AAeA,SAAS,gBACL,KACA,OACA,OACA,MAC6B;AAC7B,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,SAAO,EAAE,KAAK,OAAO,OAAO,KAAK,GAAG,OAAO,KAAA;AAC/C;AAKA,SAAS,wBAAwB,cAAsB,OAAwD;AAC3G,QAAM,cAAc,MAAM,YAAY,MAAM,MAAM,aAAa,MAAM,MAAM,iBAAiB;AAE5F,QAAM,UAA6C;AAAA,IAC/C,gBAAgB,cAAc,MAAM,YAAY,cAAc,GAAG;AAAA,IACjE,gBAAgB,eAAe,YAAY,OAAO;AAAA,IAClD,gBAAgB,mBAAmB,MAAM,UAAU,iBAAiB;AAAA,IACpE,gBAAgB,oBAAoB,MAAM,WAAW,kBAAkB;AAAA,IACvE,gBAAgB,iBAAiB,MAAM,eAAe,eAAe;AAAA,IACrE,gBAAgB,WAAW,MAAM,SAAS,cAAc;AAAA,IACxD,gBAAgB,cAAc,MAAM,YAAY,YAAY;AAAA,IAC5D,gBAAgB,aAAa,MAAM,UAAU,WAAW;AAAA,IACxD,gBAAgB,YAAY,MAAM,SAAS,UAAU;AAAA,IACrD,gBAAgB,SAAS,MAAM,iBAAiB,OAAO;AAAA,IACvD,gBAAgB,gBAAgB,MAAM,cAAc,cAAc;AAAA,IAClE,gBAAgB,UAAU,MAAM,MAAM,QAAQ;AAAA,IAC9C,gBAAgB,WAAW,MAAM,SAAS,SAAS;AAAA,EAAA;AAGvD,SAAO;AAAA,IACH;AAAA,IACA,YAAY,QAAQ,OAAO,CAAC,MAAmC,MAAM,IAAI;AAAA,EAAA;AAEjF;AAKO,SAAS,oBAAoB,KAA0D;AAC1F,QAAM,qBAAqB,IAAI,KAAK,CAAC,UAAU,MAAM,SAAS;AAC9D,QAAM,qBAAqB,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,SAAS;AAE/D,MAAI,CAAC,sBAAsB,CAAC,oBAAoB;AAC5C,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,SAAO;AAAA,IACH,eAAe,wBAAwB,OAAO,mBAAmB,KAAK,EAAE,GAAG,mBAAmB,UAAU;AAAA,IACxG,eAAe,wBAAwB,OAAO,mBAAmB,KAAK,EAAE,GAAG,mBAAmB,UAAU;AAAA,EAAA;AAEhH;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getConfig } from "../../../../config/index.js";
|
|
2
|
+
import { footballHttp } from "../http.js";
|
|
3
|
+
import { transformSearchResult } from "./search.transformer.js";
|
|
4
|
+
async function searchFootball(options, config) {
|
|
5
|
+
if (!options.query || options.query.trim() === "") {
|
|
6
|
+
return {
|
|
7
|
+
results: [],
|
|
8
|
+
query: options.query || ""
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const finalConfig = config || getConfig();
|
|
12
|
+
const { sportal365Sports } = finalConfig;
|
|
13
|
+
const entityTypes = options.entityTypes && options.entityTypes.length > 0 ? options.entityTypes : ["tournament", "player", "team", "president", "venue", "coach"];
|
|
14
|
+
const raw = await footballHttp.get({
|
|
15
|
+
path: "/search",
|
|
16
|
+
params: {
|
|
17
|
+
query: options.query.trim(),
|
|
18
|
+
entity_type: entityTypes.join(","),
|
|
19
|
+
language_code: options.languageCode ?? sportal365Sports?.languageCode ?? "en"
|
|
20
|
+
},
|
|
21
|
+
headers: {
|
|
22
|
+
"Accept-Language": options.languageCode ?? sportal365Sports?.languageCode ?? "en"
|
|
23
|
+
},
|
|
24
|
+
next: options.next,
|
|
25
|
+
config: finalConfig
|
|
26
|
+
});
|
|
27
|
+
if (!raw || raw.length === 0) {
|
|
28
|
+
return {
|
|
29
|
+
results: [],
|
|
30
|
+
query: options.query
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const results = raw.map(transformSearchResult);
|
|
34
|
+
return {
|
|
35
|
+
results,
|
|
36
|
+
query: options.query
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
searchFootball
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/lib/api/sportal365-sports/football/search/index.ts"],"sourcesContent":["/**\n * Football search endpoints for Sportal365 API\n */\n\nimport type { FUSportsSearchResults } from \"../../../../types/canonical/search.types\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type { GetFootballSearchOptions, RawSearchResponse } from \"./search.types\";\nimport { transformSearchResult } from \"./search.transformer\";\n\n// Re-export types\nexport type { GetFootballSearchOptions, SearchEntityType } from \"./search.types\";\n\n/**\n * Search for football entities (tournaments, players, teams, presidents, venues, coaches)\n *\n * Returns empty results if no query is provided or no results are found.\n * If no entity types are specified, all types are included in the search.\n *\n * @param options - Search options including query and optional entity types\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Search results with canonical FUSports types\n *\n * @example\n * ```typescript\n * // Search for all entity types\n * const results = await searchFootball({ query: 'lionel' });\n * console.log(`Found ${results.results.length} results`);\n *\n * // Search only for players and teams\n * const results = await searchFootball({\n * query: 'messi',\n * entityTypes: ['player', 'team']\n * });\n *\n * // Handle results by entity type\n * results.results.forEach(result => {\n * switch (result.entityType) {\n * case 'player':\n * console.log(`Player: ${result.name} (${result.position})`);\n * break;\n * case 'team':\n * console.log(`Team: ${result.name} (${result.threeLetterCode})`);\n * break;\n * // ... handle other types\n * }\n * });\n * ```\n */\nexport async function searchFootball(\n options: GetFootballSearchOptions,\n config?: DataLayerConfig\n): Promise<FUSportsSearchResults> {\n // Return empty results if no query is provided\n if (!options.query || options.query.trim() === \"\") {\n return {\n results: [],\n query: options.query || \"\",\n };\n }\n\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n // Build entity_type parameter\n // If no types specified, include all types\n const entityTypes =\n options.entityTypes && options.entityTypes.length > 0\n ? options.entityTypes\n : [\"tournament\", \"player\", \"team\", \"president\", \"venue\", \"coach\"];\n\n const raw = await footballHttp.get<RawSearchResponse>({\n path: \"/search\",\n params: {\n query: options.query.trim(),\n entity_type: entityTypes.join(\",\"),\n language_code: options.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n headers: {\n \"Accept-Language\": options.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: options.next,\n config: finalConfig,\n });\n\n // Return empty results if no results found\n if (!raw || raw.length === 0) {\n return {\n results: [],\n query: options.query,\n };\n }\n\n // Transform all results\n const results = raw.map(transformSearchResult);\n\n return {\n results,\n query: options.query,\n };\n}\n"],"names":[],"mappings":";;;AAiDA,eAAsB,eAClB,SACA,QAC8B;AAE9B,MAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,KAAA,MAAW,IAAI;AAC/C,WAAO;AAAA,MACH,SAAS,CAAA;AAAA,MACT,OAAO,QAAQ,SAAS;AAAA,IAAA;AAAA,EAEhC;AAEA,QAAM,cAAc,UAAU,UAAA;AAC9B,QAAM,EAAE,qBAAqB;AAI7B,QAAM,cACF,QAAQ,eAAe,QAAQ,YAAY,SAAS,IAC9C,QAAQ,cACR,CAAC,cAAc,UAAU,QAAQ,aAAa,SAAS,OAAO;AAExE,QAAM,MAAM,MAAM,aAAa,IAAuB;AAAA,IAClD,MAAM;AAAA,IACN,QAAQ;AAAA,MACJ,OAAO,QAAQ,MAAM,KAAA;AAAA,MACrB,aAAa,YAAY,KAAK,GAAG;AAAA,MACjC,eAAe,QAAQ,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAE7E,SAAS;AAAA,MACL,mBAAmB,QAAQ,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAEjF,MAAM,QAAQ;AAAA,IACd,QAAQ;AAAA,EAAA,CACX;AAGD,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC1B,WAAO;AAAA,MACH,SAAS,CAAA;AAAA,MACT,OAAO,QAAQ;AAAA,IAAA;AAAA,EAEvB;AAGA,QAAM,UAAU,IAAI,IAAI,qBAAqB;AAE7C,SAAO;AAAA,IACH;AAAA,IACA,OAAO,QAAQ;AAAA,EAAA;AAEvB;"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { toProviderRefArray } from "../../shared/providerRef.helper.js";
|
|
2
|
+
function transformTournament(raw) {
|
|
3
|
+
return {
|
|
4
|
+
entityType: "tournament",
|
|
5
|
+
id: raw.id.toString(),
|
|
6
|
+
name: raw.name,
|
|
7
|
+
slug: raw.slug,
|
|
8
|
+
gender: raw.gender,
|
|
9
|
+
type: raw.type,
|
|
10
|
+
region: raw.region,
|
|
11
|
+
country: {
|
|
12
|
+
id: raw.country.id.toString(),
|
|
13
|
+
name: raw.country.name,
|
|
14
|
+
code: void 0,
|
|
15
|
+
flag: raw.country.url_flag ?? void 0,
|
|
16
|
+
providerRef: toProviderRefArray(raw.country.uuid)
|
|
17
|
+
},
|
|
18
|
+
assets: raw.url_logo ? {
|
|
19
|
+
logo: raw.url_logo
|
|
20
|
+
} : void 0,
|
|
21
|
+
providerRef: toProviderRefArray(raw.uuid)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function transformPlayer(raw) {
|
|
25
|
+
return {
|
|
26
|
+
entityType: "player",
|
|
27
|
+
id: raw.id.toString(),
|
|
28
|
+
name: raw.name,
|
|
29
|
+
slug: raw.slug,
|
|
30
|
+
position: raw.position,
|
|
31
|
+
gender: raw.gender,
|
|
32
|
+
birthdate: raw.birthdate,
|
|
33
|
+
country: {
|
|
34
|
+
id: raw.country.id.toString(),
|
|
35
|
+
name: raw.country.name,
|
|
36
|
+
code: void 0,
|
|
37
|
+
flag: raw.country.url_flag ?? void 0,
|
|
38
|
+
providerRef: toProviderRefArray(raw.country.uuid)
|
|
39
|
+
},
|
|
40
|
+
assets: raw.url_thumb ? {
|
|
41
|
+
photo: raw.url_thumb
|
|
42
|
+
} : void 0,
|
|
43
|
+
providerRef: toProviderRefArray(raw.uuid)
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function transformTeam(raw) {
|
|
47
|
+
return {
|
|
48
|
+
entityType: "team",
|
|
49
|
+
id: raw.id.toString(),
|
|
50
|
+
name: raw.name,
|
|
51
|
+
slug: raw.slug,
|
|
52
|
+
shortName: raw.short_name ?? void 0,
|
|
53
|
+
threeLetterCode: raw.three_letter_code ?? void 0,
|
|
54
|
+
type: raw.type === "national" ? "national" : "club",
|
|
55
|
+
gender: raw.gender,
|
|
56
|
+
country: {
|
|
57
|
+
id: raw.country.id.toString(),
|
|
58
|
+
name: raw.country.name,
|
|
59
|
+
code: void 0,
|
|
60
|
+
flag: raw.country.url_flag ?? void 0,
|
|
61
|
+
providerRef: toProviderRefArray(raw.country.uuid)
|
|
62
|
+
},
|
|
63
|
+
assets: raw.url_logo ? {
|
|
64
|
+
logo: raw.url_logo
|
|
65
|
+
} : void 0,
|
|
66
|
+
providerRef: toProviderRefArray(raw.uuid)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function transformPresident(raw) {
|
|
70
|
+
return {
|
|
71
|
+
entityType: "president",
|
|
72
|
+
id: raw.id.toString(),
|
|
73
|
+
name: raw.name,
|
|
74
|
+
slug: raw.slug,
|
|
75
|
+
birthdate: raw.birthdate ?? void 0,
|
|
76
|
+
country: {
|
|
77
|
+
id: raw.country.id.toString(),
|
|
78
|
+
name: raw.country.name,
|
|
79
|
+
code: void 0,
|
|
80
|
+
flag: raw.country.url_flag ?? void 0,
|
|
81
|
+
providerRef: toProviderRefArray(raw.country.uuid)
|
|
82
|
+
},
|
|
83
|
+
assets: raw.url_thumb ? {
|
|
84
|
+
photo: raw.url_thumb
|
|
85
|
+
} : void 0,
|
|
86
|
+
providerRef: toProviderRefArray(raw.uuid)
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function transformVenue(raw) {
|
|
90
|
+
return {
|
|
91
|
+
entityType: "venue",
|
|
92
|
+
id: raw.id.toString(),
|
|
93
|
+
name: raw.name,
|
|
94
|
+
slug: raw.slug,
|
|
95
|
+
city: {
|
|
96
|
+
id: raw.city.id.toString(),
|
|
97
|
+
name: raw.city.name,
|
|
98
|
+
country: {
|
|
99
|
+
id: raw.city.country.id.toString(),
|
|
100
|
+
name: raw.city.country.name,
|
|
101
|
+
code: void 0,
|
|
102
|
+
flag: raw.city.country.url_flag ?? void 0,
|
|
103
|
+
providerRef: toProviderRefArray(raw.city.country.uuid)
|
|
104
|
+
},
|
|
105
|
+
providerRef: toProviderRefArray(raw.city.uuid)
|
|
106
|
+
},
|
|
107
|
+
country: {
|
|
108
|
+
id: raw.country.id.toString(),
|
|
109
|
+
name: raw.country.name,
|
|
110
|
+
code: void 0,
|
|
111
|
+
flag: raw.country.url_flag ?? void 0,
|
|
112
|
+
providerRef: toProviderRefArray(raw.country.uuid)
|
|
113
|
+
},
|
|
114
|
+
profile: {
|
|
115
|
+
latitude: raw.profile.lat,
|
|
116
|
+
longitude: raw.profile.lng,
|
|
117
|
+
capacity: raw.profile.capacity
|
|
118
|
+
},
|
|
119
|
+
assets: raw.url_thumb ? {
|
|
120
|
+
image: raw.url_thumb
|
|
121
|
+
} : void 0,
|
|
122
|
+
providerRef: toProviderRefArray(raw.uuid)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function transformCoach(raw) {
|
|
126
|
+
return {
|
|
127
|
+
entityType: "coach",
|
|
128
|
+
id: raw.id.toString(),
|
|
129
|
+
name: raw.name,
|
|
130
|
+
slug: raw.slug,
|
|
131
|
+
birthdate: raw.birthdate ?? void 0,
|
|
132
|
+
country: {
|
|
133
|
+
id: raw.country.id.toString(),
|
|
134
|
+
name: raw.country.name,
|
|
135
|
+
code: void 0,
|
|
136
|
+
flag: raw.country.url_flag ?? void 0,
|
|
137
|
+
providerRef: toProviderRefArray(raw.country.uuid)
|
|
138
|
+
},
|
|
139
|
+
assets: raw.url_thumb ? {
|
|
140
|
+
photo: raw.url_thumb
|
|
141
|
+
} : void 0,
|
|
142
|
+
providerRef: toProviderRefArray(raw.uuid)
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function transformSearchResult(raw) {
|
|
146
|
+
switch (raw.entity_type) {
|
|
147
|
+
case "tournament":
|
|
148
|
+
return transformTournament(raw);
|
|
149
|
+
case "player":
|
|
150
|
+
return transformPlayer(raw);
|
|
151
|
+
case "team":
|
|
152
|
+
return transformTeam(raw);
|
|
153
|
+
case "president":
|
|
154
|
+
return transformPresident(raw);
|
|
155
|
+
case "venue":
|
|
156
|
+
return transformVenue(raw);
|
|
157
|
+
case "coach":
|
|
158
|
+
return transformCoach(raw);
|
|
159
|
+
default:
|
|
160
|
+
throw new Error(`Unknown entity type: ${raw.entity_type}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export {
|
|
164
|
+
transformSearchResult
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=search.transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.transformer.js","sources":["../../../../../src/lib/api/sportal365-sports/football/search/search.transformer.ts"],"sourcesContent":["/**\n * Transform raw search results to canonical FUSports types\n */\n\nimport type {\n FUSportsSearchResult,\n FUSportsTournamentSearchResult,\n FUSportsPlayerSearchResult,\n FUSportsTeamSearchResult,\n FUSportsPresidentSearchResult,\n FUSportsVenueSearchResult,\n FUSportsCoachSearchResult,\n} from \"../../../../types/canonical/search.types\";\nimport type {\n RawSearchResult,\n RawSearchTournament,\n RawSearchPlayer,\n RawSearchTeam,\n RawSearchPresident,\n RawSearchVenue,\n RawSearchCoach,\n} from \"./search.types\";\nimport { toProviderRefArray } from \"../../shared\";\n\n/**\n * Transform raw tournament search result\n */\nfunction transformTournament(raw: RawSearchTournament): FUSportsTournamentSearchResult {\n return {\n entityType: \"tournament\",\n id: raw.id.toString(),\n name: raw.name,\n slug: raw.slug,\n gender: raw.gender,\n type: raw.type,\n region: raw.region,\n country: {\n id: raw.country.id.toString(),\n name: raw.country.name,\n code: undefined,\n flag: raw.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n assets: raw.url_logo\n ? {\n logo: raw.url_logo,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw player search result\n */\nfunction transformPlayer(raw: RawSearchPlayer): FUSportsPlayerSearchResult {\n return {\n entityType: \"player\",\n id: raw.id.toString(),\n name: raw.name,\n slug: raw.slug,\n position: raw.position,\n gender: raw.gender,\n birthdate: raw.birthdate,\n country: {\n id: raw.country.id.toString(),\n name: raw.country.name,\n code: undefined,\n flag: raw.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n assets: raw.url_thumb\n ? {\n photo: raw.url_thumb,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw team search result\n */\nfunction transformTeam(raw: RawSearchTeam): FUSportsTeamSearchResult {\n return {\n entityType: \"team\",\n id: raw.id.toString(),\n name: raw.name,\n slug: raw.slug,\n shortName: raw.short_name ?? undefined,\n threeLetterCode: raw.three_letter_code ?? undefined,\n type: raw.type === \"national\" ? \"national\" : \"club\",\n gender: raw.gender,\n country: {\n id: raw.country.id.toString(),\n name: raw.country.name,\n code: undefined,\n flag: raw.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n assets: raw.url_logo\n ? {\n logo: raw.url_logo,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw president search result\n */\nfunction transformPresident(raw: RawSearchPresident): FUSportsPresidentSearchResult {\n return {\n entityType: \"president\",\n id: raw.id.toString(),\n name: raw.name,\n slug: raw.slug,\n birthdate: raw.birthdate ?? undefined,\n country: {\n id: raw.country.id.toString(),\n name: raw.country.name,\n code: undefined,\n flag: raw.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n assets: raw.url_thumb\n ? {\n photo: raw.url_thumb,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw venue search result\n */\nfunction transformVenue(raw: RawSearchVenue): FUSportsVenueSearchResult {\n return {\n entityType: \"venue\",\n id: raw.id.toString(),\n name: raw.name,\n slug: raw.slug,\n city: {\n id: raw.city.id.toString(),\n name: raw.city.name,\n country: {\n id: raw.city.country.id.toString(),\n name: raw.city.country.name,\n code: undefined,\n flag: raw.city.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.city.country.uuid),\n },\n providerRef: toProviderRefArray(raw.city.uuid),\n },\n country: {\n id: raw.country.id.toString(),\n name: raw.country.name,\n code: undefined,\n flag: raw.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n profile: {\n latitude: raw.profile.lat,\n longitude: raw.profile.lng,\n capacity: raw.profile.capacity,\n },\n assets: raw.url_thumb\n ? {\n image: raw.url_thumb,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw coach search result\n */\nfunction transformCoach(raw: RawSearchCoach): FUSportsCoachSearchResult {\n return {\n entityType: \"coach\",\n id: raw.id.toString(),\n name: raw.name,\n slug: raw.slug,\n birthdate: raw.birthdate ?? undefined,\n country: {\n id: raw.country.id.toString(),\n name: raw.country.name,\n code: undefined,\n flag: raw.country.url_flag ?? undefined,\n providerRef: toProviderRefArray(raw.country.uuid),\n },\n assets: raw.url_thumb\n ? {\n photo: raw.url_thumb,\n }\n : undefined,\n providerRef: toProviderRefArray(raw.uuid),\n };\n}\n\n/**\n * Transform raw search result to canonical type\n */\nexport function transformSearchResult(raw: RawSearchResult): FUSportsSearchResult {\n switch (raw.entity_type) {\n case \"tournament\":\n return transformTournament(raw);\n case \"player\":\n return transformPlayer(raw);\n case \"team\":\n return transformTeam(raw);\n case \"president\":\n return transformPresident(raw);\n case \"venue\":\n return transformVenue(raw);\n case \"coach\":\n return transformCoach(raw);\n default:\n // This should never happen with proper typing\n throw new Error(`Unknown entity type: ${(raw as RawSearchResult).entity_type}`);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { getConfig } from "../../../../config/index.js";
|
|
2
|
+
import { footballHttp } from "../http.js";
|
|
3
|
+
import { transformStandings } from "./standing.transformer.js";
|
|
4
|
+
async function getFootballStandings(options, config) {
|
|
5
|
+
const finalConfig = config || getConfig();
|
|
6
|
+
const { sportal365Sports } = finalConfig;
|
|
7
|
+
const expandParam = options.expand?.join(",");
|
|
8
|
+
const raw = await footballHttp.get({
|
|
9
|
+
path: `/tournaments/seasons/stages/${options.stageId}/standing`,
|
|
10
|
+
params: {
|
|
11
|
+
expand: expandParam,
|
|
12
|
+
language_code: options.languageCode ?? sportal365Sports?.languageCode ?? "en"
|
|
13
|
+
},
|
|
14
|
+
headers: {
|
|
15
|
+
"Accept-Language": options.languageCode ?? sportal365Sports?.languageCode ?? "en"
|
|
16
|
+
},
|
|
17
|
+
next: options.next,
|
|
18
|
+
config: finalConfig
|
|
19
|
+
});
|
|
20
|
+
if (!raw || raw.length === 0) {
|
|
21
|
+
return { entries: [], metadata: { legend: [] } };
|
|
22
|
+
}
|
|
23
|
+
return transformStandings(raw);
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
getFootballStandings
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../src/lib/api/sportal365-sports/football/standings/index.ts"],"sourcesContent":["/**\n * Sportal365 Sports API - Football Standings\n *\n * Fetches standings data from the Football API and transforms to canonical FUSports types.\n */\n\nimport type { FUSportsStandings } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type { RawFootballStandingsResponse, GetFootballStandingsOptions } from \"./standing.types\";\nimport { transformStandings } from \"./standing.transformer\";\n\n// Re-export types\nexport type {\n RawFootballStandingTeam,\n RawFootballEventStatus,\n RawFootballFormEvent,\n RawFootballFormEntry,\n RawFootballStandingRule,\n RawFootballStandingEntry,\n RawFootballStandingsResponse,\n GetFootballStandingsOptions,\n FootballStandingsExpandOption,\n} from \"./standing.types\";\n\n/**\n * Get football standings for a stage\n *\n * @param options - Options including stageId (required), languageCode, and expand options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns FUSportsStandings object with entries and metadata (including legend)\n *\n * @example\n * ```typescript\n * // Get all standings with form data\n * const standings = await getFootballStandings({\n * stageId: '8009708',\n * expand: ['rules', 'form.events']\n * });\n *\n * // Get standings in a specific language\n * const standingsBg = await getFootballStandings({\n * stageId: '8009708',\n * languageCode: 'bg'\n * });\n *\n * // Access entries and metadata\n * standings.entries.forEach(entry => {\n * console.log(`${entry.rank}. ${entry.competitor.name} - ${entry.stats.points} pts`);\n * });\n *\n * // Access legend for rules/zones\n * standings.metadata.legend.forEach(item => {\n * console.log(`${item.name} (${item.position})`);\n * });\n * ```\n */\nexport async function getFootballStandings(\n options: GetFootballStandingsOptions,\n config?: DataLayerConfig\n): Promise<FUSportsStandings> {\n const finalConfig = config || getConfig();\n const { sportal365Sports } = finalConfig;\n\n // Build expand parameter\n const expandParam = options.expand?.join(\",\");\n\n const raw = await footballHttp.get<RawFootballStandingsResponse>({\n path: `/tournaments/seasons/stages/${options.stageId}/standing`,\n params: {\n expand: expandParam,\n language_code: options.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n headers: {\n \"Accept-Language\": options.languageCode ?? sportal365Sports?.languageCode ?? \"en\",\n },\n next: options.next,\n config: finalConfig,\n });\n\n // The response is a direct array of standing entries\n if (!raw || raw.length === 0) {\n return { entries: [], metadata: { legend: [] } };\n }\n\n return transformStandings(raw);\n}\n"],"names":[],"mappings":";;;AAyDA,eAAsB,qBAClB,SACA,QAC0B;AAC1B,QAAM,cAAc,UAAU,UAAA;AAC9B,QAAM,EAAE,qBAAqB;AAG7B,QAAM,cAAc,QAAQ,QAAQ,KAAK,GAAG;AAE5C,QAAM,MAAM,MAAM,aAAa,IAAkC;AAAA,IAC7D,MAAM,+BAA+B,QAAQ,OAAO;AAAA,IACpD,QAAQ;AAAA,MACJ,QAAQ;AAAA,MACR,eAAe,QAAQ,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAE7E,SAAS;AAAA,MACL,mBAAmB,QAAQ,gBAAgB,kBAAkB,gBAAgB;AAAA,IAAA;AAAA,IAEjF,MAAM,QAAQ;AAAA,IACd,QAAQ;AAAA,EAAA,CACX;AAGD,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC1B,WAAO,EAAE,SAAS,CAAA,GAAI,UAAU,EAAE,QAAQ,CAAA,IAAG;AAAA,EACjD;AAEA,SAAO,mBAAmB,GAAG;AACjC;"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
function mapRuleCodeToKey(ruleCode) {
|
|
2
|
+
const mapping = {
|
|
3
|
+
championsleague: "championsLeague",
|
|
4
|
+
europaleague: "europaLeague",
|
|
5
|
+
conferenceleague: "conferenceLeague",
|
|
6
|
+
relegation: "relegation",
|
|
7
|
+
playoff: "playoff",
|
|
8
|
+
promotion: "promotion"
|
|
9
|
+
};
|
|
10
|
+
return mapping[ruleCode.toLowerCase()] ?? ruleCode.toLowerCase().replace(/_/g, "");
|
|
11
|
+
}
|
|
12
|
+
function mapRuleTypeToPosition(ruleType) {
|
|
13
|
+
const lowerType = ruleType.toLowerCase();
|
|
14
|
+
if (lowerType === "relegation") return "BOTTOM";
|
|
15
|
+
if (lowerType === "playoff") return "MIDDLE";
|
|
16
|
+
return "TOP";
|
|
17
|
+
}
|
|
18
|
+
function buildForm(teamId, formEntries) {
|
|
19
|
+
if (!formEntries || formEntries.length === 0) {
|
|
20
|
+
return void 0;
|
|
21
|
+
}
|
|
22
|
+
const results = formEntries.map((entry) => {
|
|
23
|
+
const event = entry.event;
|
|
24
|
+
const isHomeTeam = event.home_team.id === teamId;
|
|
25
|
+
const opponent = isHomeTeam ? event.away_team : event.home_team;
|
|
26
|
+
const score = `${event.goal_home}-${event.goal_away}`;
|
|
27
|
+
return {
|
|
28
|
+
matchId: event.id.toString(),
|
|
29
|
+
result: entry.outcome,
|
|
30
|
+
score,
|
|
31
|
+
homeAway: isHomeTeam ? "HOME" : "AWAY",
|
|
32
|
+
opponent: {
|
|
33
|
+
id: opponent.id.toString(),
|
|
34
|
+
name: opponent.name,
|
|
35
|
+
logo: opponent.url_logo
|
|
36
|
+
},
|
|
37
|
+
date: new Date(event.start_time),
|
|
38
|
+
competition: void 0
|
|
39
|
+
// Football API doesn't include competition in form
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
const formString = results.map((r) => r.result).join("");
|
|
43
|
+
return {
|
|
44
|
+
competitorId: teamId.toString(),
|
|
45
|
+
results,
|
|
46
|
+
formString
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function transformRuleToLegendItem(rule) {
|
|
50
|
+
return {
|
|
51
|
+
key: mapRuleCodeToKey(rule.code),
|
|
52
|
+
name: rule.name,
|
|
53
|
+
position: mapRuleTypeToPosition(rule.type)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function transformStandingEntry(raw) {
|
|
57
|
+
const stats = {
|
|
58
|
+
played: raw.played,
|
|
59
|
+
won: raw.wins,
|
|
60
|
+
drawn: raw.draws,
|
|
61
|
+
lost: raw.defeits,
|
|
62
|
+
goalsFor: raw.goals_for,
|
|
63
|
+
goalsAgainst: raw.goals_against,
|
|
64
|
+
goalDifference: raw.goals_for - raw.goals_against,
|
|
65
|
+
points: raw.points
|
|
66
|
+
};
|
|
67
|
+
const rules = raw.rules?.length > 0 ? raw.rules.map((r) => mapRuleCodeToKey(r.code)) : void 0;
|
|
68
|
+
const form = buildForm(raw.team.id, raw.team.form ?? []);
|
|
69
|
+
return {
|
|
70
|
+
rank: raw.rank,
|
|
71
|
+
competitor: {
|
|
72
|
+
id: raw.team.id.toString(),
|
|
73
|
+
name: raw.team.name,
|
|
74
|
+
shortName: raw.team.short_name ?? void 0,
|
|
75
|
+
logo: raw.team.url_logo,
|
|
76
|
+
uuid: raw.team.uuid
|
|
77
|
+
},
|
|
78
|
+
stats,
|
|
79
|
+
form,
|
|
80
|
+
rules
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function transformStandings(rawEntries) {
|
|
84
|
+
const entries = rawEntries.map(transformStandingEntry);
|
|
85
|
+
const legendMap = /* @__PURE__ */ new Map();
|
|
86
|
+
for (const rawEntry of rawEntries) {
|
|
87
|
+
if (rawEntry.rules) {
|
|
88
|
+
for (const rule of rawEntry.rules) {
|
|
89
|
+
const key = mapRuleCodeToKey(rule.code);
|
|
90
|
+
if (!legendMap.has(key)) {
|
|
91
|
+
legendMap.set(key, transformRuleToLegendItem(rule));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
entries,
|
|
98
|
+
metadata: {
|
|
99
|
+
legend: Array.from(legendMap.values())
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export {
|
|
104
|
+
transformStandingEntry,
|
|
105
|
+
transformStandings
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=standing.transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standing.transformer.js","sources":["../../../../../src/lib/api/sportal365-sports/football/standings/standing.transformer.ts"],"sourcesContent":["/**\n * Football API Standings Transformer\n * Converts raw Football API standings to canonical FUSports types\n */\n\nimport type {\n FUSportsCompetitorForm,\n FUSportsStandingEntry,\n FUSportsStandingLegendItem,\n FUSportsStandings,\n} from \"../../../../types/canonical\";\nimport type { RawFootballStandingEntry, RawFootballFormEntry, RawFootballStandingRule } from \"./standing.types\";\n\n/**\n * Map Football API rule code to canonical key\n */\nfunction mapRuleCodeToKey(ruleCode: string): string {\n const mapping: Record<string, string> = {\n championsleague: \"championsLeague\",\n europaleague: \"europaLeague\",\n conferenceleague: \"conferenceLeague\",\n relegation: \"relegation\",\n playoff: \"playoff\",\n promotion: \"promotion\",\n };\n return mapping[ruleCode.toLowerCase()] ?? ruleCode.toLowerCase().replace(/_/g, \"\");\n}\n\n/**\n * Map Football API rule type to position\n */\nfunction mapRuleTypeToPosition(ruleType: string): \"TOP\" | \"BOTTOM\" | \"MIDDLE\" {\n const lowerType = ruleType.toLowerCase();\n if (lowerType === \"relegation\") return \"BOTTOM\";\n if (lowerType === \"playoff\") return \"MIDDLE\";\n return \"TOP\";\n}\n\n/**\n * Build FUSportsCompetitorForm from Football API form entries\n */\nfunction buildForm(teamId: number, formEntries: RawFootballFormEntry[]): FUSportsCompetitorForm | undefined {\n if (!formEntries || formEntries.length === 0) {\n return undefined;\n }\n\n const results = formEntries.map((entry) => {\n const event = entry.event;\n const isHomeTeam = event.home_team.id === teamId;\n const opponent = isHomeTeam ? event.away_team : event.home_team;\n const score = `${event.goal_home}-${event.goal_away}`;\n\n return {\n matchId: event.id.toString(),\n result: entry.outcome,\n score,\n homeAway: (isHomeTeam ? \"HOME\" : \"AWAY\") as \"HOME\" | \"AWAY\",\n opponent: {\n id: opponent.id.toString(),\n name: opponent.name,\n logo: opponent.url_logo,\n },\n date: new Date(event.start_time),\n competition: undefined, // Football API doesn't include competition in form\n };\n });\n\n const formString = results.map((r) => r.result).join(\"\");\n\n return {\n competitorId: teamId.toString(),\n results,\n formString,\n };\n}\n\n/**\n * Transform a Football API rule to a legend item\n */\nfunction transformRuleToLegendItem(rule: RawFootballStandingRule): FUSportsStandingLegendItem {\n return {\n key: mapRuleCodeToKey(rule.code),\n name: rule.name,\n position: mapRuleTypeToPosition(rule.type),\n };\n}\n\n/**\n * Transform a single Football API standing entry to canonical format\n */\nexport function transformStandingEntry(raw: RawFootballStandingEntry): FUSportsStandingEntry {\n // Build stats from direct properties\n const stats: FUSportsStandingEntry[\"stats\"] = {\n played: raw.played,\n won: raw.wins,\n drawn: raw.draws,\n lost: raw.defeits,\n goalsFor: raw.goals_for,\n goalsAgainst: raw.goals_against,\n goalDifference: raw.goals_for - raw.goals_against,\n points: raw.points,\n };\n\n // Build rules array from raw rules\n const rules = raw.rules?.length > 0 ? raw.rules.map((r) => mapRuleCodeToKey(r.code)) : undefined;\n\n // Build form from form entries\n const form = buildForm(raw.team.id, raw.team.form ?? []);\n\n return {\n rank: raw.rank,\n competitor: {\n id: raw.team.id.toString(),\n name: raw.team.name,\n shortName: raw.team.short_name ?? undefined,\n logo: raw.team.url_logo,\n uuid: raw.team.uuid,\n },\n stats,\n form,\n rules,\n };\n}\n\n/**\n * Transform Football API standing entries to canonical standings with legend\n */\nexport function transformStandings(rawEntries: RawFootballStandingEntry[]): FUSportsStandings {\n const entries = rawEntries.map(transformStandingEntry);\n\n // Build legend from all unique rules across entries\n const legendMap = new Map<string, FUSportsStandingLegendItem>();\n\n for (const rawEntry of rawEntries) {\n if (rawEntry.rules) {\n for (const rule of rawEntry.rules) {\n const key = mapRuleCodeToKey(rule.code);\n if (!legendMap.has(key)) {\n legendMap.set(key, transformRuleToLegendItem(rule));\n }\n }\n }\n }\n\n return {\n entries,\n metadata: {\n legend: Array.from(legendMap.values()),\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Fetches player statistics and transforms to canonical FUSports types.
|
|
5
5
|
*/
|
|
6
|
-
import type { FUSportsPlayerSeasonStatistics } from "../../../../types/canonical";
|
|
6
|
+
import type { FUSportsPlayerSeasonStatistics, FUSportsPlayerCareerStatistics, FUSportsPlayerRecentStatistics } from "../../../../types/canonical";
|
|
7
7
|
import { type DataLayerConfig } from "../../../../config";
|
|
8
8
|
import type { GetFootballPlayerSeasonStatisticsOptions, GetFootballPlayerSeasonStatisticsByPlayerIdsOptions } from "./player-season.types";
|
|
9
|
+
import type { GetFootballPlayerCareerStatisticsOptions } from "./player-career.types";
|
|
10
|
+
import type { GetFootballPlayerRecentStatisticsOptions } from "./player-recent.types";
|
|
9
11
|
export type { GetFootballPlayerSeasonStatisticsOptions, GetFootballPlayerSeasonStatisticsByPlayerIdsOptions, } from "./player-season.types";
|
|
12
|
+
export type { GetFootballPlayerCareerStatisticsOptions } from "./player-career.types";
|
|
13
|
+
export type { GetFootballPlayerRecentStatisticsOptions } from "./player-recent.types";
|
|
10
14
|
/**
|
|
11
15
|
* Get player season statistics for a team
|
|
12
16
|
*
|
|
@@ -59,4 +63,45 @@ export declare function getFootballPlayerSeasonStatistics(options: GetFootballPl
|
|
|
59
63
|
* ```
|
|
60
64
|
*/
|
|
61
65
|
export declare function getFootballPlayerSeasonStatisticsByPlayerIds(options: GetFootballPlayerSeasonStatisticsByPlayerIdsOptions, config?: DataLayerConfig): Promise<Record<string, FUSportsPlayerSeasonStatistics>>;
|
|
66
|
+
/**
|
|
67
|
+
* Get a player's career statistics across all tournaments and teams
|
|
68
|
+
*
|
|
69
|
+
* Fetches statistics throughout a player's entire career, broken down by
|
|
70
|
+
* tournament season and team.
|
|
71
|
+
*
|
|
72
|
+
* @param options - Required parameters (playerId)
|
|
73
|
+
* @param config - Optional data layer config (uses singleton if not provided)
|
|
74
|
+
* @returns Player career statistics with per-season-per-team entries
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const career = await getFootballPlayerCareerStatistics({
|
|
79
|
+
* playerId: '3400' // or slug: 'cristiano-ronaldo-3400'
|
|
80
|
+
* });
|
|
81
|
+
* console.log(career.playerName); // "Cristiano Ronaldo"
|
|
82
|
+
* console.log(career.entries[0].goals); // Goals in first entry
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare function getFootballPlayerCareerStatistics(options: GetFootballPlayerCareerStatisticsOptions, config?: DataLayerConfig): Promise<FUSportsPlayerCareerStatistics>;
|
|
86
|
+
/**
|
|
87
|
+
* Get a player's recent statistics from their last N matches
|
|
88
|
+
*
|
|
89
|
+
* Fetches aggregated statistics and match details for a player's most recent matches.
|
|
90
|
+
* Optionally filter by tournament or team.
|
|
91
|
+
*
|
|
92
|
+
* @param options - Required parameters (playerId), optional filters (matches, tournamentIds, teamId)
|
|
93
|
+
* @param config - Optional data layer config (uses singleton if not provided)
|
|
94
|
+
* @returns Player recent statistics with matches and aggregated stats
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const recent = await getFootballPlayerRecentStatistics({
|
|
99
|
+
* playerId: '3400',
|
|
100
|
+
* matches: 5
|
|
101
|
+
* });
|
|
102
|
+
* console.log(recent.goals); // Goals in last 5 matches
|
|
103
|
+
* console.log(recent.matches.length); // 5
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare function getFootballPlayerRecentStatistics(options: GetFootballPlayerRecentStatisticsOptions, config?: DataLayerConfig): Promise<FUSportsPlayerRecentStatistics>;
|
|
62
107
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/api/sportal365-sports/football/statistics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAClJ,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAER,wCAAwC,EACxC,mDAAmD,EACtD,MAAM,uBAAuB,CAAC;AAM/B,OAAO,KAAK,EAER,wCAAwC,EAC3C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAER,wCAAwC,EAC3C,MAAM,uBAAuB,CAAC;AAI/B,YAAY,EACR,wCAAwC,EACxC,mDAAmD,GACtD,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,wCAAwC,EAAE,MAAM,uBAAuB,CAAC;AAEtF,YAAY,EAAE,wCAAwC,EAAE,MAAM,uBAAuB,CAAC;AAEtF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,iCAAiC,CACnD,OAAO,EAAE,wCAAwC,EACjD,MAAM,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC,CA6DzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,4CAA4C,CAC9D,OAAO,EAAE,mDAAmD,EAC5D,MAAM,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC,CAoDzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,iCAAiC,CACnD,OAAO,EAAE,wCAAwC,EACjD,MAAM,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,8BAA8B,CAAC,CA4BzC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iCAAiC,CACnD,OAAO,EAAE,wCAAwC,EACjD,MAAM,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC,8BAA8B,CAAC,CAwCzC"}
|