@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,7 +1,7 @@
|
|
|
1
|
+
import { TestSchema } from 'effect/testing'
|
|
1
2
|
import { assert, describe, expect, it } from 'vitest'
|
|
2
3
|
|
|
3
|
-
import { Schema } from '@livestore/utils/effect'
|
|
4
|
-
import { objectToString } from '@livestore/utils'
|
|
4
|
+
import { Schema, SchemaAST, SchemaTransformation, Struct } from '@livestore/utils/effect'
|
|
5
5
|
|
|
6
6
|
import * as State from '../mod.ts'
|
|
7
7
|
import { withAutoIncrement, withColumnType, withDefault, withPrimaryKey, withUnique } from './column-annotations.ts'
|
|
@@ -14,7 +14,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
14
14
|
})
|
|
15
15
|
|
|
16
16
|
it('should map Schema.Number to real column', () => {
|
|
17
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.
|
|
17
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Finite)
|
|
18
18
|
expect(columnDef.columnType).toBe('real')
|
|
19
19
|
})
|
|
20
20
|
|
|
@@ -26,15 +26,106 @@ describe('getColumnDefForSchema', () => {
|
|
|
26
26
|
it('should map Schema.Date to text column', () => {
|
|
27
27
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Date)
|
|
28
28
|
expect(columnDef.columnType).toBe('text')
|
|
29
|
-
|
|
30
|
-
expect(Schema.
|
|
29
|
+
const date = new Date('2026-01-02T03:04:05.678Z')
|
|
30
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString())
|
|
31
|
+
expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date)
|
|
32
|
+
expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('String')
|
|
33
|
+
expect(
|
|
34
|
+
SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
|
|
35
|
+
).toBe('effect/schema/Date')
|
|
31
36
|
})
|
|
32
37
|
|
|
33
|
-
it('should map Schema.
|
|
34
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.
|
|
38
|
+
it('should map Schema.DateFromMillis to integer column', () => {
|
|
39
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.DateFromMillis)
|
|
35
40
|
expect(columnDef.columnType).toBe('integer')
|
|
36
|
-
expect(Schema.
|
|
37
|
-
expect(
|
|
41
|
+
expect(Schema.toEncoded(columnDef.schema).ast._tag).toBe('Number')
|
|
42
|
+
expect(
|
|
43
|
+
SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
|
|
44
|
+
).toBe('effect/schema/Date')
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('should preserve the Date representation through checks', () => {
|
|
48
|
+
const schema = Schema.DateFromMillis.check(Schema.isGreaterThanDate(new Date(0)))
|
|
49
|
+
|
|
50
|
+
expect(State.SQLite.getColumnDefForSchema(schema).columnType).toBe('integer')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('should preserve bare Date checks on encoding and decoding', () => {
|
|
54
|
+
const schema = Schema.Date.check(Schema.isGreaterThanDate(new Date(0)))
|
|
55
|
+
const columnDef = State.SQLite.getColumnDefForSchema(schema)
|
|
56
|
+
const date = new Date('2026-01-02T03:04:05.678Z')
|
|
57
|
+
|
|
58
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(date)).toBe(date.toISOString())
|
|
59
|
+
expect(Schema.decodeSync(columnDef.schema)(date.toISOString())).toEqual(date)
|
|
60
|
+
expect(() => Schema.encodeUnknownSync(columnDef.schema)(new Date(0))).toThrow()
|
|
61
|
+
expect(() => Schema.decodeSync(columnDef.schema)(new Date(0).toISOString())).toThrow()
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('should round-trip transformations with an encoded Date', () => {
|
|
65
|
+
const schema = Schema.Date.pipe(
|
|
66
|
+
Schema.decodeTo(
|
|
67
|
+
Schema.String,
|
|
68
|
+
SchemaTransformation.transform({
|
|
69
|
+
decode: (date) => date.toISOString(),
|
|
70
|
+
encode: (value) => new Date(value),
|
|
71
|
+
}),
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
const columnDef = State.SQLite.getColumnDefForSchema(schema)
|
|
75
|
+
const value = '2026-01-02T03:04:05.678Z'
|
|
76
|
+
|
|
77
|
+
expect(columnDef.columnType).toBe('text')
|
|
78
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(value)).toBe(value)
|
|
79
|
+
expect(Schema.decodeSync(columnDef.schema)(value)).toBe(value)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it.each(['nullable', 'optional'] as const)(
|
|
83
|
+
'should round-trip %s transformations with an encoded Date',
|
|
84
|
+
(wrapper) => {
|
|
85
|
+
const schema = Schema.Date.pipe(
|
|
86
|
+
Schema.decodeTo(
|
|
87
|
+
Schema.String,
|
|
88
|
+
SchemaTransformation.transform({
|
|
89
|
+
decode: (date) => date.toISOString(),
|
|
90
|
+
encode: (value) => new Date(value),
|
|
91
|
+
}),
|
|
92
|
+
),
|
|
93
|
+
)
|
|
94
|
+
const field = wrapper === 'nullable' ? Schema.NullOr(schema) : Schema.optional(schema)
|
|
95
|
+
const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: field }) }).sqliteDef
|
|
96
|
+
const columnDef = columns.value
|
|
97
|
+
const value = '2026-01-02T03:04:05.678Z'
|
|
98
|
+
|
|
99
|
+
expect(columnDef.nullable).toBe(true)
|
|
100
|
+
expect(columnDef.columnType).toBe('text')
|
|
101
|
+
const encoded = Schema.encodeUnknownSync(columnDef.schema)(value)
|
|
102
|
+
expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value)
|
|
103
|
+
expect(encoded).toBe(value)
|
|
104
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)(null)).toBeNull()
|
|
105
|
+
expect(Schema.decodeSync(columnDef.schema)(null)).toBeNull()
|
|
106
|
+
},
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
it('should round-trip transformations with an encoded nullable Date', () => {
|
|
110
|
+
const schema = Schema.NullOr(Schema.Date).pipe(
|
|
111
|
+
Schema.decodeTo(
|
|
112
|
+
Schema.String,
|
|
113
|
+
SchemaTransformation.transform({
|
|
114
|
+
decode: (date) => (date === null ? 'none' : date.toISOString()),
|
|
115
|
+
encode: (value) => (value === 'none' ? null : new Date(value)),
|
|
116
|
+
}),
|
|
117
|
+
),
|
|
118
|
+
)
|
|
119
|
+
const { columns } = State.SQLite.table({ name: 'stamps', schema: Schema.Struct({ value: schema }) }).sqliteDef
|
|
120
|
+
const columnDef = columns.value
|
|
121
|
+
const value = '2026-01-02T03:04:05.678Z'
|
|
122
|
+
const encoded = Schema.encodeUnknownSync(columnDef.schema)(value)
|
|
123
|
+
|
|
124
|
+
expect(Schema.decodeSync(columnDef.schema)(encoded)).toBe(value)
|
|
125
|
+
expect(encoded).toBe(value)
|
|
126
|
+
expect(columnDef.nullable).toBe(true)
|
|
127
|
+
expect(Schema.encodeUnknownSync(columnDef.schema)('none')).toBeNull()
|
|
128
|
+
expect(Schema.decodeSync(columnDef.schema)(null)).toBe('none')
|
|
38
129
|
})
|
|
39
130
|
|
|
40
131
|
it('should map Schema.BigInt to text column', () => {
|
|
@@ -47,17 +138,20 @@ describe('getColumnDefForSchema', () => {
|
|
|
47
138
|
it('should map Schema.Int to integer column', () => {
|
|
48
139
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Int)
|
|
49
140
|
expect(columnDef.columnType).toBe('integer')
|
|
141
|
+
|
|
142
|
+
const positiveInt = State.SQLite.getColumnDefForSchema(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)))
|
|
143
|
+
expect(positiveInt.columnType).toBe('integer')
|
|
50
144
|
})
|
|
51
145
|
|
|
52
146
|
it('should map string refinements to text column', () => {
|
|
53
147
|
const refinements = [
|
|
54
148
|
{ schema: Schema.NonEmptyString, name: 'NonEmptyString' },
|
|
55
149
|
{ schema: Schema.Trim, name: 'Trim' },
|
|
56
|
-
{ schema: Schema.
|
|
57
|
-
{ schema: Schema.
|
|
58
|
-
{ schema: Schema.String.
|
|
150
|
+
{ schema: Schema.String.check(Schema.isUUID()), name: 'UUID' },
|
|
151
|
+
{ schema: Schema.String.check(Schema.isULID()), name: 'ULID' },
|
|
152
|
+
{ schema: Schema.String.check(Schema.isMinLength(5)), name: 'minLength' },
|
|
59
153
|
{
|
|
60
|
-
schema: Schema.String.
|
|
154
|
+
schema: Schema.String.check(Schema.isPattern(/^[A-Z]+$/)),
|
|
61
155
|
name: 'pattern',
|
|
62
156
|
},
|
|
63
157
|
]
|
|
@@ -71,8 +165,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
71
165
|
it('should map number refinements to real column', () => {
|
|
72
166
|
const refinements = [
|
|
73
167
|
{ schema: Schema.Finite, name: 'Finite' },
|
|
74
|
-
{ schema: Schema.
|
|
75
|
-
{ schema: Schema.Number.pipe(Schema.between(0, 100)), name: 'between' },
|
|
168
|
+
{ schema: Schema.Finite.check(Schema.isBetween({ minimum: 0, maximum: 100 })), name: 'between' },
|
|
76
169
|
]
|
|
77
170
|
|
|
78
171
|
for (const { schema, name } of refinements) {
|
|
@@ -101,12 +194,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
101
194
|
|
|
102
195
|
describe('transformations', () => {
|
|
103
196
|
it('should map transformations based on target type', () => {
|
|
104
|
-
const StringToNumber = Schema.
|
|
105
|
-
Schema.transform(Schema.Number, {
|
|
106
|
-
decode: Number.parseFloat,
|
|
107
|
-
encode: String,
|
|
108
|
-
}),
|
|
109
|
-
)
|
|
197
|
+
const StringToNumber = Schema.FiniteFromString
|
|
110
198
|
|
|
111
199
|
const columnDef = State.SQLite.getColumnDefForSchema(StringToNumber)
|
|
112
200
|
expect(columnDef.columnType).toBe('text') // Based on the encoded type (String)
|
|
@@ -122,7 +210,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
122
210
|
it('should map structs to json column', () => {
|
|
123
211
|
const UserSchema = Schema.Struct({
|
|
124
212
|
name: Schema.String,
|
|
125
|
-
age: Schema.
|
|
213
|
+
age: Schema.Finite,
|
|
126
214
|
})
|
|
127
215
|
|
|
128
216
|
const columnDef = State.SQLite.getColumnDefForSchema(UserSchema)
|
|
@@ -135,22 +223,22 @@ describe('getColumnDefForSchema', () => {
|
|
|
135
223
|
})
|
|
136
224
|
|
|
137
225
|
it('should map records to json column', () => {
|
|
138
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(
|
|
226
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Record(Schema.String, Schema.Finite))
|
|
139
227
|
expect(columnDef.columnType).toBe('text')
|
|
140
228
|
})
|
|
141
229
|
|
|
142
230
|
it('should map tuples to json column', () => {
|
|
143
|
-
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple(Schema.String, Schema.
|
|
231
|
+
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Tuple([Schema.String, Schema.Finite]))
|
|
144
232
|
expect(columnDef.columnType).toBe('text')
|
|
145
233
|
})
|
|
146
234
|
|
|
147
235
|
it('should map tagged unions to json column', () => {
|
|
148
|
-
const ResultSchema = Schema.Union(
|
|
236
|
+
const ResultSchema = Schema.Union([
|
|
149
237
|
Schema.TaggedStruct('success', {
|
|
150
238
|
value: Schema.String,
|
|
151
239
|
}),
|
|
152
240
|
Schema.TaggedStruct('error', { error: Schema.String }),
|
|
153
|
-
)
|
|
241
|
+
])
|
|
154
242
|
|
|
155
243
|
const columnDef = State.SQLite.getColumnDefForSchema(ResultSchema)
|
|
156
244
|
expect(columnDef.columnType).toBe('text')
|
|
@@ -173,7 +261,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
173
261
|
|
|
174
262
|
it('should handle optional nested schemas', () => {
|
|
175
263
|
const columnDef = State.SQLite.getColumnDefForSchema(
|
|
176
|
-
Schema.Union(Schema.Struct({ name: Schema.String }), Schema.Undefined),
|
|
264
|
+
Schema.Union([Schema.Struct({ name: Schema.String }), Schema.Undefined]),
|
|
177
265
|
)
|
|
178
266
|
expect(columnDef.columnType).toBe('text')
|
|
179
267
|
})
|
|
@@ -198,7 +286,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
198
286
|
|
|
199
287
|
it('should handle never schema', () => {
|
|
200
288
|
// Create a schema that should never validate
|
|
201
|
-
const neverSchema = Schema.String.
|
|
289
|
+
const neverSchema = Schema.String.check(Schema.makeFilter(() => false, { message: 'Always fails' }))
|
|
202
290
|
|
|
203
291
|
const columnDef = State.SQLite.getColumnDefForSchema(neverSchema)
|
|
204
292
|
expect(columnDef.columnType).toBe('text')
|
|
@@ -234,7 +322,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
234
322
|
email: Schema.String,
|
|
235
323
|
})
|
|
236
324
|
|
|
237
|
-
const PickedSchema = UserSchema.
|
|
325
|
+
const PickedSchema = UserSchema.mapFields(Struct.pick(['id', 'name']))
|
|
238
326
|
|
|
239
327
|
const columnDef = State.SQLite.getColumnDefForSchema(PickedSchema)
|
|
240
328
|
expect(columnDef.columnType).toBe('text')
|
|
@@ -247,7 +335,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
247
335
|
password: Schema.String,
|
|
248
336
|
})
|
|
249
337
|
|
|
250
|
-
const PublicUserSchema = UserSchema.
|
|
338
|
+
const PublicUserSchema = UserSchema.mapFields(Struct.omit(['password']))
|
|
251
339
|
|
|
252
340
|
const columnDef = State.SQLite.getColumnDefForSchema(PublicUserSchema)
|
|
253
341
|
expect(columnDef.columnType).toBe('text')
|
|
@@ -256,10 +344,10 @@ describe('getColumnDefForSchema', () => {
|
|
|
256
344
|
|
|
257
345
|
describe('annotations', () => {
|
|
258
346
|
it('should handle schemas with custom annotations', () => {
|
|
259
|
-
const AnnotatedString = Schema.String.
|
|
347
|
+
const AnnotatedString = Schema.String.annotate({
|
|
260
348
|
description: 'A special string',
|
|
261
349
|
})
|
|
262
|
-
const AnnotatedNumber = Schema.
|
|
350
|
+
const AnnotatedNumber = Schema.Finite.annotate({ min: 0, max: 100 })
|
|
263
351
|
|
|
264
352
|
expect(State.SQLite.getColumnDefForSchema(AnnotatedString).columnType).toBe('text')
|
|
265
353
|
expect(State.SQLite.getColumnDefForSchema(AnnotatedNumber).columnType).toBe('real')
|
|
@@ -268,20 +356,20 @@ describe('getColumnDefForSchema', () => {
|
|
|
268
356
|
|
|
269
357
|
describe('enums and literal unions', () => {
|
|
270
358
|
it('should handle enums and literal unions as text', () => {
|
|
271
|
-
const StatusEnum = Schema.
|
|
359
|
+
const StatusEnum = Schema.Enum({
|
|
272
360
|
PENDING: 'pending',
|
|
273
361
|
ACTIVE: 'active',
|
|
274
362
|
INACTIVE: 'inactive',
|
|
275
363
|
})
|
|
276
364
|
|
|
277
|
-
const StatusUnion = Schema.
|
|
365
|
+
const StatusUnion = Schema.Literals(['pending', 'active', 'inactive'])
|
|
278
366
|
|
|
279
367
|
expect(State.SQLite.getColumnDefForSchema(StatusEnum).columnType).toBe('text')
|
|
280
368
|
expect(State.SQLite.getColumnDefForSchema(StatusUnion).columnType).toBe('text')
|
|
281
369
|
})
|
|
282
370
|
|
|
283
371
|
it('should handle unions of numeric literals as integer column', () => {
|
|
284
|
-
const IntervalSchema = Schema.
|
|
372
|
+
const IntervalSchema = Schema.Literals([1, 5, 15, 30])
|
|
285
373
|
|
|
286
374
|
const columnDef = State.SQLite.getColumnDefForSchema(IntervalSchema)
|
|
287
375
|
|
|
@@ -289,7 +377,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
289
377
|
})
|
|
290
378
|
|
|
291
379
|
it('should handle unions of non-integer numeric literals as real column', () => {
|
|
292
|
-
const PercentSchema = Schema.
|
|
380
|
+
const PercentSchema = Schema.Literals([0.1, 0.2, 0.25])
|
|
293
381
|
|
|
294
382
|
const columnDef = State.SQLite.getColumnDefForSchema(PercentSchema)
|
|
295
383
|
|
|
@@ -298,10 +386,25 @@ describe('getColumnDefForSchema', () => {
|
|
|
298
386
|
})
|
|
299
387
|
|
|
300
388
|
describe('binary data', () => {
|
|
301
|
-
it('should handle Uint8Array as blob column', () => {
|
|
389
|
+
it('should handle Uint8Array as blob column', async () => {
|
|
302
390
|
const columnDef = State.SQLite.getColumnDefForSchema(Schema.Uint8Array)
|
|
303
391
|
expect(columnDef.columnType).toBe('blob')
|
|
304
|
-
expect(
|
|
392
|
+
expect(
|
|
393
|
+
SchemaAST.resolveAt<{ readonly id: string }>('representation')(Schema.toType(columnDef.schema).ast)?.id,
|
|
394
|
+
).toBe('effect/schema/Uint8Array')
|
|
395
|
+
|
|
396
|
+
const asserts = new TestSchema.Asserts(columnDef.schema)
|
|
397
|
+
await asserts.decoding().succeed(new Uint8Array([1, 2, 3]))
|
|
398
|
+
})
|
|
399
|
+
|
|
400
|
+
it('should preserve Uint8Array checks on blob columns', () => {
|
|
401
|
+
const schema = Schema.Uint8Array.check(Schema.makeFilter((value) => value.byteLength > 0))
|
|
402
|
+
const columnDef = State.SQLite.getColumnDefForSchema(schema)
|
|
403
|
+
|
|
404
|
+
expect(columnDef.columnType).toBe('blob')
|
|
405
|
+
expect(columnDef.schema).toBe(schema)
|
|
406
|
+
expect(Schema.decodeSync(columnDef.schema)(new Uint8Array([1]))).toEqual(new Uint8Array([1]))
|
|
407
|
+
expect(() => Schema.decodeSync(columnDef.schema)(new Uint8Array())).toThrow()
|
|
305
408
|
})
|
|
306
409
|
})
|
|
307
410
|
|
|
@@ -322,12 +425,12 @@ describe('getColumnDefForSchema', () => {
|
|
|
322
425
|
})
|
|
323
426
|
|
|
324
427
|
describe('schema-based table definitions', () => {
|
|
325
|
-
it('should handle optional fields in schema', () => {
|
|
428
|
+
it('should handle optional fields in schema', async () => {
|
|
326
429
|
const UserSchema = Schema.Struct({
|
|
327
430
|
id: Schema.String,
|
|
328
431
|
name: Schema.String,
|
|
329
432
|
email: Schema.optional(Schema.String),
|
|
330
|
-
age: Schema.optional(Schema.
|
|
433
|
+
age: Schema.optional(Schema.Finite),
|
|
331
434
|
})
|
|
332
435
|
|
|
333
436
|
const userTable = State.SQLite.table({
|
|
@@ -343,12 +446,16 @@ describe('getColumnDefForSchema', () => {
|
|
|
343
446
|
expect(userTable.sqliteDef.columns.id.nullable).toBe(false)
|
|
344
447
|
expect(userTable.sqliteDef.columns.name.nullable).toBe(false)
|
|
345
448
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
449
|
+
const asserts = new TestSchema.Asserts(userTable.rowSchema)
|
|
450
|
+
await asserts.decoding().succeed({
|
|
451
|
+
id: 'user-1',
|
|
452
|
+
name: 'Ada',
|
|
453
|
+
email: null,
|
|
454
|
+
age: null,
|
|
455
|
+
})
|
|
349
456
|
})
|
|
350
457
|
|
|
351
|
-
it('should handle optional boolean with proper transformation', () => {
|
|
458
|
+
it('should handle optional boolean with proper transformation', async () => {
|
|
352
459
|
const schema = Schema.Struct({
|
|
353
460
|
id: Schema.String,
|
|
354
461
|
active: Schema.optional(Schema.Boolean),
|
|
@@ -358,11 +465,13 @@ describe('getColumnDefForSchema', () => {
|
|
|
358
465
|
|
|
359
466
|
expect(table.sqliteDef.columns.active.nullable).toBe(true)
|
|
360
467
|
expect(table.sqliteDef.columns.active.columnType).toBe('integer')
|
|
361
|
-
|
|
362
|
-
|
|
468
|
+
const asserts = new TestSchema.Asserts(table.rowSchema)
|
|
469
|
+
await asserts.decoding().succeed({ id: 'row-1', active: 1 }, { id: 'row-1', active: true })
|
|
470
|
+
expect(Schema.encodeSync(table.sqliteDef.columns.active.schema)(false)).toBe(0)
|
|
471
|
+
await asserts.decoding().succeed({ id: 'row-1', active: null })
|
|
363
472
|
})
|
|
364
473
|
|
|
365
|
-
it('should handle optional complex types with JSON encoding', () => {
|
|
474
|
+
it('should handle optional complex types with JSON encoding', async () => {
|
|
366
475
|
const schema = Schema.Struct({
|
|
367
476
|
id: Schema.String,
|
|
368
477
|
metadata: Schema.optional(Schema.Struct({ color: Schema.String })),
|
|
@@ -373,17 +482,27 @@ describe('getColumnDefForSchema', () => {
|
|
|
373
482
|
|
|
374
483
|
expect(table.sqliteDef.columns.metadata.nullable).toBe(true)
|
|
375
484
|
expect(table.sqliteDef.columns.metadata.columnType).toBe('text')
|
|
376
|
-
expect((table.rowSchema as any).fields.metadata.toString()).toBe(
|
|
377
|
-
'(parseJson <-> { readonly color: string }) | null',
|
|
378
|
-
// '(parseJson <-> { readonly color: string } | null)', // not sure yet about which semantics we want here
|
|
379
|
-
)
|
|
380
485
|
|
|
381
486
|
expect(table.sqliteDef.columns.tags.nullable).toBe(true)
|
|
382
487
|
expect(table.sqliteDef.columns.tags.columnType).toBe('text')
|
|
383
|
-
|
|
488
|
+
|
|
489
|
+
const asserts = new TestSchema.Asserts(table.rowSchema)
|
|
490
|
+
await asserts.decoding().succeed(
|
|
491
|
+
{
|
|
492
|
+
id: 'row-1',
|
|
493
|
+
metadata: JSON.stringify({ color: 'red' }),
|
|
494
|
+
tags: JSON.stringify(['urgent', 'local']),
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
id: 'row-1',
|
|
498
|
+
metadata: { color: 'red' },
|
|
499
|
+
tags: ['urgent', 'local'],
|
|
500
|
+
},
|
|
501
|
+
)
|
|
502
|
+
await asserts.decoding().succeed({ id: 'row-1', metadata: null, tags: null })
|
|
384
503
|
})
|
|
385
504
|
|
|
386
|
-
it('should handle Schema.NullOr', () => {
|
|
505
|
+
it('should handle Schema.NullOr', async () => {
|
|
387
506
|
const schema = Schema.Struct({
|
|
388
507
|
id: Schema.String,
|
|
389
508
|
description: Schema.NullOr(Schema.String),
|
|
@@ -395,41 +514,55 @@ describe('getColumnDefForSchema', () => {
|
|
|
395
514
|
expect(table.sqliteDef.columns.description.nullable).toBe(true)
|
|
396
515
|
expect(table.sqliteDef.columns.count.nullable).toBe(true)
|
|
397
516
|
|
|
398
|
-
|
|
399
|
-
|
|
517
|
+
const asserts = new TestSchema.Asserts(table.rowSchema)
|
|
518
|
+
await asserts.decoding().succeed({
|
|
519
|
+
id: 'row-1',
|
|
520
|
+
description: 'ready',
|
|
521
|
+
count: 1,
|
|
522
|
+
})
|
|
523
|
+
await asserts.decoding().succeed({
|
|
524
|
+
id: 'row-1',
|
|
525
|
+
description: null,
|
|
526
|
+
count: null,
|
|
527
|
+
})
|
|
400
528
|
})
|
|
401
529
|
|
|
402
|
-
it('should treat unions of string literals as text columns without JSON parsing', () => {
|
|
530
|
+
it('should treat unions of string literals as text columns without JSON parsing', async () => {
|
|
403
531
|
const schema = Schema.Struct({
|
|
404
532
|
id: Schema.String,
|
|
405
|
-
status: Schema.
|
|
533
|
+
status: Schema.Literals(['idle', 'running', 'stopped']),
|
|
406
534
|
})
|
|
407
535
|
|
|
408
536
|
const table = State.SQLite.table({ name: 'timers', schema })
|
|
409
537
|
|
|
410
538
|
expect(table.sqliteDef.columns.status.columnType).toBe('text')
|
|
411
|
-
expect(
|
|
412
|
-
|
|
539
|
+
expect(Schema.toEncoded(table.sqliteDef.columns.status.schema).ast._tag).toBe('Union')
|
|
540
|
+
|
|
541
|
+
const asserts = new TestSchema.Asserts(table.rowSchema)
|
|
542
|
+
await asserts.decoding().succeed({ id: 'timer-1', status: 'idle' })
|
|
413
543
|
})
|
|
414
544
|
|
|
415
|
-
it('should handle Schema.NullOr with complex types', () => {
|
|
545
|
+
it('should handle Schema.NullOr with complex types', async () => {
|
|
416
546
|
const schema = Schema.Struct({
|
|
417
|
-
data: Schema.NullOr(Schema.Struct({ value: Schema.
|
|
418
|
-
}).
|
|
547
|
+
data: Schema.NullOr(Schema.Struct({ value: Schema.Finite })),
|
|
548
|
+
}).annotate({ title: 'test' })
|
|
419
549
|
|
|
420
550
|
const table = State.SQLite.table({ schema })
|
|
421
551
|
|
|
422
552
|
expect(table.sqliteDef.columns.data.nullable).toBe(true)
|
|
423
553
|
expect(table.sqliteDef.columns.data.columnType).toBe('text')
|
|
424
|
-
|
|
554
|
+
|
|
555
|
+
const asserts = new TestSchema.Asserts(table.rowSchema)
|
|
556
|
+
await asserts.decoding().succeed({ data: JSON.stringify({ value: 42 }) }, { data: { value: 42 } })
|
|
557
|
+
await asserts.decoding().succeed({ data: null })
|
|
425
558
|
})
|
|
426
559
|
|
|
427
|
-
it('should handle mixed nullable and optional fields', () => {
|
|
560
|
+
it('should handle mixed nullable and optional fields', async () => {
|
|
428
561
|
const schema = Schema.Struct({
|
|
429
562
|
nullableText: Schema.NullOr(Schema.String),
|
|
430
563
|
optionalText: Schema.optional(Schema.String),
|
|
431
|
-
optionalJson: Schema.optional(Schema.Struct({ x: Schema.
|
|
432
|
-
}).
|
|
564
|
+
optionalJson: Schema.optional(Schema.Struct({ x: Schema.Finite })),
|
|
565
|
+
}).annotate({ title: 'test' })
|
|
433
566
|
|
|
434
567
|
const table = State.SQLite.table({ schema })
|
|
435
568
|
|
|
@@ -438,12 +571,15 @@ describe('getColumnDefForSchema', () => {
|
|
|
438
571
|
expect(table.sqliteDef.columns.optionalText.nullable).toBe(true)
|
|
439
572
|
expect(table.sqliteDef.columns.optionalJson.nullable).toBe(true)
|
|
440
573
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
)
|
|
574
|
+
const nullableTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.nullableText.schema)
|
|
575
|
+
const optionalTextAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalText.schema)
|
|
576
|
+
const optionalJsonAsserts = new TestSchema.Asserts(table.sqliteDef.columns.optionalJson.schema)
|
|
577
|
+
|
|
578
|
+
await nullableTextAsserts.decoding().succeed('hello')
|
|
579
|
+
await nullableTextAsserts.decoding().succeed(null)
|
|
580
|
+
await optionalTextAsserts.decoding().succeed(null)
|
|
581
|
+
await optionalJsonAsserts.decoding().succeed(JSON.stringify({ x: 1 }), { x: 1 })
|
|
582
|
+
await optionalJsonAsserts.decoding().succeed(null)
|
|
447
583
|
})
|
|
448
584
|
|
|
449
585
|
// TODO bring back some time later
|
|
@@ -452,7 +588,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
452
588
|
// id: Schema.String,
|
|
453
589
|
// lossyText: Schema.optional(Schema.NullOr(Schema.String)),
|
|
454
590
|
// lossyComplex: Schema.optional(Schema.NullOr(Schema.Struct({ value: Schema.Number }))),
|
|
455
|
-
// }).
|
|
591
|
+
// }).annotate({ title: 'lossy_test' })
|
|
456
592
|
|
|
457
593
|
// const table = State.SQLite.table({ schema })
|
|
458
594
|
|
|
@@ -476,7 +612,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
476
612
|
describe('annotations', () => {
|
|
477
613
|
describe('withColumnType', () => {
|
|
478
614
|
it('should respect column type annotation for text', () => {
|
|
479
|
-
const schema = Schema.
|
|
615
|
+
const schema = Schema.Finite.pipe(withColumnType('text'))
|
|
480
616
|
const columnDef = State.SQLite.getColumnDefForSchema(schema)
|
|
481
617
|
expect(columnDef.columnType).toBe('text')
|
|
482
618
|
})
|
|
@@ -501,7 +637,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
501
637
|
|
|
502
638
|
it('should override default type mapping', () => {
|
|
503
639
|
// Number normally maps to real, but we override to text
|
|
504
|
-
const schema = Schema.
|
|
640
|
+
const schema = Schema.Finite.pipe(withColumnType('text'))
|
|
505
641
|
const columnDef = State.SQLite.getColumnDefForSchema(schema)
|
|
506
642
|
expect(columnDef.columnType).toBe('text')
|
|
507
643
|
})
|
|
@@ -540,7 +676,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
540
676
|
it('should throw when primary key is used with optional schema', () => {
|
|
541
677
|
// Note: Schema.optional returns a property signature, not a schema, so we can't pipe it
|
|
542
678
|
// Instead, we use Schema.Union to create an optional schema that can be piped
|
|
543
|
-
const optionalString = Schema.Union(Schema.String, Schema.Undefined)
|
|
679
|
+
const optionalString = Schema.Union([Schema.String, Schema.Undefined])
|
|
544
680
|
const UserSchema = Schema.Struct({
|
|
545
681
|
id: optionalString.pipe(withPrimaryKey),
|
|
546
682
|
name: Schema.String,
|
|
@@ -570,7 +706,7 @@ describe('getColumnDefForSchema', () => {
|
|
|
570
706
|
|
|
571
707
|
it('should work with column type annotation', () => {
|
|
572
708
|
const UserSchema = Schema.Struct({
|
|
573
|
-
id: Schema.
|
|
709
|
+
id: Schema.Finite.pipe(withColumnType('integer'), withPrimaryKey),
|
|
574
710
|
name: Schema.String,
|
|
575
711
|
})
|
|
576
712
|
|