@livestore/livestore 0.0.12 → 0.0.15
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 +7 -7
- package/dist/.tsbuildinfo +1 -0
- package/dist/QueryCache.d.ts +20 -0
- package/dist/QueryCache.d.ts.map +1 -0
- package/dist/QueryCache.js +71 -0
- package/dist/QueryCache.js.map +1 -0
- package/dist/__tests__/react/fixture.d.ts +25 -0
- package/dist/__tests__/react/fixture.d.ts.map +1 -0
- package/dist/__tests__/react/fixture.js +60 -0
- package/dist/__tests__/react/fixture.js.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +2 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js +78 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
- package/dist/__tests__/reactive.test.d.ts +2 -0
- package/dist/__tests__/reactive.test.d.ts.map +1 -0
- package/dist/__tests__/reactive.test.js +197 -0
- package/dist/__tests__/reactive.test.js.map +1 -0
- package/dist/bounded-collections.d.ts +34 -0
- package/dist/bounded-collections.d.ts.map +1 -0
- package/dist/bounded-collections.js +103 -0
- package/dist/bounded-collections.js.map +1 -0
- package/dist/componentKey.d.ts +20 -0
- package/dist/componentKey.d.ts.map +1 -0
- package/dist/componentKey.js +3 -0
- package/dist/componentKey.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +36 -0
- package/dist/effect/LiveStore.d.ts.map +1 -0
- package/dist/effect/LiveStore.js +41 -0
- package/dist/effect/LiveStore.js.map +1 -0
- package/dist/effect/index.d.ts +2 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +2 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/events.d.ts +7 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/inMemoryDatabase.d.ts +56 -0
- package/dist/inMemoryDatabase.d.ts.map +1 -0
- package/dist/inMemoryDatabase.js +223 -0
- package/dist/inMemoryDatabase.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +16 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +67 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +4 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +6 -0
- package/dist/otel.js.map +1 -0
- package/dist/react/LiveStoreContext.d.ts +11 -0
- package/dist/react/LiveStoreContext.d.ts.map +1 -0
- package/dist/react/LiveStoreContext.js +10 -0
- package/dist/react/LiveStoreContext.js.map +1 -0
- package/dist/react/LiveStoreProvider.d.ts +20 -0
- package/dist/react/LiveStoreProvider.d.ts.map +1 -0
- package/dist/react/LiveStoreProvider.js +52 -0
- package/dist/react/LiveStoreProvider.js.map +1 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +6 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useGraphQL.d.ts +13 -0
- package/dist/react/useGraphQL.d.ts.map +1 -0
- package/dist/react/useGraphQL.js +85 -0
- package/dist/react/useGraphQL.js.map +1 -0
- package/dist/react/useLiveStoreComponent.d.ts +75 -0
- package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
- package/dist/react/useLiveStoreComponent.js +317 -0
- package/dist/react/useLiveStoreComponent.js.map +1 -0
- package/dist/react/useQuery.d.ts +3 -0
- package/dist/react/useQuery.d.ts.map +1 -0
- package/dist/react/useQuery.js +38 -0
- package/dist/react/useQuery.js.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
- package/dist/reactive.d.ts +140 -0
- package/dist/reactive.d.ts.map +1 -0
- package/dist/reactive.js +302 -0
- package/dist/reactive.js.map +1 -0
- package/dist/reactiveQueries/base-class.d.ts +27 -0
- package/dist/reactiveQueries/base-class.d.ts.map +1 -0
- package/dist/reactiveQueries/base-class.js +23 -0
- package/dist/reactiveQueries/base-class.js.map +1 -0
- package/dist/reactiveQueries/graphql.d.ts +25 -0
- package/dist/reactiveQueries/graphql.d.ts.map +1 -0
- package/dist/reactiveQueries/graphql.js +18 -0
- package/dist/reactiveQueries/graphql.js.map +1 -0
- package/dist/reactiveQueries/js.d.ts +19 -0
- package/dist/reactiveQueries/js.d.ts.map +1 -0
- package/dist/reactiveQueries/js.js +13 -0
- package/dist/reactiveQueries/js.js.map +1 -0
- package/dist/reactiveQueries/sql.d.ts +31 -0
- package/dist/reactiveQueries/sql.d.ts.map +1 -0
- package/dist/reactiveQueries/sql.js +32 -0
- package/dist/reactiveQueries/sql.js.map +1 -0
- package/dist/schema.d.ts +81 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +46 -0
- package/dist/schema.js.map +1 -0
- package/dist/storage/in-memory/index.d.ts +15 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -0
- package/dist/storage/in-memory/index.js +14 -0
- package/dist/storage/in-memory/index.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +9 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/tauri/index.d.ts +19 -0
- package/dist/storage/tauri/index.d.ts.map +1 -0
- package/dist/storage/tauri/index.js +38 -0
- package/dist/storage/tauri/index.js.map +1 -0
- package/dist/storage/utils/idb.d.ts +10 -0
- package/dist/storage/utils/idb.d.ts.map +1 -0
- package/dist/storage/utils/idb.js +58 -0
- package/dist/storage/utils/idb.js.map +1 -0
- package/dist/storage/web-worker/index.d.ts +27 -0
- package/dist/storage/web-worker/index.d.ts.map +1 -0
- package/dist/storage/web-worker/index.js +74 -0
- package/dist/storage/web-worker/index.js.map +1 -0
- package/dist/storage/web-worker/worker.d.ts +13 -0
- package/dist/storage/web-worker/worker.d.ts.map +1 -0
- package/dist/storage/web-worker/worker.js +110 -0
- package/dist/storage/web-worker/worker.js.map +1 -0
- package/dist/store.d.ts +199 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +603 -0
- package/dist/store.js.map +1 -0
- package/dist/util.d.ts +28 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +55 -0
- package/dist/util.js.map +1 -0
- package/package.json +46 -19
- package/src/__tests__/react/fixture.tsx +23 -32
- package/src/__tests__/reactive.test.ts +3 -4
- package/src/effect/LiveStore.ts +22 -31
- package/src/events.ts +1 -1
- package/src/inMemoryDatabase.ts +115 -140
- package/src/index.ts +20 -20
- package/src/migrations.ts +119 -0
- package/src/otel.ts +0 -11
- package/src/react/LiveStoreProvider.tsx +24 -23
- package/src/react/index.ts +10 -1
- package/src/react/useGraphQL.ts +28 -2
- package/src/react/useLiveStoreComponent.ts +134 -50
- package/src/react/useQuery.ts +56 -0
- package/src/reactive.ts +6 -4
- package/src/reactiveQueries/base-class.ts +9 -3
- package/src/reactiveQueries/graphql.ts +4 -4
- package/src/reactiveQueries/js.ts +2 -2
- package/src/reactiveQueries/sql.ts +6 -6
- package/src/schema.ts +69 -145
- package/src/storage/in-memory/index.ts +21 -0
- package/src/storage/index.ts +27 -0
- package/src/{backends/tauri.ts → storage/tauri/index.ts} +14 -28
- package/src/storage/web-worker/index.ts +116 -0
- package/src/{backends/web-worker.ts → storage/web-worker/worker.ts} +17 -52
- package/src/store.ts +171 -98
- package/src/util.ts +13 -3
- package/tsconfig.json +1 -3
- package/src/backends/base.ts +0 -67
- package/src/backends/index.ts +0 -98
- package/src/backends/noop.ts +0 -32
- package/src/backends/web-in-memory.ts +0 -65
- package/src/backends/web.ts +0 -97
- package/src/react/useGlobalQuery.ts +0 -40
- /package/src/{backends → storage}/utils/idb.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAQxD,eAAO,MAAM,SAAS;QAKhB,gBAAgB;iBACP,KAAK,OAAO;YACjB,MAAM;UAkCf,CAAA;AAED,eAAO,MAAM,YAAY;QAMnB,gBAAgB;cACV,UAAU,KAAK;iBACZ,KAAK,OAAO;gBACb,MAAM;UAwBnB,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SqliteAst } from 'effect-db-schema';
|
|
2
|
+
import { memoize, omit } from 'lodash-es';
|
|
3
|
+
import { componentStateTables, SCHEMA_META_TABLE, systemTables } from './schema.js';
|
|
4
|
+
import { sql } from './util.js';
|
|
5
|
+
const getMemoizedTimestamp = memoize(() => new Date().toISOString());
|
|
6
|
+
// TODO more graceful DB migration (e.g. backup DB before destructive migrations)
|
|
7
|
+
export const migrateDb = ({ db, otelContext, schema, }) => {
|
|
8
|
+
db.execute(
|
|
9
|
+
// TODO use schema migration definition from schema.ts instead
|
|
10
|
+
sql `create table if not exists ${SCHEMA_META_TABLE} (tableName text primary key, schemaHash text, updatedAt text);`, undefined, [], { otelContext });
|
|
11
|
+
const schemaMetaRows = db.select(sql `SELECT * FROM ${SCHEMA_META_TABLE}`);
|
|
12
|
+
const dbSchemaHashByTable = Object.fromEntries(schemaMetaRows.map(({ tableName, schemaHash }) => [tableName, schemaHash]));
|
|
13
|
+
const tableDefs = {
|
|
14
|
+
// NOTE it's important the `SCHEMA_META_TABLE` comes first since we're writing to it below
|
|
15
|
+
[SCHEMA_META_TABLE]: systemTables[SCHEMA_META_TABLE],
|
|
16
|
+
...omit(schema.tables, [SCHEMA_META_TABLE]),
|
|
17
|
+
...componentStateTables,
|
|
18
|
+
};
|
|
19
|
+
for (const [tableName, tableDef] of Object.entries(tableDefs)) {
|
|
20
|
+
const dbSchemaHash = dbSchemaHashByTable[tableName];
|
|
21
|
+
const schemaHash = SqliteAst.hash(tableDef);
|
|
22
|
+
if (schemaHash !== dbSchemaHash) {
|
|
23
|
+
console.log(`Schema hash mismatch for table '${tableName}' (DB: ${dbSchemaHash}, expected: ${schemaHash}), migrating table...`);
|
|
24
|
+
migrateTable({ db, tableDef, otelContext, schemaHash });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export const migrateTable = ({ db, tableDef, otelContext, schemaHash, }) => {
|
|
29
|
+
console.log(`Migrating table '${tableDef.name}'...`);
|
|
30
|
+
const tableName = tableDef.name;
|
|
31
|
+
const columnSpec = makeColumnSpec(tableDef);
|
|
32
|
+
// TODO need to possibly handle cascading deletes due to foreign keys
|
|
33
|
+
db.execute(sql `drop table if exists ${tableName}`, undefined, [], { otelContext });
|
|
34
|
+
db.execute(sql `create table if not exists ${tableName} (${columnSpec});`, undefined, [], { otelContext });
|
|
35
|
+
for (const index of tableDef.indexes) {
|
|
36
|
+
db.execute(createIndexFromDefinition(tableName, index), undefined, [], { otelContext });
|
|
37
|
+
}
|
|
38
|
+
const updatedAt = getMemoizedTimestamp();
|
|
39
|
+
db.execute(sql `
|
|
40
|
+
INSERT INTO ${SCHEMA_META_TABLE} (tableName, schemaHash, updatedAt) VALUES ($tableName, $schemaHash, $updatedAt)
|
|
41
|
+
ON CONFLICT (tableName) DO UPDATE SET schemaHash = $schemaHash, updatedAt = $updatedAt;
|
|
42
|
+
`, { $tableName: tableName, $schemaHash: schemaHash, $updatedAt: updatedAt }, [], { otelContext });
|
|
43
|
+
};
|
|
44
|
+
const createIndexFromDefinition = (tableName, index) => {
|
|
45
|
+
const uniqueStr = index.unique ? 'UNIQUE' : '';
|
|
46
|
+
return sql `create ${uniqueStr} index ${index.name} on ${tableName} (${index.columns.join(', ')})`;
|
|
47
|
+
};
|
|
48
|
+
const makeColumnSpec = (tableDef) => {
|
|
49
|
+
const primaryKeys = tableDef.columns.filter((_) => _.primaryKey).map((_) => _.name);
|
|
50
|
+
const columnDefStrs = tableDef.columns.map(toSqliteColumnSpec);
|
|
51
|
+
if (primaryKeys.length > 0) {
|
|
52
|
+
columnDefStrs.push(`PRIMARY KEY (${primaryKeys.join(', ')})`);
|
|
53
|
+
}
|
|
54
|
+
return columnDefStrs.join(', ');
|
|
55
|
+
};
|
|
56
|
+
const toSqliteColumnSpec = (column) => {
|
|
57
|
+
const columnType = column.type._tag;
|
|
58
|
+
// const primaryKey = column.primaryKey ? 'primary key' : ''
|
|
59
|
+
const nullable = column.nullable === false ? 'not null' : '';
|
|
60
|
+
const defaultValue = column.default === undefined
|
|
61
|
+
? ''
|
|
62
|
+
: columnType === 'text'
|
|
63
|
+
? `default '${column.default}'`
|
|
64
|
+
: `default ${column.default}`;
|
|
65
|
+
return `${column.name} ${columnType} ${nullable} ${defaultValue}`;
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/otel.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,eAAO,MAAM,qBAAqB,SAAU,KAAK,IAAI,KAAG,MAGvD,CAAA;AAED,eAAO,MAAM,2BAA2B,SAAU,KAAK,IAAI,KAAG,mBACF,CAAA"}
|
package/dist/otel.js
ADDED
package/dist/otel.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAe,EAAU,EAAE;IAC/D,MAAM,UAAU,GAAsC,IAAY,CAAC,SAAS,CAAA;IAC5E,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,OAAS,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,IAAe,EAAuB,EAAE,CACjF,IAAY,CAAC,qBAA4C,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { LiveStoreContext as LiveStoreContext_ } from '../effect/LiveStore.js';
|
|
3
|
+
import type { LiveStoreQuery } from '../store.js';
|
|
4
|
+
declare global {
|
|
5
|
+
interface LiveStoreQueryTypes {
|
|
6
|
+
[key: string]: LiveStoreQuery;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export declare const LiveStoreContext: React.Context<LiveStoreContext_ | undefined>;
|
|
10
|
+
export declare const useStore: () => LiveStoreContext_;
|
|
11
|
+
//# sourceMappingURL=LiveStoreContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStoreContext.d.ts","sourceRoot":"","sources":["../../src/react/LiveStoreContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAA;AAEzC,OAAO,KAAK,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,mBAAmB;QAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;KAC9B;CACF;AAED,eAAO,MAAM,gBAAgB,8CAAgE,CAAA;AAE7F,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
export const LiveStoreContext = React.createContext(undefined);
|
|
3
|
+
export const useStore = () => {
|
|
4
|
+
const storeContext = useContext(LiveStoreContext);
|
|
5
|
+
if (storeContext === undefined) {
|
|
6
|
+
throw new Error(`useStore can only be used inside StoreContext.Provider`);
|
|
7
|
+
}
|
|
8
|
+
return storeContext;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=LiveStoreContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStoreContext.js","sourceRoot":"","sources":["../../src/react/LiveStoreContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAYzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAgC,SAAS,CAAC,CAAA;AAE7F,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAsB,EAAE;IAC9C,MAAM,YAAY,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAA;IAEjD,IAAI,YAAY,KAAK,SAAS,EAAE;QAC9B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;KAC1E;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type * as otel from '@opentelemetry/api';
|
|
2
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
3
|
+
import type { InMemoryDatabase } from '../inMemoryDatabase.js';
|
|
4
|
+
import type { Schema } from '../schema.js';
|
|
5
|
+
import type { StorageInit } from '../storage/index.js';
|
|
6
|
+
import type { BaseGraphQLContext, GraphQLOptions } from '../store.js';
|
|
7
|
+
interface LiveStoreProviderProps<GraphQLContext> {
|
|
8
|
+
schema: Schema;
|
|
9
|
+
loadStorage: () => StorageInit | Promise<StorageInit>;
|
|
10
|
+
boot?: (db: InMemoryDatabase, parentSpan: otel.Span) => unknown | Promise<unknown>;
|
|
11
|
+
graphQLOptions?: GraphQLOptions<GraphQLContext>;
|
|
12
|
+
otelTracer?: otel.Tracer;
|
|
13
|
+
otelRootSpanContext?: otel.Context;
|
|
14
|
+
fallback: ReactElement;
|
|
15
|
+
}
|
|
16
|
+
export declare const LiveStoreProvider: <GraphQLContext extends BaseGraphQLContext>({ fallback, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, children, schema, boot, }: LiveStoreProviderProps<GraphQLContext> & {
|
|
17
|
+
children?: ReactNode;
|
|
18
|
+
}) => JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=LiveStoreProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStoreProvider.d.ts","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAWrE,UAAU,sBAAsB,CAAC,cAAc;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACrD,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClF,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAClC,QAAQ,EAAE,YAAY,CAAA;CACvB;AAED,eAAO,MAAM,iBAAiB;eAS2B,SAAS;MAAK,WAiBtE,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import initSqlite3Wasm from 'sqlite-esm';
|
|
3
|
+
import { createStore } from '../store.js';
|
|
4
|
+
import { LiveStoreContext } from './LiveStoreContext.js';
|
|
5
|
+
// NOTE we're starting to initialize the sqlite wasm binary here (already before calling `createStore`),
|
|
6
|
+
// so that it's ready when we need it
|
|
7
|
+
const sqlite3Promise = initSqlite3Wasm({
|
|
8
|
+
print: (message) => console.log(`[livestore sqlite] ${message}`),
|
|
9
|
+
printErr: (message) => console.error(`[livestore sqlite] ${message}`),
|
|
10
|
+
});
|
|
11
|
+
export const LiveStoreProvider = ({ fallback, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, children, schema, boot, }) => {
|
|
12
|
+
const store = useCreateStore({
|
|
13
|
+
schema,
|
|
14
|
+
loadStorage,
|
|
15
|
+
graphQLOptions,
|
|
16
|
+
otelTracer,
|
|
17
|
+
otelRootSpanContext,
|
|
18
|
+
boot,
|
|
19
|
+
});
|
|
20
|
+
if (store === undefined) {
|
|
21
|
+
return fallback;
|
|
22
|
+
}
|
|
23
|
+
window.__debugLiveStore = store.store;
|
|
24
|
+
return React.createElement(LiveStoreContext.Provider, { value: store }, children);
|
|
25
|
+
};
|
|
26
|
+
const useCreateStore = ({ schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, boot, }) => {
|
|
27
|
+
const [ctxValue, setCtxValue] = React.useState();
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
void (async () => {
|
|
30
|
+
try {
|
|
31
|
+
const sqlite3 = await sqlite3Promise;
|
|
32
|
+
const store = await createStore({
|
|
33
|
+
schema,
|
|
34
|
+
loadStorage,
|
|
35
|
+
graphQLOptions,
|
|
36
|
+
otelTracer,
|
|
37
|
+
otelRootSpanContext,
|
|
38
|
+
boot,
|
|
39
|
+
sqlite3,
|
|
40
|
+
});
|
|
41
|
+
setCtxValue({ store });
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
console.error(`Error creating LiveStore store:`, e);
|
|
45
|
+
throw e;
|
|
46
|
+
}
|
|
47
|
+
})();
|
|
48
|
+
// TODO: do we need to return any cleanup function here?
|
|
49
|
+
}, [schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, boot]);
|
|
50
|
+
return ctxValue;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=LiveStoreProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveStoreProvider.js","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,eAAe,MAAM,YAAY,CAAA;AAQxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,wGAAwG;AACxG,qCAAqC;AACrC,MAAM,cAAc,GAAG,eAAe,CAAC;IACrC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC;IAChE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC;CACtE,CAAC,CAAA;AAYF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA4C,EAC3E,QAAQ,EACR,WAAW,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,IAAI,GAC8D,EAAe,EAAE;IACnF,MAAM,KAAK,GAAG,cAAc,CAAC;QAC3B,MAAM;QACN,WAAW;QACX,cAAc;QACd,UAAU;QACV,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAA;IAEF,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,OAAO,QAAQ,CAAA;KAChB;IAED,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAA;IAErC,OAAO,oBAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,CAA6B,CAAA;AACxF,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAA4C,EACjE,MAAM,EACN,WAAW,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,IAAI,GACwC,EAAE,EAAE;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAA;IAE3E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI;gBACF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAA;gBACpC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;oBAC9B,MAAM;oBACN,WAAW;oBACX,cAAc;oBACd,UAAU;oBACV,mBAAmB;oBACnB,IAAI;oBACJ,OAAO;iBACR,CAAC,CAAA;gBACF,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;aACvB;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;gBACnD,MAAM,CAAC,CAAA;aACR;QACH,CAAC,CAAC,EAAE,CAAA;QAEJ,wDAAwD;IAC1D,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAA;IAEhF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { UseLiveStoreComponentProps as LiveStoreComponentConfig, ReactiveGraphQL, ReactiveSQL, Setters, ComponentKeyConfig, QueryResults, QueryDefinitions, ComponentColumns, GetStateType, GetStateTypeEncoded, } from './useLiveStoreComponent.js';
|
|
2
|
+
export { LiveStoreContext, useStore } from './LiveStoreContext.js';
|
|
3
|
+
export { LiveStoreProvider } from './LiveStoreProvider.js';
|
|
4
|
+
export { useLiveStoreComponent } from './useLiveStoreComponent.js';
|
|
5
|
+
export { useGraphQL } from './useGraphQL.js';
|
|
6
|
+
export { useQuery } from './useQuery.js';
|
|
7
|
+
export type { TypedDocumentNode } from '@graphql-typed-document-node/core';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,0BAA0B,IAAI,wBAAwB,EACtD,eAAe,EACf,WAAW,EACX,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { LiveStoreContext, useStore } from './LiveStoreContext.js';
|
|
2
|
+
export { LiveStoreProvider } from './LiveStoreProvider.js';
|
|
3
|
+
export { useLiveStoreComponent } from './useLiveStoreComponent.js';
|
|
4
|
+
export { useGraphQL } from './useGraphQL.js';
|
|
5
|
+
export { useQuery } from './useQuery.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { type ComponentKeyConfig } from './useLiveStoreComponent.js';
|
|
4
|
+
export type UseLiveStoreComponentProps<TResult extends Record<string, any>, TVariables extends Record<string, any>> = {
|
|
5
|
+
query: DocumentNode<TResult, TVariables>;
|
|
6
|
+
variables: TVariables;
|
|
7
|
+
componentKey: ComponentKeyConfig;
|
|
8
|
+
reactDeps?: React.DependencyList;
|
|
9
|
+
};
|
|
10
|
+
type Variables = Record<string, any>;
|
|
11
|
+
export declare const useGraphQL: <TResult extends Record<string, any>, TVariables extends Variables = {}>({ query, variables, componentKey: componentKeyConfig, reactDeps, }: UseLiveStoreComponentProps<TResult, TVariables>) => Readonly<TResult>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=useGraphQL.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGraphQL.d.ts","sourceRoot":"","sources":["../../src/react/useGraphQL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAG1F,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,EAAE,KAAK,kBAAkB,EAAmB,MAAM,4BAA4B,CAAA;AAGrF,MAAM,MAAM,0BAA0B,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IACpH,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACxC,SAAS,EAAE,UAAU,CAAA;IACrB,YAAY,EAAE,kBAAkB,CAAA;IAChC,SAAS,CAAC,EAAE,KAAK,CAAC,cAAc,CAAA;CACjC,CAAA;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAepC,eAAO,MAAM,UAAU,oNAyGtB,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as otel from '@opentelemetry/api';
|
|
2
|
+
import { isEqual } from 'lodash-es';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { labelForKey } from '../componentKey.js';
|
|
5
|
+
import { useStore } from './LiveStoreContext.js';
|
|
6
|
+
import { useComponentKey } from './useLiveStoreComponent.js';
|
|
7
|
+
import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js';
|
|
8
|
+
// TODO get rid of the query cache in favour of the new side-effect-free query definition approach https://www.notion.so/schickling/New-query-definition-approach-1097a78ef0e9495bac25f90417374756?pvs=4
|
|
9
|
+
// NOTE we're using a nested map here since we need to resolve 2 levels of object identities (query + variables)
|
|
10
|
+
// const queryCache = new Map<DocumentNode<any, any>, Map<Variables, LiveStoreGraphQLQuery<any, any, any>>>()
|
|
11
|
+
/**
|
|
12
|
+
* This is needed because the `React.useMemo` call below, can sometimes be called multiple times 🤷,
|
|
13
|
+
* so we need to "cache" the fact that we've already started a span for this component.
|
|
14
|
+
* The map entry is being removed again in the `React.useEffect` call below.
|
|
15
|
+
*/
|
|
16
|
+
const spanAlreadyStartedCache = new Map();
|
|
17
|
+
// TODO 1) figure out a way to make `variables` optional if the query doesn't have any variables (probably requires positional args)
|
|
18
|
+
// TODO 2) allow `.pipe` on the resulting query (possibly as a separate optional prop)
|
|
19
|
+
export const useGraphQL = ({ query, variables, componentKey: componentKeyConfig, reactDeps = [], }) => {
|
|
20
|
+
const componentKey = useComponentKey(componentKeyConfig, reactDeps);
|
|
21
|
+
const { store } = useStore();
|
|
22
|
+
const componentKeyLabel = React.useMemo(() => labelForKey(componentKey), [componentKey]);
|
|
23
|
+
// The following `React.useMemo` and `React.useEffect` calls are used to start and end a span for the lifetime of this component.
|
|
24
|
+
const { span, otelContext } = React.useMemo(() => {
|
|
25
|
+
const existingSpan = spanAlreadyStartedCache.get(componentKeyLabel);
|
|
26
|
+
if (existingSpan !== undefined)
|
|
27
|
+
return existingSpan;
|
|
28
|
+
const span = store.otel.tracer.startSpan(`LiveStore:useGraphQL:${componentKeyLabel}`, {}, store.otel.queriesSpanContext);
|
|
29
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
30
|
+
spanAlreadyStartedCache.set(componentKeyLabel, { span, otelContext });
|
|
31
|
+
return { span, otelContext };
|
|
32
|
+
}, [componentKeyLabel, store.otel.queriesSpanContext, store.otel.tracer]);
|
|
33
|
+
React.useEffect(() => () => {
|
|
34
|
+
spanAlreadyStartedCache.delete(componentKeyLabel);
|
|
35
|
+
span.end();
|
|
36
|
+
}, [componentKeyLabel, span]);
|
|
37
|
+
const makeLiveStoreQuery = React.useCallback(() => {
|
|
38
|
+
return store.queryGraphQL(query, () => variables ?? {}, { componentKey, otelContext });
|
|
39
|
+
// NOTE I had to disable the caching below as still led to many problems
|
|
40
|
+
// We should just implement the new query definition approach instead
|
|
41
|
+
// const queryCacheForQuery = queryCache.get(query)
|
|
42
|
+
// if (queryCacheForQuery && queryCacheForQuery.has(variables)) {
|
|
43
|
+
// return queryCacheForQuery.get(variables)!
|
|
44
|
+
// }
|
|
45
|
+
// const newQuery = store.queryGraphQL(query, () => variables ?? ({} as TVariables), { componentKey, otelContext })
|
|
46
|
+
// if (queryCacheForQuery) {
|
|
47
|
+
// queryCacheForQuery.set(variables, newQuery)
|
|
48
|
+
// } else {
|
|
49
|
+
// queryCache.set(query, new Map([[variables, newQuery]]))
|
|
50
|
+
// }
|
|
51
|
+
// return newQuery
|
|
52
|
+
},
|
|
53
|
+
// NOTE: we don't include the queries function passed in by the user here;
|
|
54
|
+
// the reason is that we don't want to force them to memoize that function.
|
|
55
|
+
// Instead, we just assume that the function always has the same contents.
|
|
56
|
+
// This makes sense for LiveStore because the component config should be static.
|
|
57
|
+
// TODO: document this and consider whether it's the right API surface.
|
|
58
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
59
|
+
[componentKey, store]);
|
|
60
|
+
// TODO get rid of the temporary query workaround
|
|
61
|
+
const initialQueryResults = React.useMemo(() => store.inTempQueryContext(() => makeLiveStoreQuery().results$.result), [makeLiveStoreQuery, store]);
|
|
62
|
+
const [queryResultsRef, setQueryResults_] = useStateRefWithReactiveInput(initialQueryResults);
|
|
63
|
+
React.useEffect(() => {
|
|
64
|
+
const liveStoreQuery = makeLiveStoreQuery();
|
|
65
|
+
const unsubscribe = store.subscribe(liveStoreQuery, (results) => {
|
|
66
|
+
if (isEqual(results, queryResultsRef.current) === false) {
|
|
67
|
+
setQueryResults_(results);
|
|
68
|
+
}
|
|
69
|
+
}, undefined, { label: `useGraphQL:query:subscribe:${liveStoreQuery.label}` });
|
|
70
|
+
return () => {
|
|
71
|
+
unsubscribe();
|
|
72
|
+
};
|
|
73
|
+
// NOTE `setQueryResults_` from the deps array as it seems to cause an infinite loop
|
|
74
|
+
// This should probably be improved
|
|
75
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
76
|
+
}, [
|
|
77
|
+
makeLiveStoreQuery,
|
|
78
|
+
// setQueryResults_,
|
|
79
|
+
store,
|
|
80
|
+
]);
|
|
81
|
+
// Very important: remove any queries / other resources associated w/ this component
|
|
82
|
+
React.useEffect(() => () => store.unmountComponent(componentKey), [store, componentKey]);
|
|
83
|
+
return queryResultsRef.current;
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=useGraphQL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGraphQL.js","sourceRoot":"","sources":["../../src/react/useGraphQL.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
|
|
2
|
+
import type { LiteralUnion, PrettifyFlat } from '@livestore/utils';
|
|
3
|
+
import { SqliteDsl } from 'effect-db-schema';
|
|
4
|
+
import type { DependencyList } from 'react';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import type { ComponentKey } from '../componentKey.js';
|
|
7
|
+
import type { LiveStoreGraphQLQuery } from '../reactiveQueries/graphql.js';
|
|
8
|
+
import type { LiveStoreJSQuery } from '../reactiveQueries/js.js';
|
|
9
|
+
import type { LiveStoreSQLQuery } from '../reactiveQueries/sql.js';
|
|
10
|
+
import type { BaseGraphQLContext, GetAtomResult, LiveStoreQuery, QueryResult } from '../store.js';
|
|
11
|
+
import type { Bindable } from '../util.js';
|
|
12
|
+
export interface QueryDefinitions {
|
|
13
|
+
[queryName: string]: LiveStoreQuery;
|
|
14
|
+
}
|
|
15
|
+
export type QueryResults<TQuery> = {
|
|
16
|
+
[queryName in keyof TQuery]: PrettifyFlat<QueryResult<TQuery[queryName]>>;
|
|
17
|
+
};
|
|
18
|
+
export type ReactiveSQL = <TResult>(query: string | ((get: GetAtomResult) => string), queriedTables: string[], bindValues?: Bindable | undefined) => LiveStoreSQLQuery<TResult>;
|
|
19
|
+
export type ReactiveJS = <TResult>(query: (get: GetAtomResult) => TResult) => LiveStoreJSQuery<TResult>;
|
|
20
|
+
export type ReactiveGraphQL = <TResult extends Record<string, any>, TVariables extends Record<string, any>, TContext extends BaseGraphQLContext>(query: DocumentNode<TResult, TVariables>, variableValues: TVariables | ((get: GetAtomResult) => TVariables), label?: string) => LiveStoreGraphQLQuery<TResult, TVariables, TContext>;
|
|
21
|
+
type RegisterSubscription = <TQuery extends LiveStoreQuery>(query: TQuery, onNewValue: (value: QueryResult<TQuery>) => void, onUnsubscribe?: () => void) => void;
|
|
22
|
+
type GenQueries<TQueries, TStateResult> = (args: {
|
|
23
|
+
rxSQL: ReactiveSQL;
|
|
24
|
+
rxGraphQL: ReactiveGraphQL;
|
|
25
|
+
rxJS: ReactiveJS;
|
|
26
|
+
state$: LiveStoreJSQuery<TStateResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Registers a subscription.
|
|
29
|
+
*
|
|
30
|
+
* Passed down for some manual subscribing. Use carefully.
|
|
31
|
+
*/
|
|
32
|
+
subscribe: RegisterSubscription;
|
|
33
|
+
isTemporaryQuery: boolean;
|
|
34
|
+
}) => TQueries;
|
|
35
|
+
export type UseLiveStoreComponentProps<TQueries, TStateColumns extends ComponentColumns> = {
|
|
36
|
+
stateSchema?: SqliteDsl.TableDefinition<string, TStateColumns>;
|
|
37
|
+
queries?: GenQueries<TQueries, SqliteDsl.FromColumns.RowDecoded<TStateColumns>>;
|
|
38
|
+
reactDeps?: React.DependencyList;
|
|
39
|
+
componentKey: ComponentKeyConfig;
|
|
40
|
+
};
|
|
41
|
+
export type ComponentKeyConfig = {
|
|
42
|
+
/**
|
|
43
|
+
* Name of the Component
|
|
44
|
+
*
|
|
45
|
+
* TODO we should eventually derive this info automatically from the component (TBD how though...)
|
|
46
|
+
*/
|
|
47
|
+
name: string;
|
|
48
|
+
id: LiteralUnion<'singleton' | '__ephemeral__', string>;
|
|
49
|
+
};
|
|
50
|
+
export interface ComponentColumns extends SqliteDsl.Columns {
|
|
51
|
+
id: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
|
|
52
|
+
}
|
|
53
|
+
type UseLiveStoreJsonState<TState> = <TResult>(jsonStringKey: keyof TState, parse?: (_: unknown) => TResult) => [value: TResult, setValue: (newVal: TResult | ((prevVal: TResult) => TResult)) => void];
|
|
54
|
+
export type GetStateType<TTableDef extends SqliteDsl.TableDefinition<any, any>> = SqliteDsl.FromColumns.RowDecoded<TTableDef['columns']>;
|
|
55
|
+
export type GetStateTypeEncoded<TTableDef extends SqliteDsl.TableDefinition<any, any>> = SqliteDsl.FromColumns.RowEncoded<TTableDef['columns']>;
|
|
56
|
+
/**
|
|
57
|
+
* Create reactive queries within a component.
|
|
58
|
+
* @param config.queries A function that returns a map of named reactive queries.
|
|
59
|
+
* @param config.componentKey A function that returns a unique key for this component.
|
|
60
|
+
* @param config.reactDeps A list of React-level dependencies that will refresh the queries.
|
|
61
|
+
*/
|
|
62
|
+
export declare const useLiveStoreComponent: <TStateColumns extends ComponentColumns, TQueries extends QueryDefinitions>({ stateSchema: stateSchema_, queries, componentKey: componentKeyConfig, reactDeps, }: UseLiveStoreComponentProps<TQueries, TStateColumns>) => {
|
|
63
|
+
queryResults: QueryResults<TQueries>;
|
|
64
|
+
state: import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>;
|
|
65
|
+
setState: Setters<import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>>;
|
|
66
|
+
useLiveStoreJsonState: UseLiveStoreJsonState<import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>>;
|
|
67
|
+
};
|
|
68
|
+
export type Setters<TComponentState> = {
|
|
69
|
+
[k in keyof TComponentState]: (newValue: TComponentState[k]) => void;
|
|
70
|
+
} & {
|
|
71
|
+
setMany: (newValues: Partial<TComponentState>) => void;
|
|
72
|
+
};
|
|
73
|
+
export declare const useComponentKey: ({ name, id }: ComponentKeyConfig, deps?: DependencyList) => ComponentKey;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=useLiveStoreComponent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLiveStoreComponent.d.ts","sourceRoot":"","sources":["../../src/react/useLiveStoreComponent.ts"],"names":[],"mappings":"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"}
|