@livestore/common 0.3.0-dev.3 → 0.3.0-dev.31
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 +128 -68
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +36 -7
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/debug-info.d.ts +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 +389 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +96 -0
- package/dist/devtools/devtools-messages-client-session.js.map +1 -0
- package/dist/devtools/devtools-messages-common.d.ts +68 -0
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-common.js +60 -0
- package/dist/devtools/devtools-messages-common.js.map +1 -0
- package/dist/devtools/devtools-messages-leader.d.ts +394 -0
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-leader.js +147 -0
- package/dist/devtools/devtools-messages-leader.js.map +1 -0
- package/dist/devtools/devtools-messages.d.ts +3 -592
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -171
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +28 -0
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
- package/dist/devtools/devtools-sessioninfo.js +34 -0
- package/dist/devtools/devtools-sessioninfo.js.map +1 -0
- package/dist/devtools/mod.d.ts +39 -0
- package/dist/devtools/mod.d.ts.map +1 -0
- package/dist/devtools/mod.js +27 -0
- package/dist/devtools/mod.js.map +1 -0
- package/dist/index.d.ts +4 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -7
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +62 -0
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
- package/dist/leader-thread/LeaderSyncProcessor.js +589 -0
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
- package/dist/leader-thread/apply-event.d.ts +16 -0
- 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/connection.d.ts +34 -6
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +22 -7
- package/dist/leader-thread/connection.js.map +1 -1
- 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.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +154 -132
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +26 -12
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +82 -47
- 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 +4 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +35 -25
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -5
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -4
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/types.d.ts +86 -39
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +1 -3
- package/dist/leader-thread/types.js.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/otel.d.ts +2 -0
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/query-builder/api.d.ts +158 -55
- 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 +7 -0
- package/dist/query-builder/astToSql.d.ts.map +1 -0
- package/dist/query-builder/astToSql.js +190 -0
- package/dist/query-builder/astToSql.js.map +1 -0
- package/dist/query-builder/impl.d.ts +3 -8
- package/dist/query-builder/impl.d.ts.map +1 -1
- package/dist/query-builder/impl.js +166 -124
- 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 +411 -69
- package/dist/query-builder/impl.test.js.map +1 -1
- package/dist/query-builder/mod.d.ts +7 -0
- package/dist/query-builder/mod.d.ts.map +1 -1
- package/dist/query-builder/mod.js +7 -0
- package/dist/query-builder/mod.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-eventlog.js +65 -0
- 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 +35 -15
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +57 -11
- package/dist/schema/EventId.js.map +1 -1
- package/dist/schema/EventId.test.d.ts +2 -0
- package/dist/schema/EventId.test.d.ts.map +1 -0
- package/dist/schema/EventId.test.js +11 -0
- package/dist/schema/EventId.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent.d.ts +255 -0
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent.js +118 -0
- 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/ast/sqlite.d.ts +69 -0
- package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
- package/dist/schema/db-schema/ast/sqlite.js +71 -0
- package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
- package/dist/schema/db-schema/ast/validate.d.ts +3 -0
- package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
- package/dist/schema/db-schema/ast/validate.js +12 -0
- package/dist/schema/db-schema/ast/validate.js.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
- package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.js +87 -0
- package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
- package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
- package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
- package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
- package/dist/schema/db-schema/dsl/mod.d.ts +90 -0
- package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
- package/dist/schema/db-schema/dsl/mod.js +41 -0
- package/dist/schema/db-schema/dsl/mod.js.map +1 -0
- package/dist/schema/db-schema/hash.d.ts +2 -0
- package/dist/schema/db-schema/hash.d.ts.map +1 -0
- package/dist/schema/db-schema/hash.js +14 -0
- package/dist/schema/db-schema/hash.js.map +1 -0
- package/dist/schema/db-schema/mod.d.ts +3 -0
- package/dist/schema/db-schema/mod.d.ts.map +1 -0
- package/dist/schema/db-schema/mod.js +3 -0
- package/dist/schema/db-schema/mod.js.map +1 -0
- 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 +5 -3
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -3
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema-helpers.d.ts.map +1 -1
- package/dist/schema/schema-helpers.js +1 -1
- package/dist/schema/schema-helpers.js.map +1 -1
- package/dist/schema/schema.d.ts +30 -23
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +48 -35
- 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 +179 -125
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/system-tables.js +76 -41
- package/dist/schema/system-tables.js.map +1 -1
- package/dist/schema/table-def.d.ts +37 -109
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +23 -66
- 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 +7 -7
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +6 -6
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +19 -14
- 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/sql-queries/misc.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sql-queries/types.d.ts +2 -1
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +66 -0
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
- package/dist/sync/ClientSessionSyncProcessor.js +209 -0
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/next/compact-events.d.ts.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 +3 -3
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +6 -7
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +4 -2
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +2 -2
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +10 -8
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +11 -8
- 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 +76 -76
- 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} +67 -36
- 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 +55 -20
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +7 -3
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +213 -82
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +319 -120
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +295 -275
- 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 +2 -2
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/util.d.ts +2 -2
- package/dist/util.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +111 -74
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +141 -0
- package/src/devtools/devtools-messages-common.ts +115 -0
- package/src/devtools/devtools-messages-leader.ts +191 -0
- package/src/devtools/devtools-messages.ts +3 -243
- package/src/devtools/devtools-sessioninfo.ts +99 -0
- package/src/devtools/mod.ts +36 -0
- package/src/index.ts +4 -13
- package/src/leader-thread/LeaderSyncProcessor.ts +935 -0
- package/src/leader-thread/apply-event.ts +173 -0
- package/src/leader-thread/connection.ts +54 -9
- package/src/leader-thread/eventlog.ts +199 -0
- package/src/leader-thread/leader-worker-devtools.ts +212 -189
- package/src/leader-thread/make-leader-thread-layer.ts +143 -77
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +41 -30
- package/src/leader-thread/shutdown-channel.ts +2 -4
- package/src/leader-thread/types.ts +95 -51
- package/src/materializer-helper.ts +110 -0
- package/src/otel.ts +8 -0
- package/src/query-builder/api.ts +236 -85
- package/src/query-builder/astToSql.ts +232 -0
- package/src/query-builder/impl.test.ts +447 -78
- package/src/query-builder/impl.ts +209 -144
- package/src/query-builder/mod.ts +7 -0
- package/src/rehydrate-from-eventlog.ts +114 -0
- package/src/schema/EventDef.ts +216 -0
- package/src/schema/EventId.test.ts +12 -0
- package/src/schema/EventId.ts +75 -15
- package/src/schema/LiveStoreEvent.ts +239 -0
- package/src/schema/client-document-def.test.ts +239 -0
- package/src/schema/client-document-def.ts +444 -0
- package/src/schema/db-schema/ast/sqlite.ts +142 -0
- package/src/schema/db-schema/ast/validate.ts +13 -0
- package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
- package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
- package/src/schema/db-schema/dsl/field-defs.ts +242 -0
- package/src/schema/db-schema/dsl/mod.ts +222 -0
- package/src/schema/db-schema/hash.ts +14 -0
- package/src/schema/db-schema/mod.ts +2 -0
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +5 -3
- package/src/schema/schema-helpers.ts +1 -1
- package/src/schema/schema.ts +84 -62
- package/src/schema/sqlite-state.ts +62 -0
- package/src/schema/system-tables.ts +68 -50
- package/src/schema/table-def.ts +68 -214
- package/src/schema/view.ts +2 -0
- package/src/schema-management/common.ts +7 -7
- package/src/schema-management/migrations.ts +27 -24
- package/src/schema-management/validate-mutation-defs.ts +22 -24
- package/src/sql-queries/sql-queries.ts +1 -1
- package/src/sql-queries/sql-query-builder.ts +1 -2
- package/src/sql-queries/types.ts +3 -1
- package/src/sync/ClientSessionSyncProcessor.ts +332 -0
- package/src/sync/index.ts +1 -1
- package/src/sync/next/facts.ts +32 -33
- package/src/sync/next/history-dag-common.ts +9 -5
- package/src/sync/next/history-dag.ts +2 -2
- package/src/sync/next/rebase-events.ts +22 -16
- package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
- package/src/sync/next/test/compact-events.test.ts +78 -78
- package/src/sync/next/test/event-fixtures.ts +219 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +51 -19
- package/src/sync/syncstate.test.ts +335 -308
- package/src/sync/syncstate.ts +394 -212
- package/src/sync/validate-push-payload.ts +7 -4
- package/src/version.ts +1 -1
- package/tmp/pack.tgz +0 -0
- package/tsconfig.json +2 -1
- 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/devtools/devtools-bridge.d.ts +0 -12
- package/dist/devtools/devtools-bridge.d.ts.map +0 -1
- package/dist/devtools/devtools-bridge.js +0 -2
- package/dist/devtools/devtools-bridge.js.map +0 -1
- package/dist/devtools/index.d.ts +0 -42
- package/dist/devtools/index.d.ts.map +0 -1
- package/dist/devtools/index.js +0 -48
- package/dist/devtools/index.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 +0 -8
- package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
- package/dist/leader-thread/apply-mutation.js +0 -95
- package/dist/leader-thread/apply-mutation.js.map +0 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
- package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
- package/dist/leader-thread/leader-sync-processor.js +0 -422
- package/dist/leader-thread/leader-sync-processor.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -23
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -27
- 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 -39
- package/dist/leader-thread/pull-queue-set.js.map +0 -1
- package/dist/mutation.d.ts +0 -13
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -57
- package/dist/mutation.js.map +0 -1
- package/dist/query-info.d.ts +0 -38
- 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 -14
- package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
- package/dist/rehydrate-from-mutationlog.js +0 -72
- package/dist/rehydrate-from-mutationlog.js.map +0 -1
- package/dist/schema/MutationEvent.d.ts +0 -191
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js +0 -56
- package/dist/schema/MutationEvent.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -107
- 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/client-session-sync-processor.d.ts +0 -45
- package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
- package/dist/sync/client-session-sync-processor.js +0 -131
- package/dist/sync/client-session-sync-processor.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 -166
- package/src/devtools/devtools-bridge.ts +0 -13
- package/src/devtools/index.ts +0 -48
- package/src/init-singleton-tables.ts +0 -24
- package/src/leader-thread/apply-mutation.ts +0 -143
- package/src/leader-thread/leader-sync-processor.ts +0 -666
- package/src/leader-thread/mutationlog.ts +0 -42
- package/src/leader-thread/pull-queue-set.ts +0 -58
- package/src/mutation.ts +0 -81
- package/src/query-info.ts +0 -78
- package/src/rehydrate-from-mutationlog.ts +0 -127
- package/src/schema/MutationEvent.ts +0 -161
- package/src/schema/mutations.ts +0 -192
- package/src/sync/client-session-sync-processor.ts +0 -207
- package/src/sync/next/test/mutation-fixtures.ts +0 -231
@@ -0,0 +1,222 @@
|
|
1
|
+
import type { Nullable } from '@livestore/utils'
|
2
|
+
import type { Option, Types } from '@livestore/utils/effect'
|
3
|
+
import { Schema } from '@livestore/utils/effect'
|
4
|
+
|
5
|
+
import type * as SqliteAst from '../ast/sqlite.js'
|
6
|
+
import type { ColumnDefinition } from './field-defs.js'
|
7
|
+
|
8
|
+
export * from './field-defs.js'
|
9
|
+
|
10
|
+
export type DbSchema = {
|
11
|
+
[key: string]: TableDefinition<string, Columns>
|
12
|
+
}
|
13
|
+
|
14
|
+
/** Note when using the object-notation, the object keys are ignored and not used as table names */
|
15
|
+
export type DbSchemaInput = Record<string, TableDefinition<any, any>> | ReadonlyArray<TableDefinition<any, any>>
|
16
|
+
|
17
|
+
/**
|
18
|
+
* In case of ...
|
19
|
+
* - array: we use the table name of each array item (= table definition) as the object key
|
20
|
+
* - 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
|
21
|
+
*/
|
22
|
+
export type DbSchemaFromInputSchema<TSchemaInput extends DbSchemaInput> =
|
23
|
+
TSchemaInput extends ReadonlyArray<TableDefinition<any, any>>
|
24
|
+
? { [K in TSchemaInput[number] as K['name']]: K }
|
25
|
+
: TSchemaInput extends Record<string, TableDefinition<any, any>>
|
26
|
+
? { [K in keyof TSchemaInput as TSchemaInput[K]['name']]: TSchemaInput[K] }
|
27
|
+
: never
|
28
|
+
|
29
|
+
// TODO ensure via runtime check (possibly even via type-level check) that all index names are unique
|
30
|
+
export const makeDbSchema = <TDbSchemaInput extends DbSchemaInput>(
|
31
|
+
schema: TDbSchemaInput,
|
32
|
+
): DbSchemaFromInputSchema<TDbSchemaInput> => {
|
33
|
+
return Array.isArray(schema) ? Object.fromEntries(schema.map((_) => [_.name, _])) : (schema as any)
|
34
|
+
}
|
35
|
+
|
36
|
+
export const table = <TTableName extends string, TColumns extends Columns, TIndexes extends Index[]>(
|
37
|
+
name: TTableName,
|
38
|
+
columns: TColumns,
|
39
|
+
indexes?: TIndexes,
|
40
|
+
): TableDefinition<TTableName, TColumns> => {
|
41
|
+
const ast: SqliteAst.Table = {
|
42
|
+
_tag: 'table',
|
43
|
+
name,
|
44
|
+
columns: columsToAst(columns),
|
45
|
+
indexes: indexesToAst(indexes ?? []),
|
46
|
+
}
|
47
|
+
|
48
|
+
return { name, columns, indexes, ast }
|
49
|
+
}
|
50
|
+
|
51
|
+
export type AnyIfConstained<In, Out> = '__constrained' extends keyof In ? any : Out
|
52
|
+
export type EmptyObjIfConstained<In> = '__constrained' extends keyof In ? {} : In
|
53
|
+
|
54
|
+
export type StructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Schema<
|
55
|
+
AnyIfConstained<TCols, FromColumns.RowDecoded<TCols>>,
|
56
|
+
AnyIfConstained<TCols, FromColumns.RowEncoded<TCols>>
|
57
|
+
>
|
58
|
+
|
59
|
+
export type InsertStructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Schema<
|
60
|
+
AnyIfConstained<TCols, FromColumns.InsertRowDecoded<TCols>>,
|
61
|
+
AnyIfConstained<TCols, FromColumns.InsertRowEncoded<TCols>>
|
62
|
+
>
|
63
|
+
|
64
|
+
export const structSchemaForTable = <TTableDefinition extends TableDefinition<any, any>>(
|
65
|
+
tableDef: TTableDefinition,
|
66
|
+
): StructSchemaForColumns<TTableDefinition['columns']> =>
|
67
|
+
Schema.Struct(Object.fromEntries(tableDef.ast.columns.map((column) => [column.name, column.schema]))).annotations({
|
68
|
+
title: tableDef.name,
|
69
|
+
}) as any
|
70
|
+
|
71
|
+
export const insertStructSchemaForTable = <TTableDefinition extends TableDefinition<any, any>>(
|
72
|
+
tableDef: TTableDefinition,
|
73
|
+
): InsertStructSchemaForColumns<TTableDefinition['columns']> =>
|
74
|
+
Schema.Struct(
|
75
|
+
Object.fromEntries(
|
76
|
+
tableDef.ast.columns.map((column) => [
|
77
|
+
column.name,
|
78
|
+
column.nullable === true || column.default._tag === 'Some' ? Schema.optional(column.schema) : column.schema,
|
79
|
+
]),
|
80
|
+
),
|
81
|
+
).annotations({
|
82
|
+
title: tableDef.name,
|
83
|
+
}) as any
|
84
|
+
|
85
|
+
const columsToAst = (columns: Columns): ReadonlyArray<SqliteAst.Column> => {
|
86
|
+
return Object.entries(columns).map(([name, column]) => {
|
87
|
+
return {
|
88
|
+
_tag: 'column',
|
89
|
+
name,
|
90
|
+
schema: column.schema,
|
91
|
+
default: column.default as any,
|
92
|
+
nullable: column.nullable ?? false,
|
93
|
+
primaryKey: column.primaryKey ?? false,
|
94
|
+
type: { _tag: column.columnType },
|
95
|
+
} satisfies SqliteAst.Column
|
96
|
+
})
|
97
|
+
}
|
98
|
+
|
99
|
+
const indexesToAst = (indexes: ReadonlyArray<Index>): ReadonlyArray<SqliteAst.Index> => {
|
100
|
+
return indexes.map(
|
101
|
+
(_) => ({ _tag: 'index', columns: _.columns, name: _.name, unique: _.isUnique ?? false }) satisfies SqliteAst.Index,
|
102
|
+
)
|
103
|
+
}
|
104
|
+
|
105
|
+
/// Other
|
106
|
+
|
107
|
+
export type TableDefinition<TName extends string, TColumns extends Columns> = {
|
108
|
+
name: TName
|
109
|
+
columns: TColumns
|
110
|
+
indexes?: ReadonlyArray<Index>
|
111
|
+
ast: SqliteAst.Table
|
112
|
+
}
|
113
|
+
|
114
|
+
export type Columns = Record<string, ColumnDefinition<any, any>>
|
115
|
+
|
116
|
+
export type IsSingleColumn<TColumns extends Columns | ColumnDefinition<any, any>> =
|
117
|
+
TColumns extends ColumnDefinition<any, any> ? true : false
|
118
|
+
|
119
|
+
/**
|
120
|
+
* NOTE this is only needed to avoid a TS limitation where `StructSchemaForColumns` in the default case
|
121
|
+
* results in `Record<string, any>` instead of `any`. (Thanks to Andarist for the workaround)
|
122
|
+
*
|
123
|
+
* Hopefully this can be removed in the future
|
124
|
+
*/
|
125
|
+
export type ConstraintColumns = Record<string, ColumnDefinition<any, any>> & { __constrained?: never }
|
126
|
+
|
127
|
+
export type Index = {
|
128
|
+
name: string
|
129
|
+
columns: ReadonlyArray<string>
|
130
|
+
/** @default false */
|
131
|
+
isUnique?: boolean
|
132
|
+
}
|
133
|
+
|
134
|
+
export namespace FromTable {
|
135
|
+
// TODO this sometimes doesn't preserve the order of columns
|
136
|
+
export type RowDecoded<TTableDefinition extends TableDefinition<any, any>> = Types.Simplify<
|
137
|
+
Nullable<Pick<RowDecodedAll<TTableDefinition>, NullableColumnNames<TTableDefinition>>> &
|
138
|
+
Omit<RowDecodedAll<TTableDefinition>, NullableColumnNames<TTableDefinition>>
|
139
|
+
>
|
140
|
+
|
141
|
+
export type NullableColumnNames<TTableDefinition extends TableDefinition<any, any>> = FromColumns.NullableColumnNames<
|
142
|
+
TTableDefinition['columns']
|
143
|
+
>
|
144
|
+
|
145
|
+
export type Columns<TTableDefinition extends TableDefinition<any, any>> = {
|
146
|
+
[K in keyof TTableDefinition['columns']]: TTableDefinition['columns'][K]['columnType']
|
147
|
+
}
|
148
|
+
|
149
|
+
export type RowEncodeNonNullable<TTableDefinition extends TableDefinition<any, any>> = {
|
150
|
+
[K in keyof TTableDefinition['columns']]: Schema.Schema.Encoded<TTableDefinition['columns'][K]['schema']>
|
151
|
+
}
|
152
|
+
|
153
|
+
export type RowEncoded<TTableDefinition extends TableDefinition<any, any>> = Types.Simplify<
|
154
|
+
Nullable<Pick<RowEncodeNonNullable<TTableDefinition>, NullableColumnNames<TTableDefinition>>> &
|
155
|
+
Omit<RowEncodeNonNullable<TTableDefinition>, NullableColumnNames<TTableDefinition>>
|
156
|
+
>
|
157
|
+
|
158
|
+
// export type RowEncoded<TTableDefinition extends TableDefinition<any, any>> = NullableColumnNames<
|
159
|
+
// TTableDefinition['columns']
|
160
|
+
// >
|
161
|
+
|
162
|
+
// &
|
163
|
+
// Omit<RowEncodeNonNullable<TTableDefinition>, NullableColumnNames<TTableDefinition['columns']>>
|
164
|
+
// >
|
165
|
+
|
166
|
+
export type RowDecodedAll<TTableDefinition extends TableDefinition<any, any>> = {
|
167
|
+
[K in keyof TTableDefinition['columns']]: Schema.Schema.Type<TTableDefinition['columns'][K]['schema']>
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
export namespace FromColumns {
|
172
|
+
// TODO this sometimes doesn't preserve the order of columns
|
173
|
+
export type RowDecoded<TColumns extends Columns> = Types.Simplify<
|
174
|
+
Nullable<Pick<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>> &
|
175
|
+
Omit<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>
|
176
|
+
>
|
177
|
+
|
178
|
+
export type RowDecodedAll<TColumns extends Columns> = {
|
179
|
+
readonly [K in keyof TColumns]: Schema.Schema.Type<TColumns[K]['schema']>
|
180
|
+
}
|
181
|
+
|
182
|
+
export type RowEncodedAll<TColumns extends Columns> = {
|
183
|
+
readonly [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
|
184
|
+
}
|
185
|
+
|
186
|
+
export type RowEncoded<TColumns extends Columns> = Types.Simplify<
|
187
|
+
Nullable<Pick<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>> &
|
188
|
+
Omit<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>
|
189
|
+
>
|
190
|
+
|
191
|
+
export type RowEncodeNonNullable<TColumns extends Columns> = {
|
192
|
+
readonly [K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
|
193
|
+
}
|
194
|
+
|
195
|
+
export type NullableColumnNames<TColumns extends Columns> = keyof {
|
196
|
+
// TODO double check why there is a `true` in the type
|
197
|
+
[K in keyof TColumns as TColumns[K] extends ColumnDefinition<any, true> ? K : never]: {}
|
198
|
+
}
|
199
|
+
|
200
|
+
export type RequiredInsertColumns<TColumns extends Columns> = {
|
201
|
+
[K in keyof TColumns as TColumns[K]['nullable'] extends true
|
202
|
+
? never
|
203
|
+
: TColumns[K]['default'] extends Option.Some<any>
|
204
|
+
? never
|
205
|
+
: K]: {}
|
206
|
+
}
|
207
|
+
|
208
|
+
export type RequiredInsertColumnNames<TColumns extends Columns> = keyof RequiredInsertColumns<TColumns>
|
209
|
+
|
210
|
+
export type RequiresInsertValues<TColumns extends Columns> =
|
211
|
+
RequiredInsertColumnNames<TColumns> extends never ? false : true
|
212
|
+
|
213
|
+
export type InsertRowDecoded<TColumns extends Columns> = Types.Simplify<
|
214
|
+
Pick<RowDecodedAll<TColumns>, RequiredInsertColumnNames<TColumns>> &
|
215
|
+
Partial<Omit<RowDecodedAll<TColumns>, RequiredInsertColumnNames<TColumns>>>
|
216
|
+
>
|
217
|
+
|
218
|
+
export type InsertRowEncoded<TColumns extends Columns> = Types.Simplify<
|
219
|
+
Pick<RowEncodedAll<TColumns>, RequiredInsertColumnNames<TColumns>> &
|
220
|
+
Partial<Omit<RowEncodedAll<TColumns>, RequiredInsertColumnNames<TColumns>>>
|
221
|
+
>
|
222
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// Based on https://stackoverflow.com/a/7616484
|
2
|
+
export const hashCode = (str: string) => {
|
3
|
+
let hash = 0,
|
4
|
+
i,
|
5
|
+
chr
|
6
|
+
if (str.length === 0) return hash
|
7
|
+
for (i = 0; i < str.length; i++) {
|
8
|
+
// eslint-disable-next-line unicorn/prefer-code-point
|
9
|
+
chr = str.charCodeAt(i)
|
10
|
+
hash = (hash << 5) - hash + chr
|
11
|
+
hash = Math.trunc(hash) // Convert to 32bit integer
|
12
|
+
}
|
13
|
+
return hash
|
14
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export { defineEvent, synced, clientOnly } from './EventDef.js'
|
package/src/schema/mod.ts
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
export * from './system-tables.js'
|
2
|
-
export
|
3
|
-
export * from './
|
2
|
+
export { SqliteAst, SqliteDsl } from './db-schema/mod.js'
|
3
|
+
export * from './EventDef.js'
|
4
4
|
export * from './schema-helpers.js'
|
5
5
|
export * from './schema.js'
|
6
|
-
export * as
|
6
|
+
export * as State from './view.js'
|
7
|
+
export * as LiveStoreEvent from './LiveStoreEvent.js'
|
7
8
|
export * as EventId from './EventId.js'
|
9
|
+
export * as Events from './events.js'
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import { SqliteDsl } from '@livestore/db-schema'
|
2
1
|
import { shouldNeverHappen } from '@livestore/utils'
|
3
2
|
import { pipe, ReadonlyRecord, Schema } from '@livestore/utils/effect'
|
4
3
|
|
4
|
+
import { SqliteDsl } from '../schema/db-schema/mod.js'
|
5
5
|
import type { TableDef, TableDefBase } from './table-def.js'
|
6
6
|
|
7
7
|
export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
|
package/src/schema/schema.ts
CHANGED
@@ -1,100 +1,101 @@
|
|
1
|
-
import type { SqliteDsl } from '@livestore/db-schema'
|
2
|
-
import { SqliteAst } from '@livestore/db-schema'
|
3
1
|
import { isReadonlyArray, shouldNeverHappen } from '@livestore/utils'
|
4
2
|
|
5
3
|
import type { MigrationOptions } from '../adapter-types.js'
|
6
|
-
import {
|
7
|
-
import {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
type RawSqlMutation,
|
12
|
-
rawSqlMutation,
|
13
|
-
} from './mutations.js'
|
4
|
+
import { tableIsClientDocumentTable } from './client-document-def.js'
|
5
|
+
import type { SqliteDsl } from './db-schema/mod.js'
|
6
|
+
import { SqliteAst } from './db-schema/mod.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
|
79
|
+
const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
|
76
80
|
|
77
|
-
if (isReadonlyArray(inputSchema.
|
78
|
-
for (const
|
79
|
-
|
81
|
+
if (isReadonlyArray(inputSchema.events)) {
|
82
|
+
for (const eventDef of inputSchema.events) {
|
83
|
+
eventsDefsMap.set(eventDef.name, eventDef)
|
80
84
|
}
|
81
85
|
} else {
|
82
|
-
for (const
|
83
|
-
if (
|
84
|
-
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.`)
|
85
89
|
}
|
86
|
-
|
90
|
+
eventsDefsMap.set(eventDef.name, eventDef)
|
87
91
|
}
|
88
92
|
}
|
89
93
|
|
90
|
-
|
94
|
+
eventsDefsMap.set(rawSqlEvent.name, rawSqlEvent)
|
91
95
|
|
92
96
|
for (const tableDef of tables.values()) {
|
93
|
-
if (
|
94
|
-
|
95
|
-
mutations.set(derivedMutationDefs.insert.name, derivedMutationDefs.insert)
|
96
|
-
mutations.set(derivedMutationDefs.update.name, derivedMutationDefs.update)
|
97
|
-
mutations.set(derivedMutationDefs.delete.name, derivedMutationDefs.delete)
|
97
|
+
if (tableIsClientDocumentTable(tableDef) && eventsDefsMap.has(tableDef.set.name) === false) {
|
98
|
+
eventsDefsMap.set(tableDef.set.name, tableDef.set)
|
98
99
|
}
|
99
100
|
}
|
100
101
|
|
@@ -106,18 +107,39 @@ export const makeSchema = <TInputSchema extends InputSchema>(
|
|
106
107
|
return {
|
107
108
|
_Type: LiveStoreSchemaSymbol,
|
108
109
|
_DbSchemaType: Symbol.for('livestore.DbSchemaType') as any,
|
109
|
-
|
110
|
-
tables,
|
111
|
-
|
112
|
-
|
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' },
|
113
117
|
hash,
|
114
118
|
} satisfies LiveStoreSchema
|
115
119
|
}
|
116
120
|
|
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}\`.`)
|
135
|
+
}
|
136
|
+
return { eventDef, materializer }
|
137
|
+
}
|
138
|
+
|
117
139
|
export namespace FromInputSchema {
|
118
140
|
export type DeriveSchema<TInputSchema extends InputSchema> = LiveStoreSchema<
|
119
|
-
DbSchemaFromInputSchemaTables<TInputSchema['tables']>,
|
120
|
-
|
141
|
+
DbSchemaFromInputSchemaTables<TInputSchema['state']['tables']>,
|
142
|
+
EventDefRecordFromInputSchemaEvents<TInputSchema['events']>
|
121
143
|
>
|
122
144
|
|
123
145
|
/**
|
@@ -125,17 +147,17 @@ export namespace FromInputSchema {
|
|
125
147
|
* - array: we use the table name of each array item (= table definition) as the object key
|
126
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
|
127
149
|
*/
|
128
|
-
type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> =
|
150
|
+
type DbSchemaFromInputSchemaTables<TTables extends InputSchema['state']['tables']> =
|
129
151
|
TTables extends ReadonlyArray<TableDef>
|
130
152
|
? { [K in TTables[number] as K['sqliteDef']['name']]: K['sqliteDef'] }
|
131
153
|
: TTables extends Record<string, TableDef>
|
132
154
|
? { [K in keyof TTables as TTables[K]['sqliteDef']['name']]: TTables[K]['sqliteDef'] }
|
133
155
|
: never
|
134
156
|
|
135
|
-
type
|
136
|
-
|
137
|
-
? { [K in
|
138
|
-
:
|
139
|
-
? { [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 }
|
140
162
|
: never
|
141
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
|
+
}
|