@pyric/ui 0.1.0-alpha.10
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/LICENSE +216 -0
- package/README.md +79 -0
- package/dist/agents/ContextWindowUsage.d.ts +67 -0
- package/dist/agents/ContextWindowUsage.d.ts.map +1 -0
- package/dist/agents/ContextWindowUsage.js +115 -0
- package/dist/agents/ContextWindowUsage.js.map +1 -0
- package/dist/agents/EmptyState.d.ts +18 -0
- package/dist/agents/EmptyState.d.ts.map +1 -0
- package/dist/agents/EmptyState.js +11 -0
- package/dist/agents/EmptyState.js.map +1 -0
- package/dist/agents/Fold.d.ts +37 -0
- package/dist/agents/Fold.d.ts.map +1 -0
- package/dist/agents/Fold.js +18 -0
- package/dist/agents/Fold.js.map +1 -0
- package/dist/agents/Modal.d.ts +25 -0
- package/dist/agents/Modal.d.ts.map +1 -0
- package/dist/agents/Modal.js +28 -0
- package/dist/agents/Modal.js.map +1 -0
- package/dist/agents/PulsingDot.d.ts +21 -0
- package/dist/agents/PulsingDot.d.ts.map +1 -0
- package/dist/agents/PulsingDot.js +18 -0
- package/dist/agents/PulsingDot.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +15 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/auth/authApi.d.ts +32 -0
- package/dist/auth/authApi.d.ts.map +1 -0
- package/dist/auth/authApi.js +27 -0
- package/dist/auth/authApi.js.map +1 -0
- package/dist/auth/claims.d.ts +27 -0
- package/dist/auth/claims.d.ts.map +1 -0
- package/dist/auth/claims.js +58 -0
- package/dist/auth/claims.js.map +1 -0
- package/dist/auth/components/AuthProviderToggles.d.ts +31 -0
- package/dist/auth/components/AuthProviderToggles.d.ts.map +1 -0
- package/dist/auth/components/AuthProviderToggles.js +48 -0
- package/dist/auth/components/AuthProviderToggles.js.map +1 -0
- package/dist/auth/components/AuthSignInHelper.d.ts +57 -0
- package/dist/auth/components/AuthSignInHelper.d.ts.map +1 -0
- package/dist/auth/components/AuthSignInHelper.js +69 -0
- package/dist/auth/components/AuthSignInHelper.js.map +1 -0
- package/dist/auth/components/AuthUserForm.d.ts +84 -0
- package/dist/auth/components/AuthUserForm.d.ts.map +1 -0
- package/dist/auth/components/AuthUserForm.js +89 -0
- package/dist/auth/components/AuthUserForm.js.map +1 -0
- package/dist/auth/components/AuthUserList.d.ts +62 -0
- package/dist/auth/components/AuthUserList.d.ts.map +1 -0
- package/dist/auth/components/AuthUserList.js +46 -0
- package/dist/auth/components/AuthUserList.js.map +1 -0
- package/dist/auth/components/ClaimsField.d.ts +22 -0
- package/dist/auth/components/ClaimsField.d.ts.map +1 -0
- package/dist/auth/components/ClaimsField.js +11 -0
- package/dist/auth/components/ClaimsField.js.map +1 -0
- package/dist/auth/components/confirmActions.d.ts +40 -0
- package/dist/auth/components/confirmActions.d.ts.map +1 -0
- package/dist/auth/components/confirmActions.js +49 -0
- package/dist/auth/components/confirmActions.js.map +1 -0
- package/dist/auth/controller.d.ts +73 -0
- package/dist/auth/controller.d.ts.map +1 -0
- package/dist/auth/controller.js +139 -0
- package/dist/auth/controller.js.map +1 -0
- package/dist/auth/hooks/index.d.ts +7 -0
- package/dist/auth/hooks/index.d.ts.map +1 -0
- package/dist/auth/hooks/index.js +7 -0
- package/dist/auth/hooks/index.js.map +1 -0
- package/dist/auth/hooks/useAuthFlowHelper.d.ts +30 -0
- package/dist/auth/hooks/useAuthFlowHelper.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthFlowHelper.js +30 -0
- package/dist/auth/hooks/useAuthFlowHelper.js.map +1 -0
- package/dist/auth/hooks/useAuthProviderConfig.d.ts +37 -0
- package/dist/auth/hooks/useAuthProviderConfig.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthProviderConfig.js +98 -0
- package/dist/auth/hooks/useAuthProviderConfig.js.map +1 -0
- package/dist/auth/hooks/useAuthUserEditor.d.ts +30 -0
- package/dist/auth/hooks/useAuthUserEditor.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthUserEditor.js +27 -0
- package/dist/auth/hooks/useAuthUserEditor.js.map +1 -0
- package/dist/auth/hooks/useAuthUsers.d.ts +38 -0
- package/dist/auth/hooks/useAuthUsers.d.ts.map +1 -0
- package/dist/auth/hooks/useAuthUsers.js +111 -0
- package/dist/auth/hooks/useAuthUsers.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +13 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/providers.d.ts +11 -0
- package/dist/auth/providers.d.ts.map +1 -0
- package/dist/auth/providers.js +28 -0
- package/dist/auth/providers.js.map +1 -0
- package/dist/auth/reducers/userEditor.d.ts +55 -0
- package/dist/auth/reducers/userEditor.d.ts.map +1 -0
- package/dist/auth/reducers/userEditor.js +136 -0
- package/dist/auth/reducers/userEditor.js.map +1 -0
- package/dist/events/components/ActivityActionItems.d.ts +45 -0
- package/dist/events/components/ActivityActionItems.d.ts.map +1 -0
- package/dist/events/components/ActivityActionItems.js +68 -0
- package/dist/events/components/ActivityActionItems.js.map +1 -0
- package/dist/events/components/ActivityGrid.d.ts +65 -0
- package/dist/events/components/ActivityGrid.d.ts.map +1 -0
- package/dist/events/components/ActivityGrid.js +61 -0
- package/dist/events/components/ActivityGrid.js.map +1 -0
- package/dist/events/components/ActivityGridRow.d.ts +31 -0
- package/dist/events/components/ActivityGridRow.d.ts.map +1 -0
- package/dist/events/components/ActivityGridRow.js +23 -0
- package/dist/events/components/ActivityGridRow.js.map +1 -0
- package/dist/events/components/ProposedChangeDiff.d.ts +46 -0
- package/dist/events/components/ProposedChangeDiff.d.ts.map +1 -0
- package/dist/events/components/ProposedChangeDiff.js +60 -0
- package/dist/events/components/ProposedChangeDiff.js.map +1 -0
- package/dist/events/components/format.d.ts +11 -0
- package/dist/events/components/format.d.ts.map +1 -0
- package/dist/events/components/format.js +26 -0
- package/dist/events/components/format.js.map +1 -0
- package/dist/events/components/index.d.ts +6 -0
- package/dist/events/components/index.d.ts.map +1 -0
- package/dist/events/components/index.js +6 -0
- package/dist/events/components/index.js.map +1 -0
- package/dist/events/digest.d.ts +167 -0
- package/dist/events/digest.d.ts.map +1 -0
- package/dist/events/digest.js +426 -0
- package/dist/events/digest.js.map +1 -0
- package/dist/events/hooks/index.d.ts +3 -0
- package/dist/events/hooks/index.d.ts.map +1 -0
- package/dist/events/hooks/index.js +3 -0
- package/dist/events/hooks/index.js.map +1 -0
- package/dist/events/hooks/useActivityDigest.d.ts +27 -0
- package/dist/events/hooks/useActivityDigest.d.ts.map +1 -0
- package/dist/events/hooks/useActivityDigest.js +18 -0
- package/dist/events/hooks/useActivityDigest.js.map +1 -0
- package/dist/events/hooks/useActivityStream.d.ts +44 -0
- package/dist/events/hooks/useActivityStream.d.ts.map +1 -0
- package/dist/events/hooks/useActivityStream.js +38 -0
- package/dist/events/hooks/useActivityStream.js.map +1 -0
- package/dist/events/index.d.ts +15 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +14 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +160 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +21 -0
- package/dist/events/types.js.map +1 -0
- package/dist/firestore/components/CollectionList.d.ts +22 -0
- package/dist/firestore/components/CollectionList.d.ts.map +1 -0
- package/dist/firestore/components/CollectionList.js +21 -0
- package/dist/firestore/components/CollectionList.js.map +1 -0
- package/dist/firestore/components/DeleteWithConfirm.d.ts +38 -0
- package/dist/firestore/components/DeleteWithConfirm.d.ts.map +1 -0
- package/dist/firestore/components/DeleteWithConfirm.js +33 -0
- package/dist/firestore/components/DeleteWithConfirm.js.map +1 -0
- package/dist/firestore/components/DocumentEditor.d.ts +47 -0
- package/dist/firestore/components/DocumentEditor.d.ts.map +1 -0
- package/dist/firestore/components/DocumentEditor.js +176 -0
- package/dist/firestore/components/DocumentEditor.js.map +1 -0
- package/dist/firestore/components/DocumentList.d.ts +63 -0
- package/dist/firestore/components/DocumentList.d.ts.map +1 -0
- package/dist/firestore/components/DocumentList.js +53 -0
- package/dist/firestore/components/DocumentList.js.map +1 -0
- package/dist/firestore/components/DocumentPreview.d.ts +68 -0
- package/dist/firestore/components/DocumentPreview.d.ts.map +1 -0
- package/dist/firestore/components/DocumentPreview.js +76 -0
- package/dist/firestore/components/DocumentPreview.js.map +1 -0
- package/dist/firestore/components/FieldRenderer.d.ts +17 -0
- package/dist/firestore/components/FieldRenderer.d.ts.map +1 -0
- package/dist/firestore/components/FieldRenderer.js +16 -0
- package/dist/firestore/components/FieldRenderer.js.map +1 -0
- package/dist/firestore/components/QueryBuilder.d.ts +25 -0
- package/dist/firestore/components/QueryBuilder.d.ts.map +1 -0
- package/dist/firestore/components/QueryBuilder.js +78 -0
- package/dist/firestore/components/QueryBuilder.js.map +1 -0
- package/dist/firestore/components/ReferencePicker.d.ts +33 -0
- package/dist/firestore/components/ReferencePicker.d.ts.map +1 -0
- package/dist/firestore/components/ReferencePicker.js +42 -0
- package/dist/firestore/components/ReferencePicker.js.map +1 -0
- package/dist/firestore/components/TreeEntry.d.ts +15 -0
- package/dist/firestore/components/TreeEntry.d.ts.map +1 -0
- package/dist/firestore/components/TreeEntry.js +23 -0
- package/dist/firestore/components/TreeEntry.js.map +1 -0
- package/dist/firestore/components/context.d.ts +18 -0
- package/dist/firestore/components/context.d.ts.map +1 -0
- package/dist/firestore/components/context.js +7 -0
- package/dist/firestore/components/context.js.map +1 -0
- package/dist/firestore/fieldEditors/array.d.ts +3 -0
- package/dist/firestore/fieldEditors/array.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/array.js +16 -0
- package/dist/firestore/fieldEditors/array.js.map +1 -0
- package/dist/firestore/fieldEditors/boolean.d.ts +3 -0
- package/dist/firestore/fieldEditors/boolean.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/boolean.js +13 -0
- package/dist/firestore/fieldEditors/boolean.js.map +1 -0
- package/dist/firestore/fieldEditors/bytes.d.ts +4 -0
- package/dist/firestore/fieldEditors/bytes.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/bytes.js +31 -0
- package/dist/firestore/fieldEditors/bytes.js.map +1 -0
- package/dist/firestore/fieldEditors/geopoint.d.ts +4 -0
- package/dist/firestore/fieldEditors/geopoint.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/geopoint.js +32 -0
- package/dist/firestore/fieldEditors/geopoint.js.map +1 -0
- package/dist/firestore/fieldEditors/map.d.ts +3 -0
- package/dist/firestore/fieldEditors/map.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/map.js +19 -0
- package/dist/firestore/fieldEditors/map.js.map +1 -0
- package/dist/firestore/fieldEditors/null.d.ts +3 -0
- package/dist/firestore/fieldEditors/null.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/null.js +17 -0
- package/dist/firestore/fieldEditors/null.js.map +1 -0
- package/dist/firestore/fieldEditors/number.d.ts +3 -0
- package/dist/firestore/fieldEditors/number.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/number.js +24 -0
- package/dist/firestore/fieldEditors/number.js.map +1 -0
- package/dist/firestore/fieldEditors/reference.d.ts +4 -0
- package/dist/firestore/fieldEditors/reference.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/reference.js +49 -0
- package/dist/firestore/fieldEditors/reference.js.map +1 -0
- package/dist/firestore/fieldEditors/registry.d.ts +16 -0
- package/dist/firestore/fieldEditors/registry.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/registry.js +42 -0
- package/dist/firestore/fieldEditors/registry.js.map +1 -0
- package/dist/firestore/fieldEditors/string.d.ts +3 -0
- package/dist/firestore/fieldEditors/string.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/string.js +13 -0
- package/dist/firestore/fieldEditors/string.js.map +1 -0
- package/dist/firestore/fieldEditors/timestamp.d.ts +4 -0
- package/dist/firestore/fieldEditors/timestamp.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/timestamp.js +52 -0
- package/dist/firestore/fieldEditors/timestamp.js.map +1 -0
- package/dist/firestore/fieldEditors/types.d.ts +64 -0
- package/dist/firestore/fieldEditors/types.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/types.js +2 -0
- package/dist/firestore/fieldEditors/types.js.map +1 -0
- package/dist/firestore/fieldEditors/vector.d.ts +29 -0
- package/dist/firestore/fieldEditors/vector.d.ts.map +1 -0
- package/dist/firestore/fieldEditors/vector.js +93 -0
- package/dist/firestore/fieldEditors/vector.js.map +1 -0
- package/dist/firestore/firestoreApi.d.ts +35 -0
- package/dist/firestore/firestoreApi.d.ts.map +1 -0
- package/dist/firestore/firestoreApi.js +29 -0
- package/dist/firestore/firestoreApi.js.map +1 -0
- package/dist/firestore/hooks/coerceError.d.ts +17 -0
- package/dist/firestore/hooks/coerceError.d.ts.map +1 -0
- package/dist/firestore/hooks/coerceError.js +41 -0
- package/dist/firestore/hooks/coerceError.js.map +1 -0
- package/dist/firestore/hooks/index.d.ts +10 -0
- package/dist/firestore/hooks/index.d.ts.map +1 -0
- package/dist/firestore/hooks/index.js +10 -0
- package/dist/firestore/hooks/index.js.map +1 -0
- package/dist/firestore/hooks/useCollectionList.d.ts +37 -0
- package/dist/firestore/hooks/useCollectionList.d.ts.map +1 -0
- package/dist/firestore/hooks/useCollectionList.js +51 -0
- package/dist/firestore/hooks/useCollectionList.js.map +1 -0
- package/dist/firestore/hooks/useDocumentEditor.d.ts +61 -0
- package/dist/firestore/hooks/useDocumentEditor.d.ts.map +1 -0
- package/dist/firestore/hooks/useDocumentEditor.js +71 -0
- package/dist/firestore/hooks/useDocumentEditor.js.map +1 -0
- package/dist/firestore/hooks/useDocumentList.d.ts +50 -0
- package/dist/firestore/hooks/useDocumentList.d.ts.map +1 -0
- package/dist/firestore/hooks/useDocumentList.js +162 -0
- package/dist/firestore/hooks/useDocumentList.js.map +1 -0
- package/dist/firestore/hooks/useDocumentSubcollections.d.ts +29 -0
- package/dist/firestore/hooks/useDocumentSubcollections.d.ts.map +1 -0
- package/dist/firestore/hooks/useDocumentSubcollections.js +48 -0
- package/dist/firestore/hooks/useDocumentSubcollections.js.map +1 -0
- package/dist/firestore/hooks/useFirestoreCollection.d.ts +14 -0
- package/dist/firestore/hooks/useFirestoreCollection.d.ts.map +1 -0
- package/dist/firestore/hooks/useFirestoreCollection.js +36 -0
- package/dist/firestore/hooks/useFirestoreCollection.js.map +1 -0
- package/dist/firestore/hooks/useFirestoreDoc.d.ts +17 -0
- package/dist/firestore/hooks/useFirestoreDoc.d.ts.map +1 -0
- package/dist/firestore/hooks/useFirestoreDoc.js +35 -0
- package/dist/firestore/hooks/useFirestoreDoc.js.map +1 -0
- package/dist/firestore/hooks/useQueryBuilder.d.ts +51 -0
- package/dist/firestore/hooks/useQueryBuilder.d.ts.map +1 -0
- package/dist/firestore/hooks/useQueryBuilder.js +110 -0
- package/dist/firestore/hooks/useQueryBuilder.js.map +1 -0
- package/dist/firestore/hooks/useRecursiveDelete.d.ts +40 -0
- package/dist/firestore/hooks/useRecursiveDelete.d.ts.map +1 -0
- package/dist/firestore/hooks/useRecursiveDelete.js +44 -0
- package/dist/firestore/hooks/useRecursiveDelete.js.map +1 -0
- package/dist/firestore/hooks/useReferencePicker.d.ts +70 -0
- package/dist/firestore/hooks/useReferencePicker.d.ts.map +1 -0
- package/dist/firestore/hooks/useReferencePicker.js +140 -0
- package/dist/firestore/hooks/useReferencePicker.js.map +1 -0
- package/dist/firestore/import/parseImport.d.ts +55 -0
- package/dist/firestore/import/parseImport.d.ts.map +1 -0
- package/dist/firestore/import/parseImport.js +101 -0
- package/dist/firestore/import/parseImport.js.map +1 -0
- package/dist/firestore/index.d.ts +21 -0
- package/dist/firestore/index.d.ts.map +1 -0
- package/dist/firestore/index.js +29 -0
- package/dist/firestore/index.js.map +1 -0
- package/dist/firestore/reducers/defaults.d.ts +10 -0
- package/dist/firestore/reducers/defaults.d.ts.map +1 -0
- package/dist/firestore/reducers/defaults.js +37 -0
- package/dist/firestore/reducers/defaults.js.map +1 -0
- package/dist/firestore/reducers/documentEditor.d.ts +23 -0
- package/dist/firestore/reducers/documentEditor.d.ts.map +1 -0
- package/dist/firestore/reducers/documentEditor.js +201 -0
- package/dist/firestore/reducers/documentEditor.js.map +1 -0
- package/dist/firestore/reducers/tree.d.ts +28 -0
- package/dist/firestore/reducers/tree.d.ts.map +1 -0
- package/dist/firestore/reducers/tree.js +129 -0
- package/dist/firestore/reducers/tree.js.map +1 -0
- package/dist/firestore/reducers/types.d.ts +115 -0
- package/dist/firestore/reducers/types.d.ts.map +1 -0
- package/dist/firestore/reducers/types.js +2 -0
- package/dist/firestore/reducers/types.js.map +1 -0
- package/dist/firestore/reducers/validation.d.ts +25 -0
- package/dist/firestore/reducers/validation.d.ts.map +1 -0
- package/dist/firestore/reducers/validation.js +121 -0
- package/dist/firestore/reducers/validation.js.map +1 -0
- package/dist/firestore/types.d.ts +77 -0
- package/dist/firestore/types.d.ts.map +1 -0
- package/dist/firestore/types.js +196 -0
- package/dist/firestore/types.js.map +1 -0
- package/dist/firestore/validation/ids.d.ts +23 -0
- package/dist/firestore/validation/ids.d.ts.map +1 -0
- package/dist/firestore/validation/ids.js +46 -0
- package/dist/firestore/validation/ids.js.map +1 -0
- package/dist/firestore/valueEquality.d.ts +4 -0
- package/dist/firestore/valueEquality.d.ts.map +1 -0
- package/dist/firestore/valueEquality.js +44 -0
- package/dist/firestore/valueEquality.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/Badge.d.ts +28 -0
- package/dist/primitives/Badge.d.ts.map +1 -0
- package/dist/primitives/Badge.js +11 -0
- package/dist/primitives/Badge.js.map +1 -0
- package/dist/primitives/ConfirmDialog.d.ts +42 -0
- package/dist/primitives/ConfirmDialog.d.ts.map +1 -0
- package/dist/primitives/ConfirmDialog.js +61 -0
- package/dist/primitives/ConfirmDialog.js.map +1 -0
- package/dist/primitives/CopyButton.d.ts +28 -0
- package/dist/primitives/CopyButton.d.ts.map +1 -0
- package/dist/primitives/CopyButton.js +27 -0
- package/dist/primitives/CopyButton.js.map +1 -0
- package/dist/primitives/JsonView.d.ts +29 -0
- package/dist/primitives/JsonView.d.ts.map +1 -0
- package/dist/primitives/JsonView.js +56 -0
- package/dist/primitives/JsonView.js.map +1 -0
- package/dist/primitives/SegmentedControl.d.ts +37 -0
- package/dist/primitives/SegmentedControl.d.ts.map +1 -0
- package/dist/primitives/SegmentedControl.js +18 -0
- package/dist/primitives/SegmentedControl.js.map +1 -0
- package/dist/primitives/Toast.d.ts +48 -0
- package/dist/primitives/Toast.d.ts.map +1 -0
- package/dist/primitives/Toast.js +60 -0
- package/dist/primitives/Toast.js.map +1 -0
- package/dist/primitives/VirtualList.d.ts +37 -0
- package/dist/primitives/VirtualList.d.ts.map +1 -0
- package/dist/primitives/VirtualList.js +47 -0
- package/dist/primitives/VirtualList.js.map +1 -0
- package/dist/primitives/hooks/useContainerSize.d.ts +29 -0
- package/dist/primitives/hooks/useContainerSize.d.ts.map +1 -0
- package/dist/primitives/hooks/useContainerSize.js +45 -0
- package/dist/primitives/hooks/useContainerSize.js.map +1 -0
- package/dist/primitives/hooks/useUpdateHighlights.d.ts +18 -0
- package/dist/primitives/hooks/useUpdateHighlights.d.ts.map +1 -0
- package/dist/primitives/hooks/useUpdateHighlights.js +84 -0
- package/dist/primitives/hooks/useUpdateHighlights.js.map +1 -0
- package/dist/primitives/index.d.ts +11 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +11 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/useConfirm.d.ts +34 -0
- package/dist/primitives/useConfirm.d.ts.map +1 -0
- package/dist/primitives/useConfirm.js +63 -0
- package/dist/primitives/useConfirm.js.map +1 -0
- package/dist/rtdb/components/RtdbPathBar.d.ts +31 -0
- package/dist/rtdb/components/RtdbPathBar.d.ts.map +1 -0
- package/dist/rtdb/components/RtdbPathBar.js +47 -0
- package/dist/rtdb/components/RtdbPathBar.js.map +1 -0
- package/dist/rtdb/components/RtdbTree.d.ts +38 -0
- package/dist/rtdb/components/RtdbTree.d.ts.map +1 -0
- package/dist/rtdb/components/RtdbTree.js +104 -0
- package/dist/rtdb/components/RtdbTree.js.map +1 -0
- package/dist/rtdb/editor.d.ts +25 -0
- package/dist/rtdb/editor.d.ts.map +1 -0
- package/dist/rtdb/editor.js +79 -0
- package/dist/rtdb/editor.js.map +1 -0
- package/dist/rtdb/hooks/useRtdbTree.d.ts +33 -0
- package/dist/rtdb/hooks/useRtdbTree.d.ts.map +1 -0
- package/dist/rtdb/hooks/useRtdbTree.js +67 -0
- package/dist/rtdb/hooks/useRtdbTree.js.map +1 -0
- package/dist/rtdb/index.d.ts +17 -0
- package/dist/rtdb/index.d.ts.map +1 -0
- package/dist/rtdb/index.js +21 -0
- package/dist/rtdb/index.js.map +1 -0
- package/dist/rtdb/pathInput.d.ts +28 -0
- package/dist/rtdb/pathInput.d.ts.map +1 -0
- package/dist/rtdb/pathInput.js +40 -0
- package/dist/rtdb/pathInput.js.map +1 -0
- package/dist/rtdb/reducers/tree.d.ts +86 -0
- package/dist/rtdb/reducers/tree.d.ts.map +1 -0
- package/dist/rtdb/reducers/tree.js +131 -0
- package/dist/rtdb/reducers/tree.js.map +1 -0
- package/dist/rtdb/rtdbApi.d.ts +20 -0
- package/dist/rtdb/rtdbApi.d.ts.map +1 -0
- package/dist/rtdb/rtdbApi.js +2 -0
- package/dist/rtdb/rtdbApi.js.map +1 -0
- package/dist/rtdb/values.d.ts +50 -0
- package/dist/rtdb/values.d.ts.map +1 -0
- package/dist/rtdb/values.js +186 -0
- package/dist/rtdb/values.js.map +1 -0
- package/dist/rules/components/DenialInspector.d.ts +18 -0
- package/dist/rules/components/DenialInspector.d.ts.map +1 -0
- package/dist/rules/components/DenialInspector.js +58 -0
- package/dist/rules/components/DenialInspector.js.map +1 -0
- package/dist/rules/components/format.d.ts +56 -0
- package/dist/rules/components/format.d.ts.map +1 -0
- package/dist/rules/components/format.js +137 -0
- package/dist/rules/components/format.js.map +1 -0
- package/dist/rules/components/index.d.ts +4 -0
- package/dist/rules/components/index.d.ts.map +1 -0
- package/dist/rules/components/index.js +4 -0
- package/dist/rules/components/index.js.map +1 -0
- package/dist/rules/components/scope.d.ts +10 -0
- package/dist/rules/components/scope.d.ts.map +1 -0
- package/dist/rules/components/scope.js +72 -0
- package/dist/rules/components/scope.js.map +1 -0
- package/dist/rules/hooks/index.d.ts +2 -0
- package/dist/rules/hooks/index.d.ts.map +1 -0
- package/dist/rules/hooks/index.js +2 -0
- package/dist/rules/hooks/index.js.map +1 -0
- package/dist/rules/hooks/useDenialTrace.d.ts +51 -0
- package/dist/rules/hooks/useDenialTrace.d.ts.map +1 -0
- package/dist/rules/hooks/useDenialTrace.js +58 -0
- package/dist/rules/hooks/useDenialTrace.js.map +1 -0
- package/dist/rules/index.d.ts +14 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +13 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/types.d.ts +75 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/storage/collisionRename.d.ts +73 -0
- package/dist/storage/collisionRename.d.ts.map +1 -0
- package/dist/storage/collisionRename.js +113 -0
- package/dist/storage/collisionRename.js.map +1 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.d.ts +66 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.d.ts.map +1 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.js +82 -0
- package/dist/storage/components/DeleteSelectionWithConfirm.js.map +1 -0
- package/dist/storage/components/ObjectBrowser.d.ts +78 -0
- package/dist/storage/components/ObjectBrowser.d.ts.map +1 -0
- package/dist/storage/components/ObjectBrowser.js +60 -0
- package/dist/storage/components/ObjectBrowser.js.map +1 -0
- package/dist/storage/components/ObjectInspector.d.ts +43 -0
- package/dist/storage/components/ObjectInspector.d.ts.map +1 -0
- package/dist/storage/components/ObjectInspector.js +92 -0
- package/dist/storage/components/ObjectInspector.js.map +1 -0
- package/dist/storage/components/PathBreadcrumb.d.ts +30 -0
- package/dist/storage/components/PathBreadcrumb.d.ts.map +1 -0
- package/dist/storage/components/PathBreadcrumb.js +26 -0
- package/dist/storage/components/PathBreadcrumb.js.map +1 -0
- package/dist/storage/components/UploadDropzone.d.ts +50 -0
- package/dist/storage/components/UploadDropzone.d.ts.map +1 -0
- package/dist/storage/components/UploadDropzone.js +109 -0
- package/dist/storage/components/UploadDropzone.js.map +1 -0
- package/dist/storage/folderPlaceholder.d.ts +20 -0
- package/dist/storage/folderPlaceholder.d.ts.map +1 -0
- package/dist/storage/folderPlaceholder.js +34 -0
- package/dist/storage/folderPlaceholder.js.map +1 -0
- package/dist/storage/hooks/index.d.ts +9 -0
- package/dist/storage/hooks/index.d.ts.map +1 -0
- package/dist/storage/hooks/index.js +9 -0
- package/dist/storage/hooks/index.js.map +1 -0
- package/dist/storage/hooks/useMetadataEditor.d.ts +114 -0
- package/dist/storage/hooks/useMetadataEditor.d.ts.map +1 -0
- package/dist/storage/hooks/useMetadataEditor.js +193 -0
- package/dist/storage/hooks/useMetadataEditor.js.map +1 -0
- package/dist/storage/hooks/useObjectUpload.d.ts +105 -0
- package/dist/storage/hooks/useObjectUpload.d.ts.map +1 -0
- package/dist/storage/hooks/useObjectUpload.js +134 -0
- package/dist/storage/hooks/useObjectUpload.js.map +1 -0
- package/dist/storage/hooks/usePathState.d.ts +43 -0
- package/dist/storage/hooks/usePathState.d.ts.map +1 -0
- package/dist/storage/hooks/usePathState.js +42 -0
- package/dist/storage/hooks/usePathState.js.map +1 -0
- package/dist/storage/hooks/useStorageDelete.d.ts +74 -0
- package/dist/storage/hooks/useStorageDelete.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageDelete.js +120 -0
- package/dist/storage/hooks/useStorageDelete.js.map +1 -0
- package/dist/storage/hooks/useStorageList.d.ts +72 -0
- package/dist/storage/hooks/useStorageList.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageList.js +164 -0
- package/dist/storage/hooks/useStorageList.js.map +1 -0
- package/dist/storage/hooks/useStorageObject.d.ts +33 -0
- package/dist/storage/hooks/useStorageObject.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageObject.js +114 -0
- package/dist/storage/hooks/useStorageObject.js.map +1 -0
- package/dist/storage/hooks/useStorageRulesGate.d.ts +116 -0
- package/dist/storage/hooks/useStorageRulesGate.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageRulesGate.js +150 -0
- package/dist/storage/hooks/useStorageRulesGate.js.map +1 -0
- package/dist/storage/hooks/useStorageSelection.d.ts +32 -0
- package/dist/storage/hooks/useStorageSelection.d.ts.map +1 -0
- package/dist/storage/hooks/useStorageSelection.js +55 -0
- package/dist/storage/hooks/useStorageSelection.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +17 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/pendingPrefixes.d.ts +77 -0
- package/dist/storage/pendingPrefixes.d.ts.map +1 -0
- package/dist/storage/pendingPrefixes.js +104 -0
- package/dist/storage/pendingPrefixes.js.map +1 -0
- package/dist/storage/previews.d.ts +51 -0
- package/dist/storage/previews.d.ts.map +1 -0
- package/dist/storage/previews.js +73 -0
- package/dist/storage/previews.js.map +1 -0
- package/dist/storage/storageApi.d.ts +30 -0
- package/dist/storage/storageApi.d.ts.map +1 -0
- package/dist/storage/storageApi.js +20 -0
- package/dist/storage/storageApi.js.map +1 -0
- package/dist/traffic/components/RuleHeatmap.d.ts +34 -0
- package/dist/traffic/components/RuleHeatmap.d.ts.map +1 -0
- package/dist/traffic/components/RuleHeatmap.js +40 -0
- package/dist/traffic/components/RuleHeatmap.js.map +1 -0
- package/dist/traffic/components/TrafficDetail.d.ts +33 -0
- package/dist/traffic/components/TrafficDetail.d.ts.map +1 -0
- package/dist/traffic/components/TrafficDetail.js +28 -0
- package/dist/traffic/components/TrafficDetail.js.map +1 -0
- package/dist/traffic/components/TrafficGroupRow.d.ts +28 -0
- package/dist/traffic/components/TrafficGroupRow.d.ts.map +1 -0
- package/dist/traffic/components/TrafficGroupRow.js +25 -0
- package/dist/traffic/components/TrafficGroupRow.js.map +1 -0
- package/dist/traffic/components/TrafficLineChart.d.ts +37 -0
- package/dist/traffic/components/TrafficLineChart.d.ts.map +1 -0
- package/dist/traffic/components/TrafficLineChart.js +49 -0
- package/dist/traffic/components/TrafficLineChart.js.map +1 -0
- package/dist/traffic/components/TrafficLog.d.ts +52 -0
- package/dist/traffic/components/TrafficLog.d.ts.map +1 -0
- package/dist/traffic/components/TrafficLog.js +34 -0
- package/dist/traffic/components/TrafficLog.js.map +1 -0
- package/dist/traffic/components/TrafficMetricCards.d.ts +26 -0
- package/dist/traffic/components/TrafficMetricCards.d.ts.map +1 -0
- package/dist/traffic/components/TrafficMetricCards.js +24 -0
- package/dist/traffic/components/TrafficMetricCards.js.map +1 -0
- package/dist/traffic/components/TrafficRow.d.ts +40 -0
- package/dist/traffic/components/TrafficRow.d.ts.map +1 -0
- package/dist/traffic/components/TrafficRow.js +27 -0
- package/dist/traffic/components/TrafficRow.js.map +1 -0
- package/dist/traffic/components/TrafficStats.d.ts +18 -0
- package/dist/traffic/components/TrafficStats.d.ts.map +1 -0
- package/dist/traffic/components/TrafficStats.js +19 -0
- package/dist/traffic/components/TrafficStats.js.map +1 -0
- package/dist/traffic/components/TrafficTimeline.d.ts +88 -0
- package/dist/traffic/components/TrafficTimeline.d.ts.map +1 -0
- package/dist/traffic/components/TrafficTimeline.js +86 -0
- package/dist/traffic/components/TrafficTimeline.js.map +1 -0
- package/dist/traffic/components/format.d.ts +13 -0
- package/dist/traffic/components/format.d.ts.map +1 -0
- package/dist/traffic/components/format.js +24 -0
- package/dist/traffic/components/format.js.map +1 -0
- package/dist/traffic/components/index.d.ts +11 -0
- package/dist/traffic/components/index.d.ts.map +1 -0
- package/dist/traffic/components/index.js +11 -0
- package/dist/traffic/components/index.js.map +1 -0
- package/dist/traffic/hooks/index.d.ts +8 -0
- package/dist/traffic/hooks/index.d.ts.map +1 -0
- package/dist/traffic/hooks/index.js +8 -0
- package/dist/traffic/hooks/index.js.map +1 -0
- package/dist/traffic/hooks/useRuleHeatmap.d.ts +33 -0
- package/dist/traffic/hooks/useRuleHeatmap.d.ts.map +1 -0
- package/dist/traffic/hooks/useRuleHeatmap.js +54 -0
- package/dist/traffic/hooks/useRuleHeatmap.js.map +1 -0
- package/dist/traffic/hooks/useTrafficBuckets.d.ts +71 -0
- package/dist/traffic/hooks/useTrafficBuckets.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficBuckets.js +74 -0
- package/dist/traffic/hooks/useTrafficBuckets.js.map +1 -0
- package/dist/traffic/hooks/useTrafficFilter.d.ts +40 -0
- package/dist/traffic/hooks/useTrafficFilter.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficFilter.js +33 -0
- package/dist/traffic/hooks/useTrafficFilter.js.map +1 -0
- package/dist/traffic/hooks/useTrafficGroups.d.ts +47 -0
- package/dist/traffic/hooks/useTrafficGroups.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficGroups.js +73 -0
- package/dist/traffic/hooks/useTrafficGroups.js.map +1 -0
- package/dist/traffic/hooks/useTrafficMetrics.d.ts +66 -0
- package/dist/traffic/hooks/useTrafficMetrics.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficMetrics.js +156 -0
- package/dist/traffic/hooks/useTrafficMetrics.js.map +1 -0
- package/dist/traffic/hooks/useTrafficMonitor.d.ts +56 -0
- package/dist/traffic/hooks/useTrafficMonitor.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficMonitor.js +58 -0
- package/dist/traffic/hooks/useTrafficMonitor.js.map +1 -0
- package/dist/traffic/hooks/useTrafficStats.d.ts +32 -0
- package/dist/traffic/hooks/useTrafficStats.d.ts.map +1 -0
- package/dist/traffic/hooks/useTrafficStats.js +45 -0
- package/dist/traffic/hooks/useTrafficStats.js.map +1 -0
- package/dist/traffic/index.d.ts +4 -0
- package/dist/traffic/index.d.ts.map +1 -0
- package/dist/traffic/index.js +3 -0
- package/dist/traffic/index.js.map +1 -0
- package/dist/traffic/types.d.ts +72 -0
- package/dist/traffic/types.d.ts.map +1 -0
- package/dist/traffic/types.js +10 -0
- package/dist/traffic/types.js.map +1 -0
- package/package.json +127 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
2
|
+
/** Strip leading/trailing slashes and collapse repeats — mirrors
|
|
3
|
+
* `pyric/storage`'s reference normalization so `usePathState` and
|
|
4
|
+
* `useStorageList` always agree on what a path is. */
|
|
5
|
+
export function normalizeStoragePath(path) {
|
|
6
|
+
return path.split('/').filter(Boolean).join('/');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Path navigation state for the storage browser. Controlled when
|
|
10
|
+
* `path` is provided (the owner re-renders with the next value),
|
|
11
|
+
* uncontrolled otherwise — standard React value/defaultValue
|
|
12
|
+
* semantics. All emitted paths are normalized (`normalizeStoragePath`).
|
|
13
|
+
*/
|
|
14
|
+
export function usePathState(options = {}) {
|
|
15
|
+
const { path: controlled, onPathChange, defaultPath = '' } = options;
|
|
16
|
+
const isControlled = controlled !== undefined;
|
|
17
|
+
const [internal, setInternal] = useState(() => normalizeStoragePath(defaultPath));
|
|
18
|
+
const path = isControlled ? normalizeStoragePath(controlled) : internal;
|
|
19
|
+
const setPath = useCallback((next) => {
|
|
20
|
+
const normalized = normalizeStoragePath(next);
|
|
21
|
+
if (!isControlled)
|
|
22
|
+
setInternal(normalized);
|
|
23
|
+
onPathChange?.(normalized);
|
|
24
|
+
}, [isControlled, onPathChange]);
|
|
25
|
+
const segments = useMemo(() => (path === '' ? [] : path.split('/')), [path]);
|
|
26
|
+
const enter = useCallback((nameOrPath) => {
|
|
27
|
+
const target = normalizeStoragePath(nameOrPath);
|
|
28
|
+
// An absolute descendant path (a prefix ref's fullPath) is used
|
|
29
|
+
// as-is; a bare name appends to the current path.
|
|
30
|
+
setPath(target.includes('/') || path === '' ? target : `${path}/${target}`);
|
|
31
|
+
}, [path, setPath]);
|
|
32
|
+
const up = useCallback(() => {
|
|
33
|
+
if (segments.length === 0)
|
|
34
|
+
return;
|
|
35
|
+
setPath(segments.slice(0, -1).join('/'));
|
|
36
|
+
}, [segments, setPath]);
|
|
37
|
+
const navigateToIndex = useCallback((index) => {
|
|
38
|
+
setPath(index < 0 ? '' : segments.slice(0, index + 1).join('/'));
|
|
39
|
+
}, [segments, setPath]);
|
|
40
|
+
return { path, segments, setPath, enter, up, navigateToIndex };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=usePathState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePathState.js","sourceRoot":"","sources":["../../../src/storage/hooks/usePathState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEvD;;uDAEuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAmCD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA+B,EAAE;IAEjC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACrE,MAAM,YAAY,GAAG,UAAU,KAAK,SAAS,CAAC;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAExE,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,IAAY,EAAE,EAAE;QACf,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY;YAAE,WAAW,CAAC,UAAU,CAAC,CAAC;QAC3C,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC,EACD,CAAC,YAAY,EAAE,YAAY,CAAC,CAC7B,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC,IAAI,CAAC,CACP,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CACvB,CAAC,UAAkB,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAChD,gEAAgE;QAChE,kDAAkD;QAClD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC,EACD,CAAC,IAAI,EAAE,OAAO,CAAC,CAChB,CAAC;IAEF,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAExB,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,KAAa,EAAE,EAAE;QAChB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC,EACD,CAAC,QAAQ,EAAE,OAAO,CAAC,CACpB,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type FirebaseStorage, type StorageReference } from 'pyric/storage';
|
|
2
|
+
import type { StorageSelectionEntry } from './useStorageSelection.js';
|
|
3
|
+
import type { UseStorageListResult } from './useStorageList.js';
|
|
4
|
+
import { type StorageApi } from '../storageApi.js';
|
|
5
|
+
export interface StorageDeleteProgress {
|
|
6
|
+
/** Objects deleted so far in this folder walk. */
|
|
7
|
+
deletedCount: number;
|
|
8
|
+
/** True for the final emission. */
|
|
9
|
+
done: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Recursive folder delete implementation — the same injection seam
|
|
13
|
+
* as the Firestore half's `RecursiveDeleteImpl`. Unlike Firestore
|
|
14
|
+
* (where tree-walking needs sandbox introspection or a Cloud
|
|
15
|
+
* Function), the public storage surface CAN walk a prefix, so the
|
|
16
|
+
* package ships {@link createListAllDeleteImpl} as the default;
|
|
17
|
+
* inject your own for server-driven deletes.
|
|
18
|
+
*/
|
|
19
|
+
export interface StorageRecursiveDeleteImpl {
|
|
20
|
+
start: (target: StorageReference) => AsyncIterableIterator<StorageDeleteProgress>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The default, `listAll`-driven impl: walks the prefix tree,
|
|
24
|
+
* `deleteObject`s every item (yielding progress per object), then
|
|
25
|
+
* sweeps each visited folder's `<path>/` placeholder so emptied
|
|
26
|
+
* create-folder folders disappear too (`listAll` hides placeholders,
|
|
27
|
+
* so the walk alone would leave ghost folders). Placeholder sweeps
|
|
28
|
+
* are best-effort — `deletedCount` counts listed objects only.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createListAllDeleteImpl(api?: Pick<StorageApi, 'listAll' | 'deleteObject'>): StorageRecursiveDeleteImpl;
|
|
31
|
+
/** One entry's failure in a bulk run. `error` is the typed
|
|
32
|
+
* `StorageError` (`.code` e.g. `storage/unauthorized`). */
|
|
33
|
+
export interface StorageDeleteFailure {
|
|
34
|
+
fullPath: string;
|
|
35
|
+
error: Error;
|
|
36
|
+
}
|
|
37
|
+
export interface StorageDeleteOutcome {
|
|
38
|
+
/** fullPaths of entries fully deleted. */
|
|
39
|
+
deleted: string[];
|
|
40
|
+
failed: StorageDeleteFailure[];
|
|
41
|
+
}
|
|
42
|
+
export interface UseStorageDeleteOptions {
|
|
43
|
+
/** Folder-walk implementation. Default {@link createListAllDeleteImpl}. */
|
|
44
|
+
impl?: StorageRecursiveDeleteImpl;
|
|
45
|
+
/**
|
|
46
|
+
* Optimistic seam from `useStorageList`: entries vanish from the
|
|
47
|
+
* local list immediately and roll back (object → item, folder →
|
|
48
|
+
* trailing-slash prefix insert) on failure.
|
|
49
|
+
*/
|
|
50
|
+
list?: Pick<UseStorageListResult, 'insertItem' | 'removeItem'>;
|
|
51
|
+
}
|
|
52
|
+
export interface UseStorageDeleteResult {
|
|
53
|
+
/**
|
|
54
|
+
* Delete a mixed object/folder selection (objects via
|
|
55
|
+
* `deleteObject`, folders via the recursive impl), sequentially in
|
|
56
|
+
* selection order. Resolves with the outcome and never rejects —
|
|
57
|
+
* per-entry failures land in `outcome.failed` (and `error` keeps
|
|
58
|
+
* the first one for simple renders).
|
|
59
|
+
*/
|
|
60
|
+
deleteEntries: (entries: StorageSelectionEntry[]) => Promise<StorageDeleteOutcome>;
|
|
61
|
+
/** Objects deleted in the current/last run (folder walks included). */
|
|
62
|
+
progress: number;
|
|
63
|
+
isRunning: boolean;
|
|
64
|
+
/** First failure of the current/last run. Cleared on the next call. */
|
|
65
|
+
error: Error | undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Drive bulk + recursive deletes from a React component — the
|
|
69
|
+
* storage counterpart of `useRecursiveDelete` (same progress /
|
|
70
|
+
* isRunning / error shape, same stale-run generation token), bulk
|
|
71
|
+
* because storage selections are flat multi-row affairs.
|
|
72
|
+
*/
|
|
73
|
+
export declare function useStorageDelete(storage: FirebaseStorage | null | undefined, options?: UseStorageDeleteOptions): UseStorageDeleteResult;
|
|
74
|
+
//# sourceMappingURL=useStorageDelete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorageDelete.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useStorageDelete.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGlE,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,CACL,MAAM,EAAE,gBAAgB,KACrB,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,cAAc,CAAC,GACjD,0BAA0B,CAiC5B;AAED;4DAC4D;AAC5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,IAAI,CAAC,EAAE,0BAA0B,CAAC;IAClC;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,YAAY,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,aAAa,EAAE,CACb,OAAO,EAAE,qBAAqB,EAAE,KAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC3C,OAAO,GAAE,uBAA4B,GACpC,sBAAsB,CAiExB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { useCallback, useRef, useState } from 'react';
|
|
2
|
+
import { deleteObject as defaultDeleteObject, listAll as defaultListAll, } from 'pyric/storage';
|
|
3
|
+
import { useStorageApi } from '../storageApi.js';
|
|
4
|
+
import { asFolderPlaceholder } from '../folderPlaceholder.js';
|
|
5
|
+
/**
|
|
6
|
+
* The default, `listAll`-driven impl: walks the prefix tree,
|
|
7
|
+
* `deleteObject`s every item (yielding progress per object), then
|
|
8
|
+
* sweeps each visited folder's `<path>/` placeholder so emptied
|
|
9
|
+
* create-folder folders disappear too (`listAll` hides placeholders,
|
|
10
|
+
* so the walk alone would leave ghost folders). Placeholder sweeps
|
|
11
|
+
* are best-effort — `deletedCount` counts listed objects only.
|
|
12
|
+
*/
|
|
13
|
+
export function createListAllDeleteImpl(api) {
|
|
14
|
+
return {
|
|
15
|
+
async *start(target) {
|
|
16
|
+
const operations = api ?? {
|
|
17
|
+
listAll: defaultListAll,
|
|
18
|
+
deleteObject: defaultDeleteObject,
|
|
19
|
+
};
|
|
20
|
+
let deletedCount = 0;
|
|
21
|
+
const stack = [target];
|
|
22
|
+
const visited = [];
|
|
23
|
+
while (stack.length > 0) {
|
|
24
|
+
const folder = stack.pop();
|
|
25
|
+
visited.push(folder);
|
|
26
|
+
const result = await operations.listAll(folder);
|
|
27
|
+
stack.push(...result.prefixes);
|
|
28
|
+
for (const item of result.items) {
|
|
29
|
+
await operations.deleteObject(item);
|
|
30
|
+
deletedCount++;
|
|
31
|
+
yield { deletedCount, done: false };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const folder of visited) {
|
|
35
|
+
try {
|
|
36
|
+
await operations.deleteObject(asFolderPlaceholder(folder));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Best-effort: a strict backend may reject the structural
|
|
40
|
+
// placeholder or throw not-found. Neither should fail the
|
|
41
|
+
// recursive delete that already succeeded.
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
yield { deletedCount, done: true };
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Drive bulk + recursive deletes from a React component — the
|
|
50
|
+
* storage counterpart of `useRecursiveDelete` (same progress /
|
|
51
|
+
* isRunning / error shape, same stale-run generation token), bulk
|
|
52
|
+
* because storage selections are flat multi-row affairs.
|
|
53
|
+
*/
|
|
54
|
+
export function useStorageDelete(storage, options = {}) {
|
|
55
|
+
const api = useStorageApi();
|
|
56
|
+
const [progress, setProgress] = useState(0);
|
|
57
|
+
const [isRunning, setIsRunning] = useState(false);
|
|
58
|
+
const [error, setError] = useState(undefined);
|
|
59
|
+
const generationRef = useRef(0);
|
|
60
|
+
// Latest-value ref so `deleteEntries` stays stable across option
|
|
61
|
+
// identity changes (house pattern).
|
|
62
|
+
const optionsRef = useRef(options);
|
|
63
|
+
optionsRef.current = options;
|
|
64
|
+
const deleteEntries = useCallback(async (entries) => {
|
|
65
|
+
const myGen = ++generationRef.current;
|
|
66
|
+
setProgress(0);
|
|
67
|
+
setError(undefined);
|
|
68
|
+
const outcome = { deleted: [], failed: [] };
|
|
69
|
+
if (storage == null || entries.length === 0)
|
|
70
|
+
return outcome;
|
|
71
|
+
setIsRunning(true);
|
|
72
|
+
const impl = optionsRef.current.impl ?? createListAllDeleteImpl(api);
|
|
73
|
+
let count = 0;
|
|
74
|
+
try {
|
|
75
|
+
for (const entry of entries) {
|
|
76
|
+
// Optimistic removal — the row vanishes immediately.
|
|
77
|
+
optionsRef.current.list?.removeItem(entry.fullPath);
|
|
78
|
+
try {
|
|
79
|
+
if (entry.kind === 'object') {
|
|
80
|
+
await api.deleteObject(api.ref(storage, entry.fullPath));
|
|
81
|
+
count++;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
for await (const evt of impl.start(api.ref(storage, entry.fullPath))) {
|
|
85
|
+
if (myGen !== generationRef.current)
|
|
86
|
+
return outcome;
|
|
87
|
+
// The impl reports counts local to its walk; add the
|
|
88
|
+
// objects already deleted by earlier entries.
|
|
89
|
+
setProgress(count + evt.deletedCount);
|
|
90
|
+
if (evt.done) {
|
|
91
|
+
count += evt.deletedCount;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
outcome.deleted.push(entry.fullPath);
|
|
97
|
+
if (myGen === generationRef.current)
|
|
98
|
+
setProgress(count);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
const err = e instanceof Error ? e : new Error(String(e));
|
|
102
|
+
outcome.failed.push({ fullPath: entry.fullPath, error: err });
|
|
103
|
+
// Roll the optimistic removal back: objects re-insert as
|
|
104
|
+
// items, folders as trailing-slash prefixes.
|
|
105
|
+
optionsRef.current.list?.insertItem(entry.kind === 'folder' ? `${entry.fullPath}/` : entry.fullPath);
|
|
106
|
+
if (myGen === generationRef.current && outcome.failed.length === 1) {
|
|
107
|
+
setError(err);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return outcome;
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
if (myGen === generationRef.current)
|
|
115
|
+
setIsRunning(false);
|
|
116
|
+
}
|
|
117
|
+
}, [api, storage]);
|
|
118
|
+
return { deleteEntries, progress, isRunning, error };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=useStorageDelete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorageDelete.js","sourceRoot":"","sources":["../../../src/storage/hooks/useStorageDelete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { FirebaseStorage, StorageReference } from 'pyric/storage';
|
|
2
|
+
export type StorageListStatus = 'idle' | 'loading' | 'success' | 'error';
|
|
3
|
+
/**
|
|
4
|
+
* One row of the merged folder/object model, the prefix→folder
|
|
5
|
+
* synthesis ported (as an idea, not code) from the emulator UI's
|
|
6
|
+
* `useStorageFiles`: `listAll`'s `prefixes` become `kind: 'folder'`
|
|
7
|
+
* rows, its `items` become `kind: 'object'` rows, folders first.
|
|
8
|
+
*/
|
|
9
|
+
export interface StorageListEntry {
|
|
10
|
+
kind: 'folder' | 'object';
|
|
11
|
+
/** Last path segment, display name. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Bucket-rooted path (no trailing slash, even for folders). */
|
|
14
|
+
fullPath: string;
|
|
15
|
+
ref: StorageReference;
|
|
16
|
+
}
|
|
17
|
+
export interface UseStorageListResult {
|
|
18
|
+
/** `'idle'` only when `storage` is null/undefined. */
|
|
19
|
+
status: StorageListStatus;
|
|
20
|
+
/** Direct child objects under `path`. Sorted by `fullPath`. */
|
|
21
|
+
items: StorageReference[];
|
|
22
|
+
/** Synthetic folder prefixes under `path`. Sorted by `fullPath`. */
|
|
23
|
+
prefixes: StorageReference[];
|
|
24
|
+
/** Folders-first merged row model. Derived from `prefixes` + `items`. */
|
|
25
|
+
entries: StorageListEntry[];
|
|
26
|
+
/**
|
|
27
|
+
* `StorageError` (with a typed `storage/<code>` on `.code`) from the
|
|
28
|
+
* sandbox. A denied list is `error.code === 'storage/unauthorized'`
|
|
29
|
+
* (ST-B2).
|
|
30
|
+
*/
|
|
31
|
+
error: Error | undefined;
|
|
32
|
+
/** Re-run `listAll` for the current path. */
|
|
33
|
+
refresh: () => void;
|
|
34
|
+
/**
|
|
35
|
+
* Optimistic seam (consumed by M3 upload / M6 bulk ops, exposed
|
|
36
|
+
* now so those hooks layer on without reshaping this one). Inserts
|
|
37
|
+
* `fullPath` into the local list immediately, applying the same
|
|
38
|
+
* prefix→folder synthesis `listAll` would: a direct child becomes
|
|
39
|
+
* an item, a deeper descendant surfaces as its first-segment
|
|
40
|
+
* folder. A trailing slash declares a folder (the GCS placeholder
|
|
41
|
+
* convention `useObjectUpload.createFolder` writes): a direct
|
|
42
|
+
* trailing-slash child inserts a prefix, not an item. No-op for
|
|
43
|
+
* paths outside the listed path, duplicates, or when `status` is
|
|
44
|
+
* `'idle'`. What each call ACTUALLY inserted is recorded (keyed by
|
|
45
|
+
* the given `fullPath`) so `removeItem` can reverse it precisely.
|
|
46
|
+
* Rollback = `removeItem` or `refresh`.
|
|
47
|
+
*/
|
|
48
|
+
insertItem: (fullPath: string) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Optimistic counterpart. When `fullPath` was previously given to
|
|
51
|
+
* `insertItem`, this reverses EXACTLY what that call inserted: a
|
|
52
|
+
* deep upload that synthesized a first-segment folder row removes
|
|
53
|
+
* that folder row, and an insert that was a no-op (the row already
|
|
54
|
+
* existed — e.g. a real, listed folder) removes NOTHING, so a
|
|
55
|
+
* failed upload can never delete server-truth rows. For paths never
|
|
56
|
+
* seen by `insertItem` it removes the matching item/folder row
|
|
57
|
+
* directly (the optimistic-delete use). Rollback = `refresh`.
|
|
58
|
+
*/
|
|
59
|
+
removeItem: (fullPath: string) => void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* List the objects + synthetic folders directly under `path` :
|
|
63
|
+
* `listAll` over the package's sandbox Storage handle. Read-via-get,
|
|
64
|
+
* not realtime: the list updates on `refresh`, path change, or the
|
|
65
|
+
* optimistic seam. Pass `''` (or the result of `usePathState`) for
|
|
66
|
+
* the bucket root.
|
|
67
|
+
*
|
|
68
|
+
* `listAll` has no pagination; a very large prefix arrives as one flat
|
|
69
|
+
* result (virtualize the rendering, which `<ObjectBrowser>` does).
|
|
70
|
+
*/
|
|
71
|
+
export declare function useStorageList(storage: FirebaseStorage | null | undefined, path: string): UseStorageListResult;
|
|
72
|
+
//# sourceMappingURL=useStorageList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorageList.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useStorageList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,gBAAgB,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,+DAA+D;IAC/D,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,yEAAyE;IACzE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B;;;;OAIG;IACH,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;;;;;;;;OAaG;IACH,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;;;;;;;;OASG;IACH,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,GACX,oBAAoB,CA0JtB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { useStorageApi } from '../storageApi.js';
|
|
3
|
+
/** Strip leading/trailing slashes so `'a/b/'`, `'/a/b'`, `'a/b'` agree. */
|
|
4
|
+
function normalizePath(path) {
|
|
5
|
+
return path.replace(/^\/+|\/+$/g, '');
|
|
6
|
+
}
|
|
7
|
+
function byFullPath(a, b) {
|
|
8
|
+
return a.fullPath < b.fullPath ? -1 : a.fullPath > b.fullPath ? 1 : 0;
|
|
9
|
+
}
|
|
10
|
+
function insertSorted(list, next) {
|
|
11
|
+
if (list.some((r) => r.fullPath === next.fullPath))
|
|
12
|
+
return list;
|
|
13
|
+
return [...list, next].sort(byFullPath);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* List the objects + synthetic folders directly under `path` :
|
|
17
|
+
* `listAll` over the package's sandbox Storage handle. Read-via-get,
|
|
18
|
+
* not realtime: the list updates on `refresh`, path change, or the
|
|
19
|
+
* optimistic seam. Pass `''` (or the result of `usePathState`) for
|
|
20
|
+
* the bucket root.
|
|
21
|
+
*
|
|
22
|
+
* `listAll` has no pagination; a very large prefix arrives as one flat
|
|
23
|
+
* result (virtualize the rendering, which `<ObjectBrowser>` does).
|
|
24
|
+
*/
|
|
25
|
+
export function useStorageList(storage, path) {
|
|
26
|
+
// Injected: in-process `pyric/storage` by default, or the SharedWorker client
|
|
27
|
+
// bundle in Studio served mode (via StorageApiProvider).
|
|
28
|
+
const { listAll, ref: refFn } = useStorageApi();
|
|
29
|
+
const normalized = normalizePath(path);
|
|
30
|
+
const [state, setState] = useState(() => ({
|
|
31
|
+
status: storage == null ? 'idle' : 'loading',
|
|
32
|
+
items: [],
|
|
33
|
+
prefixes: [],
|
|
34
|
+
error: undefined,
|
|
35
|
+
}));
|
|
36
|
+
const [tick, setTick] = useState(0);
|
|
37
|
+
// What each `insertItem(fullPath)` call ACTUALLY inserted, keyed by the
|
|
38
|
+
// normalized argument: the inserted row's fullPath, or null when the call
|
|
39
|
+
// was a no-op (row already present). `removeItem` consults this to reverse
|
|
40
|
+
// precisely; a fresh listing (server truth) clears the ledger.
|
|
41
|
+
const optimisticInserts = useRef(new Map());
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
optimisticInserts.current.clear();
|
|
44
|
+
if (storage == null) {
|
|
45
|
+
setState({ status: 'idle', items: [], prefixes: [], error: undefined });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
let cancelled = false;
|
|
49
|
+
setState({ status: 'loading', items: [], prefixes: [], error: undefined });
|
|
50
|
+
listAll(refFn(storage, normalized))
|
|
51
|
+
.then((result) => {
|
|
52
|
+
if (cancelled)
|
|
53
|
+
return;
|
|
54
|
+
setState({
|
|
55
|
+
status: 'success',
|
|
56
|
+
// Defensive copy + sort pins the invariant the optimistic seam
|
|
57
|
+
// relies on even if the backing implementation changes.
|
|
58
|
+
items: [...result.items].sort(byFullPath),
|
|
59
|
+
prefixes: [...result.prefixes].sort(byFullPath),
|
|
60
|
+
error: undefined,
|
|
61
|
+
});
|
|
62
|
+
})
|
|
63
|
+
.catch((e) => {
|
|
64
|
+
if (cancelled)
|
|
65
|
+
return;
|
|
66
|
+
setState({
|
|
67
|
+
status: 'error',
|
|
68
|
+
items: [],
|
|
69
|
+
prefixes: [],
|
|
70
|
+
error: e instanceof Error ? e : new Error(String(e)),
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
return () => {
|
|
74
|
+
cancelled = true;
|
|
75
|
+
};
|
|
76
|
+
}, [storage, normalized, tick]);
|
|
77
|
+
const refresh = useCallback(() => setTick((n) => n + 1), []);
|
|
78
|
+
const insertItem = useCallback((fullPath) => {
|
|
79
|
+
if (storage == null)
|
|
80
|
+
return;
|
|
81
|
+
// Trailing slash = folder declaration (a `<path>/` placeholder
|
|
82
|
+
// object surfaces as a prefix, never an item, same synthesis
|
|
83
|
+
// `listAll` applies).
|
|
84
|
+
const isFolder = fullPath.endsWith('/');
|
|
85
|
+
const target = normalizePath(fullPath);
|
|
86
|
+
const scanPrefix = normalized === '' ? '' : `${normalized}/`;
|
|
87
|
+
if (!target.startsWith(scanPrefix) || target === normalized)
|
|
88
|
+
return;
|
|
89
|
+
const relative = target.slice(scanPrefix.length);
|
|
90
|
+
const slashIdx = relative.indexOf('/');
|
|
91
|
+
setState((prev) => {
|
|
92
|
+
if (prev.status === 'idle')
|
|
93
|
+
return prev;
|
|
94
|
+
// Record what this call really adds (null = no-op) so removeItem can
|
|
95
|
+
// reverse it precisely. Idempotent under StrictMode's double-invoke:
|
|
96
|
+
// the same prev yields the same record.
|
|
97
|
+
if (slashIdx === -1) {
|
|
98
|
+
if (isFolder) {
|
|
99
|
+
// Direct child folder.
|
|
100
|
+
optimisticInserts.current.set(target, prev.prefixes.some((r) => r.fullPath === target) ? null : target);
|
|
101
|
+
return {
|
|
102
|
+
...prev,
|
|
103
|
+
prefixes: insertSorted(prev.prefixes, refFn(storage, target)),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Direct child object.
|
|
107
|
+
optimisticInserts.current.set(target, prev.items.some((r) => r.fullPath === target) ? null : target);
|
|
108
|
+
return { ...prev, items: insertSorted(prev.items, refFn(storage, target)) };
|
|
109
|
+
}
|
|
110
|
+
// Deeper descendant, surface its first segment as a folder,
|
|
111
|
+
// exactly like listAll's synthesis.
|
|
112
|
+
const folderPath = `${scanPrefix}${relative.slice(0, slashIdx)}`;
|
|
113
|
+
optimisticInserts.current.set(target, prev.prefixes.some((r) => r.fullPath === folderPath) ? null : folderPath);
|
|
114
|
+
return {
|
|
115
|
+
...prev,
|
|
116
|
+
prefixes: insertSorted(prev.prefixes, refFn(storage, folderPath)),
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
}, [storage, normalized]);
|
|
120
|
+
const removeItem = useCallback((fullPath) => {
|
|
121
|
+
const target = normalizePath(fullPath);
|
|
122
|
+
const record = optimisticInserts.current.get(target);
|
|
123
|
+
optimisticInserts.current.delete(target);
|
|
124
|
+
// This path was optimistically inserted and the insert added nothing
|
|
125
|
+
// (the row pre-existed) — there is nothing of ours to remove, and
|
|
126
|
+
// removing by path would delete a server-truth row.
|
|
127
|
+
if (record === null)
|
|
128
|
+
return;
|
|
129
|
+
// Reverse the exact row the insert created (a deep upload's synthesized
|
|
130
|
+
// first-segment folder differs from the upload's own fullPath); fall
|
|
131
|
+
// back to the path itself for plain optimistic deletes.
|
|
132
|
+
const rowPath = record ?? target;
|
|
133
|
+
setState((prev) => ({
|
|
134
|
+
...prev,
|
|
135
|
+
items: prev.items.filter((r) => r.fullPath !== rowPath),
|
|
136
|
+
prefixes: prev.prefixes.filter((r) => r.fullPath !== rowPath),
|
|
137
|
+
}));
|
|
138
|
+
}, []);
|
|
139
|
+
const entries = useMemo(() => [
|
|
140
|
+
...state.prefixes.map((p) => ({
|
|
141
|
+
kind: 'folder',
|
|
142
|
+
name: p.name,
|
|
143
|
+
fullPath: p.fullPath,
|
|
144
|
+
ref: p,
|
|
145
|
+
})),
|
|
146
|
+
...state.items.map((i) => ({
|
|
147
|
+
kind: 'object',
|
|
148
|
+
name: i.name,
|
|
149
|
+
fullPath: i.fullPath,
|
|
150
|
+
ref: i,
|
|
151
|
+
})),
|
|
152
|
+
], [state.prefixes, state.items]);
|
|
153
|
+
return {
|
|
154
|
+
status: state.status,
|
|
155
|
+
items: state.items,
|
|
156
|
+
prefixes: state.prefixes,
|
|
157
|
+
entries,
|
|
158
|
+
error: state.error,
|
|
159
|
+
refresh,
|
|
160
|
+
insertItem,
|
|
161
|
+
removeItem,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=useStorageList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorageList.js","sourceRoot":"","sources":["../../../src/storage/hooks/useStorageList.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FirebaseStorage, FullMetadata } from 'pyric/storage';
|
|
2
|
+
export type StorageObjectStatus = 'idle' | 'loading' | 'success' | 'error';
|
|
3
|
+
export interface UseStorageObjectResult {
|
|
4
|
+
/** Metadata read state. `'idle'` when `storage` or `path` is null. */
|
|
5
|
+
status: StorageObjectStatus;
|
|
6
|
+
metadata: FullMetadata | undefined;
|
|
7
|
+
/** Typed `StorageError` (`storage/object-not-found`,
|
|
8
|
+
* `storage/unauthorized`, …). */
|
|
9
|
+
error: Error | undefined;
|
|
10
|
+
/** Re-read the metadata (also resets the blob, the object may
|
|
11
|
+
* have been overwritten). */
|
|
12
|
+
refresh: () => void;
|
|
13
|
+
/** Blob read state. Stays `'idle'` until `loadBlob()`, the blob
|
|
14
|
+
* is LAZY; metadata alone never downloads bytes. */
|
|
15
|
+
blobStatus: StorageObjectStatus;
|
|
16
|
+
blob: Blob | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* `URL.createObjectURL` handle for the loaded blob, used as the local
|
|
19
|
+
* preview channel. Revoked automatically when the blob is replaced,
|
|
20
|
+
* the path changes, or the hook unmounts.
|
|
21
|
+
*/
|
|
22
|
+
blobUrl: string | undefined;
|
|
23
|
+
blobError: Error | undefined;
|
|
24
|
+
/** Fetch the bytes via `getBlob`. Subsequent calls re-fetch. */
|
|
25
|
+
loadBlob: () => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* One object's metadata + lazily-loaded bytes, the data source for
|
|
29
|
+
* `<ObjectInspector>`. Read-via-get like the rest of the storage
|
|
30
|
+
* half: updates on `refresh`, `path` change, or `loadBlob`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function useStorageObject(storage: FirebaseStorage | null | undefined, path: string | null | undefined): UseStorageObjectResult;
|
|
33
|
+
//# sourceMappingURL=useStorageObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorageObject.d.ts","sourceRoot":"","sources":["../../../src/storage/hooks/useStorageObject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACb,MAAM,eAAe,CAAC;AAIvB,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3E,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC;sCACkC;IAClC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB;kCAC8B;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;yDACqD;IACrD,UAAU,EAAE,mBAAmB,CAAC;IAChC,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IACvB;;;;OAIG;IACH,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAsBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EAC3C,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B,sBAAsB,CAkGxB"}
|