@livestore/common 0.4.0-dev.2 → 0.4.0-dev.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts +20 -12
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/ClientSessionLeaderThreadProxy.js.map +1 -1
- package/dist/adapter-types.d.ts +14 -6
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js.map +1 -1
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +33 -6
- package/dist/debug-info.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +28 -23
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +2 -2
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +7 -14
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +1 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +38 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +9 -8
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-sessioninfo.d.ts +14 -2
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +7 -4
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +13 -2
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +10 -3
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +52 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +25 -6
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +41 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +158 -75
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +21 -22
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +77 -20
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +2 -2
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +56 -45
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +6 -6
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +79 -27
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts +2 -0
- package/dist/leader-thread/make-leader-thread-layer.test.d.ts.map +1 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js +32 -0
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -0
- package/dist/leader-thread/materialize-event.d.ts +3 -3
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +25 -11
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.d.ts +1 -0
- package/dist/leader-thread/mod.d.ts.map +1 -1
- package/dist/leader-thread/mod.js +1 -0
- package/dist/leader-thread/mod.js.map +1 -1
- package/dist/leader-thread/recreate-db.d.ts +2 -3
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +5 -5
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -2
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -2
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +56 -0
- package/dist/leader-thread/stream-events.d.ts.map +1 -0
- package/dist/leader-thread/stream-events.js +166 -0
- package/dist/leader-thread/stream-events.js.map +1 -0
- package/dist/leader-thread/types.d.ts +98 -20
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +13 -0
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +40 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +33 -0
- package/dist/logging.js.map +1 -0
- package/dist/make-client-session.d.ts +5 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -2
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +6 -6
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +20 -4
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +5 -0
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +2 -2
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +29 -20
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +147 -0
- package/dist/schema/EventDef/define.d.ts.map +1 -0
- package/dist/schema/EventDef/define.js +139 -0
- package/dist/schema/EventDef/define.js.map +1 -0
- package/dist/schema/EventDef/event-def.d.ts +106 -0
- package/dist/schema/EventDef/event-def.d.ts.map +1 -0
- package/dist/schema/EventDef/event-def.js +2 -0
- package/dist/schema/EventDef/event-def.js.map +1 -0
- package/dist/schema/EventDef/facts.d.ts +118 -0
- package/dist/schema/EventDef/facts.d.ts.map +1 -0
- package/dist/schema/EventDef/facts.js +53 -0
- package/dist/schema/EventDef/facts.js.map +1 -0
- package/dist/schema/EventDef/materializer.d.ts +155 -0
- package/dist/schema/EventDef/materializer.d.ts.map +1 -0
- package/dist/schema/EventDef/materializer.js +83 -0
- package/dist/schema/EventDef/materializer.js.map +1 -0
- package/dist/schema/EventDef/mod.d.ts +5 -0
- package/dist/schema/EventDef/mod.d.ts.map +1 -0
- package/dist/schema/EventDef/mod.js +5 -0
- package/dist/schema/EventDef/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber/client.d.ts +136 -0
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/client.js +193 -0
- package/dist/schema/EventSequenceNumber/client.js.map +1 -0
- package/dist/schema/EventSequenceNumber/global.d.ts +15 -0
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/global.js +14 -0
- package/dist/schema/EventSequenceNumber/global.js.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts +37 -0
- package/dist/schema/EventSequenceNumber/mod.d.ts.map +1 -0
- package/dist/schema/EventSequenceNumber/mod.js +37 -0
- package/dist/schema/EventSequenceNumber/mod.js.map +1 -0
- package/dist/schema/EventSequenceNumber.test.js +43 -43
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/{LiveStoreEvent.d.ts → LiveStoreEvent/client.d.ts} +89 -106
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -0
- package/dist/schema/{LiveStoreEvent.js → LiveStoreEvent/client.js} +74 -58
- package/dist/schema/LiveStoreEvent/client.js.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +52 -0
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js +2 -0
- package/dist/schema/LiveStoreEvent/for-event-def.js.map +1 -0
- package/dist/schema/LiveStoreEvent/global.d.ts +36 -0
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/global.js +31 -0
- package/dist/schema/LiveStoreEvent/global.js.map +1 -0
- package/dist/schema/LiveStoreEvent/input.d.ts +46 -0
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/input.js +26 -0
- package/dist/schema/LiveStoreEvent/input.js.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts +5 -0
- package/dist/schema/LiveStoreEvent/mod.d.ts.map +1 -0
- package/dist/schema/LiveStoreEvent/mod.js +5 -0
- package/dist/schema/LiveStoreEvent/mod.js.map +1 -0
- package/dist/schema/events.d.ts +1 -1
- package/dist/schema/events.d.ts.map +1 -1
- package/dist/schema/events.js +1 -1
- package/dist/schema/events.js.map +1 -1
- package/dist/schema/mod.d.ts +6 -4
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +5 -4
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +16 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +27 -2
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.d.ts +36 -6
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +97 -6
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +16 -0
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +14 -6
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +69 -22
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +48 -10
- package/dist/schema/state/sqlite/column-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-spec.js +30 -12
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +23 -14
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +2 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +23 -6
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +14 -8
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +5 -3
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +2 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/mod.d.ts +3 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +3 -3
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/api.d.ts +19 -11
- package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/astToSql.js +22 -15
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +6 -3
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +252 -88
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.d.ts +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +22 -12
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts +2 -0
- package/dist/schema/state/sqlite/schema-helpers.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js +36 -0
- package/dist/schema/state/sqlite/schema-helpers.test.js.map +1 -0
- package/dist/schema/state/sqlite/{system-tables.d.ts → system-tables/eventlog-tables.d.ts} +63 -456
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +54 -0
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/mod.js +3 -0
- package/dist/schema/state/sqlite/system-tables/mod.js.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +456 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js +55 -0
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -0
- package/dist/schema/state/sqlite/table-def.d.ts +4 -4
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +2 -2
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +80 -0
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts +47 -0
- package/dist/schema/unknown-events.d.ts.map +1 -0
- package/dist/schema/unknown-events.js +69 -0
- package/dist/schema/unknown-events.js.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts +2 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.d.ts.map +1 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +73 -0
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -0
- package/dist/schema-management/migrations.d.ts +32 -2
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +37 -5
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts +3 -3
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +2 -2
- package/dist/schema-management/validate-schema.js.map +1 -1
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -1
- package/dist/sql-queries/sql-queries.js.map +1 -1
- package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
- package/dist/sql-queries/sql-query-builder.js +2 -1
- package/dist/sql-queries/sql-query-builder.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -3
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +11 -13
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +45 -42
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +66 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/errors.js +36 -0
- package/dist/sync/errors.js.map +1 -0
- package/dist/sync/index.d.ts +3 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/mock-sync-backend.d.ts +23 -0
- package/dist/sync/mock-sync-backend.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.js +114 -0
- package/dist/sync/mock-sync-backend.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +6 -7
- package/dist/sync/next/compact-events.js.map +1 -1
- package/dist/sync/next/facts.d.ts +5 -5
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +1 -2
- package/dist/sync/next/facts.js.map +1 -1
- package/dist/sync/next/history-dag-common.d.ts +54 -15
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +198 -9
- package/dist/sync/next/history-dag-common.js.map +1 -1
- package/dist/sync/next/history-dag.d.ts.map +1 -1
- package/dist/sync/next/history-dag.js +10 -8
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/rebase-events.d.ts +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +5 -5
- package/dist/sync/next/rebase-events.js.map +1 -1
- package/dist/sync/next/test/event-fixtures.d.ts +2 -2
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +9 -9
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/sync-backend-kv.d.ts +7 -0
- package/dist/sync/sync-backend-kv.d.ts.map +1 -0
- package/dist/sync/sync-backend-kv.js +18 -0
- package/dist/sync/sync-backend-kv.js.map +1 -0
- package/dist/sync/sync-backend.d.ts +105 -0
- package/dist/sync/sync-backend.d.ts.map +1 -0
- package/dist/sync/sync-backend.js +61 -0
- package/dist/sync/sync-backend.js.map +1 -0
- package/dist/sync/sync.d.ts +9 -86
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -27
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/syncstate.d.ts +57 -44
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +50 -45
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +83 -46
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +36 -0
- package/dist/sync/transport-chunking.d.ts.map +1 -0
- package/dist/sync/transport-chunking.js +56 -0
- package/dist/sync/transport-chunking.js.map +1 -0
- package/dist/sync/validate-push-payload.d.ts +2 -2
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +6 -6
- package/dist/sync/validate-push-payload.js.map +1 -1
- package/dist/testing/event-factory.d.ts +68 -0
- package/dist/testing/event-factory.d.ts.map +1 -0
- package/dist/testing/event-factory.js +78 -0
- package/dist/testing/event-factory.js.map +1 -0
- package/dist/testing/mod.d.ts +2 -0
- package/dist/testing/mod.d.ts.map +1 -0
- package/dist/testing/mod.js +2 -0
- package/dist/testing/mod.js.map +1 -0
- package/dist/version.d.ts +16 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +16 -6
- package/dist/version.js.map +1 -1
- package/package.json +7 -8
- package/src/ClientSessionLeaderThreadProxy.ts +20 -12
- package/src/adapter-types.ts +18 -6
- package/src/debug-info.ts +37 -6
- package/src/devtools/devtools-messages-client-session.ts +2 -2
- package/src/devtools/devtools-messages-common.ts +1 -8
- package/src/devtools/devtools-messages-leader.ts +9 -8
- package/src/devtools/devtools-sessioninfo.ts +8 -5
- package/src/devtools/mod.ts +11 -2
- package/src/errors.ts +38 -11
- package/src/index.ts +2 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +277 -105
- package/src/leader-thread/eventlog.ts +113 -38
- package/src/leader-thread/leader-worker-devtools.ts +86 -55
- package/src/leader-thread/make-leader-thread-layer.test.ts +44 -0
- package/src/leader-thread/make-leader-thread-layer.ts +156 -37
- package/src/leader-thread/materialize-event.ts +37 -12
- package/src/leader-thread/mod.ts +1 -0
- package/src/leader-thread/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/stream-events.ts +201 -0
- package/src/leader-thread/types.ts +70 -20
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- package/src/otel.ts +10 -0
- package/src/rematerialize-from-eventlog.ts +37 -27
- package/src/schema/EventDef/define.ts +201 -0
- package/src/schema/EventDef/event-def.ts +120 -0
- package/src/schema/EventDef/facts.ts +135 -0
- package/src/schema/EventDef/materializer.ts +172 -0
- package/src/schema/EventDef/mod.ts +4 -0
- package/src/schema/EventSequenceNumber/client.ts +257 -0
- package/src/schema/EventSequenceNumber/global.ts +19 -0
- package/src/schema/EventSequenceNumber/mod.ts +37 -0
- package/src/schema/EventSequenceNumber.test.ts +70 -52
- package/src/schema/LiveStoreEvent/client.ts +221 -0
- package/src/schema/LiveStoreEvent/for-event-def.ts +60 -0
- package/src/schema/LiveStoreEvent/global.ts +45 -0
- package/src/schema/LiveStoreEvent/input.ts +63 -0
- package/src/schema/LiveStoreEvent/mod.ts +4 -0
- package/src/schema/events.ts +1 -1
- package/src/schema/mod.ts +6 -4
- package/src/schema/schema.ts +39 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +19 -2
- package/src/schema/state/sqlite/client-document-def.ts +127 -25
- package/src/schema/state/sqlite/column-annotations.test.ts +1 -1
- package/src/schema/state/sqlite/column-annotations.ts +16 -6
- package/src/schema/state/sqlite/column-def.test.ts +62 -10
- package/src/schema/state/sqlite/column-def.ts +88 -21
- package/src/schema/state/sqlite/column-spec.test.ts +29 -16
- package/src/schema/state/sqlite/column-spec.ts +36 -11
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +26 -6
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +29 -12
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +12 -17
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +25 -11
- package/src/schema/state/sqlite/query-builder/astToSql.ts +23 -14
- package/src/schema/state/sqlite/query-builder/impl.test.ts +305 -92
- package/src/schema/state/sqlite/query-builder/impl.ts +8 -3
- package/src/schema/state/sqlite/schema-helpers.test.ts +44 -0
- package/src/schema/state/sqlite/schema-helpers.ts +28 -20
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +64 -0
- package/src/schema/state/sqlite/system-tables/mod.ts +2 -0
- package/src/schema/state/sqlite/system-tables/state-tables.ts +69 -0
- package/src/schema/state/sqlite/table-def.test.ts +101 -0
- package/src/schema/state/sqlite/table-def.ts +8 -6
- package/src/schema/unknown-events.ts +131 -0
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +86 -0
- package/src/schema-management/migrations.ts +41 -8
- package/src/schema-management/validate-schema.ts +3 -3
- package/src/sql-queries/sql-queries.ts +9 -1
- package/src/sql-queries/sql-query-builder.ts +2 -1
- package/src/sqlite-types.ts +3 -3
- package/src/sync/ClientSessionSyncProcessor.ts +69 -62
- package/src/sync/errors.ts +38 -0
- package/src/sync/index.ts +3 -0
- package/src/sync/mock-sync-backend.ts +184 -0
- package/src/sync/next/compact-events.ts +6 -7
- package/src/sync/next/facts.ts +7 -9
- package/src/sync/next/history-dag-common.ts +277 -26
- package/src/sync/next/history-dag.ts +16 -10
- package/src/sync/next/rebase-events.ts +11 -11
- package/src/sync/next/test/event-fixtures.ts +11 -11
- package/src/sync/sync-backend-kv.ts +22 -0
- package/src/sync/sync-backend.ts +185 -0
- package/src/sync/sync.ts +9 -91
- package/src/sync/syncstate.test.ts +96 -52
- package/src/sync/syncstate.ts +69 -58
- package/src/sync/transport-chunking.ts +90 -0
- package/src/sync/validate-push-payload.ts +8 -9
- package/src/testing/event-factory.ts +131 -0
- package/src/testing/mod.ts +1 -0
- package/src/version.ts +16 -6
- package/dist/schema/EventDef.d.ts +0 -123
- package/dist/schema/EventDef.d.ts.map +0 -1
- package/dist/schema/EventDef.js +0 -46
- package/dist/schema/EventDef.js.map +0 -1
- package/dist/schema/EventSequenceNumber.d.ts +0 -80
- package/dist/schema/EventSequenceNumber.d.ts.map +0 -1
- package/dist/schema/EventSequenceNumber.js +0 -139
- package/dist/schema/EventSequenceNumber.js.map +0 -1
- package/dist/schema/LiveStoreEvent.d.ts.map +0 -1
- package/dist/schema/LiveStoreEvent.js.map +0 -1
- package/dist/schema/state/sqlite/system-tables.d.ts.map +0 -1
- package/dist/schema/state/sqlite/system-tables.js +0 -79
- package/dist/schema/state/sqlite/system-tables.js.map +0 -1
- package/dist/schema-management/migrations.test.d.ts +0 -2
- package/dist/schema-management/migrations.test.d.ts.map +0 -1
- package/dist/schema-management/migrations.test.js +0 -52
- package/dist/schema-management/migrations.test.js.map +0 -1
- package/dist/sync/next/graphology.d.ts +0 -8
- package/dist/sync/next/graphology.d.ts.map +0 -1
- package/dist/sync/next/graphology.js +0 -30
- package/dist/sync/next/graphology.js.map +0 -1
- package/dist/sync/next/graphology_.d.ts +0 -3
- package/dist/sync/next/graphology_.d.ts.map +0 -1
- package/dist/sync/next/graphology_.js +0 -3
- package/dist/sync/next/graphology_.js.map +0 -1
- package/src/schema/EventDef.ts +0 -219
- package/src/schema/EventSequenceNumber.ts +0 -199
- package/src/schema/LiveStoreEvent.ts +0 -287
- package/src/schema/state/sqlite/system-tables.ts +0 -104
- package/src/sync/next/ambient.d.ts +0 -3
- package/src/sync/next/graphology.ts +0 -41
- package/src/sync/next/graphology_.ts +0 -2
|
@@ -64,7 +64,14 @@ const issue = State.SQLite.table({
|
|
|
64
64
|
{ name: 'issue_created', columns: ['created'] },
|
|
65
65
|
],
|
|
66
66
|
});
|
|
67
|
-
const
|
|
67
|
+
const selections = State.SQLite.table({
|
|
68
|
+
name: 'selections',
|
|
69
|
+
columns: {
|
|
70
|
+
id: State.SQLite.integer({ primaryKey: true }),
|
|
71
|
+
group: State.SQLite.text({}),
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const db = { todos, todosWithIntId, comments, issue, selections, UiState, UiStateWithDefaultId };
|
|
68
75
|
const dump = (qb) => ({
|
|
69
76
|
bindValues: qb.asSql().bindValues,
|
|
70
77
|
query: qb.asSql().query,
|
|
@@ -83,14 +90,14 @@ describe('query builder', () => {
|
|
|
83
90
|
expect(dump(db.todos.select('id'))).toMatchInlineSnapshot(`
|
|
84
91
|
{
|
|
85
92
|
"bindValues": [],
|
|
86
|
-
"query": "SELECT id FROM 'todos'",
|
|
93
|
+
"query": "SELECT "id" FROM 'todos'",
|
|
87
94
|
"schema": "ReadonlyArray<({ readonly id: string } <-> string)>",
|
|
88
95
|
}
|
|
89
96
|
`);
|
|
90
97
|
expect(dump(db.todos.select('id', 'text'))).toMatchInlineSnapshot(`
|
|
91
98
|
{
|
|
92
99
|
"bindValues": [],
|
|
93
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
100
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
94
101
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
95
102
|
}
|
|
96
103
|
`);
|
|
@@ -101,7 +108,7 @@ describe('query builder', () => {
|
|
|
101
108
|
"bindValues": [
|
|
102
109
|
1,
|
|
103
110
|
],
|
|
104
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
111
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
105
112
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string } | undefined> <-> { readonly id: string; readonly text: string } | undefined)",
|
|
106
113
|
}
|
|
107
114
|
`);
|
|
@@ -110,7 +117,7 @@ describe('query builder', () => {
|
|
|
110
117
|
"bindValues": [
|
|
111
118
|
1,
|
|
112
119
|
],
|
|
113
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
120
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
114
121
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> <-> { readonly id: string; readonly text: string })",
|
|
115
122
|
}
|
|
116
123
|
`);
|
|
@@ -119,7 +126,7 @@ describe('query builder', () => {
|
|
|
119
126
|
"bindValues": [
|
|
120
127
|
1,
|
|
121
128
|
],
|
|
122
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
129
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
123
130
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> | readonly [undefined] <-> { readonly id: string; readonly text: string } | undefined)",
|
|
124
131
|
}
|
|
125
132
|
`);
|
|
@@ -130,7 +137,7 @@ describe('query builder', () => {
|
|
|
130
137
|
"bindValues": [
|
|
131
138
|
1,
|
|
132
139
|
],
|
|
133
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
140
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
134
141
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
135
142
|
}
|
|
136
143
|
`);
|
|
@@ -139,7 +146,7 @@ describe('query builder', () => {
|
|
|
139
146
|
"bindValues": [
|
|
140
147
|
1,
|
|
141
148
|
],
|
|
142
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed != ?",
|
|
149
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" != ?",
|
|
143
150
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
144
151
|
}
|
|
145
152
|
`);
|
|
@@ -148,59 +155,59 @@ describe('query builder', () => {
|
|
|
148
155
|
"bindValues": [
|
|
149
156
|
1,
|
|
150
157
|
],
|
|
151
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
158
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
152
159
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
153
160
|
}
|
|
154
161
|
`);
|
|
155
162
|
expect(dump(db.todos.select('id', 'text').where({ completed: undefined }))).toMatchInlineSnapshot(`
|
|
156
163
|
{
|
|
157
164
|
"bindValues": [],
|
|
158
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
165
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
159
166
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
160
167
|
}
|
|
161
168
|
`);
|
|
162
169
|
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
|
-
|
|
170
|
+
{
|
|
171
|
+
"bindValues": [
|
|
172
|
+
"2024-01-01T00:00:00.000Z",
|
|
173
|
+
],
|
|
174
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" <= ?",
|
|
175
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
176
|
+
}
|
|
177
|
+
`);
|
|
171
178
|
expect(dump(db.todos.select('id', 'text').where({ status: { op: 'IN', value: ['active'] } }))).toMatchInlineSnapshot(`
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
179
|
+
{
|
|
180
|
+
"bindValues": [
|
|
181
|
+
"active",
|
|
182
|
+
],
|
|
183
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" IN (?)",
|
|
184
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
185
|
+
}
|
|
186
|
+
`);
|
|
180
187
|
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
|
-
|
|
188
|
+
{
|
|
189
|
+
"bindValues": [
|
|
190
|
+
"active",
|
|
191
|
+
"completed",
|
|
192
|
+
],
|
|
193
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" NOT IN (?, ?)",
|
|
194
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
195
|
+
}
|
|
196
|
+
`);
|
|
190
197
|
expect(dump(db.todos
|
|
191
198
|
.select('id', 'text')
|
|
192
199
|
.where({ completed: false })
|
|
193
200
|
.where({ status: { op: 'IN', value: ['active'] } })
|
|
194
201
|
.where({ deletedAt: undefined }))).toMatchInlineSnapshot(`
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
{
|
|
203
|
+
"bindValues": [
|
|
204
|
+
0,
|
|
205
|
+
"active",
|
|
206
|
+
],
|
|
207
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? AND "status" IN (?)",
|
|
208
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
209
|
+
}
|
|
210
|
+
`);
|
|
204
211
|
});
|
|
205
212
|
it('should handle OFFSET and LIMIT clauses', () => {
|
|
206
213
|
expect(dump(db.todos.select('id', 'text').where('completed', true).offset(10).limit(10))).toMatchInlineSnapshot(`
|
|
@@ -210,7 +217,7 @@ describe('query builder', () => {
|
|
|
210
217
|
10,
|
|
211
218
|
10,
|
|
212
219
|
],
|
|
213
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
220
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
214
221
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
215
222
|
}
|
|
216
223
|
`);
|
|
@@ -221,10 +228,10 @@ describe('query builder', () => {
|
|
|
221
228
|
{
|
|
222
229
|
"bindValues": [
|
|
223
230
|
1,
|
|
224
|
-
5,
|
|
225
231
|
10,
|
|
232
|
+
5,
|
|
226
233
|
],
|
|
227
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
234
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
228
235
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
229
236
|
}
|
|
230
237
|
`);
|
|
@@ -235,7 +242,7 @@ describe('query builder', () => {
|
|
|
235
242
|
1,
|
|
236
243
|
5,
|
|
237
244
|
],
|
|
238
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ?",
|
|
245
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? OFFSET ?",
|
|
239
246
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
240
247
|
}
|
|
241
248
|
`);
|
|
@@ -246,7 +253,7 @@ describe('query builder', () => {
|
|
|
246
253
|
1,
|
|
247
254
|
10,
|
|
248
255
|
],
|
|
249
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? LIMIT ?",
|
|
256
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ?",
|
|
250
257
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
251
258
|
}
|
|
252
259
|
`);
|
|
@@ -264,7 +271,7 @@ describe('query builder', () => {
|
|
|
264
271
|
"bindValues": [
|
|
265
272
|
1,
|
|
266
273
|
],
|
|
267
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
274
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
268
275
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
269
276
|
}
|
|
270
277
|
`);
|
|
@@ -273,7 +280,7 @@ describe('query builder', () => {
|
|
|
273
280
|
"bindValues": [
|
|
274
281
|
1,
|
|
275
282
|
],
|
|
276
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
283
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
277
284
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
278
285
|
}
|
|
279
286
|
`);
|
|
@@ -282,14 +289,14 @@ describe('query builder', () => {
|
|
|
282
289
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '=', null))).toMatchInlineSnapshot(`
|
|
283
290
|
{
|
|
284
291
|
"bindValues": [],
|
|
285
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NULL",
|
|
292
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NULL",
|
|
286
293
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
287
294
|
}
|
|
288
295
|
`);
|
|
289
296
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '!=', null))).toMatchInlineSnapshot(`
|
|
290
297
|
{
|
|
291
298
|
"bindValues": [],
|
|
292
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NOT NULL",
|
|
299
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NOT NULL",
|
|
293
300
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
294
301
|
}
|
|
295
302
|
`);
|
|
@@ -298,14 +305,14 @@ describe('query builder', () => {
|
|
|
298
305
|
expect(dump(db.todos.orderBy('completed', 'desc'))).toMatchInlineSnapshot(`
|
|
299
306
|
{
|
|
300
307
|
"bindValues": [],
|
|
301
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
308
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
302
309
|
"schema": "ReadonlyArray<todos>",
|
|
303
310
|
}
|
|
304
311
|
`);
|
|
305
312
|
expect(dump(db.todos.orderBy([{ col: 'completed', direction: 'desc' }]))).toMatchInlineSnapshot(`
|
|
306
313
|
{
|
|
307
314
|
"bindValues": [],
|
|
308
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
315
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
309
316
|
"schema": "ReadonlyArray<todos>",
|
|
310
317
|
}
|
|
311
318
|
`);
|
|
@@ -360,20 +367,20 @@ describe('query builder', () => {
|
|
|
360
367
|
"Buy milk",
|
|
361
368
|
"active",
|
|
362
369
|
],
|
|
363
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
370
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
364
371
|
"schema": "number",
|
|
365
372
|
}
|
|
366
373
|
`);
|
|
367
374
|
});
|
|
368
375
|
it('should handle INSERT queries with undefined values', () => {
|
|
369
|
-
expect(dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active'
|
|
376
|
+
expect(dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }))).toMatchInlineSnapshot(`
|
|
370
377
|
{
|
|
371
378
|
"bindValues": [
|
|
372
379
|
"123",
|
|
373
380
|
"Buy milk",
|
|
374
381
|
"active",
|
|
375
382
|
],
|
|
376
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
383
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
377
384
|
"schema": "number",
|
|
378
385
|
}
|
|
379
386
|
`);
|
|
@@ -399,7 +406,7 @@ describe('query builder', () => {
|
|
|
399
406
|
"a2",
|
|
400
407
|
"John Doe",
|
|
401
408
|
],
|
|
402
|
-
"query": "INSERT INTO 'issue' (id, title, priority, created, modified, kanbanorder, creator) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
409
|
+
"query": "INSERT INTO 'issue' ("id", "title", "priority", "created", "modified", "kanbanorder", "creator") VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
403
410
|
"schema": "number",
|
|
404
411
|
}
|
|
405
412
|
`);
|
|
@@ -411,7 +418,7 @@ describe('query builder', () => {
|
|
|
411
418
|
"completed",
|
|
412
419
|
"123",
|
|
413
420
|
],
|
|
414
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ?",
|
|
421
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
415
422
|
"schema": "number",
|
|
416
423
|
}
|
|
417
424
|
`);
|
|
@@ -425,13 +432,13 @@ describe('query builder', () => {
|
|
|
425
432
|
`);
|
|
426
433
|
});
|
|
427
434
|
it('should handle UPDATE queries with undefined values', () => {
|
|
428
|
-
expect(dump(db.todos.update({
|
|
435
|
+
expect(dump(db.todos.update({ text: 'some text' }).where({ id: '123' }))).toMatchInlineSnapshot(`
|
|
429
436
|
{
|
|
430
437
|
"bindValues": [
|
|
431
438
|
"some text",
|
|
432
439
|
"123",
|
|
433
440
|
],
|
|
434
|
-
"query": "UPDATE 'todos' SET text = ? WHERE id = ?",
|
|
441
|
+
"query": "UPDATE 'todos' SET "text" = ? WHERE "id" = ?",
|
|
435
442
|
"schema": "number",
|
|
436
443
|
}
|
|
437
444
|
`);
|
|
@@ -444,7 +451,7 @@ describe('query builder', () => {
|
|
|
444
451
|
"John Doe",
|
|
445
452
|
1,
|
|
446
453
|
],
|
|
447
|
-
"query": "UPDATE 'issue' SET priority = ?, creator = ? WHERE id = ?",
|
|
454
|
+
"query": "UPDATE 'issue' SET "priority" = ?, "creator" = ? WHERE "id" = ?",
|
|
448
455
|
"schema": "number",
|
|
449
456
|
}
|
|
450
457
|
`);
|
|
@@ -455,7 +462,7 @@ describe('query builder', () => {
|
|
|
455
462
|
"bindValues": [
|
|
456
463
|
"completed",
|
|
457
464
|
],
|
|
458
|
-
"query": "DELETE FROM 'todos' WHERE status = ?",
|
|
465
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
459
466
|
"schema": "number",
|
|
460
467
|
}
|
|
461
468
|
`);
|
|
@@ -468,7 +475,7 @@ describe('query builder', () => {
|
|
|
468
475
|
"Buy milk",
|
|
469
476
|
"active",
|
|
470
477
|
],
|
|
471
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO NOTHING",
|
|
478
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
472
479
|
"schema": "number",
|
|
473
480
|
}
|
|
474
481
|
`);
|
|
@@ -483,7 +490,7 @@ describe('query builder', () => {
|
|
|
483
490
|
"Buy soy milk",
|
|
484
491
|
"active",
|
|
485
492
|
],
|
|
486
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET text = ?, status = ?",
|
|
493
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO UPDATE SET "text" = ?, "status" = ?",
|
|
487
494
|
"schema": "number",
|
|
488
495
|
}
|
|
489
496
|
`);
|
|
@@ -494,7 +501,29 @@ describe('query builder', () => {
|
|
|
494
501
|
"Buy milk",
|
|
495
502
|
"active",
|
|
496
503
|
],
|
|
497
|
-
"query": "INSERT OR REPLACE INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
504
|
+
"query": "INSERT OR REPLACE INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
505
|
+
"schema": "number",
|
|
506
|
+
}
|
|
507
|
+
`);
|
|
508
|
+
});
|
|
509
|
+
it('should quote reserved column names', () => {
|
|
510
|
+
expect(dump(db.selections.insert({ id: 1, group: 'alpha' }).onConflict('id', 'ignore'))).toMatchInlineSnapshot(`
|
|
511
|
+
{
|
|
512
|
+
"bindValues": [
|
|
513
|
+
1,
|
|
514
|
+
"alpha",
|
|
515
|
+
],
|
|
516
|
+
"query": "INSERT INTO 'selections' ("id", "group") VALUES (?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
517
|
+
"schema": "number",
|
|
518
|
+
}
|
|
519
|
+
`);
|
|
520
|
+
expect(dump(db.selections.update({ group: 'beta' }).where({ id: 1 }))).toMatchInlineSnapshot(`
|
|
521
|
+
{
|
|
522
|
+
"bindValues": [
|
|
523
|
+
"beta",
|
|
524
|
+
1,
|
|
525
|
+
],
|
|
526
|
+
"query": "UPDATE 'selections' SET "group" = ? WHERE "id" = ?",
|
|
498
527
|
"schema": "number",
|
|
499
528
|
}
|
|
500
529
|
`);
|
|
@@ -507,43 +536,178 @@ describe('query builder', () => {
|
|
|
507
536
|
"Buy milk",
|
|
508
537
|
"active",
|
|
509
538
|
],
|
|
510
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id, status) DO NOTHING",
|
|
539
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id", "status") DO NOTHING",
|
|
511
540
|
"schema": "number",
|
|
512
541
|
}
|
|
513
542
|
`);
|
|
514
543
|
});
|
|
515
544
|
it('should handle RETURNING clause', () => {
|
|
516
545
|
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
|
-
|
|
546
|
+
{
|
|
547
|
+
"bindValues": [
|
|
548
|
+
"123",
|
|
549
|
+
"Buy milk",
|
|
550
|
+
"active",
|
|
551
|
+
],
|
|
552
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) RETURNING "id"",
|
|
553
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
554
|
+
}
|
|
555
|
+
`);
|
|
527
556
|
expect(dump(db.todos.update({ status: 'completed' }).where({ id: '123' }).returning('id'))).toMatchInlineSnapshot(`
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
557
|
+
{
|
|
558
|
+
"bindValues": [
|
|
559
|
+
"completed",
|
|
560
|
+
"123",
|
|
561
|
+
],
|
|
562
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? RETURNING "id"",
|
|
563
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
564
|
+
}
|
|
565
|
+
`);
|
|
537
566
|
expect(dump(db.todos.delete().where({ status: 'completed' }).returning('id'))).toMatchInlineSnapshot(`
|
|
538
567
|
{
|
|
539
568
|
"bindValues": [
|
|
540
569
|
"completed",
|
|
541
570
|
],
|
|
542
|
-
"query": "DELETE FROM 'todos' WHERE status = ? RETURNING id",
|
|
571
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? RETURNING "id"",
|
|
543
572
|
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
544
573
|
}
|
|
545
574
|
`);
|
|
546
575
|
});
|
|
576
|
+
it('should handle where().delete() - preserving where clauses', () => {
|
|
577
|
+
expect(dump(db.todos.where({ status: 'completed' }).delete())).toMatchInlineSnapshot(`
|
|
578
|
+
{
|
|
579
|
+
"bindValues": [
|
|
580
|
+
"completed",
|
|
581
|
+
],
|
|
582
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
583
|
+
"schema": "number",
|
|
584
|
+
}
|
|
585
|
+
`);
|
|
586
|
+
// Multiple where clauses
|
|
587
|
+
expect(dump(db.todos.where({ status: 'completed' }).where({ deletedAt: null }).delete())).toMatchInlineSnapshot(`
|
|
588
|
+
{
|
|
589
|
+
"bindValues": [
|
|
590
|
+
"completed",
|
|
591
|
+
],
|
|
592
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? AND "deletedAt" IS NULL",
|
|
593
|
+
"schema": "number",
|
|
594
|
+
}
|
|
595
|
+
`);
|
|
596
|
+
});
|
|
597
|
+
it('should handle where().update() - preserving where clauses', () => {
|
|
598
|
+
expect(dump(db.todos.where({ id: '123' }).update({ status: 'completed' }))).toMatchInlineSnapshot(`
|
|
599
|
+
{
|
|
600
|
+
"bindValues": [
|
|
601
|
+
"completed",
|
|
602
|
+
"123",
|
|
603
|
+
],
|
|
604
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
605
|
+
"schema": "number",
|
|
606
|
+
}
|
|
607
|
+
`);
|
|
608
|
+
// Multiple where clauses
|
|
609
|
+
expect(dump(db.todos.where({ id: '123' }).where({ deletedAt: null }).update({ status: 'completed' }))).toMatchInlineSnapshot(`
|
|
610
|
+
{
|
|
611
|
+
"bindValues": [
|
|
612
|
+
"completed",
|
|
613
|
+
"123",
|
|
614
|
+
],
|
|
615
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? AND "deletedAt" IS NULL",
|
|
616
|
+
"schema": "number",
|
|
617
|
+
}
|
|
618
|
+
`);
|
|
619
|
+
});
|
|
620
|
+
it('should have equivalent behavior for both delete patterns', () => {
|
|
621
|
+
const pattern1 = dump(db.todos.where({ status: 'completed', id: '123' }).delete());
|
|
622
|
+
const pattern2 = dump(db.todos.delete().where({ status: 'completed', id: '123' }));
|
|
623
|
+
expect(pattern1).toEqual(pattern2);
|
|
624
|
+
});
|
|
625
|
+
it('should have equivalent behavior for both update patterns', () => {
|
|
626
|
+
const pattern1 = dump(db.todos.where({ id: '123' }).update({ status: 'completed', text: 'Updated' }));
|
|
627
|
+
const pattern2 = dump(db.todos.update({ status: 'completed', text: 'Updated' }).where({ id: '123' }));
|
|
628
|
+
expect(pattern1).toEqual(pattern2);
|
|
629
|
+
});
|
|
630
|
+
});
|
|
631
|
+
describe('schema transforms', () => {
|
|
632
|
+
const Flat = Schema.Struct({
|
|
633
|
+
id: Schema.String.pipe(State.SQLite.withPrimaryKey),
|
|
634
|
+
contactFirstName: Schema.String,
|
|
635
|
+
contactLastName: Schema.String,
|
|
636
|
+
contactEmail: Schema.String.pipe(State.SQLite.withUnique),
|
|
637
|
+
});
|
|
638
|
+
const Nested = Schema.transform(Flat, Schema.Struct({
|
|
639
|
+
id: Schema.String,
|
|
640
|
+
contact: Schema.Struct({
|
|
641
|
+
firstName: Schema.String,
|
|
642
|
+
lastName: Schema.String,
|
|
643
|
+
email: Schema.String,
|
|
644
|
+
}),
|
|
645
|
+
}), {
|
|
646
|
+
decode: ({ id, contactFirstName, contactLastName, contactEmail }) => ({
|
|
647
|
+
id,
|
|
648
|
+
contact: {
|
|
649
|
+
firstName: contactFirstName,
|
|
650
|
+
lastName: contactLastName,
|
|
651
|
+
email: contactEmail,
|
|
652
|
+
},
|
|
653
|
+
}),
|
|
654
|
+
encode: ({ id, contact }) => ({
|
|
655
|
+
id,
|
|
656
|
+
contactFirstName: contact.firstName,
|
|
657
|
+
contactLastName: contact.lastName,
|
|
658
|
+
contactEmail: contact.email,
|
|
659
|
+
}),
|
|
660
|
+
});
|
|
661
|
+
const makeContactsTable = () => State.SQLite.table({
|
|
662
|
+
name: 'contacts',
|
|
663
|
+
schema: Nested,
|
|
664
|
+
// schema: Flat,
|
|
665
|
+
});
|
|
666
|
+
it('exposes flattened insert type while schema type is nested', () => {
|
|
667
|
+
const contactsTable = makeContactsTable();
|
|
668
|
+
void contactsTable;
|
|
669
|
+
});
|
|
670
|
+
it('fails to encode nested inserts because flat columns are required', () => {
|
|
671
|
+
const contactsTable = makeContactsTable();
|
|
672
|
+
expect(contactsTable
|
|
673
|
+
// TODO in the future we should use decoded types here instead of encoded
|
|
674
|
+
.insert({
|
|
675
|
+
id: 'person-1',
|
|
676
|
+
contactFirstName: 'Ada',
|
|
677
|
+
contactLastName: 'Lovelace',
|
|
678
|
+
contactEmail: 'ada@example.com',
|
|
679
|
+
})
|
|
680
|
+
.asSql()).toMatchInlineSnapshot(`
|
|
681
|
+
{
|
|
682
|
+
"bindValues": [
|
|
683
|
+
"person-1",
|
|
684
|
+
"Ada",
|
|
685
|
+
"Lovelace",
|
|
686
|
+
"ada@example.com",
|
|
687
|
+
],
|
|
688
|
+
"query": "INSERT INTO 'contacts' ("id", "contactFirstName", "contactLastName", "contactEmail") VALUES (?, ?, ?, ?)",
|
|
689
|
+
"usedTables": Set {
|
|
690
|
+
"contacts",
|
|
691
|
+
},
|
|
692
|
+
}
|
|
693
|
+
`);
|
|
694
|
+
});
|
|
695
|
+
it('fails to encode nested inserts because flat columns are required', () => {
|
|
696
|
+
const contactsTable = makeContactsTable();
|
|
697
|
+
expect(() => contactsTable
|
|
698
|
+
.insert({
|
|
699
|
+
id: 'person-1',
|
|
700
|
+
// @ts-expect-error
|
|
701
|
+
contact: {
|
|
702
|
+
firstName: 'Ada',
|
|
703
|
+
lastName: 'Lovelace',
|
|
704
|
+
email: 'ada@example.com',
|
|
705
|
+
},
|
|
706
|
+
})
|
|
707
|
+
.asSql()).toThrowErrorMatchingInlineSnapshot(`
|
|
708
|
+
[ParseError: contacts\n└─ ["contactFirstName"]\n └─ is missing]
|
|
709
|
+
`);
|
|
710
|
+
});
|
|
547
711
|
});
|
|
548
712
|
});
|
|
549
713
|
// TODO nested queries
|