@livestore/common 0.3.0-dev.5 → 0.3.0-dev.50
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 +120 -64
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +39 -8
- 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 +390 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +97 -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 -580
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -174
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
- package/dist/devtools/devtools-sessioninfo.js +36 -0
- package/dist/devtools/devtools-sessioninfo.js.map +1 -0
- package/dist/devtools/mod.d.ts +55 -0
- package/dist/devtools/mod.d.ts.map +1 -0
- package/dist/devtools/mod.js +33 -0
- package/dist/devtools/mod.js.map +1 -0
- package/dist/index.d.ts +7 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -9
- 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 +595 -0
- package/dist/leader-thread/LeaderSyncProcessor.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 +119 -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 +155 -80
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +23 -11
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +72 -47
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +16 -0
- package/dist/leader-thread/materialize-event.d.ts.map +1 -0
- package/dist/leader-thread/materialize-event.js +109 -0
- package/dist/leader-thread/materialize-event.js.map +1 -0
- 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 +33 -31
- 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 +87 -40
- 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/make-client-session.d.ts +23 -0
- package/dist/make-client-session.d.ts.map +1 -0
- package/dist/make-client-session.js +57 -0
- package/dist/make-client-session.js.map +1 -0
- package/dist/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +86 -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/rematerialize-from-eventlog.d.ts +14 -0
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
- package/dist/rematerialize-from-eventlog.js +64 -0
- package/dist/rematerialize-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +146 -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 +43 -25
- package/dist/schema/EventId.d.ts.map +1 -1
- package/dist/schema/EventId.js +56 -18
- 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/EventNumber.d.ts +57 -0
- package/dist/schema/EventNumber.d.ts.map +1 -0
- package/dist/schema/EventNumber.js +82 -0
- package/dist/schema/EventNumber.js.map +1 -0
- package/dist/schema/EventNumber.test.d.ts +2 -0
- package/dist/schema/EventNumber.test.d.ts.map +1 -0
- package/dist/schema/EventNumber.test.js +11 -0
- package/dist/schema/EventNumber.test.js.map +1 -0
- package/dist/schema/EventSequenceNumber.d.ts +57 -0
- package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.js +82 -0
- package/dist/schema/EventSequenceNumber.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
- package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +11 -0
- package/dist/schema/EventSequenceNumber.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent.d.ts +257 -0
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent.js +117 -0
- package/dist/schema/LiveStoreEvent.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 +8 -6
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +8 -6
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +50 -32
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +36 -43
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/mod.d.ts +3 -0
- package/dist/schema/state/mod.d.ts.map +1 -0
- package/dist/schema/state/mod.js +3 -0
- package/dist/schema/state/mod.js.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.js +170 -0
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
- package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
- package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
- package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
- package/dist/schema/state/sqlite/mod.d.ts +17 -0
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/mod.js +41 -0
- package/dist/schema/state/sqlite/mod.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.js +6 -0
- package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
- package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
- package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
- package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
- package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
- package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables.js +88 -0
- package/dist/schema/state/sqlite/system-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +84 -0
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
- package/dist/schema/state/sqlite/table-def.js +36 -0
- package/dist/schema/state/sqlite/table-def.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 +27 -18
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +8 -0
- package/dist/schema-management/validate-schema.d.ts.map +1 -0
- package/dist/schema-management/validate-schema.js +39 -0
- package/dist/schema-management/validate-schema.js.map +1 -0
- 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/compact-events.js +38 -35
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +21 -21
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +11 -11
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +9 -7
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +10 -5
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts +0 -2
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +16 -14
- 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 +18 -10
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +77 -77
- 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} +38 -28
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +81 -38
- 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 +60 -25
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +10 -6
- 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 +337 -139
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +310 -286
- 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 +4 -4
- 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 +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +13 -6
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +107 -68
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +142 -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 -246
- package/src/devtools/devtools-sessioninfo.ts +101 -0
- package/src/devtools/mod.ts +59 -0
- package/src/index.ts +7 -15
- package/src/leader-thread/LeaderSyncProcessor.ts +940 -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 +227 -104
- package/src/leader-thread/make-leader-thread-layer.ts +128 -78
- package/src/leader-thread/materialize-event.ts +173 -0
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +38 -39
- package/src/leader-thread/shutdown-channel.ts +2 -4
- package/src/leader-thread/types.ts +96 -50
- package/src/make-client-session.ts +136 -0
- package/src/materializer-helper.ts +138 -0
- package/src/otel.ts +8 -0
- package/src/rematerialize-from-eventlog.ts +117 -0
- package/src/schema/EventDef.ts +227 -0
- package/src/schema/EventSequenceNumber.test.ts +12 -0
- package/src/schema/EventSequenceNumber.ts +121 -0
- package/src/schema/LiveStoreEvent.ts +240 -0
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +8 -6
- package/src/schema/schema.ts +88 -84
- package/src/schema/state/mod.ts +2 -0
- package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
- package/src/schema/state/sqlite/client-document-def.ts +444 -0
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
- package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
- package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
- package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
- package/src/schema/state/sqlite/mod.ts +73 -0
- package/src/schema/state/sqlite/query-builder/api.ts +440 -0
- package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
- package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
- package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
- package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
- package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
- package/src/schema/state/sqlite/system-tables.ts +117 -0
- package/src/schema/state/sqlite/table-def.ts +197 -0
- package/src/schema-management/common.ts +7 -7
- package/src/schema-management/migrations.ts +37 -31
- package/src/schema-management/validate-schema.ts +61 -0
- 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/compact-events.ts +38 -35
- package/src/sync/next/facts.ts +43 -41
- package/src/sync/next/history-dag-common.ts +17 -10
- package/src/sync/next/history-dag.ts +16 -17
- package/src/sync/next/rebase-events.ts +29 -17
- package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
- package/src/sync/next/test/compact-events.test.ts +79 -79
- package/src/sync/next/test/event-fixtures.ts +226 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +60 -24
- package/src/sync/syncstate.test.ts +347 -320
- package/src/sync/syncstate.ts +422 -230
- package/src/sync/validate-push-payload.ts +6 -6
- package/src/version.ts +2 -2
- 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 -13
- 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/devtools-window-message.d.ts +0 -29
- package/dist/devtools/devtools-window-message.d.ts.map +0 -1
- package/dist/devtools/devtools-window-message.js +0 -33
- package/dist/devtools/devtools-window-message.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 -425
- package/dist/leader-thread/leader-sync-processor.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -10
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -28
- 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-builder/api.d.ts +0 -190
- package/dist/query-builder/api.d.ts.map +0 -1
- package/dist/query-builder/api.js +0 -8
- package/dist/query-builder/api.js.map +0 -1
- package/dist/query-builder/impl.d.ts +0 -12
- package/dist/query-builder/impl.d.ts.map +0 -1
- package/dist/query-builder/impl.js +0 -244
- package/dist/query-builder/impl.js.map +0 -1
- package/dist/query-builder/impl.test.d.ts +0 -2
- package/dist/query-builder/impl.test.d.ts.map +0 -1
- package/dist/query-builder/impl.test.js +0 -212
- package/dist/query-builder/impl.test.js.map +0 -1
- package/dist/query-builder/mod.d.ts.map +0 -1
- package/dist/query-builder/mod.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 -166
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js +0 -72
- 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/schema/schema-helpers.d.ts.map +0 -1
- package/dist/schema/schema-helpers.js.map +0 -1
- package/dist/schema/system-tables.d.ts +0 -399
- package/dist/schema/system-tables.d.ts.map +0 -1
- package/dist/schema/system-tables.js +0 -58
- package/dist/schema/system-tables.js.map +0 -1
- package/dist/schema/table-def.d.ts +0 -156
- package/dist/schema/table-def.d.ts.map +0 -1
- package/dist/schema/table-def.js +0 -79
- package/dist/schema/table-def.js.map +0 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
- package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
- package/dist/schema-management/validate-mutation-defs.js +0 -39
- package/dist/schema-management/validate-mutation-defs.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 -14
- package/src/devtools/devtools-window-message.ts +0 -27
- 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 -670
- package/src/leader-thread/mutationlog.ts +0 -46
- package/src/leader-thread/pull-queue-set.ts +0 -58
- package/src/mutation.ts +0 -81
- package/src/query-builder/api.ts +0 -289
- package/src/query-builder/impl.test.ts +0 -239
- package/src/query-builder/impl.ts +0 -285
- package/src/query-info.ts +0 -78
- package/src/rehydrate-from-mutationlog.ts +0 -127
- package/src/schema/EventId.ts +0 -60
- package/src/schema/MutationEvent.ts +0 -180
- package/src/schema/mutations.ts +0 -192
- package/src/schema/system-tables.ts +0 -104
- package/src/schema/table-def.ts +0 -343
- package/src/schema-management/validate-mutation-defs.ts +0 -63
- package/src/sync/client-session-sync-processor.ts +0 -207
- package/src/sync/next/test/mutation-fixtures.ts +0 -224
- package/tsconfig.json +0 -11
- /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
package/src/schema/table-def.ts
DELETED
@@ -1,343 +0,0 @@
|
|
1
|
-
import type { Nullable, PrettifyFlat } from '@livestore/db-schema'
|
2
|
-
import { SqliteDsl } from '@livestore/db-schema'
|
3
|
-
import { shouldNeverHappen } from '@livestore/utils'
|
4
|
-
import { ReadonlyRecord, Schema } from '@livestore/utils/effect'
|
5
|
-
|
6
|
-
import type { DerivedMutationHelperFns } from '../derived-mutations.js'
|
7
|
-
import { makeDerivedMutationDefsForTable } from '../derived-mutations.js'
|
8
|
-
import type { QueryBuilder } from '../query-builder/mod.js'
|
9
|
-
import { makeQueryBuilder } from '../query-builder/mod.js'
|
10
|
-
|
11
|
-
export const { blob, boolean, column, datetime, integer, isColumnDefinition, json, real, text } = SqliteDsl
|
12
|
-
|
13
|
-
export { SqliteDsl } from '@livestore/db-schema'
|
14
|
-
|
15
|
-
export type StateType = 'singleton' | 'dynamic'
|
16
|
-
|
17
|
-
export type DefaultSqliteTableDef = SqliteDsl.TableDefinition<string, SqliteDsl.Columns>
|
18
|
-
export type DefaultSqliteTableDefConstrained = SqliteDsl.TableDefinition<string, SqliteDsl.ConstraintColumns>
|
19
|
-
|
20
|
-
export type TableDefBase<
|
21
|
-
TSqliteDef extends DefaultSqliteTableDef = DefaultSqliteTableDefConstrained,
|
22
|
-
TOptions extends TableOptions = TableOptions,
|
23
|
-
TSchema = SqliteDsl.StructSchemaForColumns<TSqliteDef['columns']>,
|
24
|
-
> = {
|
25
|
-
sqliteDef: TSqliteDef
|
26
|
-
options: TOptions
|
27
|
-
// Derived from `sqliteDef`, so only exposed for convenience
|
28
|
-
schema: TSchema
|
29
|
-
}
|
30
|
-
|
31
|
-
export type TableDef<
|
32
|
-
TSqliteDef extends DefaultSqliteTableDef = DefaultSqliteTableDefConstrained,
|
33
|
-
TOptions extends TableOptions = TableOptions,
|
34
|
-
// NOTE we're not using `SqliteDsl.StructSchemaForColumns<TSqliteDef['columns']>`
|
35
|
-
// as we don't want the alias type for users to show up, so we're redefining it here
|
36
|
-
TSchema = Schema.Schema<
|
37
|
-
SqliteDsl.AnyIfConstained<
|
38
|
-
TSqliteDef['columns'],
|
39
|
-
{ readonly [K in keyof TSqliteDef['columns']]: TSqliteDef['columns'][K]['schema']['Type'] }
|
40
|
-
>,
|
41
|
-
SqliteDsl.AnyIfConstained<
|
42
|
-
TSqliteDef['columns'],
|
43
|
-
{ readonly [K in keyof TSqliteDef['columns']]: TSqliteDef['columns'][K]['schema']['Encoded'] }
|
44
|
-
>
|
45
|
-
>,
|
46
|
-
> = {
|
47
|
-
sqliteDef: TSqliteDef
|
48
|
-
options: TOptions
|
49
|
-
// Derived from `sqliteDef`, so only exposed for convenience
|
50
|
-
schema: TSchema
|
51
|
-
query: QueryBuilder<ReadonlyArray<Schema.Schema.Type<TSchema>>, TableDef<TSqliteDef & {}, TOptions>>
|
52
|
-
} & (TOptions['deriveMutations']['enabled'] extends true
|
53
|
-
? DerivedMutationHelperFns<TSqliteDef['columns'], TOptions>
|
54
|
-
: {})
|
55
|
-
|
56
|
-
export type TableOptionsInput = Partial<{
|
57
|
-
indexes: SqliteDsl.Index[]
|
58
|
-
disableAutomaticIdColumn: boolean
|
59
|
-
isSingleton: boolean
|
60
|
-
deriveMutations:
|
61
|
-
| boolean
|
62
|
-
| {
|
63
|
-
enabled: true
|
64
|
-
localOnly?: boolean
|
65
|
-
}
|
66
|
-
}>
|
67
|
-
|
68
|
-
type ToColumns<TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>> =
|
69
|
-
TColumns extends SqliteDsl.Columns
|
70
|
-
? TColumns
|
71
|
-
: TColumns extends SqliteDsl.ColumnDefinition<any, any>
|
72
|
-
? { value: TColumns }
|
73
|
-
: never
|
74
|
-
|
75
|
-
type ValidateTableOptionsInput<
|
76
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
77
|
-
TOptionsInput extends TableOptionsInput,
|
78
|
-
TPassthroughIfValid,
|
79
|
-
> =
|
80
|
-
SqliteDsl.FromColumns.RequiresInsertValues<ToColumns<TColumns>> extends true
|
81
|
-
? TOptionsInput['isSingleton'] extends true
|
82
|
-
? 'Error: To use `isSingleton: true` with this table, each column must have a default value or be nullable'
|
83
|
-
: TPassthroughIfValid
|
84
|
-
: TPassthroughIfValid
|
85
|
-
|
86
|
-
export type TableOptions = {
|
87
|
-
/**
|
88
|
-
* Setting this to true will have the following consequences:
|
89
|
-
* - An `id` column will be added with `primaryKey: true` and `"singleton"` as default value and only allowed value
|
90
|
-
* - LiveStore will automatically create the singleton row when booting up
|
91
|
-
* - LiveStore will fail if there is already a column defined with `primaryKey: true`
|
92
|
-
*
|
93
|
-
* @default false
|
94
|
-
*/
|
95
|
-
readonly isSingleton: boolean
|
96
|
-
|
97
|
-
readonly disableAutomaticIdColumn: boolean
|
98
|
-
|
99
|
-
/**
|
100
|
-
* Setting this to true will automatically derive insert, update and delete mutations for this table. Example:
|
101
|
-
*
|
102
|
-
* ```ts
|
103
|
-
* const todos = table('todos', { ... }, { deriveMutations: true })
|
104
|
-
* todos.insert({ id: '1', text: 'Hello' })
|
105
|
-
* ```
|
106
|
-
*
|
107
|
-
* This is also a prerequisite for using the `useRow`, `useAtom` and `rowQuery` APIs.
|
108
|
-
*
|
109
|
-
* Important: When using this option, make sure you're following the "Rules of mutations" for the table schema.
|
110
|
-
*/
|
111
|
-
readonly deriveMutations:
|
112
|
-
| { enabled: false }
|
113
|
-
| {
|
114
|
-
enabled: true
|
115
|
-
/**
|
116
|
-
* When set to true, the mutations won't be synced over the network
|
117
|
-
*/
|
118
|
-
localOnly: boolean
|
119
|
-
}
|
120
|
-
|
121
|
-
/** Derived based on whether the table definition has one or more columns (besides the `id` column) */
|
122
|
-
readonly isSingleColumn: boolean
|
123
|
-
|
124
|
-
/**
|
125
|
-
* Derived based on whether the table definition has one or more columns (besides the `id` column) that require
|
126
|
-
* insert values (i.e. are not nullable and don't have a default value)
|
127
|
-
*
|
128
|
-
* `isSingleton` tables always imply `requiresInsertValues: false`
|
129
|
-
*/
|
130
|
-
readonly requiredInsertColumnNames: string
|
131
|
-
}
|
132
|
-
|
133
|
-
export const table = <
|
134
|
-
TName extends string,
|
135
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
136
|
-
TOptionsInput extends TableOptionsInput = TableOptionsInput,
|
137
|
-
>(
|
138
|
-
name: TName,
|
139
|
-
columnOrColumns: TColumns,
|
140
|
-
options?: TOptionsInput,
|
141
|
-
): ValidateTableOptionsInput<
|
142
|
-
TColumns,
|
143
|
-
TOptionsInput,
|
144
|
-
TableDef<
|
145
|
-
SqliteTableDefForInput<TName, TColumns, WithDefaults<TOptionsInput, TColumns>>,
|
146
|
-
WithDefaults<TOptionsInput, TColumns>
|
147
|
-
>
|
148
|
-
> => {
|
149
|
-
const tablePath = name
|
150
|
-
|
151
|
-
const options_: TableOptions = {
|
152
|
-
isSingleton: options?.isSingleton ?? false,
|
153
|
-
disableAutomaticIdColumn: options?.disableAutomaticIdColumn ?? false,
|
154
|
-
deriveMutations:
|
155
|
-
options?.deriveMutations === true
|
156
|
-
? { enabled: true as const, localOnly: false }
|
157
|
-
: options?.deriveMutations === false
|
158
|
-
? { enabled: false as const }
|
159
|
-
: options?.deriveMutations === undefined
|
160
|
-
? { enabled: false as const }
|
161
|
-
: { enabled: true as const, localOnly: options.deriveMutations.localOnly ?? false },
|
162
|
-
isSingleColumn: SqliteDsl.isColumnDefinition(columnOrColumns) === true,
|
163
|
-
requiredInsertColumnNames: 'type-level-only',
|
164
|
-
}
|
165
|
-
|
166
|
-
const columns = (
|
167
|
-
SqliteDsl.isColumnDefinition(columnOrColumns) ? { value: columnOrColumns } : columnOrColumns
|
168
|
-
) as SqliteDsl.Columns
|
169
|
-
|
170
|
-
if (options_.disableAutomaticIdColumn === true) {
|
171
|
-
if (columns.id === undefined && options_.isSingleton === true) {
|
172
|
-
shouldNeverHappen(
|
173
|
-
`Cannot create table ${name} with "isSingleton: true" because there is no column with name "id" and "disableAutomaticIdColumn: true" is set`,
|
174
|
-
)
|
175
|
-
}
|
176
|
-
} else if (columns.id === undefined && ReadonlyRecord.some(columns, (_) => _.primaryKey === true) === false) {
|
177
|
-
if (options_.isSingleton) {
|
178
|
-
columns.id = SqliteDsl.text({ schema: Schema.Literal('singleton'), primaryKey: true, default: 'singleton' })
|
179
|
-
} else {
|
180
|
-
columns.id = SqliteDsl.text({ primaryKey: true })
|
181
|
-
}
|
182
|
-
}
|
183
|
-
|
184
|
-
const sqliteDef = SqliteDsl.table(tablePath, columns, options?.indexes ?? [])
|
185
|
-
|
186
|
-
// TODO also enforce this on the type level
|
187
|
-
if (options_.isSingleton) {
|
188
|
-
for (const column of sqliteDef.ast.columns) {
|
189
|
-
if (column.nullable === false && column.default._tag === 'None') {
|
190
|
-
shouldNeverHappen(
|
191
|
-
`When creating a singleton table, each column must be either nullable or have a default value. Column '${column.name}' is neither.`,
|
192
|
-
)
|
193
|
-
}
|
194
|
-
}
|
195
|
-
}
|
196
|
-
|
197
|
-
const isSingleColumn = SqliteDsl.isColumnDefinition(columnOrColumns) === true
|
198
|
-
|
199
|
-
const schema = SqliteDsl.structSchemaForTable(sqliteDef)
|
200
|
-
const tableDef = { sqliteDef, options: options_, schema } satisfies TableDefBase
|
201
|
-
const query = makeQueryBuilder(tableDef)
|
202
|
-
// const tableDef = { ...tableDefBase, query } satisfies TableDef
|
203
|
-
|
204
|
-
// NOTE we're currently patching the existing tableDef object
|
205
|
-
// as it's being used as part of the query builder API
|
206
|
-
// @ts-expect-error TODO properly implement this
|
207
|
-
tableDef.query = query
|
208
|
-
|
209
|
-
if (tableHasDerivedMutations(tableDef)) {
|
210
|
-
const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
|
211
|
-
|
212
|
-
tableDef.insert = (valuesOrValue: any) => {
|
213
|
-
if (isSingleColumn && options_.isSingleton) {
|
214
|
-
return derivedMutationDefs.insert({ id: 'singleton', value: { value: valuesOrValue } })
|
215
|
-
} else {
|
216
|
-
return derivedMutationDefs.insert(valuesOrValue as any)
|
217
|
-
}
|
218
|
-
}
|
219
|
-
|
220
|
-
tableDef.update = (argsOrValues: any) => {
|
221
|
-
if (isSingleColumn && options_.isSingleton) {
|
222
|
-
return derivedMutationDefs.update({ where: { id: 'singleton' }, values: { value: argsOrValues } as any })
|
223
|
-
} else {
|
224
|
-
return derivedMutationDefs.update(argsOrValues as any)
|
225
|
-
}
|
226
|
-
}
|
227
|
-
|
228
|
-
tableDef.delete = (args: any) => derivedMutationDefs.delete(args)
|
229
|
-
}
|
230
|
-
|
231
|
-
return tableDef as any
|
232
|
-
}
|
233
|
-
|
234
|
-
export const tableHasDerivedMutations = <TTableDef extends TableDefBase>(
|
235
|
-
tableDef: TTableDef,
|
236
|
-
): tableDef is TTableDef & {
|
237
|
-
options: { deriveMutations: { enabled: true; localOnly: boolean } }
|
238
|
-
} & DerivedMutationHelperFns<TTableDef['sqliteDef']['columns'], TTableDef['options']> =>
|
239
|
-
tableDef.options.deriveMutations.enabled === true
|
240
|
-
|
241
|
-
export const tableIsSingleton = <TTableDef extends TableDefBase>(
|
242
|
-
tableDef: TTableDef,
|
243
|
-
): tableDef is TTableDef & { options: { isSingleton: true } } => tableDef.options.isSingleton === true
|
244
|
-
|
245
|
-
type SqliteTableDefForInput<
|
246
|
-
TName extends string,
|
247
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
248
|
-
TOptions extends TableOptions,
|
249
|
-
> = SqliteDsl.TableDefinition<TName, PrettifyFlat<WithId<ToColumns<TColumns>, TOptions>>>
|
250
|
-
|
251
|
-
type WithId<TColumns extends SqliteDsl.Columns, TOptions extends TableOptions> = TColumns &
|
252
|
-
('id' extends keyof TColumns
|
253
|
-
? {}
|
254
|
-
: TOptions['disableAutomaticIdColumn'] extends true
|
255
|
-
? {}
|
256
|
-
: TOptions['isSingleton'] extends true
|
257
|
-
? {
|
258
|
-
id: SqliteDsl.ColumnDefinition<'singleton', 'singleton'>
|
259
|
-
}
|
260
|
-
: {
|
261
|
-
id: SqliteDsl.ColumnDefinition<string, string>
|
262
|
-
})
|
263
|
-
|
264
|
-
type WithDefaults<
|
265
|
-
TOptionsInput extends TableOptionsInput,
|
266
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
267
|
-
> = {
|
268
|
-
isSingleton: TOptionsInput['isSingleton'] extends true ? true : false
|
269
|
-
disableAutomaticIdColumn: TOptionsInput['disableAutomaticIdColumn'] extends true ? true : false
|
270
|
-
deriveMutations: TOptionsInput['deriveMutations'] extends true
|
271
|
-
? { enabled: true; localOnly: boolean }
|
272
|
-
: TOptionsInput['deriveMutations'] extends false
|
273
|
-
? { enabled: false }
|
274
|
-
: TOptionsInput['deriveMutations'] extends { enabled: true; localOnly?: boolean }
|
275
|
-
? {
|
276
|
-
enabled: true
|
277
|
-
localOnly: TOptionsInput['deriveMutations']['localOnly'] extends true ? true : false
|
278
|
-
}
|
279
|
-
: never
|
280
|
-
isSingleColumn: SqliteDsl.IsSingleColumn<TColumns>
|
281
|
-
requiredInsertColumnNames: SqliteDsl.FromColumns.RequiredInsertColumnNames<ToColumns<TColumns>>
|
282
|
-
}
|
283
|
-
|
284
|
-
export namespace FromTable {
|
285
|
-
// TODO this sometimes doesn't preserve the order of columns
|
286
|
-
export type RowDecoded<TTableDef extends TableDefBase> = PrettifyFlat<
|
287
|
-
Nullable<Pick<RowDecodedAll<TTableDef>, NullableColumnNames<TTableDef>>> &
|
288
|
-
Omit<RowDecodedAll<TTableDef>, NullableColumnNames<TTableDef>>
|
289
|
-
>
|
290
|
-
|
291
|
-
export type NullableColumnNames<TTableDef extends TableDefBase> = FromColumns.NullableColumnNames<
|
292
|
-
TTableDef['sqliteDef']['columns']
|
293
|
-
>
|
294
|
-
|
295
|
-
export type Columns<TTableDef extends TableDefBase> = {
|
296
|
-
[K in keyof TTableDef['sqliteDef']['columns']]: TTableDef['sqliteDef']['columns'][K]['columnType']
|
297
|
-
}
|
298
|
-
|
299
|
-
export type RowEncodeNonNullable<TTableDef extends TableDefBase> = {
|
300
|
-
[K in keyof TTableDef['sqliteDef']['columns']]: Schema.Schema.Encoded<
|
301
|
-
TTableDef['sqliteDef']['columns'][K]['schema']
|
302
|
-
>
|
303
|
-
}
|
304
|
-
|
305
|
-
export type RowEncoded<TTableDef extends TableDefBase> = PrettifyFlat<
|
306
|
-
Nullable<Pick<RowEncodeNonNullable<TTableDef>, NullableColumnNames<TTableDef>>> &
|
307
|
-
Omit<RowEncodeNonNullable<TTableDef>, NullableColumnNames<TTableDef>>
|
308
|
-
>
|
309
|
-
|
310
|
-
export type RowDecodedAll<TTableDef extends TableDefBase> = {
|
311
|
-
[K in keyof TTableDef['sqliteDef']['columns']]: Schema.Schema.Type<TTableDef['sqliteDef']['columns'][K]['schema']>
|
312
|
-
}
|
313
|
-
}
|
314
|
-
|
315
|
-
export namespace FromColumns {
|
316
|
-
// TODO this sometimes doesn't preserve the order of columns
|
317
|
-
export type RowDecoded<TColumns extends SqliteDsl.Columns> = PrettifyFlat<
|
318
|
-
Nullable<Pick<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>> &
|
319
|
-
Omit<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>
|
320
|
-
>
|
321
|
-
|
322
|
-
export type RowDecodedAll<TColumns extends SqliteDsl.Columns> = {
|
323
|
-
[K in keyof TColumns]: Schema.Schema.Type<TColumns[K]['schema']>
|
324
|
-
}
|
325
|
-
|
326
|
-
export type RowEncoded<TColumns extends SqliteDsl.Columns> = PrettifyFlat<
|
327
|
-
Nullable<Pick<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>> &
|
328
|
-
Omit<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>
|
329
|
-
>
|
330
|
-
|
331
|
-
export type RowEncodeNonNullable<TColumns extends SqliteDsl.Columns> = {
|
332
|
-
[K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
|
333
|
-
}
|
334
|
-
|
335
|
-
export type NullableColumnNames<TColumns extends SqliteDsl.Columns> = keyof {
|
336
|
-
[K in keyof TColumns as TColumns[K]['default'] extends true ? K : never]: {}
|
337
|
-
}
|
338
|
-
|
339
|
-
export type RequiredInsertColumnNames<TColumns extends SqliteDsl.Columns> =
|
340
|
-
SqliteDsl.FromColumns.RequiredInsertColumnNames<TColumns>
|
341
|
-
|
342
|
-
export type InsertRowDecoded<TColumns extends SqliteDsl.Columns> = SqliteDsl.FromColumns.InsertRowDecoded<TColumns>
|
343
|
-
}
|
@@ -1,63 +0,0 @@
|
|
1
|
-
import { Effect, Schema } from '@livestore/utils/effect'
|
2
|
-
|
3
|
-
import { UnexpectedError } from '../adapter-types.js'
|
4
|
-
import type { LiveStoreSchema } from '../schema/mod.js'
|
5
|
-
import type { MutationDef } from '../schema/mutations.js'
|
6
|
-
import type { MutationDefInfo, SchemaManager } from './common.js'
|
7
|
-
|
8
|
-
export const validateSchema = (schema: LiveStoreSchema, schemaManager: SchemaManager) =>
|
9
|
-
Effect.gen(function* () {
|
10
|
-
// Validate mutation definitions
|
11
|
-
const registeredMutationDefInfos = schemaManager.getMutationDefInfos()
|
12
|
-
|
13
|
-
const missingMutationDefs = registeredMutationDefInfos.filter(
|
14
|
-
(registeredMutationDefInfo) => !schema.mutations.has(registeredMutationDefInfo.mutationName),
|
15
|
-
)
|
16
|
-
|
17
|
-
if (missingMutationDefs.length > 0) {
|
18
|
-
yield* new UnexpectedError({
|
19
|
-
cause: `Missing mutation definitions: ${missingMutationDefs.map((info) => info.mutationName).join(', ')}`,
|
20
|
-
})
|
21
|
-
}
|
22
|
-
|
23
|
-
for (const [, mutationDef] of schema.mutations) {
|
24
|
-
const registeredMutationDefInfo = registeredMutationDefInfos.find(
|
25
|
-
(info) => info.mutationName === mutationDef.name,
|
26
|
-
)
|
27
|
-
|
28
|
-
validateMutationDef(mutationDef, schemaManager, registeredMutationDefInfo)
|
29
|
-
}
|
30
|
-
|
31
|
-
// Validate table schemas
|
32
|
-
})
|
33
|
-
|
34
|
-
export const validateMutationDef = (
|
35
|
-
mutationDef: MutationDef.Any,
|
36
|
-
schemaManager: SchemaManager,
|
37
|
-
registeredMutationDefInfo: MutationDefInfo | undefined,
|
38
|
-
) => {
|
39
|
-
const schemaHash = Schema.hash(mutationDef.schema)
|
40
|
-
|
41
|
-
if (registeredMutationDefInfo === undefined) {
|
42
|
-
schemaManager.setMutationDefInfo({
|
43
|
-
schemaHash,
|
44
|
-
mutationName: mutationDef.name,
|
45
|
-
})
|
46
|
-
|
47
|
-
return
|
48
|
-
}
|
49
|
-
|
50
|
-
if (schemaHash === registeredMutationDefInfo.schemaHash) return
|
51
|
-
|
52
|
-
// TODO bring back some form of schema compatibility check (see https://github.com/livestorejs/livestore/issues/69)
|
53
|
-
// const newSchemaIsCompatibleWithOldSchema = Schema.isSubType(jsonSchemaDefFromMgmtStore, mutationDef.schema)
|
54
|
-
|
55
|
-
// if (!newSchemaIsCompatibleWithOldSchema) {
|
56
|
-
// shouldNeverHappen(`Schema for mutation ${mutationDef.name} has changed in an incompatible way`)
|
57
|
-
// }
|
58
|
-
|
59
|
-
schemaManager.setMutationDefInfo({
|
60
|
-
schemaHash,
|
61
|
-
mutationName: mutationDef.name,
|
62
|
-
})
|
63
|
-
}
|
@@ -1,207 +0,0 @@
|
|
1
|
-
import { LS_DEV, shouldNeverHappen, TRACE_VERBOSE } from '@livestore/utils'
|
2
|
-
import type { Scope } from '@livestore/utils/effect'
|
3
|
-
import { Effect, Schema, Stream } from '@livestore/utils/effect'
|
4
|
-
import * as otel from '@opentelemetry/api'
|
5
|
-
|
6
|
-
import type { ClientSessionLeaderThreadProxy, UnexpectedError } from '../adapter-types.js'
|
7
|
-
import * as EventId from '../schema/EventId.js'
|
8
|
-
import { type LiveStoreSchema } from '../schema/mod.js'
|
9
|
-
import * as MutationEvent from '../schema/MutationEvent.js'
|
10
|
-
import type { SyncState } from './syncstate.js'
|
11
|
-
import { updateSyncState } from './syncstate.js'
|
12
|
-
|
13
|
-
/**
|
14
|
-
* Rebase behaviour:
|
15
|
-
* - We continously pull mutations from the leader and apply them to the local store.
|
16
|
-
* - If there was a race condition (i.e. the leader and client session have both advacned),
|
17
|
-
* we'll need to rebase the local pending mutations on top of the leader's head.
|
18
|
-
* - The goal is to never block the UI, so we'll interrupt rebasing if a new mutations is pushed by the client session.
|
19
|
-
* - We also want to avoid "backwards-jumping" in the UI, so we'll transactionally apply a read model changes during a rebase.
|
20
|
-
* - We might need to make the rebase behaviour configurable e.g. to let users manually trigger a rebase
|
21
|
-
*/
|
22
|
-
export const makeClientSessionSyncProcessor = ({
|
23
|
-
schema,
|
24
|
-
initialLeaderHead,
|
25
|
-
pushToLeader,
|
26
|
-
pullFromLeader,
|
27
|
-
applyMutation,
|
28
|
-
rollback,
|
29
|
-
refreshTables,
|
30
|
-
span,
|
31
|
-
}: {
|
32
|
-
schema: LiveStoreSchema
|
33
|
-
initialLeaderHead: EventId.EventId
|
34
|
-
pushToLeader: (batch: ReadonlyArray<MutationEvent.AnyEncoded>) => void
|
35
|
-
pullFromLeader: ClientSessionLeaderThreadProxy['mutations']['pull']
|
36
|
-
applyMutation: (
|
37
|
-
mutationEventDecoded: MutationEvent.PartialAny,
|
38
|
-
options: { otelContext: otel.Context; withChangeset: boolean },
|
39
|
-
) => {
|
40
|
-
writeTables: Set<string>
|
41
|
-
sessionChangeset: Uint8Array | undefined
|
42
|
-
}
|
43
|
-
rollback: (changeset: Uint8Array) => void
|
44
|
-
refreshTables: (tables: Set<string>) => void
|
45
|
-
// rebaseBehaviour: 'auto-rebase' | 'manual-rebase'
|
46
|
-
span: otel.Span
|
47
|
-
}): ClientSessionSyncProcessor => {
|
48
|
-
const mutationEventSchema = MutationEvent.makeMutationEventSchemaMemo(schema)
|
49
|
-
|
50
|
-
const syncStateRef = {
|
51
|
-
current: {
|
52
|
-
localHead: initialLeaderHead,
|
53
|
-
upstreamHead: initialLeaderHead,
|
54
|
-
pending: [],
|
55
|
-
// TODO init rollbackTail from leader to be ready for backend rebasing
|
56
|
-
rollbackTail: [],
|
57
|
-
} as SyncState,
|
58
|
-
}
|
59
|
-
|
60
|
-
const isLocalEvent = (mutationEventEncoded: MutationEvent.EncodedWithMeta) => {
|
61
|
-
const mutationDef = schema.mutations.get(mutationEventEncoded.mutation)!
|
62
|
-
return mutationDef.options.localOnly
|
63
|
-
}
|
64
|
-
|
65
|
-
const push: ClientSessionSyncProcessor['push'] = (batch, { otelContext }) => {
|
66
|
-
// TODO validate batch
|
67
|
-
|
68
|
-
let baseEventId = syncStateRef.current.localHead
|
69
|
-
const encodedMutationEvents = batch.map((mutationEvent) => {
|
70
|
-
const mutationDef = schema.mutations.get(mutationEvent.mutation)!
|
71
|
-
const nextIdPair = EventId.nextPair(baseEventId, mutationDef.options.localOnly)
|
72
|
-
baseEventId = nextIdPair.id
|
73
|
-
return new MutationEvent.EncodedWithMeta(
|
74
|
-
Schema.encodeUnknownSync(mutationEventSchema)({ ...mutationEvent, ...nextIdPair }),
|
75
|
-
)
|
76
|
-
})
|
77
|
-
|
78
|
-
const updateResult = updateSyncState({
|
79
|
-
syncState: syncStateRef.current,
|
80
|
-
payload: { _tag: 'local-push', newEvents: encodedMutationEvents },
|
81
|
-
isLocalEvent,
|
82
|
-
isEqualEvent: MutationEvent.isEqualEncoded,
|
83
|
-
})
|
84
|
-
|
85
|
-
span.addEvent('local-push', {
|
86
|
-
batchSize: encodedMutationEvents.length,
|
87
|
-
updateResult: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
88
|
-
})
|
89
|
-
|
90
|
-
if (updateResult._tag !== 'advance') {
|
91
|
-
return shouldNeverHappen(`Expected advance, got ${updateResult._tag}`)
|
92
|
-
}
|
93
|
-
|
94
|
-
syncStateRef.current = updateResult.newSyncState
|
95
|
-
|
96
|
-
const writeTables = new Set<string>()
|
97
|
-
for (const mutationEvent of updateResult.newEvents) {
|
98
|
-
// TODO avoid encoding and decoding here again
|
99
|
-
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent)
|
100
|
-
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true })
|
101
|
-
for (const table of res.writeTables) {
|
102
|
-
writeTables.add(table)
|
103
|
-
}
|
104
|
-
mutationEvent.meta.sessionChangeset = res.sessionChangeset
|
105
|
-
}
|
106
|
-
|
107
|
-
pushToLeader(encodedMutationEvents)
|
108
|
-
|
109
|
-
return { writeTables }
|
110
|
-
}
|
111
|
-
|
112
|
-
const otelContext = otel.trace.setSpan(otel.context.active(), span)
|
113
|
-
|
114
|
-
const boot: ClientSessionSyncProcessor['boot'] = Effect.gen(function* () {
|
115
|
-
yield* pullFromLeader.pipe(
|
116
|
-
Stream.tap(({ payload, remaining }) =>
|
117
|
-
Effect.gen(function* () {
|
118
|
-
// console.log('pulled payload from leader', { payload, remaining })
|
119
|
-
|
120
|
-
const updateResult = updateSyncState({
|
121
|
-
syncState: syncStateRef.current,
|
122
|
-
payload,
|
123
|
-
isLocalEvent,
|
124
|
-
isEqualEvent: MutationEvent.isEqualEncoded,
|
125
|
-
})
|
126
|
-
|
127
|
-
if (updateResult._tag === 'reject') {
|
128
|
-
debugger
|
129
|
-
throw new Error('TODO: implement reject in client-session-sync-queue for pull')
|
130
|
-
}
|
131
|
-
|
132
|
-
syncStateRef.current = updateResult.newSyncState
|
133
|
-
|
134
|
-
if (updateResult._tag === 'rebase') {
|
135
|
-
span.addEvent('pull:rebase', {
|
136
|
-
payloadTag: payload._tag,
|
137
|
-
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
138
|
-
newEventsCount: updateResult.newEvents.length,
|
139
|
-
rollbackCount: updateResult.eventsToRollback.length,
|
140
|
-
res: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
141
|
-
remaining,
|
142
|
-
})
|
143
|
-
if (LS_DEV) {
|
144
|
-
console.debug(
|
145
|
-
'pull:rebase: rollback',
|
146
|
-
updateResult.eventsToRollback.length,
|
147
|
-
...updateResult.eventsToRollback.map((_) => _.toJSON()),
|
148
|
-
)
|
149
|
-
}
|
150
|
-
|
151
|
-
for (let i = updateResult.eventsToRollback.length - 1; i >= 0; i--) {
|
152
|
-
const event = updateResult.eventsToRollback[i]!
|
153
|
-
if (event.meta.sessionChangeset) {
|
154
|
-
rollback(event.meta.sessionChangeset)
|
155
|
-
event.meta.sessionChangeset = undefined
|
156
|
-
}
|
157
|
-
}
|
158
|
-
} else {
|
159
|
-
span.addEvent('pull:advance', {
|
160
|
-
payloadTag: payload._tag,
|
161
|
-
payload: TRACE_VERBOSE ? JSON.stringify(payload) : undefined,
|
162
|
-
newEventsCount: updateResult.newEvents.length,
|
163
|
-
res: TRACE_VERBOSE ? JSON.stringify(updateResult) : undefined,
|
164
|
-
remaining,
|
165
|
-
})
|
166
|
-
}
|
167
|
-
|
168
|
-
if (updateResult.newEvents.length === 0) return
|
169
|
-
|
170
|
-
const writeTables = new Set<string>()
|
171
|
-
for (const mutationEvent of updateResult.newEvents) {
|
172
|
-
const decodedMutationEvent = Schema.decodeSync(mutationEventSchema)(mutationEvent)
|
173
|
-
const res = applyMutation(decodedMutationEvent, { otelContext, withChangeset: true })
|
174
|
-
for (const table of res.writeTables) {
|
175
|
-
writeTables.add(table)
|
176
|
-
}
|
177
|
-
|
178
|
-
mutationEvent.meta.sessionChangeset = res.sessionChangeset
|
179
|
-
}
|
180
|
-
|
181
|
-
refreshTables(writeTables)
|
182
|
-
}),
|
183
|
-
),
|
184
|
-
Stream.runDrain,
|
185
|
-
Effect.tapCauseLogPretty,
|
186
|
-
Effect.forkScoped,
|
187
|
-
)
|
188
|
-
})
|
189
|
-
|
190
|
-
return {
|
191
|
-
push,
|
192
|
-
boot,
|
193
|
-
syncStateRef,
|
194
|
-
} satisfies ClientSessionSyncProcessor
|
195
|
-
}
|
196
|
-
|
197
|
-
export interface ClientSessionSyncProcessor {
|
198
|
-
push: (
|
199
|
-
batch: ReadonlyArray<MutationEvent.PartialAny>,
|
200
|
-
options: { otelContext: otel.Context },
|
201
|
-
) => {
|
202
|
-
writeTables: Set<string>
|
203
|
-
}
|
204
|
-
boot: Effect.Effect<void, UnexpectedError, Scope.Scope>
|
205
|
-
|
206
|
-
syncStateRef: { current: SyncState }
|
207
|
-
}
|