Pular para o conteúdo principal

Fontes de dados

Infraestrutura compartilhada de dados​

Data Source Engine é uma infraestrutura compartilhada. Não pertence exclusivamente ao DyonaForm: qualquer código da aplicação pode usar executeDyonaDataSource com um DyonaDataSourceExecutor para executar e validar uma troca tipada de request/result.

DYONA valida e transporta requests e results. A aplicação consumidora é responsável por HTTP, fetch ou Axios, URLs, autenticação, tokens e transformação de respostas. DYONA não faz fetch automaticamente.

Contrato público​

sourceId identifica uma fonte na aplicação consumidora. DyonaDataSourceExecutor recebe um request tipado e retorna um result tipado correspondente, de forma síncrona ou como promise. executeDyonaDataSource valida os dois lados dessa troca antes de retornar o result.

As únicas operations atuais são:

  • options.search
  • options.resolve

options.search recebe input.searchText e retorna um array de opções {label, value, secondaryLabel?}. options.resolve recebe input.value e retorna uma opção ou null.

O value de uma opção pode ser string, number ou boolean. Seu tipo é preservado estritamente: um result de resolve deve retornar exatamente o value solicitado, e 102 é diferente de '102'. result.operation deve corresponder à operation solicitada.

Quando presente, secondaryLabel é uma string usada apenas para apresentação secundária no dropdown de RemoteAutocomplete. O input selecionado continua mostrando label e value não muda.

request.context é um objeto opcional fornecido por quem chama para o contexto da aplicação, como um nome de field ou values atuais. request.signal é um AbortSignal; passe-o ao trabalho cancelável, como fetch, para cancelar um request substituído.

Exemplo 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);

Em uma aplicação real, substitua a busca local dentro do executor pelo seu próprio transporte e mapeamento de respostas, preservando o contrato de request e result.

Ver dentro do DyonaForm​

Testar fora do DyonaForm​