fansunited-data-layer 0.17.0 → 0.18.0
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/index.d.ts +2 -2
- package/api/fansunited/index.d.ts.map +1 -1
- package/api/fansunited/search/index.d.ts +15 -3
- package/api/fansunited/search/index.d.ts.map +1 -1
- package/api/fansunited/search/index.js.map +1 -1
- package/api/fansunited/search/raw-types.d.ts +13 -0
- package/api/fansunited/search/raw-types.d.ts.map +1 -1
- package/api/fansunited/search/transformer.d.ts +17 -2
- package/api/fansunited/search/transformer.d.ts.map +1 -1
- package/api/fansunited/search/transformer.js +36 -0
- package/api/fansunited/search/transformer.js.map +1 -1
- package/api/fansunited/search/types.d.ts +15 -2
- package/api/fansunited/search/types.d.ts.map +1 -1
- package/cache/cache-manager.d.ts.map +1 -1
- package/cache/cache-manager.js +1 -0
- package/cache/cache-manager.js.map +1 -1
- package/cache/types.d.ts +1 -1
- package/cache/types.d.ts.map +1 -1
- package/cache/types.js.map +1 -1
- package/package.json +1 -1
- package/types/canonical/base.types.d.ts +23 -0
- package/types/canonical/base.types.d.ts.map +1 -1
- package/types/canonical/index.d.ts +1 -1
- package/types/canonical/index.d.ts.map +1 -1
- package/types/index.d.ts +1 -1
- package/types/index.d.ts.map +1 -1
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { getFansUnitedFootballCompetitions, getFansUnitedFootballCompetition, getFansUnitedFootballTeam, getFansUnitedFootballTeams, getFansUnitedFootballPlayer, getFansUnitedFootballPlayers, getFansUnitedFootballMatch, getFansUnitedFootballMatches, getFansUnitedFootballTeamNextMatch, getFansUnitedFootballTeamPreviousMatch, getFansUnitedFootballPlayerNextMatch, getFansUnitedFootballPlayerPreviousMatch, getFansUnitedFootballSearch, } from "./football";
|
|
8
8
|
export type { GetFootballCompetitionsOptions, GetFootballCompetitionOptions, GetFootballTeamOptions, GetFootballTeamsOptions, GetFootballPlayerOptions, GetFootballPlayersOptions, GetFootballMatchOptions, GetFootballMatchesOptions, GetFootballSearchOptions, SearchEntityType, FansUnitedFootballSearchResult, } from "./football";
|
|
9
|
-
export { getFansUnitedSearchEntities, getFansUnitedEntityById, getFansUnitedEntitiesByIds, getFansUnitedCompetitions, getFansUnitedTeamsByCountry, getFansUnitedTeamsByCompetition, getFansUnitedCountries, getFansUnitedVenues, } from "./search";
|
|
9
|
+
export { getFansUnitedSearchEntities, getFansUnitedEntityById, getFansUnitedEntitiesByIds, getFansUnitedCompetitions, getFansUnitedTeamsByCountry, getFansUnitedTeamsByCompetition, getFansUnitedCountries, getFansUnitedVenues, getFansUnitedStageNames, } from "./search";
|
|
10
10
|
export { getFansUnitedSportsCompetition, getFansUnitedSportsCompetitionHydrated, getFansUnitedSportsLivescore, getFansUnitedSportsLivescoreHydrated, } from "./sports";
|
|
11
11
|
export type { GetSportsCompetitionOptions, GetSportsCompetitionHydratedOptions, GetSportsLivescoreOptions, GetSportsLivescoreHydratedOptions, FUSportsCompetitionHydrated, FUSportsLivescoreHydrated, } from "./sports";
|
|
12
|
-
export type { SearchMode, EntityContentType, EntitySearchOptions, GetEntityByIdOptions, GetEntitiesByIdsOptions, GetCompetitionsOptions, GetTeamsByCountryOptions, GetTeamsByCompetitionOptions, GetCountriesOptions, GetVenuesOptions, RawSearchEntity, SearchEntityResult, SearchEntitySummary, EntitySearchResponse, PaginationMeta, PaginatedResult, } from "./search";
|
|
12
|
+
export type { SearchMode, EntityContentType, EntitySearchOptions, GetEntityByIdOptions, GetEntitiesByIdsOptions, GetCompetitionsOptions, GetTeamsByCountryOptions, GetTeamsByCompetitionOptions, GetCountriesOptions, GetVenuesOptions, GetStageNamesOptions, RawSearchEntity, SearchEntityResult, SearchEntitySummary, EntitySearchResponse, PaginationMeta, PaginatedResult, } from "./search";
|
|
13
13
|
export type { NextCacheOptions } from "./http";
|
|
14
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/api/fansunited/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACH,iCAAiC,EACjC,gCAAgC,EAChC,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,kCAAkC,EAClC,sCAAsC,EACtC,oCAAoC,EACpC,wCAAwC,EACxC,2BAA2B,GAC9B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,8BAA8B,EAC9B,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,8BAA8B,GACjC,MAAM,YAAY,CAAC;AAGpB,OAAO,EACH,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,+BAA+B,EAC/B,sBAAsB,EACtB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/api/fansunited/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACH,iCAAiC,EACjC,gCAAgC,EAChC,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,kCAAkC,EAClC,sCAAsC,EACtC,oCAAoC,EACpC,wCAAwC,EACxC,2BAA2B,GAC9B,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,8BAA8B,EAC9B,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,8BAA8B,GACjC,MAAM,YAAY,CAAC;AAGpB,OAAO,EACH,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,+BAA+B,EAC/B,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,GAC1B,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,8BAA8B,EAC9B,sCAAsC,EACtC,4BAA4B,EAC5B,oCAAoC,GACvC,MAAM,UAAU,CAAC;AAClB,YAAY,EACR,2BAA2B,EAC3B,mCAAmC,EACnC,yBAAyB,EACzB,iCAAiC,EACjC,2BAA2B,EAC3B,yBAAyB,GAC5B,MAAM,UAAU,CAAC;AAElB,YAAY,EACR,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,eAAe,GAClB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fans United Search API - Public functions with caching
|
|
3
3
|
*/
|
|
4
|
-
import type { EntitySearchOptions, GetEntityByIdOptions, GetEntitiesByIdsOptions, GetCompetitionsOptions, GetTeamsByCountryOptions, GetTeamsByCompetitionOptions, GetCountriesOptions, GetVenuesOptions, PaginatedResult, SearchEntityResult, SearchEntitySummary } from "./types";
|
|
5
|
-
import type { FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsCountrySummary, FUSportsVenueSummary } from "../../../types/canonical/base.types";
|
|
4
|
+
import type { EntitySearchOptions, GetEntityByIdOptions, GetEntitiesByIdsOptions, GetCompetitionsOptions, GetTeamsByCountryOptions, GetTeamsByCompetitionOptions, GetCountriesOptions, GetVenuesOptions, GetStageNamesOptions, PaginatedResult, SearchEntityResult, SearchEntitySummary } from "./types";
|
|
5
|
+
import type { FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsStageNameSummary } from "../../../types/canonical/base.types";
|
|
6
6
|
/**
|
|
7
7
|
* Search entities across all content types.
|
|
8
8
|
* Returns transformed canonical types.
|
|
@@ -46,5 +46,17 @@ export declare function getFansUnitedCountries(options?: GetCountriesOptions): P
|
|
|
46
46
|
* Returns transformed FUSportsVenue objects.
|
|
47
47
|
*/
|
|
48
48
|
export declare function getFansUnitedVenues(options?: GetVenuesOptions): Promise<PaginatedResult<FUSportsVenueSummary>>;
|
|
49
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Get stage-name labels (e.g. "Championship Group", "Regular Season") with
|
|
51
|
+
* optional filtering. Stage-name entities are leaf nodes — they have no
|
|
52
|
+
* country, no related entities, and no assets — so no prefetch step runs.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* const { data } = await getFansUnitedStageNames({ query: "champion", lang: "BG" });
|
|
57
|
+
* data.forEach((s) => console.log(s.id, s.name));
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function getFansUnitedStageNames(options?: GetStageNamesOptions): Promise<PaginatedResult<FUSportsStageNameSummary>>;
|
|
61
|
+
export type { SearchMode, EntityContentType, EntitySearchOptions, GetEntityByIdOptions, GetEntitiesByIdsOptions, GetCompetitionsOptions, GetTeamsByCountryOptions, GetTeamsByCompetitionOptions, GetCountriesOptions, GetVenuesOptions, GetStageNamesOptions, RawSearchEntity, EntitySearchResponse, PaginationMeta, PaginatedResult, SearchEntityResult, SearchEntitySummary, } from "./types";
|
|
50
62
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,OAAO,KAAK,EACR,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EAGpB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACtB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EACR,0BAA0B,EAC1B,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EAC3B,MAAM,qCAAqC,CAAC;AAqM7C;;;GAGG;AACH,wBAAsB,2BAA2B,CAC7C,OAAO,GAAE,mBAAwB,EACjC,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAA;CAAE,GAChD,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAqC/C;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CACzC,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,oBAAoB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAuB7B;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAC5C,GAAG,EAAE,MAAM,EAAE,EACb,OAAO,CAAC,EAAE,uBAAuB,GAClC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAgC/B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC3C,OAAO,GAAE,sBAA2B,GACrC,OAAO,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC,CA2BtD;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B,GACvC,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CA6B/C;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CACjD,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,4BAAiC,GAC3C,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CA6B/C;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CACxC,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CA0BlD;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACrC,OAAO,GAAE,gBAAqB,GAC/B,OAAO,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CA2BhD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CACzC,OAAO,GAAE,oBAAyB,GACnC,OAAO,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC,CA0BpD;AAGD,YAAY,EACR,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/lib/api/fansunited/search/index.ts"],"sourcesContent":["/**\n * Fans United Search API - Public functions with caching\n */\n\nimport { searchHttp } from \"./http\";\nimport { cached, cachedBatch, memoryStore, CACHE_KEY_PREFIX } from \"../../../cache\";\nimport { getConfig, isConfigured } from \"../../../config\";\nimport {\n transformEntity,\n transformEntitySummary,\n transformCompetitionSummary,\n transformTeamSummary,\n transformCountrySummary,\n transformVenueSummary,\n} from \"./transformer\";\nimport type { RawCompetition, RawTeam, RawCountry, RawVenue, RawSearchEntityBase, RawRelated } from \"./raw-types\";\nimport type {\n EntitySearchOptions,\n GetEntityByIdOptions,\n GetEntitiesByIdsOptions,\n GetCompetitionsOptions,\n GetTeamsByCountryOptions,\n GetTeamsByCompetitionOptions,\n GetCountriesOptions,\n GetVenuesOptions,\n RawSearchEntity,\n EntitySearchResponse,\n PaginatedResult,\n SearchEntityResult,\n SearchEntitySummary,\n} from \"./types\";\nimport type { NextCacheOptions } from \"../http\";\nimport type { DataLayerConfig } from \"../../../config\";\nimport type {\n FUSportsCompetitionSummary,\n FUSportsTeamSummary,\n FUSportsCountrySummary,\n FUSportsVenueSummary,\n} from \"../../../types/canonical/base.types\";\n\nfunction hashParams(params: Record<string, string | string[] | undefined>): string {\n const sorted = Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${Array.isArray(v) ? v.join(\",\") : v}`)\n .join(\"&\");\n // Simple hash — sufficient for cache key uniqueness\n let hash = 0;\n for (let i = 0; i < sorted.length; i++) {\n hash = ((hash << 5) - hash + sorted.charCodeAt(i)) | 0;\n }\n return hash.toString(36);\n}\n\n/** Cache individual entities from a search response for later ID lookups */\nfunction cacheIndividualEntities(entities: RawSearchEntity[]): void {\n for (const entity of entities) {\n if (entity.id) {\n memoryStore.set(`${CACHE_KEY_PREFIX}entity:${entity.id}`, entity);\n }\n }\n}\n\n/**\n * Resolve the language for transformation.\n * Priority: options.lang → config.fansUnited.lang → \"EN\"\n */\nfunction resolveLanguage(options?: { lang?: string }): string {\n if (options?.lang) return options.lang;\n if (isConfigured()) {\n const config = getConfig();\n if (config.fansUnited && \"lang\" in config.fansUnited && config.fansUnited.lang) {\n return config.fansUnited.lang;\n }\n }\n return \"EN\";\n}\n\n/**\n * Collect missing related entity IDs (and country_id fields) from raw entities.\n */\nfunction collectMissingIds(entities: RawSearchEntity[]): Set<string> {\n const missingIds = new Set<string>();\n\n for (const entity of entities) {\n const raw = entity as Record<string, unknown>;\n\n // Collect related IDs\n const related = raw.related as RawRelated[] | undefined;\n if (related) {\n for (const r of related) {\n if (!memoryStore.get(`${CACHE_KEY_PREFIX}entity:${r.related_id}`)) {\n missingIds.add(r.related_id);\n }\n }\n }\n\n // Collect country_id\n const countryId = raw.country_id as string | undefined;\n if (countryId && !memoryStore.get(`${CACHE_KEY_PREFIX}entity:${countryId}`)) {\n missingIds.add(countryId);\n }\n }\n\n return missingIds;\n}\n\n/**\n * Search API `limit` parameter caps at 100 (and defaults to 10 if unset).\n * Passing more than 100 IDs in one request would silently drop everything\n * beyond the page limit — so we chunk and fan-out in parallel.\n */\nconst SEARCH_API_MAX_LIMIT = 100;\n\n/**\n * Fetch raw entities by ID, working around the Search API's pagination cap.\n *\n * - Always passes `limit` equal to the chunk size, so the API never silently\n * trims the response to its default page size (10).\n * - Splits requests of >100 IDs into parallel chunks of ≤100.\n */\nasync function fetchEntitiesByIds(\n ids: string[],\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<RawSearchEntity[]> {\n if (ids.length === 0) return [];\n\n const chunks: string[][] = [];\n for (let i = 0; i < ids.length; i += SEARCH_API_MAX_LIMIT) {\n chunks.push(ids.slice(i, i + SEARCH_API_MAX_LIMIT));\n }\n\n const responses = await Promise.all(\n chunks.map((chunk) =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params: {\n ids: chunk,\n limit: String(chunk.length),\n },\n next: fetchOptions?.next,\n config: fetchOptions?.config,\n })\n )\n );\n\n return responses.flatMap((r) => r.data);\n}\n\n/**\n * Batch-fetch entity IDs from the search API and cache the results.\n * Returns the fetched raw entities.\n */\nasync function batchFetchAndCache(\n ids: Set<string>,\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<RawSearchEntity[]> {\n if (ids.size === 0) return [];\n\n const data = await fetchEntitiesByIds(Array.from(ids), fetchOptions);\n cacheIndividualEntities(data);\n return data;\n}\n\n/**\n * Collect all related entity IDs (and country_id fields) from raw entities\n * that are not already in cache, then batch-fetch them.\n * Does a two-pass fetch: after the first fetch, checks the newly fetched\n * entities for their own dependencies (e.g. country_ids) and fetches those too.\n */\nasync function prefetchRelatedEntities(\n entities: RawSearchEntity[],\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<void> {\n // Pass 1: fetch related entities and country_ids from top-level entities\n const pass1Ids = collectMissingIds(entities);\n if (pass1Ids.size === 0) return;\n\n try {\n const fetched = await batchFetchAndCache(pass1Ids, fetchOptions);\n\n // Pass 2: fetch dependencies of the newly fetched entities\n // (e.g. country_ids of related competitions/teams)\n const pass2Ids = collectMissingIds(fetched);\n if (pass2Ids.size > 0) {\n await batchFetchAndCache(pass2Ids, fetchOptions);\n }\n } catch {\n // Prefetch is best-effort — if it fails, the transformer\n // will produce partial results for uncached related entities\n }\n}\n\n/**\n * Lightweight prefetch — only country_ids (single pass).\n * Used by list/search functions that return summary types.\n */\nasync function prefetchCountries(\n entities: RawSearchEntity[],\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<void> {\n const missingIds = new Set<string>();\n\n for (const entity of entities) {\n const raw = entity as Record<string, unknown>;\n\n const countryId = raw.country_id as string | undefined;\n if (countryId && !memoryStore.get(`${CACHE_KEY_PREFIX}entity:${countryId}`)) {\n missingIds.add(countryId);\n }\n\n // Also check related array for COUNTRY entries\n const related = raw.related as RawRelated[] | undefined;\n if (related) {\n for (const r of related) {\n if (r.relationship === \"COUNTRY\" && !memoryStore.get(`${CACHE_KEY_PREFIX}entity:${r.related_id}`)) {\n missingIds.add(r.related_id);\n }\n }\n }\n }\n\n if (missingIds.size === 0) return;\n\n try {\n await batchFetchAndCache(missingIds, fetchOptions);\n } catch {\n // Best-effort — summary transforms will produce partial country data\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Search entities across all content types.\n * Returns transformed canonical types.\n */\nexport async function getFansUnitedSearchEntities(\n options: EntitySearchOptions = {},\n config?: { next?: EntitySearchOptions[\"next\"] }\n): Promise<PaginatedResult<SearchEntitySummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | string[] | undefined> = {\n query: options.query,\n content_type: options.contentType,\n ids: options.ids,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n mode: options.mode,\n sport: options.sport,\n relationship: options.relationship,\n value: options.value,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}search:entities:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"search\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next || config?.next,\n config: options.config,\n })\n );\n\n // Side-cache individual entities (raw)\n cacheIndividualEntities(result.data);\n\n // Pre-fetch only countries (lightweight, single pass)\n await prefetchCountries(result.data, { next: options.next || config?.next, config: options.config });\n\n // Transform each raw entity to its summary type (no related, no providerRef)\n const transformed = result.data.map((e) =>\n transformEntitySummary(e as RawSearchEntityBase & Record<string, unknown>, lang)\n );\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get a single entity by ID.\n * Returns transformed canonical type.\n */\nexport async function getFansUnitedEntityById(\n id: string,\n options?: GetEntityByIdOptions\n): Promise<SearchEntityResult> {\n const lang = resolveLanguage(options);\n const cacheKey = `${CACHE_KEY_PREFIX}entity:${id}`;\n\n const raw = await cached<RawSearchEntity>(cacheKey, \"search\", async () => {\n const response = await searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params: { ids: [id] },\n next: options?.next,\n config: options?.config,\n });\n\n if (!response.data || response.data.length === 0) {\n throw new Error(`Entity not found: ${id}`);\n }\n\n return response.data[0];\n });\n\n // Pre-fetch related entities for this single entity\n await prefetchRelatedEntities([raw], { next: options?.next, config: options?.config });\n\n return transformEntity(raw as RawSearchEntityBase & Record<string, unknown>, lang);\n}\n\n/**\n * Get multiple entities by IDs — smart batch caching.\n * Only fetches uncached IDs from the API.\n * Returns transformed canonical types.\n */\nexport async function getFansUnitedEntitiesByIds(\n ids: string[],\n options?: GetEntitiesByIdsOptions\n): Promise<SearchEntityResult[]> {\n if (ids.length === 0) return [];\n\n const lang = resolveLanguage(options);\n\n const resultsMap = await cachedBatch<RawSearchEntity>(\n ids,\n \"search\",\n async (missingIds) => {\n const fetched = await fetchEntitiesByIds(missingIds, {\n next: options?.next,\n config: options?.config,\n });\n\n const map = new Map<string, RawSearchEntity>();\n for (const entity of fetched) {\n map.set(entity.id, entity);\n }\n return map;\n },\n (id) => `${CACHE_KEY_PREFIX}entity:${id}`\n );\n\n // Collect raw entities in order\n const rawEntities = ids\n .map((id) => resultsMap.get(id))\n .filter((e): e is RawSearchEntity => e !== undefined);\n\n // Pre-fetch related entities\n await prefetchRelatedEntities(rawEntities, { next: options?.next, config: options?.config });\n\n return rawEntities.map((e) => transformEntity(e as RawSearchEntityBase & Record<string, unknown>, lang));\n}\n\n/**\n * Get competitions with optional filtering.\n * Returns transformed FUSportsCompetition objects.\n */\nexport async function getFansUnitedCompetitions(\n options: GetCompetitionsOptions = {}\n): Promise<PaginatedResult<FUSportsCompetitionSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"competition\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}competitions:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"competitions\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformCompetitionSummary(e as unknown as RawCompetition, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get teams filtered by country.\n * Returns transformed FUSportsTeamCompetitor objects.\n */\nexport async function getFansUnitedTeamsByCountry(\n countryId: string,\n options: GetTeamsByCountryOptions = {}\n): Promise<PaginatedResult<FUSportsTeamSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"team\",\n relationship: \"COUNTRY\",\n value: countryId,\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}teams:country:${countryId}:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"teams\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformTeamSummary(e as unknown as RawTeam, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get teams filtered by competition.\n * Returns transformed FUSportsTeamCompetitor objects.\n */\nexport async function getFansUnitedTeamsByCompetition(\n competitionId: string,\n options: GetTeamsByCompetitionOptions = {}\n): Promise<PaginatedResult<FUSportsTeamSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"team\",\n relationship: \"COMPETITION\",\n value: competitionId,\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}teams:competition:${competitionId}:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"teams\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformTeamSummary(e as unknown as RawTeam, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get countries with optional filtering.\n * Returns transformed FUSportsCountry objects.\n */\nexport async function getFansUnitedCountries(\n options: GetCountriesOptions = {}\n): Promise<PaginatedResult<FUSportsCountrySummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"country\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}countries:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"countries\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n\n const transformed = result.data.map((e) => transformCountrySummary(e as unknown as RawCountry, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get venues with optional filtering.\n * Returns transformed FUSportsVenue objects.\n */\nexport async function getFansUnitedVenues(\n options: GetVenuesOptions = {}\n): Promise<PaginatedResult<FUSportsVenueSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"venue\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}venues:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"venues\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformVenueSummary(e as unknown as RawVenue, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n// Re-export types\nexport type {\n SearchMode,\n EntityContentType,\n EntitySearchOptions,\n GetEntityByIdOptions,\n GetEntitiesByIdsOptions,\n GetCompetitionsOptions,\n GetTeamsByCountryOptions,\n GetTeamsByCompetitionOptions,\n GetCountriesOptions,\n GetVenuesOptions,\n RawSearchEntity,\n EntitySearchResponse,\n PaginationMeta,\n PaginatedResult,\n SearchEntityResult,\n SearchEntitySummary,\n} from \"./types\";\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/lib/api/fansunited/search/index.ts"],"sourcesContent":["/**\n * Fans United Search API - Public functions with caching\n */\n\nimport { searchHttp } from \"./http\";\nimport { cached, cachedBatch, memoryStore, CACHE_KEY_PREFIX } from \"../../../cache\";\nimport { getConfig, isConfigured } from \"../../../config\";\nimport {\n transformEntity,\n transformEntitySummary,\n transformCompetitionSummary,\n transformTeamSummary,\n transformCountrySummary,\n transformVenueSummary,\n transformStageNameSummary,\n} from \"./transformer\";\nimport type { RawCompetition, RawTeam, RawCountry, RawVenue, RawStageName, RawSearchEntityBase, RawRelated } from \"./raw-types\";\nimport type {\n EntitySearchOptions,\n GetEntityByIdOptions,\n GetEntitiesByIdsOptions,\n GetCompetitionsOptions,\n GetTeamsByCountryOptions,\n GetTeamsByCompetitionOptions,\n GetCountriesOptions,\n GetVenuesOptions,\n GetStageNamesOptions,\n RawSearchEntity,\n EntitySearchResponse,\n PaginatedResult,\n SearchEntityResult,\n SearchEntitySummary,\n} from \"./types\";\nimport type { NextCacheOptions } from \"../http\";\nimport type { DataLayerConfig } from \"../../../config\";\nimport type {\n FUSportsCompetitionSummary,\n FUSportsTeamSummary,\n FUSportsCountrySummary,\n FUSportsVenueSummary,\n FUSportsStageNameSummary,\n} from \"../../../types/canonical/base.types\";\n\nfunction hashParams(params: Record<string, string | string[] | undefined>): string {\n const sorted = Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${Array.isArray(v) ? v.join(\",\") : v}`)\n .join(\"&\");\n // Simple hash — sufficient for cache key uniqueness\n let hash = 0;\n for (let i = 0; i < sorted.length; i++) {\n hash = ((hash << 5) - hash + sorted.charCodeAt(i)) | 0;\n }\n return hash.toString(36);\n}\n\n/** Cache individual entities from a search response for later ID lookups */\nfunction cacheIndividualEntities(entities: RawSearchEntity[]): void {\n for (const entity of entities) {\n if (entity.id) {\n memoryStore.set(`${CACHE_KEY_PREFIX}entity:${entity.id}`, entity);\n }\n }\n}\n\n/**\n * Resolve the language for transformation.\n * Priority: options.lang → config.fansUnited.lang → \"EN\"\n */\nfunction resolveLanguage(options?: { lang?: string }): string {\n if (options?.lang) return options.lang;\n if (isConfigured()) {\n const config = getConfig();\n if (config.fansUnited && \"lang\" in config.fansUnited && config.fansUnited.lang) {\n return config.fansUnited.lang;\n }\n }\n return \"EN\";\n}\n\n/**\n * Collect missing related entity IDs (and country_id fields) from raw entities.\n */\nfunction collectMissingIds(entities: RawSearchEntity[]): Set<string> {\n const missingIds = new Set<string>();\n\n for (const entity of entities) {\n const raw = entity as Record<string, unknown>;\n\n // Collect related IDs\n const related = raw.related as RawRelated[] | undefined;\n if (related) {\n for (const r of related) {\n if (!memoryStore.get(`${CACHE_KEY_PREFIX}entity:${r.related_id}`)) {\n missingIds.add(r.related_id);\n }\n }\n }\n\n // Collect country_id\n const countryId = raw.country_id as string | undefined;\n if (countryId && !memoryStore.get(`${CACHE_KEY_PREFIX}entity:${countryId}`)) {\n missingIds.add(countryId);\n }\n }\n\n return missingIds;\n}\n\n/**\n * Search API `limit` parameter caps at 100 (and defaults to 10 if unset).\n * Passing more than 100 IDs in one request would silently drop everything\n * beyond the page limit — so we chunk and fan-out in parallel.\n */\nconst SEARCH_API_MAX_LIMIT = 100;\n\n/**\n * Fetch raw entities by ID, working around the Search API's pagination cap.\n *\n * - Always passes `limit` equal to the chunk size, so the API never silently\n * trims the response to its default page size (10).\n * - Splits requests of >100 IDs into parallel chunks of ≤100.\n */\nasync function fetchEntitiesByIds(\n ids: string[],\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<RawSearchEntity[]> {\n if (ids.length === 0) return [];\n\n const chunks: string[][] = [];\n for (let i = 0; i < ids.length; i += SEARCH_API_MAX_LIMIT) {\n chunks.push(ids.slice(i, i + SEARCH_API_MAX_LIMIT));\n }\n\n const responses = await Promise.all(\n chunks.map((chunk) =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params: {\n ids: chunk,\n limit: String(chunk.length),\n },\n next: fetchOptions?.next,\n config: fetchOptions?.config,\n })\n )\n );\n\n return responses.flatMap((r) => r.data);\n}\n\n/**\n * Batch-fetch entity IDs from the search API and cache the results.\n * Returns the fetched raw entities.\n */\nasync function batchFetchAndCache(\n ids: Set<string>,\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<RawSearchEntity[]> {\n if (ids.size === 0) return [];\n\n const data = await fetchEntitiesByIds(Array.from(ids), fetchOptions);\n cacheIndividualEntities(data);\n return data;\n}\n\n/**\n * Collect all related entity IDs (and country_id fields) from raw entities\n * that are not already in cache, then batch-fetch them.\n * Does a two-pass fetch: after the first fetch, checks the newly fetched\n * entities for their own dependencies (e.g. country_ids) and fetches those too.\n */\nasync function prefetchRelatedEntities(\n entities: RawSearchEntity[],\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<void> {\n // Pass 1: fetch related entities and country_ids from top-level entities\n const pass1Ids = collectMissingIds(entities);\n if (pass1Ids.size === 0) return;\n\n try {\n const fetched = await batchFetchAndCache(pass1Ids, fetchOptions);\n\n // Pass 2: fetch dependencies of the newly fetched entities\n // (e.g. country_ids of related competitions/teams)\n const pass2Ids = collectMissingIds(fetched);\n if (pass2Ids.size > 0) {\n await batchFetchAndCache(pass2Ids, fetchOptions);\n }\n } catch {\n // Prefetch is best-effort — if it fails, the transformer\n // will produce partial results for uncached related entities\n }\n}\n\n/**\n * Lightweight prefetch — only country_ids (single pass).\n * Used by list/search functions that return summary types.\n */\nasync function prefetchCountries(\n entities: RawSearchEntity[],\n fetchOptions?: { next?: NextCacheOptions; config?: DataLayerConfig }\n): Promise<void> {\n const missingIds = new Set<string>();\n\n for (const entity of entities) {\n const raw = entity as Record<string, unknown>;\n\n const countryId = raw.country_id as string | undefined;\n if (countryId && !memoryStore.get(`${CACHE_KEY_PREFIX}entity:${countryId}`)) {\n missingIds.add(countryId);\n }\n\n // Also check related array for COUNTRY entries\n const related = raw.related as RawRelated[] | undefined;\n if (related) {\n for (const r of related) {\n if (r.relationship === \"COUNTRY\" && !memoryStore.get(`${CACHE_KEY_PREFIX}entity:${r.related_id}`)) {\n missingIds.add(r.related_id);\n }\n }\n }\n }\n\n if (missingIds.size === 0) return;\n\n try {\n await batchFetchAndCache(missingIds, fetchOptions);\n } catch {\n // Best-effort — summary transforms will produce partial country data\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Search entities across all content types.\n * Returns transformed canonical types.\n */\nexport async function getFansUnitedSearchEntities(\n options: EntitySearchOptions = {},\n config?: { next?: EntitySearchOptions[\"next\"] }\n): Promise<PaginatedResult<SearchEntitySummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | string[] | undefined> = {\n query: options.query,\n content_type: options.contentType,\n ids: options.ids,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n mode: options.mode,\n sport: options.sport,\n relationship: options.relationship,\n value: options.value,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}search:entities:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"search\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next || config?.next,\n config: options.config,\n })\n );\n\n // Side-cache individual entities (raw)\n cacheIndividualEntities(result.data);\n\n // Pre-fetch only countries (lightweight, single pass)\n await prefetchCountries(result.data, { next: options.next || config?.next, config: options.config });\n\n // Transform each raw entity to its summary type (no related, no providerRef)\n const transformed = result.data.map((e) =>\n transformEntitySummary(e as RawSearchEntityBase & Record<string, unknown>, lang)\n );\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get a single entity by ID.\n * Returns transformed canonical type.\n */\nexport async function getFansUnitedEntityById(\n id: string,\n options?: GetEntityByIdOptions\n): Promise<SearchEntityResult> {\n const lang = resolveLanguage(options);\n const cacheKey = `${CACHE_KEY_PREFIX}entity:${id}`;\n\n const raw = await cached<RawSearchEntity>(cacheKey, \"search\", async () => {\n const response = await searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params: { ids: [id] },\n next: options?.next,\n config: options?.config,\n });\n\n if (!response.data || response.data.length === 0) {\n throw new Error(`Entity not found: ${id}`);\n }\n\n return response.data[0];\n });\n\n // Pre-fetch related entities for this single entity\n await prefetchRelatedEntities([raw], { next: options?.next, config: options?.config });\n\n return transformEntity(raw as RawSearchEntityBase & Record<string, unknown>, lang);\n}\n\n/**\n * Get multiple entities by IDs — smart batch caching.\n * Only fetches uncached IDs from the API.\n * Returns transformed canonical types.\n */\nexport async function getFansUnitedEntitiesByIds(\n ids: string[],\n options?: GetEntitiesByIdsOptions\n): Promise<SearchEntityResult[]> {\n if (ids.length === 0) return [];\n\n const lang = resolveLanguage(options);\n\n const resultsMap = await cachedBatch<RawSearchEntity>(\n ids,\n \"search\",\n async (missingIds) => {\n const fetched = await fetchEntitiesByIds(missingIds, {\n next: options?.next,\n config: options?.config,\n });\n\n const map = new Map<string, RawSearchEntity>();\n for (const entity of fetched) {\n map.set(entity.id, entity);\n }\n return map;\n },\n (id) => `${CACHE_KEY_PREFIX}entity:${id}`\n );\n\n // Collect raw entities in order\n const rawEntities = ids\n .map((id) => resultsMap.get(id))\n .filter((e): e is RawSearchEntity => e !== undefined);\n\n // Pre-fetch related entities\n await prefetchRelatedEntities(rawEntities, { next: options?.next, config: options?.config });\n\n return rawEntities.map((e) => transformEntity(e as RawSearchEntityBase & Record<string, unknown>, lang));\n}\n\n/**\n * Get competitions with optional filtering.\n * Returns transformed FUSportsCompetition objects.\n */\nexport async function getFansUnitedCompetitions(\n options: GetCompetitionsOptions = {}\n): Promise<PaginatedResult<FUSportsCompetitionSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"competition\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}competitions:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"competitions\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformCompetitionSummary(e as unknown as RawCompetition, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get teams filtered by country.\n * Returns transformed FUSportsTeamCompetitor objects.\n */\nexport async function getFansUnitedTeamsByCountry(\n countryId: string,\n options: GetTeamsByCountryOptions = {}\n): Promise<PaginatedResult<FUSportsTeamSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"team\",\n relationship: \"COUNTRY\",\n value: countryId,\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}teams:country:${countryId}:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"teams\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformTeamSummary(e as unknown as RawTeam, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get teams filtered by competition.\n * Returns transformed FUSportsTeamCompetitor objects.\n */\nexport async function getFansUnitedTeamsByCompetition(\n competitionId: string,\n options: GetTeamsByCompetitionOptions = {}\n): Promise<PaginatedResult<FUSportsTeamSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"team\",\n relationship: \"COMPETITION\",\n value: competitionId,\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}teams:competition:${competitionId}:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"teams\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformTeamSummary(e as unknown as RawTeam, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get countries with optional filtering.\n * Returns transformed FUSportsCountry objects.\n */\nexport async function getFansUnitedCountries(\n options: GetCountriesOptions = {}\n): Promise<PaginatedResult<FUSportsCountrySummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"country\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}countries:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"countries\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n\n const transformed = result.data.map((e) => transformCountrySummary(e as unknown as RawCountry, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get venues with optional filtering.\n * Returns transformed FUSportsVenue objects.\n */\nexport async function getFansUnitedVenues(\n options: GetVenuesOptions = {}\n): Promise<PaginatedResult<FUSportsVenueSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"venue\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}venues:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"venues\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n await prefetchCountries(result.data, { next: options.next, config: options.config });\n\n const transformed = result.data.map((e) => transformVenueSummary(e as unknown as RawVenue, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n/**\n * Get stage-name labels (e.g. \"Championship Group\", \"Regular Season\") with\n * optional filtering. Stage-name entities are leaf nodes — they have no\n * country, no related entities, and no assets — so no prefetch step runs.\n *\n * @example\n * ```ts\n * const { data } = await getFansUnitedStageNames({ query: \"champion\", lang: \"BG\" });\n * data.forEach((s) => console.log(s.id, s.name));\n * ```\n */\nexport async function getFansUnitedStageNames(\n options: GetStageNamesOptions = {}\n): Promise<PaginatedResult<FUSportsStageNameSummary>> {\n const lang = resolveLanguage(options);\n const params: Record<string, string | undefined> = {\n content_type: \"stage_name\",\n query: options.query,\n limit: options.limit?.toString(),\n page: options.page?.toString(),\n sport: options.sport,\n };\n\n const cacheKey = `${CACHE_KEY_PREFIX}stageNames:${hashParams(params)}`;\n\n const result = await cached<EntitySearchResponse>(cacheKey, \"stageNames\", () =>\n searchHttp.get<EntitySearchResponse>({\n path: \"/v1/entities/search\",\n params,\n next: options.next,\n config: options.config,\n })\n );\n\n cacheIndividualEntities(result.data);\n\n const transformed = result.data.map((e) => transformStageNameSummary(e as unknown as RawStageName, lang));\n\n return { data: transformed, pagination: result.meta.pagination };\n}\n\n// Re-export types\nexport type {\n SearchMode,\n EntityContentType,\n EntitySearchOptions,\n GetEntityByIdOptions,\n GetEntitiesByIdsOptions,\n GetCompetitionsOptions,\n GetTeamsByCountryOptions,\n GetTeamsByCompetitionOptions,\n GetCountriesOptions,\n GetVenuesOptions,\n GetStageNamesOptions,\n RawSearchEntity,\n EntitySearchResponse,\n PaginationMeta,\n PaginatedResult,\n SearchEntityResult,\n SearchEntitySummary,\n} from \"./types\";\n"],"names":[],"mappings":"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"}
|
|
@@ -90,4 +90,17 @@ export interface RawCoach extends RawSearchEntityBase {
|
|
|
90
90
|
birth_date?: string | null;
|
|
91
91
|
country_id?: string | null;
|
|
92
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Stage-name entities (`type: "STAGE_NAME"`) from the Search API.
|
|
95
|
+
*
|
|
96
|
+
* These are leaf-node labels: no related, no country, no assets, no branding.
|
|
97
|
+
* The raw payload sometimes returns `provider_ref` as a single object
|
|
98
|
+
* (`{ provider, id }`) rather than the usual array — the transformer
|
|
99
|
+
* normalises both forms.
|
|
100
|
+
*/
|
|
101
|
+
export interface RawStageName extends Omit<RawSearchEntityBase, "provider_ref"> {
|
|
102
|
+
type: "STAGE_NAME";
|
|
103
|
+
/** Array per the documented schema, but the live API sometimes returns a single object. */
|
|
104
|
+
provider_ref: RawProviderRef[] | RawProviderRef;
|
|
105
|
+
}
|
|
93
106
|
//# sourceMappingURL=raw-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"raw-types.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/raw-types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"raw-types.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/raw-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* maps raw snake_case fields to canonical camelCase types,
|
|
6
6
|
* and hydrates related entries (country + related) one level deep from cache.
|
|
7
7
|
*/
|
|
8
|
-
import type { FUSportsCompetition, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsCountry, FUSportsVenue, FUSportsCoach, FUSportsRelated, FUBranding, FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsPlayerSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsCoachSummary } from "../../../types/canonical/base.types";
|
|
8
|
+
import type { FUSportsCompetition, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsCountry, FUSportsVenue, FUSportsCoach, FUSportsStageName, FUSportsRelated, FUBranding, FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsPlayerSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsCoachSummary, FUSportsStageNameSummary } from "../../../types/canonical/base.types";
|
|
9
9
|
import type { SearchEntityResult, SearchEntitySummary } from "./types";
|
|
10
|
-
import type { RawTranslation, RawAsset, RawRelated, RawProviderRef, RawBranding, RawTeamBranding, RawSearchEntityBase, RawCompetition, RawTeam, RawAthlete, RawCountry, RawVenue, RawCoach } from "./raw-types";
|
|
10
|
+
import type { RawTranslation, RawAsset, RawRelated, RawProviderRef, RawBranding, RawTeamBranding, RawSearchEntityBase, RawCompetition, RawTeam, RawAthlete, RawCountry, RawVenue, RawCoach, RawStageName } from "./raw-types";
|
|
11
11
|
/**
|
|
12
12
|
* Resolve name/shortName in target language.
|
|
13
13
|
* Fallback order: target lang → EN → raw name.
|
|
@@ -18,6 +18,12 @@ export declare function resolveTranslation(translations: RawTranslation[], lang:
|
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
20
|
* Map [{key: "LOGO", value: "url"}] → { logo: "url" }
|
|
21
|
+
*
|
|
22
|
+
* Defensively skips entries whose `key` or `value` is null/undefined.
|
|
23
|
+
* The {@link RawAsset} type declares both as non-nullable strings, but the
|
|
24
|
+
* Search API occasionally returns `{ key: null, … }` — without this guard,
|
|
25
|
+
* a single bad asset throws inside `toLowerCase()` and aborts the entire
|
|
26
|
+
* transform chain (crashing every consumer pulling entities across sports).
|
|
21
27
|
*/
|
|
22
28
|
export declare function resolveAssets(assets: RawAsset[]): Record<string, string>;
|
|
23
29
|
/**
|
|
@@ -29,6 +35,13 @@ export declare function resolveProviderRef(refs: RawProviderRef[]): {
|
|
|
29
35
|
provider: string;
|
|
30
36
|
id: string;
|
|
31
37
|
}[];
|
|
38
|
+
/**
|
|
39
|
+
* Normalise a raw `provider_ref` that may arrive as either an array or a
|
|
40
|
+
* single object. The documented shape is an array, but at least the
|
|
41
|
+
* STAGE_NAME entity in the Search API has been observed returning a single
|
|
42
|
+
* object — guard once at the edge so callers can rely on the array form.
|
|
43
|
+
*/
|
|
44
|
+
export declare function normaliseProviderRef(raw: RawProviderRef[] | RawProviderRef | undefined | null): RawProviderRef[];
|
|
32
45
|
/** Extract related IDs by relationship type */
|
|
33
46
|
export declare function getRelatedIds(related: RawRelated[], relationship: string): string[];
|
|
34
47
|
/**
|
|
@@ -41,6 +54,7 @@ export declare function transformCompetitionSummary(raw: RawCompetition, lang: s
|
|
|
41
54
|
export declare function transformTeamSummary(raw: RawTeam, lang: string): FUSportsTeamSummary;
|
|
42
55
|
export declare function transformAthleteSummary(raw: RawAthlete, lang: string): FUSportsPlayerSummary;
|
|
43
56
|
export declare function transformVenueSummary(raw: RawVenue, lang: string): FUSportsVenueSummary;
|
|
57
|
+
export declare function transformStageNameSummary(raw: RawStageName, lang: string): FUSportsStageNameSummary;
|
|
44
58
|
export declare function transformCoachSummary(raw: RawCoach, lang: string): FUSportsCoachSummary;
|
|
45
59
|
/**
|
|
46
60
|
* Resolve all related entries from cache, grouped by relationship type.
|
|
@@ -52,6 +66,7 @@ export declare function transformTeam(raw: RawTeam, lang: string): FUSportsTeamC
|
|
|
52
66
|
export declare function transformAthlete(raw: RawAthlete, lang: string): FUSportsPlayerCompetitor;
|
|
53
67
|
export declare function transformCountry(raw: RawCountry, lang: string): FUSportsCountry;
|
|
54
68
|
export declare function transformVenue(raw: RawVenue, lang: string): FUSportsVenue;
|
|
69
|
+
export declare function transformStageName(raw: RawStageName, lang: string): FUSportsStageName;
|
|
55
70
|
export declare function transformCoach(raw: RawCoach, lang: string): FUSportsCoach;
|
|
56
71
|
/**
|
|
57
72
|
* Determine entity type from raw data and call the appropriate transformer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/transformer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACR,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACV,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,7 @@ function resolveTranslation(translations, lang, fallbackName, fallbackShortName)
|
|
|
26
26
|
function resolveAssets(assets) {
|
|
27
27
|
const result = {};
|
|
28
28
|
for (const asset of assets) {
|
|
29
|
+
if (typeof asset?.key !== "string" || typeof asset.value !== "string") continue;
|
|
29
30
|
result[asset.key.toLowerCase()] = asset.value;
|
|
30
31
|
}
|
|
31
32
|
return result;
|
|
@@ -45,6 +46,10 @@ function resolveBranding(raw) {
|
|
|
45
46
|
function resolveProviderRef(refs) {
|
|
46
47
|
return refs.map((r) => ({ provider: r.provider, id: r.id }));
|
|
47
48
|
}
|
|
49
|
+
function normaliseProviderRef(raw) {
|
|
50
|
+
if (!raw) return [];
|
|
51
|
+
return Array.isArray(raw) ? raw : [raw];
|
|
52
|
+
}
|
|
48
53
|
function getRelatedIds(related, relationship) {
|
|
49
54
|
return related.filter((r) => r.relationship === relationship).map((r) => r.related_id);
|
|
50
55
|
}
|
|
@@ -142,6 +147,15 @@ function transformVenueSummary(raw, lang) {
|
|
|
142
147
|
} : {}
|
|
143
148
|
};
|
|
144
149
|
}
|
|
150
|
+
function transformStageNameSummary(raw, lang) {
|
|
151
|
+
const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
152
|
+
return {
|
|
153
|
+
id: raw.id,
|
|
154
|
+
name,
|
|
155
|
+
...shortName ? { shortName } : {},
|
|
156
|
+
...raw.sport ? { sport: raw.sport } : {}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
145
159
|
function transformCoachSummary(raw, lang) {
|
|
146
160
|
const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
147
161
|
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
@@ -166,6 +180,8 @@ function hydrateRelatedEntity(id, relationship, lang) {
|
|
|
166
180
|
return transformAthleteSummary(raw, lang);
|
|
167
181
|
case "COUNTRY":
|
|
168
182
|
return transformCountrySummary(raw, lang);
|
|
183
|
+
case "STAGE_NAME":
|
|
184
|
+
return transformStageNameSummary(raw, lang);
|
|
169
185
|
default:
|
|
170
186
|
return void 0;
|
|
171
187
|
}
|
|
@@ -189,6 +205,9 @@ function resolveRelated(related, lang) {
|
|
|
189
205
|
case "COUNTRY":
|
|
190
206
|
(result.countries ??= []).push(hydrated);
|
|
191
207
|
break;
|
|
208
|
+
case "STAGE_NAME":
|
|
209
|
+
(result.stageNames ??= []).push(hydrated);
|
|
210
|
+
break;
|
|
192
211
|
}
|
|
193
212
|
}
|
|
194
213
|
return Object.keys(result).length > 0 ? result : void 0;
|
|
@@ -287,6 +306,14 @@ function transformVenue(raw, lang) {
|
|
|
287
306
|
...related ? { related } : {}
|
|
288
307
|
};
|
|
289
308
|
}
|
|
309
|
+
function transformStageName(raw, lang) {
|
|
310
|
+
const summary = transformStageNameSummary(raw, lang);
|
|
311
|
+
const refs = normaliseProviderRef(raw.provider_ref);
|
|
312
|
+
return {
|
|
313
|
+
...summary,
|
|
314
|
+
...refs.length ? { providerRef: resolveProviderRef(refs) } : {}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
290
317
|
function transformCoach(raw, lang) {
|
|
291
318
|
const { name } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);
|
|
292
319
|
const country = resolveCountry(raw.country_id, raw.related ?? [], lang);
|
|
@@ -308,6 +335,9 @@ function transformEntity(raw, lang) {
|
|
|
308
335
|
if (contentType === "COMPETITION" || entityType === "competition") {
|
|
309
336
|
return { ...transformCompetition(raw, lang), entityType: "competition" };
|
|
310
337
|
}
|
|
338
|
+
if (entityType === "stagename" || type === "STAGE_NAME") {
|
|
339
|
+
return { ...transformStageName(raw, lang), entityType: "stageName" };
|
|
340
|
+
}
|
|
311
341
|
if (entityType === "country" || raw.country_code !== void 0) {
|
|
312
342
|
return { ...transformCountry(raw, lang), entityType: "country" };
|
|
313
343
|
}
|
|
@@ -332,6 +362,9 @@ function transformEntitySummary(raw, lang) {
|
|
|
332
362
|
if (contentType === "COMPETITION" || entityType === "competition") {
|
|
333
363
|
return { ...transformCompetitionSummary(raw, lang), entityType: "competition" };
|
|
334
364
|
}
|
|
365
|
+
if (entityType === "stagename" || type === "STAGE_NAME") {
|
|
366
|
+
return { ...transformStageNameSummary(raw, lang), entityType: "stageName" };
|
|
367
|
+
}
|
|
335
368
|
if (entityType === "country" || raw.country_code !== void 0) {
|
|
336
369
|
return { ...transformCountrySummary(raw, lang), entityType: "country" };
|
|
337
370
|
}
|
|
@@ -351,6 +384,7 @@ function transformEntitySummary(raw, lang) {
|
|
|
351
384
|
}
|
|
352
385
|
export {
|
|
353
386
|
getRelatedIds,
|
|
387
|
+
normaliseProviderRef,
|
|
354
388
|
resolveAssets,
|
|
355
389
|
resolveBranding,
|
|
356
390
|
resolveCountry,
|
|
@@ -367,6 +401,8 @@ export {
|
|
|
367
401
|
transformCountrySummary,
|
|
368
402
|
transformEntity,
|
|
369
403
|
transformEntitySummary,
|
|
404
|
+
transformStageName,
|
|
405
|
+
transformStageNameSummary,
|
|
370
406
|
transformTeam,
|
|
371
407
|
transformTeamSummary,
|
|
372
408
|
transformVenue,
|
|
@@ -1 +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, CACHE_KEY_PREFIX } 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>(`${CACHE_KEY_PREFIX}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>>(`${CACHE_KEY_PREFIX}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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"}
|
|
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, CACHE_KEY_PREFIX } from \"../../../cache\";\nimport type {\n FUSportsCompetition,\n FUSportsTeamCompetitor,\n FUSportsPlayerCompetitor,\n FUSportsCountry,\n FUSportsVenue,\n FUSportsCoach,\n FUSportsStageName,\n FUSportsRelated,\n FUBranding,\n FUSportsCompetitionSummary,\n FUSportsTeamSummary,\n FUSportsPlayerSummary,\n FUSportsCountrySummary,\n FUSportsVenueSummary,\n FUSportsCoachSummary,\n FUSportsStageNameSummary,\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 RawStageName,\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 *\n * Defensively skips entries whose `key` or `value` is null/undefined.\n * The {@link RawAsset} type declares both as non-nullable strings, but the\n * Search API occasionally returns `{ key: null, … }` — without this guard,\n * a single bad asset throws inside `toLowerCase()` and aborts the entire\n * transform chain (crashing every consumer pulling entities across sports).\n */\nexport function resolveAssets(assets: RawAsset[]): Record<string, string> {\n const result: Record<string, string> = {};\n for (const asset of assets) {\n if (typeof asset?.key !== \"string\" || typeof asset.value !== \"string\") continue;\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/**\n * Normalise a raw `provider_ref` that may arrive as either an array or a\n * single object. The documented shape is an array, but at least the\n * STAGE_NAME entity in the Search API has been observed returning a single\n * object — guard once at the edge so callers can rely on the array form.\n */\nexport function normaliseProviderRef(\n raw: RawProviderRef[] | RawProviderRef | undefined | null\n): RawProviderRef[] {\n if (!raw) return [];\n return Array.isArray(raw) ? raw : [raw];\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>(`${CACHE_KEY_PREFIX}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 transformStageNameSummary(raw: RawStageName, lang: string): FUSportsStageNameSummary {\n const { name, shortName } = resolveTranslation(raw.translations ?? [], lang, raw.name, raw.short_name);\n return {\n id: raw.id,\n name,\n ...(shortName ? { shortName } : {}),\n ...(raw.sport ? { sport: raw.sport } : {}),\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 | FUSportsStageName | undefined {\n const entry = memoryStore.get<RawSearchEntityBase & Record<string, unknown>>(id)\n ?? memoryStore.get<RawSearchEntityBase & Record<string, unknown>>(`${CACHE_KEY_PREFIX}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 case \"STAGE_NAME\":\n return transformStageNameSummary(raw as unknown as RawStageName, 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 case \"STAGE_NAME\":\n (result.stageNames ??= []).push(hydrated as FUSportsStageName);\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 transformStageName(raw: RawStageName, lang: string): FUSportsStageName {\n const summary = transformStageNameSummary(raw, lang);\n const refs = normaliseProviderRef(raw.provider_ref);\n return {\n ...summary,\n ...(refs.length ? { providerRef: resolveProviderRef(refs) } : {}),\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 === \"stagename\" || type === \"STAGE_NAME\") {\n return { ...transformStageName(raw as unknown as RawStageName, lang), entityType: \"stageName\" };\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 === \"stagename\" || type === \"STAGE_NAME\") {\n return { ...transformStageNameSummary(raw as unknown as RawStageName, lang), entityType: \"stageName\" };\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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"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { NextCacheOptions } from "../http";
|
|
5
5
|
import type { DataLayerConfig } from "../../../config";
|
|
6
|
-
import type { FUSportsCompetition, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsCountry, FUSportsVenue, FUSportsCoach, FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsPlayerSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsCoachSummary } from "../../../types/canonical/base.types";
|
|
6
|
+
import type { FUSportsCompetition, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsCountry, FUSportsVenue, FUSportsCoach, FUSportsStageName, FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsPlayerSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsCoachSummary, FUSportsStageNameSummary } from "../../../types/canonical/base.types";
|
|
7
7
|
export type SearchMode = "CASE_INSENSITIVE" | "CASE_SENSITIVE" | "FULL_MATCH";
|
|
8
|
-
export type EntityContentType = "venue" | "athlete" | "team" | "competition" | "country" | "coach";
|
|
8
|
+
export type EntityContentType = "venue" | "athlete" | "team" | "competition" | "country" | "coach" | "stage_name";
|
|
9
9
|
export interface PaginationMeta {
|
|
10
10
|
current_page: number;
|
|
11
11
|
items_per_page: number;
|
|
@@ -28,6 +28,8 @@ export type SearchEntitySummary = (FUSportsCompetitionSummary & {
|
|
|
28
28
|
entityType: "venue";
|
|
29
29
|
}) | (FUSportsCoachSummary & {
|
|
30
30
|
entityType: "coach";
|
|
31
|
+
}) | (FUSportsStageNameSummary & {
|
|
32
|
+
entityType: "stageName";
|
|
31
33
|
});
|
|
32
34
|
/**
|
|
33
35
|
* Full union — returned by getById/getByIds functions.
|
|
@@ -45,6 +47,8 @@ export type SearchEntityResult = (FUSportsCompetition & {
|
|
|
45
47
|
entityType: "venue";
|
|
46
48
|
}) | (FUSportsCoach & {
|
|
47
49
|
entityType: "coach";
|
|
50
|
+
}) | (FUSportsStageName & {
|
|
51
|
+
entityType: "stageName";
|
|
48
52
|
});
|
|
49
53
|
/**
|
|
50
54
|
* Raw entity as stored in cache (before transformation).
|
|
@@ -133,4 +137,13 @@ export interface GetVenuesOptions {
|
|
|
133
137
|
next?: NextCacheOptions;
|
|
134
138
|
config?: DataLayerConfig;
|
|
135
139
|
}
|
|
140
|
+
export interface GetStageNamesOptions {
|
|
141
|
+
query?: string;
|
|
142
|
+
limit?: number;
|
|
143
|
+
page?: number;
|
|
144
|
+
sport?: string;
|
|
145
|
+
lang?: string;
|
|
146
|
+
next?: NextCacheOptions;
|
|
147
|
+
config?: DataLayerConfig;
|
|
148
|
+
}
|
|
136
149
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EACR,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,aAAa,EACb,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/api/fansunited/search/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/lib/cache/cache-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvF,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACpB,IAAI,aAAa,IAAI,OAAO,CAAC;IAC7B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzE,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;CAC/B;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE3C;AAED,wCAAwC;AACxC,wBAAgB,KAAK,IAAI,OAAO,GAAG,IAAI,CAEtC;AAED,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/lib/cache/cache-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvF,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACpB,IAAI,aAAa,IAAI,OAAO,CAAC;IAC7B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACzE,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;CAC/B;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE3C;AAED,wCAAwC;AACxC,wBAAgB,KAAK,IAAI,OAAO,GAAG,IAAI,CAEtC;AAED,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAU5D,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAEhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,iBAAiB,CAElE;AAwCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAoCtG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAC/D,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CA6DzB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE5C;AAGD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
package/cache/cache-manager.js
CHANGED
|
@@ -10,6 +10,7 @@ const ENTITY_TTL_CONFIG = {
|
|
|
10
10
|
venues: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },
|
|
11
11
|
countries: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },
|
|
12
12
|
coaches: { staleTTL: 24 * 3600, maxTTL: 72 * 3600 },
|
|
13
|
+
stageNames: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },
|
|
13
14
|
search: { staleTTL: 8 * 3600, maxTTL: 2 * 24 * 3600 },
|
|
14
15
|
sportsCompetition: { staleTTL: 5 * 60, maxTTL: 3600 }
|
|
15
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.js","sources":["../../src/lib/cache/cache-manager.ts"],"sourcesContent":["/**\n * Cache Manager - Orchestrates L1 (memory) + optional L2 with SWR pattern\n *\n * L2 (SQLite) is never statically imported here — it's injected at runtime\n * via initL2() so that browser bundles don't pull in better-sqlite3.\n */\n\nimport { memoryStore } from \"./memory-store\";\nimport type { CacheEntry, EntityCacheConfig, EntityType, MaybePromise } from \"./types\";\n\n/** Interface that L2 stores must satisfy. Methods may be sync or async. */\nexport interface L2Store {\n get isInitialized(): boolean;\n get<T>(key: string): MaybePromise<CacheEntry<T> | undefined>;\n set(key: string, entity: EntityType, data: unknown): MaybePromise<void>;\n setMany(entries: { key: string; entity: EntityType; data: unknown }[]): MaybePromise<void>;\n cleanup(entity: EntityType, maxTTLSeconds: number): MaybePromise<number>;\n clear(): MaybePromise<void>;\n}\n\n/** The active L2 store — null until initL2() is called */\nlet l2: L2Store | null = null;\n\n/**\n * Initialize the L2 cache layer. Call once at server startup; the binding\n * is process-wide and replaces any previously-set store.\n *\n * In browser bundles, never call this — L2 is opt-in and the cache will\n * operate L1-only when uninitialized (correct, just slower).\n *\n * In multi-instance deployments (e.g. Cloud Run), L2 should be a shared,\n * durable store (Redis, DynamoDB, …) so a warm cache from one instance\n * serves every other instance. A reference Redis adapter is at\n * `src/lib/cache/__tests__/redis-l2-store.ts`.\n *\n * @example Next.js instrumentation hook\n * ```ts\n * // instrumentation.ts\n * export async function register() {\n * if (process.env.NEXT_RUNTIME !== \"nodejs\") return;\n * const { initL2 } = await import(\"fansunited-data-layer\");\n * const { createRedisL2Store } = await import(\"./src/lib/cache/redisL2Store\");\n * const { getRedis } = await import(\"./src/lib/redis\");\n * initL2(createRedisL2Store({ client: getRedis() }));\n * }\n * ```\n *\n * @see {@link L2Store} for the interface a custom store must satisfy.\n */\nexport function initL2(store: L2Store): void {\n l2 = store;\n}\n\n/** Get the L2 store (if initialized) */\nexport function getL2(): L2Store | null {\n return l2;\n}\n\nconst ENTITY_TTL_CONFIG: Record<EntityType, EntityCacheConfig> = {\n competitions: { staleTTL: 8 * 3600, maxTTL: 72 * 3600 },\n teams: { staleTTL: 8 * 3600, maxTTL: 48 * 3600 },\n athletes: { staleTTL: 8 * 3600, maxTTL: 48 * 3600 },\n venues: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },\n countries: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },\n coaches: { staleTTL: 24 * 3600, maxTTL: 72 * 3600 },\n search: { staleTTL: 8 * 3600, maxTTL: 2 * 24 * 3600 },\n sportsCompetition: { staleTTL: 5 * 60, maxTTL: 3600 },\n};\n\n/**\n * Replace the TTL config for an entity type at runtime. The new values\n * apply to subsequent `cached()` / `cachedBatch()` calls; existing L2\n * entries keep whatever TTL they were written with.\n *\n * Useful for:\n * - per-environment tuning (dev: short TTLs to see changes; prod: long)\n * - overriding ahead of a known traffic spike\n * - tests that need to simulate stale / expired entries in seconds\n *\n * @example\n * ```ts\n * setEntityTTL(\"sportsCompetition\", { staleTTL: 30, maxTTL: 600 });\n * ```\n *\n * @see ../README.md § 7 for the full list of default TTLs.\n */\nexport function setEntityTTL(entity: EntityType, config: EntityCacheConfig): void {\n ENTITY_TTL_CONFIG[entity] = { ...config };\n}\n\n/**\n * Read the current TTL config for an entity type.\n *\n * Primarily for L2 adapters that translate `entity` into an underlying\n * eviction TTL (e.g. Redis `EX` seconds = `maxTTL`). The returned object\n * is a defensive copy — mutating it has no effect on the manager.\n *\n * @throws when called with an entity name not in the config.\n */\nexport function getEntityTTL(entity: EntityType): EntityCacheConfig {\n return { ...getConfig(entity) };\n}\n\n/** Set of keys currently being refreshed in the background (thundering herd prevention) */\nconst refreshing = new Set<string>();\n\nfunction getConfig(entity: EntityType): EntityCacheConfig {\n const config = ENTITY_TTL_CONFIG[entity];\n if (!config) {\n throw new Error(`Unknown entity type: ${entity}`);\n }\n return config;\n}\n\nfunction isFresh(entry: CacheEntry<unknown>, staleTTL: number): boolean {\n return Date.now() - entry.storedAt < staleTTL * 1000;\n}\n\nfunction isExpired(entry: CacheEntry<unknown>, maxTTL: number): boolean {\n return Date.now() - entry.storedAt >= maxTTL * 1000;\n}\n\nfunction backgroundRefresh<T>(key: string, entity: EntityType, fetcher: () => Promise<T>): void {\n if (refreshing.has(key)) return;\n refreshing.add(key);\n\n fetcher()\n .then(async (data) => {\n memoryStore.set(key, data);\n if (l2?.isInitialized) {\n await l2.set(key, entity, data);\n }\n })\n .catch((err) => {\n console.error(`[cache] Background refresh failed for ${key}:`, err);\n })\n .finally(() => {\n refreshing.delete(key);\n });\n}\n\n/**\n * Single-key cache-through with stale-while-revalidate.\n *\n * Flow:\n * 1. L1 hit, fresh (< staleTTL) → return.\n * 2. L1 hit, stale but valid (< maxTTL) → return + kick background refresh.\n * 3. L1 miss, L2 hit, fresh → promote to L1 + return.\n * 4. L1 miss, L2 hit, stale but valid → promote + return + background refresh.\n * 5. Full miss → await `fetcher`, populate L1+L2, return.\n *\n * Background refreshes share a per-key in-flight set, so concurrent\n * callers don't trigger a thundering herd of upstream fetches.\n *\n * The `key` must include the {@link CACHE_KEY_PREFIX} (`\"fudl:\"`) by\n * convention so it can be SCANned safely in a shared Redis instance.\n *\n * @param key Fully-qualified cache key (e.g. `\"fudl:sports:competition:fb:c:1:active\"`).\n * @param entity Entity type — drives the SWR window via `ENTITY_TTL_CONFIG`.\n * @param fetcher Upstream call, invoked on miss or background refresh.\n *\n * @example\n * ```ts\n * const data = await cached(\n * `${CACHE_KEY_PREFIX}sports:competition:${id}:active`,\n * \"sportsCompetition\",\n * () => fetchFromSportsApi(id),\n * );\n * ```\n */\nexport async function cached<T>(key: string, entity: EntityType, fetcher: () => Promise<T>): Promise<T> {\n const { staleTTL, maxTTL } = getConfig(entity);\n\n // L1 check\n const l1 = memoryStore.get<T>(key);\n if (l1) {\n if (isFresh(l1, staleTTL)) {\n return l1.data;\n }\n if (!isExpired(l1, maxTTL)) {\n backgroundRefresh(key, entity, fetcher);\n return l1.data;\n }\n }\n\n // L2 check\n if (l2?.isInitialized) {\n const l2Entry = await l2.get<T>(key);\n if (l2Entry && !isExpired(l2Entry, maxTTL)) {\n // Promote to L1\n memoryStore.set(key, l2Entry.data);\n if (isFresh(l2Entry, staleTTL)) {\n return l2Entry.data;\n }\n backgroundRefresh(key, entity, fetcher);\n return l2Entry.data;\n }\n }\n\n // Full miss — await fetcher\n const data = await fetcher();\n memoryStore.set(key, data);\n if (l2?.isInitialized) {\n await l2.set(key, entity, data);\n }\n return data;\n}\n\n/**\n * Multi-key cache-through with stale-while-revalidate.\n *\n * For each `id`, the cache is checked (L1, then L2) and only the *missing*\n * IDs are passed to `batchFetcher` in a single upstream call. Stale-but-\n * valid entries are returned immediately and refreshed in the background\n * per-key, just like {@link cached}.\n *\n * Why a separate function from `cached`? An N-ID lookup is one upstream\n * batch request, not N parallel single-key calls — which is the whole\n * reason the Search API supports `?ids=…,…` in the first place.\n *\n * @param ids IDs to resolve, in request order.\n * @param entity Entity type — drives the SWR window.\n * @param batchFetcher Called with the subset of IDs not in cache.\n * Must return a `Map<id, value>` (missing IDs okay).\n * @param keyFn Builds a fully-qualified cache key from an ID.\n * Convention: `(id) => \\`${CACHE_KEY_PREFIX}entity:${id}\\``.\n *\n * @example\n * ```ts\n * const entities = await cachedBatch(\n * ids,\n * \"search\",\n * async (missingIds) => {\n * const resp = await searchApi.get({ ids: missingIds, limit: missingIds.length });\n * return new Map(resp.data.map((e) => [e.id, e]));\n * },\n * (id) => `${CACHE_KEY_PREFIX}entity:${id}`,\n * );\n * ```\n */\nexport async function cachedBatch<T>(\n ids: string[],\n entity: EntityType,\n batchFetcher: (missingIds: string[]) => Promise<Map<string, T>>,\n keyFn: (id: string) => string\n): Promise<Map<string, T>> {\n const { staleTTL, maxTTL } = getConfig(entity);\n const results = new Map<string, T>();\n const missingIds: string[] = [];\n\n for (const id of ids) {\n const key = keyFn(id);\n let found = false;\n\n // L1 check\n const l1 = memoryStore.get<T>(key);\n if (l1 && !isExpired(l1, maxTTL)) {\n results.set(id, l1.data);\n if (!isFresh(l1, staleTTL)) {\n backgroundRefresh(key, entity, async () => {\n const fetched = await batchFetcher([id]);\n const item = fetched.get(id);\n if (!item) throw new Error(`Batch fetcher did not return ID: ${id}`);\n return item;\n });\n }\n found = true;\n }\n\n // L2 check\n if (!found && l2?.isInitialized) {\n const l2Entry = await l2.get<T>(key);\n if (l2Entry && !isExpired(l2Entry, maxTTL)) {\n memoryStore.set(key, l2Entry.data);\n results.set(id, l2Entry.data);\n if (!isFresh(l2Entry, staleTTL)) {\n backgroundRefresh(key, entity, async () => {\n const fetched = await batchFetcher([id]);\n const item = fetched.get(id);\n if (!item) throw new Error(`Batch fetcher did not return ID: ${id}`);\n return item;\n });\n }\n found = true;\n }\n }\n\n if (!found) {\n missingIds.push(id);\n }\n }\n\n // Fetch missing IDs in a single batch\n if (missingIds.length > 0) {\n const fetched = await batchFetcher(missingIds);\n for (const [id, data] of fetched) {\n const key = keyFn(id);\n memoryStore.set(key, data);\n if (l2?.isInitialized) {\n await l2.set(key, entity, data);\n }\n results.set(id, data);\n }\n }\n\n return results;\n}\n\n/**\n * Remove an entry from both cache layers\n */\nexport function invalidate(key: string): void {\n memoryStore.delete(key);\n}\n\n// Export for testing\nexport { ENTITY_TTL_CONFIG };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cache-manager.js","sources":["../../src/lib/cache/cache-manager.ts"],"sourcesContent":["/**\n * Cache Manager - Orchestrates L1 (memory) + optional L2 with SWR pattern\n *\n * L2 (SQLite) is never statically imported here — it's injected at runtime\n * via initL2() so that browser bundles don't pull in better-sqlite3.\n */\n\nimport { memoryStore } from \"./memory-store\";\nimport type { CacheEntry, EntityCacheConfig, EntityType, MaybePromise } from \"./types\";\n\n/** Interface that L2 stores must satisfy. Methods may be sync or async. */\nexport interface L2Store {\n get isInitialized(): boolean;\n get<T>(key: string): MaybePromise<CacheEntry<T> | undefined>;\n set(key: string, entity: EntityType, data: unknown): MaybePromise<void>;\n setMany(entries: { key: string; entity: EntityType; data: unknown }[]): MaybePromise<void>;\n cleanup(entity: EntityType, maxTTLSeconds: number): MaybePromise<number>;\n clear(): MaybePromise<void>;\n}\n\n/** The active L2 store — null until initL2() is called */\nlet l2: L2Store | null = null;\n\n/**\n * Initialize the L2 cache layer. Call once at server startup; the binding\n * is process-wide and replaces any previously-set store.\n *\n * In browser bundles, never call this — L2 is opt-in and the cache will\n * operate L1-only when uninitialized (correct, just slower).\n *\n * In multi-instance deployments (e.g. Cloud Run), L2 should be a shared,\n * durable store (Redis, DynamoDB, …) so a warm cache from one instance\n * serves every other instance. A reference Redis adapter is at\n * `src/lib/cache/__tests__/redis-l2-store.ts`.\n *\n * @example Next.js instrumentation hook\n * ```ts\n * // instrumentation.ts\n * export async function register() {\n * if (process.env.NEXT_RUNTIME !== \"nodejs\") return;\n * const { initL2 } = await import(\"fansunited-data-layer\");\n * const { createRedisL2Store } = await import(\"./src/lib/cache/redisL2Store\");\n * const { getRedis } = await import(\"./src/lib/redis\");\n * initL2(createRedisL2Store({ client: getRedis() }));\n * }\n * ```\n *\n * @see {@link L2Store} for the interface a custom store must satisfy.\n */\nexport function initL2(store: L2Store): void {\n l2 = store;\n}\n\n/** Get the L2 store (if initialized) */\nexport function getL2(): L2Store | null {\n return l2;\n}\n\nconst ENTITY_TTL_CONFIG: Record<EntityType, EntityCacheConfig> = {\n competitions: { staleTTL: 8 * 3600, maxTTL: 72 * 3600 },\n teams: { staleTTL: 8 * 3600, maxTTL: 48 * 3600 },\n athletes: { staleTTL: 8 * 3600, maxTTL: 48 * 3600 },\n venues: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },\n countries: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },\n coaches: { staleTTL: 24 * 3600, maxTTL: 72 * 3600 },\n stageNames: { staleTTL: 7 * 24 * 3600, maxTTL: 14 * 24 * 3600 },\n search: { staleTTL: 8 * 3600, maxTTL: 2 * 24 * 3600 },\n sportsCompetition: { staleTTL: 5 * 60, maxTTL: 3600 },\n};\n\n/**\n * Replace the TTL config for an entity type at runtime. The new values\n * apply to subsequent `cached()` / `cachedBatch()` calls; existing L2\n * entries keep whatever TTL they were written with.\n *\n * Useful for:\n * - per-environment tuning (dev: short TTLs to see changes; prod: long)\n * - overriding ahead of a known traffic spike\n * - tests that need to simulate stale / expired entries in seconds\n *\n * @example\n * ```ts\n * setEntityTTL(\"sportsCompetition\", { staleTTL: 30, maxTTL: 600 });\n * ```\n *\n * @see ../README.md § 7 for the full list of default TTLs.\n */\nexport function setEntityTTL(entity: EntityType, config: EntityCacheConfig): void {\n ENTITY_TTL_CONFIG[entity] = { ...config };\n}\n\n/**\n * Read the current TTL config for an entity type.\n *\n * Primarily for L2 adapters that translate `entity` into an underlying\n * eviction TTL (e.g. Redis `EX` seconds = `maxTTL`). The returned object\n * is a defensive copy — mutating it has no effect on the manager.\n *\n * @throws when called with an entity name not in the config.\n */\nexport function getEntityTTL(entity: EntityType): EntityCacheConfig {\n return { ...getConfig(entity) };\n}\n\n/** Set of keys currently being refreshed in the background (thundering herd prevention) */\nconst refreshing = new Set<string>();\n\nfunction getConfig(entity: EntityType): EntityCacheConfig {\n const config = ENTITY_TTL_CONFIG[entity];\n if (!config) {\n throw new Error(`Unknown entity type: ${entity}`);\n }\n return config;\n}\n\nfunction isFresh(entry: CacheEntry<unknown>, staleTTL: number): boolean {\n return Date.now() - entry.storedAt < staleTTL * 1000;\n}\n\nfunction isExpired(entry: CacheEntry<unknown>, maxTTL: number): boolean {\n return Date.now() - entry.storedAt >= maxTTL * 1000;\n}\n\nfunction backgroundRefresh<T>(key: string, entity: EntityType, fetcher: () => Promise<T>): void {\n if (refreshing.has(key)) return;\n refreshing.add(key);\n\n fetcher()\n .then(async (data) => {\n memoryStore.set(key, data);\n if (l2?.isInitialized) {\n await l2.set(key, entity, data);\n }\n })\n .catch((err) => {\n console.error(`[cache] Background refresh failed for ${key}:`, err);\n })\n .finally(() => {\n refreshing.delete(key);\n });\n}\n\n/**\n * Single-key cache-through with stale-while-revalidate.\n *\n * Flow:\n * 1. L1 hit, fresh (< staleTTL) → return.\n * 2. L1 hit, stale but valid (< maxTTL) → return + kick background refresh.\n * 3. L1 miss, L2 hit, fresh → promote to L1 + return.\n * 4. L1 miss, L2 hit, stale but valid → promote + return + background refresh.\n * 5. Full miss → await `fetcher`, populate L1+L2, return.\n *\n * Background refreshes share a per-key in-flight set, so concurrent\n * callers don't trigger a thundering herd of upstream fetches.\n *\n * The `key` must include the {@link CACHE_KEY_PREFIX} (`\"fudl:\"`) by\n * convention so it can be SCANned safely in a shared Redis instance.\n *\n * @param key Fully-qualified cache key (e.g. `\"fudl:sports:competition:fb:c:1:active\"`).\n * @param entity Entity type — drives the SWR window via `ENTITY_TTL_CONFIG`.\n * @param fetcher Upstream call, invoked on miss or background refresh.\n *\n * @example\n * ```ts\n * const data = await cached(\n * `${CACHE_KEY_PREFIX}sports:competition:${id}:active`,\n * \"sportsCompetition\",\n * () => fetchFromSportsApi(id),\n * );\n * ```\n */\nexport async function cached<T>(key: string, entity: EntityType, fetcher: () => Promise<T>): Promise<T> {\n const { staleTTL, maxTTL } = getConfig(entity);\n\n // L1 check\n const l1 = memoryStore.get<T>(key);\n if (l1) {\n if (isFresh(l1, staleTTL)) {\n return l1.data;\n }\n if (!isExpired(l1, maxTTL)) {\n backgroundRefresh(key, entity, fetcher);\n return l1.data;\n }\n }\n\n // L2 check\n if (l2?.isInitialized) {\n const l2Entry = await l2.get<T>(key);\n if (l2Entry && !isExpired(l2Entry, maxTTL)) {\n // Promote to L1\n memoryStore.set(key, l2Entry.data);\n if (isFresh(l2Entry, staleTTL)) {\n return l2Entry.data;\n }\n backgroundRefresh(key, entity, fetcher);\n return l2Entry.data;\n }\n }\n\n // Full miss — await fetcher\n const data = await fetcher();\n memoryStore.set(key, data);\n if (l2?.isInitialized) {\n await l2.set(key, entity, data);\n }\n return data;\n}\n\n/**\n * Multi-key cache-through with stale-while-revalidate.\n *\n * For each `id`, the cache is checked (L1, then L2) and only the *missing*\n * IDs are passed to `batchFetcher` in a single upstream call. Stale-but-\n * valid entries are returned immediately and refreshed in the background\n * per-key, just like {@link cached}.\n *\n * Why a separate function from `cached`? An N-ID lookup is one upstream\n * batch request, not N parallel single-key calls — which is the whole\n * reason the Search API supports `?ids=…,…` in the first place.\n *\n * @param ids IDs to resolve, in request order.\n * @param entity Entity type — drives the SWR window.\n * @param batchFetcher Called with the subset of IDs not in cache.\n * Must return a `Map<id, value>` (missing IDs okay).\n * @param keyFn Builds a fully-qualified cache key from an ID.\n * Convention: `(id) => \\`${CACHE_KEY_PREFIX}entity:${id}\\``.\n *\n * @example\n * ```ts\n * const entities = await cachedBatch(\n * ids,\n * \"search\",\n * async (missingIds) => {\n * const resp = await searchApi.get({ ids: missingIds, limit: missingIds.length });\n * return new Map(resp.data.map((e) => [e.id, e]));\n * },\n * (id) => `${CACHE_KEY_PREFIX}entity:${id}`,\n * );\n * ```\n */\nexport async function cachedBatch<T>(\n ids: string[],\n entity: EntityType,\n batchFetcher: (missingIds: string[]) => Promise<Map<string, T>>,\n keyFn: (id: string) => string\n): Promise<Map<string, T>> {\n const { staleTTL, maxTTL } = getConfig(entity);\n const results = new Map<string, T>();\n const missingIds: string[] = [];\n\n for (const id of ids) {\n const key = keyFn(id);\n let found = false;\n\n // L1 check\n const l1 = memoryStore.get<T>(key);\n if (l1 && !isExpired(l1, maxTTL)) {\n results.set(id, l1.data);\n if (!isFresh(l1, staleTTL)) {\n backgroundRefresh(key, entity, async () => {\n const fetched = await batchFetcher([id]);\n const item = fetched.get(id);\n if (!item) throw new Error(`Batch fetcher did not return ID: ${id}`);\n return item;\n });\n }\n found = true;\n }\n\n // L2 check\n if (!found && l2?.isInitialized) {\n const l2Entry = await l2.get<T>(key);\n if (l2Entry && !isExpired(l2Entry, maxTTL)) {\n memoryStore.set(key, l2Entry.data);\n results.set(id, l2Entry.data);\n if (!isFresh(l2Entry, staleTTL)) {\n backgroundRefresh(key, entity, async () => {\n const fetched = await batchFetcher([id]);\n const item = fetched.get(id);\n if (!item) throw new Error(`Batch fetcher did not return ID: ${id}`);\n return item;\n });\n }\n found = true;\n }\n }\n\n if (!found) {\n missingIds.push(id);\n }\n }\n\n // Fetch missing IDs in a single batch\n if (missingIds.length > 0) {\n const fetched = await batchFetcher(missingIds);\n for (const [id, data] of fetched) {\n const key = keyFn(id);\n memoryStore.set(key, data);\n if (l2?.isInitialized) {\n await l2.set(key, entity, data);\n }\n results.set(id, data);\n }\n }\n\n return results;\n}\n\n/**\n * Remove an entry from both cache layers\n */\nexport function invalidate(key: string): void {\n memoryStore.delete(key);\n}\n\n// Export for testing\nexport { ENTITY_TTL_CONFIG };\n"],"names":[],"mappings":"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"}
|
package/cache/types.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export interface EntityCacheConfig {
|
|
|
11
11
|
/** Time in seconds before data is completely expired and must be re-fetched */
|
|
12
12
|
maxTTL: number;
|
|
13
13
|
}
|
|
14
|
-
export type EntityType = "competitions" | "teams" | "athletes" | "venues" | "countries" | "coaches" | "search" | "sportsCompetition";
|
|
14
|
+
export type EntityType = "competitions" | "teams" | "athletes" | "venues" | "countries" | "coaches" | "stageNames" | "search" | "sportsCompetition";
|
|
15
15
|
/** Convenience: a value that may or may not be wrapped in a Promise. */
|
|
16
16
|
export type MaybePromise<T> = T | Promise<T>;
|
|
17
17
|
/**
|
package/cache/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/cache/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAChB,cAAc,GACd,OAAO,GACP,UAAU,GACV,QAAQ,GACR,WAAW,GACX,SAAS,GACT,QAAQ,GACR,mBAAmB,CAAC;AAE1B,wEAAwE;AACxE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/cache/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,oFAAoF;IACpF,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU,GAChB,cAAc,GACd,OAAO,GACP,UAAU,GACV,QAAQ,GACR,WAAW,GACX,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,mBAAmB,CAAC;AAE1B,wEAAwE;AACxE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,UAAU,CAAC"}
|
package/cache/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../src/lib/cache/types.ts"],"sourcesContent":["/**\n * Shared cache types\n */\n\nexport interface CacheEntry<T> {\n data: T;\n storedAt: number; // Unix timestamp in ms\n}\n\nexport interface EntityCacheConfig {\n /** Time in seconds before data is considered stale (triggers background refresh) */\n staleTTL: number;\n /** Time in seconds before data is completely expired and must be re-fetched */\n maxTTL: number;\n}\n\nexport type EntityType =\n | \"competitions\"\n | \"teams\"\n | \"athletes\"\n | \"venues\"\n | \"countries\"\n | \"coaches\"\n | \"search\"\n | \"sportsCompetition\";\n\n/** Convenience: a value that may or may not be wrapped in a Promise. */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Prefix for every cache key emitted by this library.\n * Namespaces the data-layer's entries inside a shared store (Redis SCAN by `fudl:*`).\n * Bump the literal (e.g. `\"fudl:v2:\"`) to invalidate every cached entry across deploys.\n */\nexport const CACHE_KEY_PREFIX = \"fudl:\";\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../src/lib/cache/types.ts"],"sourcesContent":["/**\n * Shared cache types\n */\n\nexport interface CacheEntry<T> {\n data: T;\n storedAt: number; // Unix timestamp in ms\n}\n\nexport interface EntityCacheConfig {\n /** Time in seconds before data is considered stale (triggers background refresh) */\n staleTTL: number;\n /** Time in seconds before data is completely expired and must be re-fetched */\n maxTTL: number;\n}\n\nexport type EntityType =\n | \"competitions\"\n | \"teams\"\n | \"athletes\"\n | \"venues\"\n | \"countries\"\n | \"coaches\"\n | \"stageNames\"\n | \"search\"\n | \"sportsCompetition\";\n\n/** Convenience: a value that may or may not be wrapped in a Promise. */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * Prefix for every cache key emitted by this library.\n * Namespaces the data-layer's entries inside a shared store (Redis SCAN by `fudl:*`).\n * Bump the literal (e.g. `\"fudl:v2:\"`) to invalidate every cached entry across deploys.\n */\nexport const CACHE_KEY_PREFIX = \"fudl:\";\n"],"names":[],"mappings":"AAmCO,MAAM,mBAAmB;"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "A TypeScript library for fetching and transforming sports data from multiple API providers. Returns clean, canonical types that are provider-agnostic.",
|
|
5
5
|
"homepage": "https://fansunited.com/",
|
|
6
6
|
"private": false,
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.18.0",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"sideEffects": false,
|
|
10
10
|
"module": "./fansunited-data-layer.js",
|
|
@@ -57,6 +57,7 @@ export interface FUSportsRelated {
|
|
|
57
57
|
teams?: FUSportsTeamCompetitor[];
|
|
58
58
|
athletes?: FUSportsPlayerCompetitor[];
|
|
59
59
|
countries?: FUSportsCountry[];
|
|
60
|
+
stageNames?: FUSportsStageName[];
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Base competitor interface - shared fields for all competitor types
|
|
@@ -369,6 +370,27 @@ export interface FUSportsMatchMember extends FUSportsMember {
|
|
|
369
370
|
minutesPlayed?: number;
|
|
370
371
|
matchStats?: FUSportsPlayerMatchStats;
|
|
371
372
|
}
|
|
373
|
+
/**
|
|
374
|
+
* Stage-name label (e.g. "Championship Group", "Regular Season").
|
|
375
|
+
*
|
|
376
|
+
* Search API entities of `type: "STAGE_NAME"` are translatable labels for
|
|
377
|
+
* the stage portion of a season — distinct from the structural
|
|
378
|
+
* {@link FUSportsStage} that carries rounds/dates/etc.
|
|
379
|
+
*
|
|
380
|
+
* The raw API returns these as leaf nodes: no related, no country, no
|
|
381
|
+
* assets — just an id, a name, optional translations, and a provider_ref
|
|
382
|
+
* (which is occasionally returned as a single object rather than an array).
|
|
383
|
+
*/
|
|
384
|
+
export interface FUSportsStageName {
|
|
385
|
+
id: string;
|
|
386
|
+
name: string;
|
|
387
|
+
shortName?: string;
|
|
388
|
+
sport?: string;
|
|
389
|
+
providerRef?: {
|
|
390
|
+
provider: string;
|
|
391
|
+
id: string;
|
|
392
|
+
}[];
|
|
393
|
+
}
|
|
372
394
|
/**
|
|
373
395
|
* Coach/Manager
|
|
374
396
|
*/
|
|
@@ -391,4 +413,5 @@ export type FUSportsPlayerSummary = Omit<FUSportsPlayerCompetitor, 'related' | '
|
|
|
391
413
|
export type FUSportsCountrySummary = Omit<FUSportsCountry, 'providerRef'>;
|
|
392
414
|
export type FUSportsVenueSummary = Omit<FUSportsVenue, 'related' | 'providerRef'>;
|
|
393
415
|
export type FUSportsCoachSummary = Omit<FUSportsCoach, 'related' | 'providerRef'>;
|
|
416
|
+
export type FUSportsStageNameSummary = Omit<FUSportsStageName, 'providerRef'>;
|
|
394
417
|
//# sourceMappingURL=base.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/canonical/base.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;CACP;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACrB;AAMD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACtC,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"base.types.d.ts","sourceRoot":"","sources":["../../../src/lib/types/canonical/base.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Sport-agnostic models that work across football, tennis, basketball, cricket, etc.
|
|
5
5
|
*/
|
|
6
|
-
export type { FUSportsCountry, FUSportsCity, FUSportsCompetitor, FUSportsCompetitorBase, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsPairCompetitor, FUSportsShirtColor, FUSportsSeason, FUSportsRound, FUSportsStage, FUSportsSeasonDetails, FUSportsCompetition, FUSportsVenue, FUSportsOfficial, FUSportsMember, FUSportsMatchMember, FUSportsPlayerMatchStats, FUSportsCoach, FUSportsRelated, FUSportsSocials, FUBranding, FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsPlayerSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsCoachSummary, } from "./base.types";
|
|
6
|
+
export type { FUSportsCountry, FUSportsCity, FUSportsCompetitor, FUSportsCompetitorBase, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsPairCompetitor, FUSportsShirtColor, FUSportsSeason, FUSportsRound, FUSportsStage, FUSportsSeasonDetails, FUSportsCompetition, FUSportsVenue, FUSportsOfficial, FUSportsMember, FUSportsMatchMember, FUSportsPlayerMatchStats, FUSportsCoach, FUSportsStageName, FUSportsRelated, FUSportsSocials, FUBranding, FUSportsCompetitionSummary, FUSportsTeamSummary, FUSportsPlayerSummary, FUSportsCountrySummary, FUSportsVenueSummary, FUSportsCoachSummary, FUSportsStageNameSummary, } from "./base.types";
|
|
7
7
|
export type { FUSportsMatchScore, FUSportsMatchStatus, FUSportsMatchTiming, FUSportsMatchWinner, FUSportsMatch, FUSportsMatchSimple, } from "./match.types";
|
|
8
8
|
export type { FUSportsFootballEventType, FUSportsOtherEventType, FUSportsMatchEvent } from "./event.types";
|
|
9
9
|
export type { FUSportsLineupMember, FUSportsCompetitorLineup, FUSportsMatchLineups } from "./lineup.types";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/types/canonical/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACR,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,eAAe,EACf,UAAU,EAEV,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/types/canonical/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACR,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,UAAU,EAEV,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GAC3B,MAAM,cAAc,CAAC;AAGtB,YAAY,EACR,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,GACtB,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG3G,YAAY,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3G,YAAY,EACR,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,8BAA8B,EAC9B,kBAAkB,EAClB,mCAAmC,EACnC,8BAA8B,EAC9B,8BAA8B,EAC9B,4BAA4B,GAC/B,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACR,+BAA+B,EAC/B,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,sBAAsB,GACzB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGnH,YAAY,EACR,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,GACzB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACR,4BAA4B,EAC5B,+BAA+B,EAC/B,gCAAgC,EAChC,gCAAgC,EAChC,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EACR,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,EACtB,iCAAiC,EACjC,qBAAqB,EACrB,iBAAiB,GACpB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGxE,YAAY,EACR,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,GACxB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACR,mBAAmB,EACnB,oBAAoB,EACpB,8BAA8B,EAC9B,2BAA2B,EAC3B,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,EAC1B,2BAA2B,GAC9B,MAAM,uBAAuB,CAAC"}
|
package/types/index.d.ts
CHANGED
|
@@ -5,6 +5,6 @@ export type { RawAsset, RawAssets, RawCountry, RawCity, RawVenueProfile, RawVenu
|
|
|
5
5
|
export type { RawTeamSocial, RawCoach, RawShirtColor, RawTeamProfile, GetFootballTeamOptions, } from "../api/sportal365-sports/football/teams/team.types";
|
|
6
6
|
export type { RawMatchStatusType, RawMatchStatus, RawMatchTeam, RawMatchEventTypeCode, RawMatchEvent, RawMatchReferee, RawMatchWinnerReason, RawMatchOrAggregateWinner, RawMatchWinner, RawMatchMinute, RawMatchOdd, RawMatchCoverage, RawLineupStatus, RawMatch, OddType, ScopeType, OddFormat, MarketType, OptionalMatchData, GetFootballMatchOptions, } from "../api/sportal365-sports/football/matches/types";
|
|
7
7
|
export type { RawFootballStandingTeam, RawFootballEventStatus, RawFootballFormEvent, RawFootballFormEntry, RawFootballStandingRule, RawFootballStandingEntry, RawFootballStandingsResponse, } from "../api/sportal365-sports/football/standings";
|
|
8
|
-
export type { FUSportsCountry, FUSportsCity, FUSportsCompetitor, FUSportsCompetitorBase, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsPairCompetitor, FUSportsShirtColor, FUSportsCompetition, FUSportsVenue, FUSportsOfficial, FUSportsMember, FUSportsMatchMember, FUSportsCoach, FUSportsSocials, FUBranding, FUSportsSeason, FUSportsRound, FUSportsStage, FUSportsSeasonDetails, FUSportsMatchScore, FUSportsMatchStatus, FUSportsMatchTiming, FUSportsMatchWinner, FUSportsMatch, FUSportsMatchSimple, FUSportsFootballEventType, FUSportsOtherEventType, FUSportsMatchEvent, FUSportsLineupMember, FUSportsCompetitorLineup, FUSportsMatchLineups, FUSportsStatisticEntry, FUSportsCompetitorStatistics, FUSportsMatchStatistics, FUSportsPlayerStatistic, FUSportsPlayerSeasonStatistics, FUSportsBettingOperatorBranding, FUSportsBettingOperator, FUSportsOddSelection, FUSportsMarketPeriod, FUSportsMarketType, FUSportsOddMarket, FUSportsBettingOperatorOdds, FUSportsMatchOdds, FUSportsBatchMatchOdds, FUSportsCommentaryDetail, FUSportsCommentaryMeta, FUSportsCommentaryItem, FUSportsStandingEntry, FUSportsCompetitorForm, FUSportsStandingLegendItem, FUSportsStandingsMetadata, FUSportsStandings, FUSportsSquadMember, FUSportsSquad, FUSportsSearchResultBase, FUSportsTournamentSearchResult, FUSportsPlayerSearchResult, FUSportsTeamSearchResult, FUSportsPresidentSearchResult, FUSportsVenueSearchResult, FUSportsCoachSearchResult, FUSportsSearchResult, FUSportsSearchResults, FUSportsTranslation, FUSportsDisplayAsset, FUSportsSportsSearchResultBase, FUSportsSportsSearchCountry, FUSportsTeamSportsSearchResult, FUSportsCitySportsSearchResult, FUSportsHorseSportsSearchResult, FUSportsPlayerSportsSearchResult, FUSportsCoachSportsSearchResult, FUSportsRefereeSportsSearchResult, FUSportsVenueSportsSearchResult, FUSportsTournamentSportsSearchResult, FUSportsMatchSportsSearchResult, FUSportsCountrySportsSearchResult, FUSportsSportsSearchResult, FUSportsSportsSearchResults, } from "./canonical";
|
|
8
|
+
export type { FUSportsCountry, FUSportsCity, FUSportsCompetitor, FUSportsCompetitorBase, FUSportsTeamCompetitor, FUSportsPlayerCompetitor, FUSportsPairCompetitor, FUSportsShirtColor, FUSportsCompetition, FUSportsVenue, FUSportsOfficial, FUSportsMember, FUSportsMatchMember, FUSportsCoach, FUSportsStageName, FUSportsSocials, FUBranding, FUSportsSeason, FUSportsRound, FUSportsStage, FUSportsSeasonDetails, FUSportsMatchScore, FUSportsMatchStatus, FUSportsMatchTiming, FUSportsMatchWinner, FUSportsMatch, FUSportsMatchSimple, FUSportsFootballEventType, FUSportsOtherEventType, FUSportsMatchEvent, FUSportsLineupMember, FUSportsCompetitorLineup, FUSportsMatchLineups, FUSportsStatisticEntry, FUSportsCompetitorStatistics, FUSportsMatchStatistics, FUSportsPlayerStatistic, FUSportsPlayerSeasonStatistics, FUSportsBettingOperatorBranding, FUSportsBettingOperator, FUSportsOddSelection, FUSportsMarketPeriod, FUSportsMarketType, FUSportsOddMarket, FUSportsBettingOperatorOdds, FUSportsMatchOdds, FUSportsBatchMatchOdds, FUSportsCommentaryDetail, FUSportsCommentaryMeta, FUSportsCommentaryItem, FUSportsStandingEntry, FUSportsCompetitorForm, FUSportsStandingLegendItem, FUSportsStandingsMetadata, FUSportsStandings, FUSportsSquadMember, FUSportsSquad, FUSportsSearchResultBase, FUSportsTournamentSearchResult, FUSportsPlayerSearchResult, FUSportsTeamSearchResult, FUSportsPresidentSearchResult, FUSportsVenueSearchResult, FUSportsCoachSearchResult, FUSportsSearchResult, FUSportsSearchResults, FUSportsTranslation, FUSportsDisplayAsset, FUSportsSportsSearchResultBase, FUSportsSportsSearchCountry, FUSportsTeamSportsSearchResult, FUSportsCitySportsSearchResult, FUSportsHorseSportsSearchResult, FUSportsPlayerSportsSearchResult, FUSportsCoachSportsSearchResult, FUSportsRefereeSportsSearchResult, FUSportsVenueSportsSearchResult, FUSportsTournamentSportsSearchResult, FUSportsMatchSportsSearchResult, FUSportsCountrySportsSearchResult, FUSportsSportsSearchResult, FUSportsSportsSearchResults, } from "./canonical";
|
|
9
9
|
export type { DataLayerConfig, Sportal365SportsConfig } from "../config/types";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAER,QAAQ,EACR,SAAS,EAET,UAAU,EACV,OAAO,EACP,eAAe,EACf,QAAQ,EACR,aAAa,EAEb,aAAa,EACb,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,qBAAqB,EACrB,cAAc,EAEd,gBAAgB,EAEhB,YAAY,EACZ,QAAQ,EAER,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EAEZ,QAAQ,GACX,MAAM,uCAAuC,CAAC;AAG/C,YAAY,EACR,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,sBAAsB,GACzB,MAAM,oDAAoD,CAAC;AAG5D,YAAY,EACR,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,uBAAuB,GAC1B,MAAM,iDAAiD,CAAC;AAGzD,YAAY,EACR,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,GAC/B,MAAM,6CAA6C,CAAC;AAGrD,YAAY,EAER,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,qBAAqB,EAErB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EAEnB,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAElB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EAEpB,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAE9B,+BAA+B,EAC/B,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,sBAAsB,EAEtB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EAEtB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,iBAAiB,EAEjB,mBAAmB,EACnB,aAAa,EAEb,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EAErB,mBAAmB,EACnB,oBAAoB,EACpB,8BAA8B,EAC9B,2BAA2B,EAC3B,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,EAC1B,2BAA2B,GAC9B,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAER,QAAQ,EACR,SAAS,EAET,UAAU,EACV,OAAO,EACP,eAAe,EACf,QAAQ,EACR,aAAa,EAEb,aAAa,EACb,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,qBAAqB,EACrB,cAAc,EAEd,gBAAgB,EAEhB,YAAY,EACZ,QAAQ,EAER,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,EAEZ,QAAQ,GACX,MAAM,uCAAuC,CAAC;AAG/C,YAAY,EACR,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,sBAAsB,GACzB,MAAM,oDAAoD,CAAC;AAG5D,YAAY,EACR,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,uBAAuB,GAC1B,MAAM,iDAAiD,CAAC;AAGzD,YAAY,EACR,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,GAC/B,MAAM,6CAA6C,CAAC;AAGrD,YAAY,EAER,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,qBAAqB,EAErB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,mBAAmB,EAEnB,yBAAyB,EACzB,sBAAsB,EACtB,kBAAkB,EAElB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EAEpB,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAE9B,+BAA+B,EAC/B,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,sBAAsB,EAEtB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EAEtB,qBAAqB,EACrB,sBAAsB,EACtB,0BAA0B,EAC1B,yBAAyB,EACzB,iBAAiB,EAEjB,mBAAmB,EACnB,aAAa,EAEb,wBAAwB,EACxB,8BAA8B,EAC9B,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,qBAAqB,EAErB,mBAAmB,EACnB,oBAAoB,EACpB,8BAA8B,EAC9B,2BAA2B,EAC3B,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,EAC/B,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,EACjC,+BAA+B,EAC/B,oCAAoC,EACpC,+BAA+B,EAC/B,iCAAiC,EACjC,0BAA0B,EAC1B,2BAA2B,GAC9B,MAAM,aAAa,CAAC;AAGrB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|