@livestore/common 0.4.0 → 0.5.0-dev.1
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 +1 -1
- package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -1
- package/dist/MaterializationJournal.d.ts +44 -0
- package/dist/MaterializationJournal.d.ts.map +1 -0
- package/dist/MaterializationJournal.js +112 -0
- package/dist/MaterializationJournal.js.map +1 -0
- package/dist/StateHead.d.ts +26 -0
- package/dist/StateHead.d.ts.map +1 -0
- package/dist/StateHead.js +50 -0
- package/dist/StateHead.js.map +1 -0
- package/dist/WorkerTransportError.d.ts +3 -3
- package/dist/WorkerTransportError.d.ts.map +1 -1
- package/dist/WorkerTransportError.js +3 -3
- package/dist/WorkerTransportError.js.map +1 -1
- package/dist/__tests__/fixture.d.ts +8 -8
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +4 -4
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/adapter-types.d.ts +33 -57
- package/dist/adapter-types.d.ts.map +1 -1
- package/dist/adapter-types.js +24 -41
- package/dist/adapter-types.js.map +1 -1
- package/dist/bounded-collections.d.ts.map +1 -1
- package/dist/bounded-collections.js.map +1 -1
- package/dist/debug-info.d.ts +56 -56
- package/dist/debug-info.d.ts.map +1 -1
- package/dist/debug-info.js +32 -44
- package/dist/debug-info.js.map +1 -1
- package/dist/defs.d.ts +9 -9
- package/dist/defs.js +2 -2
- package/dist/devtools/devtools-compatibility.test.js +2 -1
- package/dist/devtools/devtools-compatibility.test.js.map +1 -1
- package/dist/devtools/devtools-messages-client-session.d.ts +522 -334
- package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-client-session.js +80 -78
- package/dist/devtools/devtools-messages-client-session.js.map +1 -1
- package/dist/devtools/devtools-messages-common.d.ts +27 -27
- package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-common.js +6 -6
- package/dist/devtools/devtools-messages-common.js.map +1 -1
- package/dist/devtools/devtools-messages-leader.d.ts +410 -348
- package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
- package/dist/devtools/devtools-messages-leader.js +105 -93
- package/dist/devtools/devtools-messages-leader.js.map +1 -1
- package/dist/devtools/devtools-messages.js +3 -3
- package/dist/devtools/devtools-sessioninfo.d.ts +18 -19
- package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -1
- package/dist/devtools/devtools-sessioninfo.js +8 -5
- package/dist/devtools/devtools-sessioninfo.js.map +1 -1
- package/dist/devtools/mod.d.ts +4 -5
- package/dist/devtools/mod.d.ts.map +1 -1
- package/dist/devtools/mod.js +12 -8
- package/dist/devtools/mod.js.map +1 -1
- package/dist/errors.d.ts +45 -69
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +19 -17
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -19
- package/dist/index.js.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.d.ts +87 -18
- package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
- package/dist/leader-thread/LeaderSyncProcessor.js +548 -480
- package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
- package/dist/leader-thread/RejectedPushError.d.ts +72 -41
- package/dist/leader-thread/RejectedPushError.d.ts.map +1 -1
- package/dist/leader-thread/RejectedPushError.js +25 -6
- package/dist/leader-thread/RejectedPushError.js.map +1 -1
- package/dist/leader-thread/connection.d.ts +1 -0
- package/dist/leader-thread/connection.d.ts.map +1 -1
- package/dist/leader-thread/connection.js +11 -10
- package/dist/leader-thread/connection.js.map +1 -1
- package/dist/leader-thread/eventlog.d.ts +15 -5
- package/dist/leader-thread/eventlog.d.ts.map +1 -1
- package/dist/leader-thread/eventlog.js +19 -19
- package/dist/leader-thread/eventlog.js.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
- package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
- package/dist/leader-thread/leader-worker-devtools.js +36 -20
- package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.d.ts +15 -5
- package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.js +62 -58
- package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
- package/dist/leader-thread/make-leader-thread-layer.test.js +9 -9
- package/dist/leader-thread/make-leader-thread-layer.test.js.map +1 -1
- package/dist/leader-thread/materialize-event.d.ts +2 -1
- package/dist/leader-thread/materialize-event.d.ts.map +1 -1
- package/dist/leader-thread/materialize-event.js +12 -8
- package/dist/leader-thread/materialize-event.js.map +1 -1
- package/dist/leader-thread/mod.js +9 -9
- package/dist/leader-thread/recreate-db.d.ts +5 -1
- package/dist/leader-thread/recreate-db.d.ts.map +1 -1
- package/dist/leader-thread/recreate-db.js +34 -59
- package/dist/leader-thread/recreate-db.js.map +1 -1
- package/dist/leader-thread/shutdown-channel.d.ts +2 -6
- package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
- package/dist/leader-thread/shutdown-channel.js +2 -3
- package/dist/leader-thread/shutdown-channel.js.map +1 -1
- package/dist/leader-thread/stream-events.d.ts +4 -7
- package/dist/leader-thread/stream-events.d.ts.map +1 -1
- package/dist/leader-thread/stream-events.js +16 -21
- package/dist/leader-thread/stream-events.js.map +1 -1
- package/dist/leader-thread/types.d.ts +38 -73
- package/dist/leader-thread/types.d.ts.map +1 -1
- package/dist/leader-thread/types.js +10 -6
- package/dist/leader-thread/types.js.map +1 -1
- package/dist/logging.d.ts +5 -30
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +1 -32
- package/dist/logging.js.map +1 -1
- package/dist/make-client-session.d.ts +2 -3
- package/dist/make-client-session.d.ts.map +1 -1
- package/dist/make-client-session.js +5 -5
- package/dist/make-client-session.js.map +1 -1
- package/dist/materializer-helper.d.ts +0 -1
- package/dist/materializer-helper.d.ts.map +1 -1
- package/dist/materializer-helper.js +9 -37
- package/dist/materializer-helper.js.map +1 -1
- package/dist/otel.d.ts +2 -3
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +2 -7
- package/dist/otel.js.map +1 -1
- package/dist/rematerialize-from-eventlog.d.ts +3 -1
- package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
- package/dist/rematerialize-from-eventlog.js +42 -33
- package/dist/rematerialize-from-eventlog.js.map +1 -1
- package/dist/schema/EventDef/define.d.ts +6 -6
- package/dist/schema/EventDef/define.d.ts.map +1 -1
- package/dist/schema/EventDef/define.js +5 -5
- package/dist/schema/EventDef/define.js.map +1 -1
- package/dist/schema/EventDef/define.test.d.ts +2 -0
- package/dist/schema/EventDef/define.test.d.ts.map +1 -0
- package/dist/schema/EventDef/define.test.js +23 -0
- package/dist/schema/EventDef/define.test.js.map +1 -0
- package/dist/schema/EventDef/deprecated.d.ts +8 -13
- package/dist/schema/EventDef/deprecated.d.ts.map +1 -1
- package/dist/schema/EventDef/deprecated.js +12 -13
- package/dist/schema/EventDef/deprecated.js.map +1 -1
- package/dist/schema/EventDef/deprecated.test.js +3 -3
- package/dist/schema/EventDef/deprecated.test.js.map +1 -1
- package/dist/schema/EventDef/event-def.d.ts +1 -1
- package/dist/schema/EventDef/event-def.d.ts.map +1 -1
- package/dist/schema/EventDef/facts.d.ts.map +1 -1
- package/dist/schema/EventDef/materializer.d.ts +2 -2
- package/dist/schema/EventDef/materializer.d.ts.map +1 -1
- package/dist/schema/EventDef/mod.js +5 -5
- package/dist/schema/EventSequenceNumber/client.d.ts +12 -17
- package/dist/schema/EventSequenceNumber/client.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/client.js +20 -24
- package/dist/schema/EventSequenceNumber/client.js.map +1 -1
- package/dist/schema/EventSequenceNumber/global.d.ts +2 -2
- package/dist/schema/EventSequenceNumber/global.d.ts.map +1 -1
- package/dist/schema/EventSequenceNumber/global.js +1 -1
- package/dist/schema/EventSequenceNumber/global.js.map +1 -1
- package/dist/schema/EventSequenceNumber/mod.js +2 -2
- package/dist/schema/EventSequenceNumber.test.js +6 -6
- package/dist/schema/EventSequenceNumber.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.d.ts +58 -187
- package/dist/schema/LiveStoreEvent/client.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/client.js +33 -30
- package/dist/schema/LiveStoreEvent/client.js.map +1 -1
- package/dist/schema/LiveStoreEvent/client.test.js +13 -4
- package/dist/schema/LiveStoreEvent/client.test.js.map +1 -1
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts +7 -7
- package/dist/schema/LiveStoreEvent/for-event-def.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/global.d.ts +6 -6
- package/dist/schema/LiveStoreEvent/global.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/global.js +2 -2
- package/dist/schema/LiveStoreEvent/global.js.map +1 -1
- package/dist/schema/LiveStoreEvent/input.d.ts +6 -6
- package/dist/schema/LiveStoreEvent/input.d.ts.map +1 -1
- package/dist/schema/LiveStoreEvent/input.js +3 -3
- package/dist/schema/LiveStoreEvent/input.js.map +1 -1
- package/dist/schema/LiveStoreEvent/mod.js +4 -4
- package/dist/schema/events.js +1 -1
- package/dist/schema/mod.d.ts +1 -0
- package/dist/schema/mod.d.ts.map +1 -1
- package/dist/schema/mod.js +11 -10
- package/dist/schema/mod.js.map +1 -1
- package/dist/schema/schema.d.ts +1 -1
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +6 -5
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/state/mod.js +2 -2
- package/dist/schema/state/sqlite/client-document-def.d.ts +13 -18
- package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.js +30 -27
- package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
- package/dist/schema/state/sqlite/client-document-def.test.js +53 -18
- package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.d.ts +13 -13
- package/dist/schema/state/sqlite/column-annotations.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.js +13 -15
- package/dist/schema/state/sqlite/column-annotations.js.map +1 -1
- package/dist/schema/state/sqlite/column-annotations.test.js +19 -43
- package/dist/schema/state/sqlite/column-annotations.test.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts +1 -1
- package/dist/schema/state/sqlite/column-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/column-def.js +73 -33
- package/dist/schema/state/sqlite/column-def.js.map +1 -1
- package/dist/schema/state/sqlite/column-def.test.js +176 -75
- 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 +1 -1
- package/dist/schema/state/sqlite/column-spec.js.map +1 -1
- package/dist/schema/state/sqlite/column-spec.test.js +4 -4
- package/dist/schema/state/sqlite/column-spec.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js +5 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint-digest.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts +5 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js +183 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts +2 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js +142 -0
- package/dist/schema/state/sqlite/db-schema/ast/fingerprint.test.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts +3 -8
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -73
- package/dist/schema/state/sqlite/db-schema/ast/sqlite.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.d.ts +9 -9
- 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 +9 -13
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +28 -17
- package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +13 -11
- package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js +6 -4
- package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts +3 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.d.ts.map +1 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js +6 -0
- package/dist/schema/state/sqlite/db-schema/has-json-string-encoding.js.map +1 -0
- package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
- package/dist/schema/state/sqlite/mod.d.ts +1 -3
- package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
- package/dist/schema/state/sqlite/mod.js +11 -10
- package/dist/schema/state/sqlite/mod.js.map +1 -1
- package/dist/schema/state/sqlite/persistence.d.ts +11 -0
- package/dist/schema/state/sqlite/persistence.d.ts.map +1 -0
- package/dist/schema/state/sqlite/persistence.js +10 -0
- package/dist/schema/state/sqlite/persistence.js.map +1 -0
- package/dist/schema/state/sqlite/query-builder/api.d.ts +7 -7
- 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 -23
- package/dist/schema/state/sqlite/query-builder/astToSql.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.js +18 -16
- package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/impl.test.js +364 -598
- package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
- package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.d.ts.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.js +2 -2
- package/dist/schema/state/sqlite/schema-helpers.js.map +1 -1
- package/dist/schema/state/sqlite/schema-helpers.test.js +2 -2
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts +102 -134
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js +5 -5
- package/dist/schema/state/sqlite/system-tables/eventlog-tables.js.map +1 -1
- package/dist/schema/state/sqlite/system-tables/mod.js +2 -2
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts +380 -115
- package/dist/schema/state/sqlite/system-tables/state-tables.d.ts.map +1 -1
- package/dist/schema/state/sqlite/system-tables/state-tables.js +47 -6
- package/dist/schema/state/sqlite/system-tables/state-tables.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.d.ts +17 -20
- package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
- package/dist/schema/state/sqlite/table-def.js +72 -6
- package/dist/schema/state/sqlite/table-def.js.map +1 -1
- package/dist/schema/state/sqlite/table-def.test.js +207 -37
- package/dist/schema/state/sqlite/table-def.test.js.map +1 -1
- package/dist/schema/unknown-events.d.ts.map +1 -1
- package/dist/schema/unknown-events.js +3 -2
- package/dist/schema/unknown-events.js.map +1 -1
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js +28 -6
- package/dist/schema-management/__tests__/migrations-autoincrement-quoting.test.js.map +1 -1
- package/dist/schema-management/common.d.ts.map +1 -1
- package/dist/schema-management/common.js +2 -2
- package/dist/schema-management/migrations.d.ts +4 -4
- package/dist/schema-management/migrations.d.ts.map +1 -1
- package/dist/schema-management/migrations.js +9 -9
- package/dist/schema-management/migrations.js.map +1 -1
- package/dist/schema-management/validate-schema.d.ts.map +1 -1
- package/dist/schema-management/validate-schema.js +1 -1
- package/dist/session-id-symbol.d.ts +29 -0
- package/dist/session-id-symbol.d.ts.map +1 -0
- package/dist/session-id-symbol.js +44 -0
- package/dist/session-id-symbol.js.map +1 -0
- package/dist/sql-queries/index.js +3 -3
- package/dist/sql-queries/sql-queries.d.ts.map +1 -1
- package/dist/sql-queries/sql-queries.js +11 -13
- 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 +1 -1
- package/dist/sql-queries/types.d.ts +6 -7
- package/dist/sql-queries/types.d.ts.map +1 -1
- package/dist/sql-queries/types.js.map +1 -1
- package/dist/sqlite-db-helper.d.ts +23 -3
- package/dist/sqlite-db-helper.d.ts.map +1 -1
- package/dist/sqlite-db-helper.js +39 -4
- package/dist/sqlite-db-helper.js.map +1 -1
- package/dist/sqlite-types.d.ts +3 -6
- package/dist/sqlite-types.d.ts.map +1 -1
- package/dist/sqlite-types.js +3 -3
- package/dist/sqlite-types.js.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.d.ts +41 -19
- package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
- package/dist/sync/ClientSessionSyncProcessor.js +200 -70
- package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
- package/dist/sync/errors.d.ts +12 -18
- package/dist/sync/errors.d.ts.map +1 -1
- package/dist/sync/errors.js +3 -3
- package/dist/sync/errors.js.map +1 -1
- package/dist/sync/index.js +6 -6
- package/dist/sync/mock-sync-backend.d.ts +2 -3
- package/dist/sync/mock-sync-backend.d.ts.map +1 -1
- package/dist/sync/mock-sync-backend.js +58 -37
- package/dist/sync/mock-sync-backend.js.map +1 -1
- package/dist/sync/mock-sync-backend.test.d.ts +2 -0
- package/dist/sync/mock-sync-backend.test.d.ts.map +1 -0
- package/dist/sync/mock-sync-backend.test.js +49 -0
- package/dist/sync/mock-sync-backend.test.js.map +1 -0
- package/dist/sync/next/compact-events.d.ts.map +1 -1
- package/dist/sync/next/compact-events.js +3 -3
- package/dist/sync/next/facts.d.ts.map +1 -1
- package/dist/sync/next/facts.js +1 -1
- package/dist/sync/next/history-dag-common.d.ts +5 -1
- package/dist/sync/next/history-dag-common.d.ts.map +1 -1
- package/dist/sync/next/history-dag-common.js +53 -32
- 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 +5 -4
- package/dist/sync/next/history-dag.js.map +1 -1
- package/dist/sync/next/mod.js +5 -5
- package/dist/sync/next/rebase-events.d.ts.map +1 -1
- package/dist/sync/next/rebase-events.js +2 -2
- package/dist/sync/next/test/compact-events.calculator.test.js +6 -6
- package/dist/sync/next/test/compact-events.test.js +4 -4
- package/dist/sync/next/test/event-fixtures.d.ts +8 -8
- package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
- package/dist/sync/next/test/event-fixtures.js +6 -6
- package/dist/sync/next/test/event-fixtures.js.map +1 -1
- package/dist/sync/next/test/history-dag-common.test.d.ts +2 -0
- package/dist/sync/next/test/history-dag-common.test.d.ts.map +1 -0
- package/dist/sync/next/test/history-dag-common.test.js +73 -0
- package/dist/sync/next/test/history-dag-common.test.js.map +1 -0
- package/dist/sync/next/test/mod.js +1 -1
- package/dist/sync/sync-backend-kv.d.ts.map +1 -1
- package/dist/sync/sync-backend-kv.js +5 -3
- package/dist/sync/sync-backend-kv.js.map +1 -1
- package/dist/sync/sync-backend.d.ts +15 -15
- package/dist/sync/sync-backend.d.ts.map +1 -1
- package/dist/sync/sync-backend.js +10 -6
- package/dist/sync/sync-backend.js.map +1 -1
- package/dist/sync/sync.d.ts +1 -1
- package/dist/sync/sync.d.ts.map +1 -1
- package/dist/sync/sync.js +2 -2
- package/dist/sync/syncstate.d.ts +100 -176
- package/dist/sync/syncstate.d.ts.map +1 -1
- package/dist/sync/syncstate.js +36 -39
- package/dist/sync/syncstate.js.map +1 -1
- package/dist/sync/syncstate.test.js +103 -64
- package/dist/sync/syncstate.test.js.map +1 -1
- package/dist/sync/transport-chunking.d.ts +15 -16
- package/dist/sync/transport-chunking.d.ts.map +1 -1
- package/dist/sync/transport-chunking.js +23 -32
- package/dist/sync/transport-chunking.js.map +1 -1
- package/dist/sync/validate-push-payload.d.ts.map +1 -1
- package/dist/sync/validate-push-payload.js +2 -2
- package/dist/testing/event-factory.d.ts.map +1 -1
- package/dist/testing/event-factory.js +2 -2
- package/dist/testing/event-factory.js.map +1 -1
- package/dist/testing/mod.js +1 -1
- package/dist/util.d.ts +11 -4
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +20 -2
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +40 -57
- package/src/ClientSessionLeaderThreadProxy.ts +1 -1
- package/src/MaterializationJournal.ts +184 -0
- package/src/StateHead.ts +80 -0
- package/src/WorkerTransportError.ts +4 -4
- package/src/__tests__/fixture.ts +3 -3
- package/src/adapter-types.ts +28 -61
- package/src/debug-info.ts +53 -70
- package/src/defs.ts +2 -2
- package/src/devtools/devtools-compatibility.test.ts +1 -0
- package/src/devtools/devtools-messages-client-session.ts +56 -65
- package/src/devtools/devtools-messages-common.ts +12 -11
- package/src/devtools/devtools-messages-leader.ts +71 -69
- package/src/devtools/devtools-sessioninfo.ts +13 -11
- package/src/devtools/mod.ts +4 -5
- package/src/errors.ts +46 -34
- package/src/index.ts +8 -1
- package/src/leader-thread/LeaderSyncProcessor.ts +777 -650
- package/src/leader-thread/RejectedPushError.ts +40 -27
- package/src/leader-thread/connection.ts +12 -8
- package/src/leader-thread/eventlog.ts +20 -12
- package/src/leader-thread/leader-worker-devtools.ts +38 -20
- package/src/leader-thread/make-leader-thread-layer.test.ts +7 -7
- package/src/leader-thread/make-leader-thread-layer.ts +100 -71
- package/src/leader-thread/materialize-event.ts +13 -8
- package/src/leader-thread/recreate-db.ts +41 -75
- package/src/leader-thread/shutdown-channel.ts +3 -14
- package/src/leader-thread/stream-events.ts +102 -101
- package/src/leader-thread/types.ts +29 -62
- package/src/logging.ts +5 -52
- package/src/make-client-session.ts +6 -6
- package/src/materializer-helper.ts +7 -36
- package/src/otel.ts +5 -14
- package/src/rematerialize-from-eventlog.ts +116 -98
- package/src/schema/EventDef/define.test.ts +28 -0
- package/src/schema/EventDef/define.ts +20 -19
- package/src/schema/EventDef/deprecated.test.ts +1 -8
- package/src/schema/EventDef/deprecated.ts +17 -20
- package/src/schema/EventDef/event-def.ts +2 -4
- package/src/schema/EventSequenceNumber/client.ts +20 -24
- package/src/schema/EventSequenceNumber/global.ts +1 -1
- package/src/schema/EventSequenceNumber.test.ts +5 -5
- package/src/schema/LiveStoreEvent/client.test.ts +17 -4
- package/src/schema/LiveStoreEvent/client.ts +36 -35
- package/src/schema/LiveStoreEvent/for-event-def.ts +7 -7
- package/src/schema/LiveStoreEvent/global.ts +1 -1
- package/src/schema/LiveStoreEvent/input.ts +6 -6
- package/src/schema/mod.ts +1 -0
- package/src/schema/schema.ts +4 -3
- package/src/schema/state/sqlite/client-document-def.test.ts +55 -20
- package/src/schema/state/sqlite/client-document-def.ts +95 -80
- package/src/schema/state/sqlite/column-annotations.test.ts +26 -45
- package/src/schema/state/sqlite/column-annotations.ts +26 -30
- package/src/schema/state/sqlite/column-def.test.ts +213 -77
- package/src/schema/state/sqlite/column-def.ts +87 -37
- package/src/schema/state/sqlite/column-spec.test.ts +2 -2
- package/src/schema/state/sqlite/column-spec.ts +3 -2
- package/src/schema/state/sqlite/db-schema/ast/fingerprint-digest.ts +6 -0
- package/src/schema/state/sqlite/db-schema/ast/fingerprint.test.ts +209 -0
- package/src/schema/state/sqlite/db-schema/ast/fingerprint.ts +225 -0
- package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +2 -81
- package/src/schema/state/sqlite/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +123 -63
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +35 -16
- package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +26 -31
- package/src/schema/state/sqlite/db-schema/dsl/mod.ts +35 -21
- package/src/schema/state/sqlite/db-schema/has-json-string-encoding.ts +9 -0
- package/src/schema/state/sqlite/mod.ts +4 -5
- package/src/schema/state/sqlite/persistence.ts +11 -0
- package/src/schema/state/sqlite/query-builder/api.ts +9 -9
- package/src/schema/state/sqlite/query-builder/astToSql.ts +24 -26
- package/src/schema/state/sqlite/query-builder/impl.test.ts +433 -669
- package/src/schema/state/sqlite/query-builder/impl.ts +19 -15
- package/src/schema/state/sqlite/schema-helpers.ts +1 -1
- package/src/schema/state/sqlite/system-tables/eventlog-tables.ts +2 -2
- package/src/schema/state/sqlite/system-tables/state-tables.ts +54 -3
- package/src/schema/state/sqlite/table-def.test.ts +270 -66
- package/src/schema/state/sqlite/table-def.ts +112 -45
- package/src/schema/unknown-events.ts +3 -2
- package/src/schema-management/__tests__/migrations-autoincrement-quoting.test.ts +35 -4
- package/src/schema-management/migrations.ts +7 -6
- package/src/session-id-symbol.ts +59 -0
- package/src/sql-queries/sql-queries.ts +9 -13
- package/src/sql-queries/types.ts +6 -7
- package/src/sqlite-db-helper.ts +64 -2
- package/src/sqlite-types.ts +5 -8
- package/src/sync/ClientSessionSyncProcessor.ts +303 -119
- package/src/sync/errors.ts +14 -12
- package/src/sync/mock-sync-backend.test.ts +78 -0
- package/src/sync/mock-sync-backend.ts +93 -47
- package/src/sync/next/history-dag-common.ts +60 -34
- package/src/sync/next/history-dag.ts +4 -1
- package/src/sync/next/test/compact-events.calculator.test.ts +2 -2
- package/src/sync/next/test/event-fixtures.ts +1 -1
- package/src/sync/next/test/history-dag-common.test.ts +87 -0
- package/src/sync/sync-backend-kv.ts +4 -2
- package/src/sync/sync-backend.ts +15 -15
- package/src/sync/sync.ts +1 -1
- package/src/sync/syncstate.test.ts +191 -140
- package/src/sync/syncstate.ts +63 -53
- package/src/sync/transport-chunking.ts +34 -39
- package/src/util.ts +19 -9
- package/src/version.ts +1 -2
- package/dist/schema/state/sqlite/db-schema/hash.d.ts +0 -2
- package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +0 -1
- package/dist/schema/state/sqlite/db-schema/hash.js +0 -15
- package/dist/schema/state/sqlite/db-schema/hash.js.map +0 -1
- package/dist/sql-queries/misc.d.ts +0 -2
- package/dist/sql-queries/misc.d.ts.map +0 -1
- package/dist/sql-queries/misc.js +0 -2
- package/dist/sql-queries/misc.js.map +0 -1
- package/src/schema/state/sqlite/db-schema/hash.ts +0 -13
- package/src/sql-queries/misc.ts +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { TestSchema } from 'effect/testing';
|
|
1
2
|
import { assert, describe, expect, it } from 'vitest';
|
|
2
|
-
import { Schema } from '@livestore/utils/effect';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from "./column-annotations.js";
|
|
3
|
+
import { Schema, SchemaAST, SchemaTransformation, Struct } from '@livestore/utils/effect';
|
|
4
|
+
import * as State from '../mod.js';
|
|
5
|
+
import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from './column-annotations.js';
|
|
6
6
|
describe('getColumnDefForSchema', () => {
|
|
7
7
|
describe('basic types', () => {
|
|
8
8
|
it('should map Schema.String to text column', () => {
|
|
@@ -10,7 +10,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
10
10
|
expect(columnDef.columnType).toBe('text');
|
|
11
11
|
});
|
|
12
12
|
it('should map Schema.Number to real column', () => {
|
|
13
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.
|
|
13
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Finite);
|
|
14
14
|
expect(columnDef.columnType).toBe('real');
|
|
15
15
|
});
|
|
16
16
|
it('should map Schema.Boolean to integer column', () => {
|
|
@@ -20,14 +20,73 @@ describe('getColumnDefForSchema', () => {
|
|
|
20
20
|
it('should map Schema.Date to text column', () => {
|
|
21
21
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Date);
|
|
22
22
|
expect(columnDef.columnType).toBe('text');
|
|
23
|
-
|
|
24
|
-
expect(Schema.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
const date = new Date('2026-01-02T03:04:05.678Z');
|
|
24
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString());
|
|
25
|
+
expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date);
|
|
26
|
+
expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('String');
|
|
27
|
+
expect(SchemaAST.resolveAt('representation')(Schema.toType(columnDef.schema).ast)?.id).toBe('effect/schema/Date');
|
|
28
|
+
});
|
|
29
|
+
it('should map Schema.DateFromMillis to integer column', () => {
|
|
30
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromMillis);
|
|
28
31
|
expect(columnDef.columnType).toBe('integer');
|
|
29
|
-
expect(Schema.
|
|
30
|
-
expect(Schema.
|
|
32
|
+
expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('Number');
|
|
33
|
+
expect(SchemaAST.resolveAt('representation')(Schema.toType(columnDef.schema).ast)?.id).toBe('effect/schema/Date');
|
|
34
|
+
});
|
|
35
|
+
it('should preserve the Date representation through checks', () => {
|
|
36
|
+
const schema = Schema.DateFromMillis.check(Schema.isGreaterThanDate(new Date(0)));
|
|
37
|
+
expect(State.SQLite.getColumnDefForSchema(schema).columnType).toBe('integer');
|
|
38
|
+
});
|
|
39
|
+
it('should preserve bare Date checks on encoding and decoding', () => {
|
|
40
|
+
const schema = Schema.Date.check(Schema.isGreaterThanDate(new Date(0)));
|
|
41
|
+
const columnDef = State.SQLite.getColumnDefForSchema(schema);
|
|
42
|
+
const date = new Date('2026-01-02T03:04:05.678Z');
|
|
43
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString());
|
|
44
|
+
expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date);
|
|
45
|
+
expect(() => Schema.encodeUnknownSync(columnDef.schema)(new Date(0))).toThrow();
|
|
46
|
+
expect(() => Schema.decodeSync(columnDef.schema)(new Date(0).toISOString())).toThrow();
|
|
47
|
+
});
|
|
48
|
+
it('should round-trip transformations with an encoded Date', () => {
|
|
49
|
+
const schema = Schema.Date.pipe(Schema.decodeTo(Schema.String, SchemaTransformation.transform({
|
|
50
|
+
decode: (date) => date.toISOString(),
|
|
51
|
+
encode: (value) => new Date(value),
|
|
52
|
+
})));
|
|
53
|
+
const columnDef = State.SQLite.getColumnDefForSchema(schema);
|
|
54
|
+
const value = '2026-01-02T03:04:05.678Z';
|
|
55
|
+
expect(columnDef.columnType).toBe('text');
|
|
56
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(value)).toBe(value);
|
|
57
|
+
expect(Schema.decodeSync(columnDef.schema)(value)).toBe(value);
|
|
58
|
+
});
|
|
59
|
+
it.each(['nullable', 'optional'])('should round-trip %s transformations with an encoded Date', (wrapper) => {
|
|
60
|
+
const schema = Schema.Date.pipe(Schema.decodeTo(Schema.String, SchemaTransformation.transform({
|
|
61
|
+
decode: (date) => date.toISOString(),
|
|
62
|
+
encode: (value) => new Date(value),
|
|
63
|
+
})));
|
|
64
|
+
const field = wrapper === 'nullable' ? Schema.NullOr(schema) : Schema.optional(schema);
|
|
65
|
+
const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: field }) }).sqliteDef;
|
|
66
|
+
const columnDef = columns.value;
|
|
67
|
+
const value = '2026-01-02T03:04:05.678Z';
|
|
68
|
+
expect(columnDef.nullable).toBe(true);
|
|
69
|
+
expect(columnDef.columnType).toBe('text');
|
|
70
|
+
const encoded = Schema.encodeUnknownSync(columnDef.schema)(value);
|
|
71
|
+
expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value);
|
|
72
|
+
expect(encoded).toBe(value);
|
|
73
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(null)).toBeNull();
|
|
74
|
+
expect(Schema.decodeSync(columnDef.schema)(null)).toBeNull();
|
|
75
|
+
});
|
|
76
|
+
it('should round-trip transformations with an encoded nullable Date', () => {
|
|
77
|
+
const schema = Schema.NullOr(Schema.Date).pipe(Schema.decodeTo(Schema.String, SchemaTransformation.transform({
|
|
78
|
+
decode: (date) => (date === null ? 'none' : date.toISOString()),
|
|
79
|
+
encode: (value) => (value === 'none' ? null : new Date(value)),
|
|
80
|
+
})));
|
|
81
|
+
const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: schema }) }).sqliteDef;
|
|
82
|
+
const columnDef = columns.value;
|
|
83
|
+
const value = '2026-01-02T03:04:05.678Z';
|
|
84
|
+
const encoded = Schema.encodeUnknownSync(columnDef.schema)(value);
|
|
85
|
+
expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value);
|
|
86
|
+
expect(encoded).toBe(value);
|
|
87
|
+
expect(columnDef.nullable).toBe(true);
|
|
88
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)('none')).toBeNull();
|
|
89
|
+
expect(Schema.decodeSync(columnDef.schema)(null)).toBe('none');
|
|
31
90
|
});
|
|
32
91
|
it('should map Schema.BigInt to text column', () => {
|
|
33
92
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.BigInt);
|
|
@@ -38,16 +97,18 @@ describe('getColumnDefForSchema', () => {
|
|
|
38
97
|
it('should map Schema.Int to integer column', () => {
|
|
39
98
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Int);
|
|
40
99
|
expect(columnDef.columnType).toBe('integer');
|
|
100
|
+
const positiveInt = State.SQLite.getColumnDefForSchema(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)));
|
|
101
|
+
expect(positiveInt.columnType).toBe('integer');
|
|
41
102
|
});
|
|
42
103
|
it('should map string refinements to text column', () => {
|
|
43
104
|
const refinements = [
|
|
44
105
|
{ schema: Schema.NonEmptyString, name: 'NonEmptyString' },
|
|
45
106
|
{ schema: Schema.Trim, name: 'Trim' },
|
|
46
|
-
{ schema: Schema.
|
|
47
|
-
{ schema: Schema.
|
|
48
|
-
{ schema: Schema.String.
|
|
107
|
+
{ schema: Schema.String.check(Schema.isUUID()), name: 'UUID' },
|
|
108
|
+
{ schema: Schema.String.check(Schema.isULID()), name: 'ULID' },
|
|
109
|
+
{ schema: Schema.String.check(Schema.isMinLength(5)), name: 'minLength' },
|
|
49
110
|
{
|
|
50
|
-
schema: Schema.String.
|
|
111
|
+
schema: Schema.String.check(Schema.isPattern(/^[A-Z]+$/)),
|
|
51
112
|
name: 'pattern',
|
|
52
113
|
},
|
|
53
114
|
];
|
|
@@ -59,8 +120,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
59
120
|
it('should map number refinements to real column', () => {
|
|
60
121
|
const refinements = [
|
|
61
122
|
{ schema: Schema.Finite, name: 'Finite' },
|
|
62
|
-
{ schema: Schema.
|
|
63
|
-
{ schema: Schema.Number.pipe(Schema.between(0, 100)), name: 'between' },
|
|
123
|
+
{ schema: Schema.Finite.check(Schema.isBetween({ minimum: 0, maximum: 100 })), name: 'between' },
|
|
64
124
|
];
|
|
65
125
|
for (const { schema, name } of refinements) {
|
|
66
126
|
const columnDef = State.SQLite.getColumnDefForSchema(schema);
|
|
@@ -84,10 +144,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
84
144
|
});
|
|
85
145
|
describe('transformations', () => {
|
|
86
146
|
it('should map transformations based on target type', () => {
|
|
87
|
-
const StringToNumber = Schema.
|
|
88
|
-
decode: Number.parseFloat,
|
|
89
|
-
encode: String,
|
|
90
|
-
}));
|
|
147
|
+
const StringToNumber = Schema.FiniteFromString;
|
|
91
148
|
const columnDef = State.SQLite.getColumnDefForSchema(StringToNumber);
|
|
92
149
|
expect(columnDef.columnType).toBe('text'); // Based on the encoded type (String)
|
|
93
150
|
});
|
|
@@ -100,7 +157,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
100
157
|
it('should map structs to json column', () => {
|
|
101
158
|
const UserSchema = Schema.Struct({
|
|
102
159
|
name: Schema.String,
|
|
103
|
-
age: Schema.
|
|
160
|
+
age: Schema.Finite,
|
|
104
161
|
});
|
|
105
162
|
const columnDef = State.SQLite.getColumnDefForSchema(UserSchema);
|
|
106
163
|
expect(columnDef.columnType).toBe('text');
|
|
@@ -110,17 +167,20 @@ describe('getColumnDefForSchema', () => {
|
|
|
110
167
|
expect(columnDef.columnType).toBe('text');
|
|
111
168
|
});
|
|
112
169
|
it('should map records to json column', () => {
|
|
113
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(
|
|
170
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(Schema.String, Schema.Finite));
|
|
114
171
|
expect(columnDef.columnType).toBe('text');
|
|
115
172
|
});
|
|
116
173
|
it('should map tuples to json column', () => {
|
|
117
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple(Schema.String, Schema.
|
|
174
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple([Schema.String, Schema.Finite]));
|
|
118
175
|
expect(columnDef.columnType).toBe('text');
|
|
119
176
|
});
|
|
120
177
|
it('should map tagged unions to json column', () => {
|
|
121
|
-
const ResultSchema = Schema.Union(
|
|
122
|
-
|
|
123
|
-
|
|
178
|
+
const ResultSchema = Schema.Union([
|
|
179
|
+
Schema.TaggedStruct('success', {
|
|
180
|
+
value: Schema.String,
|
|
181
|
+
}),
|
|
182
|
+
Schema.TaggedStruct('error', { error: Schema.String }),
|
|
183
|
+
]);
|
|
124
184
|
const columnDef = State.SQLite.getColumnDefForSchema(ResultSchema);
|
|
125
185
|
expect(columnDef.columnType).toBe('text');
|
|
126
186
|
});
|
|
@@ -138,7 +198,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
138
198
|
expect(columnDef.columnType).toBe('text');
|
|
139
199
|
});
|
|
140
200
|
it('should handle optional nested schemas', () => {
|
|
141
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Union(Schema.Struct({ name: Schema.String }), Schema.Undefined));
|
|
201
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Union([Schema.Struct({ name: Schema.String }), Schema.Undefined]));
|
|
142
202
|
expect(columnDef.columnType).toBe('text');
|
|
143
203
|
});
|
|
144
204
|
});
|
|
@@ -159,7 +219,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
159
219
|
});
|
|
160
220
|
it('should handle never schema', () => {
|
|
161
221
|
// Create a schema that should never validate
|
|
162
|
-
const neverSchema = Schema.String.
|
|
222
|
+
const neverSchema = Schema.String.check(Schema.makeFilter(() => false, { message: 'Always fails' }));
|
|
163
223
|
const columnDef = State.SQLite.getColumnDefForSchema(neverSchema);
|
|
164
224
|
expect(columnDef.columnType).toBe('text');
|
|
165
225
|
});
|
|
@@ -188,7 +248,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
188
248
|
name: Schema.String,
|
|
189
249
|
email: Schema.String,
|
|
190
250
|
});
|
|
191
|
-
const PickedSchema = UserSchema.
|
|
251
|
+
const PickedSchema = UserSchema.mapFields(Struct.pick(['id', 'name']));
|
|
192
252
|
const columnDef = State.SQLite.getColumnDefForSchema(PickedSchema);
|
|
193
253
|
expect(columnDef.columnType).toBe('text');
|
|
194
254
|
});
|
|
@@ -198,48 +258,58 @@ describe('getColumnDefForSchema', () => {
|
|
|
198
258
|
name: Schema.String,
|
|
199
259
|
password: Schema.String,
|
|
200
260
|
});
|
|
201
|
-
const PublicUserSchema = UserSchema.
|
|
261
|
+
const PublicUserSchema = UserSchema.mapFields(Struct.omit(['password']));
|
|
202
262
|
const columnDef = State.SQLite.getColumnDefForSchema(PublicUserSchema);
|
|
203
263
|
expect(columnDef.columnType).toBe('text');
|
|
204
264
|
});
|
|
205
265
|
});
|
|
206
266
|
describe('annotations', () => {
|
|
207
267
|
it('should handle schemas with custom annotations', () => {
|
|
208
|
-
const AnnotatedString = Schema.String.
|
|
268
|
+
const AnnotatedString = Schema.String.annotate({
|
|
209
269
|
description: 'A special string',
|
|
210
270
|
});
|
|
211
|
-
const AnnotatedNumber = Schema.
|
|
271
|
+
const AnnotatedNumber = Schema.Finite.annotate({ min: 0, max: 100 });
|
|
212
272
|
expect(State.SQLite.getColumnDefForSchema(AnnotatedString).columnType).toBe('text');
|
|
213
273
|
expect(State.SQLite.getColumnDefForSchema(AnnotatedNumber).columnType).toBe('real');
|
|
214
274
|
});
|
|
215
275
|
});
|
|
216
276
|
describe('enums and literal unions', () => {
|
|
217
277
|
it('should handle enums and literal unions as text', () => {
|
|
218
|
-
const StatusEnum = Schema.
|
|
278
|
+
const StatusEnum = Schema.Enum({
|
|
219
279
|
PENDING: 'pending',
|
|
220
280
|
ACTIVE: 'active',
|
|
221
281
|
INACTIVE: 'inactive',
|
|
222
282
|
});
|
|
223
|
-
const StatusUnion = Schema.
|
|
283
|
+
const StatusUnion = Schema.Literals(['pending', 'active', 'inactive']);
|
|
224
284
|
expect(State.SQLite.getColumnDefForSchema(StatusEnum).columnType).toBe('text');
|
|
225
285
|
expect(State.SQLite.getColumnDefForSchema(StatusUnion).columnType).toBe('text');
|
|
226
286
|
});
|
|
227
287
|
it('should handle unions of numeric literals as integer column', () => {
|
|
228
|
-
const IntervalSchema = Schema.
|
|
288
|
+
const IntervalSchema = Schema.Literals([1, 5, 15, 30]);
|
|
229
289
|
const columnDef = State.SQLite.getColumnDefForSchema(IntervalSchema);
|
|
230
290
|
expect(columnDef.columnType).toBe('integer');
|
|
231
291
|
});
|
|
232
292
|
it('should handle unions of non-integer numeric literals as real column', () => {
|
|
233
|
-
const PercentSchema = Schema.
|
|
293
|
+
const PercentSchema = Schema.Literals([0.1, 0.2, 0.25]);
|
|
234
294
|
const columnDef = State.SQLite.getColumnDefForSchema(PercentSchema);
|
|
235
295
|
expect(columnDef.columnType).toBe('real');
|
|
236
296
|
});
|
|
237
297
|
});
|
|
238
298
|
describe('binary data', () => {
|
|
239
|
-
it('should handle Uint8Array as blob column', () => {
|
|
299
|
+
it('should handle Uint8Array as blob column', async () => {
|
|
240
300
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Uint8Array);
|
|
241
301
|
expect(columnDef.columnType).toBe('blob');
|
|
242
|
-
expect(
|
|
302
|
+
expect(SchemaAST.resolveAt('representation')(Schema.toType(columnDef.schema).ast)?.id).toBe('effect/schema/Uint8Array');
|
|
303
|
+
const asserts = new TestSchema.Asserts(columnDef.schema);
|
|
304
|
+
await asserts.decoding().succeed(new Uint8Array([1, 2, 3]));
|
|
305
|
+
});
|
|
306
|
+
it('should preserve Uint8Array checks on blob columns', () => {
|
|
307
|
+
const schema = Schema.Uint8Array.check(Schema.makeFilter((value) => value.byteLength > 0));
|
|
308
|
+
const columnDef = State.SQLite.getColumnDefForSchema(schema);
|
|
309
|
+
expect(columnDef.columnType).toBe('blob');
|
|
310
|
+
expect(columnDef.schema).toBe(schema);
|
|
311
|
+
expect(Schema.decodeSync(columnDef.schema)(new Uint8Array([1]))).toEqual(new Uint8Array([1]));
|
|
312
|
+
expect(() => Schema.decodeSync(columnDef.schema)(new Uint8Array())).toThrow();
|
|
243
313
|
});
|
|
244
314
|
});
|
|
245
315
|
describe('recursive schemas', () => {
|
|
@@ -253,12 +323,12 @@ describe('getColumnDefForSchema', () => {
|
|
|
253
323
|
});
|
|
254
324
|
});
|
|
255
325
|
describe('schema-based table definitions', () => {
|
|
256
|
-
it('should handle optional fields in schema', () => {
|
|
326
|
+
it('should handle optional fields in schema', async () => {
|
|
257
327
|
const UserSchema = Schema.Struct({
|
|
258
328
|
id: Schema.String,
|
|
259
329
|
name: Schema.String,
|
|
260
330
|
email: Schema.optional(Schema.String),
|
|
261
|
-
age: Schema.optional(Schema.
|
|
331
|
+
age: Schema.optional(Schema.Finite),
|
|
262
332
|
});
|
|
263
333
|
const userTable = State.SQLite.table({
|
|
264
334
|
name: 'users',
|
|
@@ -270,11 +340,15 @@ describe('getColumnDefForSchema', () => {
|
|
|
270
340
|
// Non-optional fields should not be nullable
|
|
271
341
|
expect(userTable.sqliteDef.columns.id.nullable).toBe(false);
|
|
272
342
|
expect(userTable.sqliteDef.columns.name.nullable).toBe(false);
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
343
|
+
const asserts = new TestSchema.Asserts(userTable.rowSchema);
|
|
344
|
+
await asserts.decoding().succeed({
|
|
345
|
+
id: 'user-1',
|
|
346
|
+
name: 'Ada',
|
|
347
|
+
email: null,
|
|
348
|
+
age: null,
|
|
349
|
+
});
|
|
276
350
|
});
|
|
277
|
-
it('should handle optional boolean with proper transformation', () => {
|
|
351
|
+
it('should handle optional boolean with proper transformation', async () => {
|
|
278
352
|
const schema = Schema.Struct({
|
|
279
353
|
id: Schema.String,
|
|
280
354
|
active: Schema.optional(Schema.Boolean),
|
|
@@ -282,10 +356,12 @@ describe('getColumnDefForSchema', () => {
|
|
|
282
356
|
const table = State.SQLite.table({ name: 'test', schema });
|
|
283
357
|
expect(table.sqliteDef.columns.active.nullable).toBe(true);
|
|
284
358
|
expect(table.sqliteDef.columns.active.columnType).toBe('integer');
|
|
285
|
-
|
|
286
|
-
|
|
359
|
+
const asserts = new TestSchema.Asserts(table.rowSchema);
|
|
360
|
+
await asserts.decoding().succeed({ id: 'row-1', active: 1 }, { id: 'row-1', active: true });
|
|
361
|
+
expect(Schema.encodeSync(table.sqliteDef.columns.active.schema)(false)).toBe(0);
|
|
362
|
+
await asserts.decoding().succeed({ id: 'row-1', active: null });
|
|
287
363
|
});
|
|
288
|
-
it('should handle optional complex types with JSON encoding', () => {
|
|
364
|
+
it('should handle optional complex types with JSON encoding', async () => {
|
|
289
365
|
const schema = Schema.Struct({
|
|
290
366
|
id: Schema.String,
|
|
291
367
|
metadata: Schema.optional(Schema.Struct({ color: Schema.String })),
|
|
@@ -294,12 +370,21 @@ describe('getColumnDefForSchema', () => {
|
|
|
294
370
|
const table = State.SQLite.table({ name: 'test', schema });
|
|
295
371
|
expect(table.sqliteDef.columns.metadata.nullable).toBe(true);
|
|
296
372
|
expect(table.sqliteDef.columns.metadata.columnType).toBe('text');
|
|
297
|
-
expect(table.rowSchema.fields.metadata.toString()).toBe('(parseJson <-> { readonly color: string }) | null');
|
|
298
373
|
expect(table.sqliteDef.columns.tags.nullable).toBe(true);
|
|
299
374
|
expect(table.sqliteDef.columns.tags.columnType).toBe('text');
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
375
|
+
const asserts = new TestSchema.Asserts(table.rowSchema);
|
|
376
|
+
await asserts.decoding().succeed({
|
|
377
|
+
id: 'row-1',
|
|
378
|
+
metadata: JSON.stringify({ color: 'red' }),
|
|
379
|
+
tags: JSON.stringify(['urgent', 'local']),
|
|
380
|
+
}, {
|
|
381
|
+
id: 'row-1',
|
|
382
|
+
metadata: { color: 'red' },
|
|
383
|
+
tags: ['urgent', 'local'],
|
|
384
|
+
});
|
|
385
|
+
await asserts.decoding().succeed({ id: 'row-1', metadata: null, tags: null });
|
|
386
|
+
});
|
|
387
|
+
it('should handle Schema.NullOr', async () => {
|
|
303
388
|
const schema = Schema.Struct({
|
|
304
389
|
id: Schema.String,
|
|
305
390
|
description: Schema.NullOr(Schema.String),
|
|
@@ -308,43 +393,59 @@ describe('getColumnDefForSchema', () => {
|
|
|
308
393
|
const table = State.SQLite.table({ name: 'test', schema });
|
|
309
394
|
expect(table.sqliteDef.columns.description.nullable).toBe(true);
|
|
310
395
|
expect(table.sqliteDef.columns.count.nullable).toBe(true);
|
|
311
|
-
|
|
312
|
-
|
|
396
|
+
const asserts = new TestSchema.Asserts(table.rowSchema);
|
|
397
|
+
await asserts.decoding().succeed({
|
|
398
|
+
id: 'row-1',
|
|
399
|
+
description: 'ready',
|
|
400
|
+
count: 1,
|
|
401
|
+
});
|
|
402
|
+
await asserts.decoding().succeed({
|
|
403
|
+
id: 'row-1',
|
|
404
|
+
description: null,
|
|
405
|
+
count: null,
|
|
406
|
+
});
|
|
313
407
|
});
|
|
314
|
-
it('should treat unions of string literals as text columns without JSON parsing', () => {
|
|
408
|
+
it('should treat unions of string literals as text columns without JSON parsing', async () => {
|
|
315
409
|
const schema = Schema.Struct({
|
|
316
410
|
id: Schema.String,
|
|
317
|
-
status: Schema.
|
|
411
|
+
status: Schema.Literals(['idle', 'running', 'stopped']),
|
|
318
412
|
});
|
|
319
413
|
const table = State.SQLite.table({ name: 'timers', schema });
|
|
320
414
|
expect(table.sqliteDef.columns.status.columnType).toBe('text');
|
|
321
|
-
expect(
|
|
322
|
-
|
|
415
|
+
expect(Schema.toEncoded(table.sqliteDef.columns.status.schema).ast._tag).toBe('Union');
|
|
416
|
+
const asserts = new TestSchema.Asserts(table.rowSchema);
|
|
417
|
+
await asserts.decoding().succeed({ id: 'timer-1', status: 'idle' });
|
|
323
418
|
});
|
|
324
|
-
it('should handle Schema.NullOr with complex types', () => {
|
|
419
|
+
it('should handle Schema.NullOr with complex types', async () => {
|
|
325
420
|
const schema = Schema.Struct({
|
|
326
|
-
data: Schema.NullOr(Schema.Struct({ value: Schema.
|
|
327
|
-
}).
|
|
421
|
+
data: Schema.NullOr(Schema.Struct({ value: Schema.Finite })),
|
|
422
|
+
}).annotate({ title: 'test' });
|
|
328
423
|
const table = State.SQLite.table({ schema });
|
|
329
424
|
expect(table.sqliteDef.columns.data.nullable).toBe(true);
|
|
330
425
|
expect(table.sqliteDef.columns.data.columnType).toBe('text');
|
|
331
|
-
|
|
426
|
+
const asserts = new TestSchema.Asserts(table.rowSchema);
|
|
427
|
+
await asserts.decoding().succeed({ data: JSON.stringify({ value: 42 }) }, { data: { value: 42 } });
|
|
428
|
+
await asserts.decoding().succeed({ data: null });
|
|
332
429
|
});
|
|
333
|
-
it('should handle mixed nullable and optional fields', () => {
|
|
430
|
+
it('should handle mixed nullable and optional fields', async () => {
|
|
334
431
|
const schema = Schema.Struct({
|
|
335
432
|
nullableText: Schema.NullOr(Schema.String),
|
|
336
433
|
optionalText: Schema.optional(Schema.String),
|
|
337
|
-
optionalJson: Schema.optional(Schema.Struct({ x: Schema.
|
|
338
|
-
}).
|
|
434
|
+
optionalJson: Schema.optional(Schema.Struct({ x: Schema.Finite })),
|
|
435
|
+
}).annotate({ title: 'test' });
|
|
339
436
|
const table = State.SQLite.table({ schema });
|
|
340
437
|
// Both should be nullable at column level
|
|
341
438
|
expect(table.sqliteDef.columns.nullableText.nullable).toBe(true);
|
|
342
439
|
expect(table.sqliteDef.columns.optionalText.nullable).toBe(true);
|
|
343
440
|
expect(table.sqliteDef.columns.optionalJson.nullable).toBe(true);
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
441
|
+
const nullableTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.nullableText.schema);
|
|
442
|
+
const optionalTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalText.schema);
|
|
443
|
+
const optionalJsonAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalJson.schema);
|
|
444
|
+
await nullableTextAsserts.decoding().succeed('hello');
|
|
445
|
+
await nullableTextAsserts.decoding().succeed(null);
|
|
446
|
+
await optionalTextAsserts.decoding().succeed(null);
|
|
447
|
+
await optionalJsonAsserts.decoding().succeed(JSON.stringify({ x: 1 }), { x: 1 });
|
|
448
|
+
await optionalJsonAsserts.decoding().succeed(null);
|
|
348
449
|
});
|
|
349
450
|
// TODO bring back some time later
|
|
350
451
|
// it('should handle lossy Schema.optional(Schema.NullOr(...)) with JSON encoding', () => {
|
|
@@ -352,7 +453,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
352
453
|
// id: Schema.String,
|
|
353
454
|
// lossyText: Schema.optional(Schema.NullOr(Schema.String)),
|
|
354
455
|
// lossyComplex: Schema.optional(Schema.NullOr(Schema.Struct({ value: Schema.Number }))),
|
|
355
|
-
// }).
|
|
456
|
+
// }).annotate({ title: 'lossy_test' })
|
|
356
457
|
// const table = State.SQLite.table({ schema })
|
|
357
458
|
// // Check column definitions for lossy fields
|
|
358
459
|
// expect(table.sqliteDef.columns.lossyText.nullable).toBe(true)
|
|
@@ -371,7 +472,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
371
472
|
describe('annotations', () => {
|
|
372
473
|
describe('withColumnType', () => {
|
|
373
474
|
it('should respect column type annotation for text', () => {
|
|
374
|
-
const schema = Schema.
|
|
475
|
+
const schema = Schema.Finite.pipe(withColumnType('text'));
|
|
375
476
|
const columnDef = State.SQLite.getColumnDefForSchema(schema);
|
|
376
477
|
expect(columnDef.columnType).toBe('text');
|
|
377
478
|
});
|
|
@@ -392,7 +493,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
392
493
|
});
|
|
393
494
|
it('should override default type mapping', () => {
|
|
394
495
|
// Number normally maps to real, but we override to text
|
|
395
|
-
const schema = Schema.
|
|
496
|
+
const schema = Schema.Finite.pipe(withColumnType('text'));
|
|
396
497
|
const columnDef = State.SQLite.getColumnDefForSchema(schema);
|
|
397
498
|
expect(columnDef.columnType).toBe('text');
|
|
398
499
|
});
|
|
@@ -424,7 +525,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
424
525
|
it('should throw when primary key is used with optional schema', () => {
|
|
425
526
|
// Note: Schema.optional returns a property signature, not a schema, so we can't pipe it
|
|
426
527
|
// Instead, we use Schema.Union to create an optional schema that can be piped
|
|
427
|
-
const optionalString = Schema.Union(Schema.String, Schema.Undefined);
|
|
528
|
+
const optionalString = Schema.Union([Schema.String, Schema.Undefined]);
|
|
428
529
|
const UserSchema = Schema.Struct({
|
|
429
530
|
id: optionalString.pipe(withPrimaryKey),
|
|
430
531
|
name: Schema.String,
|
|
@@ -446,7 +547,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
446
547
|
});
|
|
447
548
|
it('should work with column type annotation', () => {
|
|
448
549
|
const UserSchema = Schema.Struct({
|
|
449
|
-
id: Schema.
|
|
550
|
+
id: Schema.Finite.pipe(withColumnType('integer'), withPrimaryKey),
|
|
450
551
|
name: Schema.String,
|
|
451
552
|
});
|
|
452
553
|
const userTable = State.SQLite.table({
|