RippleDB
RippleDB
Reference

@rippledb/client-query

Final DX package combining controllers + TanStack Query invalidation

@rippledb/client-query

@rippledb/client-query is the ergonomic “final DX” client package that combines:

  • @rippledb/client-controllers — CRUD controllers (+ batch loading)
  • @rippledb/bind-tanstack-query — TanStack Query invalidation wiring

It dynamically creates entity controllers from your runtime schema descriptor, so you can call api.todos.*, api.users.*, etc.

Installation

pnpm add @rippledb/client-query @tanstack/query-core
npm install @rippledb/client-query @tanstack/query-core
yarn add @rippledb/client-query @tanstack/query-core

If you're using a framework-specific TanStack Query adapter (e.g. @tanstack/react-query), you already have @tanstack/query-core as a dependency.

Basic Usage

import { QueryClient } from "@tanstack/query-core";
import { defineSchema } from "@rippledb/core";
import { createClientQueryApi } from "@rippledb/client-query";

const queryClient = new QueryClient();

const schema = defineSchema({
  todos: { id: "", title: "", done: false },
  users: { id: "", name: "", email: "" },
});

const api = createClientQueryApi({
  store,
  stream: "user-123",
  queryClient,
  schema,
});

const todo = await api.todos.create({ title: "Buy milk", done: false });
const fetched = await api.todos.read(todo.id);

Cached Query Helper

api.query() uses TanStack Query’s queryClient.fetchQuery(...) under the hood, so results are cached and will be automatically invalidated when dependent entities change.

const todos = await api.query({
  key: ["todos"],
  deps: ["todos"],
  fn: () => api.todos.list({ entity: "todos" }),
});

If you want to pre-register list queries (recommended for consistent invalidation), provide a registry:

import { defineListRegistry } from "@rippledb/bind-tanstack-query";

const registry = defineListRegistry()
  .list(["todos"], { deps: ["todos"] })
  .list(["dashboard"], { deps: ["todos", "users"] });

const api = createClientQueryApi({
  store,
  stream: "user-123",
  queryClient,
  schema,
  registry,
});

On this page