@livestore/common 0.3.0-dev.8 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/__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 +45 -30
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +484 -321
- 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 +85 -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 +150 -72
- 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} +81 -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 +213 -82
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +337 -139
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +309 -286
- 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 +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +10 -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 +738 -477
- 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 +94 -48
- 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 +220 -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 +226 -0
- package/src/sync/next/test/mod.ts +1 -1
- package/src/sync/sync.ts +46 -21
- package/src/sync/syncstate.test.ts +346 -320
- package/src/sync/syncstate.ts +422 -230
- package/src/sync/validate-push-payload.ts +6 -6
- package/src/version.ts +2 -2
- 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 -166
- 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 -181
- 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
@@ -0,0 +1,14 @@
|
|
1
|
+
// Based on https://stackoverflow.com/a/7616484
|
2
|
+
export const hashCode = (str: string) => {
|
3
|
+
let hash = 0,
|
4
|
+
i,
|
5
|
+
chr
|
6
|
+
if (str.length === 0) return hash
|
7
|
+
for (i = 0; i < str.length; i++) {
|
8
|
+
// eslint-disable-next-line unicorn/prefer-code-point
|
9
|
+
chr = str.charCodeAt(i)
|
10
|
+
hash = (hash << 5) - hash + chr
|
11
|
+
hash = Math.trunc(hash) // Convert to 32bit integer
|
12
|
+
}
|
13
|
+
return hash
|
14
|
+
}
|
@@ -0,0 +1,73 @@
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils'
|
2
|
+
|
3
|
+
import type { MigrationOptions } from '../../../adapter-types.js'
|
4
|
+
import { type Materializer, rawSqlEvent, rawSqlMaterializer } from '../../EventDef.js'
|
5
|
+
import type { InternalState } from '../../schema.js'
|
6
|
+
import { ClientDocumentTableDefSymbol, tableIsClientDocumentTable } from './client-document-def.js'
|
7
|
+
import { SqliteAst } from './db-schema/mod.js'
|
8
|
+
import { stateSystemTables } from './system-tables.js'
|
9
|
+
import { type TableDef, type TableDefBase } from './table-def.js'
|
10
|
+
|
11
|
+
export * from './table-def.js'
|
12
|
+
export {
|
13
|
+
ClientDocumentTableDefSymbol,
|
14
|
+
tableIsClientDocumentTable,
|
15
|
+
clientDocument,
|
16
|
+
type ClientDocumentTableDef,
|
17
|
+
type ClientDocumentTableOptions,
|
18
|
+
} from './client-document-def.js'
|
19
|
+
export * from '../../EventDef.js'
|
20
|
+
|
21
|
+
export const makeState = <TStateInput extends InputState>(inputSchema: TStateInput): InternalState => {
|
22
|
+
const inputTables: ReadonlyArray<TableDef> = Array.isArray(inputSchema.tables)
|
23
|
+
? inputSchema.tables
|
24
|
+
: Object.values(inputSchema.tables)
|
25
|
+
|
26
|
+
const tables = new Map<string, TableDef.Any>()
|
27
|
+
|
28
|
+
for (const tableDef of inputTables) {
|
29
|
+
const sqliteDef = tableDef.sqliteDef
|
30
|
+
// TODO validate tables (e.g. index names are unique)
|
31
|
+
if (tables.has(sqliteDef.ast.name)) {
|
32
|
+
shouldNeverHappen(`Duplicate table name: ${sqliteDef.ast.name}. Please use unique names for tables.`)
|
33
|
+
}
|
34
|
+
tables.set(sqliteDef.ast.name, tableDef)
|
35
|
+
}
|
36
|
+
|
37
|
+
for (const tableDef of stateSystemTables) {
|
38
|
+
tables.set(tableDef.sqliteDef.name, tableDef)
|
39
|
+
}
|
40
|
+
|
41
|
+
const materializers = new Map<string, Materializer<any>>()
|
42
|
+
|
43
|
+
for (const [name, materializer] of Object.entries(inputSchema.materializers)) {
|
44
|
+
materializers.set(name, materializer)
|
45
|
+
}
|
46
|
+
|
47
|
+
materializers.set(rawSqlEvent.name, rawSqlMaterializer)
|
48
|
+
|
49
|
+
for (const tableDef of inputTables) {
|
50
|
+
if (tableIsClientDocumentTable(tableDef)) {
|
51
|
+
materializers.set(
|
52
|
+
tableDef[ClientDocumentTableDefSymbol].derived.setEventDef.name,
|
53
|
+
tableDef[ClientDocumentTableDefSymbol].derived.setMaterializer,
|
54
|
+
)
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
const hash = SqliteAst.hash({
|
59
|
+
_tag: 'dbSchema',
|
60
|
+
tables: [...tables.values()].map((_) => _.sqliteDef.ast),
|
61
|
+
})
|
62
|
+
|
63
|
+
return { sqlite: { tables, migrations: inputSchema.migrations ?? { strategy: 'auto' }, hash }, materializers }
|
64
|
+
}
|
65
|
+
|
66
|
+
export type InputState = {
|
67
|
+
readonly tables: Record<string, TableDefBase> | ReadonlyArray<TableDefBase>
|
68
|
+
readonly materializers: Record<string, Materializer<any>>
|
69
|
+
/**
|
70
|
+
* @default { strategy: 'auto' }
|
71
|
+
*/
|
72
|
+
readonly migrations?: MigrationOptions
|
73
|
+
}
|
@@ -0,0 +1,440 @@
|
|
1
|
+
import type { GetValForKey, SingleOrReadonlyArray } from '@livestore/utils'
|
2
|
+
import { type Option, Predicate, type Schema } from '@livestore/utils/effect'
|
3
|
+
|
4
|
+
import type { SessionIdSymbol } from '../../../../adapter-types.js'
|
5
|
+
import type { SqlValue } from '../../../../util.js'
|
6
|
+
import type { ClientDocumentTableDef } from '../client-document-def.js'
|
7
|
+
import type { SqliteDsl } from '../db-schema/mod.js'
|
8
|
+
import type { TableDefBase } from '../table-def.js'
|
9
|
+
|
10
|
+
export type QueryBuilderAst =
|
11
|
+
| QueryBuilderAst.SelectQuery
|
12
|
+
| QueryBuilderAst.CountQuery
|
13
|
+
| QueryBuilderAst.RowQuery
|
14
|
+
| QueryBuilderAst.InsertQuery
|
15
|
+
| QueryBuilderAst.UpdateQuery
|
16
|
+
| QueryBuilderAst.DeleteQuery
|
17
|
+
|
18
|
+
export namespace QueryBuilderAst {
|
19
|
+
export interface SelectQuery {
|
20
|
+
readonly _tag: 'SelectQuery'
|
21
|
+
readonly columns: string[]
|
22
|
+
readonly pickFirst: false | { fallback: () => any } | 'throws'
|
23
|
+
readonly select: {
|
24
|
+
columns: ReadonlyArray<string>
|
25
|
+
}
|
26
|
+
readonly orderBy: ReadonlyArray<OrderBy>
|
27
|
+
readonly offset: Option.Option<number>
|
28
|
+
readonly limit: Option.Option<number>
|
29
|
+
readonly tableDef: TableDefBase
|
30
|
+
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
31
|
+
readonly resultSchemaSingle: Schema.Schema<any>
|
32
|
+
}
|
33
|
+
|
34
|
+
export interface CountQuery {
|
35
|
+
readonly _tag: 'CountQuery'
|
36
|
+
readonly tableDef: TableDefBase
|
37
|
+
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
38
|
+
readonly resultSchema: Schema.Schema<number, ReadonlyArray<{ count: number }>>
|
39
|
+
}
|
40
|
+
|
41
|
+
export interface RowQuery {
|
42
|
+
readonly _tag: 'RowQuery'
|
43
|
+
readonly tableDef: ClientDocumentTableDef.Any
|
44
|
+
readonly id: string | SessionIdSymbol
|
45
|
+
readonly explicitDefaultValues: Record<string, unknown>
|
46
|
+
}
|
47
|
+
|
48
|
+
export interface InsertQuery {
|
49
|
+
readonly _tag: 'InsertQuery'
|
50
|
+
readonly tableDef: TableDefBase
|
51
|
+
readonly values: Record<string, unknown>
|
52
|
+
readonly onConflict: OnConflict | undefined
|
53
|
+
readonly returning: string[] | undefined
|
54
|
+
readonly resultSchema: Schema.Schema<any>
|
55
|
+
}
|
56
|
+
|
57
|
+
export interface OnConflict {
|
58
|
+
/** Conflicting column name */
|
59
|
+
readonly targets: string[]
|
60
|
+
readonly action:
|
61
|
+
| { readonly _tag: 'ignore' }
|
62
|
+
| { readonly _tag: 'replace' }
|
63
|
+
| {
|
64
|
+
readonly _tag: 'update'
|
65
|
+
readonly update: Record<string, unknown>
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
export interface UpdateQuery {
|
70
|
+
readonly _tag: 'UpdateQuery'
|
71
|
+
readonly tableDef: TableDefBase
|
72
|
+
readonly values: Record<string, unknown>
|
73
|
+
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
74
|
+
readonly returning: string[] | undefined
|
75
|
+
readonly resultSchema: Schema.Schema<any>
|
76
|
+
}
|
77
|
+
|
78
|
+
export interface DeleteQuery {
|
79
|
+
readonly _tag: 'DeleteQuery'
|
80
|
+
readonly tableDef: TableDefBase
|
81
|
+
readonly where: ReadonlyArray<QueryBuilderAst.Where>
|
82
|
+
readonly returning: string[] | undefined
|
83
|
+
readonly resultSchema: Schema.Schema<any>
|
84
|
+
}
|
85
|
+
|
86
|
+
export type WriteQuery = InsertQuery | UpdateQuery | DeleteQuery
|
87
|
+
|
88
|
+
export interface Where {
|
89
|
+
readonly col: string
|
90
|
+
readonly op: QueryBuilder.WhereOps
|
91
|
+
readonly value: unknown
|
92
|
+
}
|
93
|
+
|
94
|
+
export interface OrderBy {
|
95
|
+
readonly col: string
|
96
|
+
readonly direction: 'asc' | 'desc'
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
export const QueryBuilderAstSymbol = Symbol.for('QueryBuilderAst')
|
101
|
+
export type QueryBuilderAstSymbol = typeof QueryBuilderAstSymbol
|
102
|
+
|
103
|
+
export const QueryBuilderResultSymbol = Symbol.for('QueryBuilderResult')
|
104
|
+
export type QueryBuilderResultSymbol = typeof QueryBuilderResultSymbol
|
105
|
+
|
106
|
+
export const QueryBuilderTypeId = Symbol.for('QueryBuilder')
|
107
|
+
export type QueryBuilderTypeId = typeof QueryBuilderTypeId
|
108
|
+
|
109
|
+
export const isQueryBuilder = (value: unknown): value is QueryBuilder<any, any, any> =>
|
110
|
+
Predicate.hasProperty(value, QueryBuilderTypeId)
|
111
|
+
|
112
|
+
export type QueryBuilder<
|
113
|
+
TResult,
|
114
|
+
TTableDef extends TableDefBase,
|
115
|
+
/** Used to gradually remove features from the API based on the query context */
|
116
|
+
TWithout extends QueryBuilder.ApiFeature = never,
|
117
|
+
> = {
|
118
|
+
readonly [QueryBuilderTypeId]: QueryBuilderTypeId
|
119
|
+
readonly [QueryBuilderAstSymbol]: QueryBuilderAst
|
120
|
+
readonly ['ResultType']: TResult
|
121
|
+
readonly asSql: () => { query: string; bindValues: SqlValue[] }
|
122
|
+
readonly toString: () => string
|
123
|
+
} & Omit<QueryBuilder.ApiFull<TResult, TTableDef, TWithout>, TWithout>
|
124
|
+
|
125
|
+
export namespace QueryBuilder {
|
126
|
+
export type Any = QueryBuilder<any, any, any>
|
127
|
+
export type WhereOps = WhereOps.Equality | WhereOps.Order | WhereOps.Like | WhereOps.In
|
128
|
+
|
129
|
+
export namespace WhereOps {
|
130
|
+
export type Equality = '=' | '!='
|
131
|
+
export type Order = '<' | '>' | '<=' | '>='
|
132
|
+
export type Like = 'LIKE' | 'NOT LIKE' | 'ILIKE' | 'NOT ILIKE'
|
133
|
+
export type In = 'IN' | 'NOT IN'
|
134
|
+
|
135
|
+
export type SingleValue = Equality | Order | Like
|
136
|
+
export type MultiValue = In
|
137
|
+
}
|
138
|
+
|
139
|
+
export type ApiFeature =
|
140
|
+
| 'select'
|
141
|
+
| 'where'
|
142
|
+
| 'count'
|
143
|
+
| 'orderBy'
|
144
|
+
| 'offset'
|
145
|
+
| 'limit'
|
146
|
+
| 'first'
|
147
|
+
| 'row'
|
148
|
+
| 'insert'
|
149
|
+
| 'update'
|
150
|
+
| 'delete'
|
151
|
+
| 'returning'
|
152
|
+
| 'onConflict'
|
153
|
+
|
154
|
+
export type WhereParams<TTableDef extends TableDefBase> = Partial<{
|
155
|
+
[K in keyof TTableDef['sqliteDef']['columns']]:
|
156
|
+
| TTableDef['sqliteDef']['columns'][K]['schema']['Type']
|
157
|
+
| { op: QueryBuilder.WhereOps.SingleValue; value: TTableDef['sqliteDef']['columns'][K]['schema']['Type'] }
|
158
|
+
| {
|
159
|
+
op: QueryBuilder.WhereOps.MultiValue
|
160
|
+
value: ReadonlyArray<TTableDef['sqliteDef']['columns'][K]['schema']['Type']>
|
161
|
+
}
|
162
|
+
| undefined
|
163
|
+
}>
|
164
|
+
|
165
|
+
export type OrderByParams<TTableDef extends TableDefBase> = ReadonlyArray<{
|
166
|
+
col: keyof TTableDef['sqliteDef']['columns'] & string
|
167
|
+
direction: 'asc' | 'desc'
|
168
|
+
}>
|
169
|
+
|
170
|
+
export type ApiFull<TResult, TTableDef extends TableDefBase, TWithout extends ApiFeature> = {
|
171
|
+
/**
|
172
|
+
* `SELECT *` is the default
|
173
|
+
*
|
174
|
+
* Example:
|
175
|
+
* ```ts
|
176
|
+
* db.todos.select('id', 'text', 'completed')
|
177
|
+
* db.todos.select('id')
|
178
|
+
* ```
|
179
|
+
*/
|
180
|
+
readonly select: {
|
181
|
+
/** Selects and plucks a single column */
|
182
|
+
<TColumn extends keyof TTableDef['sqliteDef']['columns'] & string>(
|
183
|
+
pluckColumn: TColumn,
|
184
|
+
): QueryBuilder<
|
185
|
+
ReadonlyArray<TTableDef['sqliteDef']['columns'][TColumn]['schema']['Type']>,
|
186
|
+
TTableDef,
|
187
|
+
TWithout | 'row' | 'select' | 'returning' | 'onConflict'
|
188
|
+
>
|
189
|
+
/** Select multiple columns */
|
190
|
+
<TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
|
191
|
+
...columns: TColumns[]
|
192
|
+
// TODO also support arbitrary SQL selects
|
193
|
+
// params: QueryBuilderSelectParams,
|
194
|
+
): QueryBuilder<
|
195
|
+
ReadonlyArray<{
|
196
|
+
readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
|
197
|
+
}>,
|
198
|
+
TTableDef,
|
199
|
+
TWithout | 'row' | 'select' | 'count' | 'returning' | 'onConflict'
|
200
|
+
>
|
201
|
+
}
|
202
|
+
|
203
|
+
/**
|
204
|
+
* Notes:
|
205
|
+
* - All where clauses are `AND`ed together by default.
|
206
|
+
* - `null` values only support `=` and `!=` which is translated to `IS NULL` and `IS NOT NULL`.
|
207
|
+
*
|
208
|
+
* Example:
|
209
|
+
* ```ts
|
210
|
+
* db.todos.where('completed', true)
|
211
|
+
* db.todos.where('completed', '!=', true)
|
212
|
+
* db.todos.where({ completed: true })
|
213
|
+
* db.todos.where({ completed: { op: '!=', value: true } })
|
214
|
+
* ```
|
215
|
+
*
|
216
|
+
* TODO: Also support `OR`
|
217
|
+
*/
|
218
|
+
readonly where: {
|
219
|
+
(params: QueryBuilder.WhereParams<TTableDef>): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select'>
|
220
|
+
<TColName extends keyof TTableDef['sqliteDef']['columns']>(
|
221
|
+
col: TColName,
|
222
|
+
value: TTableDef['sqliteDef']['columns'][TColName]['schema']['Type'],
|
223
|
+
): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select'>
|
224
|
+
<TColName extends keyof TTableDef['sqliteDef']['columns']>(
|
225
|
+
col: TColName,
|
226
|
+
op: QueryBuilder.WhereOps,
|
227
|
+
value: TTableDef['sqliteDef']['columns'][TColName]['schema']['Type'],
|
228
|
+
): QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'select'>
|
229
|
+
}
|
230
|
+
|
231
|
+
/**
|
232
|
+
* Example:
|
233
|
+
* ```ts
|
234
|
+
* db.todos.count()
|
235
|
+
* db.todos.count().where('completed', true)
|
236
|
+
* ```
|
237
|
+
*/
|
238
|
+
readonly count: () => QueryBuilder<
|
239
|
+
number,
|
240
|
+
TTableDef,
|
241
|
+
TWithout | 'row' | 'count' | 'select' | 'orderBy' | 'first' | 'offset' | 'limit' | 'returning' | 'onConflict'
|
242
|
+
>
|
243
|
+
|
244
|
+
/**
|
245
|
+
* Example:
|
246
|
+
* ```ts
|
247
|
+
* db.todos.orderBy('createdAt', 'desc')
|
248
|
+
* ```
|
249
|
+
*/
|
250
|
+
readonly orderBy: {
|
251
|
+
<TColName extends keyof TTableDef['sqliteDef']['columns'] & string>(
|
252
|
+
col: TColName,
|
253
|
+
direction: 'asc' | 'desc',
|
254
|
+
): QueryBuilder<TResult, TTableDef, TWithout | 'returning' | 'onConflict'>
|
255
|
+
<TParams extends QueryBuilder.OrderByParams<TTableDef>>(
|
256
|
+
params: TParams,
|
257
|
+
): QueryBuilder<TResult, TTableDef, TWithout | 'returning' | 'onConflict'>
|
258
|
+
}
|
259
|
+
|
260
|
+
/**
|
261
|
+
* Example:
|
262
|
+
* ```ts
|
263
|
+
* db.todos.offset(10)
|
264
|
+
* ```
|
265
|
+
*/
|
266
|
+
readonly offset: (
|
267
|
+
offset: number,
|
268
|
+
) => QueryBuilder<TResult, TTableDef, TWithout | 'row' | 'offset' | 'orderBy' | 'returning' | 'onConflict'>
|
269
|
+
|
270
|
+
/**
|
271
|
+
* Example:
|
272
|
+
* ```ts
|
273
|
+
* db.todos.limit(10)
|
274
|
+
* ```
|
275
|
+
*/
|
276
|
+
readonly limit: (
|
277
|
+
limit: number,
|
278
|
+
) => QueryBuilder<
|
279
|
+
TResult,
|
280
|
+
TTableDef,
|
281
|
+
TWithout | 'row' | 'limit' | 'offset' | 'first' | 'orderBy' | 'returning' | 'onConflict'
|
282
|
+
>
|
283
|
+
|
284
|
+
/**
|
285
|
+
* Example:
|
286
|
+
* ```ts
|
287
|
+
* db.todos.first()
|
288
|
+
* db.todos.where('id', '123').first()
|
289
|
+
* ```
|
290
|
+
*
|
291
|
+
* Query will throw if no rows are returned and no fallback is provided.
|
292
|
+
*/
|
293
|
+
readonly first: <TFallback = never>(options?: {
|
294
|
+
/** @default 'throws' */
|
295
|
+
fallback?: (() => TFallback | GetSingle<TResult>) | 'throws'
|
296
|
+
}) => QueryBuilder<
|
297
|
+
TFallback | GetSingle<TResult>,
|
298
|
+
TTableDef,
|
299
|
+
TWithout | 'row' | 'first' | 'orderBy' | 'select' | 'limit' | 'offset' | 'where' | 'returning' | 'onConflict'
|
300
|
+
>
|
301
|
+
|
302
|
+
/**
|
303
|
+
* Insert a new row into the table
|
304
|
+
*
|
305
|
+
* Example:
|
306
|
+
* ```ts
|
307
|
+
* db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' })
|
308
|
+
* ```
|
309
|
+
*/
|
310
|
+
readonly insert: (
|
311
|
+
values: TTableDef['insertSchema']['Type'],
|
312
|
+
) => QueryBuilder<
|
313
|
+
TResult,
|
314
|
+
TTableDef,
|
315
|
+
TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'where'
|
316
|
+
>
|
317
|
+
|
318
|
+
/**
|
319
|
+
* Example: If the row already exists, it will be ignored.
|
320
|
+
* ```ts
|
321
|
+
* db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'ignore')
|
322
|
+
* ```
|
323
|
+
*
|
324
|
+
* Example: If the row already exists, it will be replaced.
|
325
|
+
* ```ts
|
326
|
+
* db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'replace')
|
327
|
+
* ```
|
328
|
+
*
|
329
|
+
* Example: If the row already exists, it will be updated.
|
330
|
+
* ```ts
|
331
|
+
* db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).onConflict('id', 'update', { text: 'Buy soy milk' })
|
332
|
+
* ```
|
333
|
+
*
|
334
|
+
* NOTE This API doesn't yet support composite primary keys.
|
335
|
+
*/
|
336
|
+
readonly onConflict: {
|
337
|
+
<TTarget extends SingleOrReadonlyArray<keyof TTableDef['sqliteDef']['columns']>>(
|
338
|
+
target: TTarget,
|
339
|
+
action: 'ignore' | 'replace',
|
340
|
+
): QueryBuilder<
|
341
|
+
TResult,
|
342
|
+
TTableDef,
|
343
|
+
TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'where'
|
344
|
+
>
|
345
|
+
<TTarget extends SingleOrReadonlyArray<keyof TTableDef['sqliteDef']['columns']>>(
|
346
|
+
target: TTarget,
|
347
|
+
action: 'update',
|
348
|
+
updateValues: Partial<TTableDef['rowSchema']['Type']>,
|
349
|
+
): QueryBuilder<
|
350
|
+
TResult,
|
351
|
+
TTableDef,
|
352
|
+
TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'where'
|
353
|
+
>
|
354
|
+
}
|
355
|
+
|
356
|
+
/**
|
357
|
+
* Similar to the `.select` API but for write queries (insert, update, delete).
|
358
|
+
*
|
359
|
+
* Example:
|
360
|
+
* ```ts
|
361
|
+
* db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id')
|
362
|
+
* ```
|
363
|
+
*/
|
364
|
+
readonly returning: <TColumns extends keyof TTableDef['sqliteDef']['columns'] & string>(
|
365
|
+
...columns: TColumns[]
|
366
|
+
) => QueryBuilder<
|
367
|
+
ReadonlyArray<{
|
368
|
+
readonly [K in TColumns]: TTableDef['sqliteDef']['columns'][K]['schema']['Type']
|
369
|
+
}>,
|
370
|
+
TTableDef
|
371
|
+
>
|
372
|
+
|
373
|
+
/**
|
374
|
+
* Update rows in the table that match the where clause
|
375
|
+
*
|
376
|
+
* Example:
|
377
|
+
* ```ts
|
378
|
+
* db.todos.update({ status: 'completed' }).where({ id: '123' })
|
379
|
+
* ```
|
380
|
+
*/
|
381
|
+
readonly update: (
|
382
|
+
values: Partial<TTableDef['rowSchema']['Type']>,
|
383
|
+
) => QueryBuilder<
|
384
|
+
TResult,
|
385
|
+
TTableDef,
|
386
|
+
TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'onConflict'
|
387
|
+
>
|
388
|
+
|
389
|
+
/**
|
390
|
+
* Delete rows from the table that match the where clause
|
391
|
+
*
|
392
|
+
* Example:
|
393
|
+
* ```ts
|
394
|
+
* db.todos.delete().where({ status: 'completed' })
|
395
|
+
* ```
|
396
|
+
*
|
397
|
+
* Note that it's generally recommended to do soft-deletes for synced apps.
|
398
|
+
*/
|
399
|
+
readonly delete: () => QueryBuilder<
|
400
|
+
TResult,
|
401
|
+
TTableDef,
|
402
|
+
TWithout | 'row' | 'select' | 'count' | 'orderBy' | 'first' | 'offset' | 'limit' | 'onConflict'
|
403
|
+
>
|
404
|
+
}
|
405
|
+
}
|
406
|
+
|
407
|
+
export namespace RowQuery {
|
408
|
+
export type GetOrCreateOptions<TTableDef extends ClientDocumentTableDef.TraitAny> = {
|
409
|
+
default: Partial<TTableDef['Value']>
|
410
|
+
}
|
411
|
+
|
412
|
+
// TODO get rid of this
|
413
|
+
export type RequiredColumnsOptions<TTableDef extends TableDefBase> = {
|
414
|
+
/**
|
415
|
+
* Values to be inserted into the row if it doesn't exist yet
|
416
|
+
*/
|
417
|
+
explicitDefaultValues: Pick<
|
418
|
+
SqliteDsl.FromColumns.RowDecodedAll<TTableDef['sqliteDef']['columns']>,
|
419
|
+
SqliteDsl.FromColumns.RequiredInsertColumnNames<Omit<TTableDef['sqliteDef']['columns'], 'id'>>
|
420
|
+
>
|
421
|
+
}
|
422
|
+
|
423
|
+
export type Result<TTableDef extends TableDefBase> = SqliteDsl.FromColumns.RowDecoded<
|
424
|
+
TTableDef['sqliteDef']['columns']
|
425
|
+
>
|
426
|
+
|
427
|
+
export type DocumentResult<TTableDef extends ClientDocumentTableDef.Any> = GetValForKey<
|
428
|
+
SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>,
|
429
|
+
'value'
|
430
|
+
>
|
431
|
+
|
432
|
+
export type ResultEncoded<TTableDef extends TableDefBase> = TTableDef['options']['isClientDocumentTable'] extends true
|
433
|
+
? GetValForKey<SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>, 'value'>
|
434
|
+
: SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>
|
435
|
+
|
436
|
+
export type GetIdColumnType<TTableDef extends TableDefBase> =
|
437
|
+
TTableDef['sqliteDef']['columns']['id']['schema']['Type']
|
438
|
+
}
|
439
|
+
|
440
|
+
type GetSingle<T> = T extends ReadonlyArray<infer U> ? U : never
|