@tanstack/react-db 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @tanstack/react-db
2
+
3
+ React hooks for TanStack DB. See [TanStack/db](https://github.com/TanStack/db) for more details.
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const useOptimisticMutation = require("./useOptimisticMutation.cjs");
4
+ const useLiveQuery = require("./useLiveQuery.cjs");
5
+ const db = require("@tanstack/db");
6
+ exports.useOptimisticMutation = useOptimisticMutation.useOptimisticMutation;
7
+ exports.useLiveQuery = useLiveQuery.useLiveQuery;
8
+ Object.defineProperty(exports, "Collection", {
9
+ enumerable: true,
10
+ get: () => db.Collection
11
+ });
12
+ Object.defineProperty(exports, "createTransaction", {
13
+ enumerable: true,
14
+ get: () => db.createTransaction
15
+ });
16
+ Object.keys(db).forEach((k) => {
17
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
18
+ enumerable: true,
19
+ get: () => db[k]
20
+ });
21
+ });
22
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,5 @@
1
+ export * from './useOptimisticMutation.cjs';
2
+ export * from './useLiveQuery.cjs';
3
+ export * from '@tanstack/db';
4
+ export { Collection } from '@tanstack/db';
5
+ export { createTransaction } from '@tanstack/db';
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const reactStore = require("@tanstack/react-store");
5
+ const db = require("@tanstack/db");
6
+ function useLiveQuery(queryFn, deps = []) {
7
+ const [restart, forceRestart] = react.useState(0);
8
+ const compiledQuery = react.useMemo(() => {
9
+ const query = queryFn(db.queryBuilder());
10
+ const compiled = db.compileQuery(query);
11
+ compiled.start();
12
+ return compiled;
13
+ }, [...deps, restart]);
14
+ const state = reactStore.useStore(compiledQuery.results.derivedState);
15
+ const data = reactStore.useStore(compiledQuery.results.derivedArray);
16
+ react.useEffect(() => {
17
+ if (compiledQuery.state === `stopped`) {
18
+ forceRestart((count) => {
19
+ return count += 1;
20
+ });
21
+ }
22
+ return () => {
23
+ compiledQuery.stop();
24
+ };
25
+ }, [compiledQuery]);
26
+ return {
27
+ state,
28
+ data
29
+ };
30
+ }
31
+ exports.useLiveQuery = useLiveQuery;
32
+ //# sourceMappingURL=useLiveQuery.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLiveQuery.cjs","sources":["../../src/useLiveQuery.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { useStore } from \"@tanstack/react-store\"\nimport { compileQuery, queryBuilder } from \"@tanstack/db\"\nimport type {\n Context,\n InitialQueryBuilder,\n QueryBuilder,\n ResultsFromContext,\n Schema,\n} from \"@tanstack/db\"\n\nexport interface UseLiveQueryReturn<T extends object> {\n state: Map<string, T>\n data: Array<T>\n}\n\nexport function useLiveQuery<\n TResultContext extends Context<Schema> = Context<Schema>,\n>(\n queryFn: (\n q: InitialQueryBuilder<Context<Schema>>\n ) => QueryBuilder<TResultContext>,\n deps: Array<unknown> = []\n): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {\n const [restart, forceRestart] = useState(0)\n\n const compiledQuery = useMemo(() => {\n const query = queryFn(queryBuilder())\n const compiled = compileQuery(query)\n compiled.start()\n return compiled\n }, [...deps, restart])\n\n const state = useStore(compiledQuery.results.derivedState)\n const data = useStore(compiledQuery.results.derivedArray)\n\n // Clean up on unmount\n useEffect(() => {\n if (compiledQuery.state === `stopped`) {\n forceRestart((count) => {\n return (count += 1)\n })\n }\n\n return () => {\n compiledQuery.stop()\n }\n }, [compiledQuery])\n\n return {\n state,\n data,\n }\n}\n"],"names":["useState","useMemo","queryBuilder","compileQuery","useStore","useEffect"],"mappings":";;;;;AAgBO,SAAS,aAGd,SAGA,OAAuB,IACiC;AACxD,QAAM,CAAC,SAAS,YAAY,IAAIA,MAAAA,SAAS,CAAC;AAEpC,QAAA,gBAAgBC,MAAAA,QAAQ,MAAM;AAC5B,UAAA,QAAQ,QAAQC,GAAAA,cAAc;AAC9B,UAAA,WAAWC,gBAAa,KAAK;AACnC,aAAS,MAAM;AACR,WAAA;AAAA,EAAA,GACN,CAAC,GAAG,MAAM,OAAO,CAAC;AAErB,QAAM,QAAQC,WAAA,SAAS,cAAc,QAAQ,YAAY;AACzD,QAAM,OAAOA,WAAA,SAAS,cAAc,QAAQ,YAAY;AAGxDC,QAAAA,UAAU,MAAM;AACV,QAAA,cAAc,UAAU,WAAW;AACrC,mBAAa,CAAC,UAAU;AACtB,eAAQ,SAAS;AAAA,MAAA,CAClB;AAAA,IAAA;AAGH,WAAO,MAAM;AACX,oBAAc,KAAK;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,aAAa,CAAC;AAEX,SAAA;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;"}
@@ -0,0 +1,6 @@
1
+ import { Context, InitialQueryBuilder, QueryBuilder, ResultsFromContext, Schema } from '@tanstack/db';
2
+ export interface UseLiveQueryReturn<T extends object> {
3
+ state: Map<string, T>;
4
+ data: Array<T>;
5
+ }
6
+ export declare function useLiveQuery<TResultContext extends Context<Schema> = Context<Schema>>(queryFn: (q: InitialQueryBuilder<Context<Schema>>) => QueryBuilder<TResultContext>, deps?: Array<unknown>): UseLiveQueryReturn<ResultsFromContext<TResultContext>>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const db = require("@tanstack/db");
4
+ function useOptimisticMutation(config) {
5
+ return {
6
+ mutate: (callback) => {
7
+ const transaction = db.createTransaction(config);
8
+ transaction.mutate(callback);
9
+ return transaction;
10
+ },
11
+ createTransaction: () => {
12
+ return db.createTransaction({ ...config, autoCommit: false });
13
+ }
14
+ };
15
+ }
16
+ exports.useOptimisticMutation = useOptimisticMutation;
17
+ //# sourceMappingURL=useOptimisticMutation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOptimisticMutation.cjs","sources":["../../src/useOptimisticMutation.ts"],"sourcesContent":["import { createTransaction } from \"@tanstack/db\"\nimport type { Transaction, TransactionConfig } from \"@tanstack/db\"\n\nexport function useOptimisticMutation(config: TransactionConfig) {\n return {\n mutate: (callback: () => void): Transaction => {\n const transaction = createTransaction(config)\n transaction.mutate(callback)\n return transaction\n },\n createTransaction: (): Transaction => {\n return createTransaction({ ...config, autoCommit: false })\n },\n }\n}\n"],"names":["createTransaction"],"mappings":";;;AAGO,SAAS,sBAAsB,QAA2B;AACxD,SAAA;AAAA,IACL,QAAQ,CAAC,aAAsC;AACvC,YAAA,cAAcA,qBAAkB,MAAM;AAC5C,kBAAY,OAAO,QAAQ;AACpB,aAAA;AAAA,IACT;AAAA,IACA,mBAAmB,MAAmB;AACpC,aAAOA,qBAAkB,EAAE,GAAG,QAAQ,YAAY,OAAO;AAAA,IAAA;AAAA,EAE7D;AACF;;"}
@@ -0,0 +1,5 @@
1
+ import { Transaction, TransactionConfig } from '@tanstack/db';
2
+ export declare function useOptimisticMutation(config: TransactionConfig): {
3
+ mutate: (callback: () => void) => Transaction;
4
+ createTransaction: () => Transaction;
5
+ };
@@ -0,0 +1,5 @@
1
+ export * from './useOptimisticMutation.js';
2
+ export * from './useLiveQuery.js';
3
+ export * from '@tanstack/db';
4
+ export { Collection } from '@tanstack/db';
5
+ export { createTransaction } from '@tanstack/db';
@@ -0,0 +1,11 @@
1
+ import { useOptimisticMutation } from "./useOptimisticMutation.js";
2
+ import { useLiveQuery } from "./useLiveQuery.js";
3
+ export * from "@tanstack/db";
4
+ import { Collection, createTransaction } from "@tanstack/db";
5
+ export {
6
+ Collection,
7
+ createTransaction,
8
+ useLiveQuery,
9
+ useOptimisticMutation
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,6 @@
1
+ import { Context, InitialQueryBuilder, QueryBuilder, ResultsFromContext, Schema } from '@tanstack/db';
2
+ export interface UseLiveQueryReturn<T extends object> {
3
+ state: Map<string, T>;
4
+ data: Array<T>;
5
+ }
6
+ export declare function useLiveQuery<TResultContext extends Context<Schema> = Context<Schema>>(queryFn: (q: InitialQueryBuilder<Context<Schema>>) => QueryBuilder<TResultContext>, deps?: Array<unknown>): UseLiveQueryReturn<ResultsFromContext<TResultContext>>;
@@ -0,0 +1,32 @@
1
+ import { useState, useMemo, useEffect } from "react";
2
+ import { useStore } from "@tanstack/react-store";
3
+ import { queryBuilder, compileQuery } from "@tanstack/db";
4
+ function useLiveQuery(queryFn, deps = []) {
5
+ const [restart, forceRestart] = useState(0);
6
+ const compiledQuery = useMemo(() => {
7
+ const query = queryFn(queryBuilder());
8
+ const compiled = compileQuery(query);
9
+ compiled.start();
10
+ return compiled;
11
+ }, [...deps, restart]);
12
+ const state = useStore(compiledQuery.results.derivedState);
13
+ const data = useStore(compiledQuery.results.derivedArray);
14
+ useEffect(() => {
15
+ if (compiledQuery.state === `stopped`) {
16
+ forceRestart((count) => {
17
+ return count += 1;
18
+ });
19
+ }
20
+ return () => {
21
+ compiledQuery.stop();
22
+ };
23
+ }, [compiledQuery]);
24
+ return {
25
+ state,
26
+ data
27
+ };
28
+ }
29
+ export {
30
+ useLiveQuery
31
+ };
32
+ //# sourceMappingURL=useLiveQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLiveQuery.js","sources":["../../src/useLiveQuery.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\"\nimport { useStore } from \"@tanstack/react-store\"\nimport { compileQuery, queryBuilder } from \"@tanstack/db\"\nimport type {\n Context,\n InitialQueryBuilder,\n QueryBuilder,\n ResultsFromContext,\n Schema,\n} from \"@tanstack/db\"\n\nexport interface UseLiveQueryReturn<T extends object> {\n state: Map<string, T>\n data: Array<T>\n}\n\nexport function useLiveQuery<\n TResultContext extends Context<Schema> = Context<Schema>,\n>(\n queryFn: (\n q: InitialQueryBuilder<Context<Schema>>\n ) => QueryBuilder<TResultContext>,\n deps: Array<unknown> = []\n): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {\n const [restart, forceRestart] = useState(0)\n\n const compiledQuery = useMemo(() => {\n const query = queryFn(queryBuilder())\n const compiled = compileQuery(query)\n compiled.start()\n return compiled\n }, [...deps, restart])\n\n const state = useStore(compiledQuery.results.derivedState)\n const data = useStore(compiledQuery.results.derivedArray)\n\n // Clean up on unmount\n useEffect(() => {\n if (compiledQuery.state === `stopped`) {\n forceRestart((count) => {\n return (count += 1)\n })\n }\n\n return () => {\n compiledQuery.stop()\n }\n }, [compiledQuery])\n\n return {\n state,\n data,\n }\n}\n"],"names":[],"mappings":";;;AAgBO,SAAS,aAGd,SAGA,OAAuB,IACiC;AACxD,QAAM,CAAC,SAAS,YAAY,IAAI,SAAS,CAAC;AAEpC,QAAA,gBAAgB,QAAQ,MAAM;AAC5B,UAAA,QAAQ,QAAQ,cAAc;AAC9B,UAAA,WAAW,aAAa,KAAK;AACnC,aAAS,MAAM;AACR,WAAA;AAAA,EAAA,GACN,CAAC,GAAG,MAAM,OAAO,CAAC;AAErB,QAAM,QAAQ,SAAS,cAAc,QAAQ,YAAY;AACzD,QAAM,OAAO,SAAS,cAAc,QAAQ,YAAY;AAGxD,YAAU,MAAM;AACV,QAAA,cAAc,UAAU,WAAW;AACrC,mBAAa,CAAC,UAAU;AACtB,eAAQ,SAAS;AAAA,MAAA,CAClB;AAAA,IAAA;AAGH,WAAO,MAAM;AACX,oBAAc,KAAK;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,aAAa,CAAC;AAEX,SAAA;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;"}
@@ -0,0 +1,5 @@
1
+ import { Transaction, TransactionConfig } from '@tanstack/db';
2
+ export declare function useOptimisticMutation(config: TransactionConfig): {
3
+ mutate: (callback: () => void) => Transaction;
4
+ createTransaction: () => Transaction;
5
+ };
@@ -0,0 +1,17 @@
1
+ import { createTransaction } from "@tanstack/db";
2
+ function useOptimisticMutation(config) {
3
+ return {
4
+ mutate: (callback) => {
5
+ const transaction = createTransaction(config);
6
+ transaction.mutate(callback);
7
+ return transaction;
8
+ },
9
+ createTransaction: () => {
10
+ return createTransaction({ ...config, autoCommit: false });
11
+ }
12
+ };
13
+ }
14
+ export {
15
+ useOptimisticMutation
16
+ };
17
+ //# sourceMappingURL=useOptimisticMutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOptimisticMutation.js","sources":["../../src/useOptimisticMutation.ts"],"sourcesContent":["import { createTransaction } from \"@tanstack/db\"\nimport type { Transaction, TransactionConfig } from \"@tanstack/db\"\n\nexport function useOptimisticMutation(config: TransactionConfig) {\n return {\n mutate: (callback: () => void): Transaction => {\n const transaction = createTransaction(config)\n transaction.mutate(callback)\n return transaction\n },\n createTransaction: (): Transaction => {\n return createTransaction({ ...config, autoCommit: false })\n },\n }\n}\n"],"names":[],"mappings":";AAGO,SAAS,sBAAsB,QAA2B;AACxD,SAAA;AAAA,IACL,QAAQ,CAAC,aAAsC;AACvC,YAAA,cAAc,kBAAkB,MAAM;AAC5C,kBAAY,OAAO,QAAQ;AACpB,aAAA;AAAA,IACT;AAAA,IACA,mBAAmB,MAAmB;AACpC,aAAO,kBAAkB,EAAE,GAAG,QAAQ,YAAY,OAAO;AAAA,IAAA;AAAA,EAE7D;AACF;"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@tanstack/react-db",
3
+ "description": "React integration for @tanstack/db",
4
+ "version": "0.0.1",
5
+ "author": "Kyle Mathews",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/TanStack/db.git",
10
+ "directory": "packages/react-db"
11
+ },
12
+ "homepage": "https://tanstack.com/db",
13
+ "keywords": [
14
+ "optimistic",
15
+ "react",
16
+ "typescript"
17
+ ],
18
+ "packageManager": "pnpm@10.5.2",
19
+ "dependencies": {
20
+ "@tanstack/db": "workspace:*",
21
+ "@tanstack/react-store": "^0.7.0",
22
+ "use-sync-external-store": "^1.2.0"
23
+ },
24
+ "devDependencies": {
25
+ "@electric-sql/client": "1.0.0",
26
+ "@testing-library/react": "^16.2.0",
27
+ "@types/react": "^19.0.12",
28
+ "@types/react-dom": "^19.0.3",
29
+ "@types/use-sync-external-store": "^0.0.6",
30
+ "@vitest/coverage-istanbul": "^3.0.9",
31
+ "react": "^19.0.0",
32
+ "react-dom": "^19.0.0"
33
+ },
34
+ "exports": {
35
+ ".": {
36
+ "import": {
37
+ "types": "./dist/esm/index.d.ts",
38
+ "default": "./dist/esm/index.js"
39
+ },
40
+ "require": {
41
+ "types": "./dist/cjs/index.d.cts",
42
+ "default": "./dist/cjs/index.cjs"
43
+ }
44
+ },
45
+ "./package.json": "./package.json"
46
+ },
47
+ "files": [
48
+ "dist",
49
+ "src"
50
+ ],
51
+ "main": "dist/cjs/index.cjs",
52
+ "module": "dist/esm/index.js",
53
+ "peerDependencies": {
54
+ "react": ">=16.8.0"
55
+ },
56
+ "scripts": {
57
+ "build": "vite build",
58
+ "dev": "vite build --watch",
59
+ "test": "npx vitest --run",
60
+ "lint": "eslint . --fix"
61
+ },
62
+ "sideEffects": false,
63
+ "type": "module",
64
+ "types": "dist/esm/index.d.ts"
65
+ }
package/src/index.ts ADDED
@@ -0,0 +1,10 @@
1
+ // Re-export all public APIs
2
+ export * from "./useOptimisticMutation"
3
+ export * from "./useLiveQuery"
4
+
5
+ // Re-export everything from @tanstack/db
6
+ export * from "@tanstack/db"
7
+
8
+ // Re-export some stuff explicitly to ensure the type & value is exported
9
+ export { Collection } from "@tanstack/db"
10
+ export { createTransaction } from "@tanstack/db"
@@ -0,0 +1,54 @@
1
+ import { useEffect, useMemo, useState } from "react"
2
+ import { useStore } from "@tanstack/react-store"
3
+ import { compileQuery, queryBuilder } from "@tanstack/db"
4
+ import type {
5
+ Context,
6
+ InitialQueryBuilder,
7
+ QueryBuilder,
8
+ ResultsFromContext,
9
+ Schema,
10
+ } from "@tanstack/db"
11
+
12
+ export interface UseLiveQueryReturn<T extends object> {
13
+ state: Map<string, T>
14
+ data: Array<T>
15
+ }
16
+
17
+ export function useLiveQuery<
18
+ TResultContext extends Context<Schema> = Context<Schema>,
19
+ >(
20
+ queryFn: (
21
+ q: InitialQueryBuilder<Context<Schema>>
22
+ ) => QueryBuilder<TResultContext>,
23
+ deps: Array<unknown> = []
24
+ ): UseLiveQueryReturn<ResultsFromContext<TResultContext>> {
25
+ const [restart, forceRestart] = useState(0)
26
+
27
+ const compiledQuery = useMemo(() => {
28
+ const query = queryFn(queryBuilder())
29
+ const compiled = compileQuery(query)
30
+ compiled.start()
31
+ return compiled
32
+ }, [...deps, restart])
33
+
34
+ const state = useStore(compiledQuery.results.derivedState)
35
+ const data = useStore(compiledQuery.results.derivedArray)
36
+
37
+ // Clean up on unmount
38
+ useEffect(() => {
39
+ if (compiledQuery.state === `stopped`) {
40
+ forceRestart((count) => {
41
+ return (count += 1)
42
+ })
43
+ }
44
+
45
+ return () => {
46
+ compiledQuery.stop()
47
+ }
48
+ }, [compiledQuery])
49
+
50
+ return {
51
+ state,
52
+ data,
53
+ }
54
+ }
@@ -0,0 +1,15 @@
1
+ import { createTransaction } from "@tanstack/db"
2
+ import type { Transaction, TransactionConfig } from "@tanstack/db"
3
+
4
+ export function useOptimisticMutation(config: TransactionConfig) {
5
+ return {
6
+ mutate: (callback: () => void): Transaction => {
7
+ const transaction = createTransaction(config)
8
+ transaction.mutate(callback)
9
+ return transaction
10
+ },
11
+ createTransaction: (): Transaction => {
12
+ return createTransaction({ ...config, autoCommit: false })
13
+ },
14
+ }
15
+ }