@livestore/common 0.4.0-dev.2 → 0.4.0-dev.20
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 +17 -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 +36 -29
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +8 -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 +8 -4
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +156 -73
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +15 -21
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +18 -18
- 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 +30 -42
- 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/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/types.d.ts +21 -19
- package/dist/leader-thread/types.d.ts.map +1 -1
- 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/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 +46 -7
- 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 +17 -10
- 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 +17 -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 +8 -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 +242 -103
- package/src/leader-thread/eventlog.ts +33 -34
- package/src/leader-thread/leader-worker-devtools.ts +50 -54
- 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/recreate-db.ts +15 -7
- package/src/leader-thread/shutdown-channel.ts +16 -2
- package/src/leader-thread/types.ts +21 -19
- package/src/logging.ts +62 -0
- package/src/make-client-session.ts +9 -3
- package/src/materializer-helper.ts +27 -10
- 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 +120 -8
- 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 +60 -7
- 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 +2 -1
- package/src/schema/state/sqlite/mod.ts +4 -3
- package/src/schema/state/sqlite/query-builder/api.ts +19 -10
- 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 +9 -8
- 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
|
@@ -73,7 +73,15 @@ const issue = State.SQLite.table({
|
|
|
73
73
|
],
|
|
74
74
|
})
|
|
75
75
|
|
|
76
|
-
const
|
|
76
|
+
const selections = State.SQLite.table({
|
|
77
|
+
name: 'selections',
|
|
78
|
+
columns: {
|
|
79
|
+
id: State.SQLite.integer({ primaryKey: true }),
|
|
80
|
+
group: State.SQLite.text({}),
|
|
81
|
+
},
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const db = { todos, todosWithIntId, comments, issue, selections, UiState, UiStateWithDefaultId }
|
|
77
85
|
|
|
78
86
|
const dump = (qb: QueryBuilder<any, any, any>) => ({
|
|
79
87
|
bindValues: qb.asSql().bindValues,
|
|
@@ -95,7 +103,7 @@ describe('query builder', () => {
|
|
|
95
103
|
expect(dump(db.todos.select('id'))).toMatchInlineSnapshot(`
|
|
96
104
|
{
|
|
97
105
|
"bindValues": [],
|
|
98
|
-
"query": "SELECT id FROM 'todos'",
|
|
106
|
+
"query": "SELECT "id" FROM 'todos'",
|
|
99
107
|
"schema": "ReadonlyArray<({ readonly id: string } <-> string)>",
|
|
100
108
|
}
|
|
101
109
|
`)
|
|
@@ -103,7 +111,7 @@ describe('query builder', () => {
|
|
|
103
111
|
expect(dump(db.todos.select('id', 'text'))).toMatchInlineSnapshot(`
|
|
104
112
|
{
|
|
105
113
|
"bindValues": [],
|
|
106
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
114
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
107
115
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
108
116
|
}
|
|
109
117
|
`)
|
|
@@ -115,7 +123,7 @@ describe('query builder', () => {
|
|
|
115
123
|
"bindValues": [
|
|
116
124
|
1,
|
|
117
125
|
],
|
|
118
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
126
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
119
127
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string } | undefined> <-> { readonly id: string; readonly text: string } | undefined)",
|
|
120
128
|
}
|
|
121
129
|
`)
|
|
@@ -125,7 +133,7 @@ describe('query builder', () => {
|
|
|
125
133
|
"bindValues": [
|
|
126
134
|
1,
|
|
127
135
|
],
|
|
128
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
136
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
129
137
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> <-> { readonly id: string; readonly text: string })",
|
|
130
138
|
}
|
|
131
139
|
`)
|
|
@@ -137,7 +145,7 @@ describe('query builder', () => {
|
|
|
137
145
|
"bindValues": [
|
|
138
146
|
1,
|
|
139
147
|
],
|
|
140
|
-
"query": "SELECT id, text FROM 'todos' LIMIT ?",
|
|
148
|
+
"query": "SELECT "id", "text" FROM 'todos' LIMIT ?",
|
|
141
149
|
"schema": "(ReadonlyArray<{ readonly id: string; readonly text: string }> | readonly [undefined] <-> { readonly id: string; readonly text: string } | undefined)",
|
|
142
150
|
}
|
|
143
151
|
`)
|
|
@@ -149,7 +157,7 @@ describe('query builder', () => {
|
|
|
149
157
|
"bindValues": [
|
|
150
158
|
1,
|
|
151
159
|
],
|
|
152
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
160
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
153
161
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
154
162
|
}
|
|
155
163
|
`)
|
|
@@ -158,7 +166,7 @@ describe('query builder', () => {
|
|
|
158
166
|
"bindValues": [
|
|
159
167
|
1,
|
|
160
168
|
],
|
|
161
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed != ?",
|
|
169
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" != ?",
|
|
162
170
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
163
171
|
}
|
|
164
172
|
`)
|
|
@@ -167,51 +175,51 @@ describe('query builder', () => {
|
|
|
167
175
|
"bindValues": [
|
|
168
176
|
1,
|
|
169
177
|
],
|
|
170
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?",
|
|
178
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ?",
|
|
171
179
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
172
180
|
}
|
|
173
181
|
`)
|
|
174
182
|
expect(dump(db.todos.select('id', 'text').where({ completed: undefined }))).toMatchInlineSnapshot(`
|
|
175
183
|
{
|
|
176
184
|
"bindValues": [],
|
|
177
|
-
"query": "SELECT id, text FROM 'todos'",
|
|
185
|
+
"query": "SELECT "id", "text" FROM 'todos'",
|
|
178
186
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
179
187
|
}
|
|
180
188
|
`)
|
|
181
189
|
expect(
|
|
182
190
|
dump(db.todos.select('id', 'text').where({ deletedAt: { op: '<=', value: new Date('2024-01-01') } })),
|
|
183
191
|
).toMatchInlineSnapshot(`
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
+
{
|
|
193
|
+
"bindValues": [
|
|
194
|
+
"2024-01-01T00:00:00.000Z",
|
|
195
|
+
],
|
|
196
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" <= ?",
|
|
197
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
198
|
+
}
|
|
199
|
+
`)
|
|
192
200
|
expect(
|
|
193
201
|
dump(db.todos.select('id', 'text').where({ status: { op: 'IN', value: ['active'] } })),
|
|
194
202
|
).toMatchInlineSnapshot(`
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
+
{
|
|
204
|
+
"bindValues": [
|
|
205
|
+
"active",
|
|
206
|
+
],
|
|
207
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" IN (?)",
|
|
208
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
209
|
+
}
|
|
210
|
+
`)
|
|
203
211
|
expect(
|
|
204
212
|
dump(db.todos.select('id', 'text').where({ status: { op: 'NOT IN', value: ['active', 'completed'] } })),
|
|
205
213
|
).toMatchInlineSnapshot(`
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
214
|
+
{
|
|
215
|
+
"bindValues": [
|
|
216
|
+
"active",
|
|
217
|
+
"completed",
|
|
218
|
+
],
|
|
219
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "status" NOT IN (?, ?)",
|
|
220
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
221
|
+
}
|
|
222
|
+
`)
|
|
215
223
|
|
|
216
224
|
expect(
|
|
217
225
|
dump(
|
|
@@ -222,15 +230,15 @@ describe('query builder', () => {
|
|
|
222
230
|
.where({ deletedAt: undefined }),
|
|
223
231
|
),
|
|
224
232
|
).toMatchInlineSnapshot(`
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
233
|
+
{
|
|
234
|
+
"bindValues": [
|
|
235
|
+
0,
|
|
236
|
+
"active",
|
|
237
|
+
],
|
|
238
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? AND "status" IN (?)",
|
|
239
|
+
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
240
|
+
}
|
|
241
|
+
`)
|
|
234
242
|
})
|
|
235
243
|
|
|
236
244
|
it('should handle OFFSET and LIMIT clauses', () => {
|
|
@@ -241,7 +249,7 @@ describe('query builder', () => {
|
|
|
241
249
|
10,
|
|
242
250
|
10,
|
|
243
251
|
],
|
|
244
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
252
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
245
253
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
246
254
|
}
|
|
247
255
|
`)
|
|
@@ -253,10 +261,10 @@ describe('query builder', () => {
|
|
|
253
261
|
{
|
|
254
262
|
"bindValues": [
|
|
255
263
|
1,
|
|
256
|
-
5,
|
|
257
264
|
10,
|
|
265
|
+
5,
|
|
258
266
|
],
|
|
259
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ?
|
|
267
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ? OFFSET ?",
|
|
260
268
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
261
269
|
}
|
|
262
270
|
`)
|
|
@@ -268,7 +276,7 @@ describe('query builder', () => {
|
|
|
268
276
|
1,
|
|
269
277
|
5,
|
|
270
278
|
],
|
|
271
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? OFFSET ?",
|
|
279
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? OFFSET ?",
|
|
272
280
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
273
281
|
}
|
|
274
282
|
`)
|
|
@@ -280,7 +288,7 @@ describe('query builder', () => {
|
|
|
280
288
|
1,
|
|
281
289
|
10,
|
|
282
290
|
],
|
|
283
|
-
"query": "SELECT id, text FROM 'todos' WHERE completed = ? LIMIT ?",
|
|
291
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "completed" = ? LIMIT ?",
|
|
284
292
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
285
293
|
}
|
|
286
294
|
`)
|
|
@@ -299,7 +307,7 @@ describe('query builder', () => {
|
|
|
299
307
|
"bindValues": [
|
|
300
308
|
1,
|
|
301
309
|
],
|
|
302
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
310
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
303
311
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
304
312
|
}
|
|
305
313
|
`)
|
|
@@ -308,7 +316,7 @@ describe('query builder', () => {
|
|
|
308
316
|
"bindValues": [
|
|
309
317
|
1,
|
|
310
318
|
],
|
|
311
|
-
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE completed = ?",
|
|
319
|
+
"query": "SELECT COUNT(*) as count FROM 'todos' WHERE "completed" = ?",
|
|
312
320
|
"schema": "(ReadonlyArray<({ readonly count: number } <-> number)> <-> number)",
|
|
313
321
|
}
|
|
314
322
|
`)
|
|
@@ -318,14 +326,14 @@ describe('query builder', () => {
|
|
|
318
326
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '=', null))).toMatchInlineSnapshot(`
|
|
319
327
|
{
|
|
320
328
|
"bindValues": [],
|
|
321
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NULL",
|
|
329
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NULL",
|
|
322
330
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
323
331
|
}
|
|
324
332
|
`)
|
|
325
333
|
expect(dump(db.todos.select('id', 'text').where('deletedAt', '!=', null))).toMatchInlineSnapshot(`
|
|
326
334
|
{
|
|
327
335
|
"bindValues": [],
|
|
328
|
-
"query": "SELECT id, text FROM 'todos' WHERE deletedAt IS NOT NULL",
|
|
336
|
+
"query": "SELECT "id", "text" FROM 'todos' WHERE "deletedAt" IS NOT NULL",
|
|
329
337
|
"schema": "ReadonlyArray<{ readonly id: string; readonly text: string }>",
|
|
330
338
|
}
|
|
331
339
|
`)
|
|
@@ -335,7 +343,7 @@ describe('query builder', () => {
|
|
|
335
343
|
expect(dump(db.todos.orderBy('completed', 'desc'))).toMatchInlineSnapshot(`
|
|
336
344
|
{
|
|
337
345
|
"bindValues": [],
|
|
338
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
346
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
339
347
|
"schema": "ReadonlyArray<todos>",
|
|
340
348
|
}
|
|
341
349
|
`)
|
|
@@ -343,7 +351,7 @@ describe('query builder', () => {
|
|
|
343
351
|
expect(dump(db.todos.orderBy([{ col: 'completed', direction: 'desc' }]))).toMatchInlineSnapshot(`
|
|
344
352
|
{
|
|
345
353
|
"bindValues": [],
|
|
346
|
-
"query": "SELECT * FROM 'todos' ORDER BY completed desc",
|
|
354
|
+
"query": "SELECT * FROM 'todos' ORDER BY "completed" desc",
|
|
347
355
|
"schema": "ReadonlyArray<todos>",
|
|
348
356
|
}
|
|
349
357
|
`)
|
|
@@ -402,23 +410,21 @@ describe('query builder', () => {
|
|
|
402
410
|
"Buy milk",
|
|
403
411
|
"active",
|
|
404
412
|
],
|
|
405
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
413
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
406
414
|
"schema": "number",
|
|
407
415
|
}
|
|
408
416
|
`)
|
|
409
417
|
})
|
|
410
418
|
|
|
411
419
|
it('should handle INSERT queries with undefined values', () => {
|
|
412
|
-
expect(
|
|
413
|
-
dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active', completed: undefined })),
|
|
414
|
-
).toMatchInlineSnapshot(`
|
|
420
|
+
expect(dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }))).toMatchInlineSnapshot(`
|
|
415
421
|
{
|
|
416
422
|
"bindValues": [
|
|
417
423
|
"123",
|
|
418
424
|
"Buy milk",
|
|
419
425
|
"active",
|
|
420
426
|
],
|
|
421
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
427
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
422
428
|
"schema": "number",
|
|
423
429
|
}
|
|
424
430
|
`)
|
|
@@ -449,7 +455,7 @@ describe('query builder', () => {
|
|
|
449
455
|
"a2",
|
|
450
456
|
"John Doe",
|
|
451
457
|
],
|
|
452
|
-
"query": "INSERT INTO 'issue' (id, title, priority, created, modified, kanbanorder, creator) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
458
|
+
"query": "INSERT INTO 'issue' ("id", "title", "priority", "created", "modified", "kanbanorder", "creator") VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
453
459
|
"schema": "number",
|
|
454
460
|
}
|
|
455
461
|
`)
|
|
@@ -462,7 +468,7 @@ describe('query builder', () => {
|
|
|
462
468
|
"completed",
|
|
463
469
|
"123",
|
|
464
470
|
],
|
|
465
|
-
"query": "UPDATE 'todos' SET status = ? WHERE id = ?",
|
|
471
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
466
472
|
"schema": "number",
|
|
467
473
|
}
|
|
468
474
|
`)
|
|
@@ -478,15 +484,13 @@ describe('query builder', () => {
|
|
|
478
484
|
})
|
|
479
485
|
|
|
480
486
|
it('should handle UPDATE queries with undefined values', () => {
|
|
481
|
-
expect(
|
|
482
|
-
dump(db.todos.update({ status: undefined, text: 'some text' }).where({ id: '123' })),
|
|
483
|
-
).toMatchInlineSnapshot(`
|
|
487
|
+
expect(dump(db.todos.update({ text: 'some text' }).where({ id: '123' }))).toMatchInlineSnapshot(`
|
|
484
488
|
{
|
|
485
489
|
"bindValues": [
|
|
486
490
|
"some text",
|
|
487
491
|
"123",
|
|
488
492
|
],
|
|
489
|
-
"query": "UPDATE 'todos' SET text = ? WHERE id = ?",
|
|
493
|
+
"query": "UPDATE 'todos' SET "text" = ? WHERE "id" = ?",
|
|
490
494
|
"schema": "number",
|
|
491
495
|
}
|
|
492
496
|
`)
|
|
@@ -500,7 +504,7 @@ describe('query builder', () => {
|
|
|
500
504
|
"John Doe",
|
|
501
505
|
1,
|
|
502
506
|
],
|
|
503
|
-
"query": "UPDATE 'issue' SET priority = ?, creator = ? WHERE id = ?",
|
|
507
|
+
"query": "UPDATE 'issue' SET "priority" = ?, "creator" = ? WHERE "id" = ?",
|
|
504
508
|
"schema": "number",
|
|
505
509
|
}
|
|
506
510
|
`)
|
|
@@ -512,7 +516,7 @@ describe('query builder', () => {
|
|
|
512
516
|
"bindValues": [
|
|
513
517
|
"completed",
|
|
514
518
|
],
|
|
515
|
-
"query": "DELETE FROM 'todos' WHERE status = ?",
|
|
519
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
516
520
|
"schema": "number",
|
|
517
521
|
}
|
|
518
522
|
`)
|
|
@@ -528,7 +532,7 @@ describe('query builder', () => {
|
|
|
528
532
|
"Buy milk",
|
|
529
533
|
"active",
|
|
530
534
|
],
|
|
531
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO NOTHING",
|
|
535
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
532
536
|
"schema": "number",
|
|
533
537
|
}
|
|
534
538
|
`)
|
|
@@ -548,7 +552,7 @@ describe('query builder', () => {
|
|
|
548
552
|
"Buy soy milk",
|
|
549
553
|
"active",
|
|
550
554
|
],
|
|
551
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET text = ?, status = ?",
|
|
555
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id") DO UPDATE SET "text" = ?, "status" = ?",
|
|
552
556
|
"schema": "number",
|
|
553
557
|
}
|
|
554
558
|
`)
|
|
@@ -562,7 +566,31 @@ describe('query builder', () => {
|
|
|
562
566
|
"Buy milk",
|
|
563
567
|
"active",
|
|
564
568
|
],
|
|
565
|
-
"query": "INSERT OR REPLACE INTO 'todos' (id, text, status) VALUES (?, ?, ?)",
|
|
569
|
+
"query": "INSERT OR REPLACE INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?)",
|
|
570
|
+
"schema": "number",
|
|
571
|
+
}
|
|
572
|
+
`)
|
|
573
|
+
})
|
|
574
|
+
|
|
575
|
+
it('should quote reserved column names', () => {
|
|
576
|
+
expect(dump(db.selections.insert({ id: 1, group: 'alpha' }).onConflict('id', 'ignore'))).toMatchInlineSnapshot(`
|
|
577
|
+
{
|
|
578
|
+
"bindValues": [
|
|
579
|
+
1,
|
|
580
|
+
"alpha",
|
|
581
|
+
],
|
|
582
|
+
"query": "INSERT INTO 'selections' ("id", "group") VALUES (?, ?) ON CONFLICT ("id") DO NOTHING",
|
|
583
|
+
"schema": "number",
|
|
584
|
+
}
|
|
585
|
+
`)
|
|
586
|
+
|
|
587
|
+
expect(dump(db.selections.update({ group: 'beta' }).where({ id: 1 }))).toMatchInlineSnapshot(`
|
|
588
|
+
{
|
|
589
|
+
"bindValues": [
|
|
590
|
+
"beta",
|
|
591
|
+
1,
|
|
592
|
+
],
|
|
593
|
+
"query": "UPDATE 'selections' SET "group" = ? WHERE "id" = ?",
|
|
566
594
|
"schema": "number",
|
|
567
595
|
}
|
|
568
596
|
`)
|
|
@@ -578,7 +606,7 @@ describe('query builder', () => {
|
|
|
578
606
|
"Buy milk",
|
|
579
607
|
"active",
|
|
580
608
|
],
|
|
581
|
-
"query": "INSERT INTO 'todos' (id, text, status) VALUES (?, ?, ?) ON CONFLICT (id, status) DO NOTHING",
|
|
609
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) ON CONFLICT ("id", "status") DO NOTHING",
|
|
582
610
|
"schema": "number",
|
|
583
611
|
}
|
|
584
612
|
`)
|
|
@@ -588,40 +616,225 @@ describe('query builder', () => {
|
|
|
588
616
|
expect(
|
|
589
617
|
dump(db.todos.insert({ id: '123', text: 'Buy milk', status: 'active' }).returning('id')),
|
|
590
618
|
).toMatchInlineSnapshot(`
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
619
|
+
{
|
|
620
|
+
"bindValues": [
|
|
621
|
+
"123",
|
|
622
|
+
"Buy milk",
|
|
623
|
+
"active",
|
|
624
|
+
],
|
|
625
|
+
"query": "INSERT INTO 'todos' ("id", "text", "status") VALUES (?, ?, ?) RETURNING "id"",
|
|
626
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
627
|
+
}
|
|
628
|
+
`)
|
|
601
629
|
|
|
602
630
|
expect(
|
|
603
631
|
dump(db.todos.update({ status: 'completed' }).where({ id: '123' }).returning('id')),
|
|
604
632
|
).toMatchInlineSnapshot(`
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
633
|
+
{
|
|
634
|
+
"bindValues": [
|
|
635
|
+
"completed",
|
|
636
|
+
"123",
|
|
637
|
+
],
|
|
638
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? RETURNING "id"",
|
|
639
|
+
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
640
|
+
}
|
|
641
|
+
`)
|
|
614
642
|
|
|
615
643
|
expect(dump(db.todos.delete().where({ status: 'completed' }).returning('id'))).toMatchInlineSnapshot(`
|
|
616
644
|
{
|
|
617
645
|
"bindValues": [
|
|
618
646
|
"completed",
|
|
619
647
|
],
|
|
620
|
-
"query": "DELETE FROM 'todos' WHERE status = ? RETURNING id",
|
|
648
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? RETURNING "id"",
|
|
621
649
|
"schema": "ReadonlyArray<{ readonly id: string }>",
|
|
622
650
|
}
|
|
623
651
|
`)
|
|
624
652
|
})
|
|
653
|
+
|
|
654
|
+
it('should handle where().delete() - preserving where clauses', () => {
|
|
655
|
+
expect(dump(db.todos.where({ status: 'completed' }).delete())).toMatchInlineSnapshot(`
|
|
656
|
+
{
|
|
657
|
+
"bindValues": [
|
|
658
|
+
"completed",
|
|
659
|
+
],
|
|
660
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ?",
|
|
661
|
+
"schema": "number",
|
|
662
|
+
}
|
|
663
|
+
`)
|
|
664
|
+
|
|
665
|
+
// Multiple where clauses
|
|
666
|
+
expect(dump(db.todos.where({ status: 'completed' }).where({ deletedAt: null }).delete())).toMatchInlineSnapshot(`
|
|
667
|
+
{
|
|
668
|
+
"bindValues": [
|
|
669
|
+
"completed",
|
|
670
|
+
],
|
|
671
|
+
"query": "DELETE FROM 'todos' WHERE "status" = ? AND "deletedAt" IS NULL",
|
|
672
|
+
"schema": "number",
|
|
673
|
+
}
|
|
674
|
+
`)
|
|
675
|
+
})
|
|
676
|
+
|
|
677
|
+
it('should handle where().update() - preserving where clauses', () => {
|
|
678
|
+
expect(dump(db.todos.where({ id: '123' }).update({ status: 'completed' }))).toMatchInlineSnapshot(`
|
|
679
|
+
{
|
|
680
|
+
"bindValues": [
|
|
681
|
+
"completed",
|
|
682
|
+
"123",
|
|
683
|
+
],
|
|
684
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ?",
|
|
685
|
+
"schema": "number",
|
|
686
|
+
}
|
|
687
|
+
`)
|
|
688
|
+
|
|
689
|
+
// Multiple where clauses
|
|
690
|
+
expect(
|
|
691
|
+
dump(db.todos.where({ id: '123' }).where({ deletedAt: null }).update({ status: 'completed' })),
|
|
692
|
+
).toMatchInlineSnapshot(`
|
|
693
|
+
{
|
|
694
|
+
"bindValues": [
|
|
695
|
+
"completed",
|
|
696
|
+
"123",
|
|
697
|
+
],
|
|
698
|
+
"query": "UPDATE 'todos' SET "status" = ? WHERE "id" = ? AND "deletedAt" IS NULL",
|
|
699
|
+
"schema": "number",
|
|
700
|
+
}
|
|
701
|
+
`)
|
|
702
|
+
})
|
|
703
|
+
|
|
704
|
+
it('should have equivalent behavior for both delete patterns', () => {
|
|
705
|
+
const pattern1 = dump(db.todos.where({ status: 'completed', id: '123' }).delete())
|
|
706
|
+
const pattern2 = dump(db.todos.delete().where({ status: 'completed', id: '123' }))
|
|
707
|
+
|
|
708
|
+
expect(pattern1).toEqual(pattern2)
|
|
709
|
+
})
|
|
710
|
+
|
|
711
|
+
it('should have equivalent behavior for both update patterns', () => {
|
|
712
|
+
const pattern1 = dump(db.todos.where({ id: '123' }).update({ status: 'completed', text: 'Updated' }))
|
|
713
|
+
const pattern2 = dump(db.todos.update({ status: 'completed', text: 'Updated' }).where({ id: '123' }))
|
|
714
|
+
|
|
715
|
+
expect(pattern1).toEqual(pattern2)
|
|
716
|
+
})
|
|
717
|
+
})
|
|
718
|
+
|
|
719
|
+
describe('schema transforms', () => {
|
|
720
|
+
const Flat = Schema.Struct({
|
|
721
|
+
id: Schema.String.pipe(State.SQLite.withPrimaryKey),
|
|
722
|
+
contactFirstName: Schema.String,
|
|
723
|
+
contactLastName: Schema.String,
|
|
724
|
+
contactEmail: Schema.String.pipe(State.SQLite.withUnique),
|
|
725
|
+
})
|
|
726
|
+
|
|
727
|
+
const Nested = Schema.transform(
|
|
728
|
+
Flat,
|
|
729
|
+
Schema.Struct({
|
|
730
|
+
id: Schema.String,
|
|
731
|
+
contact: Schema.Struct({
|
|
732
|
+
firstName: Schema.String,
|
|
733
|
+
lastName: Schema.String,
|
|
734
|
+
email: Schema.String,
|
|
735
|
+
}),
|
|
736
|
+
}),
|
|
737
|
+
{
|
|
738
|
+
decode: ({ id, contactFirstName, contactLastName, contactEmail }) => ({
|
|
739
|
+
id,
|
|
740
|
+
contact: {
|
|
741
|
+
firstName: contactFirstName,
|
|
742
|
+
lastName: contactLastName,
|
|
743
|
+
email: contactEmail,
|
|
744
|
+
},
|
|
745
|
+
}),
|
|
746
|
+
encode: ({ id, contact }) => ({
|
|
747
|
+
id,
|
|
748
|
+
contactFirstName: contact.firstName,
|
|
749
|
+
contactLastName: contact.lastName,
|
|
750
|
+
contactEmail: contact.email,
|
|
751
|
+
}),
|
|
752
|
+
},
|
|
753
|
+
)
|
|
754
|
+
|
|
755
|
+
const makeContactsTable = () =>
|
|
756
|
+
State.SQLite.table({
|
|
757
|
+
name: 'contacts',
|
|
758
|
+
schema: Nested,
|
|
759
|
+
// schema: Flat,
|
|
760
|
+
})
|
|
761
|
+
|
|
762
|
+
it('exposes flattened insert type while schema type is nested', () => {
|
|
763
|
+
const contactsTable = makeContactsTable()
|
|
764
|
+
|
|
765
|
+
type InsertInput = Parameters<(typeof contactsTable)['insert']>[0]
|
|
766
|
+
type NestedType = Schema.Schema.Type<typeof Nested>
|
|
767
|
+
|
|
768
|
+
type Assert<T extends true> = T
|
|
769
|
+
|
|
770
|
+
type InsertKeys = keyof InsertInput
|
|
771
|
+
type NestedKeys = keyof NestedType
|
|
772
|
+
|
|
773
|
+
type _InsertHasFlattenedColumns = Assert<
|
|
774
|
+
'contactFirstName' extends InsertKeys
|
|
775
|
+
? 'contactLastName' extends InsertKeys
|
|
776
|
+
? 'contactEmail' extends InsertKeys
|
|
777
|
+
? true
|
|
778
|
+
: false
|
|
779
|
+
: false
|
|
780
|
+
: false
|
|
781
|
+
>
|
|
782
|
+
|
|
783
|
+
type _InsertDoesNotExposeNested = Assert<Extract<'contact', InsertKeys> extends never ? true : false>
|
|
784
|
+
|
|
785
|
+
type _SchemaTypeIsNested = Assert<'contact' extends NestedKeys ? true : false>
|
|
786
|
+
|
|
787
|
+
void contactsTable
|
|
788
|
+
})
|
|
789
|
+
|
|
790
|
+
it('fails to encode nested inserts because flat columns are required', () => {
|
|
791
|
+
const contactsTable = makeContactsTable()
|
|
792
|
+
|
|
793
|
+
expect(
|
|
794
|
+
contactsTable
|
|
795
|
+
// TODO in the future we should use decoded types here instead of encoded
|
|
796
|
+
.insert({
|
|
797
|
+
id: 'person-1',
|
|
798
|
+
contactFirstName: 'Ada',
|
|
799
|
+
contactLastName: 'Lovelace',
|
|
800
|
+
contactEmail: 'ada@example.com',
|
|
801
|
+
})
|
|
802
|
+
.asSql(),
|
|
803
|
+
).toMatchInlineSnapshot(`
|
|
804
|
+
{
|
|
805
|
+
"bindValues": [
|
|
806
|
+
"person-1",
|
|
807
|
+
"Ada",
|
|
808
|
+
"Lovelace",
|
|
809
|
+
"ada@example.com",
|
|
810
|
+
],
|
|
811
|
+
"query": "INSERT INTO 'contacts' ("id", "contactFirstName", "contactLastName", "contactEmail") VALUES (?, ?, ?, ?)",
|
|
812
|
+
"usedTables": Set {
|
|
813
|
+
"contacts",
|
|
814
|
+
},
|
|
815
|
+
}
|
|
816
|
+
`)
|
|
817
|
+
})
|
|
818
|
+
|
|
819
|
+
it('fails to encode nested inserts because flat columns are required', () => {
|
|
820
|
+
const contactsTable = makeContactsTable()
|
|
821
|
+
|
|
822
|
+
expect(() =>
|
|
823
|
+
contactsTable
|
|
824
|
+
.insert({
|
|
825
|
+
id: 'person-1',
|
|
826
|
+
// @ts-expect-error
|
|
827
|
+
contact: {
|
|
828
|
+
firstName: 'Ada',
|
|
829
|
+
lastName: 'Lovelace',
|
|
830
|
+
email: 'ada@example.com',
|
|
831
|
+
},
|
|
832
|
+
})
|
|
833
|
+
.asSql(),
|
|
834
|
+
).toThrowErrorMatchingInlineSnapshot(`
|
|
835
|
+
[ParseError: contacts\n└─ ["contactFirstName"]\n └─ is missing]
|
|
836
|
+
`)
|
|
837
|
+
})
|
|
625
838
|
})
|
|
626
839
|
})
|
|
627
840
|
|