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.
Files changed (242) hide show
  1. package/api/fansunited/constants.js +5 -0
  2. package/api/fansunited/constants.js.map +1 -0
  3. package/api/fansunited/football/competition/index.js +21 -0
  4. package/api/fansunited/football/competition/index.js.map +1 -0
  5. package/api/fansunited/football/competition/transformer.js +41 -0
  6. package/api/fansunited/football/competition/transformer.js.map +1 -0
  7. package/api/fansunited/football/competitions/index.js +56 -0
  8. package/api/fansunited/football/competitions/index.js.map +1 -0
  9. package/api/fansunited/football/competitions/transformer.js +68 -0
  10. package/api/fansunited/football/competitions/transformer.js.map +1 -0
  11. package/api/fansunited/football/http.js +7 -0
  12. package/api/fansunited/football/http.js.map +1 -0
  13. package/api/fansunited/football/matches/index.js +132 -0
  14. package/api/fansunited/football/matches/index.js.map +1 -0
  15. package/api/fansunited/football/matches/transformer.js +148 -0
  16. package/api/fansunited/football/matches/transformer.js.map +1 -0
  17. package/api/fansunited/football/players/index.js +60 -0
  18. package/api/fansunited/football/players/index.js.map +1 -0
  19. package/api/fansunited/football/players/transformer.js +85 -0
  20. package/api/fansunited/football/players/transformer.js.map +1 -0
  21. package/api/fansunited/football/search/index.js +64 -0
  22. package/api/fansunited/football/search/index.js.map +1 -0
  23. package/api/fansunited/football/search/transformer.js +114 -0
  24. package/api/fansunited/football/search/transformer.js.map +1 -0
  25. package/api/fansunited/football/teams/index.js +66 -0
  26. package/api/fansunited/football/teams/index.js.map +1 -0
  27. package/api/fansunited/football/teams/transformer.js +53 -0
  28. package/api/fansunited/football/teams/transformer.js.map +1 -0
  29. package/api/fansunited/http.d.ts.map +1 -1
  30. package/api/fansunited/http.js +70 -0
  31. package/api/fansunited/http.js.map +1 -0
  32. package/api/fansunited/search/constants.js +5 -0
  33. package/api/fansunited/search/constants.js.map +1 -0
  34. package/api/fansunited/search/http.js +7 -0
  35. package/api/fansunited/search/http.js.map +1 -0
  36. package/api/fansunited/search/index.js +308 -0
  37. package/api/fansunited/search/index.js.map +1 -0
  38. package/api/fansunited/search/transformer.js +374 -0
  39. package/api/fansunited/search/transformer.js.map +1 -0
  40. package/api/fansunited-sdk/loyalty/matches.js +21 -0
  41. package/api/fansunited-sdk/loyalty/matches.js.map +1 -0
  42. package/api/fansunited-sdk/loyalty/template.js +52 -0
  43. package/api/fansunited-sdk/loyalty/template.js.map +1 -0
  44. package/api/fansunited-sdk/odds/matches.js +109 -0
  45. package/api/fansunited-sdk/odds/matches.js.map +1 -0
  46. package/api/sportal365-sports/basketball/games/index.js +32 -0
  47. package/api/sportal365-sports/basketball/games/index.js.map +1 -0
  48. package/api/sportal365-sports/basketball/games/transformers/game.js +137 -0
  49. package/api/sportal365-sports/basketball/games/transformers/game.js.map +1 -0
  50. package/api/sportal365-sports/basketball/http.js +7 -0
  51. package/api/sportal365-sports/basketball/http.js.map +1 -0
  52. package/api/sportal365-sports/constants.js +15 -0
  53. package/api/sportal365-sports/constants.js.map +1 -0
  54. package/api/sportal365-sports/football/competitions/index.js +52 -0
  55. package/api/sportal365-sports/football/competitions/index.js.map +1 -0
  56. package/api/sportal365-sports/football/competitions/utils.js +92 -0
  57. package/api/sportal365-sports/football/competitions/utils.js.map +1 -0
  58. package/api/sportal365-sports/football/http.js +7 -0
  59. package/api/sportal365-sports/football/http.js.map +1 -0
  60. package/api/sportal365-sports/football/matches/index.js +206 -0
  61. package/api/sportal365-sports/football/matches/index.js.map +1 -0
  62. package/api/sportal365-sports/football/matches/transformers/commentary.js +27 -0
  63. package/api/sportal365-sports/football/matches/transformers/commentary.js.map +1 -0
  64. package/api/sportal365-sports/football/matches/transformers/lineup.js +74 -0
  65. package/api/sportal365-sports/football/matches/transformers/lineup.js.map +1 -0
  66. package/api/sportal365-sports/football/matches/transformers/match-event.js +60 -0
  67. package/api/sportal365-sports/football/matches/transformers/match-event.js.map +1 -0
  68. package/api/sportal365-sports/football/matches/transformers/match.js +195 -0
  69. package/api/sportal365-sports/football/matches/transformers/match.js.map +1 -0
  70. package/api/sportal365-sports/football/matches/transformers/odds.js +11 -0
  71. package/api/sportal365-sports/football/matches/transformers/odds.js.map +1 -0
  72. package/api/sportal365-sports/football/matches/transformers/statistics.js +41 -0
  73. package/api/sportal365-sports/football/matches/transformers/statistics.js.map +1 -0
  74. package/api/sportal365-sports/football/search/index.js +42 -0
  75. package/api/sportal365-sports/football/search/index.js.map +1 -0
  76. package/api/sportal365-sports/football/search/search.transformer.js +166 -0
  77. package/api/sportal365-sports/football/search/search.transformer.js.map +1 -0
  78. package/api/sportal365-sports/football/standings/index.js +28 -0
  79. package/api/sportal365-sports/football/standings/index.js.map +1 -0
  80. package/api/sportal365-sports/football/standings/standing.transformer.js +107 -0
  81. package/api/sportal365-sports/football/standings/standing.transformer.js.map +1 -0
  82. package/api/sportal365-sports/football/statistics/index.js +154 -0
  83. package/api/sportal365-sports/football/statistics/index.js.map +1 -0
  84. package/api/sportal365-sports/football/statistics/player-career.transformer.js +77 -0
  85. package/api/sportal365-sports/football/statistics/player-career.transformer.js.map +1 -0
  86. package/api/sportal365-sports/football/statistics/player-recent.transformer.js +54 -0
  87. package/api/sportal365-sports/football/statistics/player-recent.transformer.js.map +1 -0
  88. package/api/sportal365-sports/football/statistics/player-season.transformer.js +147 -0
  89. package/api/sportal365-sports/football/statistics/player-season.transformer.js.map +1 -0
  90. package/api/sportal365-sports/football/teams/index.js +73 -0
  91. package/api/sportal365-sports/football/teams/index.js.map +1 -0
  92. package/api/sportal365-sports/football/teams/utils.js +196 -0
  93. package/api/sportal365-sports/football/teams/utils.js.map +1 -0
  94. package/api/sportal365-sports/http.js +58 -0
  95. package/api/sportal365-sports/http.js.map +1 -0
  96. package/api/sportal365-sports/search/http.js +7 -0
  97. package/api/sportal365-sports/search/http.js.map +1 -0
  98. package/api/sportal365-sports/search/index.js +61 -0
  99. package/api/sportal365-sports/search/index.js.map +1 -0
  100. package/api/sportal365-sports/search/search.transformer.js +254 -0
  101. package/api/sportal365-sports/search/search.transformer.js.map +1 -0
  102. package/api/sportal365-sports/shared/odds.transformer.js +65 -0
  103. package/api/sportal365-sports/shared/odds.transformer.js.map +1 -0
  104. package/api/sportal365-sports/shared/providerRef.helper.js +31 -0
  105. package/api/sportal365-sports/shared/providerRef.helper.js.map +1 -0
  106. package/api/sportal365-sports/standings/http.js +7 -0
  107. package/api/sportal365-sports/standings/http.js.map +1 -0
  108. package/api/sportal365-sports/standings/index.js +29 -0
  109. package/api/sportal365-sports/standings/index.js.map +1 -0
  110. package/api/sportal365-sports/standings/standing.transformer.js +185 -0
  111. package/api/sportal365-sports/standings/standing.transformer.js.map +1 -0
  112. package/api/sportal365-sports/statistics/http.js +7 -0
  113. package/api/sportal365-sports/statistics/http.js.map +1 -0
  114. package/api/sportal365-sports/statistics/index.js +25 -0
  115. package/api/sportal365-sports/statistics/index.js.map +1 -0
  116. package/api/sportal365-sports/statistics/team-stats.transformer.js +16 -0
  117. package/api/sportal365-sports/statistics/team-stats.transformer.js.map +1 -0
  118. package/api/sportal365-sports/tennis/http.js +7 -0
  119. package/api/sportal365-sports/tennis/http.js.map +1 -0
  120. package/api/sportal365-sports/tennis/matches/index.js +34 -0
  121. package/api/sportal365-sports/tennis/matches/index.js.map +1 -0
  122. package/api/sportal365-sports/tennis/matches/transformers/match.js +193 -0
  123. package/api/sportal365-sports/tennis/matches/transformers/match.js.map +1 -0
  124. package/cache/cache-manager.js +136 -0
  125. package/cache/cache-manager.js.map +1 -0
  126. package/cache/memory-store.js +29 -0
  127. package/cache/memory-store.js.map +1 -0
  128. package/client.js +38 -12337
  129. package/client.js.map +1 -0
  130. package/config/index.js +20 -0
  131. package/config/index.js.map +1 -0
  132. package/fansunited-data-layer.js +146 -3553
  133. package/fansunited-data-layer.js.map +1 -0
  134. package/helpers/competition.helpers.js +11 -0
  135. package/helpers/competition.helpers.js.map +1 -0
  136. package/helpers/player.helpers.js +165 -0
  137. package/helpers/player.helpers.js.map +1 -0
  138. package/helpers/player.hooks.js +34 -0
  139. package/helpers/player.hooks.js.map +1 -0
  140. package/helpers/team.helpers.js +216 -0
  141. package/helpers/team.helpers.js.map +1 -0
  142. package/package.json +6 -8
  143. package/providers/competition/hooks/useCompetitionStats.js +10 -0
  144. package/providers/competition/hooks/useCompetitionStats.js.map +1 -0
  145. package/providers/competition/hooks/useGoalDistribution.js +23 -0
  146. package/providers/competition/hooks/useGoalDistribution.js.map +1 -0
  147. package/providers/competition/hooks/useMatchHelpers.js +85 -0
  148. package/providers/competition/hooks/useMatchHelpers.js.map +1 -0
  149. package/providers/competition/hooks/useStandingsCalculations.js +89 -0
  150. package/providers/competition/hooks/useStandingsCalculations.js.map +1 -0
  151. package/providers/competition/hooks/useStandingsHelpers.js +61 -0
  152. package/providers/competition/hooks/useStandingsHelpers.js.map +1 -0
  153. package/providers/competition/hooks/useTeamPosition.js +15 -0
  154. package/providers/competition/hooks/useTeamPosition.js.map +1 -0
  155. package/providers/competition/hooks/useTeamResultsTable.js +86 -0
  156. package/providers/competition/hooks/useTeamResultsTable.js.map +1 -0
  157. package/providers/competition/utils/competitionStats.js +109 -0
  158. package/providers/competition/utils/competitionStats.js.map +1 -0
  159. package/providers/competition/utils/goalDistribution.js +64 -0
  160. package/providers/competition/utils/goalDistribution.js.map +1 -0
  161. package/providers/competition/utils/standingsCalculations.js +152 -0
  162. package/providers/competition/utils/standingsCalculations.js.map +1 -0
  163. package/providers/competition.context.js +14 -0
  164. package/providers/competition.context.js.map +1 -0
  165. package/providers/competition.provider.js +187 -0
  166. package/providers/competition.provider.js.map +1 -0
  167. package/providers/fansunited-config.context.js +6 -0
  168. package/providers/fansunited-config.context.js.map +1 -0
  169. package/providers/fansunited-config.hooks.js +20 -0
  170. package/providers/fansunited-config.hooks.js.map +1 -0
  171. package/providers/fansunited-config.provider.js +9 -0
  172. package/providers/fansunited-config.provider.js.map +1 -0
  173. package/providers/fansunited-sdk.hook.js +50 -0
  174. package/providers/fansunited-sdk.hook.js.map +1 -0
  175. package/providers/leaderboard/hooks/useMatchHelpers.js +30 -0
  176. package/providers/leaderboard/hooks/useMatchHelpers.js.map +1 -0
  177. package/providers/leaderboard/hooks/useTemplateHelpers.js +39 -0
  178. package/providers/leaderboard/hooks/useTemplateHelpers.js.map +1 -0
  179. package/providers/leaderboard.context.js +14 -0
  180. package/providers/leaderboard.context.js.map +1 -0
  181. package/providers/leaderboard.provider.js +98 -0
  182. package/providers/leaderboard.provider.js.map +1 -0
  183. package/providers/match/hooks/useBatchMatchOdds.js +72 -0
  184. package/providers/match/hooks/useBatchMatchOdds.js.map +1 -0
  185. package/providers/match/hooks/useEventHelpers.js +46 -0
  186. package/providers/match/hooks/useEventHelpers.js.map +1 -0
  187. package/providers/match/hooks/useHeadToHeadHelpers.js +52 -0
  188. package/providers/match/hooks/useHeadToHeadHelpers.js.map +1 -0
  189. package/providers/match/hooks/useLineupHelpers.js +53 -0
  190. package/providers/match/hooks/useLineupHelpers.js.map +1 -0
  191. package/providers/match/hooks/useMatchStandingsCalculations.js +332 -0
  192. package/providers/match/hooks/useMatchStandingsCalculations.js.map +1 -0
  193. package/providers/match/hooks/useMatchStatus.js +37 -0
  194. package/providers/match/hooks/useMatchStatus.js.map +1 -0
  195. package/providers/match/hooks/useOddsHelpers.js +54 -0
  196. package/providers/match/hooks/useOddsHelpers.js.map +1 -0
  197. package/providers/match/hooks/useScoreHelpers.js +34 -0
  198. package/providers/match/hooks/useScoreHelpers.js.map +1 -0
  199. package/providers/match/hooks/useStandingsHelpers.js +53 -0
  200. package/providers/match/hooks/useStandingsHelpers.js.map +1 -0
  201. package/providers/match/hooks/useStatisticsHelpers.js +40 -0
  202. package/providers/match/hooks/useStatisticsHelpers.js.map +1 -0
  203. package/providers/match/hooks/useTeamHelpers.js +38 -0
  204. package/providers/match/hooks/useTeamHelpers.js.map +1 -0
  205. package/providers/match/hooks/useTeamStatsHelpers.js +141 -0
  206. package/providers/match/hooks/useTeamStatsHelpers.js.map +1 -0
  207. package/providers/match.context.js +14 -0
  208. package/providers/match.context.js.map +1 -0
  209. package/providers/match.provider.js +176 -0
  210. package/providers/match.provider.js.map +1 -0
  211. package/providers/team/hooks/useFormStats.js +116 -0
  212. package/providers/team/hooks/useFormStats.js.map +1 -0
  213. package/providers/team/hooks/useMatchHelpers.js +46 -0
  214. package/providers/team/hooks/useMatchHelpers.js.map +1 -0
  215. package/providers/team/hooks/useSquadHelpers.js +67 -0
  216. package/providers/team/hooks/useSquadHelpers.js.map +1 -0
  217. package/providers/team.context.js +14 -0
  218. package/providers/team.context.js.map +1 -0
  219. package/providers/team.provider.js +98 -0
  220. package/providers/team.provider.js.map +1 -0
  221. package/utilities/stats/core/helpers.js +105 -0
  222. package/utilities/stats/core/helpers.js.map +1 -0
  223. package/utilities/stats/core/types.js +5 -0
  224. package/utilities/stats/core/types.js.map +1 -0
  225. package/utilities/stats/match/headToHead.js +83 -0
  226. package/utilities/stats/match/headToHead.js.map +1 -0
  227. package/utilities/stats/match/homeVsAway.js +140 -0
  228. package/utilities/stats/match/homeVsAway.js.map +1 -0
  229. package/utilities/stats/match/overUnder.js +91 -0
  230. package/utilities/stats/match/overUnder.js.map +1 -0
  231. package/utilities/stats/match/result.js +21 -0
  232. package/utilities/stats/match/result.js.map +1 -0
  233. package/utilities/stats/team/commonOpponents.js +77 -0
  234. package/utilities/stats/team/commonOpponents.js.map +1 -0
  235. package/utilities/stats/team/goalStats.js +50 -0
  236. package/utilities/stats/team/goalStats.js.map +1 -0
  237. package/utilities/stats/team/streaks.js +183 -0
  238. package/utilities/stats/team/streaks.js.map +1 -0
  239. package/client.cjs +0 -8
  240. package/fansunited-data-layer.cjs +0 -1
  241. package/matches-BvHU-bP0.js +0 -1795
  242. package/matches-Ci0Ci_Mw.cjs +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/fansunited/football/players/index.ts"],"sourcesContent":["/**\n * Football player endpoints for Fans United Football API\n */\n\nimport type { FUSportsPlayerCompetitor } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type {\n GetFootballPlayerOptions,\n GetFootballPlayersOptions,\n RawPlayerResponse,\n RawPlayersResponse,\n} from \"./types\";\nimport { transformPlayer, transformPlayers } from \"./transformer\";\n\n// Re-export types\nexport type { GetFootballPlayerOptions, GetFootballPlayersOptions } from \"./types\";\n\n/**\n * Get a football player by ID from Fans United Football API\n *\n * @param playerId - The player ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Player in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballPlayer } from 'fansunited-data-layer';\n *\n * // Get player by ID\n * const player = await getFansUnitedFootballPlayer('456', {\n * lang: 'EN'\n * });\n *\n * console.log(player.name); // \"Cristiano Ronaldo\"\n * console.log(player.position); // \"Forward\"\n * ```\n */\nexport async function getFansUnitedFootballPlayer(\n playerId: string,\n options?: GetFootballPlayerOptions,\n config?: DataLayerConfig\n): Promise<FUSportsPlayerCompetitor> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawPlayerResponse>({\n path: `/v1/players/${playerId}`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformPlayer(raw);\n}\n\n/**\n * Get multiple football players from Fans United Football API\n *\n * @param options - Query options for filtering, sorting, and pagination\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Array of players in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballPlayers } from 'fansunited-data-layer';\n *\n * // Get players by IDs\n * const players = await getFansUnitedFootballPlayers({\n * playerIds: 'fb:p:14378,fb:p:563214',\n * lang: 'EN'\n * });\n *\n * // Get players from a specific competition\n * const competitionPlayers = await getFansUnitedFootballPlayers({\n * scope: 'fb:c:478,fb:c:479',\n * limit: 50,\n * sortField: 'name',\n * sortOrder: 'asc'\n * });\n *\n * // Search players by name\n * const searchResults = await getFansUnitedFootballPlayers({\n * name: 'Ronaldo',\n * limit: 10\n * });\n * ```\n */\nexport async function getFansUnitedFootballPlayers(\n options?: GetFootballPlayersOptions,\n config?: DataLayerConfig\n): Promise<FUSportsPlayerCompetitor[]> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n // Add filter parameters\n if (options?.playerIds) {\n params.player_ids = options.playerIds;\n }\n if (options?.countryId) {\n params.country_id = options.countryId;\n }\n if (options?.name) {\n params.name = options.name;\n }\n if (options?.scope) {\n params.scope = options.scope;\n }\n\n // Add pagination parameters\n if (options?.limit !== undefined) {\n params.limit = String(options.limit);\n }\n if (options?.page !== undefined) {\n params.page = String(options.page);\n }\n\n // Add sorting parameters\n if (options?.sortField) {\n params.sort_field = options.sortField;\n }\n if (options?.sortOrder) {\n params.sort_order = options.sortOrder;\n }\n\n const raw = await footballHttp.get<RawPlayersResponse>({\n path: \"/v1/players\",\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformPlayers(raw);\n}\n"],"names":[],"mappings":";;;AAuCA,eAAsB,4BAClB,UACA,SACA,QACiC;AACjC,QAAM,cAAc,UAAU,UAAA;AAE9B,QAAM,SAA6C,CAAA;AAGnD,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AAEA,QAAM,MAAM,MAAM,aAAa,IAAuB;AAAA,IAClD,MAAM,eAAe,QAAQ;AAAA,IAC7B;AAAA,IACA,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,gBAAgB,GAAG;AAC9B;AAkCA,eAAsB,6BAClB,SACA,QACmC;AACnC,QAAM,cAAc,UAAU,UAAA;AAE9B,QAAM,SAA6C,CAAA;AAGnD,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AAGA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AACA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AACA,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AACA,MAAI,SAAS,OAAO;AAChB,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAGA,MAAI,SAAS,UAAU,QAAW;AAC9B,WAAO,QAAQ,OAAO,QAAQ,KAAK;AAAA,EACvC;AACA,MAAI,SAAS,SAAS,QAAW;AAC7B,WAAO,OAAO,OAAO,QAAQ,IAAI;AAAA,EACrC;AAGA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AACA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AAEA,QAAM,MAAM,MAAM,aAAa,IAAwB;AAAA,IACnD,MAAM;AAAA,IACN;AAAA,IACA,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,iBAAiB,GAAG;AAC/B;"}
