@livestore/common 0.3.0-dev.9 → 0.3.1-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/fixture.d.ts +83 -221
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +33 -11
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +120 -64
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +39 -8
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/debug-info.d.ts +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +1 -0
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +390 -0
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-client-session.js +97 -0
- package/dist/devtools/devtools-messages-client-session.js.map +1 -0
- package/dist/devtools/devtools-messages-common.d.ts +68 -0
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-common.js +60 -0
- package/dist/devtools/devtools-messages-common.js.map +1 -0
- package/dist/devtools/devtools-messages-leader.d.ts +394 -0
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
- package/dist/devtools/devtools-messages-leader.js +147 -0
- package/dist/devtools/devtools-messages-leader.js.map +1 -0
- package/dist/devtools/devtools-messages.d.ts +3 -580
- package/dist/devtools/devtools-messages.d.ts.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -174
- package/dist/devtools/devtools-messages.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +32 -0
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
- package/dist/devtools/devtools-sessioninfo.js +36 -0
- package/dist/devtools/devtools-sessioninfo.js.map +1 -0
- package/dist/devtools/mod.d.ts +55 -0
- package/dist/devtools/mod.d.ts.map +1 -0
- package/dist/devtools/mod.js +33 -0
- package/dist/devtools/mod.js.map +1 -0
- package/dist/index.d.ts +7 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -9
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +36 -11
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +426 -252
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +34 -6
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +22 -7
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +27 -0
- package/dist/leader-thread/eventlog.d.ts.map +1 -0
- package/dist/leader-thread/eventlog.js +119 -0
- package/dist/leader-thread/eventlog.js.map +1 -0
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +155 -80
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +22 -9
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +67 -45
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +16 -0
- package/dist/leader-thread/materialize-event.d.ts.map +1 -0
- package/dist/leader-thread/materialize-event.js +109 -0
- package/dist/leader-thread/materialize-event.js.map +1 -0
- package/dist/leader-thread/mod.d.ts +1 -1
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -1
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +4 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +28 -32
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -5
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -4
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/types.d.ts +79 -38
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +1 -3
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/make-client-session.d.ts +23 -0
- package/dist/make-client-session.d.ts.map +1 -0
- package/dist/make-client-session.js +57 -0
- package/dist/make-client-session.js.map +1 -0
- package/dist/materializer-helper.d.ts +23 -0
- package/dist/materializer-helper.d.ts.map +1 -0
- package/dist/materializer-helper.js +86 -0
- package/dist/materializer-helper.js.map +1 -0
- package/dist/otel.d.ts +2 -0
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +14 -0
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -0
- package/dist/rematerialize-from-eventlog.js +64 -0
- package/dist/rematerialize-from-eventlog.js.map +1 -0
- package/dist/schema/EventDef.d.ts +146 -0
- package/dist/schema/EventDef.d.ts.map +1 -0
- package/dist/schema/EventDef.js +58 -0
- package/dist/schema/EventDef.js.map +1 -0
- package/dist/schema/EventSequenceNumber.d.ts +57 -0
- package/dist/schema/EventSequenceNumber.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.js +82 -0
- package/dist/schema/EventSequenceNumber.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.d.ts +2 -0
- package/dist/schema/EventSequenceNumber.test.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +11 -0
- package/dist/schema/EventSequenceNumber.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent.d.ts +257 -0
- package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent.js +117 -0
- package/dist/schema/LiveStoreEvent.js.map +1 -0
- package/dist/schema/events.d.ts +2 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +2 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/schema/mod.d.ts +8 -6
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +8 -6
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +50 -32
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +36 -43
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/mod.d.ts +3 -0
- package/dist/schema/state/mod.d.ts.map +1 -0
- package/dist/schema/state/mod.js +3 -0
- package/dist/schema/state/mod.js.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts +223 -0
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.js +170 -0
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.test.d.ts +2 -0
- package/dist/schema/state/sqlite/client-document-def.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/client-document-def.test.js +201 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +69 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +71 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.js +12 -0
- package/dist/schema/state/sqlite/db-schema/ast/validate.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +90 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +87 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +29 -0
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +90 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +41 -0
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/hash.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/hash.js +14 -0
- package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.js +3 -0
- package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -0
- package/dist/schema/state/sqlite/mod.d.ts +17 -0
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/mod.js +41 -0
- package/dist/schema/state/sqlite/mod.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +294 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.js +6 -0
- package/dist/schema/state/sqlite/query-builder/api.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.js +190 -0
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.js +286 -0
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +87 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js +563 -0
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -0
- package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.d.ts +7 -0
- package/dist/schema/state/sqlite/query-builder/mod.d.ts.map +1 -0
- package/dist/{query-builder → schema/state/sqlite/query-builder}/mod.js +7 -0
- package/dist/schema/state/sqlite/query-builder/mod.js.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -0
- package/dist/schema/{schema-helpers.js → state/sqlite/schema-helpers.js} +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables.d.ts +574 -0
- package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables.js +88 -0
- package/dist/schema/state/sqlite/system-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +84 -0
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -0
- package/dist/schema/state/sqlite/table-def.js +36 -0
- package/dist/schema/state/sqlite/table-def.js.map +1 -0
- package/dist/schema-management/common.d.ts +7 -7
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +6 -6
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +27 -18
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +8 -0
- package/dist/schema-management/validate-schema.d.ts.map +1 -0
- package/dist/schema-management/validate-schema.js +39 -0
- package/dist/schema-management/validate-schema.js.map +1 -0
- package/dist/sql-queries/misc.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sql-queries/types.d.ts +2 -1
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +40 -19
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +149 -73
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +38 -35
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +21 -21
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +11 -11
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +9 -7
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +10 -5
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts +0 -2
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +16 -14
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +10 -8
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +18 -10
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +39 -34
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +77 -77
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +35 -25
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
- package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +83 -38
- package/dist/sync/next/test/event-fixtures.js.map +1 -0
- package/dist/sync/next/test/mod.d.ts +1 -1
- package/dist/sync/next/test/mod.d.ts.map +1 -1
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/next/test/mod.js.map +1 -1
- package/dist/sync/sync.d.ts +46 -21
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +10 -6
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +193 -84
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +305 -151
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +267 -303
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +4 -4
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/util.d.ts +2 -2
- package/dist/util.d.ts.map +1 -1
- package/dist/version.d.ts +3 -3
- package/dist/version.js +3 -3
- package/package.json +11 -4
- package/src/__tests__/fixture.ts +36 -15
- package/src/adapter-types.ts +107 -68
- package/src/debug-info.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +142 -0
- package/src/devtools/devtools-messages-common.ts +115 -0
- package/src/devtools/devtools-messages-leader.ts +191 -0
- package/src/devtools/devtools-messages.ts +3 -246
- package/src/devtools/devtools-sessioninfo.ts +101 -0
- package/src/devtools/mod.ts +59 -0
- package/src/index.ts +7 -9
- package/src/leader-thread/LeaderSyncProcessor.ts +664 -394
- package/src/leader-thread/connection.ts +54 -9
- package/src/leader-thread/eventlog.ts +199 -0
- package/src/leader-thread/leader-worker-devtools.ts +227 -104
- package/src/leader-thread/make-leader-thread-layer.ts +121 -72
- package/src/leader-thread/materialize-event.ts +173 -0
- package/src/leader-thread/mod.ts +1 -1
- package/src/leader-thread/recreate-db.ts +33 -38
- package/src/leader-thread/shutdown-channel.ts +2 -4
- package/src/leader-thread/types.ts +84 -46
- package/src/make-client-session.ts +136 -0
- package/src/materializer-helper.ts +138 -0
- package/src/otel.ts +8 -0
- package/src/rematerialize-from-eventlog.ts +117 -0
- package/src/schema/EventDef.ts +227 -0
- package/src/schema/EventSequenceNumber.test.ts +12 -0
- package/src/schema/EventSequenceNumber.ts +121 -0
- package/src/schema/LiveStoreEvent.ts +240 -0
- package/src/schema/events.ts +1 -0
- package/src/schema/mod.ts +8 -6
- package/src/schema/schema.ts +88 -84
- package/src/schema/state/mod.ts +2 -0
- package/src/schema/state/sqlite/client-document-def.test.ts +238 -0
- package/src/schema/state/sqlite/client-document-def.ts +444 -0
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +142 -0
- package/src/schema/state/sqlite/db-schema/ast/validate.ts +13 -0
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -0
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +242 -0
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +222 -0
- package/src/schema/state/sqlite/db-schema/hash.ts +14 -0
- package/src/schema/state/sqlite/db-schema/mod.ts +2 -0
- package/src/schema/state/sqlite/mod.ts +73 -0
- package/src/schema/state/sqlite/query-builder/api.ts +440 -0
- package/src/schema/state/sqlite/query-builder/astToSql.ts +232 -0
- package/src/schema/state/sqlite/query-builder/impl.test.ts +617 -0
- package/src/schema/state/sqlite/query-builder/impl.ts +351 -0
- package/src/{query-builder → schema/state/sqlite/query-builder}/mod.ts +7 -0
- package/src/schema/{schema-helpers.ts → state/sqlite/schema-helpers.ts} +1 -1
- package/src/schema/state/sqlite/system-tables.ts +117 -0
- package/src/schema/state/sqlite/table-def.ts +197 -0
- package/src/schema-management/common.ts +7 -7
- package/src/schema-management/migrations.ts +37 -31
- package/src/schema-management/validate-schema.ts +61 -0
- package/src/sql-queries/sql-queries.ts +1 -1
- package/src/sql-queries/sql-query-builder.ts +1 -2
- package/src/sql-queries/types.ts +3 -1
- package/src/sync/ClientSessionSyncProcessor.ts +218 -94
- package/src/sync/next/compact-events.ts +38 -35
- package/src/sync/next/facts.ts +43 -41
- package/src/sync/next/history-dag-common.ts +17 -10
- package/src/sync/next/history-dag.ts +16 -17
- package/src/sync/next/rebase-events.ts +29 -17
- package/src/sync/next/test/compact-events.calculator.test.ts +46 -46
- package/src/sync/next/test/compact-events.test.ts +79 -79
- package/src/sync/next/test/event-fixtures.ts +228 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +46 -21
- package/src/sync/syncstate.test.ts +312 -345
- package/src/sync/syncstate.ts +414 -224
- package/src/sync/validate-push-payload.ts +6 -6
- package/src/version.ts +3 -3
- package/dist/derived-mutations.d.ts +0 -109
- package/dist/derived-mutations.d.ts.map +0 -1
- package/dist/derived-mutations.js +0 -54
- package/dist/derived-mutations.js.map +0 -1
- package/dist/derived-mutations.test.d.ts +0 -2
- package/dist/derived-mutations.test.d.ts.map +0 -1
- package/dist/derived-mutations.test.js +0 -93
- package/dist/derived-mutations.test.js.map +0 -1
- package/dist/devtools/devtools-bridge.d.ts +0 -13
- package/dist/devtools/devtools-bridge.d.ts.map +0 -1
- package/dist/devtools/devtools-bridge.js +0 -2
- package/dist/devtools/devtools-bridge.js.map +0 -1
- package/dist/devtools/devtools-window-message.d.ts +0 -29
- package/dist/devtools/devtools-window-message.d.ts.map +0 -1
- package/dist/devtools/devtools-window-message.js +0 -33
- package/dist/devtools/devtools-window-message.js.map +0 -1
- package/dist/devtools/index.d.ts +0 -42
- package/dist/devtools/index.d.ts.map +0 -1
- package/dist/devtools/index.js +0 -48
- package/dist/devtools/index.js.map +0 -1
- package/dist/init-singleton-tables.d.ts +0 -4
- package/dist/init-singleton-tables.d.ts.map +0 -1
- package/dist/init-singleton-tables.js +0 -16
- package/dist/init-singleton-tables.js.map +0 -1
- package/dist/leader-thread/apply-mutation.d.ts +0 -11
- package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
- package/dist/leader-thread/apply-mutation.js +0 -107
- package/dist/leader-thread/apply-mutation.js.map +0 -1
- package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
- package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
- package/dist/leader-thread/leader-sync-processor.js +0 -430
- package/dist/leader-thread/leader-sync-processor.js.map +0 -1
- package/dist/leader-thread/mutationlog.d.ts +0 -10
- package/dist/leader-thread/mutationlog.d.ts.map +0 -1
- package/dist/leader-thread/mutationlog.js +0 -28
- package/dist/leader-thread/mutationlog.js.map +0 -1
- package/dist/leader-thread/pull-queue-set.d.ts +0 -7
- package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
- package/dist/leader-thread/pull-queue-set.js +0 -39
- package/dist/leader-thread/pull-queue-set.js.map +0 -1
- package/dist/mutation.d.ts +0 -20
- package/dist/mutation.d.ts.map +0 -1
- package/dist/mutation.js +0 -57
- package/dist/mutation.js.map +0 -1
- package/dist/query-builder/api.d.ts +0 -190
- package/dist/query-builder/api.d.ts.map +0 -1
- package/dist/query-builder/api.js +0 -8
- package/dist/query-builder/api.js.map +0 -1
- package/dist/query-builder/impl.d.ts +0 -12
- package/dist/query-builder/impl.d.ts.map +0 -1
- package/dist/query-builder/impl.js +0 -244
- package/dist/query-builder/impl.js.map +0 -1
- package/dist/query-builder/impl.test.d.ts +0 -2
- package/dist/query-builder/impl.test.d.ts.map +0 -1
- package/dist/query-builder/impl.test.js +0 -212
- package/dist/query-builder/impl.test.js.map +0 -1
- package/dist/query-builder/mod.d.ts.map +0 -1
- package/dist/query-builder/mod.js.map +0 -1
- package/dist/query-info.d.ts +0 -38
- package/dist/query-info.d.ts.map +0 -1
- package/dist/query-info.js +0 -7
- package/dist/query-info.js.map +0 -1
- package/dist/rehydrate-from-mutationlog.d.ts +0 -14
- package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
- package/dist/rehydrate-from-mutationlog.js +0 -66
- package/dist/rehydrate-from-mutationlog.js.map +0 -1
- package/dist/schema/EventId.d.ts +0 -39
- package/dist/schema/EventId.d.ts.map +0 -1
- package/dist/schema/EventId.js +0 -38
- package/dist/schema/EventId.js.map +0 -1
- package/dist/schema/EventId.test.d.ts +0 -2
- package/dist/schema/EventId.test.d.ts.map +0 -1
- package/dist/schema/EventId.test.js +0 -11
- package/dist/schema/EventId.test.js.map +0 -1
- package/dist/schema/MutationEvent.d.ts +0 -167
- package/dist/schema/MutationEvent.d.ts.map +0 -1
- package/dist/schema/MutationEvent.js +0 -72
- package/dist/schema/MutationEvent.js.map +0 -1
- package/dist/schema/MutationEvent.test.d.ts +0 -2
- package/dist/schema/MutationEvent.test.d.ts.map +0 -1
- package/dist/schema/MutationEvent.test.js +0 -2
- package/dist/schema/MutationEvent.test.js.map +0 -1
- package/dist/schema/mutations.d.ts +0 -107
- package/dist/schema/mutations.d.ts.map +0 -1
- package/dist/schema/mutations.js +0 -42
- package/dist/schema/mutations.js.map +0 -1
- package/dist/schema/schema-helpers.d.ts.map +0 -1
- package/dist/schema/schema-helpers.js.map +0 -1
- package/dist/schema/system-tables.d.ts +0 -399
- package/dist/schema/system-tables.d.ts.map +0 -1
- package/dist/schema/system-tables.js +0 -59
- package/dist/schema/system-tables.js.map +0 -1
- package/dist/schema/table-def.d.ts +0 -156
- package/dist/schema/table-def.d.ts.map +0 -1
- package/dist/schema/table-def.js +0 -79
- package/dist/schema/table-def.js.map +0 -1
- package/dist/schema-management/validate-mutation-defs.d.ts +0 -8
- package/dist/schema-management/validate-mutation-defs.d.ts.map +0 -1
- package/dist/schema-management/validate-mutation-defs.js +0 -39
- package/dist/schema-management/validate-mutation-defs.js.map +0 -1
- package/dist/sync/client-session-sync-processor.d.ts +0 -45
- package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
- package/dist/sync/client-session-sync-processor.js +0 -131
- package/dist/sync/client-session-sync-processor.js.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
- package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
- package/src/derived-mutations.test.ts +0 -101
- package/src/derived-mutations.ts +0 -170
- package/src/devtools/devtools-bridge.ts +0 -14
- package/src/devtools/devtools-window-message.ts +0 -27
- package/src/devtools/index.ts +0 -48
- package/src/init-singleton-tables.ts +0 -24
- package/src/leader-thread/apply-mutation.ts +0 -161
- package/src/leader-thread/mutationlog.ts +0 -46
- package/src/leader-thread/pull-queue-set.ts +0 -58
- package/src/mutation.ts +0 -91
- package/src/query-builder/api.ts +0 -289
- package/src/query-builder/impl.test.ts +0 -239
- package/src/query-builder/impl.ts +0 -285
- package/src/query-info.ts +0 -78
- package/src/rehydrate-from-mutationlog.ts +0 -119
- package/src/schema/EventId.test.ts +0 -12
- package/src/schema/EventId.ts +0 -60
- package/src/schema/MutationEvent.ts +0 -185
- package/src/schema/mutations.ts +0 -192
- package/src/schema/system-tables.ts +0 -105
- package/src/schema/table-def.ts +0 -343
- package/src/schema-management/validate-mutation-defs.ts +0 -63
- package/src/sync/next/test/mutation-fixtures.ts +0 -224
- package/tsconfig.json +0 -11
- /package/dist/schema/{schema-helpers.d.ts → state/sqlite/schema-helpers.d.ts} +0 -0
package/src/schema/table-def.ts
DELETED
@@ -1,343 +0,0 @@
|
|
1
|
-
import type { Nullable, PrettifyFlat } from '@livestore/db-schema'
|
2
|
-
import { SqliteDsl } from '@livestore/db-schema'
|
3
|
-
import { shouldNeverHappen } from '@livestore/utils'
|
4
|
-
import { ReadonlyRecord, Schema } from '@livestore/utils/effect'
|
5
|
-
|
6
|
-
import type { DerivedMutationHelperFns } from '../derived-mutations.js'
|
7
|
-
import { makeDerivedMutationDefsForTable } from '../derived-mutations.js'
|
8
|
-
import type { QueryBuilder } from '../query-builder/mod.js'
|
9
|
-
import { makeQueryBuilder } from '../query-builder/mod.js'
|
10
|
-
|
11
|
-
export const { blob, boolean, column, datetime, integer, isColumnDefinition, json, real, text } = SqliteDsl
|
12
|
-
|
13
|
-
export { SqliteDsl } from '@livestore/db-schema'
|
14
|
-
|
15
|
-
export type StateType = 'singleton' | 'dynamic'
|
16
|
-
|
17
|
-
export type DefaultSqliteTableDef = SqliteDsl.TableDefinition<string, SqliteDsl.Columns>
|
18
|
-
export type DefaultSqliteTableDefConstrained = SqliteDsl.TableDefinition<string, SqliteDsl.ConstraintColumns>
|
19
|
-
|
20
|
-
export type TableDefBase<
|
21
|
-
TSqliteDef extends DefaultSqliteTableDef = DefaultSqliteTableDefConstrained,
|
22
|
-
TOptions extends TableOptions = TableOptions,
|
23
|
-
TSchema = SqliteDsl.StructSchemaForColumns<TSqliteDef['columns']>,
|
24
|
-
> = {
|
25
|
-
sqliteDef: TSqliteDef
|
26
|
-
options: TOptions
|
27
|
-
// Derived from `sqliteDef`, so only exposed for convenience
|
28
|
-
schema: TSchema
|
29
|
-
}
|
30
|
-
|
31
|
-
export type TableDef<
|
32
|
-
TSqliteDef extends DefaultSqliteTableDef = DefaultSqliteTableDefConstrained,
|
33
|
-
TOptions extends TableOptions = TableOptions,
|
34
|
-
// NOTE we're not using `SqliteDsl.StructSchemaForColumns<TSqliteDef['columns']>`
|
35
|
-
// as we don't want the alias type for users to show up, so we're redefining it here
|
36
|
-
TSchema = Schema.Schema<
|
37
|
-
SqliteDsl.AnyIfConstained<
|
38
|
-
TSqliteDef['columns'],
|
39
|
-
{ readonly [K in keyof TSqliteDef['columns']]: TSqliteDef['columns'][K]['schema']['Type'] }
|
40
|
-
>,
|
41
|
-
SqliteDsl.AnyIfConstained<
|
42
|
-
TSqliteDef['columns'],
|
43
|
-
{ readonly [K in keyof TSqliteDef['columns']]: TSqliteDef['columns'][K]['schema']['Encoded'] }
|
44
|
-
>
|
45
|
-
>,
|
46
|
-
> = {
|
47
|
-
sqliteDef: TSqliteDef
|
48
|
-
options: TOptions
|
49
|
-
// Derived from `sqliteDef`, so only exposed for convenience
|
50
|
-
schema: TSchema
|
51
|
-
query: QueryBuilder<ReadonlyArray<Schema.Schema.Type<TSchema>>, TableDef<TSqliteDef & {}, TOptions>>
|
52
|
-
} & (TOptions['deriveMutations']['enabled'] extends true
|
53
|
-
? DerivedMutationHelperFns<TSqliteDef['columns'], TOptions>
|
54
|
-
: {})
|
55
|
-
|
56
|
-
export type TableOptionsInput = Partial<{
|
57
|
-
indexes: SqliteDsl.Index[]
|
58
|
-
disableAutomaticIdColumn: boolean
|
59
|
-
isSingleton: boolean
|
60
|
-
deriveMutations:
|
61
|
-
| boolean
|
62
|
-
| {
|
63
|
-
enabled: true
|
64
|
-
localOnly?: boolean
|
65
|
-
}
|
66
|
-
}>
|
67
|
-
|
68
|
-
type ToColumns<TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>> =
|
69
|
-
TColumns extends SqliteDsl.Columns
|
70
|
-
? TColumns
|
71
|
-
: TColumns extends SqliteDsl.ColumnDefinition<any, any>
|
72
|
-
? { value: TColumns }
|
73
|
-
: never
|
74
|
-
|
75
|
-
type ValidateTableOptionsInput<
|
76
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
77
|
-
TOptionsInput extends TableOptionsInput,
|
78
|
-
TPassthroughIfValid,
|
79
|
-
> =
|
80
|
-
SqliteDsl.FromColumns.RequiresInsertValues<ToColumns<TColumns>> extends true
|
81
|
-
? TOptionsInput['isSingleton'] extends true
|
82
|
-
? 'Error: To use `isSingleton: true` with this table, each column must have a default value or be nullable'
|
83
|
-
: TPassthroughIfValid
|
84
|
-
: TPassthroughIfValid
|
85
|
-
|
86
|
-
export type TableOptions = {
|
87
|
-
/**
|
88
|
-
* Setting this to true will have the following consequences:
|
89
|
-
* - An `id` column will be added with `primaryKey: true` and `"singleton"` as default value and only allowed value
|
90
|
-
* - LiveStore will automatically create the singleton row when booting up
|
91
|
-
* - LiveStore will fail if there is already a column defined with `primaryKey: true`
|
92
|
-
*
|
93
|
-
* @default false
|
94
|
-
*/
|
95
|
-
readonly isSingleton: boolean
|
96
|
-
|
97
|
-
readonly disableAutomaticIdColumn: boolean
|
98
|
-
|
99
|
-
/**
|
100
|
-
* Setting this to true will automatically derive insert, update and delete mutations for this table. Example:
|
101
|
-
*
|
102
|
-
* ```ts
|
103
|
-
* const todos = table('todos', { ... }, { deriveMutations: true })
|
104
|
-
* todos.insert({ id: '1', text: 'Hello' })
|
105
|
-
* ```
|
106
|
-
*
|
107
|
-
* This is also a prerequisite for using the `useRow`, `useAtom` and `rowQuery` APIs.
|
108
|
-
*
|
109
|
-
* Important: When using this option, make sure you're following the "Rules of mutations" for the table schema.
|
110
|
-
*/
|
111
|
-
readonly deriveMutations:
|
112
|
-
| { enabled: false }
|
113
|
-
| {
|
114
|
-
enabled: true
|
115
|
-
/**
|
116
|
-
* When set to true, the mutations won't be synced over the network
|
117
|
-
*/
|
118
|
-
localOnly: boolean
|
119
|
-
}
|
120
|
-
|
121
|
-
/** Derived based on whether the table definition has one or more columns (besides the `id` column) */
|
122
|
-
readonly isSingleColumn: boolean
|
123
|
-
|
124
|
-
/**
|
125
|
-
* Derived based on whether the table definition has one or more columns (besides the `id` column) that require
|
126
|
-
* insert values (i.e. are not nullable and don't have a default value)
|
127
|
-
*
|
128
|
-
* `isSingleton` tables always imply `requiresInsertValues: false`
|
129
|
-
*/
|
130
|
-
readonly requiredInsertColumnNames: string
|
131
|
-
}
|
132
|
-
|
133
|
-
export const table = <
|
134
|
-
TName extends string,
|
135
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
136
|
-
TOptionsInput extends TableOptionsInput = TableOptionsInput,
|
137
|
-
>(
|
138
|
-
name: TName,
|
139
|
-
columnOrColumns: TColumns,
|
140
|
-
options?: TOptionsInput,
|
141
|
-
): ValidateTableOptionsInput<
|
142
|
-
TColumns,
|
143
|
-
TOptionsInput,
|
144
|
-
TableDef<
|
145
|
-
SqliteTableDefForInput<TName, TColumns, WithDefaults<TOptionsInput, TColumns>>,
|
146
|
-
WithDefaults<TOptionsInput, TColumns>
|
147
|
-
>
|
148
|
-
> => {
|
149
|
-
const tablePath = name
|
150
|
-
|
151
|
-
const options_: TableOptions = {
|
152
|
-
isSingleton: options?.isSingleton ?? false,
|
153
|
-
disableAutomaticIdColumn: options?.disableAutomaticIdColumn ?? false,
|
154
|
-
deriveMutations:
|
155
|
-
options?.deriveMutations === true
|
156
|
-
? { enabled: true as const, localOnly: false }
|
157
|
-
: options?.deriveMutations === false
|
158
|
-
? { enabled: false as const }
|
159
|
-
: options?.deriveMutations === undefined
|
160
|
-
? { enabled: false as const }
|
161
|
-
: { enabled: true as const, localOnly: options.deriveMutations.localOnly ?? false },
|
162
|
-
isSingleColumn: SqliteDsl.isColumnDefinition(columnOrColumns) === true,
|
163
|
-
requiredInsertColumnNames: 'type-level-only',
|
164
|
-
}
|
165
|
-
|
166
|
-
const columns = (
|
167
|
-
SqliteDsl.isColumnDefinition(columnOrColumns) ? { value: columnOrColumns } : columnOrColumns
|
168
|
-
) as SqliteDsl.Columns
|
169
|
-
|
170
|
-
if (options_.disableAutomaticIdColumn === true) {
|
171
|
-
if (columns.id === undefined && options_.isSingleton === true) {
|
172
|
-
shouldNeverHappen(
|
173
|
-
`Cannot create table ${name} with "isSingleton: true" because there is no column with name "id" and "disableAutomaticIdColumn: true" is set`,
|
174
|
-
)
|
175
|
-
}
|
176
|
-
} else if (columns.id === undefined && ReadonlyRecord.some(columns, (_) => _.primaryKey === true) === false) {
|
177
|
-
if (options_.isSingleton) {
|
178
|
-
columns.id = SqliteDsl.text({ schema: Schema.Literal('singleton'), primaryKey: true, default: 'singleton' })
|
179
|
-
} else {
|
180
|
-
columns.id = SqliteDsl.text({ primaryKey: true })
|
181
|
-
}
|
182
|
-
}
|
183
|
-
|
184
|
-
const sqliteDef = SqliteDsl.table(tablePath, columns, options?.indexes ?? [])
|
185
|
-
|
186
|
-
// TODO also enforce this on the type level
|
187
|
-
if (options_.isSingleton) {
|
188
|
-
for (const column of sqliteDef.ast.columns) {
|
189
|
-
if (column.nullable === false && column.default._tag === 'None') {
|
190
|
-
shouldNeverHappen(
|
191
|
-
`When creating a singleton table, each column must be either nullable or have a default value. Column '${column.name}' is neither.`,
|
192
|
-
)
|
193
|
-
}
|
194
|
-
}
|
195
|
-
}
|
196
|
-
|
197
|
-
const isSingleColumn = SqliteDsl.isColumnDefinition(columnOrColumns) === true
|
198
|
-
|
199
|
-
const schema = SqliteDsl.structSchemaForTable(sqliteDef)
|
200
|
-
const tableDef = { sqliteDef, options: options_, schema } satisfies TableDefBase
|
201
|
-
const query = makeQueryBuilder(tableDef)
|
202
|
-
// const tableDef = { ...tableDefBase, query } satisfies TableDef
|
203
|
-
|
204
|
-
// NOTE we're currently patching the existing tableDef object
|
205
|
-
// as it's being used as part of the query builder API
|
206
|
-
// @ts-expect-error TODO properly implement this
|
207
|
-
tableDef.query = query
|
208
|
-
|
209
|
-
if (tableHasDerivedMutations(tableDef)) {
|
210
|
-
const derivedMutationDefs = makeDerivedMutationDefsForTable(tableDef)
|
211
|
-
|
212
|
-
tableDef.insert = (valuesOrValue: any) => {
|
213
|
-
if (isSingleColumn && options_.isSingleton) {
|
214
|
-
return derivedMutationDefs.insert({ id: 'singleton', value: { value: valuesOrValue } })
|
215
|
-
} else {
|
216
|
-
return derivedMutationDefs.insert(valuesOrValue as any)
|
217
|
-
}
|
218
|
-
}
|
219
|
-
|
220
|
-
tableDef.update = (argsOrValues: any) => {
|
221
|
-
if (isSingleColumn && options_.isSingleton) {
|
222
|
-
return derivedMutationDefs.update({ where: { id: 'singleton' }, values: { value: argsOrValues } as any })
|
223
|
-
} else {
|
224
|
-
return derivedMutationDefs.update(argsOrValues as any)
|
225
|
-
}
|
226
|
-
}
|
227
|
-
|
228
|
-
tableDef.delete = (args: any) => derivedMutationDefs.delete(args)
|
229
|
-
}
|
230
|
-
|
231
|
-
return tableDef as any
|
232
|
-
}
|
233
|
-
|
234
|
-
export const tableHasDerivedMutations = <TTableDef extends TableDefBase>(
|
235
|
-
tableDef: TTableDef,
|
236
|
-
): tableDef is TTableDef & {
|
237
|
-
options: { deriveMutations: { enabled: true; localOnly: boolean } }
|
238
|
-
} & DerivedMutationHelperFns<TTableDef['sqliteDef']['columns'], TTableDef['options']> =>
|
239
|
-
tableDef.options.deriveMutations.enabled === true
|
240
|
-
|
241
|
-
export const tableIsSingleton = <TTableDef extends TableDefBase>(
|
242
|
-
tableDef: TTableDef,
|
243
|
-
): tableDef is TTableDef & { options: { isSingleton: true } } => tableDef.options.isSingleton === true
|
244
|
-
|
245
|
-
type SqliteTableDefForInput<
|
246
|
-
TName extends string,
|
247
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
248
|
-
TOptions extends TableOptions,
|
249
|
-
> = SqliteDsl.TableDefinition<TName, PrettifyFlat<WithId<ToColumns<TColumns>, TOptions>>>
|
250
|
-
|
251
|
-
type WithId<TColumns extends SqliteDsl.Columns, TOptions extends TableOptions> = TColumns &
|
252
|
-
('id' extends keyof TColumns
|
253
|
-
? {}
|
254
|
-
: TOptions['disableAutomaticIdColumn'] extends true
|
255
|
-
? {}
|
256
|
-
: TOptions['isSingleton'] extends true
|
257
|
-
? {
|
258
|
-
id: SqliteDsl.ColumnDefinition<'singleton', 'singleton'>
|
259
|
-
}
|
260
|
-
: {
|
261
|
-
id: SqliteDsl.ColumnDefinition<string, string>
|
262
|
-
})
|
263
|
-
|
264
|
-
type WithDefaults<
|
265
|
-
TOptionsInput extends TableOptionsInput,
|
266
|
-
TColumns extends SqliteDsl.Columns | SqliteDsl.ColumnDefinition<any, any>,
|
267
|
-
> = {
|
268
|
-
isSingleton: TOptionsInput['isSingleton'] extends true ? true : false
|
269
|
-
disableAutomaticIdColumn: TOptionsInput['disableAutomaticIdColumn'] extends true ? true : false
|
270
|
-
deriveMutations: TOptionsInput['deriveMutations'] extends true
|
271
|
-
? { enabled: true; localOnly: boolean }
|
272
|
-
: TOptionsInput['deriveMutations'] extends false
|
273
|
-
? { enabled: false }
|
274
|
-
: TOptionsInput['deriveMutations'] extends { enabled: true; localOnly?: boolean }
|
275
|
-
? {
|
276
|
-
enabled: true
|
277
|
-
localOnly: TOptionsInput['deriveMutations']['localOnly'] extends true ? true : false
|
278
|
-
}
|
279
|
-
: never
|
280
|
-
isSingleColumn: SqliteDsl.IsSingleColumn<TColumns>
|
281
|
-
requiredInsertColumnNames: SqliteDsl.FromColumns.RequiredInsertColumnNames<ToColumns<TColumns>>
|
282
|
-
}
|
283
|
-
|
284
|
-
export namespace FromTable {
|
285
|
-
// TODO this sometimes doesn't preserve the order of columns
|
286
|
-
export type RowDecoded<TTableDef extends TableDefBase> = PrettifyFlat<
|
287
|
-
Nullable<Pick<RowDecodedAll<TTableDef>, NullableColumnNames<TTableDef>>> &
|
288
|
-
Omit<RowDecodedAll<TTableDef>, NullableColumnNames<TTableDef>>
|
289
|
-
>
|
290
|
-
|
291
|
-
export type NullableColumnNames<TTableDef extends TableDefBase> = FromColumns.NullableColumnNames<
|
292
|
-
TTableDef['sqliteDef']['columns']
|
293
|
-
>
|
294
|
-
|
295
|
-
export type Columns<TTableDef extends TableDefBase> = {
|
296
|
-
[K in keyof TTableDef['sqliteDef']['columns']]: TTableDef['sqliteDef']['columns'][K]['columnType']
|
297
|
-
}
|
298
|
-
|
299
|
-
export type RowEncodeNonNullable<TTableDef extends TableDefBase> = {
|
300
|
-
[K in keyof TTableDef['sqliteDef']['columns']]: Schema.Schema.Encoded<
|
301
|
-
TTableDef['sqliteDef']['columns'][K]['schema']
|
302
|
-
>
|
303
|
-
}
|
304
|
-
|
305
|
-
export type RowEncoded<TTableDef extends TableDefBase> = PrettifyFlat<
|
306
|
-
Nullable<Pick<RowEncodeNonNullable<TTableDef>, NullableColumnNames<TTableDef>>> &
|
307
|
-
Omit<RowEncodeNonNullable<TTableDef>, NullableColumnNames<TTableDef>>
|
308
|
-
>
|
309
|
-
|
310
|
-
export type RowDecodedAll<TTableDef extends TableDefBase> = {
|
311
|
-
[K in keyof TTableDef['sqliteDef']['columns']]: Schema.Schema.Type<TTableDef['sqliteDef']['columns'][K]['schema']>
|
312
|
-
}
|
313
|
-
}
|
314
|
-
|
315
|
-
export namespace FromColumns {
|
316
|
-
// TODO this sometimes doesn't preserve the order of columns
|
317
|
-
export type RowDecoded<TColumns extends SqliteDsl.Columns> = PrettifyFlat<
|
318
|
-
Nullable<Pick<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>> &
|
319
|
-
Omit<RowDecodedAll<TColumns>, NullableColumnNames<TColumns>>
|
320
|
-
>
|
321
|
-
|
322
|
-
export type RowDecodedAll<TColumns extends SqliteDsl.Columns> = {
|
323
|
-
[K in keyof TColumns]: Schema.Schema.Type<TColumns[K]['schema']>
|
324
|
-
}
|
325
|
-
|
326
|
-
export type RowEncoded<TColumns extends SqliteDsl.Columns> = PrettifyFlat<
|
327
|
-
Nullable<Pick<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>> &
|
328
|
-
Omit<RowEncodeNonNullable<TColumns>, NullableColumnNames<TColumns>>
|
329
|
-
>
|
330
|
-
|
331
|
-
export type RowEncodeNonNullable<TColumns extends SqliteDsl.Columns> = {
|
332
|
-
[K in keyof TColumns]: Schema.Schema.Encoded<TColumns[K]['schema']>
|
333
|
-
}
|
334
|
-
|
335
|
-
export type NullableColumnNames<TColumns extends SqliteDsl.Columns> = keyof {
|
336
|
-
[K in keyof TColumns as TColumns[K]['default'] extends true ? K : never]: {}
|
337
|
-
}
|
338
|
-
|
339
|
-
export type RequiredInsertColumnNames<TColumns extends SqliteDsl.Columns> =
|
340
|
-
SqliteDsl.FromColumns.RequiredInsertColumnNames<TColumns>
|
341
|
-
|
342
|
-
export type InsertRowDecoded<TColumns extends SqliteDsl.Columns> = SqliteDsl.FromColumns.InsertRowDecoded<TColumns>
|
343
|
-
}
|
@@ -1,63 +0,0 @@
|
|
1
|
-
import { Effect, Schema } from '@livestore/utils/effect'
|
2
|
-
|
3
|
-
import { UnexpectedError } from '../adapter-types.js'
|
4
|
-
import type { LiveStoreSchema } from '../schema/mod.js'
|
5
|
-
import type { MutationDef } from '../schema/mutations.js'
|
6
|
-
import type { MutationDefInfo, SchemaManager } from './common.js'
|
7
|
-
|
8
|
-
export const validateSchema = (schema: LiveStoreSchema, schemaManager: SchemaManager) =>
|
9
|
-
Effect.gen(function* () {
|
10
|
-
// Validate mutation definitions
|
11
|
-
const registeredMutationDefInfos = schemaManager.getMutationDefInfos()
|
12
|
-
|
13
|
-
const missingMutationDefs = registeredMutationDefInfos.filter(
|
14
|
-
(registeredMutationDefInfo) => !schema.mutations.has(registeredMutationDefInfo.mutationName),
|
15
|
-
)
|
16
|
-
|
17
|
-
if (missingMutationDefs.length > 0) {
|
18
|
-
yield* new UnexpectedError({
|
19
|
-
cause: `Missing mutation definitions: ${missingMutationDefs.map((info) => info.mutationName).join(', ')}`,
|
20
|
-
})
|
21
|
-
}
|
22
|
-
|
23
|
-
for (const [, mutationDef] of schema.mutations) {
|
24
|
-
const registeredMutationDefInfo = registeredMutationDefInfos.find(
|
25
|
-
(info) => info.mutationName === mutationDef.name,
|
26
|
-
)
|
27
|
-
|
28
|
-
validateMutationDef(mutationDef, schemaManager, registeredMutationDefInfo)
|
29
|
-
}
|
30
|
-
|
31
|
-
// Validate table schemas
|
32
|
-
})
|
33
|
-
|
34
|
-
export const validateMutationDef = (
|
35
|
-
mutationDef: MutationDef.Any,
|
36
|
-
schemaManager: SchemaManager,
|
37
|
-
registeredMutationDefInfo: MutationDefInfo | undefined,
|
38
|
-
) => {
|
39
|
-
const schemaHash = Schema.hash(mutationDef.schema)
|
40
|
-
|
41
|
-
if (registeredMutationDefInfo === undefined) {
|
42
|
-
schemaManager.setMutationDefInfo({
|
43
|
-
schemaHash,
|
44
|
-
mutationName: mutationDef.name,
|
45
|
-
})
|
46
|
-
|
47
|
-
return
|
48
|
-
}
|
49
|
-
|
50
|
-
if (schemaHash === registeredMutationDefInfo.schemaHash) return
|
51
|
-
|
52
|
-
// TODO bring back some form of schema compatibility check (see https://github.com/livestorejs/livestore/issues/69)
|
53
|
-
// const newSchemaIsCompatibleWithOldSchema = Schema.isSubType(jsonSchemaDefFromMgmtStore, mutationDef.schema)
|
54
|
-
|
55
|
-
// if (!newSchemaIsCompatibleWithOldSchema) {
|
56
|
-
// shouldNeverHappen(`Schema for mutation ${mutationDef.name} has changed in an incompatible way`)
|
57
|
-
// }
|
58
|
-
|
59
|
-
schemaManager.setMutationDefInfo({
|
60
|
-
schemaHash,
|
61
|
-
mutationName: mutationDef.name,
|
62
|
-
})
|
63
|
-
}
|
@@ -1,224 +0,0 @@
|
|
1
|
-
import { Schema } from '@livestore/utils/effect'
|
2
|
-
|
3
|
-
import * as EventId from '../../../schema/EventId.js'
|
4
|
-
import type { MutationDef } from '../../../schema/mutations.js'
|
5
|
-
import { defineFacts, defineMutation } from '../../../schema/mutations.js'
|
6
|
-
import { factsSnapshotForDag, getFactsGroupForMutationArgs } from '../facts.js'
|
7
|
-
import { historyDagFromNodes } from '../history-dag.js'
|
8
|
-
import type { HistoryDagNode } from '../history-dag-common.js'
|
9
|
-
import { rootEventNode } from '../history-dag-common.js'
|
10
|
-
|
11
|
-
/** Used for conflict detection and event history compaction */
|
12
|
-
export const facts = defineFacts({
|
13
|
-
todoExists: (id: string) => `todo-exists-${id}`,
|
14
|
-
todoIsWriteable: (id: string, writeable: boolean) => [`todo-is-writeable-${id}`, writeable],
|
15
|
-
todoCompleted: (id: string, completed: boolean) => [`todo-completed-${id}`, completed],
|
16
|
-
todoTextUpdated: (id: string) => `todo-text-updated-${id}`,
|
17
|
-
inputValue: (id: string) => `input-value-${id}`,
|
18
|
-
})
|
19
|
-
|
20
|
-
export const mutations = {
|
21
|
-
createTodo: defineMutation(
|
22
|
-
'createTodo',
|
23
|
-
Schema.Struct({ id: Schema.String, text: Schema.String }),
|
24
|
-
'INSERT INTO todos (id, text) VALUES ($id, $text)',
|
25
|
-
{
|
26
|
-
facts: ({ id }) => ({
|
27
|
-
modify: {
|
28
|
-
set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoCompleted(id, false)],
|
29
|
-
},
|
30
|
-
}),
|
31
|
-
},
|
32
|
-
),
|
33
|
-
upsertTodo: defineMutation(
|
34
|
-
'upsertTodo',
|
35
|
-
Schema.Struct({ id: Schema.String, text: Schema.optional(Schema.String) }),
|
36
|
-
'INSERT INTO todos (id, text) VALUES ($id, $text) ON CONFLICT (id) DO UPDATE SET text = $text',
|
37
|
-
{
|
38
|
-
facts: ({ id }, currentFacts) =>
|
39
|
-
// TODO enable an API along the lines of `map.has(key, value)`
|
40
|
-
currentFacts.has(facts.todoExists(id)) && currentFacts.get(facts.todoIsWriteable(id, true)[0]) === false
|
41
|
-
? { require: [facts.todoExists(id), facts.todoIsWriteable(id, true)] }
|
42
|
-
: { modify: { set: [facts.todoExists(id), facts.todoIsWriteable(id, true), facts.todoTextUpdated(id)] } },
|
43
|
-
},
|
44
|
-
),
|
45
|
-
completeTodo: defineMutation(
|
46
|
-
'completeTodo',
|
47
|
-
Schema.Struct({ id: Schema.String }),
|
48
|
-
// consider `RETURNING` to validate before applying facts
|
49
|
-
'UPDATE todos SET completed = true WHERE id = $id',
|
50
|
-
{
|
51
|
-
// prewrite assertions from DB
|
52
|
-
// enables more concurrency
|
53
|
-
// turning database inside out
|
54
|
-
// similar to upsert semantics
|
55
|
-
facts: ({ id }) => ({
|
56
|
-
require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
|
57
|
-
modify: { set: [facts.todoCompleted(id, true)] },
|
58
|
-
}),
|
59
|
-
},
|
60
|
-
),
|
61
|
-
uncompleteTodo: defineMutation(
|
62
|
-
'uncompleteTodo',
|
63
|
-
Schema.Struct({ id: Schema.String }),
|
64
|
-
'UPDATE todos SET completed = false WHERE id = $id',
|
65
|
-
{
|
66
|
-
facts: ({ id }) => ({
|
67
|
-
require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
|
68
|
-
modify: { set: [facts.todoCompleted(id, false)] },
|
69
|
-
}),
|
70
|
-
},
|
71
|
-
),
|
72
|
-
completeTodos: defineMutation(
|
73
|
-
'completeTodos',
|
74
|
-
Schema.Struct({ ids: Schema.Array(Schema.String) }),
|
75
|
-
'UPDATE todos SET completed = true WHERE id IN ($ids:csv)',
|
76
|
-
{
|
77
|
-
facts: ({ ids }) => ({
|
78
|
-
require: ids.flatMap((id) => [facts.todoExists(id), facts.todoIsWriteable(id, true)]),
|
79
|
-
modify: { set: ids.map((id) => facts.todoCompleted(id, true)) },
|
80
|
-
}),
|
81
|
-
},
|
82
|
-
),
|
83
|
-
toggleTodo: defineMutation(
|
84
|
-
'toggleTodo',
|
85
|
-
Schema.Struct({ id: Schema.String }),
|
86
|
-
'UPDATE todos SET completed = NOT completed WHERE id = $id',
|
87
|
-
{
|
88
|
-
facts: ({ id }, currentFacts) => {
|
89
|
-
const currentIsCompleted = currentFacts.get(facts.todoCompleted(id, true)[0]) === true
|
90
|
-
return {
|
91
|
-
require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
|
92
|
-
modify: {
|
93
|
-
// remove: [facts.todoCompleted(id, currentIsCompleted)],
|
94
|
-
set: [facts.todoCompleted(id, !currentIsCompleted)],
|
95
|
-
},
|
96
|
-
}
|
97
|
-
},
|
98
|
-
},
|
99
|
-
),
|
100
|
-
setReadonlyTodo: defineMutation(
|
101
|
-
'setReadonlyTodo',
|
102
|
-
Schema.Struct({ id: Schema.String, readonly: Schema.Boolean }),
|
103
|
-
'UPDATE todos SET readonly = $readonly WHERE id = $id',
|
104
|
-
{
|
105
|
-
facts: ({ id, readonly }) => ({
|
106
|
-
require: [facts.todoExists(id)],
|
107
|
-
modify: { set: [facts.todoIsWriteable(id, !readonly)] },
|
108
|
-
}),
|
109
|
-
},
|
110
|
-
),
|
111
|
-
setTextTodo: defineMutation(
|
112
|
-
'setTextTodo',
|
113
|
-
Schema.Struct({ id: Schema.String, text: Schema.String }),
|
114
|
-
'UPDATE todos SET text = $text WHERE id = $id',
|
115
|
-
{
|
116
|
-
facts: ({ id }) => ({
|
117
|
-
require: [facts.todoExists(id), facts.todoIsWriteable(id, true)],
|
118
|
-
modify: { set: [facts.todoTextUpdated(id)] },
|
119
|
-
}),
|
120
|
-
},
|
121
|
-
),
|
122
|
-
setInputValue: defineMutation(
|
123
|
-
'setInputValue',
|
124
|
-
Schema.Struct({ id: Schema.String, text: Schema.String }),
|
125
|
-
'UPDATE todos SET text = $text WHERE id = $id',
|
126
|
-
{
|
127
|
-
localOnly: true,
|
128
|
-
facts: ({ id }) => ({ modify: { set: [facts.inputValue(id)] } }),
|
129
|
-
},
|
130
|
-
),
|
131
|
-
}
|
132
|
-
|
133
|
-
export type PartialEvent = { mutation: string; args: any }
|
134
|
-
|
135
|
-
export const toEventNodes = (
|
136
|
-
partialEvents: PartialEvent[],
|
137
|
-
mutationDefs: Record<string, MutationDef.Any>,
|
138
|
-
): HistoryDagNode[] => {
|
139
|
-
const nodesAcc: HistoryDagNode[] = [rootEventNode]
|
140
|
-
|
141
|
-
let currentEventId: EventId.EventId = EventId.ROOT
|
142
|
-
|
143
|
-
const eventNodes = partialEvents.map((partialEvent) => {
|
144
|
-
const mutationDef = mutationDefs[partialEvent.mutation]!
|
145
|
-
const eventId = EventId.nextPair(currentEventId, mutationDef.options.localOnly).id
|
146
|
-
currentEventId = eventId
|
147
|
-
|
148
|
-
const factsSnapshot = factsSnapshotForDag(historyDagFromNodes(nodesAcc, { skipFactsCheck: true }), undefined)
|
149
|
-
// console.log('factsSnapshot', eventId, factsSnapshot)
|
150
|
-
// const depRead: MutationEventFactsSnapshot = new Map<string, any>()
|
151
|
-
// const factsSnapshotProxy = new Proxy(factsSnapshot, {
|
152
|
-
// get: (target, prop) => {
|
153
|
-
// if (prop === 'has') {
|
154
|
-
// return (key: string) => {
|
155
|
-
// depRead.set(key, EMPTY_FACT_VALUE)
|
156
|
-
// return target.has(key)
|
157
|
-
// }
|
158
|
-
// } else if (prop === 'get') {
|
159
|
-
// return (key: string) => {
|
160
|
-
// depRead.set(key, EMPTY_FACT_VALUE)
|
161
|
-
// return target.get(key)
|
162
|
-
// }
|
163
|
-
// }
|
164
|
-
|
165
|
-
// notYetImplemented(`toEventNodes: ${prop.toString()} is not yet implemented`)
|
166
|
-
// },
|
167
|
-
// })
|
168
|
-
|
169
|
-
// const factsRes = mutationDef.options.facts?.(partialEvent.args, factsSnapshotProxy)
|
170
|
-
// console.log('factsRes', factsRes?.modify, factsRes?.require)
|
171
|
-
// const iterableToMap = (iterable: Iterable<MutationEventFactInput>) => {
|
172
|
-
// const map = new Map()
|
173
|
-
// for (const item of iterable) {
|
174
|
-
// if (typeof item === 'string') {
|
175
|
-
// map.set(item, EMPTY_FACT_VALUE)
|
176
|
-
// } else {
|
177
|
-
// map.set(item[0], item[1])
|
178
|
-
// }
|
179
|
-
// }
|
180
|
-
// return map
|
181
|
-
// }
|
182
|
-
// const facts = {
|
183
|
-
// modifyAdd: factsRes?.modify.add ? iterableToMap(factsRes.modify.add) : new Map(),
|
184
|
-
// modifyRemove: factsRes?.modify.remove ? iterableToMap(factsRes.modify.remove) : new Map(),
|
185
|
-
// depRequire: factsRes?.require ? iterableToMap(factsRes.require) : new Map(),
|
186
|
-
// depRead,
|
187
|
-
// } satisfies MutationEventFactsGroup
|
188
|
-
|
189
|
-
// applyFactGroup(facts, factsSnapshot)
|
190
|
-
|
191
|
-
const facts = getFactsGroupForMutationArgs({
|
192
|
-
factsCallback: mutationDef.options.facts,
|
193
|
-
args: partialEvent.args,
|
194
|
-
currentFacts: factsSnapshot,
|
195
|
-
})
|
196
|
-
|
197
|
-
const node = {
|
198
|
-
id: eventId,
|
199
|
-
parentId: getParentId(eventId),
|
200
|
-
mutation: partialEvent.mutation,
|
201
|
-
args: partialEvent.args,
|
202
|
-
factsGroup: facts,
|
203
|
-
} satisfies HistoryDagNode
|
204
|
-
nodesAcc.push(node)
|
205
|
-
return node
|
206
|
-
})
|
207
|
-
|
208
|
-
eventNodes.unshift(rootEventNode as never)
|
209
|
-
|
210
|
-
// console.log('eventNodes', eventNodes)
|
211
|
-
|
212
|
-
return eventNodes
|
213
|
-
}
|
214
|
-
|
215
|
-
const getParentId = (eventId: EventId.EventId): EventId.EventId => {
|
216
|
-
const globalParentId = eventId.global
|
217
|
-
const localParentId = eventId.local - 1
|
218
|
-
|
219
|
-
if (localParentId < 0) {
|
220
|
-
return EventId.make({ global: globalParentId - 1, local: EventId.localDefault })
|
221
|
-
}
|
222
|
-
|
223
|
-
return EventId.make({ global: globalParentId, local: localParentId })
|
224
|
-
}
|
package/tsconfig.json
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"extends": "../../../tsconfig.base.json",
|
3
|
-
"compilerOptions": {
|
4
|
-
"outDir": "./dist",
|
5
|
-
"rootDir": "./src",
|
6
|
-
"resolveJsonModule": true,
|
7
|
-
"tsBuildInfoFile": "./dist/.tsbuildinfo"
|
8
|
-
},
|
9
|
-
"include": ["./src"],
|
10
|
-
"references": [{ "path": "../db-schema" }, { "path": "../utils" }]
|
11
|
-
}
|
File without changes
|