@fireproof/core 0.20.5-dev-preview-1 → 0.20.5-dev-preview-3
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/apply-head-queue.d.ts +18 -0
- package/apply-head-queue.d.ts.map +1 -0
- package/apply-head-queue.js +47 -0
- package/apply-head-queue.js.map +1 -0
- package/blockstore/attachable-store.d.ts +19 -0
- package/blockstore/attachable-store.d.ts.map +1 -0
- package/blockstore/attachable-store.js +316 -0
- package/blockstore/attachable-store.js.map +1 -0
- package/blockstore/commit-queue.d.ts +17 -0
- package/blockstore/commit-queue.d.ts.map +1 -0
- package/blockstore/commit-queue.js +60 -0
- package/blockstore/commit-queue.js.map +1 -0
- package/blockstore/commitor.d.ts +21 -0
- package/blockstore/commitor.d.ts.map +1 -0
- package/blockstore/commitor.js +95 -0
- package/blockstore/commitor.js.map +1 -0
- package/blockstore/connect-raw.d.ts +2 -0
- package/blockstore/connect-raw.d.ts.map +1 -0
- package/blockstore/connect-raw.js +2 -0
- package/blockstore/connect-raw.js.map +1 -0
- package/blockstore/connection-base.d.ts +2 -0
- package/blockstore/connection-base.d.ts.map +1 -0
- package/blockstore/connection-base.js +2 -0
- package/blockstore/connection-base.js.map +1 -0
- package/blockstore/encrypt-helpers.d.ts +2 -0
- package/blockstore/encrypt-helpers.d.ts.map +1 -0
- package/blockstore/encrypt-helpers.js +2 -0
- package/blockstore/encrypt-helpers.js.map +1 -0
- package/blockstore/fp-envelope.d.ts +32 -0
- package/blockstore/fp-envelope.d.ts.map +1 -0
- package/blockstore/fp-envelope.js +14 -0
- package/blockstore/fp-envelope.js.map +1 -0
- package/blockstore/gateway.d.ts +20 -0
- package/blockstore/gateway.d.ts.map +1 -0
- package/blockstore/gateway.js +2 -0
- package/blockstore/gateway.js.map +1 -0
- package/blockstore/index.d.ts +16 -0
- package/blockstore/index.d.ts.map +1 -0
- package/blockstore/index.js +16 -0
- package/blockstore/index.js.map +1 -0
- package/blockstore/interceptor-gateway.d.ts +29 -0
- package/blockstore/interceptor-gateway.d.ts.map +1 -0
- package/blockstore/interceptor-gateway.js +137 -0
- package/blockstore/interceptor-gateway.js.map +1 -0
- package/blockstore/loader-helpers.d.ts +10 -0
- package/blockstore/loader-helpers.d.ts.map +1 -0
- package/blockstore/loader-helpers.js +115 -0
- package/blockstore/loader-helpers.js.map +1 -0
- package/blockstore/loader.d.ts +61 -0
- package/blockstore/loader.d.ts.map +1 -0
- package/blockstore/loader.js +494 -0
- package/blockstore/loader.js.map +1 -0
- package/blockstore/register-store-protocol.d.ts +22 -0
- package/blockstore/register-store-protocol.d.ts.map +1 -0
- package/blockstore/register-store-protocol.js +114 -0
- package/blockstore/register-store-protocol.js.map +1 -0
- package/blockstore/serde-gateway.d.ts +78 -0
- package/blockstore/serde-gateway.d.ts.map +1 -0
- package/blockstore/serde-gateway.js +2 -0
- package/blockstore/serde-gateway.js.map +1 -0
- package/blockstore/store-factory.d.ts +11 -0
- package/blockstore/store-factory.d.ts.map +1 -0
- package/blockstore/store-factory.js +104 -0
- package/blockstore/store-factory.js.map +1 -0
- package/blockstore/store-remote.d.ts +2 -0
- package/blockstore/store-remote.d.ts.map +1 -0
- package/blockstore/store-remote.js +2 -0
- package/blockstore/store-remote.js.map +1 -0
- package/blockstore/store.d.ts +86 -0
- package/blockstore/store.d.ts.map +1 -0
- package/blockstore/store.js +439 -0
- package/blockstore/store.js.map +1 -0
- package/blockstore/task-manager.d.ts +19 -0
- package/blockstore/task-manager.d.ts.map +1 -0
- package/blockstore/task-manager.js +50 -0
- package/blockstore/task-manager.js.map +1 -0
- package/blockstore/transaction.d.ts +62 -0
- package/blockstore/transaction.d.ts.map +1 -0
- package/blockstore/transaction.js +261 -0
- package/blockstore/transaction.js.map +1 -0
- package/blockstore/types.d.ts +508 -0
- package/blockstore/types.d.ts.map +1 -0
- package/blockstore/types.js +83 -0
- package/blockstore/types.js.map +1 -0
- package/blockstore/uri-interceptor.d.ts +19 -0
- package/blockstore/uri-interceptor.d.ts.map +1 -0
- package/blockstore/uri-interceptor.js +61 -0
- package/blockstore/uri-interceptor.js.map +1 -0
- package/bundle-not-impl.d.ts +2 -0
- package/bundle-not-impl.d.ts.map +1 -0
- package/bundle-not-impl.js +4 -0
- package/bundle-not-impl.js.map +1 -0
- package/cli/main.js +26616 -0
- package/crdt-clock.d.ts +27 -0
- package/crdt-clock.d.ts.map +1 -0
- package/crdt-clock.js +138 -0
- package/crdt-clock.js.map +1 -0
- package/crdt-helpers.d.ts +19 -0
- package/crdt-helpers.d.ts.map +1 -0
- package/crdt-helpers.js +332 -0
- package/crdt-helpers.js.map +1 -0
- package/crdt.d.ts +41 -0
- package/crdt.d.ts.map +1 -0
- package/crdt.js +164 -0
- package/crdt.js.map +1 -0
- package/database.d.ts +34 -0
- package/database.d.ts.map +1 -0
- package/database.js +124 -0
- package/database.js.map +1 -0
- package/deno.json +2 -2
- package/index.d.ts +15 -2741
- package/index.d.ts.map +1 -0
- package/index.js +14 -7274
- package/index.js.map +1 -1
- package/indexer-helpers.d.ts +69 -0
- package/indexer-helpers.d.ts.map +1 -0
- package/indexer-helpers.js +136 -0
- package/indexer-helpers.js.map +1 -0
- package/indexer.d.ts +24 -0
- package/indexer.d.ts.map +1 -0
- package/indexer.js +230 -0
- package/indexer.js.map +1 -0
- package/ledger.d.ts +55 -0
- package/ledger.d.ts.map +1 -0
- package/ledger.js +234 -0
- package/ledger.js.map +1 -0
- package/package.json +26 -17
- package/protocols/cloud/http-connection.d.ts +25 -0
- package/protocols/cloud/http-connection.d.ts.map +1 -0
- package/protocols/cloud/http-connection.js +153 -0
- package/protocols/cloud/http-connection.js.map +1 -0
- package/protocols/cloud/index.d.ts +10 -0
- package/protocols/cloud/index.d.ts.map +1 -0
- package/protocols/cloud/index.js +10 -0
- package/protocols/cloud/index.js.map +1 -0
- package/protocols/cloud/msg-raw-connection-base.d.ts +16 -0
- package/protocols/cloud/msg-raw-connection-base.d.ts.map +1 -0
- package/protocols/cloud/msg-raw-connection-base.js +22 -0
- package/protocols/cloud/msg-raw-connection-base.js.map +1 -0
- package/protocols/cloud/msg-types-data.d.ts +36 -0
- package/protocols/cloud/msg-types-data.d.ts.map +1 -0
- package/protocols/cloud/msg-types-data.js +38 -0
- package/protocols/cloud/msg-types-data.js.map +1 -0
- package/protocols/cloud/msg-types-meta.d.ts +41 -0
- package/protocols/cloud/msg-types-meta.d.ts.map +1 -0
- package/protocols/cloud/msg-types-meta.js +98 -0
- package/protocols/cloud/msg-types-meta.js.map +1 -0
- package/protocols/cloud/msg-types-wal.d.ts +33 -0
- package/protocols/cloud/msg-types-wal.d.ts.map +1 -0
- package/protocols/cloud/msg-types-wal.js +38 -0
- package/protocols/cloud/msg-types-wal.js.map +1 -0
- package/protocols/cloud/msg-types.d.ts +282 -0
- package/protocols/cloud/msg-types.d.ts.map +1 -0
- package/protocols/cloud/msg-types.js +278 -0
- package/protocols/cloud/msg-types.js.map +1 -0
- package/protocols/cloud/msger.d.ts +79 -0
- package/protocols/cloud/msger.d.ts.map +1 -0
- package/protocols/cloud/msger.js +198 -0
- package/protocols/cloud/msger.js.map +1 -0
- package/protocols/cloud/ws-connection.d.ts +29 -0
- package/protocols/cloud/ws-connection.d.ts.map +1 -0
- package/protocols/cloud/ws-connection.js +166 -0
- package/protocols/cloud/ws-connection.js.map +1 -0
- package/protocols/index.d.ts +2 -0
- package/protocols/index.d.ts.map +1 -0
- package/protocols/index.js +2 -0
- package/protocols/index.js.map +1 -0
- package/react/create-attach.d.ts +6 -0
- package/react/create-attach.d.ts.map +1 -0
- package/react/create-attach.js +75 -0
- package/react/create-attach.js.map +1 -0
- package/react/{index.d.cts → img-file.d.ts} +6 -53
- package/react/img-file.d.ts.map +1 -0
- package/react/img-file.js +57 -0
- package/react/img-file.js.map +1 -0
- package/react/index.d.ts +5 -336
- package/react/index.d.ts.map +1 -0
- package/react/index.js +4 -358
- package/react/index.js.map +1 -1
- package/react/types.d.ts +71 -0
- package/react/types.d.ts.map +1 -0
- package/react/types.js +2 -0
- package/react/types.js.map +1 -0
- package/react/use-all-docs.d.ts +4 -0
- package/react/use-all-docs.d.ts.map +1 -0
- package/react/use-all-docs.js +25 -0
- package/react/use-all-docs.js.map +1 -0
- package/react/use-attach.d.ts +6 -0
- package/react/use-attach.d.ts.map +1 -0
- package/react/use-attach.js +75 -0
- package/react/use-attach.js.map +1 -0
- package/react/use-changes.d.ts +4 -0
- package/react/use-changes.d.ts.map +1 -0
- package/react/use-changes.js +19 -0
- package/react/use-changes.js.map +1 -0
- package/react/use-document.d.ts +4 -0
- package/react/use-document.d.ts.map +1 -0
- package/react/use-document.js +109 -0
- package/react/use-document.js.map +1 -0
- package/react/use-fireproof.d.ts +6 -0
- package/react/use-fireproof.d.ts.map +1 -0
- package/react/use-fireproof.js +20 -0
- package/react/use-fireproof.js.map +1 -0
- package/react/use-live-query.d.ts +4 -0
- package/react/use-live-query.d.ts.map +1 -0
- package/react/use-live-query.js +27 -0
- package/react/use-live-query.js.map +1 -0
- package/runtime/files.d.ts +12 -0
- package/runtime/files.d.ts.map +1 -0
- package/runtime/files.js +29 -0
- package/runtime/files.js.map +1 -0
- package/runtime/gateways/cloud/gateway.d.ts +42 -0
- package/runtime/gateways/cloud/gateway.d.ts.map +1 -0
- package/runtime/gateways/cloud/gateway.js +528 -0
- package/runtime/gateways/cloud/gateway.js.map +1 -0
- package/runtime/gateways/cloud/index.d.ts +3 -0
- package/runtime/gateways/cloud/index.d.ts.map +1 -0
- package/runtime/gateways/cloud/index.js +3 -0
- package/runtime/gateways/cloud/index.js.map +1 -0
- package/runtime/gateways/cloud/to-cloud.d.ts +46 -0
- package/runtime/gateways/cloud/to-cloud.d.ts.map +1 -0
- package/runtime/gateways/cloud/to-cloud.js +159 -0
- package/runtime/gateways/cloud/to-cloud.js.map +1 -0
- package/runtime/gateways/def-serde-gateway.d.ts +18 -0
- package/runtime/gateways/def-serde-gateway.d.ts.map +1 -0
- package/runtime/gateways/def-serde-gateway.js +89 -0
- package/runtime/gateways/def-serde-gateway.js.map +1 -0
- package/runtime/gateways/file/deno/deno-filesystem.d.ts +27 -0
- package/runtime/gateways/file/deno/deno-filesystem.d.ts.map +1 -0
- package/runtime/gateways/file/deno/deno-filesystem.js +52 -0
- package/runtime/gateways/file/deno/deno-filesystem.js.map +1 -0
- package/runtime/gateways/file/deno/get-sys-file-system.d.ts +4 -0
- package/runtime/gateways/file/deno/get-sys-file-system.d.ts.map +1 -0
- package/runtime/gateways/file/deno/get-sys-file-system.js +11 -0
- package/runtime/gateways/file/deno/get-sys-file-system.js.map +1 -0
- package/runtime/gateways/file/deno/index.d.ts +2 -0
- package/runtime/gateways/file/deno/index.d.ts.map +1 -0
- package/runtime/gateways/file/deno/index.js +2 -0
- package/runtime/gateways/file/deno/index.js.map +1 -0
- package/runtime/gateways/file/gateway-impl.d.ts +18 -0
- package/runtime/gateways/file/gateway-impl.d.ts.map +1 -0
- package/runtime/gateways/file/gateway-impl.js +121 -0
- package/runtime/gateways/file/gateway-impl.js.map +1 -0
- package/runtime/gateways/file/index.d.ts +3 -0
- package/runtime/gateways/file/index.d.ts.map +1 -0
- package/runtime/gateways/file/index.js +3 -0
- package/runtime/gateways/file/index.js.map +1 -0
- package/runtime/gateways/file/key-bag-file.d.ts +19 -0
- package/runtime/gateways/file/key-bag-file.d.ts.map +1 -0
- package/runtime/gateways/file/key-bag-file.js +40 -0
- package/runtime/gateways/file/key-bag-file.js.map +1 -0
- package/runtime/gateways/file/node/get-sys-file-system.d.ts +4 -0
- package/runtime/gateways/file/node/get-sys-file-system.d.ts.map +1 -0
- package/runtime/gateways/file/node/get-sys-file-system.js +11 -0
- package/runtime/gateways/file/node/get-sys-file-system.js.map +1 -0
- package/runtime/gateways/file/node/index.d.ts +2 -0
- package/runtime/gateways/file/node/index.d.ts.map +1 -0
- package/runtime/gateways/file/node/index.js +2 -0
- package/runtime/gateways/file/node/index.js.map +1 -0
- package/runtime/gateways/file/node/node-filesystem.d.ts +32 -0
- package/runtime/gateways/file/node/node-filesystem.d.ts.map +1 -0
- package/runtime/gateways/file/node/node-filesystem.js +33 -0
- package/runtime/gateways/file/node/node-filesystem.js.map +1 -0
- package/runtime/gateways/file/node/to-array-buffer.d.ts +2 -0
- package/runtime/gateways/file/node/to-array-buffer.d.ts.map +1 -0
- package/runtime/gateways/file/node/to-array-buffer.js +12 -0
- package/runtime/gateways/file/node/to-array-buffer.js.map +1 -0
- package/runtime/gateways/file/sys-file-system-factory.d.ts +4 -0
- package/runtime/gateways/file/sys-file-system-factory.d.ts.map +1 -0
- package/runtime/gateways/file/sys-file-system-factory.js +13 -0
- package/runtime/gateways/file/sys-file-system-factory.js.map +1 -0
- package/runtime/gateways/file/utils.d.ts +5 -0
- package/runtime/gateways/file/utils.d.ts.map +1 -0
- package/runtime/gateways/file/utils.js +27 -0
- package/runtime/gateways/file/utils.js.map +1 -0
- package/runtime/gateways/file/version.d.ts +2 -0
- package/runtime/gateways/file/version.d.ts.map +1 -0
- package/runtime/gateways/file/version.js +2 -0
- package/runtime/gateways/file/version.js.map +1 -0
- package/runtime/gateways/fp-envelope-serialize.d.ts +50 -0
- package/runtime/gateways/fp-envelope-serialize.d.ts.map +1 -0
- package/runtime/gateways/fp-envelope-serialize.js +141 -0
- package/runtime/gateways/fp-envelope-serialize.js.map +1 -0
- package/runtime/gateways/index.d.ts +6 -0
- package/runtime/gateways/index.d.ts.map +1 -0
- package/runtime/gateways/index.js +6 -0
- package/runtime/gateways/index.js.map +1 -0
- package/runtime/gateways/indexeddb/gateway-impl.d.ts +22 -0
- package/runtime/gateways/indexeddb/gateway-impl.d.ts.map +1 -0
- package/runtime/gateways/indexeddb/gateway-impl.js +147 -0
- package/runtime/gateways/indexeddb/gateway-impl.js.map +1 -0
- package/runtime/gateways/indexeddb/index.d.ts +6 -0
- package/runtime/gateways/indexeddb/index.d.ts.map +1 -0
- package/runtime/gateways/indexeddb/index.js +6 -0
- package/runtime/gateways/indexeddb/index.js.map +1 -0
- package/runtime/gateways/indexeddb/key-bag-indexeddb.d.ts +15 -0
- package/runtime/gateways/indexeddb/key-bag-indexeddb.d.ts.map +1 -0
- package/runtime/gateways/indexeddb/key-bag-indexeddb.js +42 -0
- package/runtime/gateways/indexeddb/key-bag-indexeddb.js.map +1 -0
- package/runtime/gateways/indexeddb-version.d.ts +2 -0
- package/runtime/gateways/indexeddb-version.d.ts.map +1 -0
- package/runtime/gateways/indexeddb-version.js +2 -0
- package/runtime/gateways/indexeddb-version.js.map +1 -0
- package/runtime/gateways/memory/gateway.d.ts +18 -0
- package/runtime/gateways/memory/gateway.d.ts.map +1 -0
- package/runtime/gateways/memory/gateway.js +73 -0
- package/runtime/gateways/memory/gateway.js.map +1 -0
- package/runtime/gateways/memory/version.d.ts +2 -0
- package/runtime/gateways/memory/version.d.ts.map +1 -0
- package/runtime/gateways/memory/version.js +2 -0
- package/runtime/gateways/memory/version.js.map +1 -0
- package/runtime/index.d.ts +13 -0
- package/runtime/index.d.ts.map +1 -0
- package/runtime/index.js +13 -0
- package/runtime/index.js.map +1 -0
- package/runtime/key-bag-memory.d.ts +12 -0
- package/runtime/key-bag-memory.d.ts.map +1 -0
- package/runtime/key-bag-memory.js +23 -0
- package/runtime/key-bag-memory.js.map +1 -0
- package/runtime/key-bag.d.ts +85 -0
- package/runtime/key-bag.d.ts.map +1 -0
- package/runtime/key-bag.js +411 -0
- package/runtime/key-bag.js.map +1 -0
- package/runtime/keyed-crypto.d.ts +19 -0
- package/runtime/keyed-crypto.d.ts.map +1 -0
- package/runtime/keyed-crypto.js +192 -0
- package/runtime/keyed-crypto.js.map +1 -0
- package/runtime/memory-sys-container.d.ts +2 -0
- package/runtime/memory-sys-container.d.ts.map +1 -0
- package/runtime/memory-sys-container.js +2 -0
- package/runtime/memory-sys-container.js.map +1 -0
- package/runtime/meta-key-hack.d.ts +42 -0
- package/runtime/meta-key-hack.d.ts.map +1 -0
- package/runtime/meta-key-hack.js +201 -0
- package/runtime/meta-key-hack.js.map +1 -0
- package/runtime/sts-service/index.d.ts +40 -0
- package/runtime/sts-service/index.d.ts.map +1 -0
- package/runtime/sts-service/index.js +102 -0
- package/runtime/sts-service/index.js.map +1 -0
- package/runtime/sys-container.d.ts +2 -0
- package/runtime/sys-container.d.ts.map +1 -0
- package/runtime/sys-container.js +2 -0
- package/runtime/sys-container.js.map +1 -0
- package/runtime/wait-pr-multiformats/block.d.ts +47 -0
- package/runtime/wait-pr-multiformats/block.d.ts.map +1 -0
- package/runtime/wait-pr-multiformats/block.js +64 -0
- package/runtime/wait-pr-multiformats/block.js.map +1 -0
- package/runtime/wait-pr-multiformats/codec-interface.d.ts +29 -0
- package/runtime/wait-pr-multiformats/codec-interface.d.ts.map +1 -0
- package/runtime/wait-pr-multiformats/codec-interface.js +2 -0
- package/runtime/wait-pr-multiformats/codec-interface.js.map +1 -0
- package/runtime/wait-pr-multiformats/index.d.ts +3 -0
- package/runtime/wait-pr-multiformats/index.d.ts.map +1 -0
- package/runtime/wait-pr-multiformats/index.js +3 -0
- package/runtime/wait-pr-multiformats/index.js.map +1 -0
- package/tests/blockstore/interceptor-gateway.test.ts +10 -9
- package/tests/blockstore/keyed-crypto.test.ts +2 -2
- package/tests/blockstore/loader.test.ts +68 -51
- package/tests/blockstore/standalone.test.ts +152 -0
- package/tests/blockstore/store.test.ts +16 -9
- package/tests/blockstore/transaction.test.ts +19 -16
- package/tests/fireproof/all-gateway.test.ts +12 -27
- package/tests/fireproof/attachable.test.ts +426 -97
- package/tests/fireproof/crdt.test.ts +23 -0
- package/tests/fireproof/database.test.ts +13 -12
- package/tests/fireproof/fireproof.test.ts +2 -5
- package/tests/fireproof/indexer.test.ts +4 -0
- package/tests/helpers.ts +30 -14
- package/tests/react/img-file.test.tsx +0 -9
- package/tests/react/use-fireproof-stability.test.tsx +5 -5
- package/tests/react/use-fireproof.test.tsx +18 -13
- package/tests/runtime/meta-key-hack.test.ts +7 -6
- package/tests/setup.indexeddb.ts +0 -9
- package/types.d.ts +460 -0
- package/types.d.ts.map +1 -0
- package/types.js +60 -0
- package/types.js.map +1 -0
- package/use-fireproof/iframe-strategy.d.ts +13 -0
- package/use-fireproof/iframe-strategy.d.ts.map +1 -0
- package/use-fireproof/iframe-strategy.js +83 -0
- package/use-fireproof/iframe-strategy.js.map +1 -0
- package/use-fireproof/index.d.ts +10 -0
- package/use-fireproof/index.d.ts.map +1 -0
- package/use-fireproof/index.js +16 -0
- package/use-fireproof/index.js.map +1 -0
- package/use-fireproof/redirect-strategy.d.ts +8 -0
- package/use-fireproof/redirect-strategy.d.ts.map +1 -0
- package/use-fireproof/redirect-strategy.js +31 -0
- package/use-fireproof/redirect-strategy.js.map +1 -0
- package/utils.d.ts +45 -0
- package/utils.d.ts.map +1 -0
- package/utils.js +406 -0
- package/utils.js.map +1 -0
- package/version.d.ts +2 -0
- package/version.d.ts.map +1 -0
- package/version.js +4 -0
- package/version.js.map +1 -0
- package/write-queue.d.ts +9 -0
- package/write-queue.d.ts.map +1 -0
- package/write-queue.js +70 -0
- package/write-queue.js.map +1 -0
- package/deno/index.d.ts +0 -7
- package/deno/index.js +0 -67
- package/deno/index.js.map +0 -1
- package/deno/metafile-esm.json +0 -1
- package/index.cjs +0 -7275
- package/index.cjs.map +0 -1
- package/index.d.cts +0 -2741
- package/indexeddb/index.cjs +0 -218
- package/indexeddb/index.cjs.map +0 -1
- package/indexeddb/index.d.cts +0 -30
- package/indexeddb/index.d.ts +0 -30
- package/indexeddb/index.js +0 -195
- package/indexeddb/index.js.map +0 -1
- package/indexeddb/metafile-cjs.json +0 -1
- package/indexeddb/metafile-esm.json +0 -1
- package/metafile-cjs.json +0 -1
- package/metafile-esm.json +0 -1
- package/node/index.cjs +0 -93
- package/node/index.cjs.map +0 -1
- package/node/index.d.cts +0 -7
- package/node/index.d.ts +0 -7
- package/node/index.js +0 -60
- package/node/index.js.map +0 -1
- package/node/metafile-cjs.json +0 -1
- package/node/metafile-esm.json +0 -1
- package/react/index.cjs +0 -392
- package/react/index.cjs.map +0 -1
- package/react/metafile-cjs.json +0 -1
- package/react/metafile-esm.json +0 -1
- package/tests/www/gallery.html +0 -132
- package/tests/www/iife.html +0 -42
- package/tests/www/todo-aws.html +0 -232
- package/tests/www/todo-ipfs.html +0 -213
- package/tests/www/todo-local.html +0 -214
- package/tests/www/todo-netlify.html +0 -227
- package/tests/www/todo.html +0 -254
package/react/index.js
CHANGED
@@ -1,359 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
// src/react/use-document.ts
|
6
|
-
import { useCallback, useEffect, useMemo, useState, useRef } from "react";
|
7
|
-
|
8
|
-
// src/react/utils.ts
|
9
|
-
function deepClone(value) {
|
10
|
-
return (structuredClone ?? ((v) => JSON.parse(JSON.stringify(v))))(value);
|
11
|
-
}
|
12
|
-
|
13
|
-
// src/react/use-document.ts
|
14
|
-
function createUseDocument(database) {
|
15
|
-
return function useDocument(initialDocOrFn) {
|
16
|
-
const updateHappenedRef = useRef(false);
|
17
|
-
let initialDoc;
|
18
|
-
if (typeof initialDocOrFn === "function") {
|
19
|
-
initialDoc = initialDocOrFn();
|
20
|
-
} else {
|
21
|
-
initialDoc = initialDocOrFn ?? {};
|
22
|
-
}
|
23
|
-
const originalInitialDoc = useMemo(() => deepClone({ ...initialDoc }), []);
|
24
|
-
const [doc, setDoc] = useState(initialDoc);
|
25
|
-
const refresh = useCallback(async () => {
|
26
|
-
if (doc._id) {
|
27
|
-
try {
|
28
|
-
const gotDoc = await database.get(doc._id);
|
29
|
-
setDoc(gotDoc);
|
30
|
-
} catch {
|
31
|
-
setDoc(initialDoc);
|
32
|
-
}
|
33
|
-
} else {
|
34
|
-
setDoc(initialDoc);
|
35
|
-
}
|
36
|
-
}, [doc._id]);
|
37
|
-
const save = useCallback(
|
38
|
-
async (existingDoc) => {
|
39
|
-
updateHappenedRef.current = false;
|
40
|
-
const toSave = existingDoc ?? doc;
|
41
|
-
const res = await database.put(toSave);
|
42
|
-
if (!updateHappenedRef.current && !doc._id && !existingDoc) {
|
43
|
-
setDoc((d) => ({ ...d, _id: res.id }));
|
44
|
-
}
|
45
|
-
return res;
|
46
|
-
},
|
47
|
-
[doc]
|
48
|
-
);
|
49
|
-
const remove = useCallback(
|
50
|
-
async (existingDoc) => {
|
51
|
-
const id = existingDoc?._id ?? doc._id;
|
52
|
-
if (!id) throw database.logger.Error().Msg(`Document must have an _id to be removed`).AsError();
|
53
|
-
const gotDoc = await database.get(id).catch(() => void 0);
|
54
|
-
if (!gotDoc) throw database.logger.Error().Str("id", id).Msg(`Document not found`).AsError();
|
55
|
-
const res = await database.del(id);
|
56
|
-
setDoc(initialDoc);
|
57
|
-
return res;
|
58
|
-
},
|
59
|
-
[doc, initialDoc]
|
60
|
-
);
|
61
|
-
const merge = useCallback((newDoc) => {
|
62
|
-
updateHappenedRef.current = true;
|
63
|
-
setDoc((prev) => ({ ...prev, ...newDoc }));
|
64
|
-
}, []);
|
65
|
-
const replace = useCallback((newDoc) => {
|
66
|
-
updateHappenedRef.current = true;
|
67
|
-
setDoc(newDoc);
|
68
|
-
}, []);
|
69
|
-
const reset = useCallback(() => {
|
70
|
-
updateHappenedRef.current = true;
|
71
|
-
setDoc({ ...originalInitialDoc });
|
72
|
-
}, [originalInitialDoc]);
|
73
|
-
const updateDoc = useCallback(
|
74
|
-
(newDoc, opts = { replace: false, reset: false }) => {
|
75
|
-
if (!newDoc) {
|
76
|
-
return opts.reset ? reset() : refresh();
|
77
|
-
}
|
78
|
-
return opts.replace ? replace(newDoc) : merge(newDoc);
|
79
|
-
},
|
80
|
-
[refresh, reset, replace, merge]
|
81
|
-
);
|
82
|
-
useEffect(() => {
|
83
|
-
if (!doc._id) return;
|
84
|
-
return database.subscribe((changes) => {
|
85
|
-
if (updateHappenedRef.current) {
|
86
|
-
return;
|
87
|
-
}
|
88
|
-
if (changes.find((c) => c._id === doc._id)) {
|
89
|
-
void refresh();
|
90
|
-
}
|
91
|
-
}, true);
|
92
|
-
}, [doc._id, refresh]);
|
93
|
-
useEffect(() => {
|
94
|
-
void refresh();
|
95
|
-
}, [refresh]);
|
96
|
-
const submit = useCallback(
|
97
|
-
async (e) => {
|
98
|
-
if (e?.preventDefault) e.preventDefault();
|
99
|
-
await save();
|
100
|
-
reset();
|
101
|
-
},
|
102
|
-
[save, reset]
|
103
|
-
);
|
104
|
-
const apiObject = {
|
105
|
-
doc: { ...doc },
|
106
|
-
merge,
|
107
|
-
replace,
|
108
|
-
reset,
|
109
|
-
refresh,
|
110
|
-
save,
|
111
|
-
remove,
|
112
|
-
submit
|
113
|
-
};
|
114
|
-
const tuple = [{ ...doc }, updateDoc, save, remove, reset, refresh];
|
115
|
-
Object.assign(apiObject, tuple);
|
116
|
-
Object.defineProperty(apiObject, Symbol.iterator, {
|
117
|
-
enumerable: false,
|
118
|
-
value: function* () {
|
119
|
-
yield* tuple;
|
120
|
-
}
|
121
|
-
});
|
122
|
-
return apiObject;
|
123
|
-
};
|
124
|
-
}
|
125
|
-
|
126
|
-
// src/react/use-live-query.ts
|
127
|
-
import { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2, useState as useState2 } from "react";
|
128
|
-
function createUseLiveQuery(database) {
|
129
|
-
return function useLiveQuery(mapFn, query = {}, initialRows = []) {
|
130
|
-
const [result, setResult] = useState2({
|
131
|
-
docs: initialRows.map((r) => r.doc).filter((r) => !!r),
|
132
|
-
rows: initialRows
|
133
|
-
});
|
134
|
-
const queryString = useMemo2(() => JSON.stringify(query), [query]);
|
135
|
-
const mapFnString = useMemo2(() => mapFn.toString(), [mapFn]);
|
136
|
-
const refreshRows = useCallback2(async () => {
|
137
|
-
const res = await database.query(mapFn, query);
|
138
|
-
setResult({
|
139
|
-
docs: res.rows.map((r) => r.doc).filter((r) => !!r),
|
140
|
-
rows: res.rows
|
141
|
-
});
|
142
|
-
}, [database, mapFnString, queryString]);
|
143
|
-
useEffect2(() => {
|
144
|
-
refreshRows();
|
145
|
-
const unsubscribe = database.subscribe(refreshRows);
|
146
|
-
return () => {
|
147
|
-
unsubscribe();
|
148
|
-
};
|
149
|
-
}, [database, refreshRows]);
|
150
|
-
return result;
|
151
|
-
};
|
152
|
-
}
|
153
|
-
|
154
|
-
// src/react/use-all-docs.ts
|
155
|
-
import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useState as useState3 } from "react";
|
156
|
-
function createUseAllDocs(database) {
|
157
|
-
return function useAllDocs(query = {}) {
|
158
|
-
const [result, setResult] = useState3({
|
159
|
-
docs: []
|
160
|
-
});
|
161
|
-
const queryString = useMemo3(() => JSON.stringify(query), [query]);
|
162
|
-
const refreshRows = useCallback3(async () => {
|
163
|
-
const res = await database.allDocs(query);
|
164
|
-
setResult({
|
165
|
-
...res,
|
166
|
-
docs: res.rows.map((r) => r.value)
|
167
|
-
});
|
168
|
-
}, [database, queryString]);
|
169
|
-
useEffect3(() => {
|
170
|
-
refreshRows();
|
171
|
-
const unsubscribe = database.subscribe(refreshRows);
|
172
|
-
return () => {
|
173
|
-
unsubscribe();
|
174
|
-
};
|
175
|
-
}, [database, refreshRows]);
|
176
|
-
return result;
|
177
|
-
};
|
178
|
-
}
|
179
|
-
|
180
|
-
// src/react/use-changes.ts
|
181
|
-
import { useCallback as useCallback4, useEffect as useEffect4, useMemo as useMemo4, useState as useState4 } from "react";
|
182
|
-
function createUseChanges(database) {
|
183
|
-
return function useChanges(since = [], opts = {}) {
|
184
|
-
const [result, setResult] = useState4({
|
185
|
-
docs: []
|
186
|
-
});
|
187
|
-
const queryString = useMemo4(() => JSON.stringify(opts), [opts]);
|
188
|
-
const refreshRows = useCallback4(async () => {
|
189
|
-
const res = await database.changes(since, opts);
|
190
|
-
setResult({ ...res, docs: res.rows.map((r) => r.value) });
|
191
|
-
}, [since, queryString]);
|
192
|
-
useEffect4(() => {
|
193
|
-
refreshRows();
|
194
|
-
return database.subscribe(refreshRows);
|
195
|
-
}, [refreshRows]);
|
196
|
-
return result;
|
197
|
-
};
|
198
|
-
}
|
199
|
-
|
200
|
-
// src/react/use-fireproof.ts
|
201
|
-
var FireproofCtx = {};
|
202
|
-
function createLazyDatabase(name, config = {}) {
|
203
|
-
let _database = null;
|
204
|
-
const _subscribers = /* @__PURE__ */ new Set();
|
205
|
-
const getDatabase = () => {
|
206
|
-
if (!_database) {
|
207
|
-
_database = fireproof(name, config);
|
208
|
-
_database.subscribe((changes) => {
|
209
|
-
_subscribers.forEach((subscriber) => subscriber(changes));
|
210
|
-
}, true);
|
211
|
-
}
|
212
|
-
return _database;
|
213
|
-
};
|
214
|
-
const isWriteOperation = (method) => {
|
215
|
-
return ["put", "bulk", "del", "create", "transact"].includes(method);
|
216
|
-
};
|
217
|
-
return new Proxy({}, {
|
218
|
-
get(target, prop, receiver) {
|
219
|
-
if (prop === "constructor") {
|
220
|
-
return { name: "Database" };
|
221
|
-
}
|
222
|
-
if (prop === "name") {
|
223
|
-
return name;
|
224
|
-
}
|
225
|
-
if (typeof prop === "string" || typeof prop === "symbol") {
|
226
|
-
if (prop === "get") {
|
227
|
-
return async function get(id) {
|
228
|
-
const db = getDatabase();
|
229
|
-
return db.get(id);
|
230
|
-
};
|
231
|
-
}
|
232
|
-
if (prop === "query" || prop === "allDocs") {
|
233
|
-
return async function query(...args) {
|
234
|
-
const db = getDatabase();
|
235
|
-
const method = db[prop];
|
236
|
-
return method.apply(db, args);
|
237
|
-
};
|
238
|
-
}
|
239
|
-
if (prop === "put") {
|
240
|
-
return async function put(doc) {
|
241
|
-
const db = getDatabase();
|
242
|
-
return db.put(doc);
|
243
|
-
};
|
244
|
-
}
|
245
|
-
if (prop === "bulk") {
|
246
|
-
return async function bulk(docs) {
|
247
|
-
const db = getDatabase();
|
248
|
-
return db.bulk(docs);
|
249
|
-
};
|
250
|
-
}
|
251
|
-
if (prop === "subscribe") {
|
252
|
-
return function subscribe(callback) {
|
253
|
-
_subscribers.add(callback);
|
254
|
-
getDatabase();
|
255
|
-
return () => _subscribers.delete(callback);
|
256
|
-
};
|
257
|
-
}
|
258
|
-
if (prop === "close" || prop === "destroy") {
|
259
|
-
return async function() {
|
260
|
-
if (_database) {
|
261
|
-
const method = _database[prop];
|
262
|
-
return method.call(_database);
|
263
|
-
}
|
264
|
-
return Promise.resolve();
|
265
|
-
};
|
266
|
-
}
|
267
|
-
return function(...args) {
|
268
|
-
if (isWriteOperation(prop)) {
|
269
|
-
const db = getDatabase();
|
270
|
-
const method = db[prop];
|
271
|
-
if (typeof method === "function") {
|
272
|
-
return method.apply(db, args);
|
273
|
-
}
|
274
|
-
return void 0;
|
275
|
-
}
|
276
|
-
if (_database) {
|
277
|
-
const method = _database[prop];
|
278
|
-
if (typeof method === "function") {
|
279
|
-
return method.apply(_database, args);
|
280
|
-
}
|
281
|
-
return void 0;
|
282
|
-
}
|
283
|
-
return function noOp() {
|
284
|
-
};
|
285
|
-
};
|
286
|
-
}
|
287
|
-
return Reflect.get(target, prop, receiver);
|
288
|
-
}
|
289
|
-
});
|
290
|
-
}
|
291
|
-
function useFireproof(name = "useFireproof", config = {}) {
|
292
|
-
return useMemo5(() => {
|
293
|
-
const database = typeof name === "string" ? createLazyDatabase(name, config) : name;
|
294
|
-
const useDocument = createUseDocument(database);
|
295
|
-
const useLiveQuery = createUseLiveQuery(database);
|
296
|
-
const useAllDocs = createUseAllDocs(database);
|
297
|
-
const useChanges = createUseChanges(database);
|
298
|
-
return { database, useLiveQuery, useDocument, useAllDocs, useChanges };
|
299
|
-
}, [name, JSON.stringify(config)]);
|
300
|
-
}
|
301
|
-
|
302
|
-
// src/react/img-file.ts
|
303
|
-
import React, { useState as useState5, useEffect as useEffect5 } from "react";
|
304
|
-
var { URL } = globalThis;
|
305
|
-
function isFile(obj) {
|
306
|
-
return "type" in obj && "size" in obj && "stream" in obj && typeof obj.stream === "function";
|
307
|
-
}
|
308
|
-
function isFileMeta(obj) {
|
309
|
-
return "type" in obj && "size" in obj && "file" in obj && typeof obj.file === "function";
|
310
|
-
}
|
311
|
-
function ImgFile({ file, meta, ...imgProps }) {
|
312
|
-
const [imgDataUrl, setImgDataUrl] = useState5("");
|
313
|
-
const fileData = file || meta;
|
314
|
-
useEffect5(() => {
|
315
|
-
if (!fileData) return;
|
316
|
-
const loadFile = async () => {
|
317
|
-
let fileObj = null;
|
318
|
-
let fileType = "";
|
319
|
-
switch (true) {
|
320
|
-
case isFile(fileData):
|
321
|
-
fileObj = fileData;
|
322
|
-
fileType = fileData.type;
|
323
|
-
break;
|
324
|
-
case isFileMeta(fileData):
|
325
|
-
fileType = fileData.type;
|
326
|
-
fileObj = await fileData.file?.() || null;
|
327
|
-
break;
|
328
|
-
}
|
329
|
-
if (fileObj && /image/.test(fileType)) {
|
330
|
-
const src = URL.createObjectURL(fileObj);
|
331
|
-
setImgDataUrl(src);
|
332
|
-
return () => URL.revokeObjectURL(src);
|
333
|
-
}
|
334
|
-
};
|
335
|
-
let isMounted = true;
|
336
|
-
let cleanup;
|
337
|
-
loadFile().then((result) => {
|
338
|
-
if (isMounted) {
|
339
|
-
cleanup = result;
|
340
|
-
} else if (result) {
|
341
|
-
result();
|
342
|
-
}
|
343
|
-
});
|
344
|
-
return () => {
|
345
|
-
isMounted = false;
|
346
|
-
if (cleanup) cleanup();
|
347
|
-
};
|
348
|
-
}, [fileData]);
|
349
|
-
return imgDataUrl ? React.createElement("img", {
|
350
|
-
src: imgDataUrl,
|
351
|
-
...imgProps
|
352
|
-
}) : null;
|
353
|
-
}
|
354
|
-
export {
|
355
|
-
FireproofCtx,
|
356
|
-
ImgFile,
|
357
|
-
useFireproof
|
358
|
-
};
|
1
|
+
export { FireproofCtx, useFireproof } from "./use-fireproof.js";
|
2
|
+
export * from "./types.js";
|
3
|
+
export * from "./img-file.js";
|
4
|
+
export * from "./use-attach.js";
|
359
5
|
//# sourceMappingURL=index.js.map
|
package/react/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/react/use-fireproof.ts","../../../src/react/use-document.ts","../../../src/react/utils.ts","../../../src/react/use-live-query.ts","../../../src/react/use-all-docs.ts","../../../src/react/use-changes.ts","../../../src/react/img-file.ts"],"sourcesContent":["import type { ConfigOpts, Database, DocSet, DocTypes } from \"@fireproof/core\";\nimport { fireproof } from \"@fireproof/core\";\nimport { useMemo } from \"react\";\nimport type { UseFireproof } from \"./types.js\";\nimport { createUseDocument } from \"./use-document.js\";\nimport { createUseLiveQuery } from \"./use-live-query.js\";\nimport { createUseAllDocs } from \"./use-all-docs.js\";\nimport { createUseChanges } from \"./use-changes.js\";\n\n/**\n * @deprecated Use the `useFireproof` hook instead\n */\nexport const FireproofCtx = {} as UseFireproof;\n\n/**\n *\n * ## Summary\n *\n * React hook to create a custom-named Fireproof database and provides the utility hooks to query against it.\n *\n * ## Usage\n * ```tsx\n * const { database, useLiveQuery, useDocument } = useFireproof(\"dbname\");\n * const { database, useLiveQuery, useDocument } = useFireproof(\"dbname\", { ...options });\n * ```\n *\n *\n */\n/**\n * Creates a proxy database that only initializes the actual database on first write operation\n */\nfunction createLazyDatabase(name: string, config: ConfigOpts = {}): Database {\n let _database: Database | null = null;\n const _subscribers = new Set<(changes: unknown[]) => void>();\n\n // Initialize the database only when needed\n const getDatabase = (): Database => {\n if (!_database) {\n _database = fireproof(name, config);\n\n // Set up real subscription forwarding\n _database.subscribe((changes) => {\n _subscribers.forEach((subscriber) => subscriber(changes));\n }, true);\n }\n return _database;\n };\n\n // Detect write operations that should trigger database initialization\n const isWriteOperation = (method: string): boolean => {\n return [\"put\", \"bulk\", \"del\", \"create\", \"transact\"].includes(method);\n };\n\n // Create a proxy to intercept all database method calls\n return new Proxy<Database>({} as Database, {\n get(target, prop, receiver) {\n // Handle constructor name for type checking\n if (prop === \"constructor\") {\n return { name: \"Database\" };\n }\n\n // Handle name property\n if (prop === \"name\") {\n return name;\n }\n\n // Return a function that will initialize the database if it's a write operation\n if (typeof prop === \"string\" || typeof prop === \"symbol\") {\n // Handle get method to open DB and fetch\n if (prop === \"get\") {\n return async function get(id: string) {\n const db = getDatabase();\n return db.get(id);\n };\n }\n\n // Handle query methods: open DB and query\n if (prop === \"query\" || prop === \"allDocs\") {\n return async function query(...args: unknown[]) {\n const db = getDatabase();\n // Bind to ensure correct 'this' context for database methods\n const method = (db as unknown as Record<string, (...methodArgs: unknown[]) => unknown>)[prop as string];\n return method.apply(db, args);\n };\n }\n\n // Handle put to make sure it triggers database initialization\n if (prop === \"put\") {\n return async function put<T extends DocTypes>(doc: DocSet<T>) {\n // Always initialize the database for put operations\n const db = getDatabase();\n return db.put(doc);\n };\n }\n\n // Handle bulk operation\n if (prop === \"bulk\") {\n return async function bulk(docs: Record<string, unknown>[]) {\n // Always initialize the database for bulk operations\n const db = getDatabase();\n return db.bulk(docs);\n };\n }\n\n // Handle subscribe method to collect subscribers even before DB is initialized\n if (prop === \"subscribe\") {\n return function subscribe(callback: (changes: unknown[]) => void) {\n // Store locally so aggregator can dispatch before DB exists\n _subscribers.add(callback);\n\n // Ensure DB is initialised (sets up the aggregator once)\n getDatabase();\n\n // Return an unsubscribe that removes the callback from the local set\n return () => _subscribers.delete(callback);\n };\n }\n\n // Handle close and destroy methods\n if (prop === \"close\" || prop === \"destroy\") {\n return async function () {\n if (_database) {\n const method = _database[prop] as () => Promise<unknown>;\n return method.call(_database);\n }\n return Promise.resolve();\n };\n }\n\n // For all other methods\n return function (...args: unknown[]) {\n // Always initialize database for write operations\n if (isWriteOperation(prop as string)) {\n const db = getDatabase();\n // Use type assertion to call method safely\n const method = (db as unknown as Record<string, (...methodArgs: unknown[]) => unknown>)[prop as string];\n if (typeof method === \"function\") {\n return method.apply(db, args);\n }\n return undefined;\n }\n\n // For read operations, only use the database if it's already initialized\n if (_database) {\n // Use type assertion to call method safely\n const method = (_database as unknown as Record<string, (...methodArgs: unknown[]) => unknown>)[prop as string];\n if (typeof method === \"function\") {\n return method.apply(_database, args);\n }\n return undefined;\n }\n\n // Return appropriate no-op responses for other methods\n return function noOp() {\n /* no-op */\n };\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\n/**\n * React hook to create a Fireproof database with lazy initialization\n *\n * @param name The name of the database or an existing database instance\n * @param config Configuration options for the database\n * @returns UseFireproof object with database and hooks\n */\nexport function useFireproof(name: string | Database = \"useFireproof\", config: ConfigOpts = {}): UseFireproof {\n // Use useMemo to ensure stable references across renders\n return useMemo(() => {\n // If the user passed an existing database instance, use it directly\n // Otherwise create a lazy database that only initializes on first write\n const database = typeof name === \"string\" ? createLazyDatabase(name, config) : name;\n\n const useDocument = createUseDocument(database);\n const useLiveQuery = createUseLiveQuery(database);\n const useAllDocs = createUseAllDocs(database);\n const useChanges = createUseChanges(database);\n\n return { database, useLiveQuery, useDocument, useAllDocs, useChanges };\n }, [name, JSON.stringify(config)]); // Only recreate if name or stringified config changes\n}\n\n// Export types\nexport type {\n LiveQueryResult,\n UseDocumentResult,\n AllDocsResult,\n ChangesResult,\n UseDocument,\n UseLiveQuery,\n UseAllDocs,\n UseChanges,\n UseFireproof,\n} from \"./types.js\";\n","import { useCallback, useEffect, useMemo, useState, useRef } from \"react\";\nimport type { DocSet, DocTypes, DocWithId, Database } from \"@fireproof/core\";\nimport { deepClone } from \"./utils.js\";\nimport type { DeleteDocFn, StoreDocFn, UseDocumentInitialDocOrFn, UseDocumentResult } from \"./types.js\";\n\n/**\n * Implementation of the useDocument hook\n */\nexport function createUseDocument(database: Database) {\n return function useDocument<T extends DocTypes>(initialDocOrFn?: UseDocumentInitialDocOrFn<T>): UseDocumentResult<T> {\n const updateHappenedRef = useRef(false);\n let initialDoc: DocSet<T>;\n if (typeof initialDocOrFn === \"function\") {\n initialDoc = initialDocOrFn();\n } else {\n initialDoc = initialDocOrFn ?? ({} as T);\n }\n\n const originalInitialDoc = useMemo(() => deepClone({ ...initialDoc }), []);\n\n const [doc, setDoc] = useState(initialDoc);\n\n const refresh = useCallback(async () => {\n if (doc._id) {\n try {\n const gotDoc = await database.get<T>(doc._id);\n setDoc(gotDoc);\n } catch {\n setDoc(initialDoc);\n }\n } else {\n setDoc(initialDoc);\n }\n }, [doc._id]);\n\n const save: StoreDocFn<T> = useCallback(\n async (existingDoc) => {\n updateHappenedRef.current = false;\n const toSave = existingDoc ?? doc;\n const res = await database.put(toSave);\n\n if (!updateHappenedRef.current && !doc._id && !existingDoc) {\n setDoc((d) => ({ ...d, _id: res.id }));\n }\n\n return res;\n },\n [doc],\n );\n\n const remove: DeleteDocFn<T> = useCallback(\n async (existingDoc) => {\n const id = existingDoc?._id ?? doc._id;\n if (!id) throw database.logger.Error().Msg(`Document must have an _id to be removed`).AsError();\n const gotDoc = await database.get<T>(id).catch(() => undefined);\n if (!gotDoc) throw database.logger.Error().Str(\"id\", id).Msg(`Document not found`).AsError();\n const res = await database.del(id);\n setDoc(initialDoc);\n return res;\n },\n [doc, initialDoc],\n );\n\n // New granular update methods\n const merge = useCallback((newDoc: Partial<T>) => {\n updateHappenedRef.current = true;\n setDoc((prev) => ({ ...prev, ...newDoc }));\n }, []);\n\n const replace = useCallback((newDoc: T) => {\n updateHappenedRef.current = true;\n setDoc(newDoc);\n }, []);\n\n const reset = useCallback(() => {\n updateHappenedRef.current = true;\n setDoc({ ...originalInitialDoc });\n }, [originalInitialDoc]);\n\n // Legacy-compatible updateDoc\n const updateDoc = useCallback(\n (newDoc?: DocSet<T>, opts = { replace: false, reset: false }) => {\n if (!newDoc) {\n return opts.reset ? reset() : refresh();\n }\n return opts.replace ? replace(newDoc as T) : merge(newDoc);\n },\n [refresh, reset, replace, merge],\n );\n\n useEffect(() => {\n if (!doc._id) return;\n return database.subscribe((changes) => {\n if (updateHappenedRef.current) {\n return;\n }\n if (changes.find((c) => c._id === doc._id)) {\n void refresh();\n }\n }, true);\n }, [doc._id, refresh]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const submit = useCallback(\n async (e?: Event) => {\n if (e?.preventDefault) e.preventDefault();\n await save();\n reset();\n },\n [save, reset],\n );\n\n // Primary Object API with both new and legacy methods\n const apiObject = {\n doc: { ...doc } as DocWithId<T>,\n merge,\n replace,\n reset,\n refresh,\n save,\n remove,\n submit,\n };\n\n // Make the object properly iterable\n const tuple = [{ ...doc }, updateDoc, save, remove, reset, refresh];\n Object.assign(apiObject, tuple);\n Object.defineProperty(apiObject, Symbol.iterator, {\n enumerable: false,\n value: function* () {\n yield* tuple;\n },\n });\n\n return apiObject as UseDocumentResult<T>;\n };\n}\n","/**\n * Deep clone a value\n */\nexport function deepClone<T>(value: T): T {\n return (structuredClone ?? ((v: T) => JSON.parse(JSON.stringify(v))))(value);\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { DocFragment, DocTypes, DocWithId, IndexKeyType, IndexRow, MapFn, Database } from \"@fireproof/core\";\nimport type { LiveQueryResult } from \"./types.js\";\n\n/**\n * Implementation of the useLiveQuery hook\n */\nexport function createUseLiveQuery(database: Database) {\n return function useLiveQuery<T extends DocTypes, K extends IndexKeyType = string, R extends DocFragment = T>(\n mapFn: MapFn<T> | string,\n query = {},\n initialRows: IndexRow<K, T, R>[] = [],\n ): LiveQueryResult<T, K, R> {\n const [result, setResult] = useState<LiveQueryResult<T, K, R>>({\n docs: initialRows.map((r) => r.doc).filter((r): r is DocWithId<T> => !!r),\n rows: initialRows,\n });\n\n const queryString = useMemo(() => JSON.stringify(query), [query]);\n const mapFnString = useMemo(() => mapFn.toString(), [mapFn]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.query<K, T, R>(mapFn, query);\n setResult({\n docs: res.rows.map((r) => r.doc).filter((r): r is DocWithId<T> => !!r),\n rows: res.rows,\n });\n }, [database, mapFnString, queryString]);\n\n useEffect(() => {\n refreshRows();\n const unsubscribe = database.subscribe(refreshRows);\n return () => {\n unsubscribe();\n };\n }, [database, refreshRows]);\n\n return result;\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { AllDocsQueryOpts, DocTypes, DocWithId, Database } from \"@fireproof/core\";\nimport type { AllDocsResult } from \"./types.js\";\n\n/**\n * Implementation of the useAllDocs hook\n */\nexport function createUseAllDocs(database: Database) {\n return function useAllDocs<T extends DocTypes>(query: AllDocsQueryOpts = {}): AllDocsResult<T> {\n const [result, setResult] = useState<AllDocsResult<T>>({\n docs: [],\n });\n\n const queryString = useMemo(() => JSON.stringify(query), [query]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.allDocs<T>(query);\n setResult({\n ...res,\n docs: res.rows.map((r) => r.value as DocWithId<T>),\n });\n }, [database, queryString]);\n\n useEffect(() => {\n refreshRows();\n const unsubscribe = database.subscribe(refreshRows);\n return () => {\n unsubscribe();\n };\n }, [database, refreshRows]);\n\n return result;\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { ChangesOptions, ClockHead, DocTypes, DocWithId, Database } from \"@fireproof/core\";\nimport type { ChangesResult } from \"./types.js\";\n\n/**\n * Implementation of the useChanges hook\n */\nexport function createUseChanges(database: Database) {\n return function useChanges<T extends DocTypes>(since: ClockHead = [], opts: ChangesOptions = {}): ChangesResult<T> {\n const [result, setResult] = useState<ChangesResult<T>>({\n docs: [],\n });\n\n const queryString = useMemo(() => JSON.stringify(opts), [opts]);\n\n const refreshRows = useCallback(async () => {\n const res = await database.changes<T>(since, opts);\n setResult({ ...res, docs: res.rows.map((r) => r.value as DocWithId<T>) });\n }, [since, queryString]);\n\n useEffect(() => {\n refreshRows(); // Initial data fetch\n return database.subscribe(refreshRows);\n }, [refreshRows]);\n\n return result;\n };\n}\n","import { DocFileMeta } from \"@fireproof/core\";\nimport React, { useState, useEffect, ImgHTMLAttributes } from \"react\";\n\nconst { URL } = globalThis;\n\n// Union type to support both direct File objects and metadata objects\ntype FileType = File | DocFileMeta;\n\ninterface ImgFileProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n file?: FileType;\n /**\n * @deprecated Use 'file' instead. This is for internal use only to support legacy code.\n * @internal\n */\n meta?: FileType;\n}\n\n// Helper function to determine if the object is a File-like object\nfunction isFile(obj: FileType): obj is File {\n return \"type\" in obj && \"size\" in obj && \"stream\" in obj && typeof obj.stream === \"function\";\n}\n\n// Helper function to determine if the object is a DocFileMeta\nfunction isFileMeta(obj: FileType): obj is DocFileMeta {\n return \"type\" in obj && \"size\" in obj && \"file\" in obj && typeof obj.file === \"function\";\n}\n\nexport function ImgFile({ file, meta, ...imgProps }: ImgFileProps) {\n const [imgDataUrl, setImgDataUrl] = useState(\"\");\n\n // Use meta as fallback if file is not provided (for backward compatibility)\n const fileData = file || meta;\n\n useEffect(() => {\n if (!fileData) return;\n\n const loadFile = async () => {\n let fileObj: File | null = null;\n let fileType = \"\";\n\n switch (true) {\n case isFile(fileData):\n fileObj = fileData;\n fileType = fileData.type;\n break;\n case isFileMeta(fileData):\n fileType = fileData.type;\n fileObj = (await fileData.file?.()) || null;\n break;\n }\n\n if (fileObj && /image/.test(fileType)) {\n const src = URL.createObjectURL(fileObj);\n setImgDataUrl(src);\n return () => URL.revokeObjectURL(src);\n }\n };\n\n let isMounted = true;\n let cleanup: (() => void) | undefined;\n\n loadFile().then((result) => {\n if (isMounted) {\n cleanup = result;\n } else if (result) {\n result();\n }\n });\n\n return () => {\n isMounted = false;\n if (cleanup) cleanup();\n };\n }, [fileData]);\n\n return imgDataUrl\n ? React.createElement(\"img\", {\n src: imgDataUrl,\n ...imgProps,\n })\n : null;\n}\n\nexport default ImgFile;\n"],"mappings":"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","names":["useMemo","useCallback","useEffect","useMemo","useState","useCallback","useEffect","useMemo","useState","useCallback","useEffect","useMemo","useState","useMemo","useState","useEffect"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
|
package/react/types.d.ts
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
import type { AllDocsQueryOpts, Attachable, Attached, ChangesOptions, ClockHead, ConfigOpts, Database, DocFragment, DocResponse, DocSet, DocTypes, DocWithId, IndexKeyType, IndexRow, MapFn, QueryOpts } from "@fireproof/core";
|
2
|
+
export interface LiveQueryResult<T extends DocTypes, K extends IndexKeyType, R extends DocFragment = T> {
|
3
|
+
readonly docs: DocWithId<T>[];
|
4
|
+
readonly rows: IndexRow<K, T, R>[];
|
5
|
+
}
|
6
|
+
export type UseLiveQuery = <T extends DocTypes, K extends IndexKeyType = string, R extends DocFragment = T>(mapFn: string | MapFn<T>, query?: QueryOpts<K>, initialRows?: IndexRow<K, T, R>[]) => LiveQueryResult<T, K, R>;
|
7
|
+
export interface AllDocsResult<T extends DocTypes> {
|
8
|
+
readonly docs: DocWithId<T>[];
|
9
|
+
}
|
10
|
+
export interface ChangesResult<T extends DocTypes> {
|
11
|
+
readonly docs: DocWithId<T>[];
|
12
|
+
}
|
13
|
+
export type UseAllDocs = <T extends DocTypes>(query?: AllDocsQueryOpts) => AllDocsResult<T>;
|
14
|
+
export type UseChanges = <T extends DocTypes>(since: ClockHead, opts: ChangesOptions) => ChangesResult<T>;
|
15
|
+
export interface UpdateDocFnOptions {
|
16
|
+
replace?: boolean;
|
17
|
+
reset?: boolean;
|
18
|
+
}
|
19
|
+
export type UpdateDocFn<T extends DocTypes> = (newDoc?: DocSet<T>, options?: UpdateDocFnOptions) => void;
|
20
|
+
export type StoreDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;
|
21
|
+
export type DeleteDocFn<T extends DocTypes> = (existingDoc?: DocWithId<T>) => Promise<DocResponse>;
|
22
|
+
export type UseDocumentResultTuple<T extends DocTypes> = [DocWithId<T>, UpdateDocFn<T>, StoreDocFn<T>, DeleteDocFn<T>];
|
23
|
+
export interface UseDocumentResultObject<T extends DocTypes> {
|
24
|
+
readonly doc: DocWithId<T>;
|
25
|
+
merge(newDoc: Partial<T>): void;
|
26
|
+
replace(newDoc: T): void;
|
27
|
+
reset(): void;
|
28
|
+
refresh(): Promise<void>;
|
29
|
+
save(existingDoc?: DocWithId<T>): Promise<DocResponse>;
|
30
|
+
remove(existingDoc?: DocWithId<T>): Promise<DocResponse>;
|
31
|
+
submit(e?: Event): Promise<void>;
|
32
|
+
}
|
33
|
+
export interface InitialAttachState {
|
34
|
+
readonly state: "initial";
|
35
|
+
}
|
36
|
+
export interface AttachingAttachState {
|
37
|
+
readonly state: "attaching";
|
38
|
+
}
|
39
|
+
export interface AttachedAttachState {
|
40
|
+
readonly state: "attached";
|
41
|
+
readonly attached: Attached;
|
42
|
+
}
|
43
|
+
export interface ErrorAttachState {
|
44
|
+
readonly state: "error";
|
45
|
+
readonly error: Error;
|
46
|
+
}
|
47
|
+
export type AttachState = InitialAttachState | AttachingAttachState | AttachedAttachState | ErrorAttachState;
|
48
|
+
export type UseDocumentResult<T extends DocTypes> = UseDocumentResultObject<T> & UseDocumentResultTuple<T>;
|
49
|
+
export type UseDocumentInitialDocOrFn<T extends DocTypes> = DocSet<T> | (() => DocSet<T>);
|
50
|
+
export type UseDocument = <T extends DocTypes>(initialDocOrFn: UseDocumentInitialDocOrFn<T>) => UseDocumentResult<T>;
|
51
|
+
export interface UseFireproof {
|
52
|
+
readonly database: Database;
|
53
|
+
readonly useDocument: UseDocument;
|
54
|
+
readonly useLiveQuery: UseLiveQuery;
|
55
|
+
readonly useAllDocs: UseAllDocs;
|
56
|
+
readonly useChanges: UseChanges;
|
57
|
+
readonly attach: AttachState;
|
58
|
+
}
|
59
|
+
export interface WebToCloudCtx {
|
60
|
+
readonly dashboardURI: string;
|
61
|
+
readonly uiURI: string;
|
62
|
+
readonly tokenKey: string;
|
63
|
+
onTokenChange(on: (token?: string) => void): void;
|
64
|
+
resetToken(): void;
|
65
|
+
setToken(token: string): void;
|
66
|
+
token(): string | undefined;
|
67
|
+
}
|
68
|
+
export type UseFPConfig = ConfigOpts & {
|
69
|
+
readonly attach?: Attachable;
|
70
|
+
};
|
71
|
+
//# sourceMappingURL=types.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/react/types.ts"],"names":[],"mappings":"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"}
|
package/react/types.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/react/types.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import type { AllDocsQueryOpts, DocTypes, Database } from "@fireproof/core";
|
2
|
+
import type { AllDocsResult } from "./types.js";
|
3
|
+
export declare function createUseAllDocs(database: Database): <T extends DocTypes>(query?: AllDocsQueryOpts) => AllDocsResult<T>;
|
4
|
+
//# sourceMappingURL=use-all-docs.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-all-docs.d.ts","sourceRoot":"","sources":["../../../../src/react/use-all-docs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAa,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,IACtB,CAAC,SAAS,QAAQ,EAAE,QAAO,gBAAqB,KAAG,aAAa,CAAC,CAAC,CAAC,CAyB/F"}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
2
|
+
export function createUseAllDocs(database) {
|
3
|
+
return function useAllDocs(query = {}) {
|
4
|
+
const [result, setResult] = useState({
|
5
|
+
docs: [],
|
6
|
+
});
|
7
|
+
const queryString = useMemo(() => JSON.stringify(query), [query]);
|
8
|
+
const refreshRows = useCallback(async () => {
|
9
|
+
const res = await database.allDocs(query);
|
10
|
+
setResult({
|
11
|
+
...res,
|
12
|
+
docs: res.rows.map((r) => r.value),
|
13
|
+
});
|
14
|
+
}, [database, queryString]);
|
15
|
+
useEffect(() => {
|
16
|
+
refreshRows();
|
17
|
+
const unsubscribe = database.subscribe(refreshRows);
|
18
|
+
return () => {
|
19
|
+
unsubscribe();
|
20
|
+
};
|
21
|
+
}, [database, refreshRows]);
|
22
|
+
return result;
|
23
|
+
};
|
24
|
+
}
|
25
|
+
//# sourceMappingURL=use-all-docs.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-all-docs.js","sourceRoot":"","sources":["../../../../src/react/use-all-docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAOlE,MAAM,UAAU,gBAAgB,CAAC,QAAkB;IACjD,OAAO,SAAS,UAAU,CAAqB,QAA0B,EAAE;QACzE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmB;YACrD,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAElE,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAI,KAAK,CAAC,CAAC;YAC7C,SAAS,CAAC;gBACR,GAAG,GAAG;gBACN,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAqB,CAAC;aACnD,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAE5B,SAAS,CAAC,GAAG,EAAE;YACb,WAAW,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACpD,OAAO,GAAG,EAAE;gBACV,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAE5B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { Database } from "@fireproof/core";
|
2
|
+
import { AttachState, UseFPConfig, WebToCloudCtx } from "./types.js";
|
3
|
+
export declare const WebCtx = "webCtx";
|
4
|
+
export declare function defaultWebToCloudOpts(opts: Partial<WebToCloudCtx>): WebToCloudCtx;
|
5
|
+
export declare function useAttach(database: Database, config: UseFPConfig): AttachState;
|
6
|
+
//# sourceMappingURL=use-attach.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-attach.d.ts","sourceRoot":"","sources":["../../../../src/react/use-attach.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,MAAM,WAAW,CAAC;AAmD/B,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAEjF;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,WAAW,CA4B9E"}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import { falsyToUndef } from "@fireproof/core";
|
2
|
+
import { useEffect, useState } from "react";
|
3
|
+
export const WebCtx = "webCtx";
|
4
|
+
class WebCtxImpl {
|
5
|
+
constructor(opts) {
|
6
|
+
this.dashboardURI = opts.dashboardURI || "https://dev.connect.fireproof.direct/fp/cloud/api/token";
|
7
|
+
this.uiURI = opts.uiURI || "https://dev.connect.fireproof.direct/api";
|
8
|
+
this.tokenKey = opts.tokenKey || "fpToken";
|
9
|
+
this.opts = opts;
|
10
|
+
}
|
11
|
+
onTokenChange(on) {
|
12
|
+
if (this.opts.onTokenChange) {
|
13
|
+
return this.opts.onTokenChange(on);
|
14
|
+
}
|
15
|
+
this.onAction = on;
|
16
|
+
}
|
17
|
+
token() {
|
18
|
+
if (this.opts.token) {
|
19
|
+
return this.opts.token();
|
20
|
+
}
|
21
|
+
return falsyToUndef(localStorage.getItem(this.tokenKey));
|
22
|
+
}
|
23
|
+
resetToken() {
|
24
|
+
if (this.opts.resetToken) {
|
25
|
+
this.opts.resetToken();
|
26
|
+
}
|
27
|
+
else {
|
28
|
+
localStorage.removeItem(this.tokenKey);
|
29
|
+
}
|
30
|
+
this.onAction?.(undefined);
|
31
|
+
}
|
32
|
+
setToken(token) {
|
33
|
+
const oldToken = this.token();
|
34
|
+
if (this.opts.setToken) {
|
35
|
+
this.opts.setToken(token);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
localStorage.setItem(this.tokenKey, token);
|
39
|
+
}
|
40
|
+
if (oldToken !== token) {
|
41
|
+
this.onAction?.(token);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
export function defaultWebToCloudOpts(opts) {
|
46
|
+
return new WebCtxImpl(opts);
|
47
|
+
}
|
48
|
+
export function useAttach(database, config) {
|
49
|
+
const [attachState, setAttachState] = useState({ state: "initial" });
|
50
|
+
useEffect(() => {
|
51
|
+
if (config.attach && attachState.state === "initial") {
|
52
|
+
setAttachState({ state: "attaching" });
|
53
|
+
database
|
54
|
+
.attach(config.attach)
|
55
|
+
.then((a) => {
|
56
|
+
a
|
57
|
+
.ctx()
|
58
|
+
.get(WebCtx)
|
59
|
+
?.onTokenChange((token) => {
|
60
|
+
if (!token) {
|
61
|
+
setAttachState({ state: "initial" });
|
62
|
+
return;
|
63
|
+
}
|
64
|
+
});
|
65
|
+
setAttachState({ state: "attached", attached: a });
|
66
|
+
})
|
67
|
+
.catch((err) => {
|
68
|
+
database.logger.Error().Err(err).Msg("attach error");
|
69
|
+
setAttachState({ state: "error", error: err });
|
70
|
+
});
|
71
|
+
}
|
72
|
+
}, [database, config.attach, attachState]);
|
73
|
+
return attachState;
|
74
|
+
}
|
75
|
+
//# sourceMappingURL=use-attach.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-attach.js","sourceRoot":"","sources":["../../../../src/react/use-attach.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import type { ChangesOptions, ClockHead, DocTypes, Database } from "@fireproof/core";
|
2
|
+
import type { ChangesResult } from "./types.js";
|
3
|
+
export declare function createUseChanges(database: Database): <T extends DocTypes>(since?: ClockHead, opts?: ChangesOptions) => ChangesResult<T>;
|
4
|
+
//# sourceMappingURL=use-changes.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"use-changes.d.ts","sourceRoot":"","sources":["../../../../src/react/use-changes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAa,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,IACtB,CAAC,SAAS,QAAQ,EAAE,QAAO,SAAc,EAAE,OAAM,cAAmB,KAAG,aAAa,CAAC,CAAC,CAAC,CAmBnH"}
|