@livestore/common 0.3.0-dev.28 → 0.3.0-dev.29
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/__tests__/fixture.d.ts +83 -221
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +33 -11
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +22 -15
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +15 -2
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +1 -0
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +21 -21
- package/dist/devtools/devtools-messages-common.d.ts +6 -6
- package/dist/devtools/devtools-messages-leader.d.ts +45 -45
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +11 -11
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +10 -10
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +63 -65
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/{apply-mutation.d.ts → apply-event.d.ts} +7 -7
- package/dist/leader-thread/apply-event.d.ts.map +1 -0
- package/dist/leader-thread/apply-event.js +103 -0
- package/dist/leader-thread/apply-event.js.map +1 -0
- package/dist/leader-thread/eventlog.d.ts +27 -0
- package/dist/leader-thread/eventlog.d.ts.map +1 -0
- package/dist/leader-thread/eventlog.js +123 -0
- package/dist/leader-thread/eventlog.js.map +1 -0
- package/dist/leader-thread/leader-worker-devtools.js +18 -18
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +2 -2
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +16 -16
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -1
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -1
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +6 -8
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/types.d.ts +11 -11
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +70 -0
- package/dist/materializer-helper.js.map +1 -0
- package/dist/query-builder/api.d.ts +58 -53
- package/dist/query-builder/api.d.ts.map +1 -1
- package/dist/query-builder/api.js +3 -5
- package/dist/query-builder/api.js.map +1 -1
- package/dist/query-builder/astToSql.d.ts.map +1 -1
- package/dist/query-builder/astToSql.js +59 -37
- package/dist/query-builder/astToSql.js.map +1 -1
- package/dist/query-builder/impl.d.ts +2 -3
- package/dist/query-builder/impl.d.ts.map +1 -1
- package/dist/query-builder/impl.js +48 -46
- package/dist/query-builder/impl.js.map +1 -1
- package/dist/query-builder/impl.test.d.ts +86 -1
- package/dist/query-builder/impl.test.d.ts.map +1 -1
- package/dist/query-builder/impl.test.js +244 -36
- package/dist/query-builder/impl.test.js.map +1 -1
- package/dist/rehydrate-from-eventlog.d.ts +14 -0
- package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
- package/dist/{rehydrate-from-mutationlog.js → rehydrate-from-eventlog.js} +25 -26
- package/dist/rehydrate-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +136 -0
- package/dist/schema/EventDef.d.ts.map +1 -0
- package/dist/schema/EventDef.js +58 -0
- package/dist/schema/EventDef.js.map +1 -0
- package/dist/schema/EventId.d.ts +2 -2
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +3 -2
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/{MutationEvent.d.ts → LiveStoreEvent.d.ts} +56 -56
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/{MutationEvent.js → LiveStoreEvent.js} +24 -24
- package/dist/schema/LiveStoreEvent.js.map +1 -0
- package/dist/schema/client-document-def.d.ts +223 -0
- package/dist/schema/client-document-def.d.ts.map +1 -0
- package/dist/schema/client-document-def.js +170 -0
- package/dist/schema/client-document-def.js.map +1 -0
- package/dist/schema/client-document-def.test.d.ts +2 -0
- package/dist/schema/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/client-document-def.test.js +201 -0
- package/dist/schema/client-document-def.test.js.map +1 -0
- package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/events.d.ts +2 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +2 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/schema/mod.d.ts +4 -3
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +4 -3
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +27 -23
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +45 -43
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/sqlite-state.d.ts +12 -0
- package/dist/schema/sqlite-state.d.ts.map +1 -0
- package/dist/schema/sqlite-state.js +36 -0
- package/dist/schema/sqlite-state.js.map +1 -0
- package/dist/schema/system-tables.d.ts +67 -98
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +62 -48
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema/table-def.d.ts +26 -96
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +16 -64
- package/dist/schema/table-def.js.map +1 -1
- package/dist/schema/view.d.ts +3 -0
- package/dist/schema/view.d.ts.map +1 -0
- package/dist/schema/view.js +3 -0
- package/dist/schema/view.js.map +1 -0
- package/dist/schema-management/common.d.ts +4 -4
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +6 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
- package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
- package/dist/schema-management/validate-mutation-defs.js +17 -17
- package/dist/schema-management/validate-mutation-defs.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +7 -7
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +31 -30
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/facts.d.ts +19 -19
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +2 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +3 -3
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +1 -1
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.js +1 -1
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +7 -7
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +71 -71
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +29 -29
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +60 -25
- package/dist/sync/next/test/event-fixtures.js.map +1 -0
- package/dist/sync/next/test/mod.d.ts +1 -1
- package/dist/sync/next/test/mod.d.ts.map +1 -1
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/next/test/mod.js.map +1 -1
- package/dist/sync/sync.d.ts +3 -3
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +32 -32
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +10 -10
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +5 -5
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +23 -16
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-leader.ts +13 -13
- package/src/index.ts +2 -5
- package/src/leader-thread/LeaderSyncProcessor.ts +81 -91
- package/src/leader-thread/{apply-mutation.ts → apply-event.ts} +50 -74
- package/src/leader-thread/eventlog.ts +199 -0
- package/src/leader-thread/leader-worker-devtools.ts +18 -18
- package/src/leader-thread/make-leader-thread-layer.ts +18 -18
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +6 -9
- package/src/leader-thread/types.ts +12 -12
- package/src/materializer-helper.ts +110 -0
- package/src/query-builder/api.ts +79 -105
- package/src/query-builder/astToSql.ts +68 -39
- package/src/query-builder/impl.test.ts +264 -42
- package/src/query-builder/impl.ts +72 -56
- package/src/{rehydrate-from-mutationlog.ts → rehydrate-from-eventlog.ts} +33 -40
- package/src/schema/EventDef.ts +216 -0
- package/src/schema/EventId.ts +5 -3
- package/src/schema/{MutationEvent.ts → LiveStoreEvent.ts} +67 -68
- package/src/schema/client-document-def.test.ts +239 -0
- package/src/schema/client-document-def.ts +444 -0
- package/src/schema/db-schema/dsl/mod.ts +0 -1
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +4 -3
- package/src/schema/schema.ts +79 -69
- package/src/schema/sqlite-state.ts +62 -0
- package/src/schema/system-tables.ts +42 -53
- package/src/schema/table-def.ts +53 -209
- package/src/schema/view.ts +2 -0
- package/src/schema-management/common.ts +4 -4
- package/src/schema-management/migrations.ts +8 -9
- package/src/schema-management/validate-mutation-defs.ts +22 -24
- package/src/sync/ClientSessionSyncProcessor.ts +37 -36
- package/src/sync/next/facts.ts +31 -32
- package/src/sync/next/history-dag-common.ts +4 -4
- package/src/sync/next/history-dag.ts +1 -1
- package/src/sync/next/rebase-events.ts +13 -13
- package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
- package/src/sync/next/test/compact-events.test.ts +73 -73
- package/src/sync/next/test/event-fixtures.ts +219 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +3 -3
- package/src/sync/syncstate.test.ts +8 -8
- package/src/sync/syncstate.ts +19 -19
- package/src/sync/validate-push-payload.ts +2 -2
- package/src/version.ts +1 -1
- package/tmp/pack.tgz +0 -0
- package/tsconfig.json +1 -0
- package/dist/derived-mutations.d.ts +0 -109
- package/dist/derived-mutations.d.ts.map +0 -1
- package/dist/derived-mutations.js +0 -54
- package/dist/derived-mutations.js.map +0 -1
- package/dist/derived-mutations.test.d.ts +0 -2
- package/dist/derived-mutations.test.d.ts.map +0 -1
- package/dist/derived-mutations.test.js +0 -93
- package/dist/derived-mutations.test.js.map +0 -1
- package/dist/init-singleton-tables.d.ts +0 -4
- package/dist/init-singleton-tables.d.ts.map +0 -1
- package/dist/init-singleton-tables.js +0 -16
- package/dist/init-singleton-tables.js.map +0 -1
- package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
- package/dist/leader-thread/apply-mutation.js +0 -122
- package/dist/leader-thread/apply-mutation.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -27
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -124
- package/dist/leader-thread/mutationlog.js.map +0 -1
- package/dist/leader-thread/pull-queue-set.d.ts +0 -7
- package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
- package/dist/leader-thread/pull-queue-set.js +0 -38
- package/dist/leader-thread/pull-queue-set.js.map +0 -1
- package/dist/mutation.d.ts +0 -20
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -68
- package/dist/mutation.js.map +0 -1
- package/dist/query-info.d.ts +0 -41
- package/dist/query-info.d.ts.map +0 -1
- package/dist/query-info.js +0 -7
- package/dist/query-info.js.map +0 -1
- package/dist/rehydrate-from-mutationlog.d.ts +0 -15
- package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
- package/dist/rehydrate-from-mutationlog.js.map +0 -1
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -115
- package/dist/schema/mutations.d.ts.map +0 -1
- package/dist/schema/mutations.js +0 -42
- package/dist/schema/mutations.js.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
- package/src/derived-mutations.test.ts +0 -101
- package/src/derived-mutations.ts +0 -170
- package/src/init-singleton-tables.ts +0 -24
- package/src/leader-thread/mutationlog.ts +0 -202
- package/src/mutation.ts +0 -108
- package/src/query-info.ts +0 -83
- package/src/schema/mutations.ts +0 -193
- package/src/sync/next/test/mutation-fixtures.ts +0 -228
package/src/schema/schema.ts
CHANGED
@@ -1,103 +1,101 @@
|
|
1
1
|
import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
|
2
2
|
|
3
3
|
import type { MigrationOptions } from '../adapter-types.js'
|
4
|
-
import {
|
4
|
+
import { tableIsClientDocumentTable } from './client-document-def.js'
|
5
5
|
import type { SqliteDsl } from './db-schema/mod.js'
|
6
6
|
import { SqliteAst } from './db-schema/mod.js'
|
7
|
-
import {
|
8
|
-
|
9
|
-
type MutationDefMap,
|
10
|
-
type MutationDefRecord,
|
11
|
-
type RawSqlMutation,
|
12
|
-
rawSqlMutation,
|
13
|
-
} from './mutations.js'
|
7
|
+
import type { EventDef, EventDefRecord, Materializer, RawSqlEvent } from './EventDef.js'
|
8
|
+
import { rawSqlEvent } from './EventDef.js'
|
14
9
|
import { systemTables } from './system-tables.js'
|
15
|
-
import type { TableDef
|
16
|
-
import { tableHasDerivedMutations } from './table-def.js'
|
10
|
+
import type { TableDef } from './table-def.js'
|
17
11
|
|
18
12
|
export const LiveStoreSchemaSymbol = Symbol.for('livestore.LiveStoreSchema')
|
19
13
|
export type LiveStoreSchemaSymbol = typeof LiveStoreSchemaSymbol
|
20
14
|
|
21
15
|
export type LiveStoreSchema<
|
22
16
|
TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema,
|
23
|
-
|
17
|
+
TEventsDefRecord extends EventDefRecord = EventDefRecord,
|
24
18
|
> = {
|
25
19
|
readonly _Type: LiveStoreSchemaSymbol
|
26
20
|
/** Only used on type-level */
|
27
21
|
readonly _DbSchemaType: TDbSchema
|
28
22
|
/** Only used on type-level */
|
29
|
-
readonly
|
23
|
+
readonly _EventDefMapType: TEventsDefRecord
|
30
24
|
|
25
|
+
// TODO remove in favour of `state`
|
31
26
|
readonly tables: Map<string, TableDef>
|
32
|
-
readonly mutations: MutationDefMap
|
33
27
|
/** Compound hash of all table defs etc */
|
34
28
|
readonly hash: number
|
29
|
+
readonly state: State
|
30
|
+
|
31
|
+
readonly eventsDefsMap: Map<string, EventDef.AnyWithoutFn>
|
32
|
+
|
33
|
+
// readonly materializers: Map<string, Materializer>
|
35
34
|
|
36
35
|
migrationOptions: MigrationOptions
|
37
36
|
}
|
38
37
|
|
38
|
+
export type State = {
|
39
|
+
readonly tables: Map<string, TableDef.Any>
|
40
|
+
readonly materializers: Map<string, Materializer>
|
41
|
+
}
|
42
|
+
|
39
43
|
export type InputSchema = {
|
40
|
-
readonly
|
41
|
-
readonly
|
42
|
-
/**
|
43
|
-
* Can be used to isolate multiple LiveStore apps running in the same origin
|
44
|
-
*/
|
45
|
-
// TODO remove this in favour of storeId
|
46
|
-
readonly key?: string
|
44
|
+
readonly events: ReadonlyArray<EventDef.AnyWithoutFn> | Record<string, EventDef.AnyWithoutFn>
|
45
|
+
readonly state: State
|
47
46
|
}
|
48
47
|
|
49
48
|
export const makeSchema = <TInputSchema extends InputSchema>(
|
50
|
-
/** Note when using the object-notation for tables/
|
49
|
+
/** Note when using the object-notation for tables/events, the object keys are ignored and not used as table/mutation names */
|
51
50
|
inputSchema: TInputSchema & {
|
52
51
|
/** "hard-reset" is currently the default strategy */
|
53
|
-
migrations?: MigrationOptions
|
52
|
+
migrations?: MigrationOptions
|
54
53
|
},
|
55
54
|
): FromInputSchema.DeriveSchema<TInputSchema> => {
|
56
|
-
const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
|
57
|
-
|
58
|
-
|
55
|
+
// const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
|
56
|
+
// ? inputSchema.tables
|
57
|
+
// : Object.values(inputSchema.tables)
|
59
58
|
|
60
|
-
const
|
59
|
+
// const inputTables = []
|
61
60
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
}
|
61
|
+
// const tables = new Map<string, TableDef>()
|
62
|
+
|
63
|
+
// for (const tableDef of inputTables) {
|
64
|
+
// // TODO validate tables (e.g. index names are unique)
|
65
|
+
// if (tables.has(tableDef.sqliteDef.ast.name)) {
|
66
|
+
// shouldNeverHappen(`Duplicate table name: ${tableDef.sqliteDef.ast.name}. Please use unique names for tables.`)
|
67
|
+
// }
|
68
|
+
// tables.set(tableDef.sqliteDef.ast.name, tableDef)
|
69
|
+
// }
|
70
|
+
|
71
|
+
const state = inputSchema.state
|
72
|
+
const tables = inputSchema.state.tables
|
69
73
|
|
70
74
|
for (const tableDef of systemTables) {
|
71
|
-
// @ts-expect-error TODO fix type level issue
|
75
|
+
// // @ts-expect-error TODO fix type level issue
|
72
76
|
tables.set(tableDef.sqliteDef.name, tableDef)
|
73
77
|
}
|
74
78
|
|
75
|
-
const
|
76
|
-
map: new Map(),
|
77
|
-
wasProvided: inputSchema.mutations !== undefined,
|
78
|
-
}
|
79
|
+
const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
|
79
80
|
|
80
|
-
if (isReadonlyArray(inputSchema.
|
81
|
-
for (const
|
82
|
-
|
81
|
+
if (isReadonlyArray(inputSchema.events)) {
|
82
|
+
for (const eventDef of inputSchema.events) {
|
83
|
+
eventsDefsMap.set(eventDef.name, eventDef)
|
83
84
|
}
|
84
85
|
} else {
|
85
|
-
for (const
|
86
|
-
if (
|
87
|
-
shouldNeverHappen(`Duplicate
|
86
|
+
for (const eventDef of Object.values(inputSchema.events ?? {})) {
|
87
|
+
if (eventsDefsMap.has(eventDef.name)) {
|
88
|
+
shouldNeverHappen(`Duplicate event name: ${eventDef.name}. Please use unique names for events.`)
|
88
89
|
}
|
89
|
-
|
90
|
+
eventsDefsMap.set(eventDef.name, eventDef)
|
90
91
|
}
|
91
92
|
}
|
92
93
|
|
93
|
-
|
94
|
+
eventsDefsMap.set(rawSqlEvent.name, rawSqlEvent)
|
94
95
|
|
95
96
|
for (const tableDef of tables.values()) {
|
96
|
-
if (
|
97
|
-
|
98
|
-
mutations.map.set(derivedMutationDefs.insert.name, derivedMutationDefs.insert)
|
99
|
-
mutations.map.set(derivedMutationDefs.update.name, derivedMutationDefs.update)
|
100
|
-
mutations.map.set(derivedMutationDefs.delete.name, derivedMutationDefs.delete)
|
97
|
+
if (tableIsClientDocumentTable(tableDef) && eventsDefsMap.has(tableDef.set.name) === false) {
|
98
|
+
eventsDefsMap.set(tableDef.set.name, tableDef.set)
|
101
99
|
}
|
102
100
|
}
|
103
101
|
|
@@ -109,27 +107,39 @@ export const makeSchema = <TInputSchema extends InputSchema>(
|
|
109
107
|
return {
|
110
108
|
_Type: LiveStoreSchemaSymbol,
|
111
109
|
_DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
|
112
|
-
|
113
|
-
tables,
|
114
|
-
|
115
|
-
|
110
|
+
_EventDefMapType: Symbol.for('livestore.EventDefMapType') as any,
|
111
|
+
// tables,
|
112
|
+
// events,
|
113
|
+
state,
|
114
|
+
tables: state.tables,
|
115
|
+
eventsDefsMap,
|
116
|
+
migrationOptions: inputSchema.migrations ?? { strategy: 'from-eventlog' },
|
116
117
|
hash,
|
117
118
|
} satisfies LiveStoreSchema
|
118
119
|
}
|
119
120
|
|
120
|
-
export const
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
121
|
+
export const getEventDef = <TSchema extends LiveStoreSchema>(
|
122
|
+
schema: TSchema,
|
123
|
+
eventName: string,
|
124
|
+
): {
|
125
|
+
eventDef: EventDef.AnyWithoutFn
|
126
|
+
materializer: Materializer
|
127
|
+
} => {
|
128
|
+
const eventDef = schema.eventsDefsMap.get(eventName)
|
129
|
+
if (eventDef === undefined) {
|
130
|
+
return shouldNeverHappen(`No mutation definition found for \`${eventName}\`.`)
|
131
|
+
}
|
132
|
+
const materializer = schema.state.materializers.get(eventName)
|
133
|
+
if (materializer === undefined) {
|
134
|
+
return shouldNeverHappen(`No materializer found for \`${eventName}\`.`)
|
125
135
|
}
|
126
|
-
return
|
136
|
+
return { eventDef, materializer }
|
127
137
|
}
|
128
138
|
|
129
139
|
export namespace FromInputSchema {
|
130
140
|
export type DeriveSchema<TInputSchema extends InputSchema> = LiveStoreSchema<
|
131
|
-
DbSchemaFromInputSchemaTables<TInputSchema['tables']>,
|
132
|
-
|
141
|
+
DbSchemaFromInputSchemaTables<TInputSchema['state']['tables']>,
|
142
|
+
EventDefRecordFromInputSchemaEvents<TInputSchema['events']>
|
133
143
|
>
|
134
144
|
|
135
145
|
/**
|
@@ -137,17 +147,17 @@ export namespace FromInputSchema {
|
|
137
147
|
* - array: we use the table name of each array item (= table definition) as the object key
|
138
148
|
* - object: we discard the keys of the input object and use the table name of each object value (= table definition) as the new object key
|
139
149
|
*/
|
140
|
-
type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> =
|
150
|
+
type DbSchemaFromInputSchemaTables<TTables extends InputSchema['state']['tables']> =
|
141
151
|
TTables extends ReadonlyArray<TableDef>
|
142
152
|
? { [K in TTables[number] as K['sqliteDef']['name']]: K['sqliteDef'] }
|
143
153
|
: TTables extends Record<string, TableDef>
|
144
154
|
? { [K in keyof TTables as TTables[K]['sqliteDef']['name']]: TTables[K]['sqliteDef'] }
|
145
155
|
: never
|
146
156
|
|
147
|
-
type
|
148
|
-
|
149
|
-
? { [K in
|
150
|
-
:
|
151
|
-
? { [K in keyof
|
157
|
+
type EventDefRecordFromInputSchemaEvents<TEvents extends InputSchema['events']> =
|
158
|
+
TEvents extends ReadonlyArray<EventDef.Any>
|
159
|
+
? { [K in TEvents[number] as K['name']]: K } & { 'livestore.RawSql': RawSqlEvent }
|
160
|
+
: TEvents extends { [name: string]: EventDef.Any }
|
161
|
+
? { [K in keyof TEvents as TEvents[K]['name']]: TEvents[K] } & { 'livestore.RawSql': RawSqlEvent }
|
152
162
|
: never
|
153
163
|
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
2
|
+
|
3
|
+
import { ClientDocumentTableDefSymbol, tableIsClientDocumentTable } from './client-document-def.js'
|
4
|
+
import { type Materializer, rawSqlEvent, rawSqlMaterializer } from './EventDef.js'
|
5
|
+
import type { State } from './schema.js'
|
6
|
+
import { systemTables } from './system-tables.js'
|
7
|
+
import { type TableDef, type TableDefBase } from './table-def.js'
|
8
|
+
|
9
|
+
export * from './table-def.js'
|
10
|
+
export {
|
11
|
+
ClientDocumentTableDefSymbol,
|
12
|
+
tableIsClientDocumentTable,
|
13
|
+
clientDocument,
|
14
|
+
type ClientDocumentTableDef,
|
15
|
+
type ClientDocumentTableOptions,
|
16
|
+
} from './client-document-def.js'
|
17
|
+
export * from './EventDef.js'
|
18
|
+
|
19
|
+
export const makeState = <TStateInput extends InputState>(inputSchema: TStateInput): State => {
|
20
|
+
const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
|
21
|
+
? inputSchema.tables
|
22
|
+
: Object.values(inputSchema.tables)
|
23
|
+
|
24
|
+
const tables = new Map<string, TableDef.Any>()
|
25
|
+
|
26
|
+
for (const tableDef of inputTables) {
|
27
|
+
const sqliteDef = tableDef.sqliteDef
|
28
|
+
// TODO validate tables (e.g. index names are unique)
|
29
|
+
if (tables.has(sqliteDef.ast.name)) {
|
30
|
+
shouldNeverHappen(`Duplicate table name: ${sqliteDef.ast.name}. Please use unique names for tables.`)
|
31
|
+
}
|
32
|
+
tables.set(sqliteDef.ast.name, tableDef)
|
33
|
+
}
|
34
|
+
|
35
|
+
for (const tableDef of systemTables) {
|
36
|
+
tables.set(tableDef.sqliteDef.name, tableDef)
|
37
|
+
}
|
38
|
+
|
39
|
+
const materializers = new Map<string, Materializer<any>>()
|
40
|
+
|
41
|
+
for (const [name, materializer] of Object.entries(inputSchema.materializers)) {
|
42
|
+
materializers.set(name, materializer)
|
43
|
+
}
|
44
|
+
|
45
|
+
materializers.set(rawSqlEvent.name, rawSqlMaterializer)
|
46
|
+
|
47
|
+
for (const tableDef of inputTables) {
|
48
|
+
if (tableIsClientDocumentTable(tableDef)) {
|
49
|
+
materializers.set(
|
50
|
+
tableDef[ClientDocumentTableDefSymbol].derived.setEventDef.name,
|
51
|
+
tableDef[ClientDocumentTableDefSymbol].derived.setMaterializer,
|
52
|
+
)
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
return { tables, materializers }
|
57
|
+
}
|
58
|
+
|
59
|
+
export type InputState = {
|
60
|
+
readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
|
61
|
+
readonly materializers: Record<string, Materializer<any>>
|
62
|
+
}
|
@@ -2,40 +2,37 @@ import { Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
3
3
|
import { SqliteDsl } from './db-schema/mod.js'
|
4
4
|
import * as EventId from './EventId.js'
|
5
|
-
import type { FromTable } from './table-def.js'
|
6
5
|
import { table } from './table-def.js'
|
7
6
|
|
8
|
-
///
|
7
|
+
/// Read model DB
|
9
8
|
|
10
9
|
export const SCHEMA_META_TABLE = '__livestore_schema'
|
11
10
|
|
12
|
-
export const schemaMetaTable = table(
|
13
|
-
SCHEMA_META_TABLE,
|
14
|
-
{
|
11
|
+
export const schemaMetaTable = table({
|
12
|
+
name: SCHEMA_META_TABLE,
|
13
|
+
columns: {
|
15
14
|
tableName: SqliteDsl.text({ primaryKey: true }),
|
16
15
|
schemaHash: SqliteDsl.integer({ nullable: false }),
|
17
16
|
/** ISO date format */
|
18
17
|
updatedAt: SqliteDsl.text({ nullable: false }),
|
19
18
|
},
|
20
|
-
|
21
|
-
)
|
19
|
+
})
|
22
20
|
|
23
|
-
export type SchemaMetaRow =
|
21
|
+
export type SchemaMetaRow = typeof schemaMetaTable.Type
|
24
22
|
|
25
|
-
export const
|
23
|
+
export const SCHEMA_EVENT_DEFS_META_TABLE = '__livestore_schema_event_defs'
|
26
24
|
|
27
|
-
export const
|
28
|
-
|
29
|
-
{
|
30
|
-
|
25
|
+
export const schemaEventDefsMetaTable = table({
|
26
|
+
name: SCHEMA_EVENT_DEFS_META_TABLE,
|
27
|
+
columns: {
|
28
|
+
eventName: SqliteDsl.text({ primaryKey: true }),
|
31
29
|
schemaHash: SqliteDsl.integer({ nullable: false }),
|
32
30
|
/** ISO date format */
|
33
31
|
updatedAt: SqliteDsl.text({ nullable: false }),
|
34
32
|
},
|
35
|
-
|
36
|
-
)
|
33
|
+
})
|
37
34
|
|
38
|
-
export type
|
35
|
+
export type SchemaEventDefsMetaRow = typeof schemaEventDefsMetaTable.Type
|
39
36
|
|
40
37
|
/**
|
41
38
|
* Table which stores SQLite changeset blobs which is used for rolling back
|
@@ -43,84 +40,76 @@ export type SchemaMutationsMetaRow = FromTable.RowDecoded<typeof schemaMutations
|
|
43
40
|
*/
|
44
41
|
export const SESSION_CHANGESET_META_TABLE = '__livestore_session_changeset'
|
45
42
|
|
46
|
-
export const sessionChangesetMetaTable = table(
|
47
|
-
SESSION_CHANGESET_META_TABLE,
|
48
|
-
{
|
43
|
+
export const sessionChangesetMetaTable = table({
|
44
|
+
name: SESSION_CHANGESET_META_TABLE,
|
45
|
+
columns: {
|
49
46
|
// TODO bring back primary key
|
50
47
|
idGlobal: SqliteDsl.integer({ schema: EventId.GlobalEventId }),
|
51
48
|
idClient: SqliteDsl.integer({ schema: EventId.ClientEventId }),
|
52
49
|
changeset: SqliteDsl.blob({ nullable: true }),
|
53
50
|
debug: SqliteDsl.json({ nullable: true }),
|
54
51
|
},
|
55
|
-
{
|
56
|
-
|
57
|
-
indexes: [{ columns: ['idGlobal', 'idClient'], name: 'idx_session_changeset_id' }],
|
58
|
-
},
|
59
|
-
)
|
52
|
+
indexes: [{ columns: ['idGlobal', 'idClient'], name: 'idx_session_changeset_id' }],
|
53
|
+
})
|
60
54
|
|
61
|
-
export type SessionChangesetMetaRow =
|
55
|
+
export type SessionChangesetMetaRow = typeof sessionChangesetMetaTable.Type
|
62
56
|
|
63
57
|
export const LEADER_MERGE_COUNTER_TABLE = '__livestore_leader_merge_counter'
|
64
58
|
|
65
|
-
export const leaderMergeCounterTable = table(
|
66
|
-
LEADER_MERGE_COUNTER_TABLE,
|
67
|
-
{
|
59
|
+
export const leaderMergeCounterTable = table({
|
60
|
+
name: LEADER_MERGE_COUNTER_TABLE,
|
61
|
+
columns: {
|
68
62
|
id: SqliteDsl.integer({ primaryKey: true, schema: Schema.Literal(0) }),
|
69
63
|
mergeCounter: SqliteDsl.integer({ primaryKey: true }),
|
70
64
|
},
|
71
|
-
|
72
|
-
)
|
65
|
+
})
|
73
66
|
|
74
|
-
export type LeaderMergeCounterRow =
|
67
|
+
export type LeaderMergeCounterRow = typeof leaderMergeCounterTable.Type
|
75
68
|
|
76
69
|
export const systemTables = [
|
77
70
|
schemaMetaTable,
|
78
|
-
|
71
|
+
schemaEventDefsMetaTable,
|
79
72
|
sessionChangesetMetaTable,
|
80
73
|
leaderMergeCounterTable,
|
81
74
|
]
|
82
75
|
|
83
|
-
///
|
76
|
+
/// Eventlog DB
|
84
77
|
|
85
78
|
export const SyncStatus = Schema.Literal('synced', 'pending', 'error', 'clientOnly')
|
86
79
|
export type SyncStatus = typeof SyncStatus.Type
|
87
80
|
|
88
|
-
export const
|
81
|
+
export const EVENTLOG_META_TABLE = 'eventlog'
|
89
82
|
|
90
|
-
export const
|
91
|
-
|
92
|
-
{
|
83
|
+
export const eventlogMetaTable = table({
|
84
|
+
name: EVENTLOG_META_TABLE,
|
85
|
+
columns: {
|
93
86
|
// TODO Adjust modeling so a global event never needs a client id component
|
94
87
|
idGlobal: SqliteDsl.integer({ primaryKey: true, schema: EventId.GlobalEventId }),
|
95
88
|
idClient: SqliteDsl.integer({ primaryKey: true, schema: EventId.ClientEventId }),
|
96
89
|
parentIdGlobal: SqliteDsl.integer({ schema: EventId.GlobalEventId }),
|
97
90
|
parentIdClient: SqliteDsl.integer({ schema: EventId.ClientEventId }),
|
98
|
-
|
91
|
+
name: SqliteDsl.text({}),
|
99
92
|
argsJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Any) }),
|
100
93
|
clientId: SqliteDsl.text({}),
|
101
94
|
sessionId: SqliteDsl.text({}),
|
102
95
|
schemaHash: SqliteDsl.integer({}),
|
103
96
|
syncMetadataJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Option(Schema.JsonValue)) }),
|
104
97
|
},
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
],
|
111
|
-
},
|
112
|
-
)
|
98
|
+
indexes: [
|
99
|
+
{ columns: ['idGlobal'], name: 'idx_eventlog_idGlobal' },
|
100
|
+
{ columns: ['idGlobal', 'idClient'], name: 'idx_eventlog_id' },
|
101
|
+
],
|
102
|
+
})
|
113
103
|
|
114
|
-
export type
|
104
|
+
export type EventlogMetaRow = typeof eventlogMetaTable.Type
|
115
105
|
|
116
106
|
export const SYNC_STATUS_TABLE = '__livestore_sync_status'
|
117
107
|
|
118
|
-
export const syncStatusTable = table(
|
119
|
-
SYNC_STATUS_TABLE,
|
120
|
-
{
|
108
|
+
export const syncStatusTable = table({
|
109
|
+
name: SYNC_STATUS_TABLE,
|
110
|
+
columns: {
|
121
111
|
head: SqliteDsl.integer({ primaryKey: true }),
|
122
112
|
},
|
123
|
-
|
124
|
-
)
|
113
|
+
})
|
125
114
|
|
126
|
-
export type SyncStatusRow =
|
115
|
+
export type SyncStatusRow = typeof syncStatusTable.Type
|