@@ -0,0 +1,85 @@
1
+ function transformCountry(raw) {
2
+ return {
3
+ id: raw.id,
4
+ name: raw.name,
5
+ code: raw.country_code,
6
+ flag: raw.assets?.flag,
7
+ providerRef: [
8
+ {
9
+ provider: "fansunited",
10
+ id: raw.id
11
+ }
12
+ ]
13
+ };
14
+ }
15
+ function transformTeam(raw) {
16
+ return {
17
+ id: raw.id,
18
+ name: raw.name,
19
+ shortName: raw.short_name ?? void 0,
20
+ fullName: raw.full_name ?? void 0,
21
+ threeLetterCode: raw.code,
22
+ type: raw.national ? "national" : "club",
23
+ gender: raw.gender?.toUpperCase(),
24
+ country: raw.country ? transformCountry(raw.country) : void 0,
25
+ assets: raw.assets?.logo ? {
26
+ logo: raw.assets.logo
27
+ } : void 0,
28
+ providerRef: [
29
+ {
30
+ provider: "fansunited",
31
+ id: raw.id
32
+ }
33
+ ]
34
+ };
35
+ }
36
+ function transformCompetition(raw) {
37
+ return {
38
+ id: raw.id,
39
+ name: raw.name,
40
+ type: raw.type?.toUpperCase() || "LEAGUE",
41
+ gender: raw.gender?.toUpperCase(),
42
+ country: raw.country ? transformCountry(raw.country) : void 0,
43
+ assets: raw.assets?.logo ? {
44
+ logo: raw.assets.logo
45
+ } : void 0,
46
+ providerRef: [
47
+ {
48
+ provider: "fansunited",
49
+ id: raw.id
50
+ }
51
+ ]
52
+ };
53
+ }
54
+ function transformPlayerData(raw) {
55
+ return {
56
+ type: "player",
57
+ id: raw.id,
58
+ name: raw.name,
59
+ position: raw.position,
60
+ birthdate: raw.birth_date,
61
+ country: raw.country ? transformCountry(raw.country) : void 0,
62
+ assets: raw.assets?.headshot ? {
63
+ photo: raw.assets.headshot
64
+ } : void 0,
65
+ teams: raw.teams?.map(transformTeam),
66
+ competitions: raw.competitions?.map(transformCompetition),
67
+ providerRef: [
68
+ {
69
+ provider: "fansunited",
70
+ id: raw.id
71
+ }
72
+ ]
73
+ };
74
+ }
75
+ function transformPlayer(raw) {
76
+ return transformPlayerData(raw.data);
77
+ }
78
+ function transformPlayers(raw) {
79
+ return raw.data.map(transformPlayerData);
80
+ }
81
+ export {
82
+ transformPlayer,
83
+ transformPlayers
84
+ };
85
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../../../../src/lib/api/fansunited/football/players/transformer.ts"],"sourcesContent":["/**\n * Transform raw player data to canonical FUSports types\n */\n\nimport type {\n FUSportsPlayerCompetitor,\n FUSportsTeamCompetitor,\n FUSportsCompetition,\n} from \"../../../../types/canonical\";\nimport type { RawPlayerResponse, RawPlayersResponse, RawPlayer, RawCountry, RawTeam, RawCompetition } from \"./types\";\n\n/**\n * Transform raw country to canonical format\n */\nfunction transformCountry(raw: RawCountry) {\n return {\n id: raw.id,\n name: raw.name,\n code: raw.country_code,\n flag: raw.assets?.flag,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw team to canonical FUSportsTeamCompetitor\n */\nfunction transformTeam(raw: RawTeam): FUSportsTeamCompetitor {\n return {\n id: raw.id,\n name: raw.name,\n shortName: raw.short_name ?? undefined,\n fullName: raw.full_name ?? undefined,\n threeLetterCode: raw.code,\n type: raw.national ? \"national\" : \"club\",\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw competition to canonical FUSportsCompetition\n */\nfunction transformCompetition(raw: RawCompetition): FUSportsCompetition {\n return {\n id: raw.id,\n name: raw.name,\n type: (raw.type?.toUpperCase() as \"LEAGUE\" | \"CUP\" | \"TOURNAMENT\" | \"FRIENDLY\" | undefined) || \"LEAGUE\",\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw player data to canonical FUSportsPlayerCompetitor\n */\nfunction transformPlayerData(raw: RawPlayer): FUSportsPlayerCompetitor {\n return {\n type: \"player\",\n id: raw.id,\n name: raw.name,\n position: raw.position,\n birthdate: raw.birth_date,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.headshot\n ? {\n photo: raw.assets.headshot,\n }\n : undefined,\n teams: raw.teams?.map(transformTeam),\n competitions: raw.competitions?.map(transformCompetition),\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw player response to canonical FUSportsPlayerCompetitor\n */\nexport function transformPlayer(raw: RawPlayerResponse): FUSportsPlayerCompetitor {\n return transformPlayerData(raw.data);\n}\n\n/**\n * Transform raw players response to array of canonical FUSportsPlayerCompetitor\n */\nexport function transformPlayers(raw: RawPlayersResponse): FUSportsPlayerCompetitor[] {\n return raw.data.map(transformPlayerData);\n}\n"],"names":[],"mappings":"AAcA,SAAS,iBAAiB,KAAiB;AACvC,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,MAAM,IAAI,QAAQ;AAAA,IAClB,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,cAAc,KAAsC;AACzD,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,WAAW,IAAI,cAAc;AAAA,IAC7B,UAAU,IAAI,aAAa;AAAA,IAC3B,iBAAiB,IAAI;AAAA,IACrB,MAAM,IAAI,WAAW,aAAa;AAAA,IAClC,QAAQ,IAAI,QAAQ,YAAA;AAAA,IACpB,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,qBAAqB,KAA0C;AACpE,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAO,IAAI,MAAM,YAAA,KAA8E;AAAA,IAC/F,QAAQ,IAAI,QAAQ,YAAA;AAAA,IACpB,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,oBAAoB,KAA0C;AACnE,SAAO;AAAA,IACH,MAAM;AAAA,IACN,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,IACf,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,WACd;AAAA,MACI,OAAO,IAAI,OAAO;AAAA,IAAA,IAEtB;AAAA,IACN,OAAO,IAAI,OAAO,IAAI,aAAa;AAAA,IACnC,cAAc,IAAI,cAAc,IAAI,oBAAoB;AAAA,IACxD,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKO,SAAS,gBAAgB,KAAkD;AAC9E,SAAO,oBAAoB,IAAI,IAAI;AACvC;AAKO,SAAS,iBAAiB,KAAqD;AAClF,SAAO,IAAI,KAAK,IAAI,mBAAmB;AAC3C;"}
@@ -0,0 +1,64 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformSearchResult } from "./transformer.js";
4
+ async function getFansUnitedFootballSearch(options, config) {
5
+ if (!options.query || options.query.trim() === "") {
6
+ return [];
7
+ }
8
+ const finalConfig = config || getConfig();
9
+ const params = {
10
+ q: options.query.trim()
11
+ };
12
+ const entityTypes = options.entityTypes && options.entityTypes.length > 0 ? options.entityTypes : ["competition", "team", "player"];
13
+ const pluralEntities = entityTypes.map((type) => {
14
+ switch (type) {
15
+ case "team":
16
+ return "teams";
17
+ case "player":
18
+ return "players";
19
+ case "competition":
20
+ return "competitions";
21
+ default:
22
+ return type;
23
+ }
24
+ });
25
+ params.entities = pluralEntities.join(",");
26
+ if (options.lang) {
27
+ params.lang = options.lang;
28
+ }
29
+ if (options.limit) {
30
+ params.limit = String(options.limit);
31
+ }
32
+ const raw = await footballHttp.get({
33
+ path: "/v1/search",
34
+ params,
35
+ next: options.next,
36
+ config: finalConfig
37
+ });
38
+ const results = [];
39
+ if (raw.data) {
40
+ if (raw.data.competitions) {
41
+ raw.data.competitions.forEach((competition) => {
42
+ const transformed = transformSearchResult({ ...competition, entity_type: "competition" });
43
+ if (transformed) results.push(transformed);
44
+ });
45
+ }
46
+ if (raw.data.teams) {
47
+ raw.data.teams.forEach((team) => {
48
+ const transformed = transformSearchResult({ ...team, entity_type: "team" });
49
+ if (transformed) results.push(transformed);
50
+ });
51
+ }
52
+ if (raw.data.players) {
53
+ raw.data.players.forEach((player) => {
54
+ const transformed = transformSearchResult({ ...player, entity_type: "player" });
55
+ if (transformed) results.push(transformed);
56
+ });
57
+ }
58
+ }
59
+ return results;
60
+ }
61
+ export {
62
+ getFansUnitedFootballSearch
63
+ };
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/fansunited/football/search/index.ts"],"sourcesContent":["/**\n * Football search endpoints for Fans United Football API\n */\n\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type { GetFootballSearchOptions, RawSearchResponse, FansUnitedFootballSearchResult } from \"./types\";\nimport { transformSearchResult } from \"./transformer\";\n\n// Re-export types\nexport type { GetFootballSearchOptions, SearchEntityType, FansUnitedFootballSearchResult } from \"./types\";\n\n/**\n * Search for football entities (competitions, teams, players)\n *\n * Returns empty array if no query is provided or no results are found.\n * If no entity types are specified, defaults to searching all supported types: teams, players, competitions.\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 Array of wrapped search results with source, entityType, entityId, and entityData\n *\n * @example\n * ```typescript\n * // Search for all entity types (defaults to teams, players, competitions)\n * const results = await getFansUnitedFootballSearch({ query: 'premier' });\n * console.log(`Found ${results.length} results`);\n *\n * // Search only for teams and players\n * const results = await getFansUnitedFootballSearch({\n * query: 'manchester',\n * entityTypes: ['team', 'player']\n * });\n *\n * // Handle results by entity type\n * results.forEach(result => {\n * console.log(`Source: ${result.source}`); // \"FOOTBALL\"\n * console.log(`Entity ID: ${result.entityId}`); // \"fb:t:123\"\n *\n * switch (result.entityType) {\n * case 'player':\n * console.log(`Player: ${result.entityData.name} (${result.entityData.position})`);\n * break;\n * case 'team':\n * console.log(`Team: ${result.entityData.name} (${result.entityData.threeLetterCode})`);\n * break;\n * case 'competition':\n * console.log(`Competition: ${result.entityData.name} (${result.entityData.type})`);\n * break;\n * }\n * });\n * ```\n */\nexport async function getFansUnitedFootballSearch(\n options: GetFootballSearchOptions,\n config?: DataLayerConfig\n): Promise<FansUnitedFootballSearchResult[]> {\n // Return empty results if no query is provided\n if (!options.query || options.query.trim() === \"\") {\n return [];\n }\n\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {\n q: options.query.trim(),\n };\n\n // Add entities parameter\n // If not specified, default to all supported entity types: teams, players, competitions\n // Map singular to plural: team -> teams, player -> players, competition -> competitions\n const entityTypes =\n options.entityTypes && options.entityTypes.length > 0 ? options.entityTypes : [\"competition\", \"team\", \"player\"];\n\n const pluralEntities = entityTypes.map((type) => {\n switch (type) {\n case \"team\":\n return \"teams\";\n case \"player\":\n return \"players\";\n case \"competition\":\n return \"competitions\";\n default:\n return type;\n }\n });\n params.entities = pluralEntities.join(\",\");\n\n // Add optional parameters\n if (options.lang) {\n params.lang = options.lang;\n }\n\n if (options.limit) {\n params.limit = String(options.limit);\n }\n\n const raw = await footballHttp.get<RawSearchResponse>({\n path: \"/v1/search\",\n params,\n next: options.next,\n config: finalConfig,\n });\n\n // The API returns results grouped by entity type: { data: { teams: [...], players: [...], competitions: [...] } }\n // We need to flatten them into a single array\n const results: FansUnitedFootballSearchResult[] = [];\n\n if (raw.data) {\n // Process competitions\n if (raw.data.competitions) {\n raw.data.competitions.forEach((competition) => {\n const transformed = transformSearchResult({ ...competition, entity_type: \"competition\" });\n if (transformed) results.push(transformed);\n });\n }\n\n // Process teams\n if (raw.data.teams) {\n raw.data.teams.forEach((team) => {\n const transformed = transformSearchResult({ ...team, entity_type: \"team\" });\n if (transformed) results.push(transformed);\n });\n }\n\n // Process players\n if (raw.data.players) {\n raw.data.players.forEach((player) => {\n const transformed = transformSearchResult({ ...player, entity_type: \"player\" });\n if (transformed) results.push(transformed);\n });\n }\n }\n\n return results;\n}\n"],"names":[],"mappings":";;;AAqDA,eAAsB,4BAClB,SACA,QACyC;AAEzC,MAAI,CAAC,QAAQ,SAAS,QAAQ,MAAM,KAAA,MAAW,IAAI;AAC/C,WAAO,CAAA;AAAA,EACX;AAEA,QAAM,cAAc,UAAU,UAAA;AAE9B,QAAM,SAA6C;AAAA,IAC/C,GAAG,QAAQ,MAAM,KAAA;AAAA,EAAK;AAM1B,QAAM,cACF,QAAQ,eAAe,QAAQ,YAAY,SAAS,IAAI,QAAQ,cAAc,CAAC,eAAe,QAAQ,QAAQ;AAElH,QAAM,iBAAiB,YAAY,IAAI,CAAC,SAAS;AAC7C,YAAQ,MAAA;AAAA,MACJ,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAO;AAAA,IAAA;AAAA,EAEnB,CAAC;AACD,SAAO,WAAW,eAAe,KAAK,GAAG;AAGzC,MAAI,QAAQ,MAAM;AACd,WAAO,OAAO,QAAQ;AAAA,EAC1B;AAEA,MAAI,QAAQ,OAAO;AACf,WAAO,QAAQ,OAAO,QAAQ,KAAK;AAAA,EACvC;AAEA,QAAM,MAAM,MAAM,aAAa,IAAuB;AAAA,IAClD,MAAM;AAAA,IACN;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,QAAQ;AAAA,EAAA,CACX;AAID,QAAM,UAA4C,CAAA;AAElD,MAAI,IAAI,MAAM;AAEV,QAAI,IAAI,KAAK,cAAc;AACvB,UAAI,KAAK,aAAa,QAAQ,CAAC,gBAAgB;AAC3C,cAAM,cAAc,sBAAsB,EAAE,GAAG,aAAa,aAAa,eAAe;AACxF,YAAI,YAAa,SAAQ,KAAK,WAAW;AAAA,MAC7C,CAAC;AAAA,IACL;AAGA,QAAI,IAAI,KAAK,OAAO;AAChB,UAAI,KAAK,MAAM,QAAQ,CAAC,SAAS;AAC7B,cAAM,cAAc,sBAAsB,EAAE,GAAG,MAAM,aAAa,QAAQ;AAC1E,YAAI,YAAa,SAAQ,KAAK,WAAW;AAAA,MAC7C,CAAC;AAAA,IACL;AAGA,QAAI,IAAI,KAAK,SAAS;AAClB,UAAI,KAAK,QAAQ,QAAQ,CAAC,WAAW;AACjC,cAAM,cAAc,sBAAsB,EAAE,GAAG,QAAQ,aAAa,UAAU;AAC9E,YAAI,YAAa,SAAQ,KAAK,WAAW;AAAA,MAC7C,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,SAAO;AACX;"}
@@ -0,0 +1,114 @@
1
+ function transformCountry(raw) {
2
+ return {
3
+ id: raw.id,
4
+ name: raw.name,
5
+ code: raw.country_code,
6
+ flag: raw.assets?.flag || void 0,
7
+ providerRef: [
8
+ {
9
+ provider: "fansunited",
10
+ id: raw.id
11
+ }
12
+ ]
13
+ };
14
+ }
15
+ function transformCompetition(raw) {
16
+ return {
17
+ id: raw.id,
18
+ name: raw.name,
19
+ shortName: raw.short_name || void 0,
20
+ type: raw.type || "LEAGUE",
21
+ region: raw.region,
22
+ gender: raw.gender?.toUpperCase(),
23
+ country: raw.country ? transformCountry(raw.country) : void 0,
24
+ assets: raw.assets?.logo ? {
25
+ logo: raw.assets.logo
26
+ } : void 0,
27
+ providerRef: [
28
+ {
29
+ provider: "fansunited",
30
+ id: raw.id
31
+ }
32
+ ]
33
+ };
34
+ }
35
+ function transformPlayer(raw) {
36
+ return {
37
+ type: "player",
38
+ id: raw.id,
39
+ name: raw.name,
40
+ position: raw.position || void 0,
41
+ gender: raw.gender?.toUpperCase(),
42
+ birthdate: raw.birth_date || void 0,
43
+ country: raw.country ? transformCountry(raw.country) : void 0,
44
+ assets: raw.assets?.headshot ? {
45
+ photo: raw.assets.headshot
46
+ } : void 0,
47
+ providerRef: [
48
+ {
49
+ provider: "fansunited",
50
+ id: raw.id
51
+ }
52
+ ]
53
+ };
54
+ }
55
+ function transformTeam(raw) {
56
+ return {
57
+ type: raw.national ? "national" : "club",
58
+ id: raw.id,
59
+ name: raw.name,
60
+ shortName: raw.short_name || void 0,
61
+ threeLetterCode: raw.code || void 0,
62
+ gender: raw.gender?.toUpperCase(),
63
+ country: raw.country ? transformCountry(raw.country) : void 0,
64
+ assets: raw.assets?.logo ? {
65
+ logo: raw.assets.logo
66
+ } : void 0,
67
+ providerRef: [
68
+ {
69
+ provider: "fansunited",
70
+ id: raw.id
71
+ }
72
+ ]
73
+ };
74
+ }
75
+ function transformSearchResult(raw) {
76
+ switch (raw.entity_type) {
77
+ case "competition": {
78
+ const entityData = transformCompetition(raw);
79
+ return {
80
+ source: "FOOTBALL",
81
+ entityType: "competition",
82
+ entityId: raw.id,
83
+ entityData
84
+ };
85
+ }
86
+ case "player": {
87
+ const entityData = transformPlayer(raw);
88
+ return {
89
+ source: "FOOTBALL",
90
+ entityType: "player",
91
+ entityId: raw.id,
92
+ entityData
93
+ };
94
+ }
95
+ case "team": {
96
+ const entityData = transformTeam(raw);
97
+ return {
98
+ source: "FOOTBALL",
99
+ entityType: "team",
100
+ entityId: raw.id,
101
+ entityData
102
+ };
103
+ }
104
+ case "venue":
105
+ case "coach":
106
+ return null;
107
+ default:
108
+ throw new Error(`Unknown entity type: ${raw.entity_type}`);
109
+ }
110
+ }
111
+ export {
112
+ transformSearchResult
113
+ };
114
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../../../../src/lib/api/fansunited/football/search/transformer.ts"],"sourcesContent":["/**\n * Transform raw search results to canonical FUSports types\n */\n\nimport type {\n FUSportsCompetition,\n FUSportsTeamCompetitor,\n FUSportsPlayerCompetitor,\n} from \"../../../../types/canonical\";\nimport type {\n RawSearchResult,\n RawSearchCompetition,\n RawSearchPlayer,\n RawSearchTeam,\n RawSearchCountry,\n FansUnitedFootballSearchResult,\n} from \"./types\";\n\n/**\n * Transform raw country to canonical format\n */\nfunction transformCountry(raw: RawSearchCountry) {\n return {\n id: raw.id,\n name: raw.name,\n code: raw.country_code,\n flag: raw.assets?.flag || undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw competition search result to FUSportsCompetition\n */\nfunction transformCompetition(raw: RawSearchCompetition): FUSportsCompetition {\n return {\n id: raw.id,\n name: raw.name,\n shortName: raw.short_name || undefined,\n type: raw.type || \"LEAGUE\",\n region: raw.region,\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw player search result to FUSportsPlayerCompetitor\n */\nfunction transformPlayer(raw: RawSearchPlayer): FUSportsPlayerCompetitor {\n return {\n type: \"player\" as const,\n id: raw.id,\n name: raw.name,\n position: raw.position || undefined,\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | \"MIXED\" | undefined,\n birthdate: raw.birth_date || undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.headshot\n ? {\n photo: raw.assets.headshot,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw team search result to FUSportsTeamCompetitor\n */\nfunction transformTeam(raw: RawSearchTeam): FUSportsTeamCompetitor {\n return {\n type: raw.national ? (\"national\" as const) : (\"club\" as const),\n id: raw.id,\n name: raw.name,\n shortName: raw.short_name || undefined,\n threeLetterCode: raw.code || undefined,\n gender: raw.gender?.toUpperCase() as \"MALE\" | \"FEMALE\" | \"MIXED\" | undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\" as const,\n id: raw.id,\n },\n ],\n };\n}\n\n// Note: transformVenue and transformCoach are not implemented\n// because the API currently only supports searching for teams, players, and competitions\n\n/**\n * Transform raw search result to wrapped canonical type with source and entity info\n * Note: Currently only supports competition, team, and player entity types\n */\nexport function transformSearchResult(raw: RawSearchResult): FansUnitedFootballSearchResult | null {\n switch (raw.entity_type) {\n case \"competition\": {\n const entityData = transformCompetition(raw);\n return {\n source: \"FOOTBALL\",\n entityType: \"competition\",\n entityId: raw.id,\n entityData,\n };\n }\n case \"player\": {\n const entityData = transformPlayer(raw);\n return {\n source: \"FOOTBALL\",\n entityType: \"player\",\n entityId: raw.id,\n entityData,\n };\n }\n case \"team\": {\n const entityData = transformTeam(raw);\n return {\n source: \"FOOTBALL\",\n entityType: \"team\",\n entityId: raw.id,\n entityData,\n };\n }\n case \"venue\":\n case \"coach\":\n // These entity types are not currently supported in search results\n // Return null to filter them out\n return null;\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":"AAqBA,SAAS,iBAAiB,KAAuB;AAC7C,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,MAAM,IAAI,QAAQ,QAAQ;AAAA,IAC1B,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,qBAAqB,KAAgD;AAC1E,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,WAAW,IAAI,cAAc;AAAA,IAC7B,MAAM,IAAI,QAAQ;AAAA,IAClB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,QAAQ,YAAA;AAAA,IACpB,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,gBAAgB,KAAgD;AACrE,SAAO;AAAA,IACH,MAAM;AAAA,IACN,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,UAAU,IAAI,YAAY;AAAA,IAC1B,QAAQ,IAAI,QAAQ,YAAA;AAAA,IACpB,WAAW,IAAI,cAAc;AAAA,IAC7B,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,WACd;AAAA,MACI,OAAO,IAAI,OAAO;AAAA,IAAA,IAEtB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,cAAc,KAA4C;AAC/D,SAAO;AAAA,IACH,MAAM,IAAI,WAAY,aAAwB;AAAA,IAC9C,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,WAAW,IAAI,cAAc;AAAA,IAC7B,iBAAiB,IAAI,QAAQ;AAAA,IAC7B,QAAQ,IAAI,QAAQ,YAAA;AAAA,IACpB,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AASO,SAAS,sBAAsB,KAA6D;AAC/F,UAAQ,IAAI,aAAA;AAAA,IACR,KAAK,eAAe;AAChB,YAAM,aAAa,qBAAqB,GAAG;AAC3C,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,UAAU,IAAI;AAAA,QACd;AAAA,MAAA;AAAA,IAER;AAAA,IACA,KAAK,UAAU;AACX,YAAM,aAAa,gBAAgB,GAAG;AACtC,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,UAAU,IAAI;AAAA,QACd;AAAA,MAAA;AAAA,IAER;AAAA,IACA,KAAK,QAAQ;AACT,YAAM,aAAa,cAAc,GAAG;AACpC,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,UAAU,IAAI;AAAA,QACd;AAAA,MAAA;AAAA,IAER;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAGD,aAAO;AAAA,IACX;AAEI,YAAM,IAAI,MAAM,wBAAyB,IAAwB,WAAW,EAAE;AAAA,EAAA;AAE1F;"}
@@ -0,0 +1,66 @@
1
+ import { getConfig } from "../../../../config/index.js";
2
+ import { footballHttp } from "../http.js";
3
+ import { transformTeam, transformTeams } from "./transformer.js";
4
+ async function getFansUnitedFootballTeam(teamId, options, config) {
5
+ const finalConfig = config || getConfig();
6
+ const params = {};
7
+ if (options?.lang) {
8
+ params.lang = options.lang;
9
+ }
10
+ const raw = await footballHttp.get({
11
+ path: `/v1/teams/${teamId}`,
12
+ params,
13
+ next: options?.next,
14
+ config: finalConfig
15
+ });
16
+ return transformTeam(raw);
17
+ }
18
+ async function getFansUnitedFootballTeams(options, config) {
19
+ const finalConfig = config || getConfig();
20
+ const params = {};
21
+ if (options?.lang) {
22
+ params.lang = options.lang;
23
+ }
24
+ if (options?.teamIds) {
25
+ params.team_ids = options.teamIds;
26
+ }
27
+ if (options?.countryId) {
28
+ params.country_id = options.countryId;
29
+ }
30
+ if (options?.name) {
31
+ params.name = options.name;
32
+ }
33
+ if (options?.scope) {
34
+ params.scope = options.scope;
35
+ }
36
+ if (options?.national !== void 0) {
37
+ params.national = String(options.national);
38
+ }
39
+ if (options?.gender) {
40
+ params.gender = options.gender;
41
+ }
42
+ if (options?.limit !== void 0) {
43
+ params.limit = String(options.limit);
44
+ }
45
+ if (options?.page !== void 0) {
46
+ params.page = String(options.page);
47
+ }
48
+ if (options?.sortField) {
49
+ params.sort_field = options.sortField;
50
+ }
51
+ if (options?.sortOrder) {
52
+ params.sort_order = options.sortOrder;
53
+ }
54
+ const raw = await footballHttp.get({
55
+ path: "/v1/teams",
56
+ params,
57
+ next: options?.next,
58
+ config: finalConfig
59
+ });
60
+ return transformTeams(raw);
61
+ }
62
+ export {
63
+ getFansUnitedFootballTeam,
64
+ getFansUnitedFootballTeams
65
+ };
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/lib/api/fansunited/football/teams/index.ts"],"sourcesContent":["/**\n * Football team endpoints for Fans United Football API\n */\n\nimport type { FUSportsTeamCompetitor } from \"../../../../types/canonical\";\nimport { getConfig, type DataLayerConfig } from \"../../../../config\";\nimport { footballHttp } from \"../http\";\nimport type { GetFootballTeamOptions, GetFootballTeamsOptions, RawTeamResponse, RawTeamsResponse } from \"./types\";\nimport { transformTeam, transformTeams } from \"./transformer\";\n\n// Re-export types\nexport type { GetFootballTeamOptions, GetFootballTeamsOptions } from \"./types\";\n\n/**\n * Get a football team by ID from Fans United Football API\n *\n * @param teamId - The team ID\n * @param options - Query options\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Team in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballTeam } from 'fansunited-data-layer';\n *\n * // Get team by ID\n * const team = await getFansUnitedFootballTeam('123', {\n * lang: 'EN'\n * });\n *\n * console.log(team.name); // \"Manchester United\"\n * console.log(team.threeLetterCode); // \"MUN\"\n * ```\n */\nexport async function getFansUnitedFootballTeam(\n teamId: string,\n options?: GetFootballTeamOptions,\n config?: DataLayerConfig\n): Promise<FUSportsTeamCompetitor> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n const raw = await footballHttp.get<RawTeamResponse>({\n path: `/v1/teams/${teamId}`,\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformTeam(raw);\n}\n\n/**\n * Get multiple football teams from Fans United Football API\n *\n * @param options - Query options for filtering, sorting, and pagination\n * @param config - Optional data layer config (uses singleton if not provided)\n * @returns Array of teams in canonical format\n *\n * @example\n * ```typescript\n * import { getFansUnitedFootballTeams } from 'fansunited-data-layer';\n *\n * // Get teams by IDs\n * const teams = await getFansUnitedFootballTeams({\n * teamIds: 'fb:t:8102,fb:t:8104',\n * lang: 'EN'\n * });\n *\n * // Get teams from a specific competition\n * const competitionTeams = await getFansUnitedFootballTeams({\n * scope: 'fb:c:478',\n * limit: 50,\n * sortField: 'name',\n * sortOrder: 'asc'\n * });\n *\n * // Search teams by name\n * const searchResults = await getFansUnitedFootballTeams({\n * name: 'Manchester',\n * limit: 10\n * });\n *\n * // Get only national teams\n * const nationalTeams = await getFansUnitedFootballTeams({\n * national: true,\n * gender: 'male',\n * sortField: 'name',\n * sortOrder: 'asc'\n * });\n * ```\n */\nexport async function getFansUnitedFootballTeams(\n options?: GetFootballTeamsOptions,\n config?: DataLayerConfig\n): Promise<FUSportsTeamCompetitor[]> {\n const finalConfig = config || getConfig();\n\n const params: Record<string, string | undefined> = {};\n\n // Add language parameter\n if (options?.lang) {\n params.lang = options.lang;\n }\n\n // Add filter parameters\n if (options?.teamIds) {\n params.team_ids = options.teamIds;\n }\n if (options?.countryId) {\n params.country_id = options.countryId;\n }\n if (options?.name) {\n params.name = options.name;\n }\n if (options?.scope) {\n params.scope = options.scope;\n }\n if (options?.national !== undefined) {\n params.national = String(options.national);\n }\n if (options?.gender) {\n params.gender = options.gender;\n }\n\n // Add pagination parameters\n if (options?.limit !== undefined) {\n params.limit = String(options.limit);\n }\n if (options?.page !== undefined) {\n params.page = String(options.page);\n }\n\n // Add sorting parameters\n if (options?.sortField) {\n params.sort_field = options.sortField;\n }\n if (options?.sortOrder) {\n params.sort_order = options.sortOrder;\n }\n\n const raw = await footballHttp.get<RawTeamsResponse>({\n path: \"/v1/teams\",\n params,\n next: options?.next,\n config: finalConfig,\n });\n\n return transformTeams(raw);\n}\n"],"names":[],"mappings":";;;AAkCA,eAAsB,0BAClB,QACA,SACA,QAC+B;AAC/B,QAAM,cAAc,UAAU,UAAA;AAE9B,QAAM,SAA6C,CAAA;AAGnD,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AAEA,QAAM,MAAM,MAAM,aAAa,IAAqB;AAAA,IAChD,MAAM,aAAa,MAAM;AAAA,IACzB;AAAA,IACA,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,cAAc,GAAG;AAC5B;AA0CA,eAAsB,2BAClB,SACA,QACiC;AACjC,QAAM,cAAc,UAAU,UAAA;AAE9B,QAAM,SAA6C,CAAA;AAGnD,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AAGA,MAAI,SAAS,SAAS;AAClB,WAAO,WAAW,QAAQ;AAAA,EAC9B;AACA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AACA,MAAI,SAAS,MAAM;AACf,WAAO,OAAO,QAAQ;AAAA,EAC1B;AACA,MAAI,SAAS,OAAO;AAChB,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AACA,MAAI,SAAS,aAAa,QAAW;AACjC,WAAO,WAAW,OAAO,QAAQ,QAAQ;AAAA,EAC7C;AACA,MAAI,SAAS,QAAQ;AACjB,WAAO,SAAS,QAAQ;AAAA,EAC5B;AAGA,MAAI,SAAS,UAAU,QAAW;AAC9B,WAAO,QAAQ,OAAO,QAAQ,KAAK;AAAA,EACvC;AACA,MAAI,SAAS,SAAS,QAAW;AAC7B,WAAO,OAAO,OAAO,QAAQ,IAAI;AAAA,EACrC;AAGA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AACA,MAAI,SAAS,WAAW;AACpB,WAAO,aAAa,QAAQ;AAAA,EAChC;AAEA,QAAM,MAAM,MAAM,aAAa,IAAsB;AAAA,IACjD,MAAM;AAAA,IACN;AAAA,IACA,MAAM,SAAS;AAAA,IACf,QAAQ;AAAA,EAAA,CACX;AAED,SAAO,eAAe,GAAG;AAC7B;"}
@@ -0,0 +1,53 @@
1
+ function transformCountry(raw) {
2
+ return {
3
+ id: raw.id,
4
+ name: raw.name,
5
+ code: raw.country_code,
6
+ flag: raw.assets?.flag,
7
+ providerRef: [
8
+ {
9
+ provider: "fansunited",
10
+ id: raw.id
11
+ }
12
+ ]
13
+ };
14
+ }
15
+ function transformTeamData(raw) {
16
+ return {
17
+ id: raw.id,
18
+ name: raw.name,
19
+ shortName: raw.short_name || void 0,
20
+ threeLetterCode: raw.code,
21
+ type: raw.national ? "national" : "club",
22
+ gender: raw.gender ? raw.gender.toUpperCase() : void 0,
23
+ country: raw.country ? transformCountry(raw.country) : void 0,
24
+ assets: raw.assets?.logo ? {
25
+ logo: raw.assets.logo
26
+ } : void 0,
27
+ metadata: raw.colors ? {
28
+ shirtColors: raw.colors.primary ? [
29
+ {
30
+ type: "home",
31
+ colorCode: raw.colors.primary
32
+ }
33
+ ] : void 0
34
+ } : void 0,
35
+ providerRef: [
36
+ {
37
+ provider: "fansunited",
38
+ id: raw.id
39
+ }
40
+ ]
41
+ };
42
+ }
43
+ function transformTeam(raw) {
44
+ return transformTeamData(raw.data);
45
+ }
46
+ function transformTeams(raw) {
47
+ return raw.data.map(transformTeamData);
48
+ }
49
+ export {
50
+ transformTeam,
51
+ transformTeams
52
+ };
53
+ //# sourceMappingURL=transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.js","sources":["../../../../../src/lib/api/fansunited/football/teams/transformer.ts"],"sourcesContent":["/**\n * Transform raw team data to canonical FUSports types\n */\n\nimport type { FUSportsTeamCompetitor } from \"../../../../types/canonical\";\nimport type { RawTeamResponse, RawTeamsResponse, RawTeam, RawCountry } from \"./types\";\n\n/**\n * Transform raw country to canonical format\n */\nfunction transformCountry(raw: RawCountry) {\n return {\n id: raw.id,\n name: raw.name,\n code: raw.country_code,\n flag: raw.assets?.flag,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw team data to canonical FUSportsTeamCompetitor\n */\nfunction transformTeamData(raw: RawTeam): FUSportsTeamCompetitor {\n return {\n id: raw.id,\n name: raw.name,\n shortName: raw.short_name || undefined,\n threeLetterCode: raw.code,\n type: raw.national ? \"national\" : \"club\",\n gender: raw.gender ? (raw.gender.toUpperCase() as \"MALE\" | \"FEMALE\") : undefined,\n country: raw.country ? transformCountry(raw.country) : undefined,\n assets: raw.assets?.logo\n ? {\n logo: raw.assets.logo,\n }\n : undefined,\n metadata: raw.colors\n ? {\n shirtColors: raw.colors.primary\n ? [\n {\n type: \"home\" as const,\n colorCode: raw.colors.primary,\n },\n ]\n : undefined,\n }\n : undefined,\n providerRef: [\n {\n provider: \"fansunited\",\n id: raw.id,\n },\n ],\n };\n}\n\n/**\n * Transform raw team response to canonical FUSportsTeamCompetitor\n */\nexport function transformTeam(raw: RawTeamResponse): FUSportsTeamCompetitor {\n return transformTeamData(raw.data);\n}\n\n/**\n * Transform raw teams response to array of canonical FUSportsTeamCompetitor\n */\nexport function transformTeams(raw: RawTeamsResponse): FUSportsTeamCompetitor[] {\n return raw.data.map(transformTeamData);\n}\n"],"names":[],"mappings":"AAUA,SAAS,iBAAiB,KAAiB;AACvC,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,MAAM,IAAI,QAAQ;AAAA,IAClB,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKA,SAAS,kBAAkB,KAAsC;AAC7D,SAAO;AAAA,IACH,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,WAAW,IAAI,cAAc;AAAA,IAC7B,iBAAiB,IAAI;AAAA,IACrB,MAAM,IAAI,WAAW,aAAa;AAAA,IAClC,QAAQ,IAAI,SAAU,IAAI,OAAO,gBAAsC;AAAA,IACvE,SAAS,IAAI,UAAU,iBAAiB,IAAI,OAAO,IAAI;AAAA,IACvD,QAAQ,IAAI,QAAQ,OACd;AAAA,MACI,MAAM,IAAI,OAAO;AAAA,IAAA,IAErB;AAAA,IACN,UAAU,IAAI,SACR;AAAA,MACI,aAAa,IAAI,OAAO,UAClB;AAAA,QACI;AAAA,UACI,MAAM;AAAA,UACN,WAAW,IAAI,OAAO;AAAA,QAAA;AAAA,MAC1B,IAEJ;AAAA,IAAA,IAEV;AAAA,IACN,aAAa;AAAA,MACT;AAAA,QACI,UAAU;AAAA,QACV,IAAI,IAAI;AAAA,MAAA;AAAA,IACZ;AAAA,EACJ;AAER;AAKO,SAAS,cAAc,KAA8C;AACxE,SAAO,kBAAkB,IAAI,IAAI;AACrC;AAKO,SAAS,eAAe,KAAiD;AAC5E,SAAO,IAAI,KAAK,IAAI,iBAAiB;AACzC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/lib/api/fansunited/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kEAAkE;IAClE,MAAM,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACjC;;;;;;;;;;OAUG;IACH,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAwFrE"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/lib/api/fansunited/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,kEAAkE;IAClE,MAAM,CAAC,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACjC;;;;;;;;;;OAUG;IACH,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAkFrE"}
@@ -0,0 +1,70 @@
1
+ import { getConfig } from "../../config/index.js";
2
+ function createHttpClient(domain) {
3
+ const baseUrl = domain.replace(/\/$/, "");
4
+ function buildUrl(path) {
5
+ return `${baseUrl}${path}`;
6
+ }
7
+ return {
8
+ async get(options) {
9
+ const finalConfig = options.config || getConfig();
10
+ const { fansUnited } = finalConfig;
11
+ if (!fansUnited) {
12
+ throw new Error(
13
+ "Fans United configuration is missing. Add 'fansUnited' with 'apiKey' and 'clientId' to your config."
14
+ );
15
+ }
16
+ if (!fansUnited.apiKey || !fansUnited.clientId) {
17
+ throw new Error("Fans United configuration requires both 'apiKey' and 'clientId'");
18
+ }
19
+ const url = new URL(buildUrl(options.path));
20
+ url.searchParams.set("key", fansUnited.apiKey);
21
+ url.searchParams.set("client_id", fansUnited.clientId);
22
+ if (options.params) {
23
+ for (const [key, value] of Object.entries(options.params)) {
24
+ if (value === void 0) continue;
25
+ if (Array.isArray(value)) {
26
+ if (value.length > 0) {
27
+ url.searchParams.set(key, value.join(","));
28
+ }
29
+ } else {
30
+ url.searchParams.set(key, value);
31
+ }
32
+ }
33
+ }
34
+ const timeout = 3e4;
35
+ const response = await fetch(url.toString(), {
36
+ method: "GET",
37
+ headers: {
38
+ Accept: "application/json",
39
+ "Content-Type": "application/json",
40
+ // Merge custom headers (they can override defaults)
41
+ ...options.headers
42
+ },
43
+ signal: AbortSignal.timeout(timeout),
44
+ // Next.js cache options for ISR/on-demand revalidation
45
+ ...options.next && { next: options.next }
46
+ });
47
+ if (!response.ok) {
48
+ let errorMessage = `Fans United API error: ${response.status} ${response.statusText}`;
49
+ try {
50
+ const errorBody = await response.text();
51
+ if (errorBody) {
52
+ errorMessage += ` - ${errorBody}`;
53
+ }
54
+ } catch (error) {
55
+ console.error("[Fans United HTTP] Failed to read error response body:", {
56
+ error: error instanceof Error ? error.message : String(error),
57
+ status: response.status,
58
+ statusText: response.statusText
59
+ });
60
+ }
61
+ throw new Error(errorMessage);
62
+ }
63
+ return response.json();
64
+ }
65
+ };
66
+ }
67
+ export {
68
+ createHttpClient
69
+ };
70
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sources":["../../../src/lib/api/fansunited/http.ts"],"sourcesContent":["/**\n * HTTP client for Fans United APIs\n */\n\nimport { getConfig, type DataLayerConfig } from \"../../config\";\n\n/**\n * Next.js cache options for ISR/on-demand revalidation\n */\nexport interface NextCacheOptions {\n revalidate?: number | false;\n tags?: string[];\n}\n\nexport interface RequestOptions {\n /** API path (e.g., '/v1/competitions') */\n path: string;\n /** Query parameters */\n params?: Record<string, string | string[] | undefined>;\n /** Custom headers to include in the request */\n headers?: Record<string, string>;\n /** Next.js cache options for ISR/on-demand revalidation */\n next?: NextCacheOptions;\n /** Optional data layer config (uses singleton if not provided) */\n config?: DataLayerConfig;\n}\n\nexport interface FansUnitedHttpClient {\n /**\n * Make a GET request to a Fans United API\n *\n * Handles:\n * - API key and client ID authentication via query params\n * - Timeout\n * - Error handling\n *\n * @param options - Request options\n * @returns Parsed JSON response\n */\n get<T>(options: RequestOptions): Promise<T>;\n}\n\n/**\n * Create an HTTP client for a specific Fans United API domain\n *\n * @param domain - The base URL for the API (e.g., 'https://football.fansunitedapi.com')\n * @returns HTTP client configured for the specified domain\n *\n * @example\n * ```typescript\n * import { createHttpClient } from '../http';\n * import { FANSUNITED_FOOTBALL_DOMAIN } from '../constants';\n *\n * const footballHttp = createHttpClient(FANSUNITED_FOOTBALL_DOMAIN);\n * const data = await footballHttp.get({ path: '/v1/competitions' });\n * ```\n */\nexport function createHttpClient(domain: string): FansUnitedHttpClient {\n const baseUrl = domain.replace(/\\/$/, \"\");\n\n function buildUrl(path: string): string {\n return `${baseUrl}${path}`;\n }\n\n return {\n async get<T>(options: RequestOptions): Promise<T> {\n const finalConfig = options.config || getConfig();\n const { fansUnited } = finalConfig;\n\n if (!fansUnited) {\n throw new Error(\n \"Fans United configuration is missing. \" +\n \"Add 'fansUnited' with 'apiKey' and 'clientId' to your config.\"\n );\n }\n\n if (!fansUnited.apiKey || !fansUnited.clientId) {\n throw new Error(\"Fans United configuration requires both 'apiKey' and 'clientId'\");\n }\n\n const url = new URL(buildUrl(options.path));\n\n // Add authentication query parameters\n url.searchParams.set(\"key\", fansUnited.apiKey);\n url.searchParams.set(\"client_id\", fansUnited.clientId);\n\n // Add additional query parameters\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value === undefined) continue;\n\n if (Array.isArray(value)) {\n if (value.length > 0) {\n url.searchParams.set(key, value.join(\",\"));\n }\n } else {\n url.searchParams.set(key, value);\n }\n }\n }\n\n // Default timeout: 30 seconds\n const timeout = 30000;\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n // Merge custom headers (they can override defaults)\n ...options.headers,\n },\n signal: AbortSignal.timeout(timeout),\n // Next.js cache options for ISR/on-demand revalidation\n ...(options.next && { next: options.next }),\n });\n\n if (!response.ok) {\n // Try to get error details from response body\n let errorMessage = `Fans United API error: ${response.status} ${response.statusText}`;\n try {\n const errorBody = await response.text();\n if (errorBody) {\n errorMessage += ` - ${errorBody}`;\n }\n } catch (error) {\n // Log if we can't read the error body, but continue\n console.error(\"[Fans United HTTP] Failed to read error response body:\", {\n error: error instanceof Error ? error.message : String(error),\n status: response.status,\n statusText: response.statusText,\n });\n }\n throw new Error(errorMessage);\n }\n\n return response.json();\n },\n };\n}\n"],"names":[],"mappings":";AAyDO,SAAS,iBAAiB,QAAsC;AACnE,QAAM,UAAU,OAAO,QAAQ,OAAO,EAAE;AAExC,WAAS,SAAS,MAAsB;AACpC,WAAO,GAAG,OAAO,GAAG,IAAI;AAAA,EAC5B;AAEA,SAAO;AAAA,IACH,MAAM,IAAO,SAAqC;AAC9C,YAAM,cAAc,QAAQ,UAAU,UAAA;AACtC,YAAM,EAAE,eAAe;AAEvB,UAAI,CAAC,YAAY;AACb,cAAM,IAAI;AAAA,UACN;AAAA,QAAA;AAAA,MAGR;AAEA,UAAI,CAAC,WAAW,UAAU,CAAC,WAAW,UAAU;AAC5C,cAAM,IAAI,MAAM,iEAAiE;AAAA,MACrF;AAEA,YAAM,MAAM,IAAI,IAAI,SAAS,QAAQ,IAAI,CAAC;AAG1C,UAAI,aAAa,IAAI,OAAO,WAAW,MAAM;AAC7C,UAAI,aAAa,IAAI,aAAa,WAAW,QAAQ;AAGrD,UAAI,QAAQ,QAAQ;AAChB,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,MAAM,GAAG;AACvD,cAAI,UAAU,OAAW;AAEzB,cAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,gBAAI,MAAM,SAAS,GAAG;AAClB,kBAAI,aAAa,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,YAC7C;AAAA,UACJ,OAAO;AACH,gBAAI,aAAa,IAAI,KAAK,KAAK;AAAA,UACnC;AAAA,QACJ;AAAA,MACJ;AAGA,YAAM,UAAU;AAEhB,YAAM,WAAW,MAAM,MAAM,IAAI,YAAY;AAAA,QACzC,QAAQ;AAAA,QACR,SAAS;AAAA,UACL,QAAQ;AAAA,UACR,gBAAgB;AAAA;AAAA,UAEhB,GAAG,QAAQ;AAAA,QAAA;AAAA,QAEf,QAAQ,YAAY,QAAQ,OAAO;AAAA;AAAA,QAEnC,GAAI,QAAQ,QAAQ,EAAE,MAAM,QAAQ,KAAA;AAAA,MAAK,CAC5C;AAED,UAAI,CAAC,SAAS,IAAI;AAEd,YAAI,eAAe,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU;AACnF,YAAI;AACA,gBAAM,YAAY,MAAM,SAAS,KAAA;AACjC,cAAI,WAAW;AACX,4BAAgB,MAAM,SAAS;AAAA,UACnC;AAAA,QACJ,SAAS,OAAO;AAEZ,kBAAQ,MAAM,0DAA0D;AAAA,YACpE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC5D,QAAQ,SAAS;AAAA,YACjB,YAAY,SAAS;AAAA,UAAA,CACxB;AAAA,QACL;AACA,cAAM,IAAI,MAAM,YAAY;AAAA,MAChC;AAEA,aAAO,SAAS,KAAA;AAAA,IACpB;AAAA,EAAA;AAER;"}
@@ -0,0 +1,5 @@
1
+ const FANSUNITED_SEARCH_DOMAIN = "https://search.fansunitedapi.com";
2
+ export {
3
+ FANSUNITED_SEARCH_DOMAIN
4
+ };
5
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../../src/lib/api/fansunited/search/constants.ts"],"sourcesContent":["export const FANSUNITED_SEARCH_DOMAIN = \"https://search.fansunitedapi.com\";\n"],"names":[],"mappings":"AAAO,MAAM,2BAA2B;"}
@@ -0,0 +1,7 @@
1
+ import { createHttpClient } from "../http.js";
2
+ import { FANSUNITED_SEARCH_DOMAIN } from "./constants.js";
3
+ const searchHttp = createHttpClient(FANSUNITED_SEARCH_DOMAIN);
4
+ export {
5
+ searchHttp
6
+ };
7
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sources":["../../../../src/lib/api/fansunited/search/http.ts"],"sourcesContent":["/**\n * HTTP client for the Fans United Search API\n */\n\nimport { createHttpClient } from \"../http\";\nimport { FANSUNITED_SEARCH_DOMAIN } from \"./constants\";\n\nexport const searchHttp = createHttpClient(FANSUNITED_SEARCH_DOMAIN);\n"],"names":[],"mappings":";;AAOO,MAAM,aAAa,iBAAiB,wBAAwB;"}