Skip to main content

Quick start

Suppose an endpoint returns strings, snake-case keys, and nullable fields:

const apiUser = {
user_id: 7,
full_name: 'Ada Lovelace',
created_at: '2025-01-02',
balance: '12.50',
verified: 'yes',
};

Create one reusable transform:

import {defaults, normalize, pipe, rename} from 'shapewire';

const toUser = pipe(
rename({
user_id: 'id',
full_name: 'name',
created_at: 'createdAt',
}),
defaults({role: 'viewer', verified: false}),
normalize({
createdAt: 'isoDate',
balance: 'number',
verified: 'boolean',
}),
);

const user = toUser(apiUser);

The result is ready for UI code:

{
id: 7,
name: 'Ada Lovelace',
createdAt: '2025-01-02T00:00:00.000Z',
balance: 12.5,
verified: true,
role: 'viewer',
}

No input object is mutated. TypeScript also infers the renamed keys, defaults, and normalized value types. See API-to-UI composition for a larger workflow.