neutrx

Schema Validation

Use schema to validate and optionally transform parsed response data before a successful response is returned. Neutrx accepts Zod-like safeParse, parse, validate, TypeBox-style Check/Errors, or function validators.

import neutrx, {
  NeutrxValidationError,
  type ResponseValidationSchema,
} from 'neutrx';

type User = {
  readonly id: string;
  readonly name: string;
  readonly active: boolean;
};

const userSchema = {
  safeParse(value: unknown) {
    if (
      value !== null
      && typeof value === 'object'
      && !Array.isArray(value)
      && 'id' in value
      && 'name' in value
      && 'active' in value
    ) {
      const record = value as Record<string, unknown>;

      if (
        typeof record.id === 'number'
        && typeof record.name === 'string'
        && typeof record.active === 'boolean'
      ) {
        return {
          success: true as const,
          data: {
            id: String(record.id),
            name: record.name.trim(),
            active: record.active,
          },
        };
      }
    }

    return {
      success: false as const,
      issues: [{ path: ['id'], message: 'user response is invalid' }],
    };
  },
} satisfies ResponseValidationSchema<User>;

const api = neutrx.create({
  baseURL: 'https://api.example.com',
  security: { profile: 'standard' },
});

export async function fetchUser(userId: string): Promise<User> {
  try {
    const response = await api.get(`/users/${encodeURIComponent(userId)}`, {
      schema: userSchema,
    });

    return response.data;
  } catch (error) {
    if (error instanceof NeutrxValidationError) {
      console.error(error.issues);
    }

    throw error;
  }
}

Validation failures do not retry.