v0.10: Tratamento consistente de null, utilitários de URL
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);
}
}
Mudanças incompatíveis:
Outras melhorias:
- RestEndpoint.searchToString() para codificação personalizada de parâmetros de busca
- Exports getUrlBase, getUrlTokens para construção personalizada de URLs
- Correção de vazamento de memória no DevToolsManager
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
nullsão mantidos em todos os lugares (já eram mantidos em Entities aninhadas) - Valores
undefinedcontinuam 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
- Yarn
- pnpm
- esm.sh
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
yarn add @data-client/react@^0.10.0 @data-client/rest@^0.10.0 @data-client/test@^0.10.0 @data-client/img@^0.10.0
pnpm add @data-client/react@^0.10.0 @data-client/rest@^0.10.0 @data-client/test@^0.10.0 @data-client/img@^0.10.0
<script type="importmap">
{
"imports": {
"@data-client/react": "https://esm.sh/@data-client/react@^0.10.0",
"@data-client/rest": "https://esm.sh/@data-client/rest@^0.10.0",
"@data-client/test": "https://esm.sh/@data-client/test@^0.10.0",
"@data-client/img": "https://esm.sh/@data-client/img@^0.10.0"
}
}
</script>
Valores null em arrays
Se o seu código dependia de valores null serem filtrados dos arrays, você precisará tratar isso explicitamente:
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);
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 ou registrar um bug
