fansunited-data-layer 0.13.0 → 0.14.2
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.d.ts.map +1 -1
- package/api/fansunited/http.js +70 -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/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.js +154 -0
- package/api/sportal365-sports/football/statistics/index.js.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-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-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/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 -3553
- 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/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/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-BvHU-bP0.js +0 -1795
- package/matches-Ci0Ci_Mw.cjs +0 -1
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { memoryStore } from "../../../cache/memory-store.js";
|
|
2
|
+
function resolveTranslation(translations, lang, fallbackName, fallbackShortName) {
|
|
3
|
+
const upperLang = lang.toUpperCase();
|
|
4
|
+
const target = translations.find((t) => t.language.toUpperCase() === upperLang);
|
|
5
|
+
if (target) {
|
|
6
|
+
return {
|
|
7
|
+
name: target.name,
|
|
8
|
+
shortName: target.short_name ?? fallbackShortName ?? void 0
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (upperLang !== "EN") {
|
|
12
|
+
const en = translations.find((t) => t.language.toUpperCase() === "EN");
|
|
13
|
+
if (en) {
|
|
14
|
+
return {
|
|
15
|
+
name: en.name,
|
|
16
|
+
shortName: en.short_name ?? fallbackShortName ?? void 0
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
name: fallbackName,
|
|
22
|
+
shortName: fallbackShortName ?? void 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function resolveAssets(assets) {
|
|
26
|
+
const result = {};
|
|
27
|
+
for (const asset of assets) {
|
|
28
|
+
result[asset.key.toLowerCase()] = asset.value;
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
function resolveBranding(raw) {
|
|
33
|
+
if (!raw) return void 0;
|
|
34
|
+
const branding = {};
|
|
35
|
+
if (raw.primary_color) branding.primaryColor = raw.primary_color;
|
|
36
|
+
if (raw.secondary_color) branding.secondaryColor = raw.secondary_color;
|
|
37
|
+
if (raw.text_color) branding.textColor = raw.text_color;
|
|
38
|
+
if (raw.background_color) branding.backgroundColor = raw.background_color;
|
|
39
|
+
if (raw.background_gradient_from_color) branding.backgroundGradientFromColor = raw.background_gradient_from_color;
|
|
40
|
+
if (raw.background_gradient_to_color) branding.backgroundGradientToColor = raw.background_gradient_to_color;
|
|
41
|
+
if (raw.background_image) branding.backgroundImage = raw.background_image;
|
|
42
|
+
return Object.keys(branding).length > 0 ? branding : void 0;
|
|
43
|
+
}
|
|
44
|
+
function resolveProviderRef(refs) {
|
|
45
|
+
return refs.map((r) => ({ provider: r.provider, id: r.id }));
|
|
46
|
+
}
|
|
47
|
+
function getRelatedIds(related, relationship) {
|
|
48
|
+
return related.filter((r) => r.relationship === relationship).map((r) => r.related_id);
|
|
49
|
+
}
|
|
50
|
+
function resolveCountry(countryId, related, lang) {
|
|
51
|
+
const id = countryId || getRelatedIds(related, "COUNTRY")[0];
|
|
52
|
+
if (!id) return void 0;
|
|
53
|
+
const cachedEntry = memoryStore.get(id) ?? memoryStore.get(`entity:${id}`);
|
|
54
|
+
if (cachedEntry?.data) {
|
|
55
|
+
const raw = cachedEntry.data;
|
|
56
|
+
return transformCountrySummary(raw, lang);
|
|
57
|
+
}
|
|
58
|
+
return { id, name: id };
|
|
59
|
+
}
|
|
60
|
+
function transformCountrySummary(raw, lang) {
|
|
61
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
62
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
63
|
+
return {
|
|
64
|
+
id: raw.id,
|
|
65
|
+
name,
|
|
66
|
+
...raw.country_code ? { code: raw.country_code } : {},
|
|
67
|
+
...assets.flag ? { flag: assets.flag } : {},
|
|
68
|
+
...shortName ? { shortName } : {}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function transformCompetitionSummary(raw, lang) {
|
|
72
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
73
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
74
|
+
const branding = resolveBranding(raw.branding);
|
|
75
|
+
const country = resolveCountry(null, raw.related ?? [], lang);
|
|
76
|
+
return {
|
|
77
|
+
id: raw.id,
|
|
78
|
+
name,
|
|
79
|
+
sport: raw.sport,
|
|
80
|
+
...shortName ? { shortName } : {},
|
|
81
|
+
...raw.format ? { type: raw.format } : {},
|
|
82
|
+
...country ? { country } : {},
|
|
83
|
+
...assets.logo ? { assets: { logo: assets.logo } } : {},
|
|
84
|
+
...branding ? { metadata: { branding } } : {}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function transformTeamSummary(raw, lang) {
|
|
88
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
89
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
90
|
+
const branding = resolveBranding(raw.metadata?.branding);
|
|
91
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
92
|
+
return {
|
|
93
|
+
id: raw.id,
|
|
94
|
+
name,
|
|
95
|
+
sport: raw.sport,
|
|
96
|
+
...shortName ? { shortName } : {},
|
|
97
|
+
...raw.three_letter_code ? { threeLetterCode: raw.three_letter_code } : {},
|
|
98
|
+
...raw.full_name ? { fullName: raw.full_name } : {},
|
|
99
|
+
...raw.nickname ? { nickname: raw.nickname } : {},
|
|
100
|
+
...raw.gender ? { gender: raw.gender } : {},
|
|
101
|
+
...country ? { country } : {},
|
|
102
|
+
...assets.logo ? { assets: { logo: assets.logo } } : {},
|
|
103
|
+
...branding ? { metadata: { branding } } : {}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function transformAthleteSummary(raw, lang) {
|
|
107
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
108
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
109
|
+
const branding = resolveBranding(raw.metadata?.branding);
|
|
110
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
111
|
+
return {
|
|
112
|
+
id: raw.id,
|
|
113
|
+
name,
|
|
114
|
+
sport: raw.sport,
|
|
115
|
+
type: "player",
|
|
116
|
+
...shortName ? { shortName } : {},
|
|
117
|
+
...raw.position ? { position: raw.position } : {},
|
|
118
|
+
...raw.birth_date ? { birthdate: raw.birth_date } : {},
|
|
119
|
+
...raw.shirt_number != null ? { shirtNumber: raw.shirt_number } : {},
|
|
120
|
+
...raw.gender ? { gender: raw.gender } : {},
|
|
121
|
+
...country ? { country } : {},
|
|
122
|
+
...assets.logo || assets.headshot ? { assets: { ...assets.logo ? { logo: assets.logo } : {}, ...assets.headshot ? { photo: assets.headshot } : {} } } : {},
|
|
123
|
+
...branding ? { metadata: { branding } } : {}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function transformVenueSummary(raw, lang) {
|
|
127
|
+
const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
128
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
129
|
+
const hasProfile = raw.capacity != null || raw.latitude != null || raw.longitude != null;
|
|
130
|
+
return {
|
|
131
|
+
id: raw.id,
|
|
132
|
+
name,
|
|
133
|
+
sport: raw.sport,
|
|
134
|
+
...country ? { country } : {},
|
|
135
|
+
...hasProfile ? {
|
|
136
|
+
profile: {
|
|
137
|
+
...raw.capacity != null ? { capacity: raw.capacity } : {},
|
|
138
|
+
...raw.latitude != null ? { latitude: raw.latitude } : {},
|
|
139
|
+
...raw.longitude != null ? { longitude: raw.longitude } : {}
|
|
140
|
+
}
|
|
141
|
+
} : {}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function transformCoachSummary(raw, lang) {
|
|
145
|
+
const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
146
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
147
|
+
return {
|
|
148
|
+
id: raw.id,
|
|
149
|
+
name,
|
|
150
|
+
sport: raw.sport,
|
|
151
|
+
...raw.birth_date ? { birthdate: raw.birth_date } : {},
|
|
152
|
+
...country ? { country } : {}
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function hydrateRelatedEntity(id, relationship, lang) {
|
|
156
|
+
const entry = memoryStore.get(id) ?? memoryStore.get(`entity:${id}`);
|
|
157
|
+
if (!entry?.data) return void 0;
|
|
158
|
+
const raw = entry.data;
|
|
159
|
+
switch (relationship) {
|
|
160
|
+
case "COMPETITION":
|
|
161
|
+
return transformCompetitionSummary(raw, lang);
|
|
162
|
+
case "TEAM":
|
|
163
|
+
return transformTeamSummary(raw, lang);
|
|
164
|
+
case "ATHLETE":
|
|
165
|
+
return transformAthleteSummary(raw, lang);
|
|
166
|
+
case "COUNTRY":
|
|
167
|
+
return transformCountrySummary(raw, lang);
|
|
168
|
+
default:
|
|
169
|
+
return void 0;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function resolveRelated(related, lang) {
|
|
173
|
+
if (!related || related.length === 0) return void 0;
|
|
174
|
+
const result = {};
|
|
175
|
+
for (const entry of related) {
|
|
176
|
+
const hydrated = hydrateRelatedEntity(entry.related_id, entry.relationship, lang);
|
|
177
|
+
if (!hydrated) continue;
|
|
178
|
+
switch (entry.relationship) {
|
|
179
|
+
case "COMPETITION":
|
|
180
|
+
(result.competitions ??= []).push(hydrated);
|
|
181
|
+
break;
|
|
182
|
+
case "TEAM":
|
|
183
|
+
(result.teams ??= []).push(hydrated);
|
|
184
|
+
break;
|
|
185
|
+
case "ATHLETE":
|
|
186
|
+
(result.athletes ??= []).push(hydrated);
|
|
187
|
+
break;
|
|
188
|
+
case "COUNTRY":
|
|
189
|
+
(result.countries ??= []).push(hydrated);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
194
|
+
}
|
|
195
|
+
function transformCompetition(raw, lang) {
|
|
196
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
197
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
198
|
+
const branding = resolveBranding(raw.branding);
|
|
199
|
+
const country = resolveCountry(null, raw.related ?? [], lang);
|
|
200
|
+
const related = resolveRelated(raw.related ?? [], lang);
|
|
201
|
+
return {
|
|
202
|
+
id: raw.id,
|
|
203
|
+
name,
|
|
204
|
+
sport: raw.sport,
|
|
205
|
+
...shortName ? { shortName } : {},
|
|
206
|
+
...raw.format ? { type: raw.format } : {},
|
|
207
|
+
...raw.gender ? { gender: raw.gender } : {},
|
|
208
|
+
...country ? { country } : {},
|
|
209
|
+
...assets.logo ? { assets: { logo: assets.logo } } : {},
|
|
210
|
+
...branding ? { metadata: { branding } } : {},
|
|
211
|
+
...raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {},
|
|
212
|
+
...related ? { related } : {}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function transformTeam(raw, lang) {
|
|
216
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
217
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
218
|
+
const branding = resolveBranding(raw.metadata?.branding);
|
|
219
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
220
|
+
const related = resolveRelated(raw.related ?? [], lang);
|
|
221
|
+
return {
|
|
222
|
+
id: raw.id,
|
|
223
|
+
name,
|
|
224
|
+
sport: raw.sport,
|
|
225
|
+
...shortName ? { shortName } : {},
|
|
226
|
+
...raw.three_letter_code ? { threeLetterCode: raw.three_letter_code } : {},
|
|
227
|
+
...raw.full_name ? { fullName: raw.full_name } : {},
|
|
228
|
+
...raw.nickname ? { nickname: raw.nickname } : {},
|
|
229
|
+
...raw.gender ? { gender: raw.gender } : {},
|
|
230
|
+
...country ? { country } : {},
|
|
231
|
+
...assets.logo ? { assets: { logo: assets.logo } } : {},
|
|
232
|
+
...branding ? { metadata: { branding } } : {},
|
|
233
|
+
...raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {},
|
|
234
|
+
...related ? { related } : {}
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function transformAthlete(raw, lang) {
|
|
238
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
239
|
+
const assets = resolveAssets(raw.assets ?? []);
|
|
240
|
+
const branding = resolveBranding(raw.metadata?.branding);
|
|
241
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
242
|
+
const related = resolveRelated(raw.related ?? [], lang);
|
|
243
|
+
return {
|
|
244
|
+
id: raw.id,
|
|
245
|
+
name,
|
|
246
|
+
sport: raw.sport,
|
|
247
|
+
type: "player",
|
|
248
|
+
...shortName ? { shortName } : {},
|
|
249
|
+
...raw.position ? { position: raw.position } : {},
|
|
250
|
+
...raw.birth_date ? { birthdate: raw.birth_date } : {},
|
|
251
|
+
...raw.shirt_number != null ? { shirtNumber: raw.shirt_number } : {},
|
|
252
|
+
...raw.gender ? { gender: raw.gender } : {},
|
|
253
|
+
...country ? { country } : {},
|
|
254
|
+
...assets.logo || assets.headshot ? { assets: { ...assets.logo ? { logo: assets.logo } : {}, ...assets.headshot ? { photo: assets.headshot } : {} } } : {},
|
|
255
|
+
...branding ? { metadata: { branding } } : {},
|
|
256
|
+
...raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {},
|
|
257
|
+
...related ? { related } : {}
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function transformCountry(raw, lang) {
|
|
261
|
+
const summary = transformCountrySummary(raw, lang);
|
|
262
|
+
return {
|
|
263
|
+
...summary,
|
|
264
|
+
sport: raw.sport,
|
|
265
|
+
...raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function transformVenue(raw, lang) {
|
|
269
|
+
const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
270
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
271
|
+
const related = resolveRelated(raw.related ?? [], lang);
|
|
272
|
+
const hasProfile = raw.capacity != null || raw.latitude != null || raw.longitude != null;
|
|
273
|
+
return {
|
|
274
|
+
id: raw.id,
|
|
275
|
+
name,
|
|
276
|
+
sport: raw.sport,
|
|
277
|
+
...country ? { country } : {},
|
|
278
|
+
...hasProfile ? {
|
|
279
|
+
profile: {
|
|
280
|
+
...raw.capacity != null ? { capacity: raw.capacity } : {},
|
|
281
|
+
...raw.latitude != null ? { latitude: raw.latitude } : {},
|
|
282
|
+
...raw.longitude != null ? { longitude: raw.longitude } : {}
|
|
283
|
+
}
|
|
284
|
+
} : {},
|
|
285
|
+
...raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {},
|
|
286
|
+
...related ? { related } : {}
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function transformCoach(raw, lang) {
|
|
290
|
+
const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
291
|
+
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
292
|
+
const related = resolveRelated(raw.related ?? [], lang);
|
|
293
|
+
return {
|
|
294
|
+
id: raw.id,
|
|
295
|
+
name,
|
|
296
|
+
sport: raw.sport,
|
|
297
|
+
...raw.birth_date ? { birthdate: raw.birth_date } : {},
|
|
298
|
+
...country ? { country } : {},
|
|
299
|
+
...raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {},
|
|
300
|
+
...related ? { related } : {}
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function transformEntity(raw, lang) {
|
|
304
|
+
const contentType = raw.content_type?.toUpperCase?.();
|
|
305
|
+
const type = raw.type?.toUpperCase?.();
|
|
306
|
+
const entityType = raw.entityType?.toLowerCase?.();
|
|
307
|
+
if (contentType === "COMPETITION" || entityType === "competition") {
|
|
308
|
+
return { ...transformCompetition(raw, lang), entityType: "competition" };
|
|
309
|
+
}
|
|
310
|
+
if (entityType === "country" || raw.country_code !== void 0) {
|
|
311
|
+
return { ...transformCountry(raw, lang), entityType: "country" };
|
|
312
|
+
}
|
|
313
|
+
if (entityType === "venue" || raw.capacity !== void 0 && !entityType) {
|
|
314
|
+
return { ...transformVenue(raw, lang), entityType: "venue" };
|
|
315
|
+
}
|
|
316
|
+
if (entityType === "coach" || type === "COACH") {
|
|
317
|
+
return { ...transformCoach(raw, lang), entityType: "coach" };
|
|
318
|
+
}
|
|
319
|
+
if (entityType === "athlete" || type === "PLAYER" || raw.position !== void 0 || raw.shirt_number !== void 0) {
|
|
320
|
+
return { ...transformAthlete(raw, lang), entityType: "athlete" };
|
|
321
|
+
}
|
|
322
|
+
if (entityType === "team" || type === "TEAM" || raw.three_letter_code !== void 0) {
|
|
323
|
+
return { ...transformTeam(raw, lang), entityType: "team" };
|
|
324
|
+
}
|
|
325
|
+
return { ...transformTeam(raw, lang), entityType: "team" };
|
|
326
|
+
}
|
|
327
|
+
function transformEntitySummary(raw, lang) {
|
|
328
|
+
const contentType = raw.content_type?.toUpperCase?.();
|
|
329
|
+
const type = raw.type?.toUpperCase?.();
|
|
330
|
+
const entityType = raw.entityType?.toLowerCase?.();
|
|
331
|
+
if (contentType === "COMPETITION" || entityType === "competition") {
|
|
332
|
+
return { ...transformCompetitionSummary(raw, lang), entityType: "competition" };
|
|
333
|
+
}
|
|
334
|
+
if (entityType === "country" || raw.country_code !== void 0) {
|
|
335
|
+
return { ...transformCountrySummary(raw, lang), entityType: "country" };
|
|
336
|
+
}
|
|
337
|
+
if (entityType === "venue" || raw.capacity !== void 0 && !entityType) {
|
|
338
|
+
return { ...transformVenueSummary(raw, lang), entityType: "venue" };
|
|
339
|
+
}
|
|
340
|
+
if (entityType === "coach" || type === "COACH") {
|
|
341
|
+
return { ...transformCoachSummary(raw, lang), entityType: "coach" };
|
|
342
|
+
}
|
|
343
|
+
if (entityType === "athlete" || type === "PLAYER" || raw.position !== void 0 || raw.shirt_number !== void 0) {
|
|
344
|
+
return { ...transformAthleteSummary(raw, lang), entityType: "athlete" };
|
|
345
|
+
}
|
|
346
|
+
if (entityType === "team" || type === "TEAM" || raw.three_letter_code !== void 0) {
|
|
347
|
+
return { ...transformTeamSummary(raw, lang), entityType: "team" };
|
|
348
|
+
}
|
|
349
|
+
return { ...transformTeamSummary(raw, lang), entityType: "team" };
|
|
350
|
+
}
|
|
351
|
+
export {
|
|
352
|
+
getRelatedIds,
|
|
353
|
+
resolveAssets,
|
|
354
|
+
resolveBranding,
|
|
355
|
+
resolveCountry,
|
|
356
|
+
resolveProviderRef,
|
|
357
|
+
resolveRelated,
|
|
358
|
+
resolveTranslation,
|
|
359
|
+
transformAthlete,
|
|
360
|
+
transformAthleteSummary,
|
|
361
|
+
transformCoach,
|
|
362
|
+
transformCoachSummary,
|
|
363
|
+
transformCompetition,
|
|
364
|
+
transformCompetitionSummary,
|
|
365
|
+
transformCountry,
|
|
366
|
+
transformCountrySummary,
|
|
367
|
+
transformEntity,
|
|
368
|
+
transformEntitySummary,
|
|
369
|
+
transformTeam,
|
|
370
|
+
transformTeamSummary,
|
|
371
|
+
transformVenue,
|
|
372
|
+
transformVenueSummary
|
|
373
|
+
};
|
|
374
|
+
//# sourceMappingURL=transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformer.js","sources":["../../../../src/lib/api/fansunited/search/transformer.ts"],"sourcesContent":["/**\n * Raw → Canonical transformer for Search API entities.\n *\n * Resolves translations to a target language (with EN fallback),\n * maps raw snake_case fields to canonical camelCase types,\n * and hydrates related entries (country + related) one level deep from cache.\n */\n\nimport { memoryStore } from \"../../../cache\";\nimport type {\n FUSportsCompetition,\n FUSportsTeamCompetitor,\n FUSportsPlayerCompetitor,\n FUSportsCountry,\n FUSportsVenue,\n FUSportsCoach,\n FUSportsRelated,\n FUBranding,\n FUSportsCompetitionSummary,\n FUSportsTeamSummary,\n FUSportsPlayerSummary,\n FUSportsCountrySummary,\n FUSportsVenueSummary,\n FUSportsCoachSummary,\n} from \"../../../types/canonical/base.types\";\nimport type { SearchEntityResult, SearchEntitySummary } from \"./types\";\nimport type {\n RawTranslation,\n RawAsset,\n RawRelated,\n RawProviderRef,\n RawBranding,\n RawTeamBranding,\n RawSearchEntityBase,\n RawCompetition,\n RawTeam,\n RawAthlete,\n RawCountry,\n RawVenue,\n RawCoach,\n} from \"./raw-types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve name/shortName in target language.\n * Fallback order: target lang → EN → raw name.\n */\nexport function resolveTranslation(\n translations: RawTranslation[],\n lang: string,\n fallbackName: string,\n fallbackShortName?: string | null\n): { name: string; shortName?: string } {\n const upperLang = lang.toUpperCase();\n\n const target = translations.find((t) => t.language.toUpperCase() === upperLang);\n if (target) {\n return {\n name: target.name,\n shortName: target.short_name ?? fallbackShortName ?? undefined,\n };\n }\n\n // Fallback to EN\n if (upperLang !== \"EN\") {\n const en = translations.find((t) => t.language.toUpperCase() === \"EN\");\n if (en) {\n return {\n name: en.name,\n shortName: en.short_name ?? fallbackShortName ?? undefined,\n };\n }\n }\n\n return {\n name: fallbackName,\n shortName: fallbackShortName ?? undefined,\n };\n}\n\n/**\n * Map [{key: \"LOGO\", value: \"url\"}] → { logo: \"url\" }\n */\nexport function resolveAssets(assets: RawAsset[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const asset of assets) {\n result[asset.key.toLowerCase()] = asset.value;\n }\n return result;\n}\n\n/**\n * Map raw branding snake_case → canonical FUBranding camelCase.\n */\nexport function resolveBranding(raw: RawBranding | RawTeamBranding | undefined | null): FUBranding | undefined {\n if (!raw) return undefined;\n\n const branding: FUBranding = {};\n if (raw.primary_color) branding.primaryColor = raw.primary_color;\n if (raw.secondary_color) branding.secondaryColor = raw.secondary_color;\n if (raw.text_color) branding.textColor = raw.text_color;\n if (raw.background_color) branding.backgroundColor = raw.background_color;\n if (raw.background_gradient_from_color) branding.backgroundGradientFromColor = raw.background_gradient_from_color;\n if (raw.background_gradient_to_color) branding.backgroundGradientToColor = raw.background_gradient_to_color;\n if (raw.background_image) branding.backgroundImage = raw.background_image;\n\n return Object.keys(branding).length > 0 ? branding : undefined;\n}\n\n/** Map raw provider_ref → canonical providerRef */\nexport function resolveProviderRef(refs: RawProviderRef[]): { provider: string; id: string }[] {\n return refs.map((r) => ({ provider: r.provider, id: r.id }));\n}\n\n/** Extract related IDs by relationship type */\nexport function getRelatedIds(related: RawRelated[], relationship: string): string[] {\n return related.filter((r) => r.relationship === relationship).map((r) => r.related_id);\n}\n\n/**\n * Resolve a country from cache (one level deep).\n * Returns FUSportsCountry with name in target lang if cached, or { id } if not.\n */\nexport function resolveCountry(\n countryId: string | null | undefined,\n related: RawRelated[],\n lang: string\n): FUSportsCountry | undefined {\n // Determine the country ID — from direct field or related array\n const id = countryId || getRelatedIds(related, \"COUNTRY\")[0];\n if (!id) return undefined;\n\n // Try cache lookup\n const cachedEntry = memoryStore.get<RawCountry>(id) ?? memoryStore.get<RawCountry>(`entity:${id}`);\n\n if (cachedEntry?.data) {\n const raw = cachedEntry.data;\n return transformCountrySummary(raw, lang);\n }\n\n // Not in cache — return partial\n return { id, name: id };\n}\n\n// ---------------------------------------------------------------------------\n// Summary transforms — used for list/search views AND one-level-deep related\n// entity hydration. These do NOT populate `related` or `providerRef`.\n// ---------------------------------------------------------------------------\n\nexport function transformCountrySummary(raw: RawCountry, lang: string): FUSportsCountrySummary {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n\n return {\n id: raw.id,\n name,\n ...(raw.country_code ? { code: raw.country_code } : {}),\n ...(assets.flag ? { flag: assets.flag } : {}),\n ...(shortName ? { shortName } : {}),\n };\n}\n\nexport function transformCompetitionSummary(raw: RawCompetition, lang: string): FUSportsCompetitionSummary {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n const branding = resolveBranding(raw.branding);\n const country = resolveCountry(null, raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(shortName ? { shortName } : {}),\n ...(raw.format ? { type: raw.format as FUSportsCompetition[\"type\"] } : {}),\n ...(country ? { country } : {}),\n ...(assets.logo ? { assets: { logo: assets.logo } } : {}),\n ...(branding ? { metadata: { branding } } : {}),\n };\n}\n\nexport function transformTeamSummary(raw: RawTeam, lang: string): FUSportsTeamSummary {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n const branding = resolveBranding(raw.metadata?.branding);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(shortName ? { shortName } : {}),\n ...(raw.three_letter_code ? { threeLetterCode: raw.three_letter_code } : {}),\n ...(raw.full_name ? { fullName: raw.full_name } : {}),\n ...(raw.nickname ? { nickname: raw.nickname } : {}),\n ...(raw.gender ? { gender: raw.gender as FUSportsTeamCompetitor[\"gender\"] } : {}),\n ...(country ? { country } : {}),\n ...(assets.logo ? { assets: { logo: assets.logo } } : {}),\n ...(branding ? { metadata: { branding } } : {}),\n };\n}\n\nexport function transformAthleteSummary(raw: RawAthlete, lang: string): FUSportsPlayerSummary {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n const branding = resolveBranding(raw.metadata?.branding);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n type: \"player\",\n ...(shortName ? { shortName } : {}),\n ...(raw.position ? { position: raw.position } : {}),\n ...(raw.birth_date ? { birthdate: raw.birth_date } : {}),\n ...(raw.shirt_number != null ? { shirtNumber: raw.shirt_number } : {}),\n ...(raw.gender ? { gender: raw.gender as FUSportsPlayerCompetitor[\"gender\"] } : {}),\n ...(country ? { country } : {}),\n ...(assets.logo || assets.headshot\n ? { assets: { ...(assets.logo ? { logo: assets.logo } : {}), ...(assets.headshot ? { photo: assets.headshot } : {}) } }\n : {}),\n ...(branding ? { metadata: { branding } } : {}),\n };\n}\n\nexport function transformVenueSummary(raw: RawVenue, lang: string): FUSportsVenueSummary {\n const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n\n const hasProfile = raw.capacity != null || raw.latitude != null || raw.longitude != null;\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(country ? { country } : {}),\n ...(hasProfile\n ? {\n profile: {\n ...(raw.capacity != null ? { capacity: raw.capacity } : {}),\n ...(raw.latitude != null ? { latitude: raw.latitude } : {}),\n ...(raw.longitude != null ? { longitude: raw.longitude } : {}),\n },\n }\n : {}),\n };\n}\n\nexport function transformCoachSummary(raw: RawCoach, lang: string): FUSportsCoachSummary {\n const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(raw.birth_date ? { birthdate: raw.birth_date } : {}),\n ...(country ? { country } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Related entity resolution (one level deep from cache)\n// ---------------------------------------------------------------------------\n\n/**\n * Look up a cached raw entity and determine its type for shallow transformation.\n */\nfunction hydrateRelatedEntity(\n id: string,\n relationship: string,\n lang: string\n): FUSportsCompetition | FUSportsTeamCompetitor | FUSportsPlayerCompetitor | FUSportsCountry | undefined {\n const entry = memoryStore.get<RawSearchEntityBase & Record<string, unknown>>(id)\n ?? memoryStore.get<RawSearchEntityBase & Record<string, unknown>>(`entity:${id}`);\n\n if (!entry?.data) return undefined;\n\n const raw = entry.data;\n switch (relationship) {\n case \"COMPETITION\":\n return transformCompetitionSummary(raw as unknown as RawCompetition, lang);\n case \"TEAM\":\n return transformTeamSummary(raw as unknown as RawTeam, lang);\n case \"ATHLETE\":\n return transformAthleteSummary(raw as unknown as RawAthlete, lang);\n case \"COUNTRY\":\n return transformCountrySummary(raw as unknown as RawCountry, lang);\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve all related entries from cache, grouped by relationship type.\n * Returns undefined if there are no related entries.\n */\nexport function resolveRelated(related: RawRelated[], lang: string): FUSportsRelated | undefined {\n if (!related || related.length === 0) return undefined;\n\n const result: FUSportsRelated = {};\n\n for (const entry of related) {\n const hydrated = hydrateRelatedEntity(entry.related_id, entry.relationship, lang);\n // Skip entries not in cache — the prefetch step in index.ts should have\n // fetched them. If still missing, the entity was not found by the API.\n if (!hydrated) continue;\n\n switch (entry.relationship) {\n case \"COMPETITION\":\n (result.competitions ??= []).push(hydrated as FUSportsCompetition);\n break;\n case \"TEAM\":\n (result.teams ??= []).push(hydrated as FUSportsTeamCompetitor);\n break;\n case \"ATHLETE\":\n (result.athletes ??= []).push(hydrated as FUSportsPlayerCompetitor);\n break;\n case \"COUNTRY\":\n (result.countries ??= []).push(hydrated as FUSportsCountry);\n break;\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Entity transformers\n// ---------------------------------------------------------------------------\n\nexport function transformCompetition(raw: RawCompetition, lang: string): FUSportsCompetition {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n const branding = resolveBranding(raw.branding);\n const country = resolveCountry(null, raw.related ?? [], lang);\n const related = resolveRelated(raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(shortName ? { shortName } : {}),\n ...(raw.format ? { type: raw.format as FUSportsCompetition[\"type\"] } : {}),\n ...(raw.gender ? { gender: raw.gender as FUSportsCompetition[\"gender\"] } : {}),\n ...(country ? { country } : {}),\n ...(assets.logo ? { assets: { logo: assets.logo } } : {}),\n ...(branding ? { metadata: { branding } } : {}),\n ...(raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}),\n ...(related ? { related } : {}),\n };\n}\n\nexport function transformTeam(raw: RawTeam, lang: string): FUSportsTeamCompetitor {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n const branding = resolveBranding(raw.metadata?.branding);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n const related = resolveRelated(raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(shortName ? { shortName } : {}),\n ...(raw.three_letter_code ? { threeLetterCode: raw.three_letter_code } : {}),\n ...(raw.full_name ? { fullName: raw.full_name } : {}),\n ...(raw.nickname ? { nickname: raw.nickname } : {}),\n ...(raw.gender ? { gender: raw.gender as FUSportsTeamCompetitor[\"gender\"] } : {}),\n ...(country ? { country } : {}),\n ...(assets.logo ? { assets: { logo: assets.logo } } : {}),\n ...(branding ? { metadata: { branding } } : {}),\n ...(raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}),\n ...(related ? { related } : {}),\n };\n}\n\nexport function transformAthlete(raw: RawAthlete, lang: string): FUSportsPlayerCompetitor {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const assets = resolveAssets(raw.assets ?? []);\n const branding = resolveBranding(raw.metadata?.branding);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n const related = resolveRelated(raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n type: \"player\",\n ...(shortName ? { shortName } : {}),\n ...(raw.position ? { position: raw.position } : {}),\n ...(raw.birth_date ? { birthdate: raw.birth_date } : {}),\n ...(raw.shirt_number != null ? { shirtNumber: raw.shirt_number } : {}),\n ...(raw.gender ? { gender: raw.gender as FUSportsPlayerCompetitor[\"gender\"] } : {}),\n ...(country ? { country } : {}),\n ...(assets.logo || assets.headshot\n ? { assets: { ...(assets.logo ? { logo: assets.logo } : {}), ...(assets.headshot ? { photo: assets.headshot } : {}) } }\n : {}),\n ...(branding ? { metadata: { branding } } : {}),\n ...(raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}),\n ...(related ? { related } : {}),\n };\n}\n\nexport function transformCountry(raw: RawCountry, lang: string): FUSportsCountry {\n const summary = transformCountrySummary(raw, lang);\n return {\n ...summary,\n sport: raw.sport,\n ...(raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}),\n };\n}\n\nexport function transformVenue(raw: RawVenue, lang: string): FUSportsVenue {\n const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n const related = resolveRelated(raw.related ?? [], lang);\n\n const hasProfile = raw.capacity != null || raw.latitude != null || raw.longitude != null;\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(country ? { country } : {}),\n ...(hasProfile\n ? {\n profile: {\n ...(raw.capacity != null ? { capacity: raw.capacity } : {}),\n ...(raw.latitude != null ? { latitude: raw.latitude } : {}),\n ...(raw.longitude != null ? { longitude: raw.longitude } : {}),\n },\n }\n : {}),\n ...(raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}),\n ...(related ? { related } : {}),\n };\n}\n\nexport function transformCoach(raw: RawCoach, lang: string): FUSportsCoach {\n const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n const country = resolveCountry(raw.country_id, raw.related ?? [], lang);\n const related = resolveRelated(raw.related ?? [], lang);\n\n return {\n id: raw.id,\n name,\n sport: raw.sport,\n ...(raw.birth_date ? { birthdate: raw.birth_date } : {}),\n ...(country ? { country } : {}),\n ...(raw.provider_ref?.length ? { providerRef: resolveProviderRef(raw.provider_ref) } : {}),\n ...(related ? { related } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Main dispatcher\n// ---------------------------------------------------------------------------\n\n/**\n * Determine entity type from raw data and call the appropriate transformer.\n * The raw API uses `content_type` for competitions and `type` / general context for others.\n */\nexport function transformEntity(raw: RawSearchEntityBase & Record<string, unknown>, lang: string): SearchEntityResult {\n // Determine entity type from raw fields\n const contentType = (raw.content_type as string)?.toUpperCase?.();\n const type = (raw.type as string)?.toUpperCase?.();\n const entityType = (raw.entityType as string)?.toLowerCase?.();\n\n if (contentType === \"COMPETITION\" || entityType === \"competition\") {\n return { ...transformCompetition(raw as unknown as RawCompetition, lang), entityType: \"competition\" };\n }\n\n if (entityType === \"country\" || raw.country_code !== undefined) {\n return { ...transformCountry(raw as RawCountry, lang), entityType: \"country\" };\n }\n\n if (entityType === \"venue\" || (raw.capacity !== undefined && !entityType)) {\n return { ...transformVenue(raw as RawVenue, lang), entityType: \"venue\" };\n }\n\n if (entityType === \"coach\" || (type === \"COACH\")) {\n return { ...transformCoach(raw as RawCoach, lang), entityType: \"coach\" };\n }\n\n if (entityType === \"athlete\" || type === \"PLAYER\" || raw.position !== undefined || raw.shirt_number !== undefined) {\n return { ...transformAthlete(raw as RawAthlete, lang), entityType: \"athlete\" };\n }\n\n // Default to team\n if (entityType === \"team\" || type === \"TEAM\" || raw.three_letter_code !== undefined) {\n return { ...transformTeam(raw as RawTeam, lang), entityType: \"team\" };\n }\n\n // Fallback: treat as team (most common entity type)\n return { ...transformTeam(raw as RawTeam, lang), entityType: \"team\" };\n}\n\n/**\n * Summary dispatcher — like transformEntity but calls summary transforms.\n * Returns lightweight types without `related` or `providerRef`.\n */\nexport function transformEntitySummary(raw: RawSearchEntityBase & Record<string, unknown>, lang: string): SearchEntitySummary {\n const contentType = (raw.content_type as string)?.toUpperCase?.();\n const type = (raw.type as string)?.toUpperCase?.();\n const entityType = (raw.entityType as string)?.toLowerCase?.();\n\n if (contentType === \"COMPETITION\" || entityType === \"competition\") {\n return { ...transformCompetitionSummary(raw as unknown as RawCompetition, lang), entityType: \"competition\" };\n }\n\n if (entityType === \"country\" || raw.country_code !== undefined) {\n return { ...transformCountrySummary(raw as RawCountry, lang), entityType: \"country\" };\n }\n\n if (entityType === \"venue\" || (raw.capacity !== undefined && !entityType)) {\n return { ...transformVenueSummary(raw as RawVenue, lang), entityType: \"venue\" };\n }\n\n if (entityType === \"coach\" || (type === \"COACH\")) {\n return { ...transformCoachSummary(raw as RawCoach, lang), entityType: \"coach\" };\n }\n\n if (entityType === \"athlete\" || type === \"PLAYER\" || raw.position !== undefined || raw.shirt_number !== undefined) {\n return { ...transformAthleteSummary(raw as RawAthlete, lang), entityType: \"athlete\" };\n }\n\n if (entityType === \"team\" || type === \"TEAM\" || raw.three_letter_code !== undefined) {\n return { ...transformTeamSummary(raw as RawTeam, lang), entityType: \"team\" };\n }\n\n return { ...transformTeamSummary(raw as RawTeam, lang), entityType: \"team\" };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { transformMatchData } from "../../fansunited/football/matches/transformer.js";
|
|
2
|
+
function transformSDKMatches(rawMatches) {
|
|
3
|
+
return rawMatches.map(transformMatchData);
|
|
4
|
+
}
|
|
5
|
+
async function getLeaderboardMatches(sdk, predictorLeaderboardId, options) {
|
|
6
|
+
const response = await sdk.loyalty.getTemplateMatches(
|
|
7
|
+
predictorLeaderboardId,
|
|
8
|
+
options?.groupId,
|
|
9
|
+
options?.disableCache
|
|
10
|
+
);
|
|
11
|
+
return transformSDKMatches(response);
|
|
12
|
+
}
|
|
13
|
+
async function getLeaderboardTeamMatches(sdk, predictorLeaderboardId, teamId, options) {
|
|
14
|
+
const allMatches = await getLeaderboardMatches(sdk, predictorLeaderboardId, options);
|
|
15
|
+
return allMatches.filter((match) => match.competitorOne.id === teamId || match.competitorTwo.id === teamId);
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
getLeaderboardMatches,
|
|
19
|
+
getLeaderboardTeamMatches
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=matches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matches.js","sources":["../../../../src/lib/api/fansunited-sdk/loyalty/matches.ts"],"sourcesContent":["/**\n * SDK-based loyalty/predictor leaderboard match operations\n *\n * These functions use the FansUnited SDK's loyalty namespace to fetch matches\n * associated with predictor leaderboards/templates and transform them to canonical types.\n */\n\nimport type FansUnitedSDKModel from \"fansunited-sdk-esm/Core/Global/Models/FansUnitedSDKModel\";\nimport type { FUSportsMatch } from \"../../../types/canonical\";\nimport type { RawMatch } from \"../../fansunited/football/matches/types\";\nimport { transformMatchData } from \"../../fansunited/football/matches/transformer\";\n\n/**\n * Transform SDK match response to canonical FUSportsMatch array\n *\n * The SDK's loyalty.getTemplateMatches() returns match data in the same format\n * as the FansUnited Football API, so we can reuse the existing transformer.\n */\nfunction transformSDKMatches(rawMatches: RawMatch[]): FUSportsMatch[] {\n return rawMatches.map(transformMatchData);\n}\n\n/**\n * Get all matches for a predictor leaderboard/template\n *\n * Fetches matches associated with a predictor leaderboard template using the SDK's\n * loyalty.getTemplateMatches() method and transforms them to canonical FUSportsMatch types.\n *\n * @param sdk - The FansUnited SDK instance\n * @param predictorLeaderboardId - The predictor leaderboard/template ID\n * @param options - Optional parameters\n * @param options.groupId - Optional group ID to filter matches by specific group\n * @param options.disableCache - Whether to disable API cache (default: false)\n * @returns Array of matches in canonical format\n *\n * @example\n * ```typescript\n * import { useFansUnitedSDK } from 'fansunited-data-layer';\n * import { getLeaderboardMatches } from 'fansunited-data-layer/client';\n *\n * function MyComponent() {\n * const sdk = useFansUnitedSDK();\n *\n * const fetchMatches = async () => {\n * if (!sdk) return;\n * const matches = await getLeaderboardMatches(sdk, 'template-123');\n * console.log(matches); // Array of FUSportsMatch\n * };\n * }\n * ```\n */\nexport async function getLeaderboardMatches(\n sdk: FansUnitedSDKModel,\n predictorLeaderboardId: string,\n options?: {\n groupId?: string;\n disableCache?: boolean;\n }\n): Promise<FUSportsMatch[]> {\n // Call SDK loyalty.getTemplateMatches()\n const response = await sdk.loyalty.getTemplateMatches(\n predictorLeaderboardId,\n options?.groupId,\n options?.disableCache\n );\n\n // The SDK returns an array of match objects\n // Transform to canonical types\n return transformSDKMatches(response);\n}\n\n/**\n * Get matches for a specific team within a predictor leaderboard/template\n *\n * Fetches matches associated with a predictor leaderboard template and filters them\n * to only include matches where the specified team is participating (either as home or away).\n *\n * @param sdk - The FansUnited SDK instance\n * @param predictorLeaderboardId - The predictor leaderboard/template ID\n * @param teamId - The team ID to filter matches by\n * @param options - Optional parameters\n * @param options.groupId - Optional group ID to filter matches by specific group\n * @param options.disableCache - Whether to disable API cache (default: false)\n * @returns Array of matches for the specified team in canonical format\n *\n * @example\n * ```typescript\n * import { useFansUnitedSDK } from 'fansunited-data-layer';\n * import { getLeaderboardTeamMatches } from 'fansunited-data-layer/client';\n *\n * function TeamLeaderboard() {\n * const sdk = useFansUnitedSDK();\n *\n * const fetchTeamMatches = async () => {\n * if (!sdk) return;\n * // Get only matches for Manchester United\n * const matches = await getLeaderboardTeamMatches(\n * sdk,\n * 'template-123',\n * 'fb:t:8102'\n * );\n * console.log(matches); // Array of FUSportsMatch for the team\n * };\n * }\n * ```\n */\nexport async function getLeaderboardTeamMatches(\n sdk: FansUnitedSDKModel,\n predictorLeaderboardId: string,\n teamId: string,\n options?: {\n groupId?: string;\n disableCache?: boolean;\n }\n): Promise<FUSportsMatch[]> {\n // First, get all matches for the leaderboard\n const allMatches = await getLeaderboardMatches(sdk, predictorLeaderboardId, options);\n\n // Filter to only include matches where the team is participating\n return allMatches.filter((match) => match.competitorOne.id === teamId || match.competitorTwo.id === teamId);\n}\n"],"names":[],"mappings":";AAkBA,SAAS,oBAAoB,YAAyC;AAClE,SAAO,WAAW,IAAI,kBAAkB;AAC5C;AA+BA,eAAsB,sBAClB,KACA,wBACA,SAIwB;AAExB,QAAM,WAAW,MAAM,IAAI,QAAQ;AAAA,IAC/B;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAKb,SAAO,oBAAoB,QAAQ;AACvC;AAqCA,eAAsB,0BAClB,KACA,wBACA,QACA,SAIwB;AAExB,QAAM,aAAa,MAAM,sBAAsB,KAAK,wBAAwB,OAAO;AAGnF,SAAO,WAAW,OAAO,CAAC,UAAU,MAAM,cAAc,OAAO,UAAU,MAAM,cAAc,OAAO,MAAM;AAC9G;"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
async function getLeaderboardTemplate(sdk, templateId, options) {
|
|
2
|
+
const templateModel = await sdk.loyalty.getTemplateById(templateId, options?.disableCache);
|
|
3
|
+
const serialized = {
|
|
4
|
+
id: templateModel.id,
|
|
5
|
+
name: templateModel.name,
|
|
6
|
+
description: templateModel.description,
|
|
7
|
+
type: templateModel.type,
|
|
8
|
+
fromDate: templateModel.fromDate,
|
|
9
|
+
toDate: templateModel.toDate,
|
|
10
|
+
markets: templateModel.markets || [],
|
|
11
|
+
teamIds: templateModel.teamIds || [],
|
|
12
|
+
matchIds: templateModel.matchIds || [],
|
|
13
|
+
groups: (templateModel.groups || []).map((group) => ({
|
|
14
|
+
groupId: group.groupId,
|
|
15
|
+
label: group.label,
|
|
16
|
+
flags: group.flags || [],
|
|
17
|
+
filters: {
|
|
18
|
+
fromDate: group.filters?.fromDate || "",
|
|
19
|
+
toDate: group.filters?.toDate || "",
|
|
20
|
+
matchIds: group.filters?.matchIds || []
|
|
21
|
+
}
|
|
22
|
+
})),
|
|
23
|
+
gameIds: templateModel.gameIds || [],
|
|
24
|
+
gameTypes: templateModel.gameTypes || [],
|
|
25
|
+
competitionIds: templateModel.competitionIds || [],
|
|
26
|
+
excludedProfileIds: templateModel.excludedProfileIds || [],
|
|
27
|
+
rules: templateModel.rules || "",
|
|
28
|
+
labels: templateModel.labels || {},
|
|
29
|
+
customFields: templateModel.customFields || {},
|
|
30
|
+
// Convert BrandingModel to plain object
|
|
31
|
+
branding: templateModel.branding ? JSON.parse(JSON.stringify(templateModel.branding)) : {},
|
|
32
|
+
brandingId: null,
|
|
33
|
+
// brandingId doesn't exist on TemplateByIdModel, using null
|
|
34
|
+
flags: templateModel.flags || [],
|
|
35
|
+
images: {
|
|
36
|
+
main: templateModel.images?.main || null,
|
|
37
|
+
cover: templateModel.images?.cover || null,
|
|
38
|
+
mobile: templateModel.images?.mobile || null
|
|
39
|
+
},
|
|
40
|
+
status: templateModel.status,
|
|
41
|
+
automaticallyChangeStatus: templateModel.automaticallyChangeStatus || false,
|
|
42
|
+
createdAt: templateModel.createdAt,
|
|
43
|
+
updatedAt: templateModel.updatedAt,
|
|
44
|
+
related: templateModel.related || [],
|
|
45
|
+
adContent: templateModel.adContent || ""
|
|
46
|
+
};
|
|
47
|
+
return serialized;
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
getLeaderboardTemplate
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.js","sources":["../../../../src/lib/api/fansunited-sdk/loyalty/template.ts"],"sourcesContent":["/**\n * SDK-based loyalty/predictor template operations\n *\n * These functions use the FansUnited SDK's loyalty namespace to fetch template data.\n */\n\nimport type FansUnitedSDKModel from \"fansunited-sdk-esm/Core/Global/Models/FansUnitedSDKModel\";\nimport type { SerializedTemplate } from \"../../../providers/leaderboard.types\";\n\n/**\n * Get template/leaderboard by ID\n *\n * Fetches a predictor leaderboard template using the SDK's loyalty.getTemplateById() method.\n * The SDK returns a class instance which needs to be serialized for use in React Server Components.\n *\n * @param sdk - The FansUnited SDK instance\n * @param templateId - The template/leaderboard ID\n * @param options - Optional parameters\n * @param options.disableCache - Whether to disable API cache (default: false)\n * @returns Template data as a serializable plain object\n *\n * @example\n * ```typescript\n * import { useFansUnitedSDK } from 'fansunited-data-layer';\n * import { getLeaderboardTemplate } from 'fansunited-data-layer/client';\n *\n * function MyComponent() {\n * const sdk = useFansUnitedSDK();\n *\n * const fetchTemplate = async () => {\n * if (!sdk) return;\n * const template = await getLeaderboardTemplate(sdk, 'template-123');\n * console.log(template.name); // Template name\n * console.log(template.groups); // Template groups\n * };\n * }\n * ```\n */\nexport async function getLeaderboardTemplate(\n sdk: FansUnitedSDKModel,\n templateId: string,\n options?: {\n disableCache?: boolean;\n }\n): Promise<SerializedTemplate> {\n // Call SDK loyalty.getTemplateById()\n const templateModel = await sdk.loyalty.getTemplateById(templateId, options?.disableCache);\n\n // The SDK returns a TemplateByIdModel class instance\n // We need to serialize it to a plain object for React Server Components\n const serialized: SerializedTemplate = {\n id: templateModel.id,\n name: templateModel.name,\n description: templateModel.description,\n type: templateModel.type,\n fromDate: templateModel.fromDate,\n toDate: templateModel.toDate,\n markets: templateModel.markets || [],\n teamIds: templateModel.teamIds || [],\n matchIds: templateModel.matchIds || [],\n groups: (templateModel.groups || []).map((group) => ({\n groupId: group.groupId,\n label: group.label,\n flags: group.flags || [],\n filters: {\n fromDate: group.filters?.fromDate || \"\",\n toDate: group.filters?.toDate || \"\",\n matchIds: group.filters?.matchIds || [],\n },\n })),\n gameIds: templateModel.gameIds || [],\n gameTypes: templateModel.gameTypes || [],\n competitionIds: templateModel.competitionIds || [],\n excludedProfileIds: templateModel.excludedProfileIds || [],\n rules: templateModel.rules || \"\",\n labels: templateModel.labels || {},\n customFields: templateModel.customFields || {},\n // Convert BrandingModel to plain object\n branding: templateModel.branding ? JSON.parse(JSON.stringify(templateModel.branding)) : {},\n brandingId: null, // brandingId doesn't exist on TemplateByIdModel, using null\n flags: templateModel.flags || [],\n images: {\n main: templateModel.images?.main || null,\n cover: templateModel.images?.cover || null,\n mobile: templateModel.images?.mobile || null,\n },\n status: templateModel.status,\n automaticallyChangeStatus: templateModel.automaticallyChangeStatus || false,\n createdAt: templateModel.createdAt,\n updatedAt: templateModel.updatedAt,\n related: templateModel.related || [],\n adContent: templateModel.adContent || \"\",\n };\n\n return serialized;\n}\n"],"names":[],"mappings":"AAsCA,eAAsB,uBAClB,KACA,YACA,SAG2B;AAE3B,QAAM,gBAAgB,MAAM,IAAI,QAAQ,gBAAgB,YAAY,SAAS,YAAY;AAIzF,QAAM,aAAiC;AAAA,IACnC,IAAI,cAAc;AAAA,IAClB,MAAM,cAAc;AAAA,IACpB,aAAa,cAAc;AAAA,IAC3B,MAAM,cAAc;AAAA,IACpB,UAAU,cAAc;AAAA,IACxB,QAAQ,cAAc;AAAA,IACtB,SAAS,cAAc,WAAW,CAAA;AAAA,IAClC,SAAS,cAAc,WAAW,CAAA;AAAA,IAClC,UAAU,cAAc,YAAY,CAAA;AAAA,IACpC,SAAS,cAAc,UAAU,CAAA,GAAI,IAAI,CAAC,WAAW;AAAA,MACjD,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,OAAO,MAAM,SAAS,CAAA;AAAA,MACtB,SAAS;AAAA,QACL,UAAU,MAAM,SAAS,YAAY;AAAA,QACrC,QAAQ,MAAM,SAAS,UAAU;AAAA,QACjC,UAAU,MAAM,SAAS,YAAY,CAAA;AAAA,MAAC;AAAA,IAC1C,EACF;AAAA,IACF,SAAS,cAAc,WAAW,CAAA;AAAA,IAClC,WAAW,cAAc,aAAa,CAAA;AAAA,IACtC,gBAAgB,cAAc,kBAAkB,CAAA;AAAA,IAChD,oBAAoB,cAAc,sBAAsB,CAAA;AAAA,IACxD,OAAO,cAAc,SAAS;AAAA,IAC9B,QAAQ,cAAc,UAAU,CAAA;AAAA,IAChC,cAAc,cAAc,gBAAgB,CAAA;AAAA;AAAA,IAE5C,UAAU,cAAc,WAAW,KAAK,MAAM,KAAK,UAAU,cAAc,QAAQ,CAAC,IAAI,CAAA;AAAA,IACxF,YAAY;AAAA;AAAA,IACZ,OAAO,cAAc,SAAS,CAAA;AAAA,IAC9B,QAAQ;AAAA,MACJ,MAAM,cAAc,QAAQ,QAAQ;AAAA,MACpC,OAAO,cAAc,QAAQ,SAAS;AAAA,MACtC,QAAQ,cAAc,QAAQ,UAAU;AAAA,IAAA;AAAA,IAE5C,QAAQ,cAAc;AAAA,IACtB,2BAA2B,cAAc,6BAA6B;AAAA,IACtE,WAAW,cAAc;AAAA,IACzB,WAAW,cAAc;AAAA,IACzB,SAAS,cAAc,WAAW,CAAA;AAAA,IAClC,WAAW,cAAc,aAAa;AAAA,EAAA;AAG1C,SAAO;AACX;"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
function getMarketTypeEnum(marketType) {
|
|
2
|
+
const marketTypeMap = {
|
|
3
|
+
"1x2": "FT_1X2",
|
|
4
|
+
"12": "FT_1X2",
|
|
5
|
+
OVER_UNDER: "OVER_GOALS_2_5",
|
|
6
|
+
DOUBLE_CHANCE: "DOUBLE_CHANCE",
|
|
7
|
+
BOTH_TO_SCORE: "BOTH_TEAMS_SCORE",
|
|
8
|
+
DRAW_NO_BET: "DRAW_NO_BET",
|
|
9
|
+
FIRST_TEAM_TO_SCORE: "FIRST_TEAM_TO_SCORE",
|
|
10
|
+
CORRECT_SCORE: "CORRECT_SCORE",
|
|
11
|
+
FIRST_HALF_GOALS: "FIRST_HALF_GOALS",
|
|
12
|
+
FIRST_PLAYER_TO_SCORE: "PLAYER_SCORE_FIRST_GOAL",
|
|
13
|
+
PLAYER_TO_SCORE_DURING_GAME: "PLAYER_SCORE",
|
|
14
|
+
PLAYER_TO_RECEIVE_CARD: "PLAYER_YELLOW_CARD",
|
|
15
|
+
FIRST_HALF_AND_FINAL_RESULT: "HT_FT"
|
|
16
|
+
};
|
|
17
|
+
return marketTypeMap[marketType] || marketType.toUpperCase();
|
|
18
|
+
}
|
|
19
|
+
function transformSDKOdds(sdkOddsMap, bookmakerIds) {
|
|
20
|
+
const result = /* @__PURE__ */ new Map();
|
|
21
|
+
sdkOddsMap.forEach((matchOdds, matchId) => {
|
|
22
|
+
if (!matchOdds || matchOdds.length === 0) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const filteredOdds = bookmakerIds ? matchOdds.filter((odd) => odd.bookmaker && bookmakerIds.includes(odd.bookmaker.id)) : matchOdds;
|
|
26
|
+
const operators = filteredOdds.filter((odd) => odd.bookmaker && odd.markets && odd.markets.length > 0).map((odd) => {
|
|
27
|
+
const bookmaker = odd.bookmaker;
|
|
28
|
+
const firstAsset = bookmaker.assets?.[0];
|
|
29
|
+
const backgroundColor = bookmaker.branding?.backgroundColor || firstAsset?.backgroundColor;
|
|
30
|
+
const textColor = bookmaker.branding?.textColor || (isDarkColor(backgroundColor) ? "#FFFFFF" : "#000000");
|
|
31
|
+
const logo = firstAsset?.transparentBackgroundUrl || firstAsset?.logo;
|
|
32
|
+
const operatorUrl = bookmaker.eventUrls?.find((u) => u.appType === "desktop")?.url || bookmaker.links?.find((l) => l.appType === "desktop")?.homepageUrl || bookmaker.url || "";
|
|
33
|
+
return {
|
|
34
|
+
operator: {
|
|
35
|
+
id: bookmaker.id,
|
|
36
|
+
name: bookmaker.name,
|
|
37
|
+
url: operatorUrl,
|
|
38
|
+
branding: {
|
|
39
|
+
backgroundColor,
|
|
40
|
+
textColor,
|
|
41
|
+
logo
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
type: odd.type,
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
markets: odd.markets.map((market) => ({
|
|
47
|
+
type: {
|
|
48
|
+
id: market.type.id,
|
|
49
|
+
code: market.type.code,
|
|
50
|
+
name: market.type.name
|
|
51
|
+
},
|
|
52
|
+
period: {
|
|
53
|
+
id: market.scope.id,
|
|
54
|
+
type: market.scope.type,
|
|
55
|
+
name: market.scope.name
|
|
56
|
+
},
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
58
|
+
selections: market.selections.map((selection) => {
|
|
59
|
+
const selectionUrl = selection.urls?.find((u) => u.appType === "desktop")?.url;
|
|
60
|
+
let movement = "NONE";
|
|
61
|
+
if (selection.movement === "UP") movement = "UP";
|
|
62
|
+
else if (selection.movement === "DOWN") movement = "DOWN";
|
|
63
|
+
return {
|
|
64
|
+
id: selection.id,
|
|
65
|
+
name: selection.name,
|
|
66
|
+
code: selection.code,
|
|
67
|
+
value: selection.value,
|
|
68
|
+
odds: selection.odds,
|
|
69
|
+
oddsOld: selection.oddsOld,
|
|
70
|
+
movement,
|
|
71
|
+
url: selectionUrl,
|
|
72
|
+
providerSelectionId: selection.providerInfo?.selectionId
|
|
73
|
+
};
|
|
74
|
+
})
|
|
75
|
+
}))
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
result.set(matchId, operators);
|
|
79
|
+
});
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function isDarkColor(hexColor) {
|
|
83
|
+
if (!hexColor) return true;
|
|
84
|
+
const hex = hexColor.replace("#", "");
|
|
85
|
+
const r = parseInt(hex.substring(0, 2), 16);
|
|
86
|
+
const g = parseInt(hex.substring(2, 4), 16);
|
|
87
|
+
const b = parseInt(hex.substring(4, 6), 16);
|
|
88
|
+
const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
|
|
89
|
+
return luminance < 0.5;
|
|
90
|
+
}
|
|
91
|
+
async function getBatchMatchOdds(sdk, matchIds, options) {
|
|
92
|
+
if (!matchIds || matchIds.length === 0) {
|
|
93
|
+
return /* @__PURE__ */ new Map();
|
|
94
|
+
}
|
|
95
|
+
const filters = {
|
|
96
|
+
oddType: options?.oddType || "ALL",
|
|
97
|
+
scopeType: options?.scopeType || "ORDINARY_TIME",
|
|
98
|
+
oddFormat: options?.oddFormat || "DECIMAL"
|
|
99
|
+
};
|
|
100
|
+
if (options?.marketTypes && options.marketTypes.length > 0) {
|
|
101
|
+
filters.marketTypes = options.marketTypes.map((market) => getMarketTypeEnum(market));
|
|
102
|
+
}
|
|
103
|
+
const sdkResponse = await sdk.odds.getByMatchIds(matchIds, filters);
|
|
104
|
+
return transformSDKOdds(sdkResponse, options?.bookmakerIds);
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
getBatchMatchOdds
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=matches.js.map
|