@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21
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 +20 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/adapter-types.d.ts +14 -6
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.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-messages-client-session.d.ts +28 -23
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +2 -2
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +7 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +1 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +38 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +9 -8
- 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 +52 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +25 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +21 -22
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +77 -20
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +56 -45
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +79 -27
- 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 +3 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +25 -11
- 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 -3
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +5 -5
- 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 +166 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +98 -20
- 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 +5 -2
- 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 +20 -4
- 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 +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +2 -2
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +29 -20
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +147 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +139 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +106 -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 +5 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +5 -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 +43 -43
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
- package/dist/schema/LiveStoreEvent/client.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 +27 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +97 -6
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
- 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 +14 -6
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +69 -22
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +48 -10
- 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 +23 -14
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
- 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 +14 -8
- 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 +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +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 +2 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +3 -3
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
- 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 -15
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
- 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 +22 -12
- 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} +63 -456
- 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 +4 -4
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +2 -2
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +80 -0
- 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/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +37 -5
- 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 +11 -1
- 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 +2 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -3
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +45 -42
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +66 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/errors.js +36 -0
- package/dist/sync/errors.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +23 -0
- package/dist/sync/mock-sync-backend.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.js +114 -0
- package/dist/sync/mock-sync-backend.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +6 -7
- 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 +1 -2
- 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 +10 -8
- 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 +5 -5
- package/dist/sync/next/rebase-events.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 +9 -9
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +7 -0
- package/dist/sync/sync-backend-kv.d.ts.map +1 -0
- package/dist/sync/sync-backend-kv.js +18 -0
- package/dist/sync/sync-backend-kv.js.map +1 -0
- package/dist/sync/sync-backend.d.ts +105 -0
- package/dist/sync/sync-backend.d.ts.map +1 -0
- package/dist/sync/sync-backend.js +61 -0
- package/dist/sync/sync-backend.js.map +1 -0
- package/dist/sync/sync.d.ts +9 -86
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -27
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +57 -44
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +50 -45
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +83 -46
- 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 +6 -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/version.d.ts +16 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +16 -6
- package/dist/version.js.map +1 -1
- package/package.json +7 -8
- package/src/ClientSessionLeaderThreadProxy.ts +20 -12
- package/src/adapter-types.ts +18 -6
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-messages-client-session.ts +2 -2
- package/src/devtools/devtools-messages-common.ts +1 -8
- package/src/devtools/devtools-messages-leader.ts +9 -8
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +38 -11
- package/src/index.ts +2 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
- package/src/leader-thread/eventlog.ts +113 -38
- package/src/leader-thread/leader-worker-devtools.ts +86 -55
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +156 -37
- package/src/leader-thread/materialize-event.ts +37 -12
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/stream-events.ts +201 -0
- package/src/leader-thread/types.ts +70 -20
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- package/src/otel.ts +10 -0
- package/src/rematerialize-from-eventlog.ts +37 -27
- package/src/schema/EventDef/define.ts +201 -0
- package/src/schema/EventDef/event-def.ts +120 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +4 -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 +70 -52
- package/src/schema/LiveStoreEvent/client.ts +221 -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 +39 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
- package/src/schema/state/sqlite/client-document-def.ts +127 -25
- package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
- package/src/schema/state/sqlite/column-annotations.ts +16 -6
- package/src/schema/state/sqlite/column-def.test.ts +62 -10
- package/src/schema/state/sqlite/column-def.ts +88 -21
- package/src/schema/state/sqlite/column-spec.test.ts +29 -16
- package/src/schema/state/sqlite/column-spec.ts +36 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +25 -11
- package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
- package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
- package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +28 -20
- 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 +101 -0
- package/src/schema/state/sqlite/table-def.ts +8 -6
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
- package/src/schema-management/migrations.ts +41 -8
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +9 -1
- package/src/sql-queries/sql-query-builder.ts +2 -1
- package/src/sqlite-types.ts +3 -3
- package/src/sync/ClientSessionSyncProcessor.ts +69 -62
- package/src/sync/errors.ts +38 -0
- package/src/sync/index.ts +3 -0
- package/src/sync/mock-sync-backend.ts +184 -0
- package/src/sync/next/compact-events.ts +6 -7
- package/src/sync/next/facts.ts +7 -9
- package/src/sync/next/history-dag-common.ts +277 -26
- package/src/sync/next/history-dag.ts +16 -10
- package/src/sync/next/rebase-events.ts +11 -11
- package/src/sync/next/test/event-fixtures.ts +11 -11
- package/src/sync/sync-backend-kv.ts +22 -0
- package/src/sync/sync-backend.ts +185 -0
- package/src/sync/sync.ts +9 -91
- package/src/sync/syncstate.test.ts +96 -52
- package/src/sync/syncstate.ts +69 -58
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +8 -9
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/version.ts +16 -6
- package/dist/schema/EventDef.d.ts +0 -123
- 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.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -79
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/schema-management/migrations.test.d.ts +0 -2
- package/dist/schema-management/migrations.test.d.ts.map +0 -1
- package/dist/schema-management/migrations.test.js +0 -52
- package/dist/schema-management/migrations.test.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 -219
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -287
- package/src/schema/state/sqlite/system-tables.ts +0 -104
- 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,106 @@
|
|
|
1
|
+
import type { Schema } from '@livestore/utils/effect';
|
|
2
|
+
import type { FactsCallback } from './facts.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Core type representing an event definition in LiveStore.
|
|
5
|
+
*
|
|
6
|
+
* An EventDef defines the structure and behavior of an event type, including:
|
|
7
|
+
* - A unique name identifying the event type (conventionally versioned, e.g., `v1.TodoCreated`)
|
|
8
|
+
* - A schema for validating and encoding/decoding event arguments
|
|
9
|
+
* - Options controlling sync behavior and constraints
|
|
10
|
+
*
|
|
11
|
+
* EventDefs are callable - invoking them creates a partial event object suitable for `store.commit()`.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { Events } from '@livestore/livestore'
|
|
16
|
+
* import { Schema } from 'effect'
|
|
17
|
+
*
|
|
18
|
+
* const todoCreated = Events.synced({
|
|
19
|
+
* name: 'v1.TodoCreated',
|
|
20
|
+
* schema: Schema.Struct({
|
|
21
|
+
* id: Schema.String,
|
|
22
|
+
* text: Schema.String,
|
|
23
|
+
* }),
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Use the EventDef as a constructor
|
|
27
|
+
* store.commit(todoCreated({ id: 'abc', text: 'Buy milk' }))
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export type EventDef<TName extends string, TType, TEncoded = TType, TDerived extends boolean = false> = {
|
|
31
|
+
/** Unique identifier for this event type. Conventionally versioned (e.g., `v1.TodoCreated`). */
|
|
32
|
+
name: TName;
|
|
33
|
+
/** Effect Schema used for validating and encoding/decoding event arguments. */
|
|
34
|
+
schema: Schema.Schema<TType, TEncoded>;
|
|
35
|
+
options: {
|
|
36
|
+
/**
|
|
37
|
+
* When true, the event is only synced within the same client's sessions (e.g., across tabs)
|
|
38
|
+
* but never sent to the sync backend. Useful for UI state like selected items or filters.
|
|
39
|
+
*/
|
|
40
|
+
clientOnly: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Callback defining fact constraints for this event.
|
|
43
|
+
* @experimental This feature is not fully implemented yet.
|
|
44
|
+
*/
|
|
45
|
+
facts: FactsCallback<TType> | undefined;
|
|
46
|
+
/** Whether this is a derived event. Derived events cannot have materializers. */
|
|
47
|
+
derived: TDerived;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Callable signature - creates a partial event with decoded arguments.
|
|
51
|
+
* The returned object can be passed directly to `store.commit()`.
|
|
52
|
+
*/
|
|
53
|
+
(args: TType): {
|
|
54
|
+
name: TName;
|
|
55
|
+
args: TType;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Creates a partial event with pre-encoded arguments.
|
|
59
|
+
* Useful when working with already-serialized data.
|
|
60
|
+
*/
|
|
61
|
+
encoded: (args: TEncoded) => {
|
|
62
|
+
name: TName;
|
|
63
|
+
args: TEncoded;
|
|
64
|
+
};
|
|
65
|
+
/** Type helper for accessing the event's shape with name and decoded args. */
|
|
66
|
+
readonly Event: {
|
|
67
|
+
name: TName;
|
|
68
|
+
args: TType;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
export declare namespace EventDef {
|
|
72
|
+
/**
|
|
73
|
+
* Wildcard type matching any EventDef regardless of type parameters.
|
|
74
|
+
* Used as a type constraint in generic functions and collections.
|
|
75
|
+
*/
|
|
76
|
+
type Any = EventDef<string, any, any, boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* EventDef without the callable function signature.
|
|
79
|
+
* Used in contexts where only the metadata (name, schema, options) is needed,
|
|
80
|
+
* such as materializer definitions.
|
|
81
|
+
*/
|
|
82
|
+
type AnyWithoutFn = Pick<Any, 'name' | 'schema' | 'options'>;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Container holding a Map of event definitions keyed by name.
|
|
86
|
+
* Used internally by LiveStoreSchema.
|
|
87
|
+
*/
|
|
88
|
+
export type EventDefMap = {
|
|
89
|
+
map: Map<string, EventDef.Any>;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Plain object record of event definitions keyed by name.
|
|
93
|
+
* This is the typical shape when defining events in user code.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* const events = {
|
|
98
|
+
* todoCreated: Events.synced({ name: 'v1.TodoCreated', schema: ... }),
|
|
99
|
+
* todoDeleted: Events.synced({ name: 'v1.TodoDeleted', schema: ... }),
|
|
100
|
+
* } satisfies EventDefRecord
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export type EventDefRecord = {
|
|
104
|
+
[name: string]: EventDef.Any;
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=event-def.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-def.d.ts","sourceRoot":"","sources":["../../../src/schema/EventDef/event-def.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,QAAQ,CAAC,KAAK,SAAS,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,QAAQ,SAAS,OAAO,GAAG,KAAK,IAAI;IACtG,gGAAgG;IAChG,IAAI,EAAE,KAAK,CAAA;IAEX,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,EAAE;QACP;;;WAGG;QACH,UAAU,EAAE,OAAO,CAAA;QAEnB;;;WAGG;QACH,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,SAAS,CAAA;QAEvC,iFAAiF;QACjF,OAAO,EAAE,QAAQ,CAAA;KAClB,CAAA;IAED;;;OAGG;IACH,CACE,IAAI,EAAE,KAAK,GACV;QACD,IAAI,EAAE,KAAK,CAAA;QACX,IAAI,EAAE,KAAK,CAAA;KACZ,CAAA;IAED;;;OAGG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK;QAC3B,IAAI,EAAE,KAAK,CAAA;QACX,IAAI,EAAE,QAAQ,CAAA;KACf,CAAA;IAED,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE;QACd,IAAI,EAAE,KAAK,CAAA;QACX,IAAI,EAAE,KAAK,CAAA;KACZ,CAAA;CACF,CAAA;AAED,yBAAiB,QAAQ,CAAC;IACxB;;;OAGG;IACH,KAAY,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAErD;;;;OAIG;IACH,KAAY,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAA;CACpE;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;CAC/B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAA;CAC7B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-def.js","sourceRoot":"","sources":["../../../src/schema/EventDef/event-def.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Facts System for Event Constraints (Experimental)
|
|
3
|
+
*
|
|
4
|
+
* The facts system enables defining constraints and dependencies between events.
|
|
5
|
+
* Facts are key-value pairs that events can read, set, or require, allowing
|
|
6
|
+
* LiveStore to understand event relationships for:
|
|
7
|
+
* - History constraints (ordering requirements)
|
|
8
|
+
* - Event compaction (which events can be safely merged)
|
|
9
|
+
* - Conflict detection during sync
|
|
10
|
+
*
|
|
11
|
+
* @experimental This system is not fully implemented yet.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const facts = defineFacts({
|
|
16
|
+
* todoExists: (id: string) => [`todo:${id}`, true],
|
|
17
|
+
* userOwns: (userId: string, todoId: string) => [`owns:${userId}:${todoId}`, true],
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* const todoCreated = Events.synced({
|
|
21
|
+
* name: 'v1.TodoCreated',
|
|
22
|
+
* schema: Schema.Struct({ id: Schema.String, userId: Schema.String }),
|
|
23
|
+
* facts: ({ id, userId }) => ({
|
|
24
|
+
* modify: { set: [facts.todoExists(id), facts.userOwns(userId, id)] },
|
|
25
|
+
* require: [],
|
|
26
|
+
* }),
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
* @module
|
|
30
|
+
*/
|
|
31
|
+
/** String key identifying a fact (e.g., `"todo:abc123"` or `"user:owner:xyz"`). */
|
|
32
|
+
export type EventDefKey = string;
|
|
33
|
+
/** String identifier for a fact type. */
|
|
34
|
+
export type EventDefFact = string;
|
|
35
|
+
/** Immutable map of fact keys to their current values. */
|
|
36
|
+
export type EventDefFacts = ReadonlyMap<string, any>;
|
|
37
|
+
/**
|
|
38
|
+
* Groups of facts that an event interacts with.
|
|
39
|
+
* Used internally to track how events modify and depend on facts.
|
|
40
|
+
*/
|
|
41
|
+
export type EventDefFactsGroup = {
|
|
42
|
+
/** Facts this event sets to a new value. */
|
|
43
|
+
modifySet: EventDefFacts;
|
|
44
|
+
/** Facts this event removes/unsets. */
|
|
45
|
+
modifyUnset: EventDefFacts;
|
|
46
|
+
/**
|
|
47
|
+
* Facts this event requires to exist with specific values.
|
|
48
|
+
* Events on independent dependency branches are commutative,
|
|
49
|
+
* which can facilitate more prioritized syncing.
|
|
50
|
+
*/
|
|
51
|
+
depRequire: EventDefFacts;
|
|
52
|
+
/** Facts this event reads (but doesn't require). */
|
|
53
|
+
depRead: EventDefFacts;
|
|
54
|
+
};
|
|
55
|
+
/** Mutable snapshot of facts state at a point in time. */
|
|
56
|
+
export type EventDefFactsSnapshot = Map<string, any>;
|
|
57
|
+
/**
|
|
58
|
+
* Input format for specifying a fact.
|
|
59
|
+
* Either a simple key string (value defaults to `true`) or a `[key, value]` tuple.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* // Simple key (value = true)
|
|
64
|
+
* const fact1: EventDefFactInput = 'todo:abc123'
|
|
65
|
+
*
|
|
66
|
+
* // Key-value tuple
|
|
67
|
+
* const fact2: EventDefFactInput = ['todo:abc123', { status: 'active' }]
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export type EventDefFactInput = string | readonly [string, any];
|
|
71
|
+
/**
|
|
72
|
+
* Callback function that defines how an event interacts with the facts system.
|
|
73
|
+
* Called during event processing to determine fact constraints.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const factsCallback: FactsCallback<{ id: string }> = (args, currentFacts) => ({
|
|
78
|
+
* modify: {
|
|
79
|
+
* set: [`item:${args.id}`], // Create/update this fact
|
|
80
|
+
* unset: [], // No facts to remove
|
|
81
|
+
* },
|
|
82
|
+
* require: currentFacts.has('initialized') ? [] : ['initialized'],
|
|
83
|
+
* })
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export type FactsCallback<TTo> = (args: TTo, currentFacts: EventDefFacts) => {
|
|
87
|
+
modify: {
|
|
88
|
+
/** Facts to set (create or update). */
|
|
89
|
+
set: Iterable<EventDefFactInput>;
|
|
90
|
+
/** Facts to unset (remove). */
|
|
91
|
+
unset: Iterable<EventDefFactInput>;
|
|
92
|
+
};
|
|
93
|
+
/** Facts that must exist with specific values for this event to be valid. */
|
|
94
|
+
require: Iterable<EventDefFactInput>;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Helper to define a typed record of fact constructors.
|
|
98
|
+
* Returns the input unchanged but provides type inference.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* const facts = defineFacts({
|
|
103
|
+
* // Simple fact (value = true)
|
|
104
|
+
* initialized: 'system:initialized',
|
|
105
|
+
*
|
|
106
|
+
* // Parameterized fact constructor
|
|
107
|
+
* todoExists: (id: string) => [`todo:${id}`, true] as const,
|
|
108
|
+
*
|
|
109
|
+
* // Fact with complex value
|
|
110
|
+
* todoStatus: (id: string, status: string) => [`todo:${id}:status`, status] as const,
|
|
111
|
+
* })
|
|
112
|
+
*
|
|
113
|
+
* // Usage
|
|
114
|
+
* facts.todoExists('abc') // => ['todo:abc', true]
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export declare const defineFacts: <TRecord extends Record<string, EventDefFactInput | ((...args: any[]) => EventDefFactInput)>>(record: TRecord) => TRecord;
|
|
118
|
+
//# sourceMappingURL=facts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../../src/schema/EventDef/facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,MAAM,CAAA;AAEjC,0DAA0D;AAC1D,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEpD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4CAA4C;IAC5C,SAAS,EAAE,aAAa,CAAA;IAExB,uCAAuC;IACvC,WAAW,EAAE,aAAa,CAAA;IAE1B;;;;OAIG;IACH,UAAU,EAAE,aAAa,CAAA;IAEzB,oDAAoD;IACpD,OAAO,EAAE,aAAa,CAAA;CACvB,CAAA;AAED,0DAA0D;AAC1D,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAEpD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAE/D;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,aAAa,CAAC,GAAG,IAAI,CAC/B,IAAI,EAAE,GAAG,EACT,YAAY,EAAE,aAAa,KACxB;IACH,MAAM,EAAE;QACN,uCAAuC;QACvC,GAAG,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;QAChC,+BAA+B;QAC/B,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;KACnC,CAAA;IACD,6EAA6E;IAC7E,OAAO,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;CACrC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,iBAAiB,CAAC,CAAC,EAE3F,QAAQ,OAAO,KACd,OAAiB,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Facts System for Event Constraints (Experimental)
|
|
3
|
+
*
|
|
4
|
+
* The facts system enables defining constraints and dependencies between events.
|
|
5
|
+
* Facts are key-value pairs that events can read, set, or require, allowing
|
|
6
|
+
* LiveStore to understand event relationships for:
|
|
7
|
+
* - History constraints (ordering requirements)
|
|
8
|
+
* - Event compaction (which events can be safely merged)
|
|
9
|
+
* - Conflict detection during sync
|
|
10
|
+
*
|
|
11
|
+
* @experimental This system is not fully implemented yet.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const facts = defineFacts({
|
|
16
|
+
* todoExists: (id: string) => [`todo:${id}`, true],
|
|
17
|
+
* userOwns: (userId: string, todoId: string) => [`owns:${userId}:${todoId}`, true],
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* const todoCreated = Events.synced({
|
|
21
|
+
* name: 'v1.TodoCreated',
|
|
22
|
+
* schema: Schema.Struct({ id: Schema.String, userId: Schema.String }),
|
|
23
|
+
* facts: ({ id, userId }) => ({
|
|
24
|
+
* modify: { set: [facts.todoExists(id), facts.userOwns(userId, id)] },
|
|
25
|
+
* require: [],
|
|
26
|
+
* }),
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
* @module
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Helper to define a typed record of fact constructors.
|
|
33
|
+
* Returns the input unchanged but provides type inference.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const facts = defineFacts({
|
|
38
|
+
* // Simple fact (value = true)
|
|
39
|
+
* initialized: 'system:initialized',
|
|
40
|
+
*
|
|
41
|
+
* // Parameterized fact constructor
|
|
42
|
+
* todoExists: (id: string) => [`todo:${id}`, true] as const,
|
|
43
|
+
*
|
|
44
|
+
* // Fact with complex value
|
|
45
|
+
* todoStatus: (id: string, status: string) => [`todo:${id}:status`, status] as const,
|
|
46
|
+
* })
|
|
47
|
+
*
|
|
48
|
+
* // Usage
|
|
49
|
+
* facts.todoExists('abc') // => ['todo:abc', true]
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export const defineFacts = (record) => record;
|
|
53
|
+
//# sourceMappingURL=facts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts.js","sourceRoot":"","sources":["../../../src/schema/EventDef/facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAgFH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAGzB,MAAe,EACN,EAAE,CAAC,MAAM,CAAA"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Materializer System
|
|
3
|
+
*
|
|
4
|
+
* Materializers transform events into SQL mutations (INSERT, UPDATE, DELETE).
|
|
5
|
+
* Every non-derived event must have a corresponding materializer that defines
|
|
6
|
+
* how it affects the SQLite database state.
|
|
7
|
+
*
|
|
8
|
+
* Materializers are pure functions that receive the event arguments and return
|
|
9
|
+
* SQL operations. They can also query current state when needed for complex
|
|
10
|
+
* transformations.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { State } from '@livestore/livestore'
|
|
15
|
+
*
|
|
16
|
+
* const materializers = State.SQLite.materializers(events, {
|
|
17
|
+
* 'v1.TodoCreated': ({ id, text }) =>
|
|
18
|
+
* tables.todos.insert({ id, text, completed: false }),
|
|
19
|
+
*
|
|
20
|
+
* 'v1.TodoCompleted': ({ id }) =>
|
|
21
|
+
* tables.todos.update({ completed: true }).where({ id }),
|
|
22
|
+
*
|
|
23
|
+
* 'v1.TodoDeleted': ({ id, deletedAt }) =>
|
|
24
|
+
* tables.todos.update({ deletedAt }).where({ id }),
|
|
25
|
+
* })
|
|
26
|
+
* ```
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
29
|
+
import type { SingleOrReadonlyArray } from '@livestore/utils';
|
|
30
|
+
import type { BindValues } from '../../sql-queries/sql-queries.ts';
|
|
31
|
+
import type { ParamsObject } from '../../util.ts';
|
|
32
|
+
import type * as LiveStoreEvent from '../LiveStoreEvent/mod.ts';
|
|
33
|
+
import type { QueryBuilder } from '../state/sqlite/query-builder/mod.ts';
|
|
34
|
+
import type { EventDef } from './event-def.ts';
|
|
35
|
+
import type { EventDefFacts } from './facts.ts';
|
|
36
|
+
/**
|
|
37
|
+
* Result type for materializer functions.
|
|
38
|
+
*
|
|
39
|
+
* Can be one of:
|
|
40
|
+
* - A QueryBuilder operation (recommended for type safety)
|
|
41
|
+
* - A raw SQL string
|
|
42
|
+
* - An object with SQL, bind values, and optional write table tracking
|
|
43
|
+
*/
|
|
44
|
+
export type MaterializerResult = {
|
|
45
|
+
sql: string;
|
|
46
|
+
bindValues: BindValues;
|
|
47
|
+
writeTables?: ReadonlySet<string>;
|
|
48
|
+
} | QueryBuilder.Any | string;
|
|
49
|
+
/**
|
|
50
|
+
* Function signature for querying current state within a materializer.
|
|
51
|
+
*
|
|
52
|
+
* Allows materializers to read existing data when computing mutations.
|
|
53
|
+
* Can be called with either raw SQL or a type-safe QueryBuilder.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* 'v1.TodoUpdated': ({ id, text }, { query }) => {
|
|
58
|
+
* const existing = query(tables.todos.select().where({ id }).first())
|
|
59
|
+
* if (!existing) return [] // No-op if todo doesn't exist
|
|
60
|
+
* return tables.todos.update({ text }).where({ id })
|
|
61
|
+
* }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export type MaterializerContextQuery = {
|
|
65
|
+
/** Query with raw SQL and bind values. */
|
|
66
|
+
(args: {
|
|
67
|
+
query: string;
|
|
68
|
+
bindValues: ParamsObject;
|
|
69
|
+
}): ReadonlyArray<unknown>;
|
|
70
|
+
/** Query with a type-safe QueryBuilder. */
|
|
71
|
+
<TResult>(qb: QueryBuilder<TResult, any, any>): TResult;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Function type for transforming an event into database mutations.
|
|
75
|
+
*
|
|
76
|
+
* Materializers are the bridge between events and SQLite state. They receive
|
|
77
|
+
* the decoded event arguments and return SQL operations to execute.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* const todoCreatedMaterializer: Materializer<typeof todoCreated> =
|
|
82
|
+
* ({ id, text }) => tables.todos.insert({ id, text, completed: false })
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export type Materializer<TEventDef extends EventDef.AnyWithoutFn = EventDef.AnyWithoutFn> = (
|
|
86
|
+
/** Decoded event arguments. */
|
|
87
|
+
event: TEventDef['schema']['Type'], context: {
|
|
88
|
+
/** Current facts state (experimental). */
|
|
89
|
+
currentFacts: EventDefFacts;
|
|
90
|
+
/** The event definition being materialized. */
|
|
91
|
+
eventDef: TEventDef;
|
|
92
|
+
/** Function to query current database state. */
|
|
93
|
+
query: MaterializerContextQuery;
|
|
94
|
+
/** Full event metadata including clientId, sessionId, sequence numbers. */
|
|
95
|
+
event: LiveStoreEvent.Client.Decoded;
|
|
96
|
+
}) => SingleOrReadonlyArray<MaterializerResult>;
|
|
97
|
+
/**
|
|
98
|
+
* Type-safe wrapper for defining a single materializer.
|
|
99
|
+
*
|
|
100
|
+
* Useful when defining materializers separately from the `materializers()` builder.
|
|
101
|
+
* The first argument provides type inference for the second.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* const todoCreatedHandler = defineMaterializer(
|
|
106
|
+
* events.todoCreated,
|
|
107
|
+
* ({ id, text }) => tables.todos.insert({ id, text, completed: false })
|
|
108
|
+
* )
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare const defineMaterializer: <TEventDef extends EventDef.AnyWithoutFn>(_eventDef: TEventDef, materializer: Materializer<TEventDef>) => Materializer<TEventDef>;
|
|
112
|
+
/**
|
|
113
|
+
* Builder function for creating a type-safe materializer map.
|
|
114
|
+
*
|
|
115
|
+
* This is the primary way to define materializers in LiveStore. It ensures:
|
|
116
|
+
* - Every non-derived event has a corresponding materializer
|
|
117
|
+
* - Materializer argument types match their event schemas
|
|
118
|
+
* - Derived events are excluded from the required handlers
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* import { State } from '@livestore/livestore'
|
|
123
|
+
*
|
|
124
|
+
* const handlers = State.SQLite.materializers(events, {
|
|
125
|
+
* // Handler for each event - argument types are inferred
|
|
126
|
+
* 'v1.TodoCreated': ({ id, text, completed }) =>
|
|
127
|
+
* tables.todos.insert({ id, text, completed }),
|
|
128
|
+
*
|
|
129
|
+
* 'v1.TodoUpdated': ({ id, text }) =>
|
|
130
|
+
* tables.todos.update({ text }).where({ id }),
|
|
131
|
+
*
|
|
132
|
+
* // Can return multiple operations
|
|
133
|
+
* 'v1.UserCreatedWithDefaults': ({ userId, name }) => [
|
|
134
|
+
* tables.users.insert({ id: userId, name }),
|
|
135
|
+
* tables.settings.insert({ userId, theme: 'light' }),
|
|
136
|
+
* ],
|
|
137
|
+
*
|
|
138
|
+
* // Can query current state
|
|
139
|
+
* 'v1.TodoToggled': ({ id }, { query }) => {
|
|
140
|
+
* const todo = query(tables.todos.select().where({ id }).first())
|
|
141
|
+
* return tables.todos.update({ completed: !todo?.completed }).where({ id })
|
|
142
|
+
* },
|
|
143
|
+
* })
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export declare const materializers: <TInputRecord extends Record<string, EventDef.AnyWithoutFn>>(_eventDefRecord: TInputRecord, handlers: { [TEventName in TInputRecord[keyof TInputRecord]["name"] as Extract<TInputRecord[keyof TInputRecord], {
|
|
147
|
+
name: TEventName;
|
|
148
|
+
}>["options"]["derived"] extends true ? never : TEventName]: Materializer<Extract<TInputRecord[keyof TInputRecord], {
|
|
149
|
+
name: TEventName;
|
|
150
|
+
}>>; }) => { [TEventName in TInputRecord[keyof TInputRecord]["name"] as Extract<TInputRecord[keyof TInputRecord], {
|
|
151
|
+
name: TEventName;
|
|
152
|
+
}>["options"]["derived"] extends true ? never : TEventName]: Materializer<Extract<TInputRecord[keyof TInputRecord], {
|
|
153
|
+
name: TEventName;
|
|
154
|
+
}>>; };
|
|
155
|
+
//# sourceMappingURL=materializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../../../src/schema/EventDef/materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,KAAK,cAAc,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IACE,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClC,GACD,YAAY,CAAC,GAAG,GAChB,MAAM,CAAA;AAEV;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,YAAY,CAAA;KAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3E,2CAA2C;IAC3C,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAA;CACxD,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,QAAQ,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY,IAAI;AAC1F,+BAA+B;AAC/B,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAClC,OAAO,EAAE;IACP,0CAA0C;IAC1C,YAAY,EAAE,aAAa,CAAA;IAC3B,+CAA+C;IAC/C,QAAQ,EAAE,SAAS,CAAA;IACnB,gDAAgD;IAChD,KAAK,EAAE,wBAAwB,CAAA;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAA;CACrC,KACE,qBAAqB,CAAC,kBAAkB,CAAC,CAAA;AAE9C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,SAAS,QAAQ,CAAC,YAAY,EACxE,WAAW,SAAS,EACpB,cAAc,YAAY,CAAC,SAAS,CAAC,KACpC,YAAY,CAAC,SAAS,CAExB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,EACtF,iBAAiB,YAAY,EAC7B,UAAU,GACP,UAAU,IAAI,YAAY,CAAC,MAAM,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAChE,YAAY,CAAC,MAAM,YAAY,CAAC,EAChC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CACrB,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,GAChC,KAAK,GACL,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,YAAY,CAAC,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,GAC/F,QANE,UAAU;UAED,UAAU;;UAG4D,UAAU;MAI7F,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Materializer System
|
|
3
|
+
*
|
|
4
|
+
* Materializers transform events into SQL mutations (INSERT, UPDATE, DELETE).
|
|
5
|
+
* Every non-derived event must have a corresponding materializer that defines
|
|
6
|
+
* how it affects the SQLite database state.
|
|
7
|
+
*
|
|
8
|
+
* Materializers are pure functions that receive the event arguments and return
|
|
9
|
+
* SQL operations. They can also query current state when needed for complex
|
|
10
|
+
* transformations.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { State } from '@livestore/livestore'
|
|
15
|
+
*
|
|
16
|
+
* const materializers = State.SQLite.materializers(events, {
|
|
17
|
+
* 'v1.TodoCreated': ({ id, text }) =>
|
|
18
|
+
* tables.todos.insert({ id, text, completed: false }),
|
|
19
|
+
*
|
|
20
|
+
* 'v1.TodoCompleted': ({ id }) =>
|
|
21
|
+
* tables.todos.update({ completed: true }).where({ id }),
|
|
22
|
+
*
|
|
23
|
+
* 'v1.TodoDeleted': ({ id, deletedAt }) =>
|
|
24
|
+
* tables.todos.update({ deletedAt }).where({ id }),
|
|
25
|
+
* })
|
|
26
|
+
* ```
|
|
27
|
+
* @module
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Type-safe wrapper for defining a single materializer.
|
|
31
|
+
*
|
|
32
|
+
* Useful when defining materializers separately from the `materializers()` builder.
|
|
33
|
+
* The first argument provides type inference for the second.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const todoCreatedHandler = defineMaterializer(
|
|
38
|
+
* events.todoCreated,
|
|
39
|
+
* ({ id, text }) => tables.todos.insert({ id, text, completed: false })
|
|
40
|
+
* )
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export const defineMaterializer = (_eventDef, materializer) => {
|
|
44
|
+
return materializer;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Builder function for creating a type-safe materializer map.
|
|
48
|
+
*
|
|
49
|
+
* This is the primary way to define materializers in LiveStore. It ensures:
|
|
50
|
+
* - Every non-derived event has a corresponding materializer
|
|
51
|
+
* - Materializer argument types match their event schemas
|
|
52
|
+
* - Derived events are excluded from the required handlers
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { State } from '@livestore/livestore'
|
|
57
|
+
*
|
|
58
|
+
* const handlers = State.SQLite.materializers(events, {
|
|
59
|
+
* // Handler for each event - argument types are inferred
|
|
60
|
+
* 'v1.TodoCreated': ({ id, text, completed }) =>
|
|
61
|
+
* tables.todos.insert({ id, text, completed }),
|
|
62
|
+
*
|
|
63
|
+
* 'v1.TodoUpdated': ({ id, text }) =>
|
|
64
|
+
* tables.todos.update({ text }).where({ id }),
|
|
65
|
+
*
|
|
66
|
+
* // Can return multiple operations
|
|
67
|
+
* 'v1.UserCreatedWithDefaults': ({ userId, name }) => [
|
|
68
|
+
* tables.users.insert({ id: userId, name }),
|
|
69
|
+
* tables.settings.insert({ userId, theme: 'light' }),
|
|
70
|
+
* ],
|
|
71
|
+
*
|
|
72
|
+
* // Can query current state
|
|
73
|
+
* 'v1.TodoToggled': ({ id }, { query }) => {
|
|
74
|
+
* const todo = query(tables.todos.select().where({ id }).first())
|
|
75
|
+
* return tables.todos.update({ completed: !todo?.completed }).where({ id })
|
|
76
|
+
* },
|
|
77
|
+
* })
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export const materializers = (_eventDefRecord, handlers) => {
|
|
81
|
+
return handlers;
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=materializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.js","sourceRoot":"","sources":["../../../src/schema/EventDef/materializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA6EH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,SAAoB,EACpB,YAAqC,EACZ,EAAE;IAC3B,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,eAA6B,EAC7B,QAOC,EACD,EAAE;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/schema/EventDef/mod.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/schema/EventDef/mod.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|