Asynchronous dynamic data at scale. Performance, data integrity, and typing for REST, proto, GraphQL, websockets and more.
Bring structure to your React State.
🌎 Website
Simple TypeScript definition
class Article extends Entity {
readonly id: string = '';
readonly title: string = '';
readonly body: string = '';
pk() {
return this.id;
}
}
Create collection of API Endpoints
const ArticleResource = createResource({
path: '/articles/:id',
schema: Article,
})
One line data binding
const article = useSuspense(ArticleResource.get, { id });
return (
<>
<h2>{article.title}</h2>
<p>{article.body}</p>
</>
);
const ctrl = useController();
return (
<ArticleForm
onSubmit={data => ctrl.fetch(ArticleResource.update, { id }, data)}
/>
);
And subscriptions
const price = useLive(PriceResource.get, { symbol });
return price.value;
const sortedArticles = new Query(
new schema.All(Article),
(entries, { asc } = { asc: false }) => {
const sorted = [...entries].sort((a, b) => a.title.localeCompare(b.title));
if (asc) return sorted;
return sorted.reverse();
}
);
const articlesUnsorted = useCache(sortedArticles);
const articlesAscending = useCache(sortedArticles, { asc: true });
const articlesDescending = useCache(sortedArticles, { asc: false });
For the small price of 9kb gziped. 🏁Get started now | 🥊Comparison
-
Strong Typescript inference
- 🛌 React Suspense support
- 🧵 React 18 Concurrent mode compatible
- 💦 Partial Hydration Server Side Rendering
- 🎣 Declarative API
- 📝 Composition over configuration
- 💰 Normalized caching
- 💥 Tiny bundle footprint
- 🛑 Automatic overfetching elimination
- ✨ Optimistic updates
- 🧘 Flexible to fit any API design (one size fits all)
- 🔧 Debugging and inspection via browser extension
- 🌳 Tree-shakable (only use what you need)
- 🔁 Subscriptions
- ♻️ Optional redux integration
- 📙 Storybook mocking
- 📱 React Native support
- ⚛️ NextJS support
- 🚯 Declarative cache lifetime policy
- 🧅 Composable middlewares
- 💽 Global data consistency guarantees
- 🏇 Automatic race condition elimination
- 👯 Global referential equality guarantees
- Strong inferred types
- Global referential equality guarantees
- Normalized store creates a single source of truth
- Strong invariants robust against race conditions
- Validation
- Stale While Revalidate configurable cache
- Only re-render
- Declarative data definitions
- Decoupled API definitions from usage
- Co-located data dependencies
- Centralized orchestration
- Extensible orchestration through Managers (middleware)
- Composable hooks
- subject pattern
- Suspense + concurrent mode async orchestration
- Simple case is simple
- Scale as your app scales