TypeScript HTTP definitions

RestEndpoint
Simplify TypeScript fetch functions with RestEndpoint
const getTodo = new RestEndpoint({
urlPrefix: 'https://jsonplaceholder.typicode.com',
path: '/todos/:id',
});
RestEndpoint infers path-to-regexp
argument types, enabling enforcement of function calls
const todo = await getTodo({ id: 5 });
It automatically handles REST concepts like JSON serialization, consolidated error handling and more.
Resources
Simplify related CRUD endpoints with Resources
Resources are a collection of methods for a given data model.
Entities and Schemas declaratively define the data model.
RestEndpoints are the methods on
that data.
class Todo extends Entity {
id = 0;
userId = 0;
title = '';
completed = false;
}
const TodoResource = resource({
urlPrefix: 'https://jsonplaceholder.typicode.com',
path: '/todos/:id',
searchParams: {} as { userId?: string | number },
schema: Todo,
paginationField: 'page',
});
One Resource defines seven endpoints:
let todo5 = await TodoResource.get({ id: 5 });
const todoList = await TodoResource.getList();
const userOneTodos = await TodoResource.getList({ userId: 1 });
const newTodo = await TodoResource.getList.push({ title: 'my todo' });
const newUserOneTodo = await TodoResource.getList.push(
{ userId: 1 },
{ title: 'my todo' },
);
const nextPageOfTodos = await TodoResource.getList.getPage({
userId: 1,
page: 2,
});
todo5 = await TodoResource.update({ id: 5 }, { title: 'my todo' });
todo5 = await TodoResource.partialUpdate({ id: 5 }, { title: 'my todo' });
await TodoResource.delete({ id: 5 });
Free React Integration
No need for any custom hooks. All endpoints are 100% compatible with Reactive Data Client
const todo = useSuspense(TodoResource.get, { id: 5 });
const todoList = useSuspense(TodoResource.getList);
const ctrl = useController();
const updateTodo = data => ctrl.fetch(TodoResource.update, { id }, data);
const partialUpdateTodo = data =>
ctrl.fetch(TodoResource.partialUpdate, { id }, data);
const addTodoToEnd = data => ctrl.fetch(TodoResource.getList.push, data);
const addTodoToBeginning = data =>
ctrl.fetch(TodoResource.getList.unshift, data);
const deleteTodo = data => ctrl.fetch(TodoResource.delete, { id });
const queryRemainingTodos = new schema.Query(
TodoResource.getList.schema,
entries => entries.filter(todo => !todo.completed).length,
);
const allRemainingTodos = useQuery(queryRemainingTodos);
const firstUserRemainingTodos = useQuery(queryRemainingTodos, { userId: 1 });
const groupTodoByUser = new schema.Query(
TodoResource.getList.schema,
todos => Object.groupBy(todos, todo => todo.userId),
);
const todosByUser = useQuery(groupTodoByUser);
TypeScript requirements
TypeScript is optional, but will only work with 4.0 or above. 4.1 is needed for stronger types as it
supports inferring argument types from the path templates.
Prior Art
API
Networking definition