@livestore/common 0.4.0 → 0.5.0-dev.0
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/ClientSessionLeaderThreadProxy.d.ts +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/MaterializationJournal.d.ts +44 -0
- package/dist/MaterializationJournal.d.ts.map +1 -0
- package/dist/MaterializationJournal.js +112 -0
- package/dist/MaterializationJournal.js.map +1 -0
- package/dist/StateHead.d.ts +26 -0
- package/dist/StateHead.d.ts.map +1 -0
- package/dist/StateHead.js +50 -0
- package/dist/StateHead.js.map +1 -0
- package/dist/WorkerTransportError.d.ts +3 -3
- package/dist/WorkerTransportError.d.ts.map +1 -1
- package/dist/WorkerTransportError.js +3 -3
- package/dist/WorkerTransportError.js.map +1 -1
- package/dist/__tests__/fixture.d.ts +1 -1
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +3 -3
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +29 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +20 -37
- package/dist/adapter-types.js.map +1 -1
- package/dist/debug-info.d.ts +56 -56
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +28 -41
- package/dist/debug-info.js.map +1 -1
- package/dist/defs.d.ts +9 -9
- package/dist/defs.js +2 -2
- package/dist/devtools/devtools-compatibility.test.js +1 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +520 -332
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +76 -74
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +27 -27
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +5 -5
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +405 -343
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +101 -89
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +8 -5
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +4 -5
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +9 -5
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +45 -69
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +18 -16
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +66 -18
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +519 -461
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +67 -36
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
- package/dist/leader-thread/RejectedPushError.js +24 -5
- package/dist/leader-thread/RejectedPushError.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +1 -0
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +9 -8
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +4 -4
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +6 -6
- package/dist/leader-thread/eventlog.js.map +1 -1
- 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 +33 -17
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +9 -5
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +25 -35
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js +7 -7
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +2 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +4 -0
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +18 -39
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -6
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -3
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +4 -7
- package/dist/leader-thread/stream-events.d.ts.map +1 -1
- package/dist/leader-thread/stream-events.js +13 -16
- package/dist/leader-thread/stream-events.js.map +1 -1
- package/dist/leader-thread/types.d.ts +32 -69
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +5 -5
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +5 -30
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +1 -32
- package/dist/logging.js.map +1 -1
- package/dist/make-client-session.d.ts +1 -2
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +3 -3
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +0 -1
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +7 -35
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -3
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +2 -7
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +28 -26
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +4 -4
- package/dist/schema/EventDef/define.d.ts.map +1 -1
- package/dist/schema/EventDef/define.js +5 -5
- package/dist/schema/EventDef/define.js.map +1 -1
- package/dist/schema/EventDef/define.test.d.ts +2 -0
- package/dist/schema/EventDef/define.test.d.ts.map +1 -0
- package/dist/schema/EventDef/define.test.js +23 -0
- package/dist/schema/EventDef/define.test.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +8 -13
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
- package/dist/schema/EventDef/deprecated.js +12 -13
- package/dist/schema/EventDef/deprecated.js.map +1 -1
- package/dist/schema/EventDef/deprecated.test.js +1 -1
- package/dist/schema/EventDef/deprecated.test.js.map +1 -1
- package/dist/schema/EventDef/event-def.d.ts +1 -1
- package/dist/schema/EventDef/event-def.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.d.ts +12 -12
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.js +8 -9
- package/dist/schema/EventSequenceNumber/client.js.map +1 -1
- package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/global.js +1 -1
- package/dist/schema/EventSequenceNumber/global.js.map +1 -1
- package/dist/schema/EventSequenceNumber.test.js +5 -5
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +50 -179
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/client.js +32 -29
- package/dist/schema/LiveStoreEvent/client.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.test.js +11 -2
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/global.js +1 -1
- package/dist/schema/LiveStoreEvent/global.js.map +1 -1
- package/dist/schema/LiveStoreEvent/input.d.ts +5 -5
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/input.js +3 -3
- package/dist/schema/LiveStoreEvent/input.js.map +1 -1
- package/dist/schema/mod.d.ts +1 -0
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +1 -0
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +3 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +12 -17
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +23 -20
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +29 -8
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +13 -15
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +57 -31
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +118 -72
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +2 -2
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -2
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +13 -4
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +8 -13
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +27 -16
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +1 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +1 -1
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/persistence.d.ts +11 -0
- package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
- package/dist/schema/state/sqlite/persistence.js +10 -0
- package/dist/schema/state/sqlite/persistence.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.js +27 -23
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +3 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +16 -14
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +362 -596
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +2 -2
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +328 -106
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js +33 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +16 -19
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +53 -3
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +153 -36
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts.map +1 -1
- package/dist/schema/unknown-events.js +2 -1
- package/dist/schema/unknown-events.js.map +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +2 -2
- package/dist/session-id-symbol.d.ts +29 -0
- package/dist/session-id-symbol.d.ts.map +1 -0
- package/dist/session-id-symbol.js +44 -0
- package/dist/session-id-symbol.js.map +1 -0
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +8 -10
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/types.d.ts +6 -7
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sqlite-db-helper.d.ts +21 -1
- package/dist/sqlite-db-helper.d.ts.map +1 -1
- package/dist/sqlite-db-helper.js +37 -2
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -6
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js +3 -3
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +38 -16
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +196 -66
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +12 -18
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +2 -2
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +2 -3
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +54 -33
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/mock-sync-backend.test.d.ts +2 -0
- package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.test.js +49 -0
- package/dist/sync/mock-sync-backend.test.js.map +1 -0
- package/dist/sync/next/history-dag-common.d.ts +4 -0
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +52 -31
- 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 -1
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts +7 -7
- package/dist/sync/next/test/event-fixtures.js +1 -1
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
- package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
- package/dist/sync/next/test/history-dag-common.test.js +73 -0
- package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +4 -2
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +15 -15
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +9 -5
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +1 -1
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +97 -173
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +34 -37
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +100 -61
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +15 -16
- package/dist/sync/transport-chunking.d.ts.map +1 -1
- package/dist/sync/transport-chunking.js +23 -32
- package/dist/sync/transport-chunking.js.map +1 -1
- package/dist/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +19 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +19 -37
- package/src/ClientSessionLeaderThreadProxy.ts +1 -1
- package/src/MaterializationJournal.ts +184 -0
- package/src/StateHead.ts +80 -0
- package/src/WorkerTransportError.ts +4 -4
- package/src/__tests__/fixture.ts +3 -3
- package/src/adapter-types.ts +24 -61
- package/src/debug-info.ts +50 -70
- package/src/defs.ts +2 -2
- package/src/devtools/devtools-compatibility.test.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +56 -65
- package/src/devtools/devtools-messages-common.ts +12 -11
- package/src/devtools/devtools-messages-leader.ts +71 -69
- package/src/devtools/devtools-sessioninfo.ts +13 -11
- package/src/devtools/mod.ts +4 -5
- package/src/errors.ts +46 -34
- package/src/index.ts +8 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +794 -691
- package/src/leader-thread/RejectedPushError.ts +40 -27
- package/src/leader-thread/connection.ts +12 -8
- package/src/leader-thread/eventlog.ts +7 -7
- package/src/leader-thread/leader-worker-devtools.ts +37 -19
- package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
- package/src/leader-thread/make-leader-thread-layer.ts +56 -53
- package/src/leader-thread/materialize-event.ts +13 -8
- package/src/leader-thread/recreate-db.ts +24 -59
- package/src/leader-thread/shutdown-channel.ts +3 -14
- package/src/leader-thread/stream-events.ts +104 -101
- package/src/leader-thread/types.ts +24 -62
- package/src/logging.ts +5 -52
- package/src/make-client-session.ts +6 -6
- package/src/materializer-helper.ts +8 -37
- package/src/otel.ts +5 -14
- package/src/rematerialize-from-eventlog.ts +97 -94
- package/src/schema/EventDef/define.test.ts +28 -0
- package/src/schema/EventDef/define.ts +20 -19
- package/src/schema/EventDef/deprecated.test.ts +1 -8
- package/src/schema/EventDef/deprecated.ts +17 -20
- package/src/schema/EventDef/event-def.ts +2 -4
- package/src/schema/EventSequenceNumber/client.ts +8 -9
- package/src/schema/EventSequenceNumber/global.ts +1 -1
- package/src/schema/EventSequenceNumber.test.ts +5 -5
- package/src/schema/LiveStoreEvent/client.test.ts +17 -4
- package/src/schema/LiveStoreEvent/client.ts +36 -35
- package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
- package/src/schema/LiveStoreEvent/global.ts +1 -1
- package/src/schema/LiveStoreEvent/input.ts +6 -6
- package/src/schema/mod.ts +1 -0
- package/src/schema/schema.ts +3 -2
- package/src/schema/state/sqlite/client-document-def.test.ts +32 -13
- package/src/schema/state/sqlite/client-document-def.ts +95 -80
- package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
- package/src/schema/state/sqlite/column-annotations.ts +26 -30
- package/src/schema/state/sqlite/column-def.test.ts +132 -77
- package/src/schema/state/sqlite/column-def.ts +72 -37
- package/src/schema/state/sqlite/column-spec.test.ts +2 -2
- package/src/schema/state/sqlite/column-spec.ts +3 -2
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +15 -5
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +25 -31
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
- package/src/schema/state/sqlite/mod.ts +2 -4
- package/src/schema/state/sqlite/persistence.ts +11 -0
- package/src/schema/state/sqlite/query-builder/api.ts +9 -9
- package/src/schema/state/sqlite/query-builder/astToSql.ts +31 -26
- package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
- package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
- package/src/schema/state/sqlite/schema-helpers.ts +1 -1
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
- package/src/schema/state/sqlite/system-tables/state-tables.ts +41 -1
- package/src/schema/state/sqlite/table-def.test.ts +204 -66
- package/src/schema/state/sqlite/table-def.ts +96 -45
- package/src/schema/unknown-events.ts +3 -2
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +2 -2
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +8 -12
- package/src/sql-queries/types.ts +6 -7
- package/src/sqlite-db-helper.ts +64 -2
- package/src/sqlite-types.ts +5 -8
- package/src/sync/ClientSessionSyncProcessor.ts +303 -119
- package/src/sync/errors.ts +14 -12
- package/src/sync/mock-sync-backend.test.ts +78 -0
- package/src/sync/mock-sync-backend.ts +93 -47
- package/src/sync/next/history-dag-common.ts +60 -34
- package/src/sync/next/history-dag.ts +4 -1
- package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
- package/src/sync/next/test/event-fixtures.ts +1 -1
- package/src/sync/next/test/history-dag-common.test.ts +87 -0
- package/src/sync/sync-backend-kv.ts +4 -2
- package/src/sync/sync-backend.ts +15 -15
- package/src/sync/sync.ts +1 -1
- package/src/sync/syncstate.test.ts +191 -140
- package/src/sync/syncstate.ts +63 -53
- package/src/sync/transport-chunking.ts +34 -39
- package/src/util.ts +18 -9
- package/src/version.ts +1 -2
- package/dist/sql-queries/misc.d.ts +0 -2
- package/dist/sql-queries/misc.d.ts.map +0 -1
- package/dist/sql-queries/misc.js +0 -2
- package/dist/sql-queries/misc.js.map +0 -1
- package/src/sql-queries/misc.ts +0 -2
|
@@ -4,33 +4,52 @@ import { Schema } from '@livestore/utils/effect'
|
|
|
4
4
|
|
|
5
5
|
import * as F from './field-defs.ts'
|
|
6
6
|
|
|
7
|
-
describe
|
|
7
|
+
describe('FieldDefs', () => {
|
|
8
8
|
test('text', () => {
|
|
9
|
-
expect(F.text()).toMatchSnapshot()
|
|
10
|
-
expect(F.text({})).toMatchSnapshot()
|
|
11
|
-
expect(F.text({ default: null, nullable: true })).toMatchSnapshot()
|
|
12
|
-
expect(
|
|
13
|
-
|
|
9
|
+
expect(columnDefSnapshot(F.text())).toMatchSnapshot()
|
|
10
|
+
expect(columnDefSnapshot(F.text({}))).toMatchSnapshot()
|
|
11
|
+
expect(columnDefSnapshot(F.text({ default: null, nullable: true }))).toMatchSnapshot()
|
|
12
|
+
expect(
|
|
13
|
+
columnDefSnapshot(F.text({ schema: Schema.Literal('foo'), nullable: true, default: 'foo' })),
|
|
14
|
+
).toMatchSnapshot()
|
|
15
|
+
expect(
|
|
16
|
+
columnDefSnapshot(F.text({ schema: Schema.Union([Schema.Literal('foo')]), nullable: true, default: 'foo' })),
|
|
17
|
+
).toMatchSnapshot()
|
|
14
18
|
})
|
|
15
19
|
|
|
16
20
|
test('json', () => {
|
|
17
|
-
expect(F.json()).toMatchSnapshot()
|
|
18
|
-
expect(F.json({ default: null, nullable: true })).toMatchSnapshot()
|
|
21
|
+
expect(columnDefSnapshot(F.json())).toMatchSnapshot()
|
|
22
|
+
expect(columnDefSnapshot(F.json({ default: null, nullable: true }))).toMatchSnapshot()
|
|
19
23
|
expect(
|
|
20
|
-
|
|
24
|
+
columnDefSnapshot(
|
|
25
|
+
F.json({ schema: Schema.Struct({ name: Schema.String }), default: { name: 'Bob' }, nullable: true }),
|
|
26
|
+
),
|
|
21
27
|
).toMatchSnapshot()
|
|
22
28
|
})
|
|
23
29
|
|
|
24
30
|
test('datetime', () => {
|
|
25
|
-
expect(F.datetime()).toMatchSnapshot()
|
|
26
|
-
expect(F.datetime({})).toMatchSnapshot()
|
|
27
|
-
expect(F.datetime({ default: null, nullable: true })).toMatchSnapshot()
|
|
28
|
-
expect(F.datetime({ default: new Date('2022-02-02') })).toMatchSnapshot()
|
|
31
|
+
expect(columnDefSnapshot(F.datetime())).toMatchSnapshot()
|
|
32
|
+
expect(columnDefSnapshot(F.datetime({}))).toMatchSnapshot()
|
|
33
|
+
expect(columnDefSnapshot(F.datetime({ default: null, nullable: true }))).toMatchSnapshot()
|
|
34
|
+
expect(columnDefSnapshot(F.datetime({ default: new Date('2022-02-02') }))).toMatchSnapshot()
|
|
29
35
|
})
|
|
30
36
|
|
|
31
37
|
test('boolean', () => {
|
|
32
|
-
expect(F.boolean()).toMatchSnapshot()
|
|
33
|
-
expect(F.boolean({})).toMatchSnapshot()
|
|
34
|
-
expect(F.boolean({ default: false })).toMatchSnapshot()
|
|
38
|
+
expect(columnDefSnapshot(F.boolean())).toMatchSnapshot()
|
|
39
|
+
expect(columnDefSnapshot(F.boolean({}))).toMatchSnapshot()
|
|
40
|
+
expect(columnDefSnapshot(F.boolean({ default: false }))).toMatchSnapshot()
|
|
35
41
|
})
|
|
36
42
|
})
|
|
43
|
+
|
|
44
|
+
const columnDefSnapshot = (columnDef: F.ColumnDefinition.Any) => ({
|
|
45
|
+
...columnDef,
|
|
46
|
+
schema: schemaSnapshot(columnDef.schema),
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// Effect schemas expose a large inspectable object graph. Snapshot only the
|
|
50
|
+
// schema shape this DSL cares about.
|
|
51
|
+
const schemaSnapshot = (schema: Schema.Codec<unknown, unknown>) => ({
|
|
52
|
+
ast: schema.ast._tag,
|
|
53
|
+
encodedAst: Schema.toEncoded(schema).ast._tag,
|
|
54
|
+
decodedAst: Schema.toType(schema).ast._tag,
|
|
55
|
+
})
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { casesHandled } from '@livestore/utils'
|
|
2
2
|
import { Option, Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
|
+
import { SqliteReal } from '../../../../../util.ts'
|
|
5
|
+
|
|
4
6
|
export type SqlDefaultValue = {
|
|
5
7
|
readonly sql: string
|
|
6
8
|
}
|
|
@@ -21,7 +23,7 @@ export const resolveColumnDefault = <T>(value: ColumnDefaultValue<T>): T | null
|
|
|
21
23
|
|
|
22
24
|
export type ColumnDefinition<TEncoded, TDecoded, TNullable extends boolean = boolean> = {
|
|
23
25
|
readonly columnType: FieldColumnType
|
|
24
|
-
readonly schema: Schema.
|
|
26
|
+
readonly schema: Schema.Codec<TDecoded, TEncoded>
|
|
25
27
|
readonly default: Option.Option<ColumnDefaultValue<TDecoded>>
|
|
26
28
|
/** @default false */
|
|
27
29
|
readonly nullable: TNullable
|
|
@@ -55,7 +57,7 @@ type ColumnDefaultArg<T, TNullable extends boolean> =
|
|
|
55
57
|
| NoDefault
|
|
56
58
|
|
|
57
59
|
export type ColumnDefinitionInput = {
|
|
58
|
-
readonly schema?: Schema.
|
|
60
|
+
readonly schema?: Schema.Codec<unknown, unknown>
|
|
59
61
|
readonly default?: ColumnDefaultArg<unknown, boolean>
|
|
60
62
|
readonly nullable?: boolean
|
|
61
63
|
readonly primaryKey?: boolean
|
|
@@ -68,7 +70,7 @@ export type NoDefault = typeof NoDefault
|
|
|
68
70
|
export type ColDefFn<TColumnType extends FieldColumnType> = {
|
|
69
71
|
(): {
|
|
70
72
|
columnType: TColumnType
|
|
71
|
-
schema: Schema.
|
|
73
|
+
schema: Schema.Codec<DefaultEncodedForColumnType<TColumnType>>
|
|
72
74
|
default: Option.None<never>
|
|
73
75
|
nullable: false
|
|
74
76
|
primaryKey: false
|
|
@@ -82,7 +84,7 @@ export type ColDefFn<TColumnType extends FieldColumnType> = {
|
|
|
82
84
|
const TPrimaryKey extends boolean = false,
|
|
83
85
|
const TAutoIncrement extends boolean = false,
|
|
84
86
|
>(args: {
|
|
85
|
-
schema?: Schema.
|
|
87
|
+
schema?: Schema.Codec<TDecoded, TEncoded>
|
|
86
88
|
default?: TDefault
|
|
87
89
|
nullable?: TNullable
|
|
88
90
|
primaryKey?: TPrimaryKey
|
|
@@ -90,8 +92,8 @@ export type ColDefFn<TColumnType extends FieldColumnType> = {
|
|
|
90
92
|
}): {
|
|
91
93
|
columnType: TColumnType
|
|
92
94
|
schema: TNullable extends true
|
|
93
|
-
? Schema.
|
|
94
|
-
: Schema.
|
|
95
|
+
? Schema.Codec<NoInfer<TDecoded> | null, NoInfer<TEncoded> | null>
|
|
96
|
+
: Schema.Codec<NoInfer<TDecoded>, NoInfer<TEncoded>>
|
|
95
97
|
default: TDefault extends NoDefault ? Option.None<never> : Option.Some<NoInfer<TDefault>>
|
|
96
98
|
nullable: NoInfer<TNullable>
|
|
97
99
|
primaryKey: NoInfer<TPrimaryKey>
|
|
@@ -103,7 +105,7 @@ const makeColDef =
|
|
|
103
105
|
<TColumnType extends FieldColumnType>(columnType: TColumnType): ColDefFn<TColumnType> =>
|
|
104
106
|
(def?: ColumnDefinitionInput) => {
|
|
105
107
|
const nullable = def?.nullable ?? false
|
|
106
|
-
const schemaWithoutNull
|
|
108
|
+
const schemaWithoutNull = def?.schema ?? defaultSchemaForColumnType(columnType)
|
|
107
109
|
const schema = nullable === true ? Schema.NullOr(schemaWithoutNull) : schemaWithoutNull
|
|
108
110
|
const default_ = def?.default === undefined || def.default === NoDefault ? Option.none() : Option.some(def.default)
|
|
109
111
|
|
|
@@ -143,7 +145,7 @@ export type SpecializedColDefFn<
|
|
|
143
145
|
> = {
|
|
144
146
|
(): {
|
|
145
147
|
columnType: TColumnType
|
|
146
|
-
schema: Schema.
|
|
148
|
+
schema: Schema.Codec<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
|
|
147
149
|
default: Option.None<never>
|
|
148
150
|
nullable: false
|
|
149
151
|
primaryKey: false
|
|
@@ -158,7 +160,7 @@ export type SpecializedColDefFn<
|
|
|
158
160
|
>(
|
|
159
161
|
args: TAllowsCustomSchema extends true
|
|
160
162
|
? {
|
|
161
|
-
schema?: Schema.
|
|
163
|
+
schema?: Schema.Codec<TDecoded, any>
|
|
162
164
|
default?: TDefault
|
|
163
165
|
nullable?: TNullable
|
|
164
166
|
primaryKey?: TPrimaryKey
|
|
@@ -173,8 +175,8 @@ export type SpecializedColDefFn<
|
|
|
173
175
|
): {
|
|
174
176
|
columnType: TColumnType
|
|
175
177
|
schema: TNullable extends true
|
|
176
|
-
? Schema.
|
|
177
|
-
: Schema.
|
|
178
|
+
? Schema.Codec<NoInfer<TDecoded> | null, DefaultEncodedForColumnType<TColumnType> | null>
|
|
179
|
+
: Schema.Codec<NoInfer<TDecoded>, DefaultEncodedForColumnType<TColumnType>>
|
|
178
180
|
default: TDefault extends NoDefault ? Option.None<never> : Option.Some<TDefault>
|
|
179
181
|
nullable: NoInfer<TNullable>
|
|
180
182
|
primaryKey: NoInfer<TPrimaryKey>
|
|
@@ -187,7 +189,7 @@ type MakeSpecializedColDefFn = {
|
|
|
187
189
|
columnType: TColumnType,
|
|
188
190
|
opts: {
|
|
189
191
|
_tag: 'baseSchema'
|
|
190
|
-
baseSchema: Schema.
|
|
192
|
+
baseSchema: Schema.Codec<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
|
|
191
193
|
},
|
|
192
194
|
): SpecializedColDefFn<TColumnType, false, TBaseDecoded>
|
|
193
195
|
<TColumnType extends FieldColumnType, TBaseDecoded>(
|
|
@@ -195,8 +197,8 @@ type MakeSpecializedColDefFn = {
|
|
|
195
197
|
opts: {
|
|
196
198
|
_tag: 'baseSchemaFn'
|
|
197
199
|
baseSchemaFn: <TDecoded>(
|
|
198
|
-
customSchema: Schema.
|
|
199
|
-
) => Schema.
|
|
200
|
+
customSchema: Schema.Codec<TDecoded, TBaseDecoded> | undefined,
|
|
201
|
+
) => Schema.Codec<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
|
|
200
202
|
},
|
|
201
203
|
): SpecializedColDefFn<TColumnType, true, TBaseDecoded>
|
|
202
204
|
}
|
|
@@ -221,28 +223,22 @@ const makeSpecializedColDef: MakeSpecializedColDefFn = (columnType, opts) => (de
|
|
|
221
223
|
|
|
222
224
|
export const json: SpecializedColDefFn<'text', true, unknown> = makeSpecializedColDef('text', {
|
|
223
225
|
_tag: 'baseSchemaFn',
|
|
224
|
-
baseSchemaFn: (customSchema) => Schema.
|
|
226
|
+
baseSchemaFn: (customSchema) => Schema.fromJsonString(customSchema ?? Schema.Any),
|
|
225
227
|
})
|
|
226
228
|
|
|
227
229
|
export const datetime: SpecializedColDefFn<'text', false, Date> = makeSpecializedColDef('text', {
|
|
228
230
|
_tag: 'baseSchema',
|
|
229
|
-
baseSchema: Schema.
|
|
231
|
+
baseSchema: Schema.DateFromString,
|
|
230
232
|
})
|
|
231
233
|
|
|
232
234
|
export const datetimeInteger: SpecializedColDefFn<'integer', false, Date> = makeSpecializedColDef('integer', {
|
|
233
235
|
_tag: 'baseSchema',
|
|
234
|
-
baseSchema: Schema.
|
|
235
|
-
decode: (ms) => new Date(ms),
|
|
236
|
-
encode: (date) => date.getTime(),
|
|
237
|
-
}),
|
|
236
|
+
baseSchema: Schema.DateFromMillis,
|
|
238
237
|
})
|
|
239
238
|
|
|
240
239
|
export const boolean: SpecializedColDefFn<'integer', false, boolean> = makeSpecializedColDef('integer', {
|
|
241
240
|
_tag: 'baseSchema',
|
|
242
|
-
baseSchema: Schema.
|
|
243
|
-
decode: (_) => _ === 1,
|
|
244
|
-
encode: (_) => (_ === true ? 1 : 0),
|
|
245
|
-
}),
|
|
241
|
+
baseSchema: Schema.BooleanFromBit,
|
|
246
242
|
})
|
|
247
243
|
|
|
248
244
|
export type FieldColumnType = 'text' | 'integer' | 'real' | 'blob'
|
|
@@ -257,27 +253,25 @@ export type DefaultEncodedForColumnType<TColumnType extends FieldColumnType> = T
|
|
|
257
253
|
? Uint8Array<ArrayBuffer>
|
|
258
254
|
: never
|
|
259
255
|
|
|
260
|
-
export const defaultSchemaForColumnType = <TColumnType extends FieldColumnType>(
|
|
261
|
-
columnType: TColumnType,
|
|
262
|
-
): Schema.Schema<DefaultEncodedForColumnType<TColumnType>> => {
|
|
256
|
+
export const defaultSchemaForColumnType = <TColumnType extends FieldColumnType>(columnType: TColumnType) => {
|
|
263
257
|
type T = DefaultEncodedForColumnType<TColumnType>
|
|
264
258
|
|
|
265
259
|
switch (columnType) {
|
|
266
260
|
case 'text': {
|
|
267
261
|
// oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
|
|
268
|
-
return Schema.String as
|
|
262
|
+
return Schema.String as Schema.Codec<T>
|
|
269
263
|
}
|
|
270
264
|
case 'integer': {
|
|
271
265
|
// oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
|
|
272
|
-
return Schema.
|
|
266
|
+
return Schema.Finite as Schema.Codec<T>
|
|
273
267
|
}
|
|
274
268
|
case 'real': {
|
|
275
269
|
// oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
|
|
276
|
-
return
|
|
270
|
+
return SqliteReal as Schema.Codec<T>
|
|
277
271
|
}
|
|
278
272
|
case 'blob': {
|
|
279
273
|
// oxlint-disable-next-line typescript-eslint(no-unsafe-type-assertion) -- switch-based type narrowing for column type to schema mapping; each case is correct for its branch
|
|
280
|
-
return Schema.
|
|
274
|
+
return Schema.Uint8Array as Schema.Codec<T>
|
|
281
275
|
}
|
|
282
276
|
default: {
|
|
283
277
|
return casesHandled(columnType)
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Nullable } from '@livestore/utils'
|
|
2
2
|
import { omitUndefineds } from '@livestore/utils'
|
|
3
|
-
import type
|
|
4
|
-
import { Schema } from '@livestore/utils/effect'
|
|
3
|
+
import { type Option, Schema, Struct, type Types } from '@livestore/utils/effect'
|
|
5
4
|
|
|
6
5
|
import type * as SqliteAst from '../ast/sqlite.ts'
|
|
7
6
|
import type { ColumnDefinition } from './field-defs.ts'
|
|
@@ -52,26 +51,41 @@ export const table = <TTableName extends string, TColumns extends Columns, TInde
|
|
|
52
51
|
export type AnyIfConstained<In, Out> = '__constrained' extends keyof In ? any : Out
|
|
53
52
|
export type EmptyObjIfConstained<In> = '__constrained' extends keyof In ? {} : In
|
|
54
53
|
|
|
55
|
-
export type
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
export type StructFieldsForColumns<TCols extends ConstraintColumns> = '__constrained' extends keyof TCols
|
|
55
|
+
? Record<string, Schema.Codec<any, any>>
|
|
56
|
+
: { readonly [K in keyof TCols]: TCols[K]['schema'] }
|
|
57
|
+
|
|
58
|
+
export type StructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Struct<StructFieldsForColumns<TCols>>
|
|
59
59
|
|
|
60
|
-
export type InsertStructSchemaForColumns<TCols extends ConstraintColumns> = Schema.
|
|
60
|
+
export type InsertStructSchemaForColumns<TCols extends ConstraintColumns> = Schema.Codec<
|
|
61
61
|
AnyIfConstained<TCols, FromColumns.InsertRowDecoded<TCols>>,
|
|
62
62
|
AnyIfConstained<TCols, FromColumns.InsertRowEncoded<TCols>>
|
|
63
63
|
>
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
interface GetColumnSchema extends Struct.Lambda {
|
|
66
|
+
<TEncoded, TDecoded, TNullable extends boolean>(
|
|
67
|
+
column: ColumnDefinition<TEncoded, TDecoded, TNullable>,
|
|
68
|
+
): ColumnDefinition<TEncoded, TDecoded, TNullable>['schema']
|
|
69
|
+
readonly '~lambda.out': this['~lambda.in'] extends ColumnDefinition<any, any, any>
|
|
70
|
+
? this['~lambda.in']['schema']
|
|
71
|
+
: never
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const getColumnSchema = Struct.lambda<GetColumnSchema>((column) => column.schema)
|
|
75
|
+
|
|
76
|
+
const structFieldsForColumns = <TCols extends ConstraintColumns>(columns: TCols): StructFieldsForColumns<TCols> =>
|
|
77
|
+
Struct.map(columns, getColumnSchema)
|
|
78
|
+
|
|
79
|
+
export const structSchemaForTable = <TTableName extends string, TColumns extends ConstraintColumns>(
|
|
80
|
+
tableDef: TableDefinition<TTableName, TColumns>,
|
|
81
|
+
): StructSchemaForColumns<TColumns> =>
|
|
82
|
+
Schema.Struct(structFieldsForColumns(tableDef.columns)).annotate({
|
|
69
83
|
title: tableDef.name,
|
|
70
|
-
})
|
|
84
|
+
})
|
|
71
85
|
|
|
72
|
-
export const insertStructSchemaForTable = <
|
|
73
|
-
tableDef:
|
|
74
|
-
): InsertStructSchemaForColumns<
|
|
86
|
+
export const insertStructSchemaForTable = <TTableName extends string, TColumns extends ConstraintColumns>(
|
|
87
|
+
tableDef: TableDefinition<TTableName, TColumns>,
|
|
88
|
+
): InsertStructSchemaForColumns<TColumns> =>
|
|
75
89
|
Schema.Struct(
|
|
76
90
|
Object.fromEntries(
|
|
77
91
|
tableDef.ast.columns.map((column) => [
|
|
@@ -80,7 +94,7 @@ export const insertStructSchemaForTable = <TTableDefinition extends TableDefinit
|
|
|
80
94
|
column.nullable === true || column.default._tag === 'Some' ? Schema.optional(column.schema) : column.schema,
|
|
81
95
|
]),
|
|
82
96
|
),
|
|
83
|
-
).
|
|
97
|
+
).annotate({
|
|
84
98
|
title: tableDef.name,
|
|
85
99
|
}) as any
|
|
86
100
|
|
|
@@ -150,7 +164,7 @@ export namespace FromTable {
|
|
|
150
164
|
}
|
|
151
165
|
|
|
152
166
|
export type RowEncodeNonNullable<TTableDefinition extends TableDefinition<any, any>> = {
|
|
153
|
-
[K in keyof TTableDefinition['columns']]:
|
|
167
|
+
[K in keyof TTableDefinition['columns']]: TTableDefinition['columns'][K]['schema']['Encoded']
|
|
154
168
|
}
|
|
155
169
|
|
|
156
170
|
export type RowEncoded<TTableDefinition extends TableDefinition<any, any>> = Types.Simplify<
|
|
@@ -167,7 +181,7 @@ export namespace FromTable {
|
|
|
167
181
|
// >
|
|
168
182
|
|
|
169
183
|
export type RowDecodedAll<TTableDefinition extends TableDefinition<any, any>> = {
|
|
170
|
-
[K in keyof TTableDefinition['columns']]:
|
|
184
|
+
[K in keyof TTableDefinition['columns']]: TTableDefinition['columns'][K]['schema']['Type']
|
|
171
185
|
}
|
|
172
186
|
}
|
|
173
187
|
|
|
@@ -179,11 +193,11 @@ export namespace FromColumns {
|
|
|
179
193
|
>
|
|
180
194
|
|
|
181
195
|
export type RowDecodedAll<TColumns extends Columns> = {
|
|
182
|
-
readonly [K in keyof TColumns]:
|
|
196
|
+
readonly [K in keyof TColumns]: TColumns[K]['schema']['Type']
|
|
183
197
|
}
|
|
184
198
|
|
|
185
199
|
export type RowEncodedAll<TColumns extends Columns> = {
|
|
186
|
-
readonly [K in keyof TColumns]:
|
|
200
|
+
readonly [K in keyof TColumns]: TColumns[K]['schema']['Encoded']
|
|
187
201
|
}
|
|
188
202
|
|
|
189
203
|
export type RowEncoded<TColumns extends Columns> = Types.Simplify<
|
|
@@ -192,7 +206,7 @@ export namespace FromColumns {
|
|
|
192
206
|
>
|
|
193
207
|
|
|
194
208
|
export type RowEncodeNonNullable<TColumns extends Columns> = {
|
|
195
|
-
readonly [K in keyof TColumns]:
|
|
209
|
+
readonly [K in keyof TColumns]: TColumns[K]['schema']['Encoded']
|
|
196
210
|
}
|
|
197
211
|
|
|
198
212
|
export type NullableColumnNames<TColumns extends Columns> = keyof {
|
|
@@ -60,14 +60,12 @@ export const makeState = <TStateInput extends InputState>(inputSchema: TStateInp
|
|
|
60
60
|
tables: [...tables.values()].map((_) => _.sqliteDef.ast),
|
|
61
61
|
})
|
|
62
62
|
|
|
63
|
-
return { sqlite: { tables, migrations: inputSchema.migrations ?? {
|
|
63
|
+
return { sqlite: { tables, migrations: inputSchema.migrations ?? {}, hash }, materializers }
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
export type InputState = {
|
|
67
67
|
readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
|
|
68
68
|
readonly materializers: Record<string, Materializer<any>>
|
|
69
|
-
/**
|
|
70
|
-
* @default { strategy: 'auto' }
|
|
71
|
-
*/
|
|
69
|
+
/** Configures hooks and logging for automatic state migration. */
|
|
72
70
|
readonly migrations?: MigrationOptions
|
|
73
71
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LiveStoreSchema } from '../../schema.ts'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns the schema-keyed base name shared by persisted state databases.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
*
|
|
8
|
+
* Adapters append backend-specific storage-format namespaces and file
|
|
9
|
+
* extensions.
|
|
10
|
+
*/
|
|
11
|
+
export const getStateDbBaseName = (schema: LiveStoreSchema): string => `state${schema.state.sqlite.hash}`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { GetValForKey, SingleOrReadonlyArray } from '@livestore/utils'
|
|
2
2
|
import { type Option, Predicate, type Schema } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
|
-
import type { SessionIdSymbol } from '../../../../
|
|
4
|
+
import type { SessionIdSymbol } from '../../../../session-id-symbol.ts'
|
|
5
5
|
import type { SqlValue } from '../../../../util.ts'
|
|
6
6
|
import type { ClientDocumentTableDef, ClientDocumentTableDefSymbol } from '../client-document-def.ts'
|
|
7
7
|
import type { SqliteDsl } from '../db-schema/mod.ts'
|
|
@@ -32,14 +32,14 @@ export namespace QueryBuilderAst {
|
|
|
32
32
|
readonly limit: Option.Option<number>
|
|
33
33
|
readonly tableDef: TableDefBase
|
|
34
34
|
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
|
35
|
-
readonly resultSchemaSingle: Schema.
|
|
35
|
+
readonly resultSchemaSingle: Schema.Codec<any, any>
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
export interface CountQuery {
|
|
39
39
|
readonly _tag: 'CountQuery'
|
|
40
40
|
readonly tableDef: TableDefBase
|
|
41
41
|
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
|
42
|
-
readonly resultSchema: Schema.
|
|
42
|
+
readonly resultSchema: Schema.Codec<number, ReadonlyArray<{ count: number }>>
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export interface RowQuery {
|
|
@@ -55,7 +55,7 @@ export namespace QueryBuilderAst {
|
|
|
55
55
|
readonly values: Record<string, unknown>
|
|
56
56
|
readonly onConflict: OnConflict | undefined
|
|
57
57
|
readonly returning: string[] | undefined
|
|
58
|
-
readonly resultSchema: Schema.
|
|
58
|
+
readonly resultSchema: Schema.Codec<any, any>
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
export interface OnConflict {
|
|
@@ -76,7 +76,7 @@ export namespace QueryBuilderAst {
|
|
|
76
76
|
readonly values: Record<string, unknown>
|
|
77
77
|
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
|
78
78
|
readonly returning: string[] | undefined
|
|
79
|
-
readonly resultSchema: Schema.
|
|
79
|
+
readonly resultSchema: Schema.Codec<any, any>
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
export interface DeleteQuery {
|
|
@@ -84,7 +84,7 @@ export namespace QueryBuilderAst {
|
|
|
84
84
|
readonly tableDef: TableDefBase
|
|
85
85
|
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
|
86
86
|
readonly returning: string[] | undefined
|
|
87
|
-
readonly resultSchema: Schema.
|
|
87
|
+
readonly resultSchema: Schema.Codec<any, any>
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
export type WriteQuery = InsertQuery | UpdateQuery | DeleteQuery
|
|
@@ -115,7 +115,7 @@ export const isQueryBuilder = (value: unknown): value is QueryBuilder<any, any,
|
|
|
115
115
|
|
|
116
116
|
export type QueryBuilder<
|
|
117
117
|
TResult,
|
|
118
|
-
TTableDef extends TableDefBase,
|
|
118
|
+
TTableDef extends TableDefBase<any, any>,
|
|
119
119
|
/** Used to gradually remove features from the API based on the query context */
|
|
120
120
|
TWithout extends QueryBuilder.ApiFeature = never,
|
|
121
121
|
> = {
|
|
@@ -230,8 +230,8 @@ export namespace QueryBuilder {
|
|
|
230
230
|
/** Select multiple columns */
|
|
231
231
|
<TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
|
|
232
232
|
...columns: TColumns[]
|
|
233
|
-
)
|
|
234
|
-
|
|
233
|
+
): QueryBuilder<
|
|
234
|
+
// params: QueryBuilderSelectParams, // TODO also support arbitrary SQL selects
|
|
235
235
|
ReadonlyArray<{
|
|
236
236
|
readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
|
|
237
237
|
}>,
|
|
@@ -1,48 +1,45 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
|
-
import { Schema, SchemaAST } from '@livestore/utils/effect'
|
|
2
|
+
import { Schema, SchemaAST, Struct } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
|
-
import { SessionIdSymbol } from '../../../../
|
|
4
|
+
import { SessionIdSymbol } from '../../../../session-id-symbol.ts'
|
|
5
5
|
import type { SqlValue } from '../../../../util.ts'
|
|
6
6
|
import type { State } from '../../../mod.ts'
|
|
7
7
|
import type { QueryBuilderAst } from './api.ts'
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Extracts array element schema from a JSON array
|
|
11
|
-
* Returns the element schema, or undefined if not a JSON array
|
|
10
|
+
* Extracts array element schema from a JSON array AST with a JSON string encoding.
|
|
11
|
+
* Returns the element schema, or undefined if the AST is not a JSON array.
|
|
12
12
|
*/
|
|
13
|
-
const
|
|
14
|
-
if (
|
|
13
|
+
const extractJsonArrayElementSchema = (ast: SchemaAST.AST): Schema.Top | undefined => {
|
|
14
|
+
if (hasJsonStringEncoding(ast) === false) return undefined
|
|
15
15
|
|
|
16
|
-
const
|
|
17
|
-
// Check if the
|
|
18
|
-
if (SchemaAST.
|
|
16
|
+
const typeAst = SchemaAST.toType(ast)
|
|
17
|
+
// Check if the type side is Arrays (Effect's internal representation of Array)
|
|
18
|
+
if (SchemaAST.isArrays(typeAst) === false) return undefined
|
|
19
19
|
|
|
20
|
-
// For Schema.Array, rest contains
|
|
21
|
-
const restElement =
|
|
20
|
+
// For Schema.Array, rest contains the element AST - get the first one.
|
|
21
|
+
const restElement = typeAst.rest[0]
|
|
22
22
|
if (restElement === undefined) return undefined
|
|
23
23
|
|
|
24
|
-
return Schema.make(restElement
|
|
24
|
+
return Schema.make(restElement)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
* For JSON array columns, extracts the element schema from Schema.
|
|
29
|
-
* Also handles nullable JSON arrays (Schema.NullOr(Schema.
|
|
28
|
+
* For JSON array columns, extracts the element schema from Schema.fromJsonString(Schema.Array(ElementSchema)).
|
|
29
|
+
* Also handles nullable JSON arrays (Schema.NullOr(Schema.fromJsonString(Schema.Array(...)))).
|
|
30
30
|
* Returns the element schema, or undefined if the column is not a JSON array.
|
|
31
31
|
*/
|
|
32
|
-
const getJsonArrayElementSchema = (colSchema: Schema.
|
|
32
|
+
const getJsonArrayElementSchema = (colSchema: Schema.Top): Schema.Top | undefined => {
|
|
33
33
|
const ast = colSchema.ast
|
|
34
34
|
|
|
35
|
-
// Case 1: Direct
|
|
36
|
-
|
|
37
|
-
if (
|
|
38
|
-
return extractArrayElementFromTransformation(ast)
|
|
39
|
-
}
|
|
35
|
+
// Case 1: Direct JSON string encoding (non-nullable JSON array)
|
|
36
|
+
const direct = extractJsonArrayElementSchema(ast)
|
|
37
|
+
if (direct !== undefined) return direct
|
|
40
38
|
|
|
41
|
-
// Case 2: Nullable JSON array - Schema.NullOr wraps the
|
|
42
|
-
// Structure: Union([Transformation (JSON array), Literal (null)])
|
|
39
|
+
// Case 2: Nullable JSON array - Schema.NullOr wraps the JSON array in a Union.
|
|
43
40
|
if (SchemaAST.isUnion(ast) === true) {
|
|
44
41
|
for (const member of ast.types) {
|
|
45
|
-
const result =
|
|
42
|
+
const result = extractJsonArrayElementSchema(member)
|
|
46
43
|
if (result !== undefined) return result
|
|
47
44
|
}
|
|
48
45
|
}
|
|
@@ -50,12 +47,20 @@ const getJsonArrayElementSchema = (colSchema: Schema.Schema.Any): Schema.Schema.
|
|
|
50
47
|
return undefined
|
|
51
48
|
}
|
|
52
49
|
|
|
50
|
+
/**
|
|
51
|
+
* `SchemaTransformation.fromJsonString` is a factory since Effect rc.109, so encoding links can no
|
|
52
|
+
* longer be matched by identity. `Schema.fromJsonString` annotates its encoded side as
|
|
53
|
+
* `application/json`, which identifies the link regardless of the reviver/replacer/space options.
|
|
54
|
+
*/
|
|
55
|
+
const hasJsonStringEncoding = (ast: SchemaAST.AST): boolean =>
|
|
56
|
+
ast.encoding?.some((link) => link.to.annotations?.contentMediaType === 'application/json') === true
|
|
57
|
+
|
|
53
58
|
/**
|
|
54
59
|
* Encodes a JSON array element to the representation returned by SQLite's json_each().
|
|
55
60
|
* Objects/arrays are stringified so they match json_each's TEXT representation.
|
|
56
61
|
*/
|
|
57
|
-
const encodeJsonArrayElementValue = (elementSchema: Schema.
|
|
58
|
-
const encoded = Schema.encodeSync(elementSchema as Schema.
|
|
62
|
+
const encodeJsonArrayElementValue = (elementSchema: Schema.Top, value: unknown): SqlValue => {
|
|
63
|
+
const encoded = Schema.encodeSync(elementSchema as Schema.Codec<unknown, SqlValue>)(value)
|
|
59
64
|
|
|
60
65
|
if (encoded === null) return null
|
|
61
66
|
if (typeof encoded === 'object') {
|
|
@@ -237,7 +242,7 @@ export const astToSql = (ast: QueryBuilderAst): { query: string; bindValues: Sql
|
|
|
237
242
|
// return shouldNeverHappen('UPDATE query requires at least one column to set.')
|
|
238
243
|
}
|
|
239
244
|
|
|
240
|
-
const encodedValues = Schema.encodeSync(
|
|
245
|
+
const encodedValues = Schema.encodeSync(ast.tableDef.rowSchema.mapFields(Struct.map(Schema.optional)))(ast.values)
|
|
241
246
|
|
|
242
247
|
// Ensure bind values are added in the same order as columns
|
|
243
248
|
setColumns.forEach((col) => {
|