Data loading and caching for the EreoJS framework. One pattern, not four - simple and explicit data fetching with automatic parallelization.
npm install @ereo/dataData loading and caching for the EreoJS framework. One pattern, not four - simple and explicit data fetching with automatic parallelization.
``bash`
bun add @ereo/data
`typescript
import { createLoader, createAction, cached } from '@ereo/data';
// Create a loader for fetching data
export const loader = createLoader(async ({ params }) => {
const user = await fetchUser(params.id);
return { user };
});
// Create an action for mutations
export const action = createAction(async ({ request }) => {
const formData = await request.formData();
await updateUser(formData);
return redirect('/users');
});
`
- Loaders - Fetch data with createLoader, support for deferred data with defercreateAction
- Actions - Handle mutations with , typedAction, and jsonActioncached
- Caching - Built-in memory cache with , getCache, setCachebuildCacheControl
- Cache Control - Fine-grained cache headers with revalidateTag
- Revalidation - On-demand revalidation with and revalidatePathcreatePipeline
- Data Pipelines - Auto-parallelization with and dataSourceredirect
- Response Helpers - , json, and error utilities
`typescript
import { cached, cacheKey, revalidateTag } from '@ereo/data';
// cached(key, fetchFn, options) — key is required, fetchFn takes no arguments
const user = await cached(
cacheKey('user', id),
() => fetchUser(id),
{ maxAge: 60, tags: ['users', user-${id}] }
);
// Revalidate when user is updated
await revalidateTag('users');
`
`typescript
import { createPipeline, dataSource, cachedSource } from '@ereo/data';
const pipeline = createPipeline({
loaders: {
user: dataSource(() => fetchUser(id)),
posts: cachedSource(() => fetchPosts(id), { ttl: 300 }),
// comments depends on posts — declare via dependencies, not function args
comments: dataSource(() => fetchComments(id)),
},
dependencies: {
comments: ['posts'], // comments waits for posts to finish first
},
});
const result = await pipeline.execute(loaderArgs);
// result.data = { user, posts, comments } — independent loaders run in parallel
``
For full documentation, visit https://ereojs.dev/docs/data
This package is part of the EreoJS monorepo - a modern full-stack framework built for Bun.
MIT