@livestore/common 0.4.0-dev.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts +27 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/WorkerTransportError.d.ts +11 -0
- package/dist/WorkerTransportError.d.ts.map +1 -0
- package/dist/WorkerTransportError.js +11 -0
- package/dist/WorkerTransportError.js.map +1 -0
- package/dist/adapter-types.d.ts +37 -7
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +27 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js +6 -4
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-compatibility.test.d.ts +2 -0
- package/dist/devtools/devtools-compatibility.test.d.ts.map +1 -0
- package/dist/devtools/devtools-compatibility.test.js +15 -0
- package/dist/devtools/devtools-compatibility.test.js.map +1 -0
- package/dist/devtools/devtools-messages-client-session.d.ts +55 -24
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +22 -5
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +11 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +7 -9
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +65 -30
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +29 -11
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +7 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +13 -2
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +10 -3
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +48 -18
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +20 -12
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +53 -6
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +325 -257
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +107 -0
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -0
- package/dist/leader-thread/RejectedPushError.js +78 -0
- package/dist/leader-thread/RejectedPushError.js.map +1 -0
- package/dist/leader-thread/connection.js +1 -1
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +19 -14
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +78 -18
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +90 -58
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -7
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +49 -17
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
- package/dist/leader-thread/materialize-event.d.ts +1 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +28 -9
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -2
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +6 -6
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +56 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +167 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +95 -17
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +13 -0
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +7 -4
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -6
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +18 -8
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +7 -2
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -3
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +40 -29
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +161 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +140 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +99 -0
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.js +144 -0
- package/dist/schema/EventDef/deprecated.js.map +1 -0
- package/dist/schema/EventDef/deprecated.test.d.ts +2 -0
- package/dist/schema/EventDef/deprecated.test.d.ts.map +1 -0
- package/dist/schema/EventDef/deprecated.test.js +95 -0
- package/dist/schema/EventDef/deprecated.test.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +110 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +6 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +6 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +193 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +44 -44
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +102 -111
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.js +176 -0
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts +2 -0
- package/dist/schema/LiveStoreEvent/client.test.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/client.test.js +111 -0
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +6 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -4
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +16 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +32 -4
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +2 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +36 -15
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +121 -2
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +2 -2
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +96 -47
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +51 -12
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +24 -15
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +2 -2
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +16 -10
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +15 -4
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +2 -2
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +5 -7
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +51 -22
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.js +99 -22
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +28 -15
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +231 -93
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +24 -14
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +21 -450
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +5 -3
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +1 -1
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +92 -3
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +47 -0
- package/dist/schema/unknown-events.d.ts.map +1 -0
- package/dist/schema/unknown-events.js +69 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/common.js.map +1 -1
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +38 -6
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +18 -6
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-db-helper.js +3 -3
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +5 -5
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +12 -12
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +99 -114
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +0 -33
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +5 -22
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +10 -8
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +71 -69
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +11 -12
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +7 -8
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +54 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +198 -9
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +11 -11
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +6 -6
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/compact-events.calculator.test.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
- package/dist/sync/next/test/compact-events.test.d.ts.map +1 -1
- package/dist/sync/next/test/compact-events.test.js +2 -2
- package/dist/sync/next/test/compact-events.test.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +11 -11
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +3 -3
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +3 -3
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +33 -13
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +38 -1
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +23 -2
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/syncstate.d.ts +55 -55
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +80 -98
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +221 -132
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +36 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +56 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +4 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +68 -0
- package/dist/testing/event-factory.d.ts.map +1 -0
- package/dist/testing/event-factory.js +78 -0
- package/dist/testing/event-factory.js.map +1 -0
- package/dist/testing/mod.d.ts +2 -0
- package/dist/testing/mod.d.ts.map +1 -0
- package/dist/testing/mod.js +2 -0
- package/dist/testing/mod.js.map +1 -0
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +24 -5
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +25 -8
- package/dist/version.js.map +1 -1
- package/package.json +69 -16
- package/src/ClientSessionLeaderThreadProxy.ts +27 -12
- package/src/WorkerTransportError.ts +12 -0
- package/src/adapter-types.ts +50 -7
- package/src/bounded-collections.ts +6 -5
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-compatibility.test.ts +18 -0
- package/src/devtools/devtools-messages-client-session.ts +22 -4
- package/src/devtools/devtools-messages-common.ts +7 -12
- package/src/devtools/devtools-messages-leader.ts +29 -10
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +32 -24
- package/src/index.ts +4 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +523 -373
- package/src/leader-thread/RejectedPushError.ts +106 -0
- package/src/leader-thread/connection.ts +1 -1
- package/src/leader-thread/eventlog.ts +112 -39
- package/src/leader-thread/leader-worker-devtools.ts +201 -120
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +125 -40
- package/src/leader-thread/materialize-event.ts +40 -10
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +7 -7
- package/src/leader-thread/shutdown-channel.ts +4 -8
- package/src/leader-thread/stream-events.ts +206 -0
- package/src/leader-thread/types.ts +68 -18
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +11 -5
- package/src/materializer-helper.ts +27 -16
- package/src/otel.ts +13 -2
- package/src/rematerialize-from-eventlog.ts +61 -51
- package/src/schema/EventDef/define.ts +217 -0
- package/src/schema/EventDef/deprecated.test.ts +129 -0
- package/src/schema/EventDef/deprecated.ts +175 -0
- package/src/schema/EventDef/event-def.ts +125 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +5 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +72 -53
- package/src/schema/LiveStoreEvent/client.test.ts +129 -0
- package/src/schema/LiveStoreEvent/client.ts +235 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +6 -4
- package/src/schema/schema.ts +46 -5
- package/src/schema/state/sqlite/client-document-def.test.ts +144 -5
- package/src/schema/state/sqlite/client-document-def.ts +47 -34
- package/src/schema/state/sqlite/column-annotations.test.ts +3 -2
- package/src/schema/state/sqlite/column-annotations.ts +2 -1
- package/src/schema/state/sqlite/column-def.test.ts +66 -12
- package/src/schema/state/sqlite/column-def.ts +119 -47
- package/src/schema/state/sqlite/column-spec.test.ts +32 -17
- package/src/schema/state/sqlite/column-spec.ts +37 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -2
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +2 -1
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +41 -15
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +13 -19
- package/src/schema/state/sqlite/mod.ts +7 -8
- package/src/schema/state/sqlite/query-builder/api.ts +55 -17
- package/src/schema/state/sqlite/query-builder/astToSql.ts +110 -21
- package/src/schema/state/sqlite/query-builder/impl.test.ts +267 -93
- package/src/schema/state/sqlite/query-builder/impl.ts +26 -13
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +30 -22
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +114 -3
- package/src/schema/state/sqlite/table-def.ts +16 -22
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +88 -0
- package/src/schema-management/common.ts +2 -2
- package/src/schema-management/migrations.ts +42 -9
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +18 -6
- package/src/sql-queries/sql-query-builder.ts +1 -0
- package/src/sqlite-db-helper.ts +3 -3
- package/src/sqlite-types.ts +6 -5
- package/src/sync/ClientSessionSyncProcessor.ts +152 -142
- package/src/sync/errors.ts +12 -24
- package/src/sync/index.ts +2 -0
- package/src/sync/mock-sync-backend.ts +146 -104
- package/src/sync/next/compact-events.ts +10 -11
- package/src/sync/next/facts.ts +13 -14
- package/src/sync/next/history-dag-common.ts +280 -26
- package/src/sync/next/history-dag.ts +17 -13
- package/src/sync/next/rebase-events.ts +12 -12
- package/src/sync/next/test/compact-events.calculator.test.ts +3 -2
- package/src/sync/next/test/compact-events.test.ts +4 -3
- package/src/sync/next/test/event-fixtures.ts +13 -13
- package/src/sync/sync-backend-kv.ts +4 -3
- package/src/sync/sync-backend.ts +66 -17
- package/src/sync/sync.ts +24 -2
- package/src/sync/syncstate.test.ts +583 -419
- package/src/sync/syncstate.ts +127 -122
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +6 -8
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/util.ts +2 -2
- package/src/version.ts +33 -8
- package/dist/schema/EventDef.d.ts +0 -126
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js +0 -147
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -81
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -222
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -286
- package/src/schema/state/sqlite/system-tables.ts +0 -106
- package/src/sync/next/ambient.d.ts +0 -3
- package/src/sync/next/graphology.ts +0 -41
- package/src/sync/next/graphology_.ts +0 -2
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { Schema } from '@livestore/utils/effect'
|
|
2
1
|
import { describe, expect, it } from 'vitest'
|
|
3
2
|
|
|
3
|
+
import { Schema } from '@livestore/utils/effect'
|
|
4
|
+
import { objectToString } from '@livestore/utils'
|
|
5
|
+
|
|
4
6
|
import { State } from '../../../mod.ts'
|
|
5
7
|
import type { QueryBuilder } from './api.ts'
|
|
6
8
|
import { getResultSchema } from './impl.ts'
|
|
@@ -73,12 +75,35 @@ const issue = State.SQLite.table({
|
|
|
73
75
|
],
|
|
74
76
|
})
|
|
75
77
|
|
|
76
|
-
const
|
|
78
|
+
const selections = State.SQLite.table({
|
|
79
|
+
name: 'selections',
|
|
80
|
+
columns: {
|
|
81
|
+
id: State.SQLite.integer({ primaryKey: true }),
|
|
82
|
+
group: State.SQLite.text({}),
|
|
83
|
+
},
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
const Source = Schema.Literal('google', 'linkedin', 'facebook')
|
|
87
|
+
const ProfileAttribute = Schema.Struct({ key: Schema.String, value: Schema.String })
|
|
88
|
+
|
|
89
|
+
const personProfiles = State.SQLite.table({
|
|
90
|
+
name: 'person_profiles',
|
|
91
|
+
columns: {
|
|
92
|
+
personId: State.SQLite.text({ primaryKey: true }),
|
|
93
|
+
sources: State.SQLite.json({ schema: Schema.Array(Source), default: [] }),
|
|
94
|
+
tags: State.SQLite.json({ schema: Schema.Array(Schema.String), default: [] }),
|
|
95
|
+
attributes: State.SQLite.json({ schema: Schema.Array(ProfileAttribute), default: [] }),
|
|
96
|
+
/** Nullable JSON array column for testing JSON_CONTAINS on nullable columns */
|
|
97
|
+
optionalTags: State.SQLite.json({ schema: Schema.Array(Schema.String), nullable: true }),
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
const db = { todos, todosWithIntId, comments, issue, selections, UiState, UiStateWithDefaultId, personProfiles }
|
|
77
102
|
|
|
78
103
|
const dump = (qb: QueryBuilder<any, any, any>) => ({
|
|
79
104
|
bindValues: qb.asSql().bindValues,
|
|
80
105
|
query: qb.asSql().query,
|
|
81
|
-
schema: getResultSchema(qb)
|
|
106
|
+
schema: objectToString(getResultSchema(qb)),
|
|
82
107
|
})
|
|
83
108
|
|
|
84
109
|
describe('query builder', () => {
|
|
@@ -95,7 +120,7 @@ describe('query builder', () => {
|
|
|
95
120
|
expect(dump(db.todos.select('id'))).toMatchInlineSnapshot(`
|
|
96
121
|
{
|
|
97
122
|
"bindValues": [],
|
|
98
|
-
"query": "SELECT id FROM 'todos'",
|
|
123
|
+
"query": "SELECT "id" FROM 'todos'",
|
|
99
124
|
"schema": "ReadonlyArray<({ readonly id: string } <-> string)>",
|
|
100
125
|
}
|
|
101
126
|
`)
|
|
@@ -103,7 +128,7 @@ describe('query builder', () => {
|
|
|
103
128
|
expect(dump(db.todos.select('id', 'text'))).toMatchInlineSnapshot(`
|
|
104
129
|
{
|
|
105
130
|
"bindValues": [],
|
|
106
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
131
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
107
132
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
108
133
|
}
|
|
109
134
|
`)
|
|
@@ -115,7 +140,7 @@ describe('query builder', () => {
|
|
|
115
140
|
"bindValues": [
|
|
116
141
|
1,
|
|
117
142
|
],
|
|
118
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
143
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
119
144
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string } | undefined> <-> { readonly id: string; readonly text: string } | undefined)",
|
|
120
145
|
}
|
|
121
146
|
`)
|
|
@@ -125,7 +150,7 @@ describe('query builder', () => {
|
|
|
125
150
|
"bindValues": [
|
|
126
151
|
1,
|
|
127
152
|
],
|
|
128
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
153
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
129
154
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> <-> { readonly id: string; readonly text: string })",
|
|
130
155
|
}
|
|
131
156
|
`)
|
|
@@ -137,7 +162,7 @@ describe('query builder', () => {
|
|
|
137
162
|
"bindValues": [
|
|
138
163
|
1,
|
|
139
164
|
],
|
|
140
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
165
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
141
166
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> | readonly [undefined] <-> { readonly id: string; readonly text: string } | undefined)",
|
|
142
167
|
}
|
|
143
168
|
`)
|
|
@@ -149,7 +174,7 @@ describe('query builder', () => {
|
|
|
149
174
|
"bindValues": [
|
|
150
175
|
1,
|
|
151
176
|
],
|
|
152
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
177
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
153
178
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
154
179
|
}
|
|
155
180
|
`)
|
|
@@ -158,7 +183,7 @@ describe('query builder', () => {
|
|
|
158
183
|
"bindValues": [
|
|
159
184
|
1,
|
|
160
185
|
],
|
|
161
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed != ?",
|
|
186
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" != ?",
|
|
162
187
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
163
188
|
}
|
|
164
189
|
`)
|
|
@@ -167,51 +192,51 @@ describe('query builder', () => {
|
|
|
167
192
|
"bindValues": [
|
|
168
193
|
1,
|
|
169
194
|
],
|
|
170
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
195
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
171
196
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
172
197
|
}
|
|
173
198
|
`)
|
|
174
199
|
expect(dump(db.todos.select('id', 'text').where({ completed: undefined }))).toMatchInlineSnapshot(`
|
|
175
200
|
{
|
|
176
201
|
"bindValues": [],
|
|
177
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
202
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
178
203
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
179
204
|
}
|
|
180
205
|
`)
|
|
181
206
|
expect(
|
|
182
207
|
dump(db.todos.select('id', 'text').where({ deletedAt: { op: '<=', value: new Date('2024-01-01') } })),
|
|
183
208
|
).toMatchInlineSnapshot(`
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
209
|
+
{
|
|
210
|
+
"bindValues": [
|
|
211
|
+
"2024-01-01T00:00:00.000Z",
|
|
212
|
+
],
|
|
213
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" <= ?",
|
|
214
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
215
|
+
}
|
|
216
|
+
`)
|
|
192
217
|
expect(
|
|
193
218
|
dump(db.todos.select('id', 'text').where({ status: { op: 'IN', value: ['active'] } })),
|
|
194
219
|
).toMatchInlineSnapshot(`
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
220
|
+
{
|
|
221
|
+
"bindValues": [
|
|
222
|
+
"active",
|
|
223
|
+
],
|
|
224
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" IN (?)",
|
|
225
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
226
|
+
}
|
|
227
|
+
`)
|
|
203
228
|
expect(
|
|
204
229
|
dump(db.todos.select('id', 'text').where({ status: { op: 'NOT IN', value: ['active', 'completed'] } })),
|
|
205
230
|
).toMatchInlineSnapshot(`
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
231
|
+
{
|
|
232
|
+
"bindValues": [
|
|
233
|
+
"active",
|
|
234
|
+
"completed",
|
|
235
|
+
],
|
|
236
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" NOT IN (?, ?)",
|
|
237
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
238
|
+
}
|
|
239
|
+
`)
|
|
215
240
|
|
|
216
241
|
expect(
|
|
217
242
|
dump(
|
|
@@ -222,15 +247,15 @@ describe('query builder', () => {
|
|
|
222
247
|
.where({ deletedAt: undefined }),
|
|
223
248
|
),
|
|
224
249
|
).toMatchInlineSnapshot(`
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
250
|
+
{
|
|
251
|
+
"bindValues": [
|
|
252
|
+
0,
|
|
253
|
+
"active",
|
|
254
|
+
],
|
|
255
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? AND "status" IN (?)",
|
|
256
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
257
|
+
}
|
|
258
|
+
`)
|
|
234
259
|
})
|
|
235
260
|
|
|
236
261
|
it('should handle OFFSET and LIMIT clauses', () => {
|
|
@@ -241,7 +266,7 @@ describe('query builder', () => {
|
|
|
241
266
|
10,
|
|
242
267
|
10,
|
|
243
268
|
],
|
|
244
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
269
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
245
270
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
246
271
|
}
|
|
247
272
|
`)
|
|
@@ -253,10 +278,10 @@ describe('query builder', () => {
|
|
|
253
278
|
{
|
|
254
279
|
"bindValues": [
|
|
255
280
|
1,
|
|
256
|
-
5,
|
|
257
281
|
10,
|
|
282
|
+
5,
|
|
258
283
|
],
|
|
259
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
284
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
260
285
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
261
286
|
}
|
|
262
287
|
`)
|
|
@@ -268,7 +293,7 @@ describe('query builder', () => {
|
|
|
268
293
|
1,
|
|
269
294
|
5,
|
|
270
295
|
],
|
|
271
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ?",
|
|
296
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? OFFSET ?",
|
|
272
297
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
273
298
|
}
|
|
274
299
|
`)
|
|
@@ -280,7 +305,7 @@ describe('query builder', () => {
|
|
|
280
305
|
1,
|
|
281
306
|
10,
|
|
282
307
|
],
|
|
283
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? LIMIT ?",
|
|
308
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ?",
|
|
284
309
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
285
310
|
}
|
|
286
311
|
`)
|
|
@@ -299,7 +324,7 @@ describe('query builder', () => {
|
|
|
299
324
|
"bindValues": [
|
|
300
325
|
1,
|
|
301
326
|
],
|
|
302
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
327
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
303
328
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
304
329
|
}
|
|
305
330
|
`)
|
|
@@ -308,7 +333,7 @@ describe('query builder', () => {
|
|
|
308
333
|
"bindValues": [
|
|
309
334
|
1,
|
|
310
335
|
],
|
|
311
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
336
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
312
337
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
313
338
|
}
|
|
314
339
|
`)
|
|
@@ -318,14 +343,14 @@ describe('query builder', () => {
|
|
|
318
343
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '=', null))).toMatchInlineSnapshot(`
|
|
319
344
|
{
|
|
320
345
|
"bindValues": [],
|
|
321
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NULL",
|
|
346
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NULL",
|
|
322
347
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
323
348
|
}
|
|
324
349
|
`)
|
|
325
350
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '!=', null))).toMatchInlineSnapshot(`
|
|
326
351
|
{
|
|
327
352
|
"bindValues": [],
|
|
328
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NOT NULL",
|
|
353
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NOT NULL",
|
|
329
354
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
330
355
|
}
|
|
331
356
|
`)
|
|
@@ -335,7 +360,7 @@ describe('query builder', () => {
|
|
|
335
360
|
expect(dump(db.todos.orderBy('completed', 'desc'))).toMatchInlineSnapshot(`
|
|
336
361
|
{
|
|
337
362
|
"bindValues": [],
|
|
338
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
363
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
339
364
|
"schema": "ReadonlyArray<todos>",
|
|
340
365
|
}
|
|
341
366
|
`)
|
|
@@ -343,7 +368,7 @@ describe('query builder', () => {
|
|
|
343
368
|
expect(dump(db.todos.orderBy([{ col: 'completed', direction: 'desc' }]))).toMatchInlineSnapshot(`
|
|
344
369
|
{
|
|
345
370
|
"bindValues": [],
|
|
346
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
371
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
347
372
|
"schema": "ReadonlyArray<todos>",
|
|
348
373
|
}
|
|
349
374
|
`)
|
|
@@ -356,6 +381,131 @@ describe('query builder', () => {
|
|
|
356
381
|
}
|
|
357
382
|
`)
|
|
358
383
|
})
|
|
384
|
+
|
|
385
|
+
it('should handle JSON_CONTAINS operator for JSON array columns', () => {
|
|
386
|
+
expect(
|
|
387
|
+
dump(db.personProfiles.where({ sources: { op: 'JSON_CONTAINS', value: 'google' } })),
|
|
388
|
+
).toMatchInlineSnapshot(`
|
|
389
|
+
{
|
|
390
|
+
"bindValues": [
|
|
391
|
+
"google",
|
|
392
|
+
],
|
|
393
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
394
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
395
|
+
}
|
|
396
|
+
`)
|
|
397
|
+
|
|
398
|
+
// With select
|
|
399
|
+
expect(
|
|
400
|
+
dump(db.personProfiles.select('personId').where({ sources: { op: 'JSON_CONTAINS', value: 'linkedin' } })),
|
|
401
|
+
).toMatchInlineSnapshot(`
|
|
402
|
+
{
|
|
403
|
+
"bindValues": [
|
|
404
|
+
"linkedin",
|
|
405
|
+
],
|
|
406
|
+
"query": "SELECT "personId" FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
407
|
+
"schema": "ReadonlyArray<({ readonly personId: string } <-> string)>",
|
|
408
|
+
}
|
|
409
|
+
`)
|
|
410
|
+
|
|
411
|
+
// With plain string array column
|
|
412
|
+
expect(
|
|
413
|
+
dump(db.personProfiles.where({ tags: { op: 'JSON_CONTAINS', value: 'important' } })),
|
|
414
|
+
).toMatchInlineSnapshot(`
|
|
415
|
+
{
|
|
416
|
+
"bindValues": [
|
|
417
|
+
"important",
|
|
418
|
+
],
|
|
419
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("tags") WHERE value = ?)",
|
|
420
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
421
|
+
}
|
|
422
|
+
`)
|
|
423
|
+
})
|
|
424
|
+
|
|
425
|
+
it('should handle JSON_NOT_CONTAINS operator for JSON array columns', () => {
|
|
426
|
+
expect(
|
|
427
|
+
dump(db.personProfiles.where({ sources: { op: 'JSON_NOT_CONTAINS', value: 'google' } })),
|
|
428
|
+
).toMatchInlineSnapshot(`
|
|
429
|
+
{
|
|
430
|
+
"bindValues": [
|
|
431
|
+
"google",
|
|
432
|
+
],
|
|
433
|
+
"query": "SELECT * FROM 'person_profiles' WHERE NOT EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
434
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
435
|
+
}
|
|
436
|
+
`)
|
|
437
|
+
})
|
|
438
|
+
|
|
439
|
+
it('should JSON-stringify object elements for JSON_CONTAINS', () => {
|
|
440
|
+
expect(
|
|
441
|
+
dump(
|
|
442
|
+
db.personProfiles.where({
|
|
443
|
+
attributes: { op: 'JSON_CONTAINS', value: { key: 'language', value: 'typescript' } },
|
|
444
|
+
}),
|
|
445
|
+
),
|
|
446
|
+
).toMatchInlineSnapshot(`
|
|
447
|
+
{
|
|
448
|
+
"bindValues": [
|
|
449
|
+
"{"key":"language","value":"typescript"}",
|
|
450
|
+
],
|
|
451
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("attributes") WHERE value = ?)",
|
|
452
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
453
|
+
}
|
|
454
|
+
`)
|
|
455
|
+
})
|
|
456
|
+
|
|
457
|
+
it('should handle combining JSON_CONTAINS with other WHERE clauses', () => {
|
|
458
|
+
expect(
|
|
459
|
+
dump(
|
|
460
|
+
db.personProfiles
|
|
461
|
+
.where({ sources: { op: 'JSON_CONTAINS', value: 'google' } })
|
|
462
|
+
.where({ sources: { op: 'JSON_NOT_CONTAINS', value: 'facebook' } }),
|
|
463
|
+
),
|
|
464
|
+
).toMatchInlineSnapshot(`
|
|
465
|
+
{
|
|
466
|
+
"bindValues": [
|
|
467
|
+
"google",
|
|
468
|
+
"facebook",
|
|
469
|
+
],
|
|
470
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?) AND NOT EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
471
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
472
|
+
}
|
|
473
|
+
`)
|
|
474
|
+
})
|
|
475
|
+
|
|
476
|
+
it('should handle JSON_CONTAINS on nullable JSON array columns', () => {
|
|
477
|
+
expect(
|
|
478
|
+
dump(db.personProfiles.where({ optionalTags: { op: 'JSON_CONTAINS', value: 'important' } })),
|
|
479
|
+
).toMatchInlineSnapshot(`
|
|
480
|
+
{
|
|
481
|
+
"bindValues": [
|
|
482
|
+
"important",
|
|
483
|
+
],
|
|
484
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("optionalTags") WHERE value = ?)",
|
|
485
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
486
|
+
}
|
|
487
|
+
`)
|
|
488
|
+
|
|
489
|
+
// With JSON_NOT_CONTAINS
|
|
490
|
+
expect(
|
|
491
|
+
dump(db.personProfiles.where({ optionalTags: { op: 'JSON_NOT_CONTAINS', value: 'archived' } })),
|
|
492
|
+
).toMatchInlineSnapshot(`
|
|
493
|
+
{
|
|
494
|
+
"bindValues": [
|
|
495
|
+
"archived",
|
|
496
|
+
],
|
|
497
|
+
"query": "SELECT * FROM 'person_profiles' WHERE NOT EXISTS (SELECT 1 FROM json_each("optionalTags") WHERE value = ?)",
|
|
498
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
499
|
+
}
|
|
500
|
+
`)
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
it('should throw error when using JSON_CONTAINS on non-JSON array column', () => {
|
|
504
|
+
expect(() =>
|
|
505
|
+
// Type system prevents this at compile time for non-array columns, but test runtime check
|
|
506
|
+
dump(db.todos.where({ status: { op: 'JSON_CONTAINS', value: 'active' } } as any)),
|
|
507
|
+
).toThrow('JSON_CONTAINS operator can only be used on JSON array columns')
|
|
508
|
+
})
|
|
359
509
|
})
|
|
360
510
|
|
|
361
511
|
// describe('getOrCreate queries', () => {
|
|
@@ -402,7 +552,7 @@ describe('query builder', () => {
|
|
|
402
552
|
"Buy milk",
|
|
403
553
|
"active",
|
|
404
554
|
],
|
|
405
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
555
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
406
556
|
"schema": "number",
|
|
407
557
|
}
|
|
408
558
|
`)
|
|
@@ -416,7 +566,7 @@ describe('query builder', () => {
|
|
|
416
566
|
"Buy milk",
|
|
417
567
|
"active",
|
|
418
568
|
],
|
|
419
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
569
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
420
570
|
"schema": "number",
|
|
421
571
|
}
|
|
422
572
|
`)
|
|
@@ -447,7 +597,7 @@ describe('query builder', () => {
|
|
|
447
597
|
"a2",
|
|
448
598
|
"John Doe",
|
|
449
599
|
],
|
|
450
|
-
"query": "INSERT INTO 'issue' (id, title, priority, created, modified, kanbanorder, creator) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
600
|
+
"query": "INSERT INTO 'issue' ("id", "title", "priority", "created", "modified", "kanbanorder", "creator") VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
451
601
|
"schema": "number",
|
|
452
602
|
}
|
|
453
603
|
`)
|
|
@@ -460,7 +610,7 @@ describe('query builder', () => {
|
|
|
460
610
|
"completed",
|
|
461
611
|
"123",
|
|
462
612
|
],
|
|
463
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ?",
|
|
613
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
464
614
|
"schema": "number",
|
|
465
615
|
}
|
|
466
616
|
`)
|
|
@@ -482,7 +632,7 @@ describe('query builder', () => {
|
|
|
482
632
|
"some text",
|
|
483
633
|
"123",
|
|
484
634
|
],
|
|
485
|
-
"query": "UPDATE 'todos' SET text = ? WHERE id = ?",
|
|
635
|
+
"query": "UPDATE 'todos' SET "text" = ? WHERE "id" = ?",
|
|
486
636
|
"schema": "number",
|
|
487
637
|
}
|
|
488
638
|
`)
|
|
@@ -496,7 +646,7 @@ describe('query builder', () => {
|
|
|
496
646
|
"John Doe",
|
|
497
647
|
1,
|
|
498
648
|
],
|
|
499
|
-
"query": "UPDATE 'issue' SET priority = ?, creator = ? WHERE id = ?",
|
|
649
|
+
"query": "UPDATE 'issue' SET "priority" = ?, "creator" = ? WHERE "id" = ?",
|
|
500
650
|
"schema": "number",
|
|
501
651
|
}
|
|
502
652
|
`)
|
|
@@ -508,7 +658,7 @@ describe('query builder', () => {
|
|
|
508
658
|
"bindValues": [
|
|
509
659
|
"completed",
|
|
510
660
|
],
|
|
511
|
-
"query": "DELETE FROM 'todos' WHERE status = ?",
|
|
661
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
512
662
|
"schema": "number",
|
|
513
663
|
}
|
|
514
664
|
`)
|
|
@@ -524,7 +674,7 @@ describe('query builder', () => {
|
|
|
524
674
|
"Buy milk",
|
|
525
675
|
"active",
|
|
526
676
|
],
|
|
527
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO NOTHING",
|
|
677
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
528
678
|
"schema": "number",
|
|
529
679
|
}
|
|
530
680
|
`)
|
|
@@ -544,7 +694,7 @@ describe('query builder', () => {
|
|
|
544
694
|
"Buy soy milk",
|
|
545
695
|
"active",
|
|
546
696
|
],
|
|
547
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET text = ?, status = ?",
|
|
697
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO UPDATE SET "text" = ?, "status" = ?",
|
|
548
698
|
"schema": "number",
|
|
549
699
|
}
|
|
550
700
|
`)
|
|
@@ -558,7 +708,31 @@ describe('query builder', () => {
|
|
|
558
708
|
"Buy milk",
|
|
559
709
|
"active",
|
|
560
710
|
],
|
|
561
|
-
"query": "INSERT OR REPLACE INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
711
|
+
"query": "INSERT OR REPLACE INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
712
|
+
"schema": "number",
|
|
713
|
+
}
|
|
714
|
+
`)
|
|
715
|
+
})
|
|
716
|
+
|
|
717
|
+
it('should quote reserved column names', () => {
|
|
718
|
+
expect(dump(db.selections.insert({ id: 1, group: 'alpha' }).onConflict('id', 'ignore'))).toMatchInlineSnapshot(`
|
|
719
|
+
{
|
|
720
|
+
"bindValues": [
|
|
721
|
+
1,
|
|
722
|
+
"alpha",
|
|
723
|
+
],
|
|
724
|
+
"query": "INSERT INTO 'selections' ("id", "group") VALUES (?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
725
|
+
"schema": "number",
|
|
726
|
+
}
|
|
727
|
+
`)
|
|
728
|
+
|
|
729
|
+
expect(dump(db.selections.update({ group: 'beta' }).where({ id: 1 }))).toMatchInlineSnapshot(`
|
|
730
|
+
{
|
|
731
|
+
"bindValues": [
|
|
732
|
+
"beta",
|
|
733
|
+
1,
|
|
734
|
+
],
|
|
735
|
+
"query": "UPDATE 'selections' SET "group" = ? WHERE "id" = ?",
|
|
562
736
|
"schema": "number",
|
|
563
737
|
}
|
|
564
738
|
`)
|
|
@@ -574,7 +748,7 @@ describe('query builder', () => {
|
|
|
574
748
|
"Buy milk",
|
|
575
749
|
"active",
|
|
576
750
|
],
|
|
577
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id, status) DO NOTHING",
|
|
751
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id", "status") DO NOTHING",
|
|
578
752
|
"schema": "number",
|
|
579
753
|
}
|
|
580
754
|
`)
|
|
@@ -584,36 +758,36 @@ describe('query builder', () => {
|
|
|
584
758
|
expect(
|
|
585
759
|
dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id')),
|
|
586
760
|
).toMatchInlineSnapshot(`
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
761
|
+
{
|
|
762
|
+
"bindValues": [
|
|
763
|
+
"123",
|
|
764
|
+
"Buy milk",
|
|
765
|
+
"active",
|
|
766
|
+
],
|
|
767
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) RETURNING "id"",
|
|
768
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
769
|
+
}
|
|
770
|
+
`)
|
|
597
771
|
|
|
598
772
|
expect(
|
|
599
773
|
dump(db.todos.update({ status: 'completed' }).where({ id: '123' }).returning('id')),
|
|
600
774
|
).toMatchInlineSnapshot(`
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
775
|
+
{
|
|
776
|
+
"bindValues": [
|
|
777
|
+
"completed",
|
|
778
|
+
"123",
|
|
779
|
+
],
|
|
780
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? RETURNING "id"",
|
|
781
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
782
|
+
}
|
|
783
|
+
`)
|
|
610
784
|
|
|
611
785
|
expect(dump(db.todos.delete().where({ status: 'completed' }).returning('id'))).toMatchInlineSnapshot(`
|
|
612
786
|
{
|
|
613
787
|
"bindValues": [
|
|
614
788
|
"completed",
|
|
615
789
|
],
|
|
616
|
-
"query": "DELETE FROM 'todos' WHERE status = ? RETURNING id",
|
|
790
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? RETURNING "id"",
|
|
617
791
|
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
618
792
|
}
|
|
619
793
|
`)
|
|
@@ -625,7 +799,7 @@ describe('query builder', () => {
|
|
|
625
799
|
"bindValues": [
|
|
626
800
|
"completed",
|
|
627
801
|
],
|
|
628
|
-
"query": "DELETE FROM 'todos' WHERE status = ?",
|
|
802
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
629
803
|
"schema": "number",
|
|
630
804
|
}
|
|
631
805
|
`)
|
|
@@ -636,7 +810,7 @@ describe('query builder', () => {
|
|
|
636
810
|
"bindValues": [
|
|
637
811
|
"completed",
|
|
638
812
|
],
|
|
639
|
-
"query": "DELETE FROM 'todos' WHERE status = ? AND deletedAt IS NULL",
|
|
813
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? AND "deletedAt" IS NULL",
|
|
640
814
|
"schema": "number",
|
|
641
815
|
}
|
|
642
816
|
`)
|
|
@@ -649,7 +823,7 @@ describe('query builder', () => {
|
|
|
649
823
|
"completed",
|
|
650
824
|
"123",
|
|
651
825
|
],
|
|
652
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ?",
|
|
826
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
653
827
|
"schema": "number",
|
|
654
828
|
}
|
|
655
829
|
`)
|
|
@@ -663,7 +837,7 @@ describe('query builder', () => {
|
|
|
663
837
|
"completed",
|
|
664
838
|
"123",
|
|
665
839
|
],
|
|
666
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ? AND deletedAt IS NULL",
|
|
840
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? AND "deletedAt" IS NULL",
|
|
667
841
|
"schema": "number",
|
|
668
842
|
}
|
|
669
843
|
`)
|
|
@@ -776,7 +950,7 @@ describe('query builder', () => {
|
|
|
776
950
|
"Lovelace",
|
|
777
951
|
"ada@example.com",
|
|
778
952
|
],
|
|
779
|
-
"query": "INSERT INTO 'contacts' (id, contactFirstName, contactLastName, contactEmail) VALUES (?, ?, ?, ?)",
|
|
953
|
+
"query": "INSERT INTO 'contacts' ("id", "contactFirstName", "contactLastName", "contactEmail") VALUES (?, ?, ?, ?)",
|
|
780
954
|
"usedTables": Set {
|
|
781
955
|
"contacts",
|
|
782
956
|
},
|