import type { DashboardFetcher, DashboardPeriod, SchemaField } from '../types'; import type { EndpointMeta } from './dashboardProxy'; /** * La entrada de caché de los datos de un widget: su clave y cómo se construye su contenido. * * Por qué existe este módulo. Dos consumidores piden los datos de un mismo widget: el * propio widget (`useWidgetFetch`) y la fuente secundaria de un KPI (`useSecondarySource`, el * sparkline). Comparten clave a propósito —si el gráfico grande ya está en pantalla, el * sparkline no cuesta ninguna petición— y eso los obliga a guardar exactamente lo mismo. * * Ya se rompió una vez por la FORMA (uno guardaba el array pelado y el otro el envelope) y se * corrigió. Pero seguía roto por el CONTENIDO, que es más difícil de ver: `useWidgetFetch` * aplicaba `field_mapping.rename` dentro de su `queryFn` y la fuente secundaria no, así que si el * sparkline ganaba la carrera el gráfico grande leía la entrada sin renombrar y sus * `valueKeys` no existían en las filas. El `queryFn` del que pierde la carrera no se ejecuta * nunca, así que su transformación tampoco. * * Teniendo la clave y el contenido en un solo sitio, no pueden volver a divergir. */ /** Parámetros extra del proxy. Primitivos, como los admite su DTO. */ export type WidgetUserParams = Record; export interface CachedWidgetEnvelope { data: T; schema: { fields: SchemaField[]; } | null; meta: EndpointMeta | null; } /** * La clave de caché de los datos de un widget. * * `userParams` forma parte de la identidad de la petición, porque cambia la respuesta: * un `{ points: 7 }` devuelve siete puntos. Sin ellos en la clave, el sparkline y el gráfico * grande compartían entrada pidiendo cosas distintas y ganaba el que resolviera primero. * * Cuando no hay `userParams` la clave queda IDÉNTICA a la de siempre — que es justo el objetivo: * compartir la entrada cuando la petición es la misma, y separarla cuando no lo es. */ export declare function widgetDataQueryKey(widgetId: string | undefined, period: DashboardPeriod, userParams?: WidgetUserParams): unknown[]; /** Aplica `field_mapping.rename`: expone cada campo del endpoint con el nombre que el widget espera. */ export declare function applyFieldMapping(data: unknown, mapping: Record): unknown; /** * El contenido EXACTO que se guarda bajo {@link widgetDataQueryKey}. * * Todo consumidor que comparta la clave tiene que llamar a esta función: es lo que garantiza que * la entrada de caché sea la misma sin importar quién gane la carrera. */ export declare function fetchWidgetEnvelope(params: { widgetId: string; period: DashboardPeriod; userParams?: WidgetUserParams; }, fieldMapping: Record | undefined, fetcher: DashboardFetcher): Promise>; //# sourceMappingURL=widgetEnvelope.d.ts.map