@rest-hooks/rest

Endpoints for REST APIs

Usage no npm install needed!

<script type="module">
  import restHooksRest from 'https://cdn.skypack.dev/@rest-hooks/rest';
</script>

README

Rest Hooks for REST

CircleCI Coverage Status npm downloads bundle size npm version PRs Welcome Chat

Extensible CRUD patterns for REST APIs.

Simple TypeScript definition

class ArticleResource extends Resource {
  readonly id: number | undefined = undefined;
  readonly title: string = '';
  readonly body: string = '';

  pk() { return this.id; }
  static urlRoot = '/articles/';
}

Standard CRUD Endpoints

Reads

const article = useResource(ArticleResource.detail(), { id: 5 });
const articles = useResource(ArticleResource.list(), {});

Mutates

const updateArticle = useFetcher(ArticleResource.update());
const partialUpdateArticle = useFetcher(ArticleResource.partialUpdate());
const createArticle = useFetcher(ArticleResource.create());
const deleteArticle = useFetcher(ArticleResource.delete());

DRY Customization

import { Resource } from '@rest-hooks/rest';
import { useAuth } from 'my-auth-lib';

abstract class AuthdResource extends Resource {
  static useFetchInit = (init: RequestInit) => {
    const { session } = useAuth();
    return {
    ...options,
      headers: {
        ...options.headers,
        'Access-Token': session,
      },
    }
  };
}
import type { ReadEndpoint, FetchFunction } from '@rest-hooks/endpoint';

import AuthdResource from './AuthdResource';

export default class UserResource extends AuthdResource {
  /** Retrieves current logged in user */
  static current<T extends typeof Resource>(this: T): ReadEndpoint<FetchFunction, T> {
    return super.detail().extend({ url: () => '/current_user' });
  }
}

Prior Art