Fuentes de datos
Infraestructura compartida de datos
Data Source Engine es infraestructura compartida. No pertenece exclusivamente a DyonaForm: cualquier código de la aplicación puede usar executeDyonaDataSource con un DyonaDataSourceExecutor para ejecutar y validar un intercambio tipado de request/result.
DYONA valida y transporta requests y results. La aplicación consumidora es dueña de HTTP, fetch o Axios, URLs, autenticación, tokens y transformación de respuestas. DYONA no hace fetch automáticamente.
Contrato público
sourceId identifica una fuente en la aplicación consumidora. DyonaDataSourceExecutor recibe un request tipado y devuelve un result tipado correspondiente, en forma sincrónica o como promise. executeDyonaDataSource valida ambos lados de ese intercambio antes de devolver el result.
Las únicas operations actuales son:
options.searchoptions.resolve
options.search recibe input.searchText y devuelve un arreglo de opciones {label, value, secondaryLabel?}. options.resolve recibe input.value y devuelve una opción o null.
El value de una opción puede ser string, number o boolean. Su tipo se conserva estrictamente: un result de resolve debe devolver exactamente el value solicitado, y 102 es diferente de '102'. result.operation debe coincidir con la operation solicitada.
Cuando existe, secondaryLabel es un string usado sólo para presentación secundaria en el dropdown de RemoteAutocomplete. El input seleccionado continúa mostrando label y value no cambia.
request.context es un objeto opcional entregado por quien llama para contexto de la aplicación, por ejemplo el nombre de un field o los values actuales. request.signal es un AbortSignal; pasalo al trabajo cancelable, como fetch, para cancelar un request reemplazado.
Ejemplo completo
import {
executeDyonaDataSource,
type DyonaDataSourceExecutor,
} from '@typhonsoftware/dyona-form';
const customers = [
{value: 102, label: 'Taylor Reed'},
{value: 103, label: 'Jordan Lee'},
];
const dataSourceExecutor: DyonaDataSourceExecutor = async (request) => {
if (request.operation === 'options.search') {
const searchText = request.input.searchText.toLowerCase();
return {
operation: 'options.search',
data: customers.filter((customer) =>
customer.label.toLowerCase().includes(searchText),
),
};
}
return {
operation: 'options.resolve',
data: customers.find((customer) =>
customer.value === request.input.value,
) ?? null,
};
};
const controller = new AbortController();
const result = await executeDyonaDataSource({
sourceId: 'customers',
operation: 'options.search',
input: {searchText: 'tay'},
context: {fieldName: 'customerId', values: {}},
signal: controller.signal,
}, dataSourceExecutor);
En una aplicación real, reemplazá la búsqueda local dentro del executor por tu propio transporte y mapeo de respuestas, preservando el contrato de request y result.
Verlo dentro de DyonaForm
- Autocomplete remoto
- Abrir Autocomplete remoto en el Lab — un caso real donde Data Source Engine se usa dentro de
DyonaForm.
Probarlo fuera de DyonaForm
- Abrir Fuentes de datos en el Lab — ejecutá Data Source Engine directamente desde código de la aplicación.