@livestore/common 0.4.0-dev.8 → 0.4.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 +27 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/WorkerTransportError.d.ts +11 -0
- package/dist/WorkerTransportError.d.ts.map +1 -0
- package/dist/WorkerTransportError.js +11 -0
- package/dist/WorkerTransportError.js.map +1 -0
- package/dist/adapter-types.d.ts +37 -7
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +27 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js +6 -4
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
- package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
- package/dist/devtools/devtools-compatibility.test.js +15 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -0
- package/dist/devtools/devtools-messages-client-session.d.ts +55 -24
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +22 -5
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +11 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +7 -9
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +65 -30
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +29 -11
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +7 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +13 -2
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +10 -3
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +48 -18
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +20 -12
- 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 +53 -6
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +325 -257
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +107 -0
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
- package/dist/leader-thread/RejectedPushError.js +78 -0
- package/dist/leader-thread/RejectedPushError.js.map +1 -0
- package/dist/leader-thread/connection.js +1 -1
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +19 -14
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +78 -18
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +90 -58
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -7
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +49 -17
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
- package/dist/leader-thread/materialize-event.d.ts +1 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +28 -9
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +6 -6
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +56 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +167 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +95 -17
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +13 -0
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +7 -4
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -6
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +18 -8
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +7 -2
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -3
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +40 -29
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +161 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +140 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +99 -0
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.js +144 -0
- package/dist/schema/EventDef/deprecated.js.map +1 -0
- package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
- package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.test.js +95 -0
- package/dist/schema/EventDef/deprecated.test.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +110 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +6 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +6 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +193 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +44 -44
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +102 -111
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.js +176 -0
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.js +111 -0
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +6 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -4
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +16 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +32 -4
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +2 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +36 -15
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +2 -2
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +96 -47
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +51 -12
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +24 -15
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
- 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 +16 -10
- 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 +15 -4
- 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 +1 -1
- 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 +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +2 -2
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +5 -7
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +51 -22
- 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 +99 -22
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +28 -15
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +231 -93
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +24 -14
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +21 -450
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +5 -3
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +1 -1
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +92 -3
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +47 -0
- package/dist/schema/unknown-events.d.ts.map +1 -0
- package/dist/schema/unknown-events.js +69 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +38 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +18 -6
- package/dist/sql-queries/sql-queries.js.map +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/sqlite-db-helper.js +3 -3
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +5 -5
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +12 -12
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +99 -114
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +0 -33
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +5 -22
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +10 -8
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +71 -69
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +11 -12
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +7 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +54 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +198 -9
- 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 +11 -11
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +6 -6
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +2 -2
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +11 -11
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +3 -3
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +3 -3
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +33 -13
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +38 -1
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +23 -2
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +55 -55
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +80 -98
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +221 -132
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +36 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +56 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- 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 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +68 -0
- package/dist/testing/event-factory.d.ts.map +1 -0
- package/dist/testing/event-factory.js +78 -0
- package/dist/testing/event-factory.js.map +1 -0
- package/dist/testing/mod.d.ts +2 -0
- package/dist/testing/mod.d.ts.map +1 -0
- package/dist/testing/mod.js +2 -0
- package/dist/testing/mod.js.map +1 -0
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +24 -5
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +25 -8
- package/dist/version.js.map +1 -1
- package/package.json +69 -16
- package/src/ClientSessionLeaderThreadProxy.ts +27 -12
- package/src/WorkerTransportError.ts +12 -0
- package/src/adapter-types.ts +50 -7
- package/src/bounded-collections.ts +6 -5
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-compatibility.test.ts +18 -0
- package/src/devtools/devtools-messages-client-session.ts +22 -4
- package/src/devtools/devtools-messages-common.ts +7 -12
- package/src/devtools/devtools-messages-leader.ts +29 -10
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +32 -24
- package/src/index.ts +4 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
- package/src/leader-thread/RejectedPushError.ts +106 -0
- package/src/leader-thread/connection.ts +1 -1
- package/src/leader-thread/eventlog.ts +112 -39
- package/src/leader-thread/leader-worker-devtools.ts +201 -120
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +125 -40
- package/src/leader-thread/materialize-event.ts +40 -10
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +7 -7
- package/src/leader-thread/shutdown-channel.ts +4 -8
- package/src/leader-thread/stream-events.ts +206 -0
- package/src/leader-thread/types.ts +68 -18
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +11 -5
- package/src/materializer-helper.ts +27 -16
- package/src/otel.ts +13 -2
- package/src/rematerialize-from-eventlog.ts +61 -51
- package/src/schema/EventDef/define.ts +217 -0
- package/src/schema/EventDef/deprecated.test.ts +129 -0
- package/src/schema/EventDef/deprecated.ts +175 -0
- package/src/schema/EventDef/event-def.ts +125 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +5 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +72 -53
- package/src/schema/LiveStoreEvent/client.test.ts +129 -0
- package/src/schema/LiveStoreEvent/client.ts +235 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +6 -4
- package/src/schema/schema.ts +46 -5
- package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
- package/src/schema/state/sqlite/client-document-def.ts +47 -34
- package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
- package/src/schema/state/sqlite/column-annotations.ts +2 -1
- package/src/schema/state/sqlite/column-def.test.ts +66 -12
- package/src/schema/state/sqlite/column-def.ts +119 -47
- package/src/schema/state/sqlite/column-spec.test.ts +32 -17
- package/src/schema/state/sqlite/column-spec.ts +37 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
- package/src/schema/state/sqlite/mod.ts +7 -8
- package/src/schema/state/sqlite/query-builder/api.ts +55 -17
- package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
- package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
- package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +30 -22
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +114 -3
- package/src/schema/state/sqlite/table-def.ts +16 -22
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
- package/src/schema-management/common.ts +2 -2
- package/src/schema-management/migrations.ts +42 -9
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +18 -6
- package/src/sql-queries/sql-query-builder.ts +1 -0
- package/src/sqlite-db-helper.ts +3 -3
- package/src/sqlite-types.ts +6 -5
- package/src/sync/ClientSessionSyncProcessor.ts +152 -142
- package/src/sync/errors.ts +12 -24
- package/src/sync/index.ts +2 -0
- package/src/sync/mock-sync-backend.ts +146 -104
- package/src/sync/next/compact-events.ts +10 -11
- package/src/sync/next/facts.ts +13 -14
- package/src/sync/next/history-dag-common.ts +280 -26
- package/src/sync/next/history-dag.ts +17 -13
- package/src/sync/next/rebase-events.ts +12 -12
- package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
- package/src/sync/next/test/compact-events.test.ts +4 -3
- package/src/sync/next/test/event-fixtures.ts +13 -13
- package/src/sync/sync-backend-kv.ts +4 -3
- package/src/sync/sync-backend.ts +66 -17
- package/src/sync/sync.ts +24 -2
- package/src/sync/syncstate.test.ts +583 -419
- package/src/sync/syncstate.ts +127 -122
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +6 -8
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/util.ts +2 -2
- package/src/version.ts +33 -8
- package/dist/schema/EventDef.d.ts +0 -126
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js +0 -147
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -81
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -222
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -286
- package/src/schema/state/sqlite/system-tables.ts +0 -106
- package/src/sync/next/ambient.d.ts +0 -3
- package/src/sync/next/graphology.ts +0 -41
- package/src/sync/next/graphology_.ts +0 -2
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Effect } from '@livestore/utils/effect'
|
|
2
|
+
|
|
3
|
+
import { UnknownEventError } from '../errors.ts'
|
|
4
|
+
import type { EventDef, Materializer } from './EventDef/mod.ts'
|
|
5
|
+
import type * as LiveStoreEvent from './LiveStoreEvent/mod.ts'
|
|
6
|
+
import type { LiveStoreSchema } from './schema.ts'
|
|
7
|
+
|
|
8
|
+
export type UnknownEventContext = {
|
|
9
|
+
readonly event: Pick<LiveStoreEvent.Client.Encoded, 'name' | 'args' | 'seqNum' | 'clientId' | 'sessionId'>
|
|
10
|
+
readonly reason: 'event-definition-missing' | 'materializer-missing'
|
|
11
|
+
readonly operation: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export namespace UnknownEvents {
|
|
15
|
+
export type HandlingStrategy = 'warn' | 'fail' | 'ignore' | 'callback'
|
|
16
|
+
|
|
17
|
+
export type Callback = (
|
|
18
|
+
context: UnknownEventContext,
|
|
19
|
+
error: UnknownEventError,
|
|
20
|
+
) => Effect.SyncOrPromiseOrEffect<void, unknown>
|
|
21
|
+
|
|
22
|
+
export type HandlingConfig =
|
|
23
|
+
| { readonly strategy: 'warn' }
|
|
24
|
+
| { readonly strategy: 'ignore' }
|
|
25
|
+
| { readonly strategy: 'fail' }
|
|
26
|
+
| { readonly strategy: 'callback'; readonly onUnknownEvent: Callback }
|
|
27
|
+
|
|
28
|
+
export type Reason = UnknownEventContext['reason']
|
|
29
|
+
|
|
30
|
+
export type ResolveContext = Omit<UnknownEventContext, 'reason'>
|
|
31
|
+
|
|
32
|
+
export type Resolved =
|
|
33
|
+
| {
|
|
34
|
+
readonly _tag: 'known'
|
|
35
|
+
readonly eventDef: EventDef.AnyWithoutFn
|
|
36
|
+
readonly materializer: Materializer
|
|
37
|
+
}
|
|
38
|
+
| {
|
|
39
|
+
readonly _tag: 'unknown'
|
|
40
|
+
readonly reason: Reason
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const DEFAULT_UNKNOWN_EVENT_HANDLING: UnknownEvents.HandlingConfig = { strategy: 'warn' }
|
|
45
|
+
|
|
46
|
+
export const normalizeUnknownEventHandling = (
|
|
47
|
+
input: UnknownEvents.HandlingConfig | undefined,
|
|
48
|
+
): UnknownEvents.HandlingConfig => input ?? DEFAULT_UNKNOWN_EVENT_HANDLING
|
|
49
|
+
|
|
50
|
+
const handleUnknownEvent = ({
|
|
51
|
+
schema,
|
|
52
|
+
context,
|
|
53
|
+
}: {
|
|
54
|
+
schema: LiveStoreSchema
|
|
55
|
+
context: UnknownEventContext
|
|
56
|
+
}): Effect.Effect<void, UnknownEventError> =>
|
|
57
|
+
Effect.gen(function* () {
|
|
58
|
+
const config = schema.unknownEventHandling
|
|
59
|
+
const error = new UnknownEventError(context)
|
|
60
|
+
|
|
61
|
+
switch (config.strategy) {
|
|
62
|
+
case 'fail': {
|
|
63
|
+
return yield* error
|
|
64
|
+
}
|
|
65
|
+
case 'warn': {
|
|
66
|
+
yield* Effect.logWarning('@livestore/common:schema:unknown-event', context)
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
case 'ignore': {
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
case 'callback': {
|
|
73
|
+
const callback = config.onUnknownEvent
|
|
74
|
+
|
|
75
|
+
yield* Effect.tryAll<void>(() => callback(context, error)).pipe(
|
|
76
|
+
Effect.catchAll((cause) =>
|
|
77
|
+
Effect.logWarning('@livestore/common:schema:unknown-event:callback-error', {
|
|
78
|
+
event: context.event,
|
|
79
|
+
reason: context.reason,
|
|
80
|
+
operation: context.operation,
|
|
81
|
+
cause,
|
|
82
|
+
}),
|
|
83
|
+
),
|
|
84
|
+
)
|
|
85
|
+
return
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Resolves the runtime event definition + materializer for a given event name.
|
|
92
|
+
*
|
|
93
|
+
* Behaviour is intentionally split across the result and error channels:
|
|
94
|
+
* - For `'fail'` handling, we surface an `UnknownEventError` via the failure channel so
|
|
95
|
+
* callers can convert it into the appropriate domain error (for example `MaterializeError`).
|
|
96
|
+
* - For all other strategies (`warn`, `ignore`, `callback`) we succeed with an
|
|
97
|
+
* `{ _tag: 'unknown' }` value, signalling that the caller should skip the event while
|
|
98
|
+
* continuing normal processing.
|
|
99
|
+
*/
|
|
100
|
+
export const resolveEventDef = (
|
|
101
|
+
schema: LiveStoreSchema,
|
|
102
|
+
context: UnknownEvents.ResolveContext,
|
|
103
|
+
): Effect.Effect<UnknownEvents.Resolved, UnknownEventError> =>
|
|
104
|
+
Effect.gen(function* () {
|
|
105
|
+
const eventName = context.event.name
|
|
106
|
+
const eventDef = schema.eventsDefsMap.get(eventName)
|
|
107
|
+
if (eventDef === undefined) {
|
|
108
|
+
yield* handleUnknownEvent({
|
|
109
|
+
schema,
|
|
110
|
+
context: {
|
|
111
|
+
event: context.event,
|
|
112
|
+
reason: 'event-definition-missing',
|
|
113
|
+
operation: context.operation,
|
|
114
|
+
},
|
|
115
|
+
})
|
|
116
|
+
return { _tag: 'unknown', reason: 'event-definition-missing' }
|
|
117
|
+
}
|
|
118
|
+
const materializer = schema.state.materializers.get(eventName)
|
|
119
|
+
if (materializer === undefined) {
|
|
120
|
+
yield* handleUnknownEvent({
|
|
121
|
+
schema,
|
|
122
|
+
context: {
|
|
123
|
+
event: context.event,
|
|
124
|
+
reason: 'materializer-missing',
|
|
125
|
+
operation: context.operation,
|
|
126
|
+
},
|
|
127
|
+
})
|
|
128
|
+
return { _tag: 'unknown', reason: 'materializer-missing' }
|
|
129
|
+
}
|
|
130
|
+
return { _tag: 'known', eventDef, materializer }
|
|
131
|
+
})
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { Effect, Option, Schema } from '@livestore/utils/effect'
|
|
4
|
+
|
|
5
|
+
import { SqliteAst } from '../../schema/state/sqlite/db-schema/mod.ts'
|
|
6
|
+
import type { PreparedStatement, SqliteDb } from '../../sqlite-types.ts'
|
|
7
|
+
import type { PreparedBindValues } from '../../util.ts'
|
|
8
|
+
import { migrateTable } from '../migrations.ts'
|
|
9
|
+
|
|
10
|
+
const makeStubDb = () => {
|
|
11
|
+
const executed: string[] = []
|
|
12
|
+
|
|
13
|
+
const db: SqliteDb = {
|
|
14
|
+
_tag: 'SqliteDb',
|
|
15
|
+
metadata: { dbPointer: 0, persistenceInfo: { fileName: ':memory:' } } as any,
|
|
16
|
+
debug: { head: 0 as any },
|
|
17
|
+
prepare: (queryStr: string): PreparedStatement => ({
|
|
18
|
+
sql: queryStr,
|
|
19
|
+
execute: (_bind: PreparedBindValues | undefined) => {
|
|
20
|
+
executed.push(queryStr)
|
|
21
|
+
},
|
|
22
|
+
select: <T>(_bind: PreparedBindValues | undefined) => [] as unknown as ReadonlyArray<T>,
|
|
23
|
+
finalize: () => {},
|
|
24
|
+
}),
|
|
25
|
+
execute: () => {},
|
|
26
|
+
select: () => [],
|
|
27
|
+
export: () => new Uint8Array(),
|
|
28
|
+
import: () => {},
|
|
29
|
+
close: () => {},
|
|
30
|
+
destroy: () => {},
|
|
31
|
+
session: () => ({ changeset: () => undefined, finish: () => {} }),
|
|
32
|
+
makeChangeset: () => ({ invert: () => ({ invert: () => ({}) as any, apply: () => {} }) as any, apply: () => {} }),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return { db, executed }
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
describe('migrateTable - quoting and autoincrement', () => {
|
|
39
|
+
it('creates valid CREATE TABLE with inline INTEGER PRIMARY KEY AUTOINCREMENT and double-quoted identifiers', () => {
|
|
40
|
+
const { db, executed } = makeStubDb()
|
|
41
|
+
|
|
42
|
+
const table = SqliteAst.table(
|
|
43
|
+
'todos',
|
|
44
|
+
[
|
|
45
|
+
SqliteAst.column({
|
|
46
|
+
name: 'id',
|
|
47
|
+
type: { _tag: 'integer' },
|
|
48
|
+
nullable: false,
|
|
49
|
+
primaryKey: true,
|
|
50
|
+
autoIncrement: true,
|
|
51
|
+
default: Option.none(),
|
|
52
|
+
schema: Schema.Number,
|
|
53
|
+
}),
|
|
54
|
+
SqliteAst.column({
|
|
55
|
+
name: 'text',
|
|
56
|
+
type: { _tag: 'text' },
|
|
57
|
+
nullable: false,
|
|
58
|
+
primaryKey: false,
|
|
59
|
+
autoIncrement: false,
|
|
60
|
+
default: Option.some(''),
|
|
61
|
+
schema: Schema.String,
|
|
62
|
+
}),
|
|
63
|
+
SqliteAst.column({
|
|
64
|
+
name: 'completed',
|
|
65
|
+
type: { _tag: 'integer' },
|
|
66
|
+
nullable: false,
|
|
67
|
+
primaryKey: false,
|
|
68
|
+
autoIncrement: false,
|
|
69
|
+
default: Option.some(0),
|
|
70
|
+
schema: Schema.Number,
|
|
71
|
+
}),
|
|
72
|
+
],
|
|
73
|
+
[],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
migrateTable({ db, tableAst: table, behaviour: 'create-if-not-exists', skipMetaTable: true }).pipe(Effect.runSync)
|
|
77
|
+
|
|
78
|
+
const createStmt = executed.find((s) => /create table if not exists/i.test(s))
|
|
79
|
+
expect(createStmt).toBeDefined()
|
|
80
|
+
|
|
81
|
+
// Identifiers must be double-quoted, not single-quoted
|
|
82
|
+
expect(createStmt!).toContain('create table if not exists "todos"')
|
|
83
|
+
expect(createStmt!).toContain('"id" integer primary key autoincrement')
|
|
84
|
+
expect(createStmt!).toContain(" default ''")
|
|
85
|
+
expect(createStmt!).not.toContain("PRIMARY KEY ('id')")
|
|
86
|
+
expect(createStmt!).not.toMatch(/'todos'|'id'|'text'/)
|
|
87
|
+
})
|
|
88
|
+
})
|
|
@@ -13,7 +13,7 @@ export const dbExecute = (db: SqliteDb, queryStr: string, bindValues?: ParamsObj
|
|
|
13
13
|
// cachedStmts.set(queryStr, stmt)
|
|
14
14
|
// }
|
|
15
15
|
|
|
16
|
-
const preparedBindValues = bindValues ? prepareBindValues(bindValues, queryStr) : undefined
|
|
16
|
+
const preparedBindValues = bindValues !== undefined ? prepareBindValues(bindValues, queryStr) : undefined
|
|
17
17
|
|
|
18
18
|
try {
|
|
19
19
|
stmt.execute(preparedBindValues)
|
|
@@ -34,7 +34,7 @@ export const dbSelect = <T>(db: SqliteDb, queryStr: string, bindValues?: ParamsO
|
|
|
34
34
|
// cachedStmts.set(queryStr, stmt)
|
|
35
35
|
// }
|
|
36
36
|
|
|
37
|
-
const res = stmt.select<T>(bindValues ? prepareBindValues(bindValues, queryStr) : undefined)
|
|
37
|
+
const res = stmt.select<T>(bindValues !== undefined ? prepareBindValues(bindValues, queryStr) : undefined)
|
|
38
38
|
stmt.finalize()
|
|
39
39
|
return res
|
|
40
40
|
}
|
|
@@ -1,20 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AUTOMATIC HASH-BASED SCHEMA MIGRATIONS
|
|
3
|
+
*
|
|
4
|
+
* This module implements automatic schema versioning using hash-based change detection.
|
|
5
|
+
*
|
|
6
|
+
* ⚠️ CRITICAL DISTINCTION:
|
|
7
|
+
* - STATE TABLES (safe to modify): Changes trigger rematerialization from eventlog
|
|
8
|
+
* - EVENTLOG TABLES (NEVER modify): Changes cause data loss - need manual versioning!
|
|
9
|
+
*
|
|
10
|
+
* How it works:
|
|
11
|
+
* 1. Each table's schema is hashed using SqliteAst.hash()
|
|
12
|
+
* 2. Hashes are stored in SCHEMA_META_TABLE after successful migrations
|
|
13
|
+
* 3. On app start, current schema hashes are compared with stored hashes
|
|
14
|
+
* 4. Mismatches trigger migrations:
|
|
15
|
+
* - State tables: Recreated and repopulated from eventlog (safe, no data loss)
|
|
16
|
+
* - Eventlog tables: Uses 'create-if-not-exists' (UNSAFE - causes data loss!)
|
|
17
|
+
*
|
|
18
|
+
* State Table Changes (SAFE):
|
|
19
|
+
* - User-defined tables are rebuilt from eventlog
|
|
20
|
+
* - System tables (schemaMetaTable, etc.) are recreated
|
|
21
|
+
* - Data preserved through rematerializeFromEventlog()
|
|
22
|
+
*
|
|
23
|
+
* Eventlog Table Changes (UNSAFE):
|
|
24
|
+
* - eventlogMetaTable, syncStatusTable changes cause "soft reset"
|
|
25
|
+
* - Old table becomes inaccessible (but remains in DB)
|
|
26
|
+
* - No automatic migration - effectively data loss
|
|
27
|
+
* - TODO: Implement proper EVENTLOG_PERSISTENCE_FORMAT_VERSION system
|
|
28
|
+
*
|
|
29
|
+
* See system-tables/state-tables.ts and system-tables/eventlog-tables.ts for detailed documentation on each table type.
|
|
30
|
+
*/
|
|
31
|
+
|
|
1
32
|
import { memoizeByStringifyArgs } from '@livestore/utils'
|
|
2
33
|
import { Effect } from '@livestore/utils/effect'
|
|
3
34
|
|
|
4
35
|
import type { SqliteDb } from '../adapter-types.ts'
|
|
5
36
|
import type { MigrationsReport, MigrationsReportEntry } from '../defs.ts'
|
|
6
|
-
import type {
|
|
37
|
+
import type { UnknownError } from '../errors.ts'
|
|
7
38
|
import type { LiveStoreSchema } from '../schema/mod.ts'
|
|
8
39
|
import { makeColumnSpec } from '../schema/state/sqlite/column-spec.ts'
|
|
9
40
|
import { SqliteAst } from '../schema/state/sqlite/db-schema/mod.ts'
|
|
10
|
-
import type { SchemaEventDefsMetaRow, SchemaMetaRow } from '../schema/state/sqlite/system-tables.ts'
|
|
41
|
+
import type { SchemaEventDefsMetaRow, SchemaMetaRow } from '../schema/state/sqlite/system-tables/state-tables.ts'
|
|
11
42
|
import {
|
|
12
43
|
isStateSystemTable,
|
|
13
44
|
SCHEMA_EVENT_DEFS_META_TABLE,
|
|
14
45
|
SCHEMA_META_TABLE,
|
|
15
46
|
schemaEventDefsMetaTable,
|
|
16
47
|
stateSystemTables,
|
|
17
|
-
} from '../schema/state/sqlite/system-tables.ts'
|
|
48
|
+
} from '../schema/state/sqlite/system-tables/state-tables.ts'
|
|
18
49
|
import { sql } from '../util.ts'
|
|
19
50
|
import type { SchemaManager } from './common.ts'
|
|
20
51
|
import { dbExecute, dbSelect } from './common.ts'
|
|
@@ -56,7 +87,7 @@ export const migrateDb = ({
|
|
|
56
87
|
db: SqliteDb
|
|
57
88
|
schema: LiveStoreSchema
|
|
58
89
|
onProgress?: (opts: { done: number; total: number }) => Effect.Effect<void>
|
|
59
|
-
}): Effect.Effect<MigrationsReport,
|
|
90
|
+
}): Effect.Effect<MigrationsReport, UnknownError> =>
|
|
60
91
|
Effect.gen(function* () {
|
|
61
92
|
for (const tableDef of stateSystemTables) {
|
|
62
93
|
yield* migrateTable({
|
|
@@ -137,10 +168,10 @@ export const migrateTable = ({
|
|
|
137
168
|
|
|
138
169
|
if (behaviour === 'drop-and-recreate') {
|
|
139
170
|
// TODO need to possibly handle cascading deletes due to foreign keys
|
|
140
|
-
dbExecute(db, sql`drop table if exists
|
|
141
|
-
dbExecute(db, sql`create table if not exists
|
|
171
|
+
dbExecute(db, sql`drop table if exists "${tableName}"`)
|
|
172
|
+
dbExecute(db, sql`create table if not exists "${tableName}" (${columnSpec}) strict`)
|
|
142
173
|
} else if (behaviour === 'create-if-not-exists') {
|
|
143
|
-
dbExecute(db, sql`create table if not exists
|
|
174
|
+
dbExecute(db, sql`create table if not exists "${tableName}" (${columnSpec}) strict`)
|
|
144
175
|
}
|
|
145
176
|
|
|
146
177
|
for (const index of tableAst.indexes) {
|
|
@@ -169,6 +200,8 @@ export const migrateTable = ({
|
|
|
169
200
|
)
|
|
170
201
|
|
|
171
202
|
const createIndexFromDefinition = (tableName: string, index: SqliteAst.Index) => {
|
|
172
|
-
const uniqueStr = index.unique ? 'UNIQUE' : ''
|
|
173
|
-
return sql`create ${uniqueStr} index if not exists
|
|
203
|
+
const uniqueStr = index.unique === true ? 'UNIQUE' : ''
|
|
204
|
+
return sql`create ${uniqueStr} index if not exists "${index.name}" on "${tableName}" (${index.columns
|
|
205
|
+
.map((col) => `"${col}"`)
|
|
206
|
+
.join(', ')})`
|
|
174
207
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Schema } from '@livestore/utils/effect'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import type { EventDef } from '../schema/EventDef.ts'
|
|
3
|
+
import { UnknownError } from '../adapter-types.ts'
|
|
4
|
+
import type { EventDef } from '../schema/EventDef/mod.ts'
|
|
5
5
|
import type { LiveStoreSchema } from '../schema/mod.ts'
|
|
6
6
|
import type { EventDefInfo, SchemaManager } from './common.ts'
|
|
7
7
|
|
|
@@ -15,7 +15,7 @@ export const validateSchema = (schema: LiveStoreSchema, schemaManager: SchemaMan
|
|
|
15
15
|
)
|
|
16
16
|
|
|
17
17
|
if (missingEventDefs.length > 0) {
|
|
18
|
-
return yield* new
|
|
18
|
+
return yield* new UnknownError({
|
|
19
19
|
cause: `Missing mutation definitions: ${missingEventDefs.map((info) => info.eventName).join(', ')}`,
|
|
20
20
|
})
|
|
21
21
|
}
|
|
@@ -23,7 +23,7 @@ export const findManyRows = <TColumns extends SqliteDsl.Columns>({
|
|
|
23
23
|
}): [string, BindValues] => {
|
|
24
24
|
const whereSql = buildWhereSql({ where })
|
|
25
25
|
const whereModifier = whereSql === '' ? '' : `WHERE ${whereSql}`
|
|
26
|
-
const limitModifier = limit ? `LIMIT ${limit}` : ''
|
|
26
|
+
const limitModifier = limit !== undefined ? `LIMIT ${limit}` : ''
|
|
27
27
|
|
|
28
28
|
const whereBindValues = makeBindValues({ columns, values: where, variablePrefix: 'where_', skipNil: true })
|
|
29
29
|
|
|
@@ -80,7 +80,7 @@ export const insertRowPrepared = <TColumns extends SqliteDsl.Columns>({
|
|
|
80
80
|
const keysStr = keys.join(', ')
|
|
81
81
|
const valuesStr = keys.map((key) => `$${key}`).join(', ')
|
|
82
82
|
|
|
83
|
-
return sql`INSERT ${options.orReplace ? 'OR REPLACE ' : ''}INTO ${tableName} (${keysStr}) VALUES (${valuesStr})`
|
|
83
|
+
return sql`INSERT ${options.orReplace === true ? 'OR REPLACE ' : ''}INTO ${tableName} (${keysStr}) VALUES (${valuesStr})`
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
export const insertRows = <TColumns extends SqliteDsl.Columns>({
|
|
@@ -134,7 +134,7 @@ export const insertOrIgnoreRow = <TColumns extends SqliteDsl.Columns>({
|
|
|
134
134
|
.join(', ')
|
|
135
135
|
|
|
136
136
|
const bindValues = makeBindValues({ columns, values })
|
|
137
|
-
const returningStmt = returnRow ? 'RETURNING *' : ''
|
|
137
|
+
const returningStmt = returnRow === true ? 'RETURNING *' : ''
|
|
138
138
|
|
|
139
139
|
return [sql`INSERT OR IGNORE INTO ${tableName} (${keysStr}) VALUES (${valuesStr}) ${returningStmt}`, bindValues]
|
|
140
140
|
}
|
|
@@ -247,7 +247,15 @@ export const createTable = ({
|
|
|
247
247
|
.map(([columnName, _]) => columnName)
|
|
248
248
|
const columnDefStrs = Object.entries(table.columns).map(([columnName, columnDef]) => {
|
|
249
249
|
const nullModifier = columnDef.nullable === true ? '' : 'NOT NULL'
|
|
250
|
-
const defaultModifier =
|
|
250
|
+
const defaultModifier = (() => {
|
|
251
|
+
if (columnDef.default._tag === 'None') return ''
|
|
252
|
+
const defaultValue = columnDef.default.value
|
|
253
|
+
if (typeof defaultValue === 'function') return ''
|
|
254
|
+
if (defaultValue !== undefined && typeof defaultValue === 'object' && 'sql' in defaultValue) {
|
|
255
|
+
return `DEFAULT ${defaultValue.sql}`
|
|
256
|
+
}
|
|
257
|
+
return `DEFAULT ${defaultValue}`
|
|
258
|
+
})()
|
|
251
259
|
return sql`${columnName} ${columnDef.columnType} ${nullModifier} ${defaultModifier}`
|
|
252
260
|
})
|
|
253
261
|
|
|
@@ -293,7 +301,7 @@ Error: ${parseErrorStr}
|
|
|
293
301
|
Value:`,
|
|
294
302
|
value,
|
|
295
303
|
)
|
|
296
|
-
//
|
|
304
|
+
// oxlint-disable-next-line eslint(no-debugger) -- intentional breakpoint for SQL decode errors
|
|
297
305
|
debugger
|
|
298
306
|
throw res.left
|
|
299
307
|
} else {
|
|
@@ -341,7 +349,11 @@ const buildWhereSql = <TColumns extends SqliteDsl.Columns>({
|
|
|
341
349
|
const getWhereOp = (columnName: string, value: ClientTypes.WhereValueForDecoded<any>) => {
|
|
342
350
|
if (value === null) {
|
|
343
351
|
return `IS NULL`
|
|
344
|
-
} else if (
|
|
352
|
+
} else if (
|
|
353
|
+
typeof value === 'object' &&
|
|
354
|
+
typeof value.op === 'string' &&
|
|
355
|
+
ClientTypes.isValidWhereOp(value.op) === true
|
|
356
|
+
) {
|
|
345
357
|
return `${value.op} $where_${columnName}`
|
|
346
358
|
} else if (typeof value === 'object' && typeof value.op === 'string' && value.op === 'in') {
|
|
347
359
|
return `in (${value.val.map((_: any, i: number) => `$where_${columnName}_${i}`).join(', ')})`
|
package/src/sqlite-db-helper.ts
CHANGED
|
@@ -14,7 +14,7 @@ export const makeExecute = (
|
|
|
14
14
|
return (...args: any[]) => {
|
|
15
15
|
const [queryStrOrQueryBuilder, bindValuesOrOptions, maybeOptions] = args
|
|
16
16
|
|
|
17
|
-
if (isQueryBuilder(queryStrOrQueryBuilder)) {
|
|
17
|
+
if (isQueryBuilder(queryStrOrQueryBuilder) === true) {
|
|
18
18
|
const { query, bindValues } = queryStrOrQueryBuilder.asSql()
|
|
19
19
|
return execute(query, bindValues as unknown as PreparedBindValues, bindValuesOrOptions)
|
|
20
20
|
} else {
|
|
@@ -29,7 +29,7 @@ export const makeSelect = <T>(
|
|
|
29
29
|
return (...args: any[]) => {
|
|
30
30
|
const [queryStrOrQueryBuilder, maybeBindValues] = args
|
|
31
31
|
|
|
32
|
-
if (isQueryBuilder(queryStrOrQueryBuilder)) {
|
|
32
|
+
if (isQueryBuilder(queryStrOrQueryBuilder) === true) {
|
|
33
33
|
const { query, bindValues } = queryStrOrQueryBuilder.asSql()
|
|
34
34
|
const resultSchema = getResultSchema(queryStrOrQueryBuilder)
|
|
35
35
|
const results = select(query, bindValues as unknown as PreparedBindValues)
|
|
@@ -44,7 +44,7 @@ export const validateSnapshot = (snapshot: Uint8Array) => {
|
|
|
44
44
|
const headerBytes = new TextDecoder().decode(snapshot.slice(0, 16))
|
|
45
45
|
const hasValidHeader = headerBytes.startsWith('SQLite format 3')
|
|
46
46
|
|
|
47
|
-
if (
|
|
47
|
+
if (hasValidHeader === false) {
|
|
48
48
|
throw new SqliteError({
|
|
49
49
|
cause: 'Invalid SQLite header',
|
|
50
50
|
note: `Expected header to start with 'SQLite format 3', but got: ${headerBytes}`,
|
package/src/sqlite-types.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Effect, Schema } from '@livestore/utils/effect'
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import type { SqliteError, UnknownError } from './errors.ts'
|
|
3
4
|
import type { EventSequenceNumber } from './schema/mod.ts'
|
|
4
5
|
import type { QueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
|
|
5
6
|
import type { PreparedBindValues } from './util.ts'
|
|
@@ -17,12 +18,12 @@ export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
|
|
|
17
18
|
prepare(queryStr: string): PreparedStatement
|
|
18
19
|
execute(
|
|
19
20
|
queryStr: string,
|
|
20
|
-
bindValues?: PreparedBindValues
|
|
21
|
+
bindValues?: PreparedBindValues ,
|
|
21
22
|
options?: { onRowsChanged?: (rowsChanged: number) => void },
|
|
22
23
|
): void
|
|
23
24
|
execute(queryBuilder: QueryBuilder.Any, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
|
|
24
25
|
|
|
25
|
-
select<T>(queryStr: string, bindValues?: PreparedBindValues
|
|
26
|
+
select<T>(queryStr: string, bindValues?: PreparedBindValues ): ReadonlyArray<T>
|
|
26
27
|
select<T>(queryBuilder: QueryBuilder<T, any, any>): T
|
|
27
28
|
|
|
28
29
|
export(): Uint8Array<ArrayBuffer>
|
|
@@ -33,7 +34,7 @@ export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
|
|
|
33
34
|
makeChangeset: (data: Uint8Array<ArrayBuffer>) => SqliteDbChangeset
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
export type SqliteDebugInfo = { head: EventSequenceNumber.
|
|
37
|
+
export type SqliteDebugInfo = { head: EventSequenceNumber.Client.Composite }
|
|
37
38
|
|
|
38
39
|
// TODO refactor this helper type. It's quite cumbersome to use and should be revisited.
|
|
39
40
|
export type MakeSqliteDb<
|
|
@@ -46,7 +47,7 @@ export type MakeSqliteDb<
|
|
|
46
47
|
TMetadata extends TMetadata_ & { _tag: TInput['_tag'] } = TMetadata_ & { _tag: TInput['_tag'] },
|
|
47
48
|
>(
|
|
48
49
|
input: TInput,
|
|
49
|
-
) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError |
|
|
50
|
+
) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError | UnknownError, R>
|
|
50
51
|
|
|
51
52
|
export interface PreparedStatement {
|
|
52
53
|
execute(bindValues: PreparedBindValues | undefined, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
|