@pyric/cli 0.1.0-alpha.10 → 0.1.0-alpha.11
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/README.md.orig +2 -2
- package/dist/assurance/.generated/conformance-verdicts.d.ts +16 -0
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +16 -0
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/server/peer.d.ts +1 -1
- package/dist/bridge/server.d.ts +1 -1
- package/dist/bridge/server.js +1 -1
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +13 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +3 -3
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +5 -5
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +8 -2
- package/dist/cli/serve.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts +12 -0
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -0
- package/dist/conformance/.generated/conformance-docs.js +2 -0
- package/dist/conformance/.generated/conformance-docs.js.map +1 -0
- package/dist/conformance/docs.d.ts +6 -0
- package/dist/conformance/docs.d.ts.map +1 -0
- package/dist/conformance/docs.js +6 -0
- package/dist/conformance/docs.js.map +1 -0
- package/dist/remote/index.d.ts.map +1 -1
- package/dist/remote/index.js +1 -0
- package/dist/remote/index.js.map +1 -1
- package/dist/serve/activity-guard.d.ts +4 -0
- package/dist/serve/activity-guard.d.ts.map +1 -0
- package/dist/serve/activity-guard.js +22 -0
- package/dist/serve/activity-guard.js.map +1 -0
- package/dist/serve/activity-route.d.ts +4 -0
- package/dist/serve/activity-route.d.ts.map +1 -0
- package/dist/serve/activity-route.js +157 -0
- package/dist/serve/activity-route.js.map +1 -0
- package/dist/serve/activity-warning.d.ts +4 -0
- package/dist/serve/activity-warning.d.ts.map +1 -0
- package/dist/serve/activity-warning.js +21 -0
- package/dist/serve/activity-warning.js.map +1 -0
- package/dist/serve/bridge-mount.d.ts +5 -0
- package/dist/serve/bridge-mount.d.ts.map +1 -1
- package/dist/serve/bridge-mount.js +1 -0
- package/dist/serve/bridge-mount.js.map +1 -1
- package/dist/serve/docs-ui/404.html +3 -0
- package/dist/serve/docs-ui/_astro/{_slug_.DPUwShm2.css → _slug_.CXh9yTP1.css} +1 -1
- package/dist/serve/docs-ui/_astro/_slug_.DUci-duz.css +1 -0
- package/dist/serve/docs-ui/docs/_rhythm/index.html +2 -1
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent/index.html +3 -2
- package/dist/serve/docs-ui/docs/agent/set-up-your-agent.md +1 -1
- package/dist/serve/docs-ui/docs/agent/watch-and-review/index.html +2 -1
- package/dist/serve/docs-ui/docs/agent/work-with-an-agent/index.html +2 -1
- package/dist/serve/docs-ui/docs/ai-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/api-reference/index.html +51 -49
- package/dist/serve/docs-ui/docs/api-reference.md +2 -2
- package/dist/serve/docs-ui/docs/app-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/auth-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/build/ai-logic/index.html +18 -3
- package/dist/serve/docs-ui/docs/build/ai-logic.md +30 -2
- package/dist/serve/docs-ui/docs/build/authentication/index.html +2 -1
- package/dist/serve/docs-ui/docs/build/authentication.md +1 -1
- package/dist/serve/docs-ui/docs/build/cloud-firestore/index.html +2 -1
- package/dist/serve/docs-ui/docs/build/cloud-messaging/index.html +46 -2
- package/dist/serve/docs-ui/docs/build/cloud-messaging.md +56 -1
- package/dist/serve/docs-ui/docs/build/cloud-storage/index.html +2 -1
- package/dist/serve/docs-ui/docs/build/cloud-storage.md +1 -1
- package/dist/serve/docs-ui/docs/build/realtime-database/index.html +21 -3
- package/dist/serve/docs-ui/docs/build/realtime-database.md +25 -1
- package/dist/serve/docs-ui/docs/conformance-scores/index.html +2 -1
- package/dist/serve/docs-ui/docs/create-pyric-reference-api/index.html +61 -28
- package/dist/serve/docs-ui/docs/create-pyric-reference-api.md +65 -20
- package/dist/serve/docs-ui/docs/database-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/firestore-compat/index.html +6 -5
- package/dist/serve/docs-ui/docs/firestore-compat.md +4 -4
- package/dist/serve/docs-ui/docs/functions-rtdb-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/get-started/how-the-swap-works/index.html +2 -1
- package/dist/serve/docs-ui/docs/get-started/start-building/index.html +4 -3
- package/dist/serve/docs-ui/docs/get-started/start-building.md +2 -2
- package/dist/serve/docs-ui/docs/index.json +800 -575
- package/dist/serve/docs-ui/docs/messaging-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/observe/see-whats-happening/index.html +2 -1
- package/dist/serve/docs-ui/docs/observe/shape-your-data/index.html +2 -1
- package/dist/serve/docs-ui/docs/overview/index.html +2 -1
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api/index.html +5 -4
- package/dist/serve/docs-ui/docs/pyric-admin-app-reference-api.md +3 -4
- package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api/index.html +5 -4
- package/dist/serve/docs-ui/docs/pyric-admin-auth-reference-api.md +3 -4
- package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api/index.html +5 -4
- package/dist/serve/docs-ui/docs/pyric-admin-database-reference-api.md +3 -4
- package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api/index.html +2503 -12
- package/dist/serve/docs-ui/docs/pyric-admin-firestore-reference-api.md +2219 -8
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api/index.html +4 -3
- package/dist/serve/docs-ui/docs/pyric-admin-storage-reference-api.md +2 -3
- package/dist/serve/docs-ui/docs/pyric-ai-reference-api/index.html +16 -11
- package/dist/serve/docs-ui/docs/pyric-ai-reference-api.md +14 -13
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api/index.html +4 -3
- package/dist/serve/docs-ui/docs/pyric-ai-scripting-reference-api.md +2 -3
- package/dist/serve/docs-ui/docs/pyric-app-reference-api/index.html +7 -2
- package/dist/serve/docs-ui/docs/pyric-app-reference-api.md +5 -2
- package/dist/serve/docs-ui/docs/pyric-auth-reference-api/index.html +23 -12
- package/dist/serve/docs-ui/docs/pyric-auth-reference-api.md +15 -12
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +10 -48
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-browser-reference-api.md +11 -24
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api/index.html +87 -97
- package/dist/serve/docs-ui/docs/pyric-cli-assurance-reference-api.md +53 -65
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api/index.html +14 -15
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-client-reference-api.md +19 -28
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api/index.html +4 -3
- package/dist/serve/docs-ui/docs/pyric-cli-bridge-reference-api.md +2 -3
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-browser-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +51 -0
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-docs-reference-api.md +36 -0
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-cli-conformance-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-cli-credentials-node-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-cli-discover-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-cli-register-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api/index.html +1067 -83
- package/dist/serve/docs-ui/docs/pyric-cli-remote-reference-api.md +1291 -160
- package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api/index.html +123 -92
- package/dist/serve/docs-ui/docs/pyric-cli-serve-worker-reference-api.md +49 -20
- package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api/index.html +72 -7
- package/dist/serve/docs-ui/docs/pyric-cli-verify-reference-api.md +22 -7
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api/index.html +33 -12
- package/dist/serve/docs-ui/docs/pyric-cli-vite-reference-api.md +15 -12
- package/dist/serve/docs-ui/docs/pyric-database-reference-api/index.html +18 -17
- package/dist/serve/docs-ui/docs/pyric-database-reference-api.md +19 -22
- package/dist/serve/docs-ui/docs/pyric-firestore-reference-api/index.html +1512 -545
- package/dist/serve/docs-ui/docs/pyric-firestore-reference-api.md +1311 -316
- package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-firestore-values-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api/index.html +5 -4
- package/dist/serve/docs-ui/docs/pyric-messaging-reference-api.md +3 -4
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api/index.html +69 -369
- package/dist/serve/docs-ui/docs/pyric-messaging-sw-reference-api.md +103 -216
- package/dist/serve/docs-ui/docs/pyric-rules-reference-api/index.html +10 -9
- package/dist/serve/docs-ui/docs/pyric-rules-reference-api.md +9 -10
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api/index.html +8 -7
- package/dist/serve/docs-ui/docs/pyric-sandbox-database-reference-api.md +6 -7
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api/index.html +10 -9
- package/dist/serve/docs-ui/docs/pyric-sandbox-firestore-reference-api.md +9 -10
- package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api/index.html +374 -910
- package/dist/serve/docs-ui/docs/pyric-sandbox-reference-api.md +377 -911
- package/dist/serve/docs-ui/docs/pyric-storage-reference-api/index.html +25 -17
- package/dist/serve/docs-ui/docs/pyric-storage-reference-api.md +21 -19
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-ui-agents-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +63 -776
- package/dist/serve/docs-ui/docs/pyric-ui-auth-hooks-reference-api.md +69 -510
- package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api/index.html +22 -21
- package/dist/serve/docs-ui/docs/pyric-ui-auth-reference-api.md +29 -30
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api/index.html +15 -168
- package/dist/serve/docs-ui/docs/pyric-ui-events-hooks-reference-api.md +17 -87
- package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api/index.html +6 -5
- package/dist/serve/docs-ui/docs/pyric-ui-events-reference-api.md +5 -6
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +82 -970
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-hooks-reference-api.md +104 -479
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api/index.html +30 -29
- package/dist/serve/docs-ui/docs/pyric-ui-firestore-reference-api.md +54 -55
- package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api/index.html +3 -2
- package/dist/serve/docs-ui/docs/pyric-ui-primitives-reference-api.md +1 -2
- package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api/index.html +5 -4
- package/dist/serve/docs-ui/docs/pyric-ui-rtdb-reference-api.md +3 -4
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +9 -124
- package/dist/serve/docs-ui/docs/pyric-ui-rules-hooks-reference-api.md +7 -58
- package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api/index.html +24 -23
- package/dist/serve/docs-ui/docs/pyric-ui-rules-reference-api.md +31 -34
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +104 -1385
- package/dist/serve/docs-ui/docs/pyric-ui-storage-hooks-reference-api.md +133 -817
- package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api/index.html +34 -33
- package/dist/serve/docs-ui/docs/pyric-ui-storage-reference-api.md +37 -38
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +116 -1169
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-hooks-reference-api.md +142 -590
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api/index.html +4 -3
- package/dist/serve/docs-ui/docs/pyric-ui-traffic-reference-api.md +3 -4
- package/dist/serve/docs-ui/docs/rules-compat/index.html +34 -1
- package/dist/serve/docs-ui/docs/rules-compat.md +32 -0
- package/dist/serve/docs-ui/docs/secure/audit-your-rules/index.html +19 -2
- package/dist/serve/docs-ui/docs/secure/audit-your-rules.md +32 -0
- package/dist/serve/docs-ui/docs/secure/firestore-rules-limits/index.html +2 -1
- package/dist/serve/docs-ui/docs/secure/read-a-denial/index.html +2 -1
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript/index.html +2 -1
- package/dist/serve/docs-ui/docs/secure/rtdb-rules-in-typescript.md +1 -1
- package/dist/serve/docs-ui/docs/secure/rules-standard-library/index.html +2 -1
- package/dist/serve/docs-ui/docs/secure/secure-it-with-rules/index.html +2 -1
- package/dist/serve/docs-ui/docs/secure/simulate-and-lint/index.html +2 -1
- package/dist/serve/docs-ui/docs/secure/write-a-rules-test-suite/index.html +2 -1
- package/dist/serve/docs-ui/docs/ship/ship-to-production/index.html +2 -1
- package/dist/serve/docs-ui/docs/ship/test-in-node/index.html +2 -1
- package/dist/serve/docs-ui/docs/storage-compat/index.html +2 -1
- package/dist/serve/docs-ui/docs/trust/how-we-know-it-matches-firebase/index.html +2 -1
- package/dist/serve/docs-ui/docs/trust/versioning-and-compatibility/index.html +2 -1
- package/dist/serve/docs-ui/llms.txt +1 -0
- package/dist/serve/entries/ai.d.ts.map +1 -1
- package/dist/serve/entries/ai.js +39 -1
- package/dist/serve/entries/ai.js.map +1 -1
- package/dist/serve/entries/messaging-sw.d.ts.map +1 -1
- package/dist/serve/entries/messaging-sw.js +5 -1
- package/dist/serve/entries/messaging-sw.js.map +1 -1
- package/dist/serve/entries/messaging.d.ts.map +1 -1
- package/dist/serve/entries/messaging.js +7 -1
- package/dist/serve/entries/messaging.js.map +1 -1
- package/dist/serve/entries/runtime.d.ts.map +1 -1
- package/dist/serve/entries/runtime.js +20 -1
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/init-payload.d.ts +25 -0
- package/dist/serve/init-payload.d.ts.map +1 -1
- package/dist/serve/namespace.d.ts +39 -0
- package/dist/serve/namespace.d.ts.map +1 -1
- package/dist/serve/namespace.js +80 -1
- package/dist/serve/namespace.js.map +1 -1
- package/dist/serve/standalone-assets.d.ts +11 -9
- package/dist/serve/standalone-assets.d.ts.map +1 -1
- package/dist/serve/standalone-assets.js +6 -5
- package/dist/serve/standalone-assets.js.map +1 -1
- package/dist/serve/studio-ui/assets/{RulesCodeEditor-CXdSLKhO.js → RulesCodeEditor-CxVYcZXw.js} +1 -1
- package/dist/serve/studio-ui/assets/index-cpSfgQ7H.js +1218 -0
- package/dist/serve/studio-ui/assets/seed-DeuFKi4J.js +20 -0
- package/dist/serve/studio-ui/index.html +1 -1
- package/dist/serve/vite-plugin.d.ts +92 -15
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +281 -11
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/worker/activity-bootstrap.d.ts +8 -0
- package/dist/serve/worker/activity-bootstrap.d.ts.map +1 -0
- package/dist/serve/worker/activity-bootstrap.js +11 -0
- package/dist/serve/worker/activity-bootstrap.js.map +1 -0
- package/dist/serve/worker/client/connection.d.ts.map +1 -1
- package/dist/serve/worker/client/connection.js +17 -5
- package/dist/serve/worker/client/connection.js.map +1 -1
- package/dist/serve/worker/client/core.d.ts +2 -2
- package/dist/serve/worker/client/core.d.ts.map +1 -1
- package/dist/serve/worker/client/core.js +33 -5
- package/dist/serve/worker/client/core.js.map +1 -1
- package/dist/serve/worker/client/firestore-writes.d.ts.map +1 -1
- package/dist/serve/worker/client/firestore-writes.js +1 -0
- package/dist/serve/worker/client/firestore-writes.js.map +1 -1
- package/dist/serve/worker/client/messaging.d.ts +9 -1
- package/dist/serve/worker/client/messaging.d.ts.map +1 -1
- package/dist/serve/worker/client/messaging.js +15 -0
- package/dist/serve/worker/client/messaging.js.map +1 -1
- package/dist/serve/worker/client/studio.d.ts +10 -0
- package/dist/serve/worker/client/studio.d.ts.map +1 -1
- package/dist/serve/worker/client/studio.js +11 -0
- package/dist/serve/worker/client/studio.js.map +1 -1
- package/dist/serve/worker/durable-persistence.d.ts +12 -0
- package/dist/serve/worker/durable-persistence.d.ts.map +1 -0
- package/dist/serve/worker/durable-persistence.js +118 -0
- package/dist/serve/worker/durable-persistence.js.map +1 -0
- package/dist/serve/worker/entry.d.ts +7 -3
- package/dist/serve/worker/entry.d.ts.map +1 -1
- package/dist/serve/worker/entry.js +7 -3
- package/dist/serve/worker/entry.js.map +1 -1
- package/dist/serve/worker/host/core.d.ts +9 -5
- package/dist/serve/worker/host/core.d.ts.map +1 -1
- package/dist/serve/worker/host/core.js +33 -8
- package/dist/serve/worker/host/core.js.map +1 -1
- package/dist/serve/worker/host/dispatch.d.ts.map +1 -1
- package/dist/serve/worker/host/dispatch.js +9 -2
- package/dist/serve/worker/host/dispatch.js.map +1 -1
- package/dist/serve/worker/host/studio.d.ts +1 -1
- package/dist/serve/worker/host/studio.d.ts.map +1 -1
- package/dist/serve/worker/host/studio.js +36 -1
- package/dist/serve/worker/host/studio.js.map +1 -1
- package/dist/serve/worker/host/subscriptions.d.ts.map +1 -1
- package/dist/serve/worker/host/subscriptions.js +27 -7
- package/dist/serve/worker/host/subscriptions.js.map +1 -1
- package/dist/serve/worker/host-context.d.ts +15 -0
- package/dist/serve/worker/host-context.d.ts.map +1 -1
- package/dist/serve/worker/host-context.js +10 -0
- package/dist/serve/worker/host-context.js.map +1 -1
- package/dist/serve/worker/host-messaging.d.ts.map +1 -1
- package/dist/serve/worker/host-messaging.js +9 -2
- package/dist/serve/worker/host-messaging.js.map +1 -1
- package/dist/serve/worker/index.d.ts +1 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +2 -0
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/protocol.d.ts +25 -3
- package/dist/serve/worker/protocol.d.ts.map +1 -1
- package/dist/serve/worker/protocol.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts +23 -37
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +95 -172
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/dist/vite.d.ts +4 -4
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +3 -3
- package/dist/vite.js.map +1 -1
- package/package.json +8 -4
- package/dist/serve/studio-ui/assets/index-BvtQIpGn.js +0 -1211
- package/dist/serve/studio-ui/assets/seed-3DMedLL3.js +0 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: @pyric/ui/storage · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/storage."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.DPUwShm2.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Trust </a><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/" id="nav-group-trust"> Trust </a><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>@pyric/ui</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">@pyric/ui/storage</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/storage</code></h1> <p class="api-reference-meta"> 76 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
|
|
1
|
+
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>API reference: @pyric/ui/storage · Pyric Studio</title><meta name="description" content="Published declarations for @pyric/ui/storage."><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CXh9yTP1.css">
|
|
2
|
+
<link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.DUci-duz.css"></head> <body> <header class="studio__bar"> <div class="studio__bar-inner"> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio">Pyric</a> <nav class="studio__nav" aria-label="Studio tabs"> <a class="studio__nav-tab" href="/__pyric/ui/"> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore"> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth"> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb"> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage"> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic"> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings"> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page"> Docs </a> </nav> </div> </header> <div class="docs-shell"> <details class="docs-nav-drawer"> <summary>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/"> Overview </a><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Trust </a><details class="docs-nav-group"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <a class="docs-nav-toplink" href="/__pyric/ui/docs/overview/" id="nav-group-overview"> Overview </a><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><a class="docs-nav-toplink" href="/__pyric/ui/docs/trust/versioning-and-compatibility/" id="nav-group-trust"> Trust </a><details class="docs-nav-group" id="nav-group-conformance"> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference" open> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-values-reference-api/"> pyric/firestore-values </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/" aria-current="page"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main"> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/api-reference/">API reference</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span>@pyric/ui</span> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">@pyric/ui/storage</span> </li> </ol> </nav> <header class="api-reference-header"> <p class="api-reference-kicker">API reference</p> <h1><code>@pyric/ui/storage</code></h1> <p class="api-reference-meta"> 76 published symbols from <code>@pyric/ui</code> </p> <p class="api-reference-source">
|
|
2
3
|
Generated from the TypeScript declarations shipped at this import path.
|
|
3
|
-
</p> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc.
|
|
4
|
+
</p> </header> <article class="prose api-reference-body"> <!-- Generated from published package declarations via TypeDoc. Rendered by the api-reference content loader. -->
|
|
4
5
|
<h2 id="interfaces">Interfaces</h2>
|
|
5
6
|
<p><a id="custommetadataentry"></a></p>
|
|
6
7
|
<h3 id="custommetadataentry">CustomMetadataEntry</h3>
|
|
@@ -112,7 +113,7 @@ user-editable, so they can’t key the rows themselves.</p>
|
|
|
112
113
|
|
|
113
114
|
|
|
114
115
|
|
|
115
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="body"></a> <code>body?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Confirm-dialog body. Default lists the selected paths.</td></tr><tr><td align="left"><a id="classname"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">Class forwarded to the default trigger button.</td></tr><tr><td align="left"><a id="confirmlabel"></a> <code>confirmLabel?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries"></a> <code>entries</code></td><td align="left"><a href="#storageselectionentry"><code>StorageSelectionEntry</code></a>[]</td><td align="left">What to delete — <code>useStorageSelection().selected</code> (or any <code>{kind, fullPath}</code> rows). Folders delete recursively.</td></tr><tr><td align="left"><a id="gate"></a> <code>gate?</code></td><td align="left"><code>Pick</code><<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordance — pass <code>useStorageRulesGate(storage)</code>. When ANY selected entry’s DELETE verdict denies, the trigger disables with the reason (default trigger: <code>data-pyric-denied</code> + <code>data-pyric-denied-reason</code> + <code>title</code>; <code>renderTrigger</code> receives <code>deniedReason</code>). For folder entries the verdict evaluates the folder path itself — an approximation of the recursive walk (descendants matched by <code>{allPaths=**}</code> rules share the verdict).</td></tr><tr><td align="left"><a id="impl"></a> <code>impl?</code></td><td align="left"><a href="#storagerecursivedeleteimpl"><code>StorageRecursiveDeleteImpl</code></a></td><td align="left">Folder-walk impl override (default: the <code>listAll</code>-driven one).</td></tr><tr><td align="left"><a id="list"></a> <code>list?</code></td><td align="left"><code>Pick</code><<a href="#usestoragelistresult"><code>UseStorageListResult</code></a>, <code>"insertItem"</code> | <code>"removeItem"</code>></td><td align="left">Optimistic seam from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="ondeleted"></a> <code>onDeleted?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with NO failures (e.g. clear the selection + refresh the list).</td></tr><tr><td align="left"><a id="onfailed"></a> <code>onFailed?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with failures (the toast already showed).</td></tr><tr><td align="left"><a id="rendertrigger"></a> <code>renderTrigger?</code></td><td align="left">(<code>props</code>: { <code>deniedReason?</code>: <code>string</code>; <code>disabled</code>: <code>boolean</code>; <code>isRunning</code>: <code>boolean</code>; <code>onClick</code>: () => <code>void</code>; <code>progress</code>: <code>number</code>; }) => <code>ReactNode</code></td><td align="left">Render override for the trigger button.</td></tr><tr><td align="left"><a id="storage"></a> <code>storage</code></td><td align="left"><code>
|
|
116
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="body"></a> <code>body?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Confirm-dialog body. Default lists the selected paths.</td></tr><tr><td align="left"><a id="classname"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">Class forwarded to the default trigger button.</td></tr><tr><td align="left"><a id="confirmlabel"></a> <code>confirmLabel?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries"></a> <code>entries</code></td><td align="left"><a href="#storageselectionentry"><code>StorageSelectionEntry</code></a>[]</td><td align="left">What to delete — <code>useStorageSelection().selected</code> (or any <code>{kind, fullPath}</code> rows). Folders delete recursively.</td></tr><tr><td align="left"><a id="gate"></a> <code>gate?</code></td><td align="left"><code>Pick</code><<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordance — pass <code>useStorageRulesGate(storage)</code>. When ANY selected entry’s DELETE verdict denies, the trigger disables with the reason (default trigger: <code>data-pyric-denied</code> + <code>data-pyric-denied-reason</code> + <code>title</code>; <code>renderTrigger</code> receives <code>deniedReason</code>). For folder entries the verdict evaluates the folder path itself — an approximation of the recursive walk (descendants matched by <code>{allPaths=**}</code> rules share the verdict).</td></tr><tr><td align="left"><a id="impl"></a> <code>impl?</code></td><td align="left"><a href="#storagerecursivedeleteimpl"><code>StorageRecursiveDeleteImpl</code></a></td><td align="left">Folder-walk impl override (default: the <code>listAll</code>-driven one).</td></tr><tr><td align="left"><a id="list"></a> <code>list?</code></td><td align="left"><code>Pick</code><<a href="#usestoragelistresult"><code>UseStorageListResult</code></a>, <code>"insertItem"</code> | <code>"removeItem"</code>></td><td align="left">Optimistic seam from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="ondeleted"></a> <code>onDeleted?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with NO failures (e.g. clear the selection + refresh the list).</td></tr><tr><td align="left"><a id="onfailed"></a> <code>onFailed?</code></td><td align="left">(<code>outcome</code>: <a href="#storagedeleteoutcome"><code>StorageDeleteOutcome</code></a>) => <code>void</code></td><td align="left">Fired after a run with failures (the toast already showed).</td></tr><tr><td align="left"><a id="rendertrigger"></a> <code>renderTrigger?</code></td><td align="left">(<code>props</code>: { <code>deniedReason?</code>: <code>string</code>; <code>disabled</code>: <code>boolean</code>; <code>isRunning</code>: <code>boolean</code>; <code>onClick</code>: () => <code>void</code>; <code>progress</code>: <code>number</code>; }) => <code>ReactNode</code></td><td align="left">Render override for the trigger button.</td></tr><tr><td align="left"><a id="storage"></a> <code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td><td align="left">The package’s single Storage handle prop.</td></tr><tr><td align="left"><a id="title"></a> <code>title?</code></td><td align="left"><code>string</code></td><td align="left">Confirm-dialog title. Default derives from the entry count.</td></tr></tbody></table></div>
|
|
116
117
|
<hr>
|
|
117
118
|
<p><a id="droppedfile"></a></p>
|
|
118
119
|
<h3 id="droppedfile">DroppedFile</h3>
|
|
@@ -253,7 +254,7 @@ user-editable, so they can’t key the rows themselves.</p>
|
|
|
253
254
|
|
|
254
255
|
|
|
255
256
|
|
|
256
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="classname-1"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries-1"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">The folders-first row model from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="error-1"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Renders a <code>role="alert"</code> container with the message. Pair with the hook’s typed <code>StorageError</code> for code-driven copy.</td></tr><tr><td align="left"><a id="gate-1"></a> <code>gate?</code></td><td align="left"><code>Pick</code><<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordances — pass <code>useStorageRulesGate(storage)</code>. Rows whose READ verdict denies are stamped <code>data-pyric-denied</code> (with the evaluator’s reason trace on <code>data-pyric-denied-reason</code>). A denied folder row would throw <code>storage/unauthorized</code> on <code>listAll</code>; the stamp warns BEFORE the click. Rows stay clickable — the affordance is advisory and the sandbox enforcement layer remains authoritative.</td></tr><tr><td align="left"><a id="onnavigate"></a> <code>onNavigate?</code></td><td align="left">(<code>path</code>: <code>string</code>) => <code>void</code></td><td align="left">Folder row click — fired with the prefix’s <code>fullPath</code>. Wire to <code>usePathState.enter</code> (or <code>setPath</code>).</td></tr><tr><td align="left"><a id="onselect"></a> <code>onSelect?</code></td><td align="left">(<code>ref</code>: <code>StorageReference</code>) => <code>void</code></td><td align="left">Object row click — fired with the object’s reference.</td></tr><tr><td align="left"><a id="renderentry"></a> <code>renderEntry?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Row-label slot. Default renders the entry name. The row button, its click wiring, and the <code>data-*</code> states stay with the component — the slot only owns the label content.</td></tr><tr><td align="left"><a id="renderrowaction"></a> <code>renderRowAction?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Optional per-row action rendered as a sibling of the navigation/select button. Use this for independent controls such as selection checkboxes.</td></tr><tr><td align="left"><a id="rowheight"></a> <code>rowHeight?</code></td><td align="left"><code>number</code> | (<code>index</code>: <code>number</code>) => <code>number</code></td><td align="left">Estimated row height when virtualizing. Default 36.</td></tr><tr><td align="left"><a id="selectedpath"></a> <code>selectedPath?</code></td><td align="left"><code>string</code></td><td align="left">Marks the matching object row <code>data-pyric-selected</code> + <code>aria-selected</code>.</td></tr><tr><td align="left"><a id="status"></a> <code>status?</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left">Drives the loading state (<code>'loading'</code> with no rows yet) and the idle short-circuit. Default <code>'success'</code> for static usage.</td></tr><tr><td align="left"><a id="virtualizedheight"></a> <code>virtualizedHeight?</code></td><td align="left"><code>string</code> | <code>number</code></td><td align="left">Scroll-container height when virtualized. Default <code>'60vh'</code>.</td></tr><tr><td align="left"><a id="virtualizethreshold"></a> <code>virtualizeThreshold?</code></td><td align="left"><code>number</code></td><td align="left">Above this row count, the list switches to virtualization via <code><VirtualList></code> — <code>listAll</code> has no pagination, so a big prefix arrives as one flat result and virtualization is the only defense. Default 100 (same as <code><DocumentList></code>). <code>Infinity</code> disables.</td></tr></tbody></table></div>
|
|
257
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="classname-1"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="emptystate"></a> <code>emptyState?</code></td><td align="left"><code>ReactNode</code></td><td align="left">-</td></tr><tr><td align="left"><a id="entries-1"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">The folders-first row model from <code>useStorageList</code>.</td></tr><tr><td align="left"><a id="error-1"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Renders a <code>role="alert"</code> container with the message. Pair with the hook’s typed <code>StorageError</code> for code-driven copy.</td></tr><tr><td align="left"><a id="gate-1"></a> <code>gate?</code></td><td align="left"><code>Pick</code><<a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a>, <code>"verdictFor"</code>></td><td align="left">Rules-aware affordances — pass <code>useStorageRulesGate(storage)</code>. Rows whose READ verdict denies are stamped <code>data-pyric-denied</code> (with the evaluator’s reason trace on <code>data-pyric-denied-reason</code>). A denied folder row would throw <code>storage/unauthorized</code> on <code>listAll</code>; the stamp warns BEFORE the click. Rows stay clickable — the affordance is advisory and the sandbox enforcement layer remains authoritative.</td></tr><tr><td align="left"><a id="onnavigate"></a> <code>onNavigate?</code></td><td align="left">(<code>path</code>: <code>string</code>) => <code>void</code></td><td align="left">Folder row click — fired with the prefix’s <code>fullPath</code>. Wire to <code>usePathState.enter</code> (or <code>setPath</code>).</td></tr><tr><td align="left"><a id="onselect"></a> <code>onSelect?</code></td><td align="left">(<code>ref</code>: <a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>) => <code>void</code></td><td align="left">Object row click — fired with the object’s reference.</td></tr><tr><td align="left"><a id="renderentry"></a> <code>renderEntry?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Row-label slot. Default renders the entry name. The row button, its click wiring, and the <code>data-*</code> states stay with the component — the slot only owns the label content.</td></tr><tr><td align="left"><a id="renderrowaction"></a> <code>renderRowAction?</code></td><td align="left">(<code>entry</code>: <a href="#storagelistentry"><code>StorageListEntry</code></a>) => <code>ReactNode</code></td><td align="left">Optional per-row action rendered as a sibling of the navigation/select button. Use this for independent controls such as selection checkboxes.</td></tr><tr><td align="left"><a id="rowheight"></a> <code>rowHeight?</code></td><td align="left"><code>number</code> | (<code>index</code>: <code>number</code>) => <code>number</code></td><td align="left">Estimated row height when virtualizing. Default 36.</td></tr><tr><td align="left"><a id="selectedpath"></a> <code>selectedPath?</code></td><td align="left"><code>string</code></td><td align="left">Marks the matching object row <code>data-pyric-selected</code> + <code>aria-selected</code>.</td></tr><tr><td align="left"><a id="status"></a> <code>status?</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left">Drives the loading state (<code>'loading'</code> with no rows yet) and the idle short-circuit. Default <code>'success'</code> for static usage.</td></tr><tr><td align="left"><a id="virtualizedheight"></a> <code>virtualizedHeight?</code></td><td align="left"><code>string</code> | <code>number</code></td><td align="left">Scroll-container height when virtualized. Default <code>'60vh'</code>.</td></tr><tr><td align="left"><a id="virtualizethreshold"></a> <code>virtualizeThreshold?</code></td><td align="left"><code>number</code></td><td align="left">Above this row count, the list switches to virtualization via <code><VirtualList></code> — <code>listAll</code> has no pagination, so a big prefix arrives as one flat result and virtualization is the only defense. Default 100 (same as <code><DocumentList></code>). <code>Infinity</code> disables.</td></tr></tbody></table></div>
|
|
257
258
|
<hr>
|
|
258
259
|
<p><a id="objectinspectorprops"></a></p>
|
|
259
260
|
<h3 id="objectinspectorprops">ObjectInspectorProps</h3>
|
|
@@ -298,7 +299,7 @@ user-editable, so they can’t key the rows themselves.</p>
|
|
|
298
299
|
|
|
299
300
|
|
|
300
301
|
|
|
301
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="children"></a> <code>children?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Extra content below the preview (metadata editor, delete button, …).</td></tr><tr><td align="left"><a id="classname-2"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="path"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">Object path to inspect. <code>null</code> renders the idle shell — keep the inspector mounted and swap paths as the user selects rows.</td></tr><tr><td align="left"><a id="previews"></a> <code>previews?</code></td><td align="left"><a href="#storagepreview"><code>StoragePreview</code></a>[]</td><td align="left">Consumer previews, tried BEFORE the built-ins (first match wins) — the extension channel of the preview registry.</td></tr><tr><td align="left"><a id="rendermetadata"></a> <code>renderMetadata?</code></td><td align="left">(<code>metadata</code>: <code>FullMetadata</code>) => <code>ReactNode</code></td><td align="left">Metadata-section slot. Default renders the standard field list. The header, preview, and state wiring stay with the component.</td></tr><tr><td align="left"><a id="storage-1"></a> <code>storage</code></td><td align="left"><code>
|
|
302
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="children"></a> <code>children?</code></td><td align="left"><code>ReactNode</code></td><td align="left">Extra content below the preview (metadata editor, delete button, …).</td></tr><tr><td align="left"><a id="classname-2"></a> <code>className?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="path"></a> <code>path</code></td><td align="left"><code>string</code></td><td align="left">Object path to inspect. <code>null</code> renders the idle shell — keep the inspector mounted and swap paths as the user selects rows.</td></tr><tr><td align="left"><a id="previews"></a> <code>previews?</code></td><td align="left"><a href="#storagepreview"><code>StoragePreview</code></a>[]</td><td align="left">Consumer previews, tried BEFORE the built-ins (first match wins) — the extension channel of the preview registry.</td></tr><tr><td align="left"><a id="rendermetadata"></a> <code>renderMetadata?</code></td><td align="left">(<code>metadata</code>: <a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a>) => <code>ReactNode</code></td><td align="left">Metadata-section slot. Default renders the standard field list. The header, preview, and state wiring stay with the component.</td></tr><tr><td align="left"><a id="storage-1"></a> <code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td><td align="left">The package’s sandbox Storage handle.</td></tr></tbody></table></div>
|
|
302
303
|
<hr>
|
|
303
304
|
<p><a id="pathbreadcrumbprops"></a></p>
|
|
304
305
|
<h3 id="pathbreadcrumbprops">PathBreadcrumbProps</h3>
|
|
@@ -506,7 +507,7 @@ rows, its <code>items</code> become <code>kind: 'object'</code> rows, folders fi
|
|
|
506
507
|
|
|
507
508
|
|
|
508
509
|
|
|
509
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="fullpath-1"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted path (no trailing slash, even for folders).</td></tr><tr><td align="left"><a id="kind"></a> <code>kind</code></td><td align="left"><code>"object"</code> | <code>"folder"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="name"></a> <code>name</code></td><td align="left"><code>string</code></td><td align="left">Last path segment, display name.</td></tr><tr><td align="left"><a id="ref"></a> <code>ref</code></td><td align="left"><code>StorageReference</code></td><td align="left">-</td></tr></tbody></table></div>
|
|
510
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="fullpath-1"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted path (no trailing slash, even for folders).</td></tr><tr><td align="left"><a id="kind"></a> <code>kind</code></td><td align="left"><code>"object"</code> | <code>"folder"</code></td><td align="left">-</td></tr><tr><td align="left"><a id="name"></a> <code>name</code></td><td align="left"><code>string</code></td><td align="left">Last path segment, display name.</td></tr><tr><td align="left"><a id="ref"></a> <code>ref</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a></td><td align="left">-</td></tr></tbody></table></div>
|
|
510
511
|
<hr>
|
|
511
512
|
<p><a id="storagepreview"></a></p>
|
|
512
513
|
<h3 id="storagepreview">StoragePreview</h3>
|
|
@@ -552,7 +553,7 @@ matcher.</p>
|
|
|
552
553
|
|
|
553
554
|
|
|
554
555
|
|
|
555
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="id-1"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Diagnostic id — also stamped on the preview container as <code>data-pyric-preview="<id>"</code>.</td></tr><tr><td align="left"><a id="match"></a> <code>match</code></td><td align="left">(<code>metadata</code>: <code>FullMetadata</code>) => <code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="maxbytes"></a> <code>maxBytes?</code></td><td align="left"><code>number</code></td><td align="left">Skip the preview (and the blob download) for objects larger than this — the inspector renders its <code>data-pyric-preview-too-large</code> fallback instead. <code>undefined</code> = no cap.</td></tr><tr><td align="left"><a id="needsblob"></a> <code>needsBlob?</code></td><td align="left"><code>boolean</code></td><td align="left">Ask the inspector to <code>loadBlob()</code> before rendering. Default <code>false</code> (metadata-only previews render immediately).</td></tr><tr><td align="left"><a id="render"></a> <code>render</code></td><td align="left">(<code>ctx</code>: <a href="#storagepreviewcontext"><code>StoragePreviewContext</code></a>) => <code>ReactNode</code></td><td align="left">-</td></tr></tbody></table></div>
|
|
556
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="id-1"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Diagnostic id — also stamped on the preview container as <code>data-pyric-preview="<id>"</code>.</td></tr><tr><td align="left"><a id="match"></a> <code>match</code></td><td align="left">(<code>metadata</code>: <a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a>) => <code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="maxbytes"></a> <code>maxBytes?</code></td><td align="left"><code>number</code></td><td align="left">Skip the preview (and the blob download) for objects larger than this — the inspector renders its <code>data-pyric-preview-too-large</code> fallback instead. <code>undefined</code> = no cap.</td></tr><tr><td align="left"><a id="needsblob"></a> <code>needsBlob?</code></td><td align="left"><code>boolean</code></td><td align="left">Ask the inspector to <code>loadBlob()</code> before rendering. Default <code>false</code> (metadata-only previews render immediately).</td></tr><tr><td align="left"><a id="render"></a> <code>render</code></td><td align="left">(<code>ctx</code>: <a href="#storagepreviewcontext"><code>StoragePreviewContext</code></a>) => <code>ReactNode</code></td><td align="left">-</td></tr></tbody></table></div>
|
|
556
557
|
<hr>
|
|
557
558
|
<p><a id="storagepreviewcontext"></a></p>
|
|
558
559
|
<h3 id="storagepreviewcontext">StoragePreviewContext</h3>
|
|
@@ -580,7 +581,7 @@ populated for previews that declared <code>needsBlob</code>.</p>
|
|
|
580
581
|
|
|
581
582
|
|
|
582
583
|
|
|
583
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="blob"></a> <code>blob</code></td><td align="left"><code>Blob</code></td></tr><tr><td align="left"><a id="bloburl"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="metadata"></a> <code>metadata</code></td><td align="left"><code>FullMetadata</code></td></tr></tbody></table></div>
|
|
584
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="blob"></a> <code>blob</code></td><td align="left"><code>Blob</code></td></tr><tr><td align="left"><a id="bloburl"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><a id="metadata"></a> <code>metadata</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td></tr></tbody></table></div>
|
|
584
585
|
<hr>
|
|
585
586
|
<p><a id="storagerecursivedeleteimpl"></a></p>
|
|
586
587
|
<h3 id="storagerecursivedeleteimpl">StorageRecursiveDeleteImpl</h3>
|
|
@@ -604,7 +605,7 @@ inject your own for server-driven deletes.</p>
|
|
|
604
605
|
|
|
605
606
|
|
|
606
607
|
|
|
607
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="start"></a> <code>start</code></td><td align="left">(<code>target</code>: <code>StorageReference</code>) => <code>AsyncIterableIterator</code><<a href="#storagedeleteprogress"><code>StorageDeleteProgress</code></a>></td></tr></tbody></table></div>
|
|
608
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="start"></a> <code>start</code></td><td align="left">(<code>target</code>: <a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>) => <code>AsyncIterableIterator</code><<a href="#storagedeleteprogress"><code>StorageDeleteProgress</code></a>></td></tr></tbody></table></div>
|
|
608
609
|
<hr>
|
|
609
610
|
<p><a id="storageselectionentry"></a></p>
|
|
610
611
|
<h3 id="storageselectionentry">StorageSelectionEntry</h3>
|
|
@@ -698,7 +699,7 @@ in. The <code>kind</code> decides the delete verb later (object →
|
|
|
698
699
|
|
|
699
700
|
|
|
700
701
|
|
|
701
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="data"></a> <code>data</code></td><td align="left"><code>
|
|
702
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><a id="data"></a> <code>data</code></td><td align="left"><code>ArrayBuffer</code> | <code>Uint8Array</code><<code>ArrayBufferLike</code>> | <code>Blob</code></td></tr><tr><td align="left"><a id="metadata-1"></a> <code>metadata?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td></tr><tr><td align="left"><a id="path-2"></a> <code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
|
|
702
703
|
<hr>
|
|
703
704
|
<p><a id="uploadtask"></a></p>
|
|
704
705
|
<h3 id="uploadtask">UploadTask</h3>
|
|
@@ -755,7 +756,7 @@ at <code>totalBytes</code>.</p>
|
|
|
755
756
|
|
|
756
757
|
|
|
757
758
|
|
|
758
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bytestransferred"></a> <code>bytesTransferred</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="error-3"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Populated on <code>'error'</code> — a typed <code>StorageError</code> from the sandbox (<code>.code</code> is <code>storage/<code></code>, e.g. <code>storage/unauthorized</code> for a rules-denied write).</td></tr><tr><td align="left"><a id="fullpath-3"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted destination path.</td></tr><tr><td align="left"><a id="id-2"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Stable id — key task rows on this, not on <code>fullPath</code> (two uploads can target the same path).</td></tr><tr><td align="left"><a id="metadata-2"></a> <code>metadata?</code></td><td align="left"><code>FullMetadata</code></td><td align="left">Populated on <code>'success'</code>.</td></tr><tr><td align="left"><a id="status-1"></a> <code>status</code></td><td align="left"><a href="#uploadtaskstatus-1"><code>UploadTaskStatus</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="totalbytes"></a> <code>totalBytes</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
|
|
759
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="bytestransferred"></a> <code>bytesTransferred</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="error-3"></a> <code>error?</code></td><td align="left"><code>Error</code></td><td align="left">Populated on <code>'error'</code> — a typed <code>StorageError</code> from the sandbox (<code>.code</code> is <code>storage/<code></code>, e.g. <code>storage/unauthorized</code> for a rules-denied write).</td></tr><tr><td align="left"><a id="fullpath-3"></a> <code>fullPath</code></td><td align="left"><code>string</code></td><td align="left">Bucket-rooted destination path.</td></tr><tr><td align="left"><a id="id-2"></a> <code>id</code></td><td align="left"><code>string</code></td><td align="left">Stable id — key task rows on this, not on <code>fullPath</code> (two uploads can target the same path).</td></tr><tr><td align="left"><a id="metadata-2"></a> <code>metadata?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td><td align="left">Populated on <code>'success'</code>.</td></tr><tr><td align="left"><a id="status-1"></a> <code>status</code></td><td align="left"><a href="#uploadtaskstatus-1"><code>UploadTaskStatus</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="totalbytes"></a> <code>totalBytes</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
|
|
759
760
|
<hr>
|
|
760
761
|
<p><a id="usemetadataeditoroptions"></a></p>
|
|
761
762
|
<h3 id="usemetadataeditoroptions">UseMetadataEditorOptions</h3>
|
|
@@ -775,7 +776,7 @@ at <code>totalBytes</code>.</p>
|
|
|
775
776
|
|
|
776
777
|
|
|
777
778
|
|
|
778
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="initial-1"></a> <code>initial?</code></td><td align="left"><code>SettableMetadata</code></td><td align="left">The metadata being edited — the same shape <code>useStorageObject</code>’s <code>metadata</code> carries. Read once on mount (the editor is a stateful workspace, like the document editor); <code>reset()</code> + remount to re-initialize.</td></tr></tbody></table></div>
|
|
779
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="initial-1"></a> <code>initial?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td><td align="left">The metadata being edited — the same shape <code>useStorageObject</code>’s <code>metadata</code> carries. Read once on mount (the editor is a stateful workspace, like the document editor); <code>reset()</code> + remount to re-initialize.</td></tr></tbody></table></div>
|
|
779
780
|
<hr>
|
|
780
781
|
<p><a id="usemetadataeditorresult"></a></p>
|
|
781
782
|
<h3 id="usemetadataeditorresult">UseMetadataEditorResult</h3>
|
|
@@ -880,7 +881,7 @@ at <code>totalBytes</code>.</p>
|
|
|
880
881
|
|
|
881
882
|
|
|
882
883
|
|
|
883
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="addcustomentry"></a> <code>addCustomEntry</code></td><td align="left">(<code>key?</code>: <code>string</code>, <code>value?</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="cachecontrol"></a> <code>cacheControl</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="contenttype"></a> <code>contentType</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="custom"></a> <code>custom</code></td><td align="left"><a href="#custommetadataentry"><code>CustomMetadataEntry</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="dispatch"></a> <code>dispatch</code></td><td align="left">(<code>action</code>: <a href="#metadataeditoraction"><code>MetadataEditorAction</code></a>) => <code>void</code></td><td align="left">Raw dispatch — prefer the named helpers.</td></tr><tr><td align="left"><a id="errorcount-1"></a> <code>errorCount</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isdirty"></a> <code>isDirty</code></td><td align="left"><code>boolean</code></td><td align="left"><code>true</code> once any modifying action fired since the last <code>reset</code>/successful <code>save</code>. Reference-compare semantics — manual re-entry of the original values does NOT clear it.</td></tr><tr><td align="left"><a id="issaving"></a> <code>isSaving</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isvalid"></a> <code>isValid</code></td><td align="left"><code>boolean</code></td><td align="left">Convenience: <code>errorCount === 0</code>.</td></tr><tr><td align="left"><a id="removecustomentry"></a> <code>removeCustomEntry</code></td><td align="left">(<code>id</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="reset"></a> <code>reset</code></td><td align="left">() => <code>void</code></td><td align="left">Restore the initial values. Clears <code>isDirty</code>.</td></tr><tr><td align="left"><a id="save"></a> <code>save</code></td><td align="left">() => <code>Promise</code><<code>
|
|
884
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="addcustomentry"></a> <code>addCustomEntry</code></td><td align="left">(<code>key?</code>: <code>string</code>, <code>value?</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="cachecontrol"></a> <code>cacheControl</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="contenttype"></a> <code>contentType</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><a id="custom"></a> <code>custom</code></td><td align="left"><a href="#custommetadataentry"><code>CustomMetadataEntry</code></a>[]</td><td align="left">-</td></tr><tr><td align="left"><a id="dispatch"></a> <code>dispatch</code></td><td align="left">(<code>action</code>: <a href="#metadataeditoraction"><code>MetadataEditorAction</code></a>) => <code>void</code></td><td align="left">Raw dispatch — prefer the named helpers.</td></tr><tr><td align="left"><a id="errorcount-1"></a> <code>errorCount</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isdirty"></a> <code>isDirty</code></td><td align="left"><code>boolean</code></td><td align="left"><code>true</code> once any modifying action fired since the last <code>reset</code>/successful <code>save</code>. Reference-compare semantics — manual re-entry of the original values does NOT clear it.</td></tr><tr><td align="left"><a id="issaving"></a> <code>isSaving</code></td><td align="left"><code>boolean</code></td><td align="left">-</td></tr><tr><td align="left"><a id="isvalid"></a> <code>isValid</code></td><td align="left"><code>boolean</code></td><td align="left">Convenience: <code>errorCount === 0</code>.</td></tr><tr><td align="left"><a id="removecustomentry"></a> <code>removeCustomEntry</code></td><td align="left">(<code>id</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="reset"></a> <code>reset</code></td><td align="left">() => <code>void</code></td><td align="left">Restore the initial values. Clears <code>isDirty</code>.</td></tr><tr><td align="left"><a id="save"></a> <code>save</code></td><td align="left">() => <code>Promise</code><<a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a>></td><td align="left"><code>updateMetadata(ref(storage, path), toPatch())</code>. Errors surface via <code>saveError</code> (typed <code>StorageError</code>), not throws — resolves <code>undefined</code> on failure or when the draft is invalid. On success the draft becomes the new baseline (<code>isDirty</code> clears) and the fresh <code>FullMetadata</code> is returned.</td></tr><tr><td align="left"><a id="saveerror"></a> <code>saveError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcachecontrol"></a> <code>setCacheControl</code></td><td align="left">(<code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcontenttype"></a> <code>setContentType</code></td><td align="left">(<code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcustomkey"></a> <code>setCustomKey</code></td><td align="left">(<code>id</code>: <code>string</code>, <code>key</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="setcustomvalue"></a> <code>setCustomValue</code></td><td align="left">(<code>id</code>: <code>string</code>, <code>value</code>: <code>string</code>) => <code>void</code></td><td align="left">-</td></tr><tr><td align="left"><a id="topatch"></a> <code>toPatch</code></td><td align="left">() => <a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td><td align="left">Serialize the draft to an <code>updateMetadata</code> patch. Empty <code>contentType</code>/<code>cacheControl</code> become <code>undefined</code> — which LEAVES the previous value (the sandbox doesn’t model null-clears; see <code>pyric/storage</code>’s <code>updateMetadata</code> doc). <code>customMetadata</code> is always included and replaces wholesale, so row removal works.</td></tr></tbody></table></div>
|
|
884
885
|
<hr>
|
|
885
886
|
<p><a id="useobjectuploadoptions"></a></p>
|
|
886
887
|
<h3 id="useobjectuploadoptions">UseObjectUploadOptions</h3>
|
|
@@ -1150,7 +1151,7 @@ at <code>totalBytes</code>.</p>
|
|
|
1150
1151
|
|
|
1151
1152
|
|
|
1152
1153
|
|
|
1153
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="entries-2"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">Folders-first merged row model. Derived from <code>prefixes</code> + <code>items</code>.</td></tr><tr><td align="left"><a id="error-5"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left"><code>StorageError</code> (with a typed <code>storage/<code></code> on <code>.code</code>) from the sandbox. A denied list is <code>error.code === 'storage/unauthorized'</code> (ST-B2).</td></tr><tr><td align="left"><a id="insertitem"></a> <code>insertItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic seam (consumed by M3 upload / M6 bulk ops, exposed now so those hooks layer on without reshaping this one). Inserts <code>fullPath</code> into the local list immediately, applying the same prefix→folder synthesis <code>listAll</code> would: a direct child becomes an item, a deeper descendant surfaces as its first-segment folder. A trailing slash declares a folder (the GCS placeholder convention <code>useObjectUpload.createFolder</code> writes): a direct trailing-slash child inserts a prefix, not an item. No-op for paths outside the listed path, duplicates, or when <code>status</code> is <code>'idle'</code>. What each call ACTUALLY inserted is recorded (keyed by the given <code>fullPath</code>) so <code>removeItem</code> can reverse it precisely. Rollback = <code>removeItem</code> or <code>refresh</code>.</td></tr><tr><td align="left"><a id="items"></a> <code>items</code></td><td align="left"><code>StorageReference</code>[]</td><td align="left">Direct child objects under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="prefixes"></a> <code>prefixes</code></td><td align="left"><code>StorageReference</code>[]</td><td align="left">Synthetic folder prefixes under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="refresh"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-run <code>listAll</code> for the current path.</td></tr><tr><td align="left"><a id="removeitem"></a> <code>removeItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic counterpart. When <code>fullPath</code> was previously given to <code>insertItem</code>, this reverses EXACTLY what that call inserted: a deep upload that synthesized a first-segment folder row removes that folder row, and an insert that was a no-op (the row already existed — e.g. a real, listed folder) removes NOTHING, so a failed upload can never delete server-truth rows. For paths never seen by <code>insertItem</code> it removes the matching item/folder row directly (the optimistic-delete use). Rollback = <code>refresh</code>.</td></tr><tr><td align="left"><a id="status-2"></a> <code>status</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr></tbody></table></div>
|
|
1154
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="entries-2"></a> <code>entries</code></td><td align="left"><a href="#storagelistentry"><code>StorageListEntry</code></a>[]</td><td align="left">Folders-first merged row model. Derived from <code>prefixes</code> + <code>items</code>.</td></tr><tr><td align="left"><a id="error-5"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left"><code>StorageError</code> (with a typed <code>storage/<code></code> on <code>.code</code>) from the sandbox. A denied list is <code>error.code === 'storage/unauthorized'</code> (ST-B2).</td></tr><tr><td align="left"><a id="insertitem"></a> <code>insertItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic seam (consumed by M3 upload / M6 bulk ops, exposed now so those hooks layer on without reshaping this one). Inserts <code>fullPath</code> into the local list immediately, applying the same prefix→folder synthesis <code>listAll</code> would: a direct child becomes an item, a deeper descendant surfaces as its first-segment folder. A trailing slash declares a folder (the GCS placeholder convention <code>useObjectUpload.createFolder</code> writes): a direct trailing-slash child inserts a prefix, not an item. No-op for paths outside the listed path, duplicates, or when <code>status</code> is <code>'idle'</code>. What each call ACTUALLY inserted is recorded (keyed by the given <code>fullPath</code>) so <code>removeItem</code> can reverse it precisely. Rollback = <code>removeItem</code> or <code>refresh</code>.</td></tr><tr><td align="left"><a id="items"></a> <code>items</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>[]</td><td align="left">Direct child objects under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="prefixes"></a> <code>prefixes</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storagereference"><code>StorageReference</code></a>[]</td><td align="left">Synthetic folder prefixes under <code>path</code>. Sorted by <code>fullPath</code>.</td></tr><tr><td align="left"><a id="refresh"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-run <code>listAll</code> for the current path.</td></tr><tr><td align="left"><a id="removeitem"></a> <code>removeItem</code></td><td align="left">(<code>fullPath</code>: <code>string</code>) => <code>void</code></td><td align="left">Optimistic counterpart. When <code>fullPath</code> was previously given to <code>insertItem</code>, this reverses EXACTLY what that call inserted: a deep upload that synthesized a first-segment folder row removes that folder row, and an insert that was a no-op (the row already existed — e.g. a real, listed folder) removes NOTHING, so a failed upload can never delete server-truth rows. For paths never seen by <code>insertItem</code> it removes the matching item/folder row directly (the optimistic-delete use). Rollback = <code>refresh</code>.</td></tr><tr><td align="left"><a id="status-2"></a> <code>status</code></td><td align="left"><a href="#storageliststatus"><code>StorageListStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr></tbody></table></div>
|
|
1154
1155
|
<hr>
|
|
1155
1156
|
<p><a id="usestorageobjectresult"></a></p>
|
|
1156
1157
|
<h3 id="usestorageobjectresult">UseStorageObjectResult</h3>
|
|
@@ -1210,7 +1211,7 @@ at <code>totalBytes</code>.</p>
|
|
|
1210
1211
|
|
|
1211
1212
|
|
|
1212
1213
|
|
|
1213
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="blob-1"></a> <code>blob</code></td><td align="left"><code>Blob</code></td><td align="left">-</td></tr><tr><td align="left"><a id="bloberror"></a> <code>blobError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="blobstatus"></a> <code>blobStatus</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Blob read state. Stays <code>'idle'</code> until <code>loadBlob()</code>, the blob is LAZY; metadata alone never downloads bytes.</td></tr><tr><td align="left"><a id="bloburl-1"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td><td align="left"><code>URL.createObjectURL</code> handle for the loaded blob, used as the local preview channel. Revoked automatically when the blob is replaced, the path changes, or the hook unmounts.</td></tr><tr><td align="left"><a id="error-6"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Typed <code>StorageError</code> (<code>storage/object-not-found</code>, <code>storage/unauthorized</code>, …).</td></tr><tr><td align="left"><a id="loadblob"></a> <code>loadBlob</code></td><td align="left">() => <code>void</code></td><td align="left">Fetch the bytes via <code>getBlob</code>. Subsequent calls re-fetch.</td></tr><tr><td align="left"><a id="metadata-3"></a> <code>metadata</code></td><td align="left"><code>
|
|
1214
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="blob-1"></a> <code>blob</code></td><td align="left"><code>Blob</code></td><td align="left">-</td></tr><tr><td align="left"><a id="bloberror"></a> <code>blobError</code></td><td align="left"><code>Error</code></td><td align="left">-</td></tr><tr><td align="left"><a id="blobstatus"></a> <code>blobStatus</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Blob read state. Stays <code>'idle'</code> until <code>loadBlob()</code>, the blob is LAZY; metadata alone never downloads bytes.</td></tr><tr><td align="left"><a id="bloburl-1"></a> <code>blobUrl</code></td><td align="left"><code>string</code></td><td align="left"><code>URL.createObjectURL</code> handle for the loaded blob, used as the local preview channel. Revoked automatically when the blob is replaced, the path changes, or the hook unmounts.</td></tr><tr><td align="left"><a id="error-6"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Typed <code>StorageError</code> (<code>storage/object-not-found</code>, <code>storage/unauthorized</code>, …).</td></tr><tr><td align="left"><a id="loadblob"></a> <code>loadBlob</code></td><td align="left">() => <code>void</code></td><td align="left">Fetch the bytes via <code>getBlob</code>. Subsequent calls re-fetch.</td></tr><tr><td align="left"><a id="metadata-3"></a> <code>metadata</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td><td align="left">-</td></tr><tr><td align="left"><a id="refresh-1"></a> <code>refresh</code></td><td align="left">() => <code>void</code></td><td align="left">Re-read the metadata (also resets the blob, the object may have been overwritten).</td></tr><tr><td align="left"><a id="status-3"></a> <code>status</code></td><td align="left"><a href="#storageobjectstatus"><code>StorageObjectStatus</code></a></td><td align="left">Metadata read state. <code>'idle'</code> when <code>storage</code> or <code>path</code> is null.</td></tr></tbody></table></div>
|
|
1214
1215
|
<hr>
|
|
1215
1216
|
<p><a id="usestoragerulesgateoptions"></a></p>
|
|
1216
1217
|
<h3 id="usestoragerulesgateoptions">UseStorageRulesGateOptions</h3>
|
|
@@ -1255,7 +1256,7 @@ at <code>totalBytes</code>.</p>
|
|
|
1255
1256
|
|
|
1256
1257
|
|
|
1257
1258
|
|
|
1258
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="identity"></a> <code>identity?</code></td><td align="left"><code>
|
|
1259
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="identity"></a> <code>identity?</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storageauth"><code>StorageAuth</code></a></td><td align="left">Identity override. <code>null</code> is anonymous; OMIT the field to use the handle’s own identity (the sandbox context’s <code>auth</code>).</td></tr><tr><td align="left"><a id="paths"></a> <code>paths?</code></td><td align="left"><code>string</code> | readonly <code>string</code>[]</td><td align="left">Path (or paths) to pre-evaluate into <code>verdicts</code>, keyed by the normalized path. Ad-hoc paths (e.g. browser rows) go through <code>verdictFor</code> instead — the two are the same evaluation.</td></tr><tr><td align="left"><a id="rules"></a> <code>rules?</code></td><td align="left"><code>string</code> | <a href="/docs/pyric-storage-reference-api/#storagerules"><code>StorageRules</code></a></td><td align="left">Explicit rules source — raw rules text (parsed here; a malformed string surfaces as <code>status: 'error'</code>) or a pre-parsed <code>StorageRules</code> handle. Overrides the sandbox’s deployed ruleset when both exist.</td></tr><tr><td align="left"><a id="writeresource"></a> <code>writeResource?</code></td><td align="left">{ <code>contentType?</code>: <code>string</code>; <code>size</code>: <code>number</code>; }</td><td align="left">The about-to-write payload bound to <code>request.resource</code> for the WRITE evaluation — pass <code>{ size, contentType }</code> when gating a specific upload so size/contentType-conditioned rules evaluate truthfully. When omitted, <code>request.resource</code> is unset, which is exactly DELETE semantics (deletes carry no inbound payload) — a rule like <code>request.resource.size < N</code> then denies, the conservative answer for uploads.</td></tr><tr><td align="left"><code>writeResource.contentType?</code></td><td align="left"><code>string</code></td><td align="left">-</td></tr><tr><td align="left"><code>writeResource.size</code></td><td align="left"><code>number</code></td><td align="left">-</td></tr></tbody></table></div>
|
|
1259
1260
|
<hr>
|
|
1260
1261
|
<p><a id="usestoragerulesgateresult"></a></p>
|
|
1261
1262
|
<h3 id="usestoragerulesgateresult">UseStorageRulesGateResult</h3>
|
|
@@ -1305,7 +1306,7 @@ at <code>totalBytes</code>.</p>
|
|
|
1305
1306
|
|
|
1306
1307
|
|
|
1307
1308
|
|
|
1308
|
-
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="advisory"></a> <code>advisory</code></td><td align="left"><code>boolean</code></td><td align="left">Always false: <code>pyric/storage</code> handles are sandbox mirrors.</td></tr><tr><td align="left"><a id="error-7"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Rules-resolution failure (e.g. a malformed <code>rules</code> string).</td></tr><tr><td align="left"><a id="identity-1"></a> <code>identity</code></td><td align="left"><code>
|
|
1309
|
+
<table><thead><tr><th align="left">Property</th><th align="left">Type</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left"><a id="advisory"></a> <code>advisory</code></td><td align="left"><code>boolean</code></td><td align="left">Always false: <code>pyric/storage</code> handles are sandbox mirrors.</td></tr><tr><td align="left"><a id="error-7"></a> <code>error</code></td><td align="left"><code>Error</code></td><td align="left">Rules-resolution failure (e.g. a malformed <code>rules</code> string).</td></tr><tr><td align="left"><a id="identity-1"></a> <code>identity</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#storageauth"><code>StorageAuth</code></a></td><td align="left">The identity the verdicts evaluate under.</td></tr><tr><td align="left"><a id="source"></a> <code>source</code></td><td align="left"><a href="#storagerulessource"><code>StorageRulesSource</code></a></td><td align="left">Where the active ruleset came from.</td></tr><tr><td align="left"><a id="status-4"></a> <code>status</code></td><td align="left"><a href="#storagerulesgatestatus"><code>StorageRulesGateStatus</code></a></td><td align="left"><code>'idle'</code> only when <code>storage</code> is null/undefined.</td></tr><tr><td align="left"><a id="verdictfor"></a> <code>verdictFor</code></td><td align="left">(<code>path</code>: <code>string</code>) => <a href="#storagegateverdict"><code>StorageGateVerdict</code></a></td><td align="left">Evaluate an arbitrary path under the current ruleset + identity. Pure and synchronous once <code>status</code> is <code>'ready'</code>; before that (and whenever no rules are reachable) it returns the allow-all verdict — the gate FAILS OPEN, because affordances are advisory and the real enforcement (sandbox throw / server denial) stays authoritative.</td></tr><tr><td align="left"><a id="verdicts"></a> <code>verdicts</code></td><td align="left"><code>Record</code><<code>string</code>, <a href="#storagegateverdict"><code>StorageGateVerdict</code></a>></td><td align="left">Pre-evaluated verdicts for <code>options.paths</code>, keyed by normalized path.</td></tr></tbody></table></div>
|
|
1309
1310
|
<hr>
|
|
1310
1311
|
<p><a id="usestorageselectionresult"></a></p>
|
|
1311
1312
|
<h3 id="usestorageselectionresult">UseStorageSelectionResult</h3>
|
|
@@ -1529,7 +1530,7 @@ ancestors from pending (they are real prefixes now).</p>
|
|
|
1529
1530
|
<hr>
|
|
1530
1531
|
<p><a id="storageapi"></a></p>
|
|
1531
1532
|
<h3 id="storageapi">StorageApi</h3>
|
|
1532
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> StorageApi</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> Pick</span><span style="color:#ABB2BF"><</span><span style="color:#E5C07B">
|
|
1533
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">type</span><span style="color:#E5C07B"> StorageApi</span><span style="color:#56B6C2"> =</span><span style="color:#E5C07B"> Pick</span><span style="color:#ABB2BF"><</span><span style="color:#E5C07B">pyric</span><span style="color:#ABB2BF">-</span><span style="color:#E5C07B">storage</span><span style="color:#ABB2BF">-</span><span style="color:#E5C07B">reference</span><span style="color:#ABB2BF">-</span><span style="color:#E5C07B">api</span><span style="color:#ABB2BF">,</span></span>
|
|
1533
1534
|
<span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"ref"</span></span>
|
|
1534
1535
|
<span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"listAll"</span></span>
|
|
1535
1536
|
<span class="line"><span style="color:#ABB2BF"> | </span><span style="color:#98C379">"getMetadata"</span></span>
|
|
@@ -1728,7 +1729,7 @@ names).</p>
|
|
|
1728
1729
|
<hr>
|
|
1729
1730
|
<p><a id="initmetadataeditorstate"></a></p>
|
|
1730
1731
|
<h3 id="initmetadataeditorstate">initMetadataEditorState()</h3>
|
|
1731
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> initMetadataEditorState</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">initial</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
1732
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> initMetadataEditorState</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">initial</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">SettableMetadata</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">MetadataEditorState</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
1732
1733
|
<p>Build the edit state from the metadata a <code>getMetadata</code> /
|
|
1733
1734
|
<code>useStorageObject</code> read returned.</p>
|
|
1734
1735
|
<h4 id="parameters-4">Parameters</h4>
|
|
@@ -1745,7 +1746,7 @@ names).</p>
|
|
|
1745
1746
|
|
|
1746
1747
|
|
|
1747
1748
|
|
|
1748
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>initial</code></td><td align="left"><code>
|
|
1749
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>initial</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#settablemetadata"><code>SettableMetadata</code></a></td></tr></tbody></table></div>
|
|
1749
1750
|
<h4 id="returns-4">Returns</h4>
|
|
1750
1751
|
<p><a href="#metadataeditorstate"><code>MetadataEditorState</code></a></p>
|
|
1751
1752
|
<hr>
|
|
@@ -2131,7 +2132,7 @@ means metadata-only.</p>
|
|
|
2131
2132
|
|
|
2132
2133
|
|
|
2133
2134
|
|
|
2134
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>metadata</code></td><td align="left"><code>FullMetadata</code></td></tr><tr><td align="left"><code>consumerPreviews</code></td><td align="left">readonly <a href="#storagepreview"><code>StoragePreview</code></a>[]</td></tr></tbody></table></div>
|
|
2135
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>metadata</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#fullmetadata"><code>FullMetadata</code></a></td></tr><tr><td align="left"><code>consumerPreviews</code></td><td align="left">readonly <a href="#storagepreview"><code>StoragePreview</code></a>[]</td></tr></tbody></table></div>
|
|
2135
2136
|
<h4 id="returns-16">Returns</h4>
|
|
2136
2137
|
<p><a href="#storagepreview"><code>StoragePreview</code></a></p>
|
|
2137
2138
|
<hr>
|
|
@@ -2237,7 +2238,7 @@ enter/leave pairs so crossing child elements doesn’t flicker).</p>
|
|
|
2237
2238
|
<p><a id="usemetadataeditor"></a></p>
|
|
2238
2239
|
<h3 id="usemetadataeditor">useMetadataEditor()</h3>
|
|
2239
2240
|
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useMetadataEditor</span><span style="color:#ABB2BF">(</span></span>
|
|
2240
|
-
<span class="line"><span style="color:#E06C75;font-style:italic"> storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
2241
|
+
<span class="line"><span style="color:#E06C75;font-style:italic"> storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">,</span></span>
|
|
2241
2242
|
<span class="line"><span style="color:#E06C75;font-style:italic"> path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">,</span></span>
|
|
2242
2243
|
<span class="line"><span style="color:#E06C75;font-style:italic"> options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseMetadataEditorOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseMetadataEditorResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
2243
2244
|
<p>Headless metadata editor — the <code>useDocumentEditor</code> reducer pattern
|
|
@@ -2267,13 +2268,13 @@ helpers and the save half.</p>
|
|
|
2267
2268
|
|
|
2268
2269
|
|
|
2269
2270
|
|
|
2270
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>
|
|
2271
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usemetadataeditoroptions"><code>UseMetadataEditorOptions</code></a></td></tr></tbody></table></div>
|
|
2271
2272
|
<h4 id="returns-20">Returns</h4>
|
|
2272
2273
|
<p><a href="#usemetadataeditorresult"><code>UseMetadataEditorResult</code></a></p>
|
|
2273
2274
|
<hr>
|
|
2274
2275
|
<p><a id="useobjectupload"></a></p>
|
|
2275
2276
|
<h3 id="useobjectupload">useObjectUpload()</h3>
|
|
2276
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useObjectUpload</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
2277
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useObjectUpload</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseObjectUploadOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseObjectUploadResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
2277
2278
|
<p>Multi-file upload over the package’s single Storage handle prop.
|
|
2278
2279
|
Headless: returns task state; render it however you like (the
|
|
2279
2280
|
<code><UploadDropzone></code> component is one producer of <code>upload()</code> calls).</p>
|
|
@@ -2298,7 +2299,7 @@ the write fails (typed <code>StorageError</code> on <code>task.error</code>).</p
|
|
|
2298
2299
|
|
|
2299
2300
|
|
|
2300
2301
|
|
|
2301
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>
|
|
2302
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#useobjectuploadoptions"><code>UseObjectUploadOptions</code></a></td></tr></tbody></table></div>
|
|
2302
2303
|
<h4 id="returns-21">Returns</h4>
|
|
2303
2304
|
<p><a href="#useobjectuploadresult"><code>UseObjectUploadResult</code></a></p>
|
|
2304
2305
|
<hr>
|
|
@@ -2336,7 +2337,7 @@ semantics. All emitted paths are normalized (<code>normalizeStoragePath</code>).
|
|
|
2336
2337
|
<hr>
|
|
2337
2338
|
<p><a id="usestoragedelete"></a></p>
|
|
2338
2339
|
<h3 id="usestoragedelete">useStorageDelete()</h3>
|
|
2339
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageDelete</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
2340
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageDelete</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseStorageDeleteOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageDeleteResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
2340
2341
|
<p>Drive bulk + recursive deletes from a React component — the
|
|
2341
2342
|
storage counterpart of <code>useRecursiveDelete</code> (same progress /
|
|
2342
2343
|
isRunning / error shape, same stale-run generation token), bulk
|
|
@@ -2359,13 +2360,13 @@ because storage selections are flat multi-row affairs.</p>
|
|
|
2359
2360
|
|
|
2360
2361
|
|
|
2361
2362
|
|
|
2362
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>
|
|
2363
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usestoragedeleteoptions"><code>UseStorageDeleteOptions</code></a></td></tr></tbody></table></div>
|
|
2363
2364
|
<h4 id="returns-24">Returns</h4>
|
|
2364
2365
|
<p><a href="#usestoragedeleteresult"><code>UseStorageDeleteResult</code></a></p>
|
|
2365
2366
|
<hr>
|
|
2366
2367
|
<p><a id="usestoragelist"></a></p>
|
|
2367
2368
|
<h3 id="usestoragelist">useStorageList()</h3>
|
|
2368
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageList</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
2369
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageList</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageListResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
2369
2370
|
<p>List the objects + synthetic folders directly under <code>path</code> :
|
|
2370
2371
|
<code>listAll</code> over the package’s sandbox Storage handle. Read-via-get,
|
|
2371
2372
|
not realtime: the list updates on <code>refresh</code>, path change, or the
|
|
@@ -2391,13 +2392,13 @@ result (virtualize the rendering, which <code><ObjectBrowser></code> does).
|
|
|
2391
2392
|
|
|
2392
2393
|
|
|
2393
2394
|
|
|
2394
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>
|
|
2395
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
|
|
2395
2396
|
<h4 id="returns-25">Returns</h4>
|
|
2396
2397
|
<p><a href="#usestoragelistresult"><code>UseStorageListResult</code></a></p>
|
|
2397
2398
|
<hr>
|
|
2398
2399
|
<p><a id="usestorageobject"></a></p>
|
|
2399
2400
|
<h3 id="usestorageobject">useStorageObject()</h3>
|
|
2400
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageObject</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
2401
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageObject</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">path</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">string</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageObjectResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
2401
2402
|
<p>One object’s metadata + lazily-loaded bytes, the data source for
|
|
2402
2403
|
<code><ObjectInspector></code>. Read-via-get like the rest of the storage
|
|
2403
2404
|
half: updates on <code>refresh</code>, <code>path</code> change, or <code>loadBlob</code>.</p>
|
|
@@ -2419,13 +2420,13 @@ half: updates on <code>refresh</code>, <code>path</code> change, or <code>loadBl
|
|
|
2419
2420
|
|
|
2420
2421
|
|
|
2421
2422
|
|
|
2422
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>
|
|
2423
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>path</code></td><td align="left"><code>string</code></td></tr></tbody></table></div>
|
|
2423
2424
|
<h4 id="returns-26">Returns</h4>
|
|
2424
2425
|
<p><a href="#usestorageobjectresult"><code>UseStorageObjectResult</code></a></p>
|
|
2425
2426
|
<hr>
|
|
2426
2427
|
<p><a id="usestoragerulesgate"></a></p>
|
|
2427
2428
|
<h3 id="usestoragerulesgate">useStorageRulesGate()</h3>
|
|
2428
|
-
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageRulesGate</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">
|
|
2429
|
+
<pre class="astro-code one-dark-pro" style="background-color:#282c34;color:#abb2bf; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#C678DD">function</span><span style="color:#61AFEF"> useStorageRulesGate</span><span style="color:#ABB2BF">(</span><span style="color:#E06C75;font-style:italic">storage</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">FirebaseStorage</span><span style="color:#ABB2BF">, </span><span style="color:#E06C75;font-style:italic">options</span><span style="color:#C678DD">?</span><span style="color:#ABB2BF">: </span><span style="color:#E5C07B">UseStorageRulesGateOptions</span><span style="color:#ABB2BF">): </span><span style="color:#E5C07B">UseStorageRulesGateResult</span><span style="color:#ABB2BF">;</span></span></code></pre>
|
|
2429
2430
|
<p>Pre-flight rules evaluation — the M7 differentiator. Evaluates the
|
|
2430
2431
|
current identity against paths BEFORE the click, so components can
|
|
2431
2432
|
annotate denied affordances (<code>data-pyric-denied</code>, disabled-with-
|
|
@@ -2461,7 +2462,7 @@ common identity/path/payload-shaped rules evaluate exactly.</p>
|
|
|
2461
2462
|
|
|
2462
2463
|
|
|
2463
2464
|
|
|
2464
|
-
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><code>
|
|
2465
|
+
<table><thead><tr><th align="left">Parameter</th><th align="left">Type</th></tr></thead><tbody><tr><td align="left"><code>storage</code></td><td align="left"><a href="/docs/pyric-storage-reference-api/#firebasestorage"><code>FirebaseStorage</code></a></td></tr><tr><td align="left"><code>options?</code></td><td align="left"><a href="#usestoragerulesgateoptions"><code>UseStorageRulesGateOptions</code></a></td></tr></tbody></table></div>
|
|
2465
2466
|
<h4 id="returns-27">Returns</h4>
|
|
2466
2467
|
<p><a href="#usestoragerulesgateresult"><code>UseStorageRulesGateResult</code></a></p>
|
|
2467
2468
|
<hr>
|