@livestore/livestore 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/README.md +0 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/QueryCache.js +1 -1
- package/dist/QueryCache.js.map +1 -1
- package/dist/SqliteDbWrapper.d.ts +5 -5
- package/dist/SqliteDbWrapper.d.ts.map +1 -1
- package/dist/SqliteDbWrapper.js +8 -8
- package/dist/SqliteDbWrapper.js.map +1 -1
- package/dist/SqliteDbWrapper.test.js +2 -2
- package/dist/SqliteDbWrapper.test.js.map +1 -1
- package/dist/effect/LiveStore.d.ts +14 -7
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +0 -15
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/effect/LiveStore.test.d.ts +2 -0
- package/dist/effect/LiveStore.test.d.ts.map +1 -0
- package/dist/effect/LiveStore.test.js +42 -0
- package/dist/effect/LiveStore.test.js.map +1 -0
- package/dist/live-queries/base-class.d.ts +3 -3
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js +2 -2
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/client-document-get-query.d.ts +1 -1
- package/dist/live-queries/client-document-get-query.d.ts.map +1 -1
- package/dist/live-queries/client-document-get-query.js +1 -1
- package/dist/live-queries/client-document-get-query.js.map +1 -1
- package/dist/live-queries/computed.d.ts.map +1 -1
- package/dist/live-queries/computed.js +2 -2
- package/dist/live-queries/computed.js.map +1 -1
- package/dist/live-queries/db-query.js +14 -14
- package/dist/live-queries/db-query.js.map +1 -1
- package/dist/live-queries/db-query.test.js +2 -2
- package/dist/live-queries/db-query.test.js.map +1 -1
- package/dist/live-queries/signal.test.js +2 -2
- package/dist/live-queries/signal.test.js.map +1 -1
- package/dist/mod.d.ts +1 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js.map +1 -1
- package/dist/reactive.d.ts +9 -9
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +9 -26
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +2 -2
- package/dist/reactive.test.js.map +1 -1
- package/dist/store/StoreRegistry.d.ts +30 -5
- package/dist/store/StoreRegistry.d.ts.map +1 -1
- package/dist/store/StoreRegistry.js +54 -31
- package/dist/store/StoreRegistry.js.map +1 -1
- package/dist/store/StoreRegistry.test.js +251 -250
- package/dist/store/StoreRegistry.test.js.map +1 -1
- package/dist/store/create-store.d.ts +6 -2
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +13 -7
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/devtools.d.ts +1 -1
- package/dist/store/devtools.d.ts.map +1 -1
- package/dist/store/devtools.js +3 -3
- package/dist/store/devtools.js.map +1 -1
- package/dist/store/store-eventstream.test.js +2 -2
- package/dist/store/store-eventstream.test.js.map +1 -1
- package/dist/store/store-types.d.ts +70 -5
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js.map +1 -1
- package/dist/store/store-types.test.js +1 -1
- package/dist/store/store-types.test.js.map +1 -1
- package/dist/store/store.d.ts +81 -2
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +128 -45
- package/dist/store/store.js.map +1 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/stack-info.js +2 -2
- package/dist/utils/stack-info.js.map +1 -1
- package/dist/utils/tests/fixture.d.ts +1 -1
- package/dist/utils/tests/fixture.d.ts.map +1 -1
- package/dist/utils/tests/fixture.js.map +1 -1
- package/dist/utils/tests/otel.d.ts.map +1 -1
- package/dist/utils/tests/otel.js +5 -5
- package/dist/utils/tests/otel.js.map +1 -1
- package/package.json +58 -17
- package/src/QueryCache.ts +1 -1
- package/src/SqliteDbWrapper.test.ts +4 -2
- package/src/SqliteDbWrapper.ts +12 -11
- package/src/ambient.d.ts +0 -7
- package/src/effect/LiveStore.test.ts +61 -0
- package/src/effect/LiveStore.ts +17 -26
- package/src/live-queries/__snapshots__/db-query.test.ts.snap +336 -231
- package/src/live-queries/base-class.ts +7 -6
- package/src/live-queries/client-document-get-query.ts +4 -2
- package/src/live-queries/computed.ts +3 -2
- package/src/live-queries/db-query.test.ts +3 -2
- package/src/live-queries/db-query.ts +15 -15
- package/src/live-queries/signal.test.ts +3 -2
- package/src/mod.ts +1 -0
- package/src/reactive.test.ts +3 -2
- package/src/reactive.ts +22 -23
- package/src/store/StoreRegistry.test.ts +317 -293
- package/src/store/StoreRegistry.ts +63 -38
- package/src/store/create-store.ts +26 -11
- package/src/store/devtools.ts +5 -6
- package/src/store/store-eventstream.test.ts +4 -2
- package/src/store/store-types.test.ts +3 -1
- package/src/store/store-types.ts +47 -8
- package/src/store/store.ts +172 -55
- package/src/utils/dev.ts +2 -2
- package/src/utils/stack-info.ts +2 -2
- package/src/utils/tests/fixture.ts +2 -1
- package/src/utils/tests/otel.ts +8 -7
- package/docs/api/index.md +0 -3
- package/docs/building-with-livestore/complex-ui-state/index.md +0 -3
- package/docs/building-with-livestore/crud/index.md +0 -3
- package/docs/building-with-livestore/data-modeling/index.md +0 -30
- package/docs/building-with-livestore/debugging/index.md +0 -17
- package/docs/building-with-livestore/devtools/index.md +0 -79
- package/docs/building-with-livestore/events/index.md +0 -355
- package/docs/building-with-livestore/examples/ai-agent/index.md +0 -5
- package/docs/building-with-livestore/examples/todo-workspaces/index.md +0 -885
- package/docs/building-with-livestore/examples/turnbased-game/index.md +0 -7
- package/docs/building-with-livestore/opentelemetry/index.md +0 -227
- package/docs/building-with-livestore/production-checklist/index.md +0 -5
- package/docs/building-with-livestore/reactivity-system/index.md +0 -202
- package/docs/building-with-livestore/rules-for-ai-agents/index.md +0 -9
- package/docs/building-with-livestore/state/materializers/index.md +0 -300
- package/docs/building-with-livestore/state/sql-queries/index.md +0 -94
- package/docs/building-with-livestore/state/sqlite/index.md +0 -45
- package/docs/building-with-livestore/state/sqlite-schema/index.md +0 -306
- package/docs/building-with-livestore/state/sqlite-schema-effect/index.md +0 -300
- package/docs/building-with-livestore/store/index.md +0 -625
- package/docs/building-with-livestore/syncing/index.md +0 -136
- package/docs/building-with-livestore/tools/cli/index.md +0 -177
- package/docs/building-with-livestore/tools/mcp/index.md +0 -187
- package/docs/examples/cloudflare-adapter/index.md +0 -44
- package/docs/examples/expo-adapter/index.md +0 -44
- package/docs/examples/index.md +0 -55
- package/docs/examples/node-adapter/index.md +0 -44
- package/docs/examples/web-adapter/index.md +0 -52
- package/docs/framework-integrations/custom-elements/index.md +0 -142
- package/docs/framework-integrations/react-integration/index.md +0 -937
- package/docs/framework-integrations/solid-integration/index.md +0 -293
- package/docs/framework-integrations/svelte-integration/index.md +0 -42
- package/docs/framework-integrations/vue-integration/index.md +0 -294
- package/docs/getting-started/expo/index.md +0 -882
- package/docs/getting-started/node/index.md +0 -115
- package/docs/getting-started/react-web/index.md +0 -626
- package/docs/getting-started/solid/index.md +0 -3
- package/docs/getting-started/vue/index.md +0 -471
- package/docs/index.md +0 -208
- package/docs/llms.txt +0 -146
- package/docs/misc/CODE_OF_CONDUCT/index.md +0 -133
- package/docs/misc/FAQ/index.md +0 -37
- package/docs/misc/community/index.md +0 -88
- package/docs/misc/credits/index.md +0 -14
- package/docs/misc/design-partners/index.md +0 -13
- package/docs/misc/package-management/index.md +0 -21
- package/docs/misc/performance/index.md +0 -25
- package/docs/misc/resources/index.md +0 -46
- package/docs/misc/state-of-the-project/index.md +0 -37
- package/docs/misc/troubleshooting/index.md +0 -82
- package/docs/overview/concepts/index.md +0 -78
- package/docs/overview/how-livestore-works/index.md +0 -56
- package/docs/overview/introduction/index.md +0 -413
- package/docs/overview/technology-comparison/index.md +0 -40
- package/docs/overview/when-livestore/index.md +0 -81
- package/docs/overview/why-livestore/index.md +0 -111
- package/docs/patterns/ai/index.md +0 -15
- package/docs/patterns/anonymous-user-transition/index.md +0 -10
- package/docs/patterns/app-evolution/index.md +0 -72
- package/docs/patterns/auth/index.md +0 -377
- package/docs/patterns/effect/index.md +0 -1505
- package/docs/patterns/encryption/index.md +0 -6
- package/docs/patterns/external-data/index.md +0 -5
- package/docs/patterns/file-management/index.md +0 -11
- package/docs/patterns/file-structure/index.md +0 -14
- package/docs/patterns/list-ordering/index.md +0 -369
- package/docs/patterns/offline/index.md +0 -32
- package/docs/patterns/orm/index.md +0 -18
- package/docs/patterns/presence/index.md +0 -11
- package/docs/patterns/rich-text-editing/index.md +0 -11
- package/docs/patterns/server-side-clients/index.md +0 -97
- package/docs/patterns/side-effects/index.md +0 -11
- package/docs/patterns/state-machines/index.md +0 -11
- package/docs/patterns/storybook/index.md +0 -209
- package/docs/patterns/undo-redo/index.md +0 -9
- package/docs/patterns/version-control/index.md +0 -8
- package/docs/platform-adapters/cloudflare-durable-object-adapter/index.md +0 -453
- package/docs/platform-adapters/electron-adapter/index.md +0 -15
- package/docs/platform-adapters/expo-adapter/index.md +0 -262
- package/docs/platform-adapters/node-adapter/index.md +0 -160
- package/docs/platform-adapters/tauri-adapter/index.md +0 -15
- package/docs/platform-adapters/web-adapter/index.md +0 -287
- package/docs/sustainable-open-source/contributing/docs/index.md +0 -94
- package/docs/sustainable-open-source/contributing/info/index.md +0 -63
- package/docs/sustainable-open-source/contributing/monorepo/index.md +0 -195
- package/docs/sustainable-open-source/sponsoring/index.md +0 -104
- package/docs/sync-providers/cloudflare/index.md +0 -773
- package/docs/sync-providers/custom/index.md +0 -65
- package/docs/sync-providers/electricsql/index.md +0 -159
- package/docs/sync-providers/s2/index.md +0 -230
- package/docs/tutorial/0-welcome/index.md +0 -48
- package/docs/tutorial/1-setup-starter-project/index.md +0 -105
- package/docs/tutorial/2-deploy-to-cloudflare/index.md +0 -195
- package/docs/tutorial/3-read-and-write-todos-via-livestore/index.md +0 -530
- package/docs/tutorial/4-sync-data-via-cloudflare/index.md +0 -210
- package/docs/tutorial/5-expand-business-logic/index.md +0 -174
- package/docs/tutorial/6-persist-ui-state/index.md +0 -453
- package/docs/tutorial/7-next-steps/index.md +0 -22
- package/docs/understanding-livestore/design-decisions/index.md +0 -33
- package/docs/understanding-livestore/event-sourcing/index.md +0 -40
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Node adapter examples
|
|
2
|
-
|
|
3
|
-
# Node Adapter Examples
|
|
4
|
-
|
|
5
|
-
Examples using `@livestore/adapter-node` for Node.js server-side applications.
|
|
6
|
-
|
|
7
|
-
<CardGrid>
|
|
8
|
-
{nodeExamples.map((example) => {
|
|
9
|
-
const { url, label } = getExampleDemoLinks(example);
|
|
10
|
-
|
|
11
|
-
return (
|
|
12
|
-
<Card title={example.title} key={example.title}>
|
|
13
|
-
{example.image ? (
|
|
14
|
-
<Image src={example.image.url} width={example.image.width} height={example.image.height} alt={`${example.title} application interface`} />
|
|
15
|
-
) : (
|
|
16
|
-
<div style="background: linear-gradient(135deg, #1f2937 0%, #374151 100%); height: 200px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 14px; border-radius: 8px;">
|
|
17
|
-
Screenshot coming soon
|
|
18
|
-
</div>
|
|
19
|
-
)}
|
|
20
|
-
<p>{example.description}</p>
|
|
21
|
-
<p><strong>Technologies:</strong> {example.technologies.join(' • ')}</p>
|
|
22
|
-
{example.syncProvider && (
|
|
23
|
-
<p><strong>Sync Provider:</strong> {example.syncProvider}</p>
|
|
24
|
-
)}
|
|
25
|
-
<div style="margin-top: auto; padding-top: 1rem;">
|
|
26
|
-
{url && (
|
|
27
|
-
<p style="margin: 0 0 0.5rem 0;"><a href={url} target="_blank" rel="noopener noreferrer">{label}</a></p>
|
|
28
|
-
)}
|
|
29
|
-
<p style="margin: 0;"><a href={example.sourceUrl} target="_blank" rel="noopener noreferrer">View Source →</a></p>
|
|
30
|
-
</div>
|
|
31
|
-
</Card>
|
|
32
|
-
);
|
|
33
|
-
})}
|
|
34
|
-
</CardGrid>
|
|
35
|
-
|
|
36
|
-
## Node Adapter
|
|
37
|
-
|
|
38
|
-
- Uses native Node.js SQLite with file system storage
|
|
39
|
-
- Stores SQLite files directly on disk (default: current directory)
|
|
40
|
-
- Supports single-threaded or worker thread modes
|
|
41
|
-
- WebSocket connections for sync and devtools integration
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
<a href={`https://github.com/livestorejs/livestore/tree/${getBranchName()}/examples`}>View all examples on GitHub →</a>
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# Web adapter examples
|
|
2
|
-
|
|
3
|
-
# Web Adapter Examples
|
|
4
|
-
|
|
5
|
-
Examples using `@livestore/adapter-web` for browser environments.
|
|
6
|
-
|
|
7
|
-
<CardGrid>
|
|
8
|
-
{webExamples.map((example) => {
|
|
9
|
-
const { url, label } = getExampleDemoLinks(example);
|
|
10
|
-
|
|
11
|
-
return (
|
|
12
|
-
<Card title={example.title} key={example.title}>
|
|
13
|
-
{example.image ? (
|
|
14
|
-
<Image src={example.image.url} width={example.image.width} height={example.image.height} alt={`${example.title} application interface`} />
|
|
15
|
-
) : (
|
|
16
|
-
<div style="background: linear-gradient(135deg, #1f2937 0%, #374151 100%); height: 200px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 14px; border-radius: 8px;">
|
|
17
|
-
Screenshot coming soon
|
|
18
|
-
</div>
|
|
19
|
-
)}
|
|
20
|
-
<p>{example.description}</p>
|
|
21
|
-
<p><strong>Technologies:</strong> {example.technologies.join(' • ')}</p>
|
|
22
|
-
{example.syncProvider && (
|
|
23
|
-
<p><strong>Sync Provider:</strong> {example.syncProvider}</p>
|
|
24
|
-
)}
|
|
25
|
-
<div style="margin-top: auto; padding-top: 1rem;">
|
|
26
|
-
{url && (
|
|
27
|
-
<p style="margin: 0 0 0.5rem 0;"><a href={url} target="_blank" rel="noopener noreferrer">{label}</a></p>
|
|
28
|
-
)}
|
|
29
|
-
<p style="margin: 0;"><a href={example.sourceUrl} target="_blank" rel="noopener noreferrer">View Source →</a></p>
|
|
30
|
-
</div>
|
|
31
|
-
</Card>
|
|
32
|
-
);
|
|
33
|
-
})}
|
|
34
|
-
</CardGrid>
|
|
35
|
-
|
|
36
|
-
## Web Adapter
|
|
37
|
-
|
|
38
|
-
- Uses SQLite WASM with OPFS (Origin Private File System) for browser storage
|
|
39
|
-
- Runs in Web Workers and SharedWorkers for multi-tab coordination
|
|
40
|
-
- Persists data via OPFS Access Handle Pool VFS
|
|
41
|
-
- Supports WebSocket connections for sync and devtools
|
|
42
|
-
|
|
43
|
-
## Frameworks
|
|
44
|
-
|
|
45
|
-
- React (`@livestore/react`)
|
|
46
|
-
- SolidJS (`@livestore/solid`)
|
|
47
|
-
- Svelte (`@livestore/svelte`)
|
|
48
|
-
- Web Components
|
|
49
|
-
- Vanilla JavaScript
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
<a href={`https://github.com/livestorejs/livestore/tree/${getBranchName()}/examples`}>View all examples on GitHub →</a>
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# Custom elements
|
|
2
|
-
|
|
3
|
-
LiveStore can be used with custom elements/web components.
|
|
4
|
-
|
|
5
|
-
## Example
|
|
6
|
-
|
|
7
|
-
See [examples](/examples) for a complete example.
|
|
8
|
-
|
|
9
|
-
## `reference/custom-elements/main.ts`
|
|
10
|
-
|
|
11
|
-
```ts filename="reference/custom-elements/main.ts"
|
|
12
|
-
|
|
13
|
-
const adapter = makePersistedAdapter({
|
|
14
|
-
storage: { type: 'opfs' },
|
|
15
|
-
worker: LiveStoreWorker,
|
|
16
|
-
sharedWorker: LiveStoreSharedWorker,
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
const store = await createStorePromise({ schema, adapter, storeId: 'custom-elements-demo' })
|
|
20
|
-
|
|
21
|
-
const visibleTodos$ = queryDb(tables.todos.where({ deletedAt: null }))
|
|
22
|
-
|
|
23
|
-
class TodoListElement extends HTMLElement {
|
|
24
|
-
private list: HTMLUListElement
|
|
25
|
-
private input: HTMLInputElement
|
|
26
|
-
|
|
27
|
-
constructor() {
|
|
28
|
-
super()
|
|
29
|
-
const shadow = this.attachShadow({ mode: 'open' })
|
|
30
|
-
|
|
31
|
-
this.input = document.createElement('input')
|
|
32
|
-
this.input.placeholder = 'What needs to be done?'
|
|
33
|
-
|
|
34
|
-
this.list = document.createElement('ul')
|
|
35
|
-
this.list.style.listStyle = 'none'
|
|
36
|
-
this.list.style.padding = '0'
|
|
37
|
-
this.list.style.margin = '16px 0 0'
|
|
38
|
-
|
|
39
|
-
this.input.addEventListener('keydown', (event) => {
|
|
40
|
-
if (event.key === 'Enter' && this.input.value.trim()) {
|
|
41
|
-
store.commit(events.todoCreated({ id: crypto.randomUUID(), text: this.input.value.trim() }))
|
|
42
|
-
this.input.value = ''
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
shadow.append(this.input, this.list)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
connectedCallback(): void {
|
|
50
|
-
this.renderTodos(Array.from(store.query(tables.todos.where({ deletedAt: null }))))
|
|
51
|
-
|
|
52
|
-
store.subscribe(visibleTodos$, (todos) => this.renderTodos(todos))
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
private renderTodos(todos: ReadonlyArray<typeof tables.todos.Type>): void {
|
|
56
|
-
const nodes = Array.from(todos, (todo) => {
|
|
57
|
-
const item = document.createElement('li')
|
|
58
|
-
item.textContent = todo.text
|
|
59
|
-
item.style.cursor = 'pointer'
|
|
60
|
-
item.addEventListener('click', () => {
|
|
61
|
-
store.commit(todo.completed ? events.todoUncompleted({ id: todo.id }) : events.todoCompleted({ id: todo.id }))
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
const deleteButton = document.createElement('button')
|
|
65
|
-
deleteButton.type = 'button'
|
|
66
|
-
deleteButton.textContent = '✕'
|
|
67
|
-
deleteButton.style.marginLeft = '8px'
|
|
68
|
-
deleteButton.addEventListener('click', (event) => {
|
|
69
|
-
event.stopPropagation()
|
|
70
|
-
store.commit(events.todoDeleted({ id: todo.id, deletedAt: new Date() }))
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
const row = document.createElement('div')
|
|
74
|
-
row.style.display = 'flex'
|
|
75
|
-
row.style.alignItems = 'center'
|
|
76
|
-
row.appendChild(item)
|
|
77
|
-
row.appendChild(deleteButton)
|
|
78
|
-
|
|
79
|
-
const wrapper = document.createElement('li')
|
|
80
|
-
wrapper.appendChild(row)
|
|
81
|
-
return wrapper
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
this.list.replaceChildren(...nodes)
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
customElements.define('todo-list', TodoListElement)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### `reference/custom-elements/livestore/schema.ts`
|
|
92
|
-
|
|
93
|
-
```ts filename="reference/custom-elements/livestore/schema.ts"
|
|
94
|
-
|
|
95
|
-
export const tables = {
|
|
96
|
-
todos: State.SQLite.table({
|
|
97
|
-
name: 'todos',
|
|
98
|
-
columns: {
|
|
99
|
-
id: State.SQLite.text({ primaryKey: true }),
|
|
100
|
-
text: State.SQLite.text({ default: '' }),
|
|
101
|
-
completed: State.SQLite.boolean({ default: false }),
|
|
102
|
-
deletedAt: State.SQLite.integer({ nullable: true, schema: Schema.DateFromNumber }),
|
|
103
|
-
},
|
|
104
|
-
}),
|
|
105
|
-
uiState: State.SQLite.clientDocument({
|
|
106
|
-
name: 'uiState',
|
|
107
|
-
schema: Schema.Struct({ newTodoText: Schema.String }),
|
|
108
|
-
default: { id: SessionIdSymbol, value: { newTodoText: '' } },
|
|
109
|
-
}),
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export const events = {
|
|
113
|
-
todoCreated: Events.synced({
|
|
114
|
-
name: 'v1.TodoCreated',
|
|
115
|
-
schema: Schema.Struct({ id: Schema.String, text: Schema.String }),
|
|
116
|
-
}),
|
|
117
|
-
todoCompleted: Events.synced({
|
|
118
|
-
name: 'v1.TodoCompleted',
|
|
119
|
-
schema: Schema.Struct({ id: Schema.String }),
|
|
120
|
-
}),
|
|
121
|
-
todoUncompleted: Events.synced({
|
|
122
|
-
name: 'v1.TodoUncompleted',
|
|
123
|
-
schema: Schema.Struct({ id: Schema.String }),
|
|
124
|
-
}),
|
|
125
|
-
todoDeleted: Events.synced({
|
|
126
|
-
name: 'v1.TodoDeleted',
|
|
127
|
-
schema: Schema.Struct({ id: Schema.String, deletedAt: Schema.Date }),
|
|
128
|
-
}),
|
|
129
|
-
uiStateSet: tables.uiState.set,
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const materializers = State.SQLite.materializers(events, {
|
|
133
|
-
'v1.TodoCreated': ({ id, text }) => tables.todos.insert({ id, text, completed: false }),
|
|
134
|
-
'v1.TodoCompleted': ({ id }) => tables.todos.update({ completed: true }).where({ id }),
|
|
135
|
-
'v1.TodoUncompleted': ({ id }) => tables.todos.update({ completed: false }).where({ id }),
|
|
136
|
-
'v1.TodoDeleted': ({ id, deletedAt }) => tables.todos.update({ deletedAt }).where({ id }),
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
const state = State.SQLite.makeState({ tables, materializers })
|
|
140
|
-
|
|
141
|
-
export const schema = makeSchema({ events, state })
|
|
142
|
-
```
|