Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ out
# Nuxt.js build / generate output
.nuxt
dist
build

# Gatsby files
.cache/
Expand Down
10 changes: 7 additions & 3 deletions examples/react/todo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,28 @@
"private": true,
"version": "0.1.1",
"dependencies": {
"@tanstack/db-devtools": "workspace:*",
"@tanstack/electric-db-collection": "^0.1.0",
"@tanstack/query-core": "^5.75.7",
"@tanstack/query-db-collection": "^0.2.0",
"@tanstack/react-db": "^0.1.0",
"@tanstack/react-db-devtools": "workspace:*",
"@tanstack/react-devtools": "^0.3.0",
"@tanstack/react-router": "^1.125.6",
"@tanstack/react-router-devtools": "^1.130.2",
"@tanstack/react-start": "^1.126.1",
"@tanstack/trailbase-db-collection": "^0.1.0",
"@tanstack/trailbase-db-collection": "^0.1.2",
"cors": "^2.8.5",
"drizzle-orm": "^0.40.1",
"drizzle-zod": "^0.8.3",
"zod": "^4.0.17",
"express": "^4.19.2",
"postgres": "^3.4.7",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"tailwindcss": "^4.1.11",
"trailbase": "^0.7.1",
"vite-tsconfig-paths": "^5.1.4"
"vite-tsconfig-paths": "^5.1.4",
"zod": "^4.0.17"
},
"devDependencies": {
"@eslint/js": "^9.22.0",
Expand Down
16 changes: 10 additions & 6 deletions examples/react/todo/src/lib/collections.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { createCollection } from "@tanstack/react-db"
import { initializeDbDevtools } from "@tanstack/react-db-devtools"
import { electricCollectionOptions } from "@tanstack/electric-db-collection"
import { queryCollectionOptions } from "@tanstack/query-db-collection"
import { trailBaseCollectionOptions } from "@tanstack/trailbase-db-collection"
Expand All @@ -11,13 +12,16 @@ import type { SelectConfig, SelectTodo } from "../db/validation"
// Create a query client for query collections
const queryClient = new QueryClient()

// Initialize DB devtools early (idempotent - safe to call multiple times)
initializeDbDevtools()

// Create a TrailBase client.
const trailBaseClient = initClient(`http://localhost:4000`)

// Electric Todo Collection
export const electricTodoCollection = createCollection(
electricCollectionOptions({
id: `todos`,
id: `electric-todos`,
shapeOptions: {
url: `http://localhost:3003/v1/shape`,
params: {
Expand Down Expand Up @@ -71,7 +75,7 @@ export const electricTodoCollection = createCollection(
// Query Todo Collection
export const queryTodoCollection = createCollection(
queryCollectionOptions({
id: `todos`,
id: `query-todos`,
queryKey: [`todos`],
refetchInterval: 3000,
queryFn: async () => {
Expand Down Expand Up @@ -130,7 +134,7 @@ type Todo = {
// TrailBase Todo Collection
export const trailBaseTodoCollection = createCollection(
trailBaseCollectionOptions<SelectTodo, Todo>({
id: `todos`,
id: `trailbase-todos`,
getKey: (item) => item.id,
schema: selectTodoSchema,
recordApi: trailBaseClient.records(`todos`),
Expand All @@ -149,7 +153,7 @@ export const trailBaseTodoCollection = createCollection(
// Electric Config Collection
export const electricConfigCollection = createCollection(
electricCollectionOptions({
id: `config`,
id: `electric-config`,
shapeOptions: {
url: `http://localhost:3003/v1/shape`,
params: {
Expand Down Expand Up @@ -185,7 +189,7 @@ export const electricConfigCollection = createCollection(
// Query Config Collection
export const queryConfigCollection = createCollection(
queryCollectionOptions({
id: `config`,
id: `query-config`,
queryKey: [`config`],
refetchInterval: 3000,
queryFn: async () => {
Expand Down Expand Up @@ -231,7 +235,7 @@ type Config = {
// TrailBase Config Collection
export const trailBaseConfigCollection = createCollection(
trailBaseCollectionOptions<SelectConfig, Config>({
id: `config`,
id: `trailbase-config`,
getKey: (item) => item.id,
schema: selectConfigSchema,
recordApi: trailBaseClient.records(`config`),
Expand Down
18 changes: 18 additions & 0 deletions examples/react/todo/src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import {
Scripts,
createRootRoute,
} from "@tanstack/react-router"
import { TanstackDevtools } from "@tanstack/react-devtools"
import { TanStackRouterDevtoolsPanel } from "@tanstack/react-router-devtools"
import { TanStackReactDbDevtoolsPanel } from "@tanstack/react-db-devtools"
// import { TanStackReactDbDevtools } from "@tanstack/react-db-devtools"

import appCss from "../styles.css?url"

Expand Down Expand Up @@ -32,6 +36,20 @@ export const Route = createRootRoute({
component: () => (
<RootDocument>
<Outlet />
<TanstackDevtools
plugins={[
{
name: "Tanstack Router",
render: <TanStackRouterDevtoolsPanel />,
},
{
name: "Tanstack DB",
render: <TanStackReactDbDevtoolsPanel />,
},
]}
/>
{/* Alternative standalone component */}
{/* <TanStackReactDbDevtools position="bottom-right" /> */}
</RootDocument>
),
})
Expand Down
64 changes: 64 additions & 0 deletions packages/db-devtools/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# @tanstack/db-devtools

Developer tools for TanStack DB that provide real-time insights into your collections, live queries, and transactions.

## Installation

```bash
npm install @tanstack/db-devtools
npm install @tanstack/react-db-devtools
```

## Usage

### With TanStack Devtools (Recommended)

```tsx
import { TanstackDevtools } from "@tanstack/react-devtools"
import { TanStackReactDbDevtoolsPanel } from "@tanstack/react-db-devtools"

function App() {
return (
<TanstackDevtools
plugins={[
{
name: "Tanstack DB",
render: <TanStackReactDbDevtoolsPanel />,
},
]}
/>
)
}
```

### Standalone Component

```tsx
import { ReactDbDevtools } from "@tanstack/react-db-devtools"

function App() {
return (
<div>
<h1>My App</h1>
<ReactDbDevtools position="bottom-right" />
</div>
)
}
```

## Features

- **Collection Monitoring**: View all active collections with real-time status updates
- **Live Query Insights**: Special handling for live queries with performance metrics
- **Transaction Tracking**: Monitor all database transactions and their states
- **Development Only**: Automatically tree-shaken in production builds

## What You Can See

- Collection status, size, and transaction count
- Live query performance metrics
- Transaction details and states
- Real-time data inspection
- Collection metadata and settings

Collections automatically register themselves with the devtools when created - no additional setup required.
103 changes: 103 additions & 0 deletions packages/db-devtools/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
{
"name": "@tanstack/db-devtools",
"version": "0.0.1",
"description": "Developer tools for TanStack DB",
"author": "tanstack",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/TanStack/db.git",
"directory": "packages/db-devtools"
},
"homepage": "https://tanstack.com/db",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"browser": {},
"exports": {
".": {
"@tanstack/custom-condition": "./src/index.ts",
"solid": {
"development": "./dist/index.js",
"import": "./dist/index.js"
},
"development": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.cjs"
}
},
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.ts",
"default": "./dist/index.cjs"
}
},
"./package.json": "./package.json"
},
"sideEffects": false,
"files": [
"dist",
"src",
"!src/__tests__"
],
"engines": {
"node": ">=18"
},
"scripts": {
"clean": "premove ./build ./coverage ./dist-ts",
"compile": "tsc --build",
"test:eslint": "eslint ./src",
"test:types": "npm-run-all --serial test:types:*",
"test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build",
"test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build",
"test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build",
"test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build",
"test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build",
"test:types:tscurrent": "tsc --build",
"test:lib": "vitest",
"test:lib:dev": "pnpm run test:lib --watch",
"test:build": "publint --strict && attw --pack",
"lint": "eslint . --fix",
"build": "vite build",
"build:dev": "tsup --watch"
},
"dependencies": {
"@tanstack/db": "workspace:*",
"@tanstack/react-table": "^8.13.2",
"@tanstack/react-virtual": "^3.0.0",
"@tanstack/solid-db": "workspace:*",
"@tanstack/solid-table": "^8.21.3",
"@tanstack/solid-virtual": "^3.13.12",
"@types/prismjs": "^1.26.5",
"prismjs": "^1.30.0"
},
"devDependencies": {
"@kobalte/core": "^0.13.4",
"@solid-primitives/keyed": "^1.2.2",
"@solid-primitives/resize-observer": "^2.0.26",
"@solid-primitives/storage": "^1.3.11",
"@tanstack/match-sorter-utils": "^8.19.4",
"clsx": "^2.1.1",
"goober": "^2.1.16",
"npm-run-all2": "^5.0.0",
"solid-js": "^1.9.5",
"solid-transition-group": "^0.2.3",
"superjson": "^2.2.1",
"tsup-preset-solid": "^2.2.0",
"vite-plugin-dts": "^4.5.4",
"vite-plugin-solid": "^2.11.6"
}
}
Loading
Loading