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