Pular para o conteúdo principal

v0.10: Tratamento consistente de null, utilitários de URL

· 4 min para ler
Nathaniel Tucker
Creator of Reactive Data Client

Esta versão foca em consistência e extensibilidade. O tratamento de null agora é uniforme em todos os tipos de schema, tornando as transformações de dados mais previsíveis. Novos utilitários de URL permitem construção personalizada de URLs e codificação de parâmetros de busca.

class MyEndpoint<O extends RestGenerics = any> extends RestEndpoint<O> {
searchToString(searchParams) {
// Use qs library for complex nested object encoding
return qs.stringify(searchParams);
}
}
Guia de migração

Mudanças incompatíveis:

Outras melhorias:

Tratamento consistente de null​

Valores null agora são mantidos de forma consistente em todos os tipos de schema. Antes, o atalho [] e schema.Array se comportavam de maneira diferente ao encontrar valores null. #2912

  • [] e schema.Array agora se comportam de forma idêntica
  • Valores null são mantidos em todos os lugares (já eram mantidos em Entities aninhadas)
  • Valores undefined continuam sendo filtrados

Essa mudança garante um comportamento mais previsível ao trabalhar com APIs que retornam null explicitamente para indicar ausência de dados, em contraste com undefined para campos faltantes.

Utilitários de URL​

RestEndpoint.searchToString()​

RestEndpoint.searchToString() permite a codificação personalizada dos parâmetros de busca. Isso é especialmente útil para APIs que esperam objetos aninhados complexos nas query strings. #2919

Por exemplo, para codificar objetos complexos usando a biblioteca qs:

import { RestEndpoint, RestGenerics } from '@data-client/rest';
import qs from 'qs';

class MyEndpoint<O extends RestGenerics = any> extends RestEndpoint<O> {
searchToString(searchParams) {
return qs.stringify(searchParams);
}
}

getUrlBase, getUrlTokens​

Os novos exports getUrlBase e getUrlTokens fornecem os blocos de construção para implementações personalizadas de RestEndpoint.url(). #2919

import { getUrlBase, getUrlTokens } from '@data-client/rest';

// Parse path tokens for custom URL logic
const tokens = getUrlTokens('/users/:id/posts/:postId');
// => ['id', 'postId']

// Get base URL without path parameters
const base = getUrlBase('/users/:id');
// => '/users/'

Correção de memória no DevToolsManager​

O buffer de actions do DevToolsManager agora é limitado a 100 entradas, evitando vazamentos de memória em aplicações de longa duração ou com atualizações frequentes. 4e6a39e

Guia de migração​

Esta atualização exige atualizar todas as versões dos pacotes simultaneamente.

npm install --save @data-client/react@^0.10.0 @data-client/rest@^0.10.0 @data-client/test@^0.10.0 @data-client/img@^0.10.0

Valores null em arrays​

Se o seu código dependia de valores null serem filtrados dos arrays, você precisará tratar isso explicitamente:

Before
import { Entity, schema, RestEndpoint } from '@data-client/rest';

class User extends Entity {
id = '';
name = '';
pk() { return this.id; }
}

const getUsers = new RestEndpoint({
path: '/users',
schema: new schema.Array(User),
});

// API response: [{ id: '1' }, null, { id: '2' }]
const usersWithoutNull = useSuspense(getUsers);
After
import { Entity, schema, RestEndpoint } from '@data-client/rest';

class User extends Entity {
id = '';
name = '';
pk() { return this.id; }
}

const getUsers = new RestEndpoint({
path: '/users',
schema: new schema.Array(User),
});

// API response: [{ id: '1' }, null, { id: '2' }]
const usersWithoutNull = useSuspense(getUsers).filter(Boolean);

Essa mudança se alinha a como as Entities aninhadas já tratavam valores null, tornando o comportamento consistente em todos os tipos de schema.

Suporte à atualização​

Como sempre, se tiver qualquer problema ou dúvida, fique à vontade para entrar no nosso Chat ou registrar um bug