@livestore/common 0.4.0-dev.9 → 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 +3 -3
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +5 -7
- package/dist/testing/event-factory.js.map +1 -1
- 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 +67 -15
- 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 +10 -12
- 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,5 +1,6 @@
|
|
|
1
|
-
import { Schema } from '@livestore/utils/effect';
|
|
2
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { Schema } from '@livestore/utils/effect';
|
|
3
|
+
import { objectToString } from '@livestore/utils';
|
|
3
4
|
import { State } from "../../../mod.js";
|
|
4
5
|
import { getResultSchema } from "./impl.js";
|
|
5
6
|
const todos = State.SQLite.table({
|
|
@@ -64,11 +65,31 @@ const issue = State.SQLite.table({
|
|
|
64
65
|
{ name: 'issue_created', columns: ['created'] },
|
|
65
66
|
],
|
|
66
67
|
});
|
|
67
|
-
const
|
|
68
|
+
const selections = State.SQLite.table({
|
|
69
|
+
name: 'selections',
|
|
70
|
+
columns: {
|
|
71
|
+
id: State.SQLite.integer({ primaryKey: true }),
|
|
72
|
+
group: State.SQLite.text({}),
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
const Source = Schema.Literal('google', 'linkedin', 'facebook');
|
|
76
|
+
const ProfileAttribute = Schema.Struct({ key: Schema.String, value: Schema.String });
|
|
77
|
+
const personProfiles = State.SQLite.table({
|
|
78
|
+
name: 'person_profiles',
|
|
79
|
+
columns: {
|
|
80
|
+
personId: State.SQLite.text({ primaryKey: true }),
|
|
81
|
+
sources: State.SQLite.json({ schema: Schema.Array(Source), default: [] }),
|
|
82
|
+
tags: State.SQLite.json({ schema: Schema.Array(Schema.String), default: [] }),
|
|
83
|
+
attributes: State.SQLite.json({ schema: Schema.Array(ProfileAttribute), default: [] }),
|
|
84
|
+
/** Nullable JSON array column for testing JSON_CONTAINS on nullable columns */
|
|
85
|
+
optionalTags: State.SQLite.json({ schema: Schema.Array(Schema.String), nullable: true }),
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
const db = { todos, todosWithIntId, comments, issue, selections, UiState, UiStateWithDefaultId, personProfiles };
|
|
68
89
|
const dump = (qb) => ({
|
|
69
90
|
bindValues: qb.asSql().bindValues,
|
|
70
91
|
query: qb.asSql().query,
|
|
71
|
-
schema: getResultSchema(qb)
|
|
92
|
+
schema: objectToString(getResultSchema(qb)),
|
|
72
93
|
});
|
|
73
94
|
describe('query builder', () => {
|
|
74
95
|
describe('basic queries', () => {
|
|
@@ -83,14 +104,14 @@ describe('query builder', () => {
|
|
|
83
104
|
expect(dump(db.todos.select('id'))).toMatchInlineSnapshot(`
|
|
84
105
|
{
|
|
85
106
|
"bindValues": [],
|
|
86
|
-
"query": "SELECT id FROM 'todos'",
|
|
107
|
+
"query": "SELECT "id" FROM 'todos'",
|
|
87
108
|
"schema": "ReadonlyArray<({ readonly id: string } <-> string)>",
|
|
88
109
|
}
|
|
89
110
|
`);
|
|
90
111
|
expect(dump(db.todos.select('id', 'text'))).toMatchInlineSnapshot(`
|
|
91
112
|
{
|
|
92
113
|
"bindValues": [],
|
|
93
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
114
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
94
115
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
95
116
|
}
|
|
96
117
|
`);
|
|
@@ -101,7 +122,7 @@ describe('query builder', () => {
|
|
|
101
122
|
"bindValues": [
|
|
102
123
|
1,
|
|
103
124
|
],
|
|
104
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
125
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
105
126
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string } | undefined> <-> { readonly id: string; readonly text: string } | undefined)",
|
|
106
127
|
}
|
|
107
128
|
`);
|
|
@@ -110,7 +131,7 @@ describe('query builder', () => {
|
|
|
110
131
|
"bindValues": [
|
|
111
132
|
1,
|
|
112
133
|
],
|
|
113
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
134
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
114
135
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> <-> { readonly id: string; readonly text: string })",
|
|
115
136
|
}
|
|
116
137
|
`);
|
|
@@ -119,7 +140,7 @@ describe('query builder', () => {
|
|
|
119
140
|
"bindValues": [
|
|
120
141
|
1,
|
|
121
142
|
],
|
|
122
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
143
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
123
144
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> | readonly [undefined] <-> { readonly id: string; readonly text: string } | undefined)",
|
|
124
145
|
}
|
|
125
146
|
`);
|
|
@@ -130,7 +151,7 @@ describe('query builder', () => {
|
|
|
130
151
|
"bindValues": [
|
|
131
152
|
1,
|
|
132
153
|
],
|
|
133
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
154
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
134
155
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
135
156
|
}
|
|
136
157
|
`);
|
|
@@ -139,7 +160,7 @@ describe('query builder', () => {
|
|
|
139
160
|
"bindValues": [
|
|
140
161
|
1,
|
|
141
162
|
],
|
|
142
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed != ?",
|
|
163
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" != ?",
|
|
143
164
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
144
165
|
}
|
|
145
166
|
`);
|
|
@@ -148,59 +169,59 @@ describe('query builder', () => {
|
|
|
148
169
|
"bindValues": [
|
|
149
170
|
1,
|
|
150
171
|
],
|
|
151
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
172
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
152
173
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
153
174
|
}
|
|
154
175
|
`);
|
|
155
176
|
expect(dump(db.todos.select('id', 'text').where({ completed: undefined }))).toMatchInlineSnapshot(`
|
|
156
177
|
{
|
|
157
178
|
"bindValues": [],
|
|
158
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
179
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
159
180
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
160
181
|
}
|
|
161
182
|
`);
|
|
162
183
|
expect(dump(db.todos.select('id', 'text').where({ deletedAt: { op: '<=', value: new Date('2024-01-01') } }))).toMatchInlineSnapshot(`
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
184
|
+
{
|
|
185
|
+
"bindValues": [
|
|
186
|
+
"2024-01-01T00:00:00.000Z",
|
|
187
|
+
],
|
|
188
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" <= ?",
|
|
189
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
190
|
+
}
|
|
191
|
+
`);
|
|
171
192
|
expect(dump(db.todos.select('id', 'text').where({ status: { op: 'IN', value: ['active'] } }))).toMatchInlineSnapshot(`
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
193
|
+
{
|
|
194
|
+
"bindValues": [
|
|
195
|
+
"active",
|
|
196
|
+
],
|
|
197
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" IN (?)",
|
|
198
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
199
|
+
}
|
|
200
|
+
`);
|
|
180
201
|
expect(dump(db.todos.select('id', 'text').where({ status: { op: 'NOT IN', value: ['active', 'completed'] } }))).toMatchInlineSnapshot(`
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
202
|
+
{
|
|
203
|
+
"bindValues": [
|
|
204
|
+
"active",
|
|
205
|
+
"completed",
|
|
206
|
+
],
|
|
207
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" NOT IN (?, ?)",
|
|
208
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
209
|
+
}
|
|
210
|
+
`);
|
|
190
211
|
expect(dump(db.todos
|
|
191
212
|
.select('id', 'text')
|
|
192
213
|
.where({ completed: false })
|
|
193
214
|
.where({ status: { op: 'IN', value: ['active'] } })
|
|
194
215
|
.where({ deletedAt: undefined }))).toMatchInlineSnapshot(`
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
216
|
+
{
|
|
217
|
+
"bindValues": [
|
|
218
|
+
0,
|
|
219
|
+
"active",
|
|
220
|
+
],
|
|
221
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? AND "status" IN (?)",
|
|
222
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
223
|
+
}
|
|
224
|
+
`);
|
|
204
225
|
});
|
|
205
226
|
it('should handle OFFSET and LIMIT clauses', () => {
|
|
206
227
|
expect(dump(db.todos.select('id', 'text').where('completed', true).offset(10).limit(10))).toMatchInlineSnapshot(`
|
|
@@ -210,7 +231,7 @@ describe('query builder', () => {
|
|
|
210
231
|
10,
|
|
211
232
|
10,
|
|
212
233
|
],
|
|
213
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
234
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
214
235
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
215
236
|
}
|
|
216
237
|
`);
|
|
@@ -221,10 +242,10 @@ describe('query builder', () => {
|
|
|
221
242
|
{
|
|
222
243
|
"bindValues": [
|
|
223
244
|
1,
|
|
224
|
-
5,
|
|
225
245
|
10,
|
|
246
|
+
5,
|
|
226
247
|
],
|
|
227
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
248
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
228
249
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
229
250
|
}
|
|
230
251
|
`);
|
|
@@ -235,7 +256,7 @@ describe('query builder', () => {
|
|
|
235
256
|
1,
|
|
236
257
|
5,
|
|
237
258
|
],
|
|
238
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ?",
|
|
259
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? OFFSET ?",
|
|
239
260
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
240
261
|
}
|
|
241
262
|
`);
|
|
@@ -246,7 +267,7 @@ describe('query builder', () => {
|
|
|
246
267
|
1,
|
|
247
268
|
10,
|
|
248
269
|
],
|
|
249
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? LIMIT ?",
|
|
270
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ?",
|
|
250
271
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
251
272
|
}
|
|
252
273
|
`);
|
|
@@ -264,7 +285,7 @@ describe('query builder', () => {
|
|
|
264
285
|
"bindValues": [
|
|
265
286
|
1,
|
|
266
287
|
],
|
|
267
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
288
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
268
289
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
269
290
|
}
|
|
270
291
|
`);
|
|
@@ -273,7 +294,7 @@ describe('query builder', () => {
|
|
|
273
294
|
"bindValues": [
|
|
274
295
|
1,
|
|
275
296
|
],
|
|
276
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
297
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
277
298
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
278
299
|
}
|
|
279
300
|
`);
|
|
@@ -282,14 +303,14 @@ describe('query builder', () => {
|
|
|
282
303
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '=', null))).toMatchInlineSnapshot(`
|
|
283
304
|
{
|
|
284
305
|
"bindValues": [],
|
|
285
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NULL",
|
|
306
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NULL",
|
|
286
307
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
287
308
|
}
|
|
288
309
|
`);
|
|
289
310
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '!=', null))).toMatchInlineSnapshot(`
|
|
290
311
|
{
|
|
291
312
|
"bindValues": [],
|
|
292
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NOT NULL",
|
|
313
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NOT NULL",
|
|
293
314
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
294
315
|
}
|
|
295
316
|
`);
|
|
@@ -298,14 +319,14 @@ describe('query builder', () => {
|
|
|
298
319
|
expect(dump(db.todos.orderBy('completed', 'desc'))).toMatchInlineSnapshot(`
|
|
299
320
|
{
|
|
300
321
|
"bindValues": [],
|
|
301
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
322
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
302
323
|
"schema": "ReadonlyArray<todos>",
|
|
303
324
|
}
|
|
304
325
|
`);
|
|
305
326
|
expect(dump(db.todos.orderBy([{ col: 'completed', direction: 'desc' }]))).toMatchInlineSnapshot(`
|
|
306
327
|
{
|
|
307
328
|
"bindValues": [],
|
|
308
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
329
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
309
330
|
"schema": "ReadonlyArray<todos>",
|
|
310
331
|
}
|
|
311
332
|
`);
|
|
@@ -317,6 +338,101 @@ describe('query builder', () => {
|
|
|
317
338
|
}
|
|
318
339
|
`);
|
|
319
340
|
});
|
|
341
|
+
it('should handle JSON_CONTAINS operator for JSON array columns', () => {
|
|
342
|
+
expect(dump(db.personProfiles.where({ sources: { op: 'JSON_CONTAINS', value: 'google' } }))).toMatchInlineSnapshot(`
|
|
343
|
+
{
|
|
344
|
+
"bindValues": [
|
|
345
|
+
"google",
|
|
346
|
+
],
|
|
347
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
348
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
349
|
+
}
|
|
350
|
+
`);
|
|
351
|
+
// With select
|
|
352
|
+
expect(dump(db.personProfiles.select('personId').where({ sources: { op: 'JSON_CONTAINS', value: 'linkedin' } }))).toMatchInlineSnapshot(`
|
|
353
|
+
{
|
|
354
|
+
"bindValues": [
|
|
355
|
+
"linkedin",
|
|
356
|
+
],
|
|
357
|
+
"query": "SELECT "personId" FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
358
|
+
"schema": "ReadonlyArray<({ readonly personId: string } <-> string)>",
|
|
359
|
+
}
|
|
360
|
+
`);
|
|
361
|
+
// With plain string array column
|
|
362
|
+
expect(dump(db.personProfiles.where({ tags: { op: 'JSON_CONTAINS', value: 'important' } }))).toMatchInlineSnapshot(`
|
|
363
|
+
{
|
|
364
|
+
"bindValues": [
|
|
365
|
+
"important",
|
|
366
|
+
],
|
|
367
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("tags") WHERE value = ?)",
|
|
368
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
369
|
+
}
|
|
370
|
+
`);
|
|
371
|
+
});
|
|
372
|
+
it('should handle JSON_NOT_CONTAINS operator for JSON array columns', () => {
|
|
373
|
+
expect(dump(db.personProfiles.where({ sources: { op: 'JSON_NOT_CONTAINS', value: 'google' } }))).toMatchInlineSnapshot(`
|
|
374
|
+
{
|
|
375
|
+
"bindValues": [
|
|
376
|
+
"google",
|
|
377
|
+
],
|
|
378
|
+
"query": "SELECT * FROM 'person_profiles' WHERE NOT EXISTS (SELECT 1 FROM json_each("sources") WHERE value = ?)",
|
|
379
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
380
|
+
}
|
|
381
|
+
`);
|
|
382
|
+
});
|
|
383
|
+
it('should JSON-stringify object elements for JSON_CONTAINS', () => {
|
|
384
|
+
expect(dump(db.personProfiles.where({
|
|
385
|
+
attributes: { op: 'JSON_CONTAINS', value: { key: 'language', value: 'typescript' } },
|
|
386
|
+
}))).toMatchInlineSnapshot(`
|
|
387
|
+
{
|
|
388
|
+
"bindValues": [
|
|
389
|
+
"{"key":"language","value":"typescript"}",
|
|
390
|
+
],
|
|
391
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("attributes") WHERE value = ?)",
|
|
392
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
393
|
+
}
|
|
394
|
+
`);
|
|
395
|
+
});
|
|
396
|
+
it('should handle combining JSON_CONTAINS with other WHERE clauses', () => {
|
|
397
|
+
expect(dump(db.personProfiles
|
|
398
|
+
.where({ sources: { op: 'JSON_CONTAINS', value: 'google' } })
|
|
399
|
+
.where({ sources: { op: 'JSON_NOT_CONTAINS', value: 'facebook' } }))).toMatchInlineSnapshot(`
|
|
400
|
+
{
|
|
401
|
+
"bindValues": [
|
|
402
|
+
"google",
|
|
403
|
+
"facebook",
|
|
404
|
+
],
|
|
405
|
+
"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 = ?)",
|
|
406
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
407
|
+
}
|
|
408
|
+
`);
|
|
409
|
+
});
|
|
410
|
+
it('should handle JSON_CONTAINS on nullable JSON array columns', () => {
|
|
411
|
+
expect(dump(db.personProfiles.where({ optionalTags: { op: 'JSON_CONTAINS', value: 'important' } }))).toMatchInlineSnapshot(`
|
|
412
|
+
{
|
|
413
|
+
"bindValues": [
|
|
414
|
+
"important",
|
|
415
|
+
],
|
|
416
|
+
"query": "SELECT * FROM 'person_profiles' WHERE EXISTS (SELECT 1 FROM json_each("optionalTags") WHERE value = ?)",
|
|
417
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
418
|
+
}
|
|
419
|
+
`);
|
|
420
|
+
// With JSON_NOT_CONTAINS
|
|
421
|
+
expect(dump(db.personProfiles.where({ optionalTags: { op: 'JSON_NOT_CONTAINS', value: 'archived' } }))).toMatchInlineSnapshot(`
|
|
422
|
+
{
|
|
423
|
+
"bindValues": [
|
|
424
|
+
"archived",
|
|
425
|
+
],
|
|
426
|
+
"query": "SELECT * FROM 'person_profiles' WHERE NOT EXISTS (SELECT 1 FROM json_each("optionalTags") WHERE value = ?)",
|
|
427
|
+
"schema": "ReadonlyArray<person_profiles>",
|
|
428
|
+
}
|
|
429
|
+
`);
|
|
430
|
+
});
|
|
431
|
+
it('should throw error when using JSON_CONTAINS on non-JSON array column', () => {
|
|
432
|
+
expect(() =>
|
|
433
|
+
// Type system prevents this at compile time for non-array columns, but test runtime check
|
|
434
|
+
dump(db.todos.where({ status: { op: 'JSON_CONTAINS', value: 'active' } }))).toThrow('JSON_CONTAINS operator can only be used on JSON array columns');
|
|
435
|
+
});
|
|
320
436
|
});
|
|
321
437
|
// describe('getOrCreate queries', () => {
|
|
322
438
|
// it('should handle getOrCreate queries', () => {
|
|
@@ -360,7 +476,7 @@ describe('query builder', () => {
|
|
|
360
476
|
"Buy milk",
|
|
361
477
|
"active",
|
|
362
478
|
],
|
|
363
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
479
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
364
480
|
"schema": "number",
|
|
365
481
|
}
|
|
366
482
|
`);
|
|
@@ -373,7 +489,7 @@ describe('query builder', () => {
|
|
|
373
489
|
"Buy milk",
|
|
374
490
|
"active",
|
|
375
491
|
],
|
|
376
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
492
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
377
493
|
"schema": "number",
|
|
378
494
|
}
|
|
379
495
|
`);
|
|
@@ -399,7 +515,7 @@ describe('query builder', () => {
|
|
|
399
515
|
"a2",
|
|
400
516
|
"John Doe",
|
|
401
517
|
],
|
|
402
|
-
"query": "INSERT INTO 'issue' (id, title, priority, created, modified, kanbanorder, creator) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
518
|
+
"query": "INSERT INTO 'issue' ("id", "title", "priority", "created", "modified", "kanbanorder", "creator") VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
403
519
|
"schema": "number",
|
|
404
520
|
}
|
|
405
521
|
`);
|
|
@@ -411,7 +527,7 @@ describe('query builder', () => {
|
|
|
411
527
|
"completed",
|
|
412
528
|
"123",
|
|
413
529
|
],
|
|
414
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ?",
|
|
530
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
415
531
|
"schema": "number",
|
|
416
532
|
}
|
|
417
533
|
`);
|
|
@@ -431,7 +547,7 @@ describe('query builder', () => {
|
|
|
431
547
|
"some text",
|
|
432
548
|
"123",
|
|
433
549
|
],
|
|
434
|
-
"query": "UPDATE 'todos' SET text = ? WHERE id = ?",
|
|
550
|
+
"query": "UPDATE 'todos' SET "text" = ? WHERE "id" = ?",
|
|
435
551
|
"schema": "number",
|
|
436
552
|
}
|
|
437
553
|
`);
|
|
@@ -444,7 +560,7 @@ describe('query builder', () => {
|
|
|
444
560
|
"John Doe",
|
|
445
561
|
1,
|
|
446
562
|
],
|
|
447
|
-
"query": "UPDATE 'issue' SET priority = ?, creator = ? WHERE id = ?",
|
|
563
|
+
"query": "UPDATE 'issue' SET "priority" = ?, "creator" = ? WHERE "id" = ?",
|
|
448
564
|
"schema": "number",
|
|
449
565
|
}
|
|
450
566
|
`);
|
|
@@ -455,7 +571,7 @@ describe('query builder', () => {
|
|
|
455
571
|
"bindValues": [
|
|
456
572
|
"completed",
|
|
457
573
|
],
|
|
458
|
-
"query": "DELETE FROM 'todos' WHERE status = ?",
|
|
574
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
459
575
|
"schema": "number",
|
|
460
576
|
}
|
|
461
577
|
`);
|
|
@@ -468,7 +584,7 @@ describe('query builder', () => {
|
|
|
468
584
|
"Buy milk",
|
|
469
585
|
"active",
|
|
470
586
|
],
|
|
471
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO NOTHING",
|
|
587
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
472
588
|
"schema": "number",
|
|
473
589
|
}
|
|
474
590
|
`);
|
|
@@ -483,7 +599,7 @@ describe('query builder', () => {
|
|
|
483
599
|
"Buy soy milk",
|
|
484
600
|
"active",
|
|
485
601
|
],
|
|
486
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET text = ?, status = ?",
|
|
602
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO UPDATE SET "text" = ?, "status" = ?",
|
|
487
603
|
"schema": "number",
|
|
488
604
|
}
|
|
489
605
|
`);
|
|
@@ -494,7 +610,29 @@ describe('query builder', () => {
|
|
|
494
610
|
"Buy milk",
|
|
495
611
|
"active",
|
|
496
612
|
],
|
|
497
|
-
"query": "INSERT OR REPLACE INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
613
|
+
"query": "INSERT OR REPLACE INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
614
|
+
"schema": "number",
|
|
615
|
+
}
|
|
616
|
+
`);
|
|
617
|
+
});
|
|
618
|
+
it('should quote reserved column names', () => {
|
|
619
|
+
expect(dump(db.selections.insert({ id: 1, group: 'alpha' }).onConflict('id', 'ignore'))).toMatchInlineSnapshot(`
|
|
620
|
+
{
|
|
621
|
+
"bindValues": [
|
|
622
|
+
1,
|
|
623
|
+
"alpha",
|
|
624
|
+
],
|
|
625
|
+
"query": "INSERT INTO 'selections' ("id", "group") VALUES (?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
626
|
+
"schema": "number",
|
|
627
|
+
}
|
|
628
|
+
`);
|
|
629
|
+
expect(dump(db.selections.update({ group: 'beta' }).where({ id: 1 }))).toMatchInlineSnapshot(`
|
|
630
|
+
{
|
|
631
|
+
"bindValues": [
|
|
632
|
+
"beta",
|
|
633
|
+
1,
|
|
634
|
+
],
|
|
635
|
+
"query": "UPDATE 'selections' SET "group" = ? WHERE "id" = ?",
|
|
498
636
|
"schema": "number",
|
|
499
637
|
}
|
|
500
638
|
`);
|
|
@@ -507,39 +645,39 @@ describe('query builder', () => {
|
|
|
507
645
|
"Buy milk",
|
|
508
646
|
"active",
|
|
509
647
|
],
|
|
510
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id, status) DO NOTHING",
|
|
648
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id", "status") DO NOTHING",
|
|
511
649
|
"schema": "number",
|
|
512
650
|
}
|
|
513
651
|
`);
|
|
514
652
|
});
|
|
515
653
|
it('should handle RETURNING clause', () => {
|
|
516
654
|
expect(dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id'))).toMatchInlineSnapshot(`
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
655
|
+
{
|
|
656
|
+
"bindValues": [
|
|
657
|
+
"123",
|
|
658
|
+
"Buy milk",
|
|
659
|
+
"active",
|
|
660
|
+
],
|
|
661
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) RETURNING "id"",
|
|
662
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
663
|
+
}
|
|
664
|
+
`);
|
|
527
665
|
expect(dump(db.todos.update({ status: 'completed' }).where({ id: '123' }).returning('id'))).toMatchInlineSnapshot(`
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
666
|
+
{
|
|
667
|
+
"bindValues": [
|
|
668
|
+
"completed",
|
|
669
|
+
"123",
|
|
670
|
+
],
|
|
671
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? RETURNING "id"",
|
|
672
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
673
|
+
}
|
|
674
|
+
`);
|
|
537
675
|
expect(dump(db.todos.delete().where({ status: 'completed' }).returning('id'))).toMatchInlineSnapshot(`
|
|
538
676
|
{
|
|
539
677
|
"bindValues": [
|
|
540
678
|
"completed",
|
|
541
679
|
],
|
|
542
|
-
"query": "DELETE FROM 'todos' WHERE status = ? RETURNING id",
|
|
680
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? RETURNING "id"",
|
|
543
681
|
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
544
682
|
}
|
|
545
683
|
`);
|
|
@@ -550,7 +688,7 @@ describe('query builder', () => {
|
|
|
550
688
|
"bindValues": [
|
|
551
689
|
"completed",
|
|
552
690
|
],
|
|
553
|
-
"query": "DELETE FROM 'todos' WHERE status = ?",
|
|
691
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
554
692
|
"schema": "number",
|
|
555
693
|
}
|
|
556
694
|
`);
|
|
@@ -560,7 +698,7 @@ describe('query builder', () => {
|
|
|
560
698
|
"bindValues": [
|
|
561
699
|
"completed",
|
|
562
700
|
],
|
|
563
|
-
"query": "DELETE FROM 'todos' WHERE status = ? AND deletedAt IS NULL",
|
|
701
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? AND "deletedAt" IS NULL",
|
|
564
702
|
"schema": "number",
|
|
565
703
|
}
|
|
566
704
|
`);
|
|
@@ -572,7 +710,7 @@ describe('query builder', () => {
|
|
|
572
710
|
"completed",
|
|
573
711
|
"123",
|
|
574
712
|
],
|
|
575
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ?",
|
|
713
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
576
714
|
"schema": "number",
|
|
577
715
|
}
|
|
578
716
|
`);
|
|
@@ -583,7 +721,7 @@ describe('query builder', () => {
|
|
|
583
721
|
"completed",
|
|
584
722
|
"123",
|
|
585
723
|
],
|
|
586
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ? AND deletedAt IS NULL",
|
|
724
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? AND "deletedAt" IS NULL",
|
|
587
725
|
"schema": "number",
|
|
588
726
|
}
|
|
589
727
|
`);
|
|
@@ -656,7 +794,7 @@ describe('query builder', () => {
|
|
|
656
794
|
"Lovelace",
|
|
657
795
|
"ada@example.com",
|
|
658
796
|
],
|
|
659
|
-
"query": "INSERT INTO 'contacts' (id, contactFirstName, contactLastName, contactEmail) VALUES (?, ?, ?, ?)",
|
|
797
|
+
"query": "INSERT INTO 'contacts' ("id", "contactFirstName", "contactLastName", "contactEmail") VALUES (?, ?, ?, ?)",
|
|
660
798
|
"usedTables": Set {
|
|
661
799
|
"contacts",
|
|
662
800
|
},
|