v0.10: Manejo consistente de null, utilidades de URL
Esta versión se centra en la consistencia y la extensibilidad. El manejo de null ahora es uniforme en todos los tipos de schema, lo que hace que las transformaciones de datos sean más predecibles. Las nuevas utilidades de URL permiten construir URLs personalizadas y codificar parámetros de búsqueda.
class MyEndpoint<O extends RestGenerics = any> extends RestEndpoint<O> {
searchToString(searchParams) {
// Use qs library for complex nested object encoding
return qs.stringify(searchParams);
}
}
Cambios incompatibles:
Otras mejoras:
- RestEndpoint.searchToString() para codificar parámetros de búsqueda de forma personalizada
- Exportaciones getUrlBase y getUrlTokens para construir URLs personalizadas
- Corrección de fuga de memoria en DevToolsManager
Manejo consistente de null
Los valores null ahora se conservan de forma consistente en todos los tipos de schema. Antes, la abreviatura [] y schema.Array
se comportaban de manera distinta al encontrar valores null. #2912
[]y schema.Array ahora se comportan de forma idéntica- Los valores
nullse conservan en todas partes (ya se conservaban en las Entities anidadas) - Los valores
undefinedsiguen filtrándose
Este cambio garantiza un comportamiento más predecible al trabajar con APIs que devuelven null explícitamente para indicar
ausencia de datos frente a undefined para campos faltantes.
Utilidades de URL
RestEndpoint.searchToString()
RestEndpoint.searchToString() permite codificar los parámetros de búsqueda de forma personalizada. Esto es especialmente útil para APIs que esperan objetos anidados complejos en las cadenas de consulta. #2919
Por ejemplo, para codificar objetos complejos con la 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
Las nuevas exportaciones getUrlBase y getUrlTokens proporcionan los bloques de construcción para implementaciones
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/'
Corrección de memoria en DevToolsManager
El búfer de acciones de DevToolsManager ahora está limitado a 100 entradas, lo que evita fugas de memoria en aplicaciones
de larga duración o con actualizaciones frecuentes. 4e6a39e
Guía de migración
Esta actualización requiere actualizar todas las versiones de los paquetes al mismo tiempo.
- 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 en arreglos
Si tu código dependía de que los valores null se filtraran de los arreglos, tendrás que manejarlo explícitamente:
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);
Este cambio se alinea con la forma en que las Entities anidadas ya manejaban los valores null,
haciendo que el comportamiento sea consistente en todos los tipos de schema.
Soporte para la actualización
Como siempre, si tienes algún problema o pregunta, no dudes en unirte a nuestro o reportar un error
