Saltar al contenido principal

v0.10: Manejo consistente de null, utilidades de URL

· 4 min de lectura
Nathaniel Tucker
Creator of Reactive Data Client

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);
}
}
Guía de migración

Cambios incompatibles:

Otras mejoras:

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 null se conservan en todas partes (ya se conservaban en las Entities anidadas)
  • Los valores undefined siguen 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 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 en arreglos​

Si tu código dependía de que los valores null se filtraran de los arreglos, tendrás que manejarlo explícitamente:

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

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 Chat o reportar un error