@livestore/solid 0.4.0-dev.22 → 0.4.0-dev.23
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/dist/.tsbuildinfo +1 -1
- package/dist/StoreRegistryContext.d.ts +56 -0
- package/dist/StoreRegistryContext.d.ts.map +1 -0
- package/dist/StoreRegistryContext.jsx +60 -0
- package/dist/StoreRegistryContext.jsx.map +1 -0
- package/dist/__tests__/fixture.d.ts +14 -0
- package/dist/__tests__/fixture.d.ts.map +1 -0
- package/dist/__tests__/fixture.jsx +13 -0
- package/dist/__tests__/fixture.jsx.map +1 -0
- package/dist/experimental/components/LiveList.d.ts +24 -0
- package/dist/experimental/components/LiveList.d.ts.map +1 -0
- package/dist/experimental/components/LiveList.jsx +24 -0
- package/dist/experimental/components/LiveList.jsx.map +1 -0
- package/dist/experimental/mod.d.ts +2 -0
- package/dist/experimental/mod.d.ts.map +1 -0
- package/dist/experimental/mod.js +2 -0
- package/dist/experimental/mod.js.map +1 -0
- package/dist/mod.d.ts +6 -2
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +4 -2
- package/dist/mod.js.map +1 -1
- package/dist/useClientDocument.client.test.d.ts +2 -0
- package/dist/useClientDocument.client.test.d.ts.map +1 -0
- package/dist/useClientDocument.client.test.jsx +177 -0
- package/dist/useClientDocument.client.test.jsx.map +1 -0
- package/dist/useClientDocument.d.ts +71 -0
- package/dist/useClientDocument.d.ts.map +1 -0
- package/dist/useClientDocument.js +74 -0
- package/dist/useClientDocument.js.map +1 -0
- package/dist/useClientDocument.server.test.d.ts +6 -0
- package/dist/useClientDocument.server.test.d.ts.map +1 -0
- package/dist/useClientDocument.server.test.jsx +76 -0
- package/dist/useClientDocument.server.test.jsx.map +1 -0
- package/dist/useQuery.client.test.d.ts +2 -0
- package/dist/useQuery.client.test.d.ts.map +1 -0
- package/dist/useQuery.client.test.jsx +165 -0
- package/dist/useQuery.client.test.jsx.map +1 -0
- package/dist/useQuery.d.ts +32 -0
- package/dist/useQuery.d.ts.map +1 -0
- package/dist/useQuery.js +64 -0
- package/dist/useQuery.js.map +1 -0
- package/dist/useQuery.server.test.d.ts +6 -0
- package/dist/useQuery.server.test.d.ts.map +1 -0
- package/dist/useQuery.server.test.jsx +88 -0
- package/dist/useQuery.server.test.jsx.map +1 -0
- package/dist/useStore.client.test.d.ts +2 -0
- package/dist/useStore.client.test.d.ts.map +1 -0
- package/dist/useStore.client.test.jsx +438 -0
- package/dist/useStore.client.test.jsx.map +1 -0
- package/dist/useStore.d.ts +91 -0
- package/dist/useStore.d.ts.map +1 -0
- package/dist/useStore.js +94 -0
- package/dist/useStore.js.map +1 -0
- package/dist/useStore.server.test.d.ts +6 -0
- package/dist/useStore.server.test.d.ts.map +1 -0
- package/dist/useStore.server.test.jsx +56 -0
- package/dist/useStore.server.test.jsx.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/dist/whenever.d.ts +32 -0
- package/dist/whenever.d.ts.map +1 -0
- package/dist/whenever.js +51 -0
- package/dist/whenever.js.map +1 -0
- package/package.json +64 -16
- package/src/StoreRegistryContext.tsx +70 -0
- package/src/__snapshots__/useClientDocument.client.test.tsx.snap +570 -0
- package/src/__snapshots__/useQuery.client.test.tsx.snap +1550 -0
- package/src/__tests__/fixture.tsx +42 -0
- package/src/experimental/components/LiveList.tsx +54 -0
- package/src/experimental/mod.ts +1 -0
- package/src/mod.ts +6 -2
- package/src/useClientDocument.client.test.tsx +299 -0
- package/src/useClientDocument.server.test.tsx +107 -0
- package/src/useClientDocument.ts +146 -0
- package/src/useQuery.client.test.tsx +293 -0
- package/src/useQuery.server.test.tsx +128 -0
- package/src/useQuery.ts +115 -0
- package/src/useStore.client.test.tsx +632 -0
- package/src/useStore.server.test.tsx +70 -0
- package/src/useStore.ts +179 -0
- package/src/utils.ts +10 -0
- package/src/whenever.ts +80 -0
- package/dist/query.d.ts +0 -4
- package/dist/query.d.ts.map +0 -1
- package/dist/query.js +0 -15
- package/dist/query.js.map +0 -1
- package/dist/store.d.ts +0 -6
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -99
- package/dist/store.js.map +0 -1
- package/src/query.ts +0 -22
- package/src/store.ts +0 -196
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as Solid from 'solid-js';
|
|
2
|
+
import type { StoreRegistry } from '@livestore/livestore';
|
|
3
|
+
export declare const StoreRegistryContext: Solid.Context<StoreRegistry | undefined>;
|
|
4
|
+
export type StoreRegistryProviderProps = {
|
|
5
|
+
storeRegistry: StoreRegistry;
|
|
6
|
+
children: Solid.JSX.Element;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Solid context provider that makes a {@link StoreRegistry} available to descendant components.
|
|
10
|
+
*
|
|
11
|
+
* Wrap your application (or a subtree) with this provider to enable {@link useStore} and
|
|
12
|
+
* {@link useStoreRegistry} hooks within that tree.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { StoreRegistry } from '@livestore/livestore'
|
|
17
|
+
* import { StoreRegistryProvider } from '@livestore/solid'
|
|
18
|
+
* import { batch } from 'solid-js'
|
|
19
|
+
*
|
|
20
|
+
* const storeRegistry = new StoreRegistry({
|
|
21
|
+
* defaultOptions: { batchUpdates: batch }
|
|
22
|
+
* })
|
|
23
|
+
*
|
|
24
|
+
* function App() {
|
|
25
|
+
* return (
|
|
26
|
+
* <StoreRegistryProvider storeRegistry={storeRegistry}>
|
|
27
|
+
* <MyComponent />
|
|
28
|
+
* </StoreRegistryProvider>
|
|
29
|
+
* )
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare const StoreRegistryProvider: (props: StoreRegistryProviderProps) => Solid.JSX.Element;
|
|
34
|
+
/**
|
|
35
|
+
* Hook to access the {@link StoreRegistry} from context. Useful for advanced operations like preloading.
|
|
36
|
+
*
|
|
37
|
+
* @param override - Optional registry to use instead of the context value.
|
|
38
|
+
* When provided, skips context lookup entirely.
|
|
39
|
+
* @returns The registry provided by the nearest {@link StoreRegistryProvider} ancestor, or the `override` if provided.
|
|
40
|
+
* @throws Error if called outside a {@link StoreRegistryProvider} and no override is provided
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```tsx
|
|
44
|
+
* function PreloadButton(props: { issueId: string }) {
|
|
45
|
+
* const storeRegistry = useStoreRegistry()
|
|
46
|
+
*
|
|
47
|
+
* const handleMouseEnter = () => {
|
|
48
|
+
* storeRegistry.preload(issueStoreOptions(props.issueId))
|
|
49
|
+
* }
|
|
50
|
+
*
|
|
51
|
+
* return <button onMouseEnter={handleMouseEnter}>View Issue</button>
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare const useStoreRegistry: (override?: StoreRegistry) => StoreRegistry;
|
|
56
|
+
//# sourceMappingURL=StoreRegistryContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreRegistryContext.d.ts","sourceRoot":"","sources":["../src/StoreRegistryContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,eAAO,MAAM,oBAAoB,0CAA4D,CAAA;AAE7F,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,0BAA0B,KAAG,KAAK,CAAC,GAAG,CAAC,OAEnF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,aAAa,KAAG,aAQ3D,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as Solid from 'solid-js';
|
|
2
|
+
export const StoreRegistryContext = Solid.createContext(undefined);
|
|
3
|
+
/**
|
|
4
|
+
* Solid context provider that makes a {@link StoreRegistry} available to descendant components.
|
|
5
|
+
*
|
|
6
|
+
* Wrap your application (or a subtree) with this provider to enable {@link useStore} and
|
|
7
|
+
* {@link useStoreRegistry} hooks within that tree.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { StoreRegistry } from '@livestore/livestore'
|
|
12
|
+
* import { StoreRegistryProvider } from '@livestore/solid'
|
|
13
|
+
* import { batch } from 'solid-js'
|
|
14
|
+
*
|
|
15
|
+
* const storeRegistry = new StoreRegistry({
|
|
16
|
+
* defaultOptions: { batchUpdates: batch }
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* function App() {
|
|
20
|
+
* return (
|
|
21
|
+
* <StoreRegistryProvider storeRegistry={storeRegistry}>
|
|
22
|
+
* <MyComponent />
|
|
23
|
+
* </StoreRegistryProvider>
|
|
24
|
+
* )
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export const StoreRegistryProvider = (props) => {
|
|
29
|
+
return <StoreRegistryContext.Provider value={props.storeRegistry}>{props.children}</StoreRegistryContext.Provider>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Hook to access the {@link StoreRegistry} from context. Useful for advanced operations like preloading.
|
|
33
|
+
*
|
|
34
|
+
* @param override - Optional registry to use instead of the context value.
|
|
35
|
+
* When provided, skips context lookup entirely.
|
|
36
|
+
* @returns The registry provided by the nearest {@link StoreRegistryProvider} ancestor, or the `override` if provided.
|
|
37
|
+
* @throws Error if called outside a {@link StoreRegistryProvider} and no override is provided
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* function PreloadButton(props: { issueId: string }) {
|
|
42
|
+
* const storeRegistry = useStoreRegistry()
|
|
43
|
+
*
|
|
44
|
+
* const handleMouseEnter = () => {
|
|
45
|
+
* storeRegistry.preload(issueStoreOptions(props.issueId))
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* return <button onMouseEnter={handleMouseEnter}>View Issue</button>
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export const useStoreRegistry = (override) => {
|
|
53
|
+
if (override !== undefined)
|
|
54
|
+
return override;
|
|
55
|
+
const storeRegistry = Solid.useContext(StoreRegistryContext);
|
|
56
|
+
if (storeRegistry == null)
|
|
57
|
+
throw new Error('useStoreRegistry() must be used within <StoreRegistryProvider>');
|
|
58
|
+
return storeRegistry;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=StoreRegistryContext.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoreRegistryContext.jsx","sourceRoot":"","sources":["../src/StoreRegistryContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAIjC,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAA4B,SAAS,CAAC,CAAA;AAO7F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAiC,EAAqB,EAAE;IAC5F,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAA;AACpH,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAwB,EAAiB,EAAE;IAC1E,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAE3C,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAA;IAE5D,IAAI,aAAa,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IAE5G,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as Solid from 'solid-js';
|
|
2
|
+
import type { UnknownError } from '@livestore/common';
|
|
3
|
+
import { type AppState, type CreateTodoMvcStoreOptions, events, type Filter, schema, type Todo, tables } from '@livestore/framework-toolkit/testing';
|
|
4
|
+
import type { Store } from '@livestore/livestore';
|
|
5
|
+
import { StoreInternalsSymbol } from '@livestore/livestore';
|
|
6
|
+
import { Effect, type Scope } from '@livestore/utils/effect';
|
|
7
|
+
import * as LiveStoreSolid from '../mod.ts';
|
|
8
|
+
export { events, schema, StoreInternalsSymbol, tables };
|
|
9
|
+
export type { AppState, Filter, Todo };
|
|
10
|
+
export declare const makeTodoMvcSolid: (opts?: CreateTodoMvcStoreOptions) => Effect.Effect<{
|
|
11
|
+
wrapper: ({ children }: any) => Solid.JSX.Element;
|
|
12
|
+
store: Store<typeof schema> & LiveStoreSolid.SolidApi;
|
|
13
|
+
}, UnknownError, Scope.Scope>;
|
|
14
|
+
//# sourceMappingURL=fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAA;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,yBAAyB,EAE9B,MAAM,EACN,KAAK,MAAM,EACX,MAAM,EACN,KAAK,IAAI,EACT,MAAM,EACP,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,cAAc,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAA;AACvD,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAEtC,eAAO,MAAM,gBAAgB,GAC3B,OAAM,yBAA8B,KACnC,MAAM,CAAC,MAAM,CACd;IACE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAA;IACjD,KAAK,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAA;CACtD,EACD,YAAY,EACZ,KAAK,CAAC,KAAK,CAUT,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createTodoMvcStore, events, schema, tables, } from '@livestore/framework-toolkit/testing';
|
|
2
|
+
import { StoreInternalsSymbol } from '@livestore/livestore';
|
|
3
|
+
import { Effect } from '@livestore/utils/effect';
|
|
4
|
+
import * as LiveStoreSolid from "../mod.js";
|
|
5
|
+
// Re-export shared types, schema, and StoreInternalsSymbol for tests
|
|
6
|
+
export { events, schema, StoreInternalsSymbol, tables };
|
|
7
|
+
export const makeTodoMvcSolid = (opts = {}) => Effect.gen(function* () {
|
|
8
|
+
const store = yield* createTodoMvcStore(opts);
|
|
9
|
+
const storeWithSolidApi = LiveStoreSolid.withSolidApi(store);
|
|
10
|
+
const wrapper = (props) => <>{props.children}</>;
|
|
11
|
+
return { wrapper, store: storeWithSolidApi };
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=fixture.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture.jsx","sourceRoot":"","sources":["../../src/__tests__/fixture.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,kBAAkB,EAClB,MAAM,EAEN,MAAM,EAEN,MAAM,GACP,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAc,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,cAAc,MAAM,WAAW,CAAA;AAE3C,qEAAqE;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAA;AAGvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAkC,EAAE,EAQpC,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAE7C,MAAM,iBAAiB,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAE5D,MAAM,OAAO,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAA;IAEnE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;AAC9C,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Accessor, JSX } from 'solid-js';
|
|
2
|
+
import type { LiveQueryDef, Store } from '@livestore/livestore';
|
|
3
|
+
export type LiveListProps<TItem> = {
|
|
4
|
+
items$: LiveQueryDef<ReadonlyArray<TItem>>;
|
|
5
|
+
renderItem: (item: Accessor<TItem>, index: Accessor<number>) => JSX.Element;
|
|
6
|
+
/** Needs to be unique across all list items */
|
|
7
|
+
getKey: (item: TItem, index: number) => string | number;
|
|
8
|
+
/** The store instance to use for queries */
|
|
9
|
+
store: Store<any, any>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
|
|
13
|
+
* The idea is that instead of letting Solid handle the rendering of the items array directly,
|
|
14
|
+
* we derive a item LiveQuery for each item which moves the reactivity to the item level when a single item changes.
|
|
15
|
+
*
|
|
16
|
+
* In the future we want to make this component even more efficient by using incremental rendering (https://github.com/livestorejs/livestore/pull/55)
|
|
17
|
+
* e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
|
|
18
|
+
*/
|
|
19
|
+
export declare const LiveList: <TItem>(props: LiveListProps<TItem>) => JSX.Element;
|
|
20
|
+
export declare const ItemWrapper: <TItem>(props: {
|
|
21
|
+
key: string | number;
|
|
22
|
+
index: Accessor<number>;
|
|
23
|
+
} & LiveListProps<TItem>) => JSX.Element;
|
|
24
|
+
//# sourceMappingURL=LiveList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveList.d.ts","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG7C,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAW/D,MAAM,MAAM,aAAa,CAAC,KAAK,IAAI;IACjC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAE1C,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,CAAA;IAC3E,+CAA+C;IAC/C,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAA;IACvD,4CAA4C;IAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CACvB,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,EAAG,OAAO,aAAa,CAAC,KAAK,CAAC,KAAG,GAAG,CAAC,OAOlE,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,KAAK,EAC/B,OAAO;IAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,aAAa,CAAC,KAAK,CAAC,gBAWhF,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as Solid from 'solid-js';
|
|
2
|
+
import { computed } from '@livestore/livestore';
|
|
3
|
+
import { useQuery } from "../../useQuery.js";
|
|
4
|
+
/**
|
|
5
|
+
* This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
|
|
6
|
+
* The idea is that instead of letting Solid handle the rendering of the items array directly,
|
|
7
|
+
* we derive a item LiveQuery for each item which moves the reactivity to the item level when a single item changes.
|
|
8
|
+
*
|
|
9
|
+
* In the future we want to make this component even more efficient by using incremental rendering (https://github.com/livestorejs/livestore/pull/55)
|
|
10
|
+
* e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
|
|
11
|
+
*/
|
|
12
|
+
export const LiveList = (props) => {
|
|
13
|
+
const [config] = Solid.splitProps(props, ['store']);
|
|
14
|
+
const keys = useQuery(() => computed((get) => get(props.items$).map((item, index) => props.getKey(item, index))), config);
|
|
15
|
+
return <Solid.For each={keys()}>{(key, index) => <ItemWrapper {...props} key={key} index={index}/>}</Solid.For>;
|
|
16
|
+
};
|
|
17
|
+
export const ItemWrapper = (props) => {
|
|
18
|
+
const [config] = Solid.splitProps(props, ['store']);
|
|
19
|
+
const item = useQuery(() => computed((get) => get(props.items$).find((item, index) => props.getKey(item, index) === props.key), {
|
|
20
|
+
deps: [props.key],
|
|
21
|
+
}), config);
|
|
22
|
+
return <>{props.renderItem(item, props.index)}</>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=LiveList.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveList.jsx","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAGjC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAkB5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAS,KAA2B,EAAe,EAAE;IAC3E,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,QAAQ,CACnB,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAC1F,MAAM,CACP,CAAA;IACD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;AAClH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAA+E,EAC/E,EAAE;IACF,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,QAAQ,CACnB,GAAG,EAAE,CACH,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAE,EAAE;QACnG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;KAClB,CAAC,EACJ,MAAM,CACP,CAAA;IACD,OAAO,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAA;AACnD,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/experimental/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/experimental/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,2BAA2B,CAAA"}
|
package/dist/mod.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export type { Dispatch, SetStateAction, SetStateActionPartial, StateSetters } from '@livestore/framework-toolkit';
|
|
2
|
+
export { StoreRegistry, storeOptions } from '@livestore/livestore';
|
|
3
|
+
export { LiveList, type LiveListProps } from './experimental/components/LiveList.tsx';
|
|
4
|
+
export * from './StoreRegistryContext.tsx';
|
|
5
|
+
export type { UseClientDocumentResult } from './useClientDocument.ts';
|
|
6
|
+
export { type SolidApi, useStore, withSolidApi } from './useStore.ts';
|
|
3
7
|
//# sourceMappingURL=mod.d.ts.map
|
package/dist/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACjH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,wCAAwC,CAAA;AACrF,cAAc,4BAA4B,CAAA;AAC1C,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,KAAK,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/mod.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { StoreRegistry, storeOptions } from '@livestore/livestore';
|
|
2
|
+
export { LiveList } from "./experimental/components/LiveList.jsx";
|
|
3
|
+
export * from "./StoreRegistryContext.jsx";
|
|
4
|
+
export { useStore, withSolidApi } from "./useStore.js";
|
|
3
5
|
//# sourceMappingURL=mod.js.map
|
package/dist/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAsB,MAAM,wCAAwC,CAAA;AACrF,cAAc,4BAA4B,CAAA;AAE1C,OAAO,EAAiB,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClientDocument.client.test.d.ts","sourceRoot":"","sources":["../src/useClientDocument.client.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/** biome-ignore-all lint/a11y/useValidAriaRole: not needed for testing */
|
|
2
|
+
/** biome-ignore-all lint/a11y/noStaticElementInteractions: not needed for testing */
|
|
3
|
+
import * as LiveStore from '@livestore/livestore';
|
|
4
|
+
import { getAllSimplifiedRootSpans, getSimplifiedRootSpan } from '@livestore/livestore/internal/testing-utils';
|
|
5
|
+
import { Effect, ReadonlyRecord, Schema } from '@livestore/utils/effect';
|
|
6
|
+
import { Vitest } from '@livestore/utils-dev/node-vitest';
|
|
7
|
+
import * as otel from '@opentelemetry/api';
|
|
8
|
+
import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
9
|
+
import * as SolidTesting from '@solidjs/testing-library';
|
|
10
|
+
import * as Solid from 'solid-js';
|
|
11
|
+
import { events, makeTodoMvcSolid, StoreInternalsSymbol, tables } from "./__tests__/fixture.jsx";
|
|
12
|
+
// const strictMode = process.env.REACT_STRICT_MODE !== undefined
|
|
13
|
+
// NOTE running tests concurrently doesn't work with the default global db graph
|
|
14
|
+
Vitest.describe('useClientDocument', () => {
|
|
15
|
+
Vitest.scopedLive('should update the data based on component key', () => Effect.gen(function* () {
|
|
16
|
+
const { wrapper, store } = yield* makeTodoMvcSolid({});
|
|
17
|
+
const [userId, setUserId] = Solid.createSignal('u1');
|
|
18
|
+
const { result } = SolidTesting.renderHook(() => {
|
|
19
|
+
const [state, setState, id] = store.useClientDocument(tables.userInfo, userId);
|
|
20
|
+
return { state, setState, id };
|
|
21
|
+
}, { wrapper });
|
|
22
|
+
Vitest.expect(result.id()).toBe('u1');
|
|
23
|
+
Vitest.expect(result.state().username).toBe('');
|
|
24
|
+
Vitest.expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
|
|
25
|
+
store.commit(tables.userInfo.set({ username: 'username_u2' }, 'u2'));
|
|
26
|
+
setUserId('u2');
|
|
27
|
+
Vitest.expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
|
|
28
|
+
Vitest.expect(result.id()).toBe('u2');
|
|
29
|
+
Vitest.expect(result.state().username).toBe('username_u2');
|
|
30
|
+
}));
|
|
31
|
+
// TODO add a test that makes sure Solid doesn't re-render when a setter is used to set the same value
|
|
32
|
+
Vitest.scopedLive('should update the data reactively - via setState', () => Effect.gen(function* () {
|
|
33
|
+
const { wrapper, store } = yield* makeTodoMvcSolid({});
|
|
34
|
+
const { result } = SolidTesting.renderHook(() => {
|
|
35
|
+
const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
|
|
36
|
+
return { state, setState, id };
|
|
37
|
+
}, { wrapper });
|
|
38
|
+
Vitest.expect(result.id()).toBe('u1');
|
|
39
|
+
Vitest.expect(result.state().username).toBe('');
|
|
40
|
+
result.setState({ username: 'username_u1_hello' });
|
|
41
|
+
Vitest.expect(result.id()).toBe('u1');
|
|
42
|
+
Vitest.expect(result.state().username).toBe('username_u1_hello');
|
|
43
|
+
}));
|
|
44
|
+
Vitest.scopedLive('should update the data reactively - via raw store commit', () => Effect.gen(function* () {
|
|
45
|
+
const { wrapper, store } = yield* makeTodoMvcSolid({});
|
|
46
|
+
const { result } = SolidTesting.renderHook(() => {
|
|
47
|
+
const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
|
|
48
|
+
return { state, setState, id };
|
|
49
|
+
}, { wrapper });
|
|
50
|
+
Vitest.expect(result.id()).toBe('u1');
|
|
51
|
+
Vitest.expect(result.state().username).toBe('');
|
|
52
|
+
store.commit(events.UserInfoSet({ username: 'username_u1_hello' }, 'u1'));
|
|
53
|
+
Vitest.expect(result.id()).toBe('u1');
|
|
54
|
+
Vitest.expect(result.state().username).toBe('username_u1_hello');
|
|
55
|
+
}));
|
|
56
|
+
Vitest.scopedLive('should work for a larger app', () => Effect.gen(function* () {
|
|
57
|
+
const { wrapper, store } = yield* makeTodoMvcSolid({});
|
|
58
|
+
const allTodos$ = LiveStore.queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) }, { label: 'allTodos' });
|
|
59
|
+
let globalSetState;
|
|
60
|
+
const AppRouter = () => {
|
|
61
|
+
const [state, setState] = store.useClientDocument(() => tables.AppRouterSchema, () => 'singleton');
|
|
62
|
+
globalSetState = setState;
|
|
63
|
+
return (<div>
|
|
64
|
+
<TasksList />
|
|
65
|
+
<div role={'current-id'}>Current Task Id: {state().currentTaskId ?? '-'}</div>
|
|
66
|
+
<Solid.Show when={state().currentTaskId} fallback={'Click on a task to see details'}>
|
|
67
|
+
{(id) => <TaskDetails id={id()}/>}
|
|
68
|
+
</Solid.Show>
|
|
69
|
+
</div>);
|
|
70
|
+
};
|
|
71
|
+
const TasksList = () => {
|
|
72
|
+
const allTodos = store.useQuery(() => allTodos$);
|
|
73
|
+
return (<div>
|
|
74
|
+
<Solid.For each={allTodos()}>{(todo) => <div>{todo.id}</div>}</Solid.For>
|
|
75
|
+
</div>);
|
|
76
|
+
};
|
|
77
|
+
const TaskDetails = (props) => {
|
|
78
|
+
const todo = store.useQuery(() => LiveStore.queryDb(tables.todos.where({ id: props.id }).first(), { deps: props.id }));
|
|
79
|
+
return <div role={'content'}>{JSON.stringify(todo())}</div>;
|
|
80
|
+
};
|
|
81
|
+
const { getByRole } = SolidTesting.render(() => <AppRouter />, { wrapper });
|
|
82
|
+
store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }));
|
|
83
|
+
Vitest.expect(getByRole('current-id').innerHTML).toMatchInlineSnapshot('"Current Task Id: -"');
|
|
84
|
+
globalSetState({ currentTaskId: 't1' });
|
|
85
|
+
Vitest.expect(getByRole('content').innerHTML).toMatchInlineSnapshot(`"{"id":"t1","text":"buy milk","completed":false}"`);
|
|
86
|
+
Vitest.expect(getByRole('current-id').innerHTML).toMatchInlineSnapshot('"Current Task Id: t1"');
|
|
87
|
+
store.commit(events.todoCreated({ id: 't2', text: 'buy eggs', completed: false }), events.AppRouterSet({ currentTaskId: 't2' }), events.todoCreated({ id: 't3', text: 'buy bread', completed: false }));
|
|
88
|
+
Vitest.expect(getByRole('current-id').innerHTML).toMatchInlineSnapshot('"Current Task Id: t2"');
|
|
89
|
+
}));
|
|
90
|
+
Vitest.scopedLive('should work for a useClientDocument query chained with a useTemporary query', () => Effect.gen(function* () {
|
|
91
|
+
const { store, wrapper } = yield* makeTodoMvcSolid({});
|
|
92
|
+
store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }), events.todoCreated({ id: 't2', text: 'buy bread', completed: false }));
|
|
93
|
+
const [userId, setUserId] = Solid.createSignal('u1');
|
|
94
|
+
const { result } = SolidTesting.renderHook(() => {
|
|
95
|
+
const [_row, _setRow, _id, rowState$] = store.useClientDocument(tables.userInfo, userId);
|
|
96
|
+
const todos = store.useQuery(() => LiveStore.queryDb((get) => tables.todos.where('text', 'LIKE', `%${get(rowState$()).text}%`),
|
|
97
|
+
// TODO find a way where explicit `userId` is not needed here
|
|
98
|
+
// possibly by automatically understanding the `get(rowState$)` dependency
|
|
99
|
+
{ label: 'todosFiltered', deps: userId() }));
|
|
100
|
+
return { todos };
|
|
101
|
+
}, { wrapper });
|
|
102
|
+
Vitest.expect(result.todos()?.length).toBe(2);
|
|
103
|
+
// Set text filter for u2 and test with second user
|
|
104
|
+
store.commit(events.UserInfoSet({ username: 'username_u2', text: 'milk' }, 'u2'));
|
|
105
|
+
setUserId('u2');
|
|
106
|
+
Vitest.expect(result.todos()?.length).toBe(1);
|
|
107
|
+
}));
|
|
108
|
+
Vitest.scopedLive('kv client document overwrites value (Schema.Any, no partial merge)', () => Effect.gen(function* () {
|
|
109
|
+
const { wrapper, store } = yield* makeTodoMvcSolid({});
|
|
110
|
+
const { result } = SolidTesting.renderHook(() => {
|
|
111
|
+
const [state, setState] = store.useClientDocument(tables.kv, 'k1');
|
|
112
|
+
return { state, setState };
|
|
113
|
+
}, { wrapper });
|
|
114
|
+
Vitest.expect(result.state()).toBe(null);
|
|
115
|
+
result.setState(1);
|
|
116
|
+
Vitest.expect(result.state()).toEqual(1);
|
|
117
|
+
result.setState({ b: 2 });
|
|
118
|
+
Vitest.expect(result.state()).toEqual({ b: 2 });
|
|
119
|
+
}));
|
|
120
|
+
Vitest.describe('otel', () => {
|
|
121
|
+
Vitest.it('should update the data based on component key', async () => {
|
|
122
|
+
const exporter = new InMemorySpanExporter();
|
|
123
|
+
const provider = new BasicTracerProvider({
|
|
124
|
+
spanProcessors: [new SimpleSpanProcessor(exporter)],
|
|
125
|
+
});
|
|
126
|
+
const otelTracer = provider.getTracer(`testing-solid`);
|
|
127
|
+
const span = otelTracer.startSpan('test-root');
|
|
128
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
129
|
+
await Effect.gen(function* () {
|
|
130
|
+
const { wrapper, store } = yield* makeTodoMvcSolid({
|
|
131
|
+
otelContext,
|
|
132
|
+
otelTracer,
|
|
133
|
+
});
|
|
134
|
+
const [userId, setUserId] = Solid.createSignal('u1');
|
|
135
|
+
// Test with first user
|
|
136
|
+
const { result } = SolidTesting.renderHook(() => {
|
|
137
|
+
const [state, setState, id] = store.useClientDocument(tables.userInfo, userId);
|
|
138
|
+
return { state, setState, id };
|
|
139
|
+
}, { wrapper });
|
|
140
|
+
Vitest.expect(result.id()).toBe('u1');
|
|
141
|
+
Vitest.expect(result.state().username).toBe('');
|
|
142
|
+
// For u2 we'll make sure that the row already exists,
|
|
143
|
+
// so the lazy `insert` will be skipped
|
|
144
|
+
store.commit(events.UserInfoSet({ username: 'username_u2' }, 'u2'));
|
|
145
|
+
// Test with second user (new hook instance)
|
|
146
|
+
setUserId('u2');
|
|
147
|
+
Vitest.expect(result.id()).toBe('u2');
|
|
148
|
+
Vitest.expect(result.state().username).toBe('username_u2');
|
|
149
|
+
span.end();
|
|
150
|
+
}).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise);
|
|
151
|
+
await provider.forceFlush();
|
|
152
|
+
const mapAttributes = (attributes) => {
|
|
153
|
+
return ReadonlyRecord.map(attributes, (val, key) => {
|
|
154
|
+
if (key === 'code.stacktrace') {
|
|
155
|
+
return '<STACKTRACE>';
|
|
156
|
+
}
|
|
157
|
+
else if (key === 'firstStackInfo') {
|
|
158
|
+
const stackInfo = JSON.parse(val);
|
|
159
|
+
// stackInfo.frames.shift() // Removes `renderHook.wrapper` from the stack
|
|
160
|
+
stackInfo.frames.forEach((_) => {
|
|
161
|
+
if (_.name.includes('renderHook.wrapper') === true) {
|
|
162
|
+
_.name = 'renderHook.wrapper';
|
|
163
|
+
}
|
|
164
|
+
_.filePath = '__REPLACED_FOR_SNAPSHOT__';
|
|
165
|
+
});
|
|
166
|
+
return JSON.stringify(stackInfo);
|
|
167
|
+
}
|
|
168
|
+
return val;
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
Vitest.expect(getSimplifiedRootSpan(exporter, 'createStore', mapAttributes)).toMatchSnapshot();
|
|
172
|
+
Vitest.expect(getAllSimplifiedRootSpans(exporter, 'LiveStore:commit', mapAttributes)).toMatchSnapshot();
|
|
173
|
+
await provider.shutdown();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=useClientDocument.client.test.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClientDocument.client.test.jsx","sourceRoot":"","sources":["../src/useClientDocument.client.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as Solid from 'solid-js';
|
|
2
|
+
import type { RowQuery } from '@livestore/common';
|
|
3
|
+
import { SessionIdSymbol } from '@livestore/common';
|
|
4
|
+
import { State } from '@livestore/common/schema';
|
|
5
|
+
import { type StateSetters } from '@livestore/framework-toolkit';
|
|
6
|
+
import type { LiveQuery, Store } from '@livestore/livestore';
|
|
7
|
+
import { type AccessorMaybe } from './utils.ts';
|
|
8
|
+
export type UseClientDocumentResult<TTableDef extends State.SQLite.ClientDocumentTableDef.TraitAny> = [
|
|
9
|
+
row: Solid.Accessor<TTableDef['Value']>,
|
|
10
|
+
setRow: StateSetters<TTableDef>,
|
|
11
|
+
id: Solid.Accessor<string>,
|
|
12
|
+
query$: Solid.Accessor<LiveQuery<TTableDef['Value']>>
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Type for useClientDocument that enforces id requirement based on table definition.
|
|
16
|
+
* If table has a default id → id parameter is optional.
|
|
17
|
+
* If table has no default id → id parameter is required.
|
|
18
|
+
*/
|
|
19
|
+
export interface UseClientDocument {
|
|
20
|
+
<TTableDef extends State.SQLite.ClientDocumentTableDef.Trait<any, any, any, {
|
|
21
|
+
partialSet: boolean;
|
|
22
|
+
default: {
|
|
23
|
+
id: string | SessionIdSymbol;
|
|
24
|
+
value: any;
|
|
25
|
+
};
|
|
26
|
+
}>>(table: AccessorMaybe<TTableDef>, id: AccessorMaybe<State.SQLite.ClientDocumentTableDef.DefaultIdType<TTableDef> | SessionIdSymbol> | undefined, options: Partial<RowQuery.GetOrCreateOptions<TTableDef>> | undefined, config: {
|
|
27
|
+
store: Store<any, any>;
|
|
28
|
+
}): UseClientDocumentResult<TTableDef>;
|
|
29
|
+
<TTableDef extends State.SQLite.ClientDocumentTableDef.Trait<any, any, any, {
|
|
30
|
+
partialSet: boolean;
|
|
31
|
+
default: {
|
|
32
|
+
id: undefined;
|
|
33
|
+
value: any;
|
|
34
|
+
};
|
|
35
|
+
}>>(table: AccessorMaybe<TTableDef>, id: AccessorMaybe<string | SessionIdSymbol>, options: Partial<RowQuery.GetOrCreateOptions<TTableDef>> | undefined, config: {
|
|
36
|
+
store: Store<any, any>;
|
|
37
|
+
}): UseClientDocumentResult<TTableDef>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Similar to `Solid.createSignal` but returns a tuple of `[state, setState, id, query$]` for a given table where ...
|
|
41
|
+
*
|
|
42
|
+
* - `state` is the current value of the row (fully decoded according to the table schema)
|
|
43
|
+
* - `setState` is a function that can be used to update the document
|
|
44
|
+
* - `id` is the id of the document
|
|
45
|
+
* - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the document
|
|
46
|
+
*
|
|
47
|
+
* `useClientDocument` only works for client-document tables:
|
|
48
|
+
*
|
|
49
|
+
* ```tsx
|
|
50
|
+
* const MyState = State.SQLite.clientDocument({
|
|
51
|
+
* name: 'MyState',
|
|
52
|
+
* schema: Schema.Struct({
|
|
53
|
+
* showSidebar: Schema.Boolean,
|
|
54
|
+
* }),
|
|
55
|
+
* default: { id: SessionIdSymbol, value: { showSidebar: true } },
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* const MyComponent = () => {
|
|
59
|
+
* const [{ showSidebar }, setState] = useClientDocument(MyState)
|
|
60
|
+
* return (
|
|
61
|
+
* <div onClick={() => setState({ showSidebar: !showSidebar })}>
|
|
62
|
+
* {showSidebar ? 'Sidebar is open' : 'Sidebar is closed'}
|
|
63
|
+
* </div>
|
|
64
|
+
* )
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* If the table has a default id, `useClientDocument` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
69
|
+
*/
|
|
70
|
+
export declare const useClientDocument: UseClientDocument;
|
|
71
|
+
//# sourceMappingURL=useClientDocument.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClientDocument.d.ts","sourceRoot":"","sources":["../src/useClientDocument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAyB,KAAK,YAAY,EAAwB,MAAM,8BAA8B,CAAA;AAC7G,OAAO,KAAK,EAAE,SAAS,EAAgB,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAI1E,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,YAAY,CAAA;AAExD,MAAM,MAAM,uBAAuB,CAAC,SAAS,SAAS,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,QAAQ,IAAI;IACpG,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC;IAC/B,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;CACtD,CAAA;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAEhC,CACE,SAAS,SAAS,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CACzD,GAAG,EACH,GAAG,EACH,GAAG,EACH;QACE,UAAU,EAAE,OAAO,CAAA;QACnB,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAAC;YAAC,KAAK,EAAE,GAAG,CAAA;SAAE,CAAA;KACtD,CACF,EAED,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,EAC/B,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS,EAC7G,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EACpE,MAAM,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;KAAE,GACjC,uBAAuB,CAAC,SAAS,CAAC,CAAA;IAGrC,CACE,SAAS,SAAS,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CACzD,GAAG,EACH,GAAG,EACH,GAAG,EACH;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE;YAAE,EAAE,EAAE,SAAS,CAAC;YAAC,KAAK,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE,CAChE,EAED,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,EAC/B,EAAE,EAAE,aAAa,CAAC,MAAM,GAAG,eAAe,CAAC,EAC3C,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,EACpE,MAAM,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;KAAE,GACjC,uBAAuB,CAAC,SAAS,CAAC,CAAA;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,iBAAiB,EAAE,iBAuD/B,CAAA"}
|