@fireproof/core 0.21.0-dev-preview-7 → 0.22.0-keybag
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/index.d.ts +2 -16
- package/index.js +2 -15
- package/index.js.map +1 -1
- package/index.ts +2 -0
- package/package.json +12 -70
- package/tsconfig.json +18 -0
- package/README.md +0 -269
- package/apply-head-queue.d.ts +0 -18
- package/apply-head-queue.d.ts.map +0 -1
- package/apply-head-queue.js +0 -47
- package/apply-head-queue.js.map +0 -1
- package/blockstore/attachable-store.d.ts +0 -19
- package/blockstore/attachable-store.d.ts.map +0 -1
- package/blockstore/attachable-store.js +0 -316
- package/blockstore/attachable-store.js.map +0 -1
- package/blockstore/commit-queue.d.ts +0 -17
- package/blockstore/commit-queue.d.ts.map +0 -1
- package/blockstore/commit-queue.js +0 -60
- package/blockstore/commit-queue.js.map +0 -1
- package/blockstore/commitor.d.ts +0 -21
- package/blockstore/commitor.d.ts.map +0 -1
- package/blockstore/commitor.js +0 -95
- package/blockstore/commitor.js.map +0 -1
- package/blockstore/connect-raw.d.ts +0 -2
- package/blockstore/connect-raw.d.ts.map +0 -1
- package/blockstore/connect-raw.js +0 -2
- package/blockstore/connect-raw.js.map +0 -1
- package/blockstore/connection-base.d.ts +0 -2
- package/blockstore/connection-base.d.ts.map +0 -1
- package/blockstore/connection-base.js +0 -2
- package/blockstore/connection-base.js.map +0 -1
- package/blockstore/encrypt-helpers.d.ts +0 -2
- package/blockstore/encrypt-helpers.d.ts.map +0 -1
- package/blockstore/encrypt-helpers.js +0 -2
- package/blockstore/encrypt-helpers.js.map +0 -1
- package/blockstore/fp-envelope.d.ts +0 -32
- package/blockstore/fp-envelope.d.ts.map +0 -1
- package/blockstore/fp-envelope.js +0 -14
- package/blockstore/fp-envelope.js.map +0 -1
- package/blockstore/gateway.d.ts +0 -20
- package/blockstore/gateway.d.ts.map +0 -1
- package/blockstore/gateway.js +0 -2
- package/blockstore/gateway.js.map +0 -1
- package/blockstore/index.d.ts +0 -17
- package/blockstore/index.d.ts.map +0 -1
- package/blockstore/index.js +0 -17
- package/blockstore/index.js.map +0 -1
- package/blockstore/interceptor-gateway.d.ts +0 -29
- package/blockstore/interceptor-gateway.d.ts.map +0 -1
- package/blockstore/interceptor-gateway.js +0 -137
- package/blockstore/interceptor-gateway.js.map +0 -1
- package/blockstore/loader-helpers.d.ts +0 -10
- package/blockstore/loader-helpers.d.ts.map +0 -1
- package/blockstore/loader-helpers.js +0 -115
- package/blockstore/loader-helpers.js.map +0 -1
- package/blockstore/loader.d.ts +0 -62
- package/blockstore/loader.d.ts.map +0 -1
- package/blockstore/loader.js +0 -523
- package/blockstore/loader.js.map +0 -1
- package/blockstore/register-store-protocol.d.ts +0 -22
- package/blockstore/register-store-protocol.d.ts.map +0 -1
- package/blockstore/register-store-protocol.js +0 -125
- package/blockstore/register-store-protocol.js.map +0 -1
- package/blockstore/serde-gateway.d.ts +0 -78
- package/blockstore/serde-gateway.d.ts.map +0 -1
- package/blockstore/serde-gateway.js +0 -2
- package/blockstore/serde-gateway.js.map +0 -1
- package/blockstore/store-factory.d.ts +0 -11
- package/blockstore/store-factory.d.ts.map +0 -1
- package/blockstore/store-factory.js +0 -104
- package/blockstore/store-factory.js.map +0 -1
- package/blockstore/store-remote.d.ts +0 -2
- package/blockstore/store-remote.d.ts.map +0 -1
- package/blockstore/store-remote.js +0 -2
- package/blockstore/store-remote.js.map +0 -1
- package/blockstore/store.d.ts +0 -86
- package/blockstore/store.d.ts.map +0 -1
- package/blockstore/store.js +0 -437
- package/blockstore/store.js.map +0 -1
- package/blockstore/task-manager.d.ts +0 -19
- package/blockstore/task-manager.d.ts.map +0 -1
- package/blockstore/task-manager.js +0 -50
- package/blockstore/task-manager.js.map +0 -1
- package/blockstore/transaction.d.ts +0 -62
- package/blockstore/transaction.d.ts.map +0 -1
- package/blockstore/transaction.js +0 -256
- package/blockstore/transaction.js.map +0 -1
- package/blockstore/types.d.ts +0 -508
- package/blockstore/types.d.ts.map +0 -1
- package/blockstore/types.js +0 -83
- package/blockstore/types.js.map +0 -1
- package/blockstore/uri-interceptor.d.ts +0 -19
- package/blockstore/uri-interceptor.d.ts.map +0 -1
- package/blockstore/uri-interceptor.js +0 -61
- package/blockstore/uri-interceptor.js.map +0 -1
- package/bundle-not-impl.d.ts +0 -2
- package/bundle-not-impl.d.ts.map +0 -1
- package/bundle-not-impl.js +0 -4
- package/bundle-not-impl.js.map +0 -1
- package/cli/main.js +0 -26645
- package/crdt-clock.d.ts +0 -26
- package/crdt-clock.d.ts.map +0 -1
- package/crdt-clock.js +0 -133
- package/crdt-clock.js.map +0 -1
- package/crdt-helpers.d.ts +0 -19
- package/crdt-helpers.d.ts.map +0 -1
- package/crdt-helpers.js +0 -332
- package/crdt-helpers.js.map +0 -1
- package/crdt.d.ts +0 -41
- package/crdt.d.ts.map +0 -1
- package/crdt.js +0 -164
- package/crdt.js.map +0 -1
- package/database.d.ts +0 -33
- package/database.d.ts.map +0 -1
- package/database.js +0 -132
- package/database.js.map +0 -1
- package/deno.json +0 -20
- package/index.d.ts.map +0 -1
- package/indexer-helpers.d.ts +0 -68
- package/indexer-helpers.d.ts.map +0 -1
- package/indexer-helpers.js +0 -157
- package/indexer-helpers.js.map +0 -1
- package/indexer.d.ts +0 -24
- package/indexer.d.ts.map +0 -1
- package/indexer.js +0 -239
- package/indexer.js.map +0 -1
- package/ledger.d.ts +0 -56
- package/ledger.d.ts.map +0 -1
- package/ledger.js +0 -237
- package/ledger.js.map +0 -1
- package/protocols/cloud/http-connection.d.ts +0 -26
- package/protocols/cloud/http-connection.d.ts.map +0 -1
- package/protocols/cloud/http-connection.js +0 -154
- package/protocols/cloud/http-connection.js.map +0 -1
- package/protocols/cloud/index.d.ts +0 -10
- package/protocols/cloud/index.d.ts.map +0 -1
- package/protocols/cloud/index.js +0 -10
- package/protocols/cloud/index.js.map +0 -1
- package/protocols/cloud/msg-raw-connection-base.d.ts +0 -16
- package/protocols/cloud/msg-raw-connection-base.d.ts.map +0 -1
- package/protocols/cloud/msg-raw-connection-base.js +0 -22
- package/protocols/cloud/msg-raw-connection-base.js.map +0 -1
- package/protocols/cloud/msg-types-data.d.ts +0 -36
- package/protocols/cloud/msg-types-data.d.ts.map +0 -1
- package/protocols/cloud/msg-types-data.js +0 -38
- package/protocols/cloud/msg-types-data.js.map +0 -1
- package/protocols/cloud/msg-types-meta.d.ts +0 -41
- package/protocols/cloud/msg-types-meta.d.ts.map +0 -1
- package/protocols/cloud/msg-types-meta.js +0 -98
- package/protocols/cloud/msg-types-meta.js.map +0 -1
- package/protocols/cloud/msg-types-wal.d.ts +0 -33
- package/protocols/cloud/msg-types-wal.d.ts.map +0 -1
- package/protocols/cloud/msg-types-wal.js +0 -38
- package/protocols/cloud/msg-types-wal.js.map +0 -1
- package/protocols/cloud/msg-types.d.ts +0 -310
- package/protocols/cloud/msg-types.d.ts.map +0 -1
- package/protocols/cloud/msg-types.js +0 -299
- package/protocols/cloud/msg-types.js.map +0 -1
- package/protocols/cloud/msger.d.ts +0 -94
- package/protocols/cloud/msger.d.ts.map +0 -1
- package/protocols/cloud/msger.js +0 -319
- package/protocols/cloud/msger.js.map +0 -1
- package/protocols/cloud/ws-connection.d.ts +0 -40
- package/protocols/cloud/ws-connection.d.ts.map +0 -1
- package/protocols/cloud/ws-connection.js +0 -205
- package/protocols/cloud/ws-connection.js.map +0 -1
- package/protocols/dashboard/index.d.ts +0 -4
- package/protocols/dashboard/index.d.ts.map +0 -1
- package/protocols/dashboard/index.js +0 -4
- package/protocols/dashboard/index.js.map +0 -1
- package/protocols/dashboard/msg-api.d.ts +0 -11
- package/protocols/dashboard/msg-api.d.ts.map +0 -1
- package/protocols/dashboard/msg-api.js +0 -55
- package/protocols/dashboard/msg-api.js.map +0 -1
- package/protocols/dashboard/msg-is.d.ts +0 -45
- package/protocols/dashboard/msg-is.d.ts.map +0 -1
- package/protocols/dashboard/msg-is.js +0 -63
- package/protocols/dashboard/msg-is.js.map +0 -1
- package/protocols/dashboard/msg-types.d.ts +0 -397
- package/protocols/dashboard/msg-types.d.ts.map +0 -1
- package/protocols/dashboard/msg-types.js +0 -4
- package/protocols/dashboard/msg-types.js.map +0 -1
- package/protocols/index.d.ts +0 -3
- package/protocols/index.d.ts.map +0 -1
- package/protocols/index.js +0 -3
- package/protocols/index.js.map +0 -1
- package/react/img-file.d.ts +0 -303
- package/react/img-file.d.ts.map +0 -1
- package/react/img-file.js +0 -92
- package/react/img-file.js.map +0 -1
- package/react/index.d.ts +0 -5
- package/react/index.d.ts.map +0 -1
- package/react/index.js +0 -5
- package/react/index.js.map +0 -1
- package/react/types.d.ts +0 -91
- package/react/types.d.ts.map +0 -1
- package/react/types.js +0 -2
- package/react/types.js.map +0 -1
- package/react/use-all-docs.d.ts +0 -4
- package/react/use-all-docs.d.ts.map +0 -1
- package/react/use-all-docs.js +0 -25
- package/react/use-all-docs.js.map +0 -1
- package/react/use-attach.d.ts +0 -11
- package/react/use-attach.d.ts.map +0 -1
- package/react/use-attach.js +0 -169
- package/react/use-attach.js.map +0 -1
- package/react/use-changes.d.ts +0 -4
- package/react/use-changes.d.ts.map +0 -1
- package/react/use-changes.js +0 -19
- package/react/use-changes.js.map +0 -1
- package/react/use-document.d.ts +0 -4
- package/react/use-document.d.ts.map +0 -1
- package/react/use-document.js +0 -109
- package/react/use-document.js.map +0 -1
- package/react/use-fireproof.d.ts +0 -6
- package/react/use-fireproof.d.ts.map +0 -1
- package/react/use-fireproof.js +0 -20
- package/react/use-fireproof.js.map +0 -1
- package/react/use-live-query.d.ts +0 -4
- package/react/use-live-query.d.ts.map +0 -1
- package/react/use-live-query.js +0 -24
- package/react/use-live-query.js.map +0 -1
- package/runtime/files.d.ts +0 -12
- package/runtime/files.d.ts.map +0 -1
- package/runtime/files.js +0 -29
- package/runtime/files.js.map +0 -1
- package/runtime/gateways/cloud/gateway.d.ts +0 -41
- package/runtime/gateways/cloud/gateway.d.ts.map +0 -1
- package/runtime/gateways/cloud/gateway.js +0 -514
- package/runtime/gateways/cloud/gateway.js.map +0 -1
- package/runtime/gateways/cloud/index.d.ts +0 -3
- package/runtime/gateways/cloud/index.d.ts.map +0 -1
- package/runtime/gateways/cloud/index.js +0 -3
- package/runtime/gateways/cloud/index.js.map +0 -1
- package/runtime/gateways/cloud/to-cloud.d.ts +0 -59
- package/runtime/gateways/cloud/to-cloud.d.ts.map +0 -1
- package/runtime/gateways/cloud/to-cloud.js +0 -175
- package/runtime/gateways/cloud/to-cloud.js.map +0 -1
- package/runtime/gateways/def-serde-gateway.d.ts +0 -18
- package/runtime/gateways/def-serde-gateway.d.ts.map +0 -1
- package/runtime/gateways/def-serde-gateway.js +0 -92
- package/runtime/gateways/def-serde-gateway.js.map +0 -1
- package/runtime/gateways/file/deno/deno-filesystem.d.ts +0 -27
- package/runtime/gateways/file/deno/deno-filesystem.d.ts.map +0 -1
- package/runtime/gateways/file/deno/deno-filesystem.js +0 -52
- package/runtime/gateways/file/deno/deno-filesystem.js.map +0 -1
- package/runtime/gateways/file/deno/get-sys-file-system.d.ts +0 -4
- package/runtime/gateways/file/deno/get-sys-file-system.d.ts.map +0 -1
- package/runtime/gateways/file/deno/get-sys-file-system.js +0 -11
- package/runtime/gateways/file/deno/get-sys-file-system.js.map +0 -1
- package/runtime/gateways/file/deno/index.d.ts +0 -2
- package/runtime/gateways/file/deno/index.d.ts.map +0 -1
- package/runtime/gateways/file/deno/index.js +0 -2
- package/runtime/gateways/file/deno/index.js.map +0 -1
- package/runtime/gateways/file/gateway-impl.d.ts +0 -18
- package/runtime/gateways/file/gateway-impl.d.ts.map +0 -1
- package/runtime/gateways/file/gateway-impl.js +0 -121
- package/runtime/gateways/file/gateway-impl.js.map +0 -1
- package/runtime/gateways/file/index.d.ts +0 -3
- package/runtime/gateways/file/index.d.ts.map +0 -1
- package/runtime/gateways/file/index.js +0 -3
- package/runtime/gateways/file/index.js.map +0 -1
- package/runtime/gateways/file/key-bag-file.d.ts +0 -20
- package/runtime/gateways/file/key-bag-file.d.ts.map +0 -1
- package/runtime/gateways/file/key-bag-file.js +0 -52
- package/runtime/gateways/file/key-bag-file.js.map +0 -1
- package/runtime/gateways/file/node/get-sys-file-system.d.ts +0 -4
- package/runtime/gateways/file/node/get-sys-file-system.d.ts.map +0 -1
- package/runtime/gateways/file/node/get-sys-file-system.js +0 -11
- package/runtime/gateways/file/node/get-sys-file-system.js.map +0 -1
- package/runtime/gateways/file/node/index.d.ts +0 -2
- package/runtime/gateways/file/node/index.d.ts.map +0 -1
- package/runtime/gateways/file/node/index.js +0 -2
- package/runtime/gateways/file/node/index.js.map +0 -1
- package/runtime/gateways/file/node/node-filesystem.d.ts +0 -32
- package/runtime/gateways/file/node/node-filesystem.d.ts.map +0 -1
- package/runtime/gateways/file/node/node-filesystem.js +0 -33
- package/runtime/gateways/file/node/node-filesystem.js.map +0 -1
- package/runtime/gateways/file/node/to-array-buffer.d.ts +0 -2
- package/runtime/gateways/file/node/to-array-buffer.d.ts.map +0 -1
- package/runtime/gateways/file/node/to-array-buffer.js +0 -12
- package/runtime/gateways/file/node/to-array-buffer.js.map +0 -1
- package/runtime/gateways/file/sys-file-system-factory.d.ts +0 -4
- package/runtime/gateways/file/sys-file-system-factory.d.ts.map +0 -1
- package/runtime/gateways/file/sys-file-system-factory.js +0 -13
- package/runtime/gateways/file/sys-file-system-factory.js.map +0 -1
- package/runtime/gateways/file/utils.d.ts +0 -5
- package/runtime/gateways/file/utils.d.ts.map +0 -1
- package/runtime/gateways/file/utils.js +0 -27
- package/runtime/gateways/file/utils.js.map +0 -1
- package/runtime/gateways/file/version.d.ts +0 -2
- package/runtime/gateways/file/version.d.ts.map +0 -1
- package/runtime/gateways/file/version.js +0 -2
- package/runtime/gateways/file/version.js.map +0 -1
- package/runtime/gateways/fp-envelope-serialize.d.ts +0 -50
- package/runtime/gateways/fp-envelope-serialize.d.ts.map +0 -1
- package/runtime/gateways/fp-envelope-serialize.js +0 -141
- package/runtime/gateways/fp-envelope-serialize.js.map +0 -1
- package/runtime/gateways/index.d.ts +0 -6
- package/runtime/gateways/index.d.ts.map +0 -1
- package/runtime/gateways/index.js +0 -6
- package/runtime/gateways/index.js.map +0 -1
- package/runtime/gateways/indexeddb/gateway-impl.d.ts +0 -22
- package/runtime/gateways/indexeddb/gateway-impl.d.ts.map +0 -1
- package/runtime/gateways/indexeddb/gateway-impl.js +0 -147
- package/runtime/gateways/indexeddb/gateway-impl.js.map +0 -1
- package/runtime/gateways/indexeddb/index.d.ts +0 -6
- package/runtime/gateways/indexeddb/index.d.ts.map +0 -1
- package/runtime/gateways/indexeddb/index.js +0 -6
- package/runtime/gateways/indexeddb/index.js.map +0 -1
- package/runtime/gateways/indexeddb/key-bag-indexeddb.d.ts +0 -16
- package/runtime/gateways/indexeddb/key-bag-indexeddb.d.ts.map +0 -1
- package/runtime/gateways/indexeddb/key-bag-indexeddb.js +0 -48
- package/runtime/gateways/indexeddb/key-bag-indexeddb.js.map +0 -1
- package/runtime/gateways/indexeddb-version.d.ts +0 -2
- package/runtime/gateways/indexeddb-version.d.ts.map +0 -1
- package/runtime/gateways/indexeddb-version.js +0 -2
- package/runtime/gateways/indexeddb-version.js.map +0 -1
- package/runtime/gateways/memory/gateway.d.ts +0 -18
- package/runtime/gateways/memory/gateway.d.ts.map +0 -1
- package/runtime/gateways/memory/gateway.js +0 -73
- package/runtime/gateways/memory/gateway.js.map +0 -1
- package/runtime/gateways/memory/version.d.ts +0 -2
- package/runtime/gateways/memory/version.d.ts.map +0 -1
- package/runtime/gateways/memory/version.js +0 -2
- package/runtime/gateways/memory/version.js.map +0 -1
- package/runtime/index.d.ts +0 -13
- package/runtime/index.d.ts.map +0 -1
- package/runtime/index.js +0 -13
- package/runtime/index.js.map +0 -1
- package/runtime/key-bag-memory.d.ts +0 -13
- package/runtime/key-bag-memory.d.ts.map +0 -1
- package/runtime/key-bag-memory.js +0 -30
- package/runtime/key-bag-memory.js.map +0 -1
- package/runtime/key-bag.d.ts +0 -88
- package/runtime/key-bag.d.ts.map +0 -1
- package/runtime/key-bag.js +0 -417
- package/runtime/key-bag.js.map +0 -1
- package/runtime/keyed-crypto.d.ts +0 -19
- package/runtime/keyed-crypto.d.ts.map +0 -1
- package/runtime/keyed-crypto.js +0 -192
- package/runtime/keyed-crypto.js.map +0 -1
- package/runtime/memory-sys-container.d.ts +0 -2
- package/runtime/memory-sys-container.d.ts.map +0 -1
- package/runtime/memory-sys-container.js +0 -2
- package/runtime/memory-sys-container.js.map +0 -1
- package/runtime/meta-key-hack.d.ts +0 -42
- package/runtime/meta-key-hack.d.ts.map +0 -1
- package/runtime/meta-key-hack.js +0 -201
- package/runtime/meta-key-hack.js.map +0 -1
- package/runtime/sts-service/index.d.ts +0 -40
- package/runtime/sts-service/index.d.ts.map +0 -1
- package/runtime/sts-service/index.js +0 -108
- package/runtime/sts-service/index.js.map +0 -1
- package/runtime/sys-container.d.ts +0 -2
- package/runtime/sys-container.d.ts.map +0 -1
- package/runtime/sys-container.js +0 -2
- package/runtime/sys-container.js.map +0 -1
- package/runtime/wait-pr-multiformats/block.d.ts +0 -47
- package/runtime/wait-pr-multiformats/block.d.ts.map +0 -1
- package/runtime/wait-pr-multiformats/block.js +0 -64
- package/runtime/wait-pr-multiformats/block.js.map +0 -1
- package/runtime/wait-pr-multiformats/codec-interface.d.ts +0 -29
- package/runtime/wait-pr-multiformats/codec-interface.d.ts.map +0 -1
- package/runtime/wait-pr-multiformats/codec-interface.js +0 -2
- package/runtime/wait-pr-multiformats/codec-interface.js.map +0 -1
- package/runtime/wait-pr-multiformats/index.d.ts +0 -3
- package/runtime/wait-pr-multiformats/index.d.ts.map +0 -1
- package/runtime/wait-pr-multiformats/index.js +0 -3
- package/runtime/wait-pr-multiformats/index.js.map +0 -1
- package/tests/blockstore/fp-envelope.test.ts-off +0 -65
- package/tests/blockstore/fragment-gateway.test.ts-off +0 -106
- package/tests/blockstore/interceptor-gateway.test.ts +0 -254
- package/tests/blockstore/keyed-crypto-indexeddb-file.test.ts +0 -128
- package/tests/blockstore/keyed-crypto.test.ts +0 -376
- package/tests/blockstore/loader.test.ts +0 -298
- package/tests/blockstore/standalone.test.ts +0 -152
- package/tests/blockstore/store.test.ts +0 -192
- package/tests/blockstore/transaction.test.ts +0 -130
- package/tests/fireproof/all-gateway.test.ts +0 -461
- package/tests/fireproof/attachable.test.ts +0 -686
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.car +0 -0
- package/tests/fireproof/cars/bafkreidxwt2nhvbl4fnqfw3ctlt6zbrir4kqwmjo5im6rf4q5si27kgo2i.ts +0 -324
- package/tests/fireproof/charwise-boolean.test.ts +0 -66
- package/tests/fireproof/crdt.test.ts +0 -570
- package/tests/fireproof/database.test.ts +0 -779
- package/tests/fireproof/deleted-docs-handling.test.ts +0 -111
- package/tests/fireproof/fireproof.test.fixture.ts +0 -133
- package/tests/fireproof/fireproof.test.ts +0 -777
- package/tests/fireproof/hello.test.ts +0 -74
- package/tests/fireproof/indexer.test.ts +0 -458
- package/tests/fireproof/multiple-ledger.test.ts +0 -65
- package/tests/fireproof/query-docs.test.ts +0 -116
- package/tests/fireproof/query-limit-issue.test.ts +0 -147
- package/tests/fireproof/query-property-inconsistency.test.ts +0 -89
- package/tests/fireproof/query-result-properties.test.ts +0 -42
- package/tests/fireproof/stable-cid.test.ts +0 -69
- package/tests/fireproof/utils.test.ts +0 -135
- package/tests/gateway/file/loader-config.test.ts +0 -307
- package/tests/gateway/indexeddb/loader-config.test.ts +0 -79
- package/tests/helpers.ts +0 -172
- package/tests/protocols/cloud/msger.test.ts +0 -548
- package/tests/react/img-file.test.tsx +0 -190
- package/tests/react/use-all-docs.test.tsx +0 -172
- package/tests/react/use-document-with-nonexistent-id.test.tsx +0 -96
- package/tests/react/use-fireproof-db-switch.test.tsx +0 -91
- package/tests/react/use-fireproof-stability.test.tsx +0 -145
- package/tests/react/use-fireproof.test.tsx +0 -645
- package/tests/runtime/fp-envelope-serialize.test.ts +0 -254
- package/tests/runtime/meta-key-hack.test.ts +0 -95
- package/tests/setup.file.ts +0 -1
- package/tests/setup.indexeddb.ts +0 -0
- package/tests/setup.memory.ts +0 -2
- package/tests/vitest.file.config.ts +0 -14
- package/tests/vitest.indexeddb.config.ts +0 -37
- package/tests/vitest.memory.config.ts +0 -25
- package/types.d.ts +0 -461
- package/types.d.ts.map +0 -1
- package/types.js +0 -60
- package/types.js.map +0 -1
- package/use-fireproof/iframe-strategy.d.ts +0 -14
- package/use-fireproof/iframe-strategy.d.ts.map +0 -1
- package/use-fireproof/iframe-strategy.js +0 -79
- package/use-fireproof/iframe-strategy.js.map +0 -1
- package/use-fireproof/index.d.ts +0 -14
- package/use-fireproof/index.d.ts.map +0 -1
- package/use-fireproof/index.js +0 -36
- package/use-fireproof/index.js.map +0 -1
- package/use-fireproof/redirect-strategy.d.ts +0 -15
- package/use-fireproof/redirect-strategy.d.ts.map +0 -1
- package/use-fireproof/redirect-strategy.js +0 -153
- package/use-fireproof/redirect-strategy.js.map +0 -1
- package/utils.d.ts +0 -48
- package/utils.d.ts.map +0 -1
- package/utils.js +0 -406
- package/utils.js.map +0 -1
- package/version.d.ts +0 -2
- package/version.d.ts.map +0 -1
- package/version.js +0 -4
- package/version.js.map +0 -1
- package/write-queue.d.ts +0 -9
- package/write-queue.d.ts.map +0 -1
- package/write-queue.js +0 -70
- package/write-queue.js.map +0 -1
@@ -1,190 +0,0 @@
|
|
1
|
-
import { render, waitFor } from "@testing-library/react";
|
2
|
-
import { describe, expect, it, vi } from "vitest";
|
3
|
-
import { ImgFile, bs } from "use-fireproof";
|
4
|
-
import { createElement } from "react";
|
5
|
-
import type { DocFileMeta } from "use-fireproof";
|
6
|
-
|
7
|
-
// Extend HTMLElement to include querySelector for TypeScript
|
8
|
-
|
9
|
-
// Simple SVG content for testing
|
10
|
-
const SVG_CONTENT = `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
11
|
-
<circle cx="12" cy="12" r="10" fill="blue" />
|
12
|
-
</svg>`;
|
13
|
-
|
14
|
-
describe("COMPONENT: ImgFile", () => {
|
15
|
-
// Mock URL methods
|
16
|
-
const mockObjectURL = "mock-object-url";
|
17
|
-
const originalCreateObjectURL = window.URL.createObjectURL;
|
18
|
-
const originalRevokeObjectURL = window.URL.revokeObjectURL;
|
19
|
-
|
20
|
-
beforeEach(() => {
|
21
|
-
window.URL.createObjectURL = vi.fn(() => mockObjectURL);
|
22
|
-
window.URL.revokeObjectURL = vi.fn();
|
23
|
-
});
|
24
|
-
|
25
|
-
afterEach(() => {
|
26
|
-
window.URL.createObjectURL = originalCreateObjectURL;
|
27
|
-
window.URL.revokeObjectURL = originalRevokeObjectURL;
|
28
|
-
});
|
29
|
-
|
30
|
-
// Test timeout value for CI
|
31
|
-
const TEST_TIMEOUT = 60000; // 1 minute per test
|
32
|
-
|
33
|
-
it(
|
34
|
-
"renders the image from a File object",
|
35
|
-
async () => {
|
36
|
-
const file = new File([new Blob([SVG_CONTENT], { type: "image/svg+xml" })], "test.svg", { type: "image/svg+xml" });
|
37
|
-
|
38
|
-
const { container } = render(
|
39
|
-
createElement(ImgFile, {
|
40
|
-
file: file,
|
41
|
-
alt: "Test SVG",
|
42
|
-
className: "test-class",
|
43
|
-
}),
|
44
|
-
);
|
45
|
-
|
46
|
-
await waitFor(() => {
|
47
|
-
const img = container.querySelector("img");
|
48
|
-
expect(img).not.toBeNull();
|
49
|
-
});
|
50
|
-
|
51
|
-
const img = container.querySelector("img");
|
52
|
-
expect(img?.getAttribute("src")).toBe(mockObjectURL);
|
53
|
-
expect(img?.getAttribute("alt")).toBe("Test SVG");
|
54
|
-
expect(img?.classList.contains("test-class")).toBe(true);
|
55
|
-
expect(window.URL.createObjectURL).toHaveBeenCalledWith(file);
|
56
|
-
},
|
57
|
-
TEST_TIMEOUT,
|
58
|
-
);
|
59
|
-
|
60
|
-
it(
|
61
|
-
"does not render when file is not present",
|
62
|
-
() => {
|
63
|
-
const { container } = render(
|
64
|
-
createElement(ImgFile, {
|
65
|
-
file: undefined,
|
66
|
-
alt: "No File",
|
67
|
-
}),
|
68
|
-
);
|
69
|
-
|
70
|
-
const img = container.querySelector("img");
|
71
|
-
expect(img).toBeNull();
|
72
|
-
expect(window.URL.createObjectURL).not.toHaveBeenCalled();
|
73
|
-
},
|
74
|
-
TEST_TIMEOUT,
|
75
|
-
);
|
76
|
-
|
77
|
-
it(
|
78
|
-
"supports legacy 'meta' parameter",
|
79
|
-
async () => {
|
80
|
-
const file = new File([new Blob([SVG_CONTENT], { type: "image/svg+xml" })], "legacy.svg", { type: "image/svg+xml" });
|
81
|
-
|
82
|
-
const { container } = render(
|
83
|
-
createElement(ImgFile, {
|
84
|
-
meta: file,
|
85
|
-
alt: "Legacy File",
|
86
|
-
}),
|
87
|
-
);
|
88
|
-
|
89
|
-
await waitFor(() => {
|
90
|
-
const img = container.querySelector("img");
|
91
|
-
expect(img).not.toBeNull();
|
92
|
-
});
|
93
|
-
|
94
|
-
const img = container.querySelector("img");
|
95
|
-
expect(img?.getAttribute("src")).toBe(mockObjectURL);
|
96
|
-
expect(img?.getAttribute("alt")).toBe("Legacy File");
|
97
|
-
expect(window.URL.createObjectURL).toHaveBeenCalledWith(file);
|
98
|
-
},
|
99
|
-
TEST_TIMEOUT,
|
100
|
-
);
|
101
|
-
|
102
|
-
it(
|
103
|
-
"renders from DocFileMeta object",
|
104
|
-
async () => {
|
105
|
-
const file = new File([new Blob([SVG_CONTENT], { type: "image/svg+xml" })], "meta.svg", { type: "image/svg+xml" });
|
106
|
-
|
107
|
-
// Create a mock DocFileMeta with required cid property
|
108
|
-
const mockCid = { toString: () => "test-cid" } as bs.AnyLink;
|
109
|
-
const docFileMeta: DocFileMeta = {
|
110
|
-
type: "image/svg+xml",
|
111
|
-
size: file.size,
|
112
|
-
cid: mockCid,
|
113
|
-
file: async () => file,
|
114
|
-
};
|
115
|
-
|
116
|
-
const { container } = render(
|
117
|
-
createElement(ImgFile, {
|
118
|
-
file: docFileMeta,
|
119
|
-
alt: "DocFileMeta Image",
|
120
|
-
}),
|
121
|
-
);
|
122
|
-
|
123
|
-
await waitFor(() => {
|
124
|
-
const img = container.querySelector("img");
|
125
|
-
expect(img).not.toBeNull();
|
126
|
-
});
|
127
|
-
|
128
|
-
const img = container.querySelector("img");
|
129
|
-
expect(img?.getAttribute("src")).toBe(mockObjectURL);
|
130
|
-
expect(img?.getAttribute("alt")).toBe("DocFileMeta Image");
|
131
|
-
expect(window.URL.createObjectURL).toHaveBeenCalledWith(file);
|
132
|
-
},
|
133
|
-
TEST_TIMEOUT,
|
134
|
-
);
|
135
|
-
|
136
|
-
it(
|
137
|
-
"does not render for non-image file types",
|
138
|
-
async () => {
|
139
|
-
const textFile = new File(["test content"], "test.txt", { type: "text/plain" });
|
140
|
-
|
141
|
-
const { container } = render(
|
142
|
-
createElement(ImgFile, {
|
143
|
-
file: textFile,
|
144
|
-
alt: "Text File",
|
145
|
-
}),
|
146
|
-
);
|
147
|
-
|
148
|
-
// Wait a bit to ensure any async operations complete
|
149
|
-
await waitFor(
|
150
|
-
() => {
|
151
|
-
// Verify that createObjectURL was called (or not called)
|
152
|
-
expect(window.URL.createObjectURL).toHaveBeenCalledTimes(0);
|
153
|
-
},
|
154
|
-
{ timeout: 1000 },
|
155
|
-
);
|
156
|
-
|
157
|
-
const img = container.querySelector("img");
|
158
|
-
expect(img).toBeNull();
|
159
|
-
},
|
160
|
-
TEST_TIMEOUT,
|
161
|
-
);
|
162
|
-
|
163
|
-
it(
|
164
|
-
"cleans up object URLs when unmounted",
|
165
|
-
async () => {
|
166
|
-
const file = new File([new Blob([SVG_CONTENT], { type: "image/svg+xml" })], "cleanup.svg", { type: "image/svg+xml" });
|
167
|
-
|
168
|
-
const { container, unmount } = render(
|
169
|
-
createElement(ImgFile, {
|
170
|
-
file: file,
|
171
|
-
alt: "Cleanup Test",
|
172
|
-
}),
|
173
|
-
);
|
174
|
-
|
175
|
-
await waitFor(() => {
|
176
|
-
const img = container.querySelector("img");
|
177
|
-
expect(img).not.toBeNull();
|
178
|
-
});
|
179
|
-
|
180
|
-
expect(window.URL.createObjectURL).toHaveBeenCalledWith(file);
|
181
|
-
expect(window.URL.revokeObjectURL).not.toHaveBeenCalled();
|
182
|
-
|
183
|
-
// Unmount to trigger cleanup
|
184
|
-
unmount();
|
185
|
-
|
186
|
-
expect(window.URL.revokeObjectURL).toHaveBeenCalledWith(mockObjectURL);
|
187
|
-
},
|
188
|
-
TEST_TIMEOUT,
|
189
|
-
);
|
190
|
-
});
|
@@ -1,172 +0,0 @@
|
|
1
|
-
import { renderHook, waitFor } from "@testing-library/react";
|
2
|
-
import { describe, expect, it, beforeEach, afterEach } from "vitest";
|
3
|
-
import { fireproof, useFireproof } from "use-fireproof";
|
4
|
-
import type { Database, AllDocsResult } from "use-fireproof";
|
5
|
-
|
6
|
-
// Test timeout value for CI
|
7
|
-
const TEST_TIMEOUT = 45000;
|
8
|
-
|
9
|
-
describe("HOOK: useFireproof useAllDocs", () => {
|
10
|
-
const dbName = "useAllDocsTest";
|
11
|
-
let db: Database,
|
12
|
-
database: ReturnType<typeof useFireproof>["database"],
|
13
|
-
useAllDocs: ReturnType<typeof useFireproof>["useAllDocs"];
|
14
|
-
|
15
|
-
beforeEach(async () => {
|
16
|
-
const expectedValues = ["apple", "banana", "cherry"];
|
17
|
-
db = fireproof(dbName);
|
18
|
-
for (const value of expectedValues) {
|
19
|
-
await db.put({ fruit: value });
|
20
|
-
}
|
21
|
-
|
22
|
-
const allDocs = await db.allDocs<{ fruit: string }>();
|
23
|
-
expect(allDocs.rows.map((row) => row.value.fruit)).toEqual(expectedValues);
|
24
|
-
});
|
25
|
-
|
26
|
-
it(
|
27
|
-
"fetches documents correctly",
|
28
|
-
async () => {
|
29
|
-
let result: AllDocsResult<{ fruit: string }>;
|
30
|
-
|
31
|
-
renderHook(() => {
|
32
|
-
const hookResult = useFireproof(dbName);
|
33
|
-
database = hookResult.database;
|
34
|
-
useAllDocs = hookResult.useAllDocs;
|
35
|
-
result = useAllDocs<{ fruit: string }>();
|
36
|
-
});
|
37
|
-
|
38
|
-
await waitFor(() => {
|
39
|
-
expect(result.docs.length).toBe(3);
|
40
|
-
expect(result.docs.map((doc) => doc.fruit)).toEqual(["apple", "banana", "cherry"]);
|
41
|
-
});
|
42
|
-
},
|
43
|
-
TEST_TIMEOUT,
|
44
|
-
);
|
45
|
-
|
46
|
-
it(
|
47
|
-
"updates when database changes",
|
48
|
-
async () => {
|
49
|
-
let allDocsResult: AllDocsResult<{ fruit: string }>;
|
50
|
-
|
51
|
-
renderHook(() => {
|
52
|
-
const hookResult = useFireproof(dbName);
|
53
|
-
database = hookResult.database;
|
54
|
-
useAllDocs = hookResult.useAllDocs;
|
55
|
-
allDocsResult = useAllDocs<{ fruit: string }>();
|
56
|
-
});
|
57
|
-
|
58
|
-
// Wait for initial data to load
|
59
|
-
await waitFor(() => {
|
60
|
-
expect(allDocsResult.docs.length).toBe(3);
|
61
|
-
});
|
62
|
-
|
63
|
-
// Add a new document
|
64
|
-
await database.put({ fruit: "dragonfruit" });
|
65
|
-
|
66
|
-
// Verify the hook updates with the new document
|
67
|
-
await waitFor(() => {
|
68
|
-
expect(allDocsResult.docs.length).toBe(4);
|
69
|
-
expect(allDocsResult.docs.map((doc) => doc.fruit)).toContain("dragonfruit");
|
70
|
-
});
|
71
|
-
},
|
72
|
-
TEST_TIMEOUT,
|
73
|
-
);
|
74
|
-
|
75
|
-
it(
|
76
|
-
"properly handles subscription lifecycle",
|
77
|
-
async () => {
|
78
|
-
// This test verifies that the subscription works properly
|
79
|
-
// We'll just check that the component renders and updates
|
80
|
-
|
81
|
-
// Render the hook in a way we can unmount it
|
82
|
-
const { unmount, result } = renderHook(() => {
|
83
|
-
const hookResult = useFireproof(dbName);
|
84
|
-
database = hookResult.database;
|
85
|
-
useAllDocs = hookResult.useAllDocs;
|
86
|
-
return useAllDocs<{ fruit: string }>();
|
87
|
-
});
|
88
|
-
|
89
|
-
// Wait for the hook to initialize with data
|
90
|
-
await waitFor(() => {
|
91
|
-
expect(result.current.docs.length).toBe(3);
|
92
|
-
});
|
93
|
-
|
94
|
-
// Add a document to test subscription works
|
95
|
-
await database?.put({ fruit: "date" });
|
96
|
-
|
97
|
-
// Verify the hook updates with the new document
|
98
|
-
await waitFor(() => {
|
99
|
-
expect(result.current.docs.length).toBe(4);
|
100
|
-
});
|
101
|
-
|
102
|
-
// Unmount the component to trigger cleanup
|
103
|
-
unmount();
|
104
|
-
|
105
|
-
// Test passes if no errors occur during unmount
|
106
|
-
},
|
107
|
-
TEST_TIMEOUT,
|
108
|
-
);
|
109
|
-
|
110
|
-
it(
|
111
|
-
"accepts query parameters",
|
112
|
-
async () => {
|
113
|
-
// This test verifies that the hook accepts query parameters
|
114
|
-
let allDocsResult: AllDocsResult<{ fruit: string }>;
|
115
|
-
|
116
|
-
renderHook(() => {
|
117
|
-
const hookResult = useFireproof(dbName);
|
118
|
-
database = hookResult.database;
|
119
|
-
useAllDocs = hookResult.useAllDocs;
|
120
|
-
// Pass query parameters to the hook
|
121
|
-
allDocsResult = useAllDocs<{ fruit: string }>({ descending: true });
|
122
|
-
});
|
123
|
-
|
124
|
-
// Wait for the hook to initialize
|
125
|
-
await waitFor(() => {
|
126
|
-
// Verify that the hook returns data regardless of parameters
|
127
|
-
expect(allDocsResult.docs.length).toBe(3);
|
128
|
-
// The current implementation doesn't filter client-side
|
129
|
-
});
|
130
|
-
},
|
131
|
-
TEST_TIMEOUT,
|
132
|
-
);
|
133
|
-
|
134
|
-
it(
|
135
|
-
"refreshes when query parameters change",
|
136
|
-
async () => {
|
137
|
-
// This test verifies that the useAllDocs hook refreshes when query parameters change
|
138
|
-
let allDocsResult: AllDocsResult<{ fruit: string }>;
|
139
|
-
let queryParams = {};
|
140
|
-
|
141
|
-
const { rerender } = renderHook(() => {
|
142
|
-
const hookResult = useFireproof(dbName);
|
143
|
-
database = hookResult.database;
|
144
|
-
useAllDocs = hookResult.useAllDocs;
|
145
|
-
allDocsResult = useAllDocs<{ fruit: string }>(queryParams);
|
146
|
-
});
|
147
|
-
|
148
|
-
// Verify initial state with no query parameters
|
149
|
-
await waitFor(() => {
|
150
|
-
expect(allDocsResult.docs.length).toBe(3);
|
151
|
-
});
|
152
|
-
|
153
|
-
// Change the query parameters
|
154
|
-
queryParams = { descending: true };
|
155
|
-
rerender();
|
156
|
-
|
157
|
-
// Verify the hook still works after query parameters change
|
158
|
-
// The implementation should handle the parameter change correctly
|
159
|
-
await waitFor(() => {
|
160
|
-
expect(allDocsResult.docs.length).toBe(3);
|
161
|
-
});
|
162
|
-
},
|
163
|
-
TEST_TIMEOUT,
|
164
|
-
);
|
165
|
-
|
166
|
-
afterEach(async () => {
|
167
|
-
await db.close();
|
168
|
-
await db.destroy();
|
169
|
-
await database?.close();
|
170
|
-
await database?.destroy();
|
171
|
-
});
|
172
|
-
});
|
@@ -1,96 +0,0 @@
|
|
1
|
-
import { renderHook, waitFor } from "@testing-library/react";
|
2
|
-
import { describe, expect, it, beforeEach, afterEach } from "vitest";
|
3
|
-
import { fireproof, useFireproof } from "use-fireproof";
|
4
|
-
import type { Database, UseDocumentResult } from "use-fireproof";
|
5
|
-
|
6
|
-
const TEST_TIMEOUT = 45000;
|
7
|
-
|
8
|
-
// Define a type for user settings
|
9
|
-
interface TestTypeDoc {
|
10
|
-
_id?: string;
|
11
|
-
testField?: string;
|
12
|
-
theme?: string;
|
13
|
-
notifications?: boolean;
|
14
|
-
language?: string;
|
15
|
-
}
|
16
|
-
|
17
|
-
describe("HOOK: useDocument with non-existent ID", () => {
|
18
|
-
const dbName = "useDocumentWithNonExistentId";
|
19
|
-
let db: Database;
|
20
|
-
let settingsResult: UseDocumentResult<TestTypeDoc>;
|
21
|
-
let database: ReturnType<typeof useFireproof>["database"];
|
22
|
-
let useDocument: ReturnType<typeof useFireproof>["useDocument"];
|
23
|
-
const testId = "test_settings";
|
24
|
-
|
25
|
-
beforeEach(async () => {
|
26
|
-
db = fireproof(dbName);
|
27
|
-
|
28
|
-
// Make sure the document doesn't exist
|
29
|
-
try {
|
30
|
-
const doc = await db.get(testId);
|
31
|
-
if (doc) {
|
32
|
-
// Use put with _deleted flag instead of delete
|
33
|
-
await db.put({ _id: testId, _deleted: true });
|
34
|
-
}
|
35
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
36
|
-
} catch (_) {
|
37
|
-
// Document doesn't exist, which is what we want
|
38
|
-
}
|
39
|
-
|
40
|
-
renderHook(() => {
|
41
|
-
const result = useFireproof(dbName);
|
42
|
-
database = result.database;
|
43
|
-
useDocument = result.useDocument;
|
44
|
-
settingsResult = useDocument<TestTypeDoc>({ _id: testId, testField: "test" });
|
45
|
-
});
|
46
|
-
});
|
47
|
-
|
48
|
-
it(
|
49
|
-
"should initialize with the provided _id even if document doesn't exist",
|
50
|
-
async () => {
|
51
|
-
// Try to refresh the document to see if we get the error
|
52
|
-
try {
|
53
|
-
await settingsResult.refresh();
|
54
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
55
|
-
} catch (_) {
|
56
|
-
// Expected error when document doesn't exist yet
|
57
|
-
}
|
58
|
-
|
59
|
-
await waitFor(() => {
|
60
|
-
expect(settingsResult.doc._id).toBe(testId);
|
61
|
-
expect(settingsResult.doc.testField).toBe("test");
|
62
|
-
// Other properties should be undefined
|
63
|
-
expect(settingsResult.doc.theme).toBeUndefined();
|
64
|
-
expect(settingsResult.doc.notifications).toBeUndefined();
|
65
|
-
expect(settingsResult.doc.language).toBeUndefined();
|
66
|
-
});
|
67
|
-
|
68
|
-
// Try to get the document directly from the database
|
69
|
-
try {
|
70
|
-
const docFromDb = await db.get(testId);
|
71
|
-
// This should not happen as the document doesn't exist yet
|
72
|
-
expect(docFromDb).toBeUndefined();
|
73
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
74
|
-
} catch (_) {
|
75
|
-
// Expected error when document doesn't exist yet
|
76
|
-
}
|
77
|
-
|
78
|
-
// Try to save the document and see what happens
|
79
|
-
try {
|
80
|
-
await settingsResult.save();
|
81
|
-
// Document should be saved successfully
|
82
|
-
} catch (error) {
|
83
|
-
// This should not happen
|
84
|
-
expect(error).toBeUndefined();
|
85
|
-
}
|
86
|
-
},
|
87
|
-
TEST_TIMEOUT,
|
88
|
-
);
|
89
|
-
|
90
|
-
afterEach(async () => {
|
91
|
-
await db.close();
|
92
|
-
await db.destroy();
|
93
|
-
await database?.close();
|
94
|
-
await database?.destroy();
|
95
|
-
});
|
96
|
-
});
|
@@ -1,91 +0,0 @@
|
|
1
|
-
import { renderHook, waitFor } from "@testing-library/react";
|
2
|
-
import { describe, expect, it } from "vitest";
|
3
|
-
import { fireproof, useFireproof } from "use-fireproof";
|
4
|
-
import type { Database, LiveQueryResult } from "use-fireproof";
|
5
|
-
|
6
|
-
// Test timeout value for CI
|
7
|
-
const TEST_TIMEOUT = 45000;
|
8
|
-
|
9
|
-
describe("HOOK: useFireproof database switching", () => {
|
10
|
-
const db1Name = "db1";
|
11
|
-
const db2Name = "db2";
|
12
|
-
let db1: Database, db2: Database;
|
13
|
-
|
14
|
-
beforeEach(async () => {
|
15
|
-
// Setup two databases with different data
|
16
|
-
db1 = fireproof(db1Name);
|
17
|
-
db2 = fireproof(db2Name);
|
18
|
-
|
19
|
-
// Add data to db1
|
20
|
-
await db1.put({ foo: "db1-data" });
|
21
|
-
|
22
|
-
// Add different data to db2
|
23
|
-
await db2.put({ foo: "db2-data" });
|
24
|
-
});
|
25
|
-
|
26
|
-
it(
|
27
|
-
"should switch databases and update query results when database name changes",
|
28
|
-
async () => {
|
29
|
-
let query: LiveQueryResult<{ foo: string }, string>;
|
30
|
-
let currentDbName: string;
|
31
|
-
let currentDb: Database;
|
32
|
-
|
33
|
-
// Initial render with db1
|
34
|
-
const { rerender } = renderHook(
|
35
|
-
({ dbName }) => {
|
36
|
-
const result = useFireproof(dbName);
|
37
|
-
currentDbName = result.database.name;
|
38
|
-
currentDb = result.database;
|
39
|
-
query = result.useLiveQuery<{ foo: string }>("foo");
|
40
|
-
return result;
|
41
|
-
},
|
42
|
-
{ initialProps: { dbName: db1Name } },
|
43
|
-
);
|
44
|
-
|
45
|
-
// Verify initial state with db1
|
46
|
-
await waitFor(() => {
|
47
|
-
expect(currentDbName).toBe(db1Name);
|
48
|
-
expect(currentDb.name).toBe(db1Name);
|
49
|
-
expect(query.rows.map((row) => row.doc?.foo)).toEqual(["db1-data"]);
|
50
|
-
});
|
51
|
-
|
52
|
-
// Switch to db2
|
53
|
-
rerender({ dbName: db2Name });
|
54
|
-
|
55
|
-
// Verify state with db2
|
56
|
-
await waitFor(() => {
|
57
|
-
expect(currentDbName).toBe(db2Name);
|
58
|
-
expect(currentDb.name).toBe(db2Name);
|
59
|
-
expect(query.rows.map((row) => row.doc?.foo)).toEqual(["db2-data"]);
|
60
|
-
});
|
61
|
-
|
62
|
-
// Switch back to db1
|
63
|
-
rerender({ dbName: db1Name });
|
64
|
-
|
65
|
-
// Verify state is back to db1
|
66
|
-
await waitFor(() => {
|
67
|
-
expect(currentDbName).toBe(db1Name);
|
68
|
-
expect(currentDb.name).toBe(db1Name);
|
69
|
-
expect(query.rows.map((row) => row.doc?.foo)).toEqual(["db1-data"]);
|
70
|
-
});
|
71
|
-
|
72
|
-
// Test that changes to the new database are reflected
|
73
|
-
await db2.put({ foo: "db2-updated" });
|
74
|
-
rerender({ dbName: db2Name });
|
75
|
-
|
76
|
-
await waitFor(() => {
|
77
|
-
expect(currentDbName).toBe(db2Name);
|
78
|
-
expect(currentDb.name).toBe(db2Name);
|
79
|
-
expect(query.rows.map((row) => row.doc?.foo)).toEqual(["db2-data", "db2-updated"]);
|
80
|
-
});
|
81
|
-
},
|
82
|
-
TEST_TIMEOUT,
|
83
|
-
);
|
84
|
-
|
85
|
-
afterEach(async () => {
|
86
|
-
await db1.close();
|
87
|
-
await db1.destroy();
|
88
|
-
await db2.close();
|
89
|
-
await db2.destroy();
|
90
|
-
});
|
91
|
-
});
|
@@ -1,145 +0,0 @@
|
|
1
|
-
import { describe, expect, it, vi } from "vitest";
|
2
|
-
import { act, fireEvent, render, waitFor } from "@testing-library/react";
|
3
|
-
import { createElement, useEffect, useState } from "react";
|
4
|
-
import { useFireproof } from "use-fireproof";
|
5
|
-
|
6
|
-
// Extend HTMLElement for TypeScript compatibility
|
7
|
-
declare global {
|
8
|
-
interface HTMLElement {
|
9
|
-
querySelector(selectors: string): HTMLElement | null;
|
10
|
-
getAttribute(name: string): string | null;
|
11
|
-
textContent: string | null;
|
12
|
-
click(): void;
|
13
|
-
}
|
14
|
-
}
|
15
|
-
|
16
|
-
// Test component that triggers state updates and verifies database stability
|
17
|
-
function TestComponent() {
|
18
|
-
const { database } = useFireproof("test-stability-db");
|
19
|
-
const [counter, setCounter] = useState(0);
|
20
|
-
const initialDatabaseRef = database;
|
21
|
-
|
22
|
-
// Verify that the database reference remains stable across renders
|
23
|
-
if (counter > 0 && initialDatabaseRef !== database) {
|
24
|
-
throw new Error("Database reference changed between renders!");
|
25
|
-
}
|
26
|
-
|
27
|
-
return createElement("div", {}, [
|
28
|
-
createElement("div", { "data-testid": "db-name", key: "db-name" }, database.name),
|
29
|
-
createElement("div", { "data-testid": "counter", key: "counter" }, String(counter)),
|
30
|
-
createElement(
|
31
|
-
"button",
|
32
|
-
{
|
33
|
-
"data-testid": "increment",
|
34
|
-
key: "increment",
|
35
|
-
type: "button",
|
36
|
-
onClick: () => setCounter((c) => c + 1),
|
37
|
-
},
|
38
|
-
"Increment",
|
39
|
-
),
|
40
|
-
]);
|
41
|
-
}
|
42
|
-
|
43
|
-
// Test timeout value for CI
|
44
|
-
const TEST_TIMEOUT = 60000; // 1 minute per test
|
45
|
-
|
46
|
-
describe("HOOK: useFireproof stability", () => {
|
47
|
-
it(
|
48
|
-
"database instance remains stable across renders",
|
49
|
-
async () => {
|
50
|
-
// Mock console.error to catch any React errors
|
51
|
-
const consoleErrorMock = vi.spyOn(console, "error").mockImplementation(vi.fn());
|
52
|
-
|
53
|
-
const { findByTestId } = render(createElement(TestComponent, {}));
|
54
|
-
|
55
|
-
// Get initial state
|
56
|
-
const dbNameEl = await findByTestId("db-name" as const);
|
57
|
-
const counterEl = await findByTestId("counter" as const);
|
58
|
-
|
59
|
-
// Verify initial state
|
60
|
-
expect(dbNameEl.textContent).toBe("test-stability-db");
|
61
|
-
expect(counterEl.textContent).toBe("0");
|
62
|
-
|
63
|
-
// Trigger a re-render by updating state
|
64
|
-
const incrementButton = await findByTestId("increment" as const);
|
65
|
-
await act(async () => {
|
66
|
-
incrementButton.click();
|
67
|
-
});
|
68
|
-
|
69
|
-
// Verify state changed but no errors occurred
|
70
|
-
expect(counterEl.textContent).toBe("1");
|
71
|
-
|
72
|
-
// There should be no errors logged from React about database reference changing
|
73
|
-
expect(consoleErrorMock).not.toHaveBeenCalledWith(expect.stringContaining("Database reference changed between renders"));
|
74
|
-
|
75
|
-
// Perform multiple render cycles to ensure stability
|
76
|
-
for (let i = 0; i < 5; i++) {
|
77
|
-
await act(async () => {
|
78
|
-
incrementButton.click();
|
79
|
-
});
|
80
|
-
}
|
81
|
-
|
82
|
-
// Verify no errors occurred during multiple renders
|
83
|
-
expect(consoleErrorMock).not.toHaveBeenCalledWith(expect.stringContaining("Database reference changed between renders"));
|
84
|
-
|
85
|
-
// Restore console
|
86
|
-
consoleErrorMock.mockRestore();
|
87
|
-
},
|
88
|
-
TEST_TIMEOUT,
|
89
|
-
);
|
90
|
-
|
91
|
-
it(
|
92
|
-
"input events do not cause infinite render loops",
|
93
|
-
async () => {
|
94
|
-
// This test is specifically designed to catch the issue reported in v0.20.0
|
95
|
-
|
96
|
-
function InputTestComponent() {
|
97
|
-
// We still create the database to ensure no infinite render loops occur
|
98
|
-
// But we don't need to use any of its features directly in this test
|
99
|
-
useFireproof("test-input-db");
|
100
|
-
const [inputValue, setInputValue] = useState("");
|
101
|
-
const [renderCount, setRenderCount] = useState(0);
|
102
|
-
|
103
|
-
// Track render count
|
104
|
-
useEffect(() => {
|
105
|
-
setRenderCount((c) => c + 1);
|
106
|
-
}, []);
|
107
|
-
|
108
|
-
return createElement("div", {}, [
|
109
|
-
createElement("input", {
|
110
|
-
type: "text",
|
111
|
-
"data-testid": "input",
|
112
|
-
key: "input",
|
113
|
-
value: inputValue,
|
114
|
-
onChange: (e: { target: { value: string } }) => {
|
115
|
-
setInputValue(e.target.value);
|
116
|
-
},
|
117
|
-
}),
|
118
|
-
createElement("div", { "data-testid": "render-count", key: "render-count" }, String(renderCount)),
|
119
|
-
]);
|
120
|
-
}
|
121
|
-
|
122
|
-
// Instead of using createRoot, use the standard render method
|
123
|
-
const { getByTestId } = render(createElement(InputTestComponent));
|
124
|
-
|
125
|
-
// Get the input element
|
126
|
-
const input = getByTestId("input");
|
127
|
-
|
128
|
-
// Simulate typing in the input field - this would trigger the bug in v0.20.0
|
129
|
-
await waitFor(() => {
|
130
|
-
fireEvent.change(input, { target: { value: "test" } });
|
131
|
-
});
|
132
|
-
|
133
|
-
// Wait a bit to ensure no infinite loop occurs
|
134
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
135
|
-
|
136
|
-
// Verify the render count hasn't exploded (if it were an infinite loop, the test would timeout)
|
137
|
-
const renderCount = getByTestId("render-count");
|
138
|
-
|
139
|
-
// The exact number isn't important, but it should be a small number
|
140
|
-
// If we're in an infinite loop, the test would have timed out before reaching here
|
141
|
-
expect(parseInt(renderCount.textContent || "0", 10)).toBeLessThan(10);
|
142
|
-
},
|
143
|
-
TEST_TIMEOUT,
|
144
|
-
);
|
145
|
-
});
|