@livestore/common 0.4.0 → 0.5.0-dev.1
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 +8 -8
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +4 -4
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +33 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +24 -41
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.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 +32 -44
- 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 +2 -1
- package/dist/devtools/devtools-compatibility.test.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +522 -334
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +80 -78
- 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 +6 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +410 -348
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +105 -93
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -3
- 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 +12 -8
- 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 +19 -17
- 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 +22 -19
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +87 -18
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +548 -480
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +72 -41
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
- package/dist/leader-thread/RejectedPushError.js +25 -6
- 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 +11 -10
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +15 -5
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +19 -19
- 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 +36 -20
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -5
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +62 -58
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js +9 -9
- 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 +12 -8
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.js +9 -9
- package/dist/leader-thread/recreate-db.d.ts +5 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +34 -59
- 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 +16 -21
- package/dist/leader-thread/stream-events.js.map +1 -1
- package/dist/leader-thread/types.d.ts +38 -73
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +10 -6
- 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 +2 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -5
- 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 +9 -37
- 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 +3 -1
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +42 -33
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +6 -6
- 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 +3 -3
- 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/EventDef/facts.d.ts.map +1 -1
- package/dist/schema/EventDef/materializer.d.ts +2 -2
- package/dist/schema/EventDef/materializer.d.ts.map +1 -1
- package/dist/schema/EventDef/mod.js +5 -5
- package/dist/schema/EventSequenceNumber/client.d.ts +12 -17
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.js +20 -24
- 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/mod.js +2 -2
- package/dist/schema/EventSequenceNumber.test.js +6 -6
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +58 -187
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/client.js +33 -30
- package/dist/schema/LiveStoreEvent/client.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.test.js +13 -4
- 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 +2 -2
- package/dist/schema/LiveStoreEvent/global.js.map +1 -1
- package/dist/schema/LiveStoreEvent/input.d.ts +6 -6
- 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/LiveStoreEvent/mod.js +4 -4
- package/dist/schema/events.js +1 -1
- package/dist/schema/mod.d.ts +1 -0
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +11 -10
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +6 -5
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/mod.js +2 -2
- package/dist/schema/state/sqlite/client-document-def.d.ts +13 -18
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +30 -27
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +53 -18
- 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 +73 -33
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +176 -75
- 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 +1 -1
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +4 -4
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js +5 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts +5 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js +183 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js +142 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +3 -8
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -73
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.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 +9 -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 +28 -17
- 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 +6 -4
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js +6 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
- 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 +11 -10
- 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 +22 -23
- 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 +18 -16
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +364 -598
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.js +2 -2
- 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 +5 -5
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/mod.js +2 -2
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +380 -115
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js +47 -6
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +17 -20
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +72 -6
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +207 -37
- 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 +3 -2
- package/dist/schema/unknown-events.js.map +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +28 -6
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/migrations.d.ts +4 -4
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +9 -9
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +1 -1
- 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/index.js +3 -3
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -13
- 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 +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 +23 -3
- package/dist/sqlite-db-helper.d.ts.map +1 -1
- package/dist/sqlite-db-helper.js +39 -4
- 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 +41 -19
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +200 -70
- 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 +3 -3
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.js +6 -6
- 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 +58 -37
- 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/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +3 -3
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +1 -1
- package/dist/sync/next/history-dag-common.d.ts +5 -1
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +53 -32
- 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 +5 -4
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/mod.js +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js +6 -6
- package/dist/sync/next/test/compact-events.test.js +4 -4
- package/dist/sync/next/test/event-fixtures.d.ts +8 -8
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +6 -6
- 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/next/test/mod.js +1 -1
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +5 -3
- 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 +10 -6
- 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/sync.js +2 -2
- package/dist/sync/syncstate.d.ts +100 -176
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +36 -39
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +103 -64
- 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/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +2 -2
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +2 -2
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/testing/mod.js +1 -1
- package/dist/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +20 -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 +40 -57
- 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 +28 -61
- package/src/debug-info.ts +53 -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 +777 -650
- package/src/leader-thread/RejectedPushError.ts +40 -27
- package/src/leader-thread/connection.ts +12 -8
- package/src/leader-thread/eventlog.ts +20 -12
- package/src/leader-thread/leader-worker-devtools.ts +38 -20
- package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
- package/src/leader-thread/make-leader-thread-layer.ts +100 -71
- package/src/leader-thread/materialize-event.ts +13 -8
- package/src/leader-thread/recreate-db.ts +41 -75
- package/src/leader-thread/shutdown-channel.ts +3 -14
- package/src/leader-thread/stream-events.ts +102 -101
- package/src/leader-thread/types.ts +29 -62
- package/src/logging.ts +5 -52
- package/src/make-client-session.ts +6 -6
- package/src/materializer-helper.ts +7 -36
- package/src/otel.ts +5 -14
- package/src/rematerialize-from-eventlog.ts +116 -98
- 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 +20 -24
- 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 +4 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +55 -20
- 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 +213 -77
- package/src/schema/state/sqlite/column-def.ts +87 -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/fingerprint-digest.ts +6 -0
- package/src/schema/state/sqlite/db-schema/ast/fingerprint.test.ts +209 -0
- package/src/schema/state/sqlite/db-schema/ast/fingerprint.ts +225 -0
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -81
- 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 +26 -31
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
- package/src/schema/state/sqlite/db-schema/has-json-string-encoding.ts +9 -0
- package/src/schema/state/sqlite/mod.ts +4 -5
- 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 +24 -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 +54 -3
- package/src/schema/state/sqlite/table-def.test.ts +270 -66
- package/src/schema/state/sqlite/table-def.ts +112 -45
- package/src/schema/unknown-events.ts +3 -2
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +35 -4
- package/src/schema-management/migrations.ts +7 -6
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +9 -13
- 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 +19 -9
- package/src/version.ts +1 -2
- package/dist/schema/state/sqlite/db-schema/hash.d.ts +0 -2
- package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +0 -1
- package/dist/schema/state/sqlite/db-schema/hash.js +0 -15
- package/dist/schema/state/sqlite/db-schema/hash.js.map +0 -1
- 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/schema/state/sqlite/db-schema/hash.ts +0 -13
- package/src/sql-queries/misc.ts +0 -2
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { expect } from 'vitest'
|
|
2
2
|
|
|
3
|
-
import { Option, Schema } from '@livestore/utils/effect'
|
|
4
3
|
import { Vitest } from '@livestore/utils-dev/node-vitest'
|
|
4
|
+
import { Option, Schema } from '@livestore/utils/effect'
|
|
5
5
|
|
|
6
6
|
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
7
|
-
import { EncodedWithMeta, isEqualEncoded
|
|
7
|
+
import { type Encoded, EncodedWithMeta, isEqualEncoded } from './client.ts'
|
|
8
8
|
|
|
9
9
|
Vitest.describe('EncodedWithMeta', () => {
|
|
10
10
|
Vitest.test('toGlobal() produces numeric seqNums through JSON.stringify', () => {
|
|
@@ -107,10 +107,23 @@ Vitest.describe('isEqualEncoded', () => {
|
|
|
107
107
|
expect(isEqualEncoded(a, b)).toBe(true)
|
|
108
108
|
})
|
|
109
109
|
|
|
110
|
-
Vitest.it(
|
|
110
|
+
Vitest.it(
|
|
111
|
+
'should consider Effect Schema UndefinedOr-encoded args with explicit undefined equal to their JSON-roundtripped form',
|
|
112
|
+
() => {
|
|
113
|
+
const argsSchema = Schema.Struct({
|
|
114
|
+
id: Schema.String,
|
|
115
|
+
flag: Schema.UndefinedOr(Schema.Boolean),
|
|
116
|
+
})
|
|
117
|
+
const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc', flag: undefined } as any)
|
|
118
|
+
const wireArgs = JSON.parse(JSON.stringify(localArgs))
|
|
119
|
+
expect(isEqualEncoded(makeEncodedEvent(localArgs), makeEncodedEvent(wireArgs))).toBe(true)
|
|
120
|
+
},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
Vitest.it('should consider Effect Schema optionalKey-encoded args equal to their JSON-roundtripped form', () => {
|
|
111
124
|
const argsSchema = Schema.Struct({
|
|
112
125
|
id: Schema.String,
|
|
113
|
-
|
|
126
|
+
label: Schema.optionalKey(Schema.String),
|
|
114
127
|
})
|
|
115
128
|
const localArgs = Schema.encodeUnknownSync(argsSchema)({ id: 'abc' } as any)
|
|
116
129
|
const wireArgs = JSON.parse(JSON.stringify(localArgs))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { deepEqual, memoizeByRef } from '@livestore/utils'
|
|
2
|
-
import { Option, Schema } from '@livestore/utils/effect'
|
|
2
|
+
import { Effect, Option, Schema, Struct } from '@livestore/utils/effect'
|
|
3
3
|
|
|
4
4
|
import type { EventDef } from '../EventDef/mod.ts'
|
|
5
5
|
import * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
@@ -15,7 +15,7 @@ export const Decoded = Schema.Struct({
|
|
|
15
15
|
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
16
16
|
clientId: Schema.String,
|
|
17
17
|
sessionId: Schema.String,
|
|
18
|
-
}).
|
|
18
|
+
}).annotate({ title: 'LiveStoreEvent.Client.Decoded' })
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Effect Schema for client events with encoded args.
|
|
@@ -45,7 +45,7 @@ export const Encoded = Schema.Struct({
|
|
|
45
45
|
parentSeqNum: EventSequenceNumber.Client.Composite,
|
|
46
46
|
clientId: Schema.String,
|
|
47
47
|
sessionId: Schema.String,
|
|
48
|
-
}).
|
|
48
|
+
}).annotate({ title: 'LiveStoreEvent.Client.Encoded' })
|
|
49
49
|
|
|
50
50
|
/** Event with composite sequence numbers and decoded (native TypeScript) args. */
|
|
51
51
|
export type Decoded = ForEventDef.Decoded<EventDef.Any>
|
|
@@ -73,36 +73,38 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEve
|
|
|
73
73
|
sessionId: Schema.String,
|
|
74
74
|
// TODO get rid of `meta` again by cleaning up the usage implementations
|
|
75
75
|
meta: Schema.Struct({
|
|
76
|
-
sessionChangeset: Schema.Union(
|
|
76
|
+
sessionChangeset: Schema.Union([
|
|
77
77
|
Schema.TaggedStruct('sessionChangeset', {
|
|
78
|
-
data: Schema.Uint8Array as any as Schema.
|
|
78
|
+
data: Schema.Uint8Array as any as Schema.Codec<Uint8Array<ArrayBuffer>>,
|
|
79
79
|
debug: Schema.Any.pipe(Schema.optional),
|
|
80
80
|
}),
|
|
81
81
|
Schema.TaggedStruct('no-op', {}),
|
|
82
82
|
Schema.TaggedStruct('unset', {}),
|
|
83
|
-
),
|
|
84
|
-
syncMetadata: Schema.Option(Schema.
|
|
83
|
+
]),
|
|
84
|
+
syncMetadata: Schema.Option(Schema.Json),
|
|
85
85
|
/** Used to detect if the materializer is side effecting (during dev) */
|
|
86
|
-
materializerHashLeader: Schema.Option(Schema.
|
|
87
|
-
materializerHashSession: Schema.Option(Schema.
|
|
88
|
-
})
|
|
89
|
-
Schema.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
86
|
+
materializerHashLeader: Schema.Option(Schema.Finite),
|
|
87
|
+
materializerHashSession: Schema.Option(Schema.Finite),
|
|
88
|
+
})
|
|
89
|
+
.mapFields(Struct.map(Schema.mutableKey))
|
|
90
|
+
.pipe(
|
|
91
|
+
Schema.withDecodingDefaultType(
|
|
92
|
+
Effect.succeed({
|
|
93
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
94
|
+
syncMetadata: Option.none(),
|
|
95
|
+
materializerHashLeader: Option.none(),
|
|
96
|
+
materializerHashSession: Option.none(),
|
|
97
|
+
}),
|
|
98
|
+
),
|
|
99
|
+
Schema.withConstructorDefault(
|
|
100
|
+
Effect.succeed({
|
|
101
|
+
sessionChangeset: { _tag: 'unset' as const },
|
|
102
|
+
syncMetadata: Option.none(),
|
|
103
|
+
materializerHashLeader: Option.none(),
|
|
104
|
+
materializerHashSession: Option.none(),
|
|
105
|
+
}),
|
|
106
|
+
),
|
|
107
|
+
),
|
|
106
108
|
}) {
|
|
107
109
|
toJSON = (): any => {
|
|
108
110
|
// Only used for logging/debugging
|
|
@@ -134,22 +136,22 @@ export class EncodedWithMeta extends Schema.Class<EncodedWithMeta>('LiveStoreEve
|
|
|
134
136
|
*/
|
|
135
137
|
rebase = ({
|
|
136
138
|
parentSeqNum,
|
|
137
|
-
|
|
139
|
+
isClientOnly,
|
|
138
140
|
rebaseGeneration,
|
|
139
141
|
}: {
|
|
140
142
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
141
|
-
|
|
143
|
+
isClientOnly: boolean
|
|
142
144
|
rebaseGeneration: number
|
|
143
145
|
}) =>
|
|
144
146
|
new EncodedWithMeta({
|
|
145
147
|
...this,
|
|
146
|
-
...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum,
|
|
148
|
+
...EventSequenceNumber.Client.nextPair({ seqNum: parentSeqNum, isClientOnly, rebaseGeneration }),
|
|
147
149
|
})
|
|
148
150
|
|
|
149
151
|
static fromGlobal = (
|
|
150
152
|
event: Global.Encoded,
|
|
151
153
|
meta: {
|
|
152
|
-
syncMetadata: Option.Option<Schema.
|
|
154
|
+
syncMetadata: Option.Option<Schema.Json>
|
|
153
155
|
materializerHashLeader: Option.Option<number>
|
|
154
156
|
materializerHashSession: Option.Option<number>
|
|
155
157
|
},
|
|
@@ -204,8 +206,7 @@ export const isEqualEncoded = (a: Encoded, b: Encoded) =>
|
|
|
204
206
|
a.sessionId === b.sessionId &&
|
|
205
207
|
deepEqual(canonicalizeArgs(a.args), canonicalizeArgs(b.args)) // TODO use schema equality here
|
|
206
208
|
|
|
207
|
-
const canonicalizeArgs = (args: unknown): unknown =>
|
|
208
|
-
args === undefined ? args : JSON.parse(JSON.stringify(args))
|
|
209
|
+
const canonicalizeArgs = (args: unknown): unknown => (args === undefined ? args : JSON.parse(JSON.stringify(args)))
|
|
209
210
|
|
|
210
211
|
/**
|
|
211
212
|
* Creates an Effect Schema union for all event types in a schema (with composite sequence numbers).
|
|
@@ -219,7 +220,7 @@ export const makeSchema = <TSchema extends LiveStoreSchema>(
|
|
|
219
220
|
schema: TSchema,
|
|
220
221
|
): ForEventDef.ForRecord<TSchema['_EventDefMapType']> =>
|
|
221
222
|
Schema.Union(
|
|
222
|
-
|
|
223
|
+
[...schema.eventsDefsMap.values()].map((def) =>
|
|
223
224
|
Schema.Struct({
|
|
224
225
|
name: Schema.Literal(def.name),
|
|
225
226
|
args: def.schema,
|
|
@@ -229,7 +230,7 @@ export const makeSchema = <TSchema extends LiveStoreSchema>(
|
|
|
229
230
|
sessionId: Schema.String,
|
|
230
231
|
}),
|
|
231
232
|
),
|
|
232
|
-
).
|
|
233
|
+
).annotate({ title: 'LiveStoreEvent.Client' }) as any
|
|
233
234
|
|
|
234
235
|
/** Memoized `makeSchema` - caches the generated schema by reference. */
|
|
235
236
|
export const makeSchemaMemo = memoizeByRef(makeSchema)
|
|
@@ -6,19 +6,19 @@ import type * as EventSequenceNumber from '../EventSequenceNumber/mod.ts'
|
|
|
6
6
|
/** Event without sequence numbers, with decoded (native TypeScript) args. Used as input to `store.commit()`. */
|
|
7
7
|
export type InputDecoded<TEventDef extends EventDef.Any> = {
|
|
8
8
|
name: TEventDef['name']
|
|
9
|
-
args:
|
|
9
|
+
args: TEventDef['schema']['Type']
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/** Event without sequence numbers, with encoded (serialized) args. Used as input to `store.commit()`. */
|
|
13
13
|
export type InputEncoded<TEventDef extends EventDef.Any> = {
|
|
14
14
|
name: TEventDef['name']
|
|
15
|
-
args:
|
|
15
|
+
args: TEventDef['schema']['Encoded']
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
/** Full event with composite sequence numbers and decoded args. Includes clientId/sessionId for sync. */
|
|
19
19
|
export type Decoded<TEventDef extends EventDef.Any> = {
|
|
20
20
|
name: TEventDef['name']
|
|
21
|
-
args:
|
|
21
|
+
args: TEventDef['schema']['Type']
|
|
22
22
|
seqNum: EventSequenceNumber.Client.Composite
|
|
23
23
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
24
24
|
clientId: string
|
|
@@ -28,7 +28,7 @@ export type Decoded<TEventDef extends EventDef.Any> = {
|
|
|
28
28
|
/** Full event with composite sequence numbers and encoded args. Includes clientId/sessionId for sync. */
|
|
29
29
|
export type Encoded<TEventDef extends EventDef.Any> = {
|
|
30
30
|
name: TEventDef['name']
|
|
31
|
-
args:
|
|
31
|
+
args: TEventDef['schema']['Encoded']
|
|
32
32
|
seqNum: EventSequenceNumber.Client.Composite
|
|
33
33
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
34
34
|
clientId: string
|
|
@@ -36,11 +36,11 @@ export type Encoded<TEventDef extends EventDef.Any> = {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/** Effect Schema union of all event types in an EventDefRecord (with composite sequence numbers). */
|
|
39
|
-
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.
|
|
39
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
|
|
40
40
|
{
|
|
41
41
|
[K in keyof TEventDefRecord]: {
|
|
42
42
|
name: K
|
|
43
|
-
args:
|
|
43
|
+
args: TEventDefRecord[K]['schema']['Type']
|
|
44
44
|
seqNum: EventSequenceNumber.Client.Composite
|
|
45
45
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
46
46
|
clientId: string
|
|
@@ -50,7 +50,7 @@ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
|
50
50
|
{
|
|
51
51
|
[K in keyof TEventDefRecord]: {
|
|
52
52
|
name: K
|
|
53
|
-
args:
|
|
53
|
+
args: TEventDefRecord[K]['schema']['Encoded']
|
|
54
54
|
seqNum: EventSequenceNumber.Client.Composite
|
|
55
55
|
parentSeqNum: EventSequenceNumber.Client.Composite
|
|
56
56
|
clientId: string
|
|
@@ -23,7 +23,7 @@ export const Encoded = Schema.Struct({
|
|
|
23
23
|
parentSeqNum: EventSequenceNumber.Global.Schema,
|
|
24
24
|
clientId: Schema.String,
|
|
25
25
|
sessionId: Schema.String,
|
|
26
|
-
}).
|
|
26
|
+
}).annotate({ title: 'LiveStoreEvent.Global.Encoded' })
|
|
27
27
|
|
|
28
28
|
/** Event with integer sequence numbers for sync backend wire format. */
|
|
29
29
|
export type Encoded = typeof Encoded.Type
|
|
@@ -15,7 +15,7 @@ import type * as ForEventDef from './for-event-def.ts'
|
|
|
15
15
|
export const Encoded = Schema.Struct({
|
|
16
16
|
name: Schema.String,
|
|
17
17
|
args: Schema.Any,
|
|
18
|
-
}).
|
|
18
|
+
}).annotate({ title: 'LiveStoreEvent.Input.Encoded' })
|
|
19
19
|
|
|
20
20
|
/** Event without sequence numbers, with decoded (native TypeScript) args. */
|
|
21
21
|
export type Decoded = ForEventDef.InputDecoded<EventDef.Any>
|
|
@@ -29,17 +29,17 @@ export type ForSchema<TSchema extends LiveStoreSchema> = {
|
|
|
29
29
|
}[keyof TSchema['_EventDefMapType']]
|
|
30
30
|
|
|
31
31
|
/** Effect Schema union of all event types in an EventDefRecord (input format, no sequence numbers). */
|
|
32
|
-
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.
|
|
32
|
+
export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Codec<
|
|
33
33
|
{
|
|
34
34
|
[K in keyof TEventDefRecord]: {
|
|
35
35
|
name: K
|
|
36
|
-
args:
|
|
36
|
+
args: TEventDefRecord[K]['schema']['Type']
|
|
37
37
|
}
|
|
38
38
|
}[keyof TEventDefRecord],
|
|
39
39
|
{
|
|
40
40
|
[K in keyof TEventDefRecord]: {
|
|
41
41
|
name: K
|
|
42
|
-
args:
|
|
42
|
+
args: TEventDefRecord[K]['schema']['Encoded']
|
|
43
43
|
}
|
|
44
44
|
}[keyof TEventDefRecord]
|
|
45
45
|
>
|
|
@@ -54,10 +54,10 @@ export type ForRecord<TEventDefRecord extends EventDefRecord> = Schema.Schema<
|
|
|
54
54
|
*/
|
|
55
55
|
export const makeSchema = <TSchema extends LiveStoreSchema>(schema: TSchema): ForRecord<TSchema['_EventDefMapType']> =>
|
|
56
56
|
Schema.Union(
|
|
57
|
-
|
|
57
|
+
[...schema.eventsDefsMap.values()].map((def) =>
|
|
58
58
|
Schema.Struct({
|
|
59
59
|
name: Schema.Literal(def.name),
|
|
60
60
|
args: def.schema,
|
|
61
61
|
}),
|
|
62
62
|
),
|
|
63
|
-
).
|
|
63
|
+
).annotate({ title: 'LiveStoreEvent.Input' }) as any
|
package/src/schema/mod.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * as LiveStoreEvent from './LiveStoreEvent/mod.ts'
|
|
|
5
5
|
export * from './schema.ts'
|
|
6
6
|
export * as State from './state/mod.ts'
|
|
7
7
|
export { SqliteAst, SqliteDsl } from './state/sqlite/db-schema/mod.ts'
|
|
8
|
+
export * from './state/sqlite/persistence.ts'
|
|
8
9
|
export * from './state/sqlite/schema-helpers.ts'
|
|
9
10
|
export * as SystemTables from './state/sqlite/system-tables/mod.ts'
|
|
10
11
|
export type { UnknownEvents } from './unknown-events.ts'
|
package/src/schema/schema.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
|
2
|
+
import { ReadonlyArray as EffectArray } from '@livestore/utils/effect'
|
|
2
3
|
|
|
3
4
|
import type { MigrationOptions } from '../adapter-types.ts'
|
|
4
5
|
import type { EventDef, EventDefRecord, Materializer } from './EventDef/mod.ts'
|
|
@@ -72,7 +73,7 @@ export interface InternalState {
|
|
|
72
73
|
readonly tables: Map<string, TableDef.Any>
|
|
73
74
|
readonly migrations: MigrationOptions
|
|
74
75
|
/** Compound hash of all table defs etc */
|
|
75
|
-
readonly hash:
|
|
76
|
+
readonly hash: string
|
|
76
77
|
}
|
|
77
78
|
readonly materializers: Map<string, Materializer>
|
|
78
79
|
}
|
|
@@ -108,7 +109,7 @@ export const makeSchema = <TInputSchema extends InputSchema>(
|
|
|
108
109
|
|
|
109
110
|
const eventsDefsMap = new Map<string, EventDef.AnyWithoutFn>()
|
|
110
111
|
|
|
111
|
-
if (
|
|
112
|
+
if (EffectArray.isArray<InputSchema['events']>(inputSchema.events) === true) {
|
|
112
113
|
for (const eventDef of inputSchema.events) {
|
|
113
114
|
eventsDefsMap.set(eventDef.name, eventDef)
|
|
114
115
|
}
|
|
@@ -10,9 +10,25 @@ import {
|
|
|
10
10
|
createOptimisticEventSchema,
|
|
11
11
|
mergeDefaultValues,
|
|
12
12
|
} from './client-document-def.ts'
|
|
13
|
+
import { fingerprint } from './db-schema/ast/fingerprint.ts'
|
|
13
14
|
import { getResultSchema } from './query-builder/impl.ts'
|
|
14
15
|
|
|
15
16
|
describe('client document table', () => {
|
|
17
|
+
test('tracks application value-schema changes in the storage fingerprint', () => {
|
|
18
|
+
const first = clientDocument({
|
|
19
|
+
name: 'documents',
|
|
20
|
+
schema: Schema.Struct({ title: Schema.String.check(Schema.isMinLength(1)) }),
|
|
21
|
+
default: { id: 'default', value: { title: 'valid' } },
|
|
22
|
+
})
|
|
23
|
+
const second = clientDocument({
|
|
24
|
+
name: 'documents',
|
|
25
|
+
schema: Schema.Struct({ title: Schema.String.check(Schema.isMinLength(2)) }),
|
|
26
|
+
default: { id: 'default', value: { title: 'valid' } },
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
expect(fingerprint(first.sqliteDef.ast)).not.toBe(fingerprint(second.sqliteDef.ast))
|
|
30
|
+
})
|
|
31
|
+
|
|
16
32
|
test('set event', () => {
|
|
17
33
|
expect(patchId(tables.UiState.set({ showSidebar: false }, 'session-1'))).toMatchInlineSnapshot(`
|
|
18
34
|
{
|
|
@@ -43,7 +59,7 @@ describe('client document table', () => {
|
|
|
43
59
|
})
|
|
44
60
|
|
|
45
61
|
describe('materializer', () => {
|
|
46
|
-
const forSchema = <T>(schema: Schema.
|
|
62
|
+
const forSchema = <T>(schema: Schema.Codec<T, any>, value: T, id?: string, options?: { partialSet?: boolean }) => {
|
|
47
63
|
const Doc = clientDocument({
|
|
48
64
|
name: 'test',
|
|
49
65
|
schema,
|
|
@@ -78,9 +94,8 @@ describe('client document table', () => {
|
|
|
78
94
|
})
|
|
79
95
|
|
|
80
96
|
test('struct value (partial set=true)', () => {
|
|
81
|
-
expect(
|
|
82
|
-
|
|
83
|
-
).toMatchInlineSnapshot(`
|
|
97
|
+
expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: true }))
|
|
98
|
+
.toMatchInlineSnapshot(`
|
|
84
99
|
{
|
|
85
100
|
"bindValues": [
|
|
86
101
|
"id1",
|
|
@@ -101,9 +116,8 @@ describe('client document table', () => {
|
|
|
101
116
|
})
|
|
102
117
|
|
|
103
118
|
test('struct value (partial set=false)', () => {
|
|
104
|
-
expect(
|
|
105
|
-
|
|
106
|
-
).toMatchInlineSnapshot(`
|
|
119
|
+
expect(forSchema(Schema.Struct({ a: Schema.String }), { a: 'hello' }, 'id1', { partialSet: false }))
|
|
120
|
+
.toMatchInlineSnapshot(`
|
|
107
121
|
{
|
|
108
122
|
"bindValues": [
|
|
109
123
|
"id1",
|
|
@@ -121,7 +135,7 @@ describe('client document table', () => {
|
|
|
121
135
|
test('struct value (partial set=true) advanced', () => {
|
|
122
136
|
expect(
|
|
123
137
|
forSchema(
|
|
124
|
-
Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.
|
|
138
|
+
Schema.Struct({ a: Schema.String, b: Schema.String, c: Schema.Finite }),
|
|
125
139
|
{ a: 'hello', c: 123 } as any,
|
|
126
140
|
'id1',
|
|
127
141
|
{ partialSet: true },
|
|
@@ -204,7 +218,7 @@ describe('client document table', () => {
|
|
|
204
218
|
test('struct union value', () => {
|
|
205
219
|
expect(
|
|
206
220
|
forSchema(
|
|
207
|
-
Schema.Union(Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })),
|
|
221
|
+
Schema.Union([Schema.Struct({ a: Schema.String }), Schema.Struct({ b: Schema.String })]),
|
|
208
222
|
{ a: 'hello' },
|
|
209
223
|
'id1',
|
|
210
224
|
),
|
|
@@ -223,6 +237,27 @@ describe('client document table', () => {
|
|
|
223
237
|
`)
|
|
224
238
|
})
|
|
225
239
|
|
|
240
|
+
test('struct union with shared fields fully replaces', () => {
|
|
241
|
+
const ValueSchema = Schema.Union([
|
|
242
|
+
Schema.Struct({ kind: Schema.Literal('a'), value: Schema.String }),
|
|
243
|
+
Schema.Struct({ kind: Schema.Literal('b'), value: Schema.String }),
|
|
244
|
+
])
|
|
245
|
+
|
|
246
|
+
expect(forSchema(ValueSchema, { kind: 'a', value: 'hello' }, 'id1')).toMatchInlineSnapshot(`
|
|
247
|
+
{
|
|
248
|
+
"bindValues": [
|
|
249
|
+
"id1",
|
|
250
|
+
"{"kind":"a","value":"hello"}",
|
|
251
|
+
"{"kind":"a","value":"hello"}",
|
|
252
|
+
],
|
|
253
|
+
"sql": "INSERT INTO 'test' (id, value) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET value = ?",
|
|
254
|
+
"writeTables": Set {
|
|
255
|
+
"test",
|
|
256
|
+
},
|
|
257
|
+
}
|
|
258
|
+
`)
|
|
259
|
+
})
|
|
260
|
+
|
|
226
261
|
test('array value', () => {
|
|
227
262
|
expect(forSchema(Schema.Array(Schema.String), ['hello', 'world'], 'id1')).toMatchInlineSnapshot(`
|
|
228
263
|
{
|
|
@@ -260,7 +295,7 @@ describe('client document table', () => {
|
|
|
260
295
|
describe('optimistic schema', () => {
|
|
261
296
|
/** Models persisted JSON using epoch numbers + base64 while app code expects Date + Uint8Array. */
|
|
262
297
|
const valueSchema = Schema.Struct({
|
|
263
|
-
createdAt: Schema.
|
|
298
|
+
createdAt: Schema.DateFromMillis,
|
|
264
299
|
avatar: Schema.Uint8ArrayFromBase64,
|
|
265
300
|
})
|
|
266
301
|
const defaultValue = {
|
|
@@ -281,9 +316,9 @@ describe('client document table', () => {
|
|
|
281
316
|
defaultValue,
|
|
282
317
|
partialSet: false,
|
|
283
318
|
})
|
|
284
|
-
const rowSchema = Schema.
|
|
319
|
+
const rowSchema = Schema.fromJsonString(optimisticSchema)
|
|
285
320
|
|
|
286
|
-
expect(Schema.
|
|
321
|
+
expect(Schema.decodeSync(rowSchema)(JSON.stringify(value))).toEqual(defaultValue)
|
|
287
322
|
})
|
|
288
323
|
|
|
289
324
|
test('decodes valid persisted JSON (encoded shape)', () => {
|
|
@@ -292,9 +327,9 @@ describe('client document table', () => {
|
|
|
292
327
|
defaultValue,
|
|
293
328
|
partialSet: false,
|
|
294
329
|
})
|
|
295
|
-
const rowSchema = Schema.
|
|
330
|
+
const rowSchema = Schema.fromJsonString(optimisticSchema)
|
|
296
331
|
|
|
297
|
-
expect(Schema.
|
|
332
|
+
expect(Schema.decodeSync(rowSchema)(JSON.stringify(validPayload))).toEqual({
|
|
298
333
|
createdAt: new Date(42),
|
|
299
334
|
avatar: new Uint8Array([1, 2]),
|
|
300
335
|
})
|
|
@@ -306,9 +341,9 @@ describe('client document table', () => {
|
|
|
306
341
|
defaultValue,
|
|
307
342
|
partialSet: false,
|
|
308
343
|
})
|
|
309
|
-
const rowSchema = Schema.
|
|
344
|
+
const rowSchema = Schema.fromJsonString(optimisticSchema)
|
|
310
345
|
|
|
311
|
-
expect(Schema.
|
|
346
|
+
expect(Schema.decodeSync(rowSchema)(JSON.stringify(extraFieldsPayload))).toEqual({
|
|
312
347
|
createdAt: new Date(42),
|
|
313
348
|
avatar: new Uint8Array([1, 2]),
|
|
314
349
|
})
|
|
@@ -326,7 +361,7 @@ describe('client document table', () => {
|
|
|
326
361
|
value: JSON.stringify(value),
|
|
327
362
|
}
|
|
328
363
|
|
|
329
|
-
expect(Schema.
|
|
364
|
+
expect(Schema.decodeSync(Doc.rowSchema)(row)).toEqual({ id: 'row-1', value: defaultValue })
|
|
330
365
|
})
|
|
331
366
|
|
|
332
367
|
test('decodes clientDocument rowSchema with valid encoded JSON', () => {
|
|
@@ -341,7 +376,7 @@ describe('client document table', () => {
|
|
|
341
376
|
value: JSON.stringify(validPayload),
|
|
342
377
|
}
|
|
343
378
|
|
|
344
|
-
expect(Schema.
|
|
379
|
+
expect(Schema.decodeSync(Doc.rowSchema)(row)).toEqual({
|
|
345
380
|
id: 'row-1',
|
|
346
381
|
value: { createdAt: new Date(42), avatar: new Uint8Array([1, 2]) },
|
|
347
382
|
})
|
|
@@ -363,7 +398,7 @@ describe('client document table', () => {
|
|
|
363
398
|
},
|
|
364
399
|
]
|
|
365
400
|
|
|
366
|
-
expect(Schema.
|
|
401
|
+
expect(Schema.decodeSync(resultSchema)(rawDbResults)).toEqual(defaultValue)
|
|
367
402
|
})
|
|
368
403
|
|
|
369
404
|
test('decodes RowQuery result schema with valid encoded JSON', () => {
|
|
@@ -382,7 +417,7 @@ describe('client document table', () => {
|
|
|
382
417
|
},
|
|
383
418
|
]
|
|
384
419
|
|
|
385
|
-
expect(Schema.
|
|
420
|
+
expect(Schema.decodeSync(resultSchema)(rawDbResults)).toEqual({
|
|
386
421
|
createdAt: new Date(42),
|
|
387
422
|
avatar: new Uint8Array([1, 2]),
|
|
388
423
|
})
|