@entropy-softworks/ui 2026.7.31
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/CHANGELOG.md +96 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/lib/components/auth/LockOverlay.d.ts +22 -0
- package/lib/components/auth/LockOverlay.d.ts.map +1 -0
- package/lib/components/auth/LockOverlay.jsx +82 -0
- package/lib/components/auth/LockOverlay.jsx.map +1 -0
- package/lib/components/auth/PasswordStrengthMeter.d.ts +12 -0
- package/lib/components/auth/PasswordStrengthMeter.d.ts.map +1 -0
- package/lib/components/auth/PasswordStrengthMeter.jsx +81 -0
- package/lib/components/auth/PasswordStrengthMeter.jsx.map +1 -0
- package/lib/components/auth/ProtectedRoute.d.ts +24 -0
- package/lib/components/auth/ProtectedRoute.d.ts.map +1 -0
- package/lib/components/auth/ProtectedRoute.jsx +56 -0
- package/lib/components/auth/ProtectedRoute.jsx.map +1 -0
- package/lib/components/auth/PwnedPasswordWarning.d.ts +13 -0
- package/lib/components/auth/PwnedPasswordWarning.d.ts.map +1 -0
- package/lib/components/auth/PwnedPasswordWarning.jsx +29 -0
- package/lib/components/auth/PwnedPasswordWarning.jsx.map +1 -0
- package/lib/components/auth/index.d.ts +5 -0
- package/lib/components/auth/index.d.ts.map +1 -0
- package/lib/components/auth/index.js +5 -0
- package/lib/components/auth/index.js.map +1 -0
- package/lib/components/bottom-nav.d.ts +25 -0
- package/lib/components/bottom-nav.d.ts.map +1 -0
- package/lib/components/bottom-nav.jsx +51 -0
- package/lib/components/bottom-nav.jsx.map +1 -0
- package/lib/components/button.d.ts +16 -0
- package/lib/components/button.d.ts.map +1 -0
- package/lib/components/button.jsx +73 -0
- package/lib/components/button.jsx.map +1 -0
- package/lib/components/card.d.ts +22 -0
- package/lib/components/card.d.ts.map +1 -0
- package/lib/components/card.jsx +36 -0
- package/lib/components/card.jsx.map +1 -0
- package/lib/components/checkbox.d.ts +12 -0
- package/lib/components/checkbox.d.ts.map +1 -0
- package/lib/components/checkbox.jsx +16 -0
- package/lib/components/checkbox.jsx.map +1 -0
- package/lib/components/connection-settings.d.ts +41 -0
- package/lib/components/connection-settings.d.ts.map +1 -0
- package/lib/components/connection-settings.jsx +354 -0
- package/lib/components/connection-settings.jsx.map +1 -0
- package/lib/components/context-menu.d.ts +52 -0
- package/lib/components/context-menu.d.ts.map +1 -0
- package/lib/components/context-menu.jsx +24 -0
- package/lib/components/context-menu.jsx.map +1 -0
- package/lib/components/data-table.d.ts +59 -0
- package/lib/components/data-table.d.ts.map +1 -0
- package/lib/components/data-table.jsx +101 -0
- package/lib/components/data-table.jsx.map +1 -0
- package/lib/components/dialog.d.ts +58 -0
- package/lib/components/dialog.d.ts.map +1 -0
- package/lib/components/dialog.jsx +197 -0
- package/lib/components/dialog.jsx.map +1 -0
- package/lib/components/dropdown-menu.d.ts +55 -0
- package/lib/components/dropdown-menu.d.ts.map +1 -0
- package/lib/components/dropdown-menu.jsx +38 -0
- package/lib/components/dropdown-menu.jsx.map +1 -0
- package/lib/components/entropy-boot-splash.d.ts +24 -0
- package/lib/components/entropy-boot-splash.d.ts.map +1 -0
- package/lib/components/entropy-boot-splash.jsx +83 -0
- package/lib/components/entropy-boot-splash.jsx.map +1 -0
- package/lib/components/entropy-mark-animated.d.ts +20 -0
- package/lib/components/entropy-mark-animated.d.ts.map +1 -0
- package/lib/components/entropy-mark-animated.jsx +148 -0
- package/lib/components/entropy-mark-animated.jsx.map +1 -0
- package/lib/components/entropy-mark-geometry.d.ts +8 -0
- package/lib/components/entropy-mark-geometry.d.ts.map +1 -0
- package/lib/components/entropy-mark-geometry.js +10 -0
- package/lib/components/entropy-mark-geometry.js.map +1 -0
- package/lib/components/entropy-mark-sequential.d.ts +12 -0
- package/lib/components/entropy-mark-sequential.d.ts.map +1 -0
- package/lib/components/entropy-mark-sequential.jsx +53 -0
- package/lib/components/entropy-mark-sequential.jsx.map +1 -0
- package/lib/components/entropy-mark.d.ts +29 -0
- package/lib/components/entropy-mark.d.ts.map +1 -0
- package/lib/components/entropy-mark.jsx +66 -0
- package/lib/components/entropy-mark.jsx.map +1 -0
- package/lib/components/error-boundary.d.ts +31 -0
- package/lib/components/error-boundary.d.ts.map +1 -0
- package/lib/components/error-boundary.jsx +40 -0
- package/lib/components/error-boundary.jsx.map +1 -0
- package/lib/components/index.d.ts +41 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +43 -0
- package/lib/components/index.js.map +1 -0
- package/lib/components/input.d.ts +26 -0
- package/lib/components/input.d.ts.map +1 -0
- package/lib/components/input.jsx +95 -0
- package/lib/components/input.jsx.map +1 -0
- package/lib/components/item-icon.d.ts +32 -0
- package/lib/components/item-icon.d.ts.map +1 -0
- package/lib/components/item-icon.jsx +54 -0
- package/lib/components/item-icon.jsx.map +1 -0
- package/lib/components/label.d.ts +13 -0
- package/lib/components/label.d.ts.map +1 -0
- package/lib/components/label.jsx +9 -0
- package/lib/components/label.jsx.map +1 -0
- package/lib/components/legal-dialog.d.ts +18 -0
- package/lib/components/legal-dialog.d.ts.map +1 -0
- package/lib/components/legal-dialog.jsx +31 -0
- package/lib/components/legal-dialog.jsx.map +1 -0
- package/lib/components/license-gate.d.ts +17 -0
- package/lib/components/license-gate.d.ts.map +1 -0
- package/lib/components/license-gate.jsx +21 -0
- package/lib/components/license-gate.jsx.map +1 -0
- package/lib/components/logo.d.ts +15 -0
- package/lib/components/logo.d.ts.map +1 -0
- package/lib/components/logo.jsx +20 -0
- package/lib/components/logo.jsx.map +1 -0
- package/lib/components/onboarding-wizard.d.ts +89 -0
- package/lib/components/onboarding-wizard.d.ts.map +1 -0
- package/lib/components/onboarding-wizard.jsx +185 -0
- package/lib/components/onboarding-wizard.jsx.map +1 -0
- package/lib/components/pagination.d.ts +43 -0
- package/lib/components/pagination.d.ts.map +1 -0
- package/lib/components/pagination.jsx +72 -0
- package/lib/components/pagination.jsx.map +1 -0
- package/lib/components/password-generator.d.ts +15 -0
- package/lib/components/password-generator.d.ts.map +1 -0
- package/lib/components/password-generator.jsx +273 -0
- package/lib/components/password-generator.jsx.map +1 -0
- package/lib/components/pin-pad.d.ts +20 -0
- package/lib/components/pin-pad.d.ts.map +1 -0
- package/lib/components/pin-pad.jsx +93 -0
- package/lib/components/pin-pad.jsx.map +1 -0
- package/lib/components/popover.d.ts +27 -0
- package/lib/components/popover.d.ts.map +1 -0
- package/lib/components/popover.jsx +18 -0
- package/lib/components/popover.jsx.map +1 -0
- package/lib/components/profile/ProfileDialog.d.ts +25 -0
- package/lib/components/profile/ProfileDialog.d.ts.map +1 -0
- package/lib/components/profile/ProfileDialog.jsx +71 -0
- package/lib/components/profile/ProfileDialog.jsx.map +1 -0
- package/lib/components/profile/ProfileTab.d.ts +12 -0
- package/lib/components/profile/ProfileTab.d.ts.map +1 -0
- package/lib/components/profile/ProfileTab.jsx +112 -0
- package/lib/components/profile/ProfileTab.jsx.map +1 -0
- package/lib/components/profile/SecurityTab.d.ts +32 -0
- package/lib/components/profile/SecurityTab.d.ts.map +1 -0
- package/lib/components/profile/SecurityTab.jsx +145 -0
- package/lib/components/profile/SecurityTab.jsx.map +1 -0
- package/lib/components/profile/index.d.ts +4 -0
- package/lib/components/profile/index.d.ts.map +1 -0
- package/lib/components/profile/index.js +4 -0
- package/lib/components/profile/index.js.map +1 -0
- package/lib/components/segmented-toggle.d.ts +28 -0
- package/lib/components/segmented-toggle.d.ts.map +1 -0
- package/lib/components/segmented-toggle.jsx +64 -0
- package/lib/components/segmented-toggle.jsx.map +1 -0
- package/lib/components/separator.d.ts +13 -0
- package/lib/components/separator.d.ts.map +1 -0
- package/lib/components/separator.jsx +16 -0
- package/lib/components/separator.jsx.map +1 -0
- package/lib/components/server-settings.d.ts +27 -0
- package/lib/components/server-settings.d.ts.map +1 -0
- package/lib/components/server-settings.jsx +307 -0
- package/lib/components/server-settings.jsx.map +1 -0
- package/lib/components/settings/AccountSection.d.ts +26 -0
- package/lib/components/settings/AccountSection.d.ts.map +1 -0
- package/lib/components/settings/AccountSection.jsx +32 -0
- package/lib/components/settings/AccountSection.jsx.map +1 -0
- package/lib/components/settings/DangerZoneSection.d.ts +13 -0
- package/lib/components/settings/DangerZoneSection.d.ts.map +1 -0
- package/lib/components/settings/DangerZoneSection.jsx +16 -0
- package/lib/components/settings/DangerZoneSection.jsx.map +1 -0
- package/lib/components/settings/GeneralSection.d.ts +11 -0
- package/lib/components/settings/GeneralSection.d.ts.map +1 -0
- package/lib/components/settings/GeneralSection.jsx +12 -0
- package/lib/components/settings/GeneralSection.jsx.map +1 -0
- package/lib/components/settings/SupportSection.d.ts +11 -0
- package/lib/components/settings/SupportSection.d.ts.map +1 -0
- package/lib/components/settings/SupportSection.jsx +22 -0
- package/lib/components/settings/SupportSection.jsx.map +1 -0
- package/lib/components/settings/index.d.ts +5 -0
- package/lib/components/settings/index.d.ts.map +1 -0
- package/lib/components/settings/index.js +5 -0
- package/lib/components/settings/index.js.map +1 -0
- package/lib/components/settings-row.d.ts +28 -0
- package/lib/components/settings-row.d.ts.map +1 -0
- package/lib/components/settings-row.jsx +68 -0
- package/lib/components/settings-row.jsx.map +1 -0
- package/lib/components/skeleton.d.ts +8 -0
- package/lib/components/skeleton.d.ts.map +1 -0
- package/lib/components/skeleton.jsx +24 -0
- package/lib/components/skeleton.jsx.map +1 -0
- package/lib/components/social-connections.d.ts +15 -0
- package/lib/components/social-connections.d.ts.map +1 -0
- package/lib/components/social-connections.jsx +31 -0
- package/lib/components/social-connections.jsx.map +1 -0
- package/lib/components/stat-card.d.ts +29 -0
- package/lib/components/stat-card.d.ts.map +1 -0
- package/lib/components/stat-card.jsx +36 -0
- package/lib/components/stat-card.jsx.map +1 -0
- package/lib/components/tag-chip.d.ts +18 -0
- package/lib/components/tag-chip.d.ts.map +1 -0
- package/lib/components/tag-chip.jsx +54 -0
- package/lib/components/tag-chip.jsx.map +1 -0
- package/lib/components/tag-multi-select.d.ts +27 -0
- package/lib/components/tag-multi-select.d.ts.map +1 -0
- package/lib/components/tag-multi-select.jsx +65 -0
- package/lib/components/tag-multi-select.jsx.map +1 -0
- package/lib/components/text.d.ts +22 -0
- package/lib/components/text.d.ts.map +1 -0
- package/lib/components/text.jsx +43 -0
- package/lib/components/text.jsx.map +1 -0
- package/lib/components/toast/ToastPortal.d.ts +11 -0
- package/lib/components/toast/ToastPortal.d.ts.map +1 -0
- package/lib/components/toast/ToastPortal.jsx +15 -0
- package/lib/components/toast/ToastPortal.jsx.map +1 -0
- package/lib/components/toast/ToastPortal.web.d.ts +14 -0
- package/lib/components/toast/ToastPortal.web.d.ts.map +1 -0
- package/lib/components/toast/ToastPortal.web.jsx +39 -0
- package/lib/components/toast/ToastPortal.web.jsx.map +1 -0
- package/lib/components/toast/index.d.ts +3 -0
- package/lib/components/toast/index.d.ts.map +1 -0
- package/lib/components/toast/index.js +3 -0
- package/lib/components/toast/index.js.map +1 -0
- package/lib/components/toast/toast-config.d.ts +14 -0
- package/lib/components/toast/toast-config.d.ts.map +1 -0
- package/lib/components/toast/toast-config.jsx +24 -0
- package/lib/components/toast/toast-config.jsx.map +1 -0
- package/lib/components/tooltip.d.ts +30 -0
- package/lib/components/tooltip.d.ts.map +1 -0
- package/lib/components/tooltip.jsx +14 -0
- package/lib/components/tooltip.jsx.map +1 -0
- package/lib/components/totp-display.d.ts +23 -0
- package/lib/components/totp-display.d.ts.map +1 -0
- package/lib/components/totp-display.jsx +132 -0
- package/lib/components/totp-display.jsx.map +1 -0
- package/lib/components/user-avatar.d.ts +18 -0
- package/lib/components/user-avatar.d.ts.map +1 -0
- package/lib/components/user-avatar.jsx +25 -0
- package/lib/components/user-avatar.jsx.map +1 -0
- package/lib/context/AppConfigContext.d.ts +56 -0
- package/lib/context/AppConfigContext.d.ts.map +1 -0
- package/lib/context/AppConfigContext.jsx +14 -0
- package/lib/context/AppConfigContext.jsx.map +1 -0
- package/lib/context/NavigationContext.d.ts +42 -0
- package/lib/context/NavigationContext.d.ts.map +1 -0
- package/lib/context/NavigationContext.jsx +53 -0
- package/lib/context/NavigationContext.jsx.map +1 -0
- package/lib/context/NotificationContext.d.ts +32 -0
- package/lib/context/NotificationContext.d.ts.map +1 -0
- package/lib/context/NotificationContext.jsx +49 -0
- package/lib/context/NotificationContext.jsx.map +1 -0
- package/lib/context/ThemeContext.d.ts +12 -0
- package/lib/context/ThemeContext.d.ts.map +1 -0
- package/lib/context/ThemeContext.jsx +66 -0
- package/lib/context/ThemeContext.jsx.map +1 -0
- package/lib/context/index.d.ts +5 -0
- package/lib/context/index.d.ts.map +1 -0
- package/lib/context/index.js +5 -0
- package/lib/context/index.js.map +1 -0
- package/lib/flags.d.ts +9 -0
- package/lib/flags.d.ts.map +1 -0
- package/lib/flags.js +37 -0
- package/lib/flags.js.map +1 -0
- package/lib/forms/form-error.d.ts +12 -0
- package/lib/forms/form-error.d.ts.map +1 -0
- package/lib/forms/form-error.jsx +14 -0
- package/lib/forms/form-error.jsx.map +1 -0
- package/lib/forms/index.d.ts +3 -0
- package/lib/forms/index.d.ts.map +1 -0
- package/lib/forms/index.js +3 -0
- package/lib/forms/index.js.map +1 -0
- package/lib/forms/shake-field.d.ts +18 -0
- package/lib/forms/shake-field.d.ts.map +1 -0
- package/lib/forms/shake-field.jsx +30 -0
- package/lib/forms/shake-field.jsx.map +1 -0
- package/lib/hooks/index.d.ts +6 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js +6 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useAuth.d.ts +109 -0
- package/lib/hooks/useAuth.d.ts.map +1 -0
- package/lib/hooks/useAuth.jsx +404 -0
- package/lib/hooks/useAuth.jsx.map +1 -0
- package/lib/hooks/useAutoLock.d.ts +22 -0
- package/lib/hooks/useAutoLock.d.ts.map +1 -0
- package/lib/hooks/useAutoLock.js +85 -0
- package/lib/hooks/useAutoLock.js.map +1 -0
- package/lib/hooks/useDebouncedValue.d.ts +19 -0
- package/lib/hooks/useDebouncedValue.d.ts.map +1 -0
- package/lib/hooks/useDebouncedValue.js +29 -0
- package/lib/hooks/useDebouncedValue.js.map +1 -0
- package/lib/hooks/useShakeAnimation.d.ts +17 -0
- package/lib/hooks/useShakeAnimation.d.ts.map +1 -0
- package/lib/hooks/useShakeAnimation.js +22 -0
- package/lib/hooks/useShakeAnimation.js.map +1 -0
- package/lib/hooks/useUploadBlobUrl.d.ts +13 -0
- package/lib/hooks/useUploadBlobUrl.d.ts.map +1 -0
- package/lib/hooks/useUploadBlobUrl.js +60 -0
- package/lib/hooks/useUploadBlobUrl.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +47 -0
- package/lib/index.js.map +1 -0
- package/lib/screens/auth/AccountPickerScreen.d.ts +24 -0
- package/lib/screens/auth/AccountPickerScreen.d.ts.map +1 -0
- package/lib/screens/auth/AccountPickerScreen.jsx +47 -0
- package/lib/screens/auth/AccountPickerScreen.jsx.map +1 -0
- package/lib/screens/auth/AuthScreen.d.ts +59 -0
- package/lib/screens/auth/AuthScreen.d.ts.map +1 -0
- package/lib/screens/auth/AuthScreen.jsx +594 -0
- package/lib/screens/auth/AuthScreen.jsx.map +1 -0
- package/lib/screens/auth/ConsentScreen.d.ts +27 -0
- package/lib/screens/auth/ConsentScreen.d.ts.map +1 -0
- package/lib/screens/auth/ConsentScreen.jsx +55 -0
- package/lib/screens/auth/ConsentScreen.jsx.map +1 -0
- package/lib/screens/auth/ErrorScreen.d.ts +20 -0
- package/lib/screens/auth/ErrorScreen.d.ts.map +1 -0
- package/lib/screens/auth/ErrorScreen.jsx +43 -0
- package/lib/screens/auth/ErrorScreen.jsx.map +1 -0
- package/lib/screens/auth/ExpiredLinkScreen.d.ts +19 -0
- package/lib/screens/auth/ExpiredLinkScreen.d.ts.map +1 -0
- package/lib/screens/auth/ExpiredLinkScreen.jsx +38 -0
- package/lib/screens/auth/ExpiredLinkScreen.jsx.map +1 -0
- package/lib/screens/auth/ForgotPasswordScreen.d.ts +4 -0
- package/lib/screens/auth/ForgotPasswordScreen.d.ts.map +1 -0
- package/lib/screens/auth/ForgotPasswordScreen.jsx +123 -0
- package/lib/screens/auth/ForgotPasswordScreen.jsx.map +1 -0
- package/lib/screens/auth/ImportDataScreen.d.ts +17 -0
- package/lib/screens/auth/ImportDataScreen.d.ts.map +1 -0
- package/lib/screens/auth/ImportDataScreen.jsx +73 -0
- package/lib/screens/auth/ImportDataScreen.jsx.map +1 -0
- package/lib/screens/auth/LoginScreen.d.ts +38 -0
- package/lib/screens/auth/LoginScreen.d.ts.map +1 -0
- package/lib/screens/auth/LoginScreen.jsx +326 -0
- package/lib/screens/auth/LoginScreen.jsx.map +1 -0
- package/lib/screens/auth/MfaChallengeScreen.d.ts +4 -0
- package/lib/screens/auth/MfaChallengeScreen.d.ts.map +1 -0
- package/lib/screens/auth/MfaChallengeScreen.jsx +139 -0
- package/lib/screens/auth/MfaChallengeScreen.jsx.map +1 -0
- package/lib/screens/auth/MfaEnrollScreen.d.ts +12 -0
- package/lib/screens/auth/MfaEnrollScreen.d.ts.map +1 -0
- package/lib/screens/auth/MfaEnrollScreen.jsx +267 -0
- package/lib/screens/auth/MfaEnrollScreen.jsx.map +1 -0
- package/lib/screens/auth/PasskeyEnrollScreen.d.ts +18 -0
- package/lib/screens/auth/PasskeyEnrollScreen.d.ts.map +1 -0
- package/lib/screens/auth/PasskeyEnrollScreen.jsx +51 -0
- package/lib/screens/auth/PasskeyEnrollScreen.jsx.map +1 -0
- package/lib/screens/auth/PrivacyPolicyScreen.d.ts +19 -0
- package/lib/screens/auth/PrivacyPolicyScreen.d.ts.map +1 -0
- package/lib/screens/auth/PrivacyPolicyScreen.jsx +143 -0
- package/lib/screens/auth/PrivacyPolicyScreen.jsx.map +1 -0
- package/lib/screens/auth/RegisterScreen.d.ts +14 -0
- package/lib/screens/auth/RegisterScreen.d.ts.map +1 -0
- package/lib/screens/auth/RegisterScreen.jsx +296 -0
- package/lib/screens/auth/RegisterScreen.jsx.map +1 -0
- package/lib/screens/auth/ResetPasswordScreen.d.ts +12 -0
- package/lib/screens/auth/ResetPasswordScreen.d.ts.map +1 -0
- package/lib/screens/auth/ResetPasswordScreen.jsx +276 -0
- package/lib/screens/auth/ResetPasswordScreen.jsx.map +1 -0
- package/lib/screens/auth/ServerConfigScreen.d.ts +18 -0
- package/lib/screens/auth/ServerConfigScreen.d.ts.map +1 -0
- package/lib/screens/auth/ServerConfigScreen.jsx +259 -0
- package/lib/screens/auth/ServerConfigScreen.jsx.map +1 -0
- package/lib/screens/auth/TermsOfServiceScreen.d.ts +30 -0
- package/lib/screens/auth/TermsOfServiceScreen.d.ts.map +1 -0
- package/lib/screens/auth/TermsOfServiceScreen.jsx +130 -0
- package/lib/screens/auth/TermsOfServiceScreen.jsx.map +1 -0
- package/lib/screens/auth/VerifyEmailScreen.d.ts +4 -0
- package/lib/screens/auth/VerifyEmailScreen.d.ts.map +1 -0
- package/lib/screens/auth/VerifyEmailScreen.jsx +249 -0
- package/lib/screens/auth/VerifyEmailScreen.jsx.map +1 -0
- package/lib/screens/auth/WelcomeScreen.d.ts +17 -0
- package/lib/screens/auth/WelcomeScreen.d.ts.map +1 -0
- package/lib/screens/auth/WelcomeScreen.jsx +58 -0
- package/lib/screens/auth/WelcomeScreen.jsx.map +1 -0
- package/lib/screens/auth/index.d.ts +19 -0
- package/lib/screens/auth/index.d.ts.map +1 -0
- package/lib/screens/auth/index.js +19 -0
- package/lib/screens/auth/index.js.map +1 -0
- package/lib/screens/index.d.ts +2 -0
- package/lib/screens/index.d.ts.map +1 -0
- package/lib/screens/index.js +2 -0
- package/lib/screens/index.js.map +1 -0
- package/lib/services/api-config.d.ts +87 -0
- package/lib/services/api-config.d.ts.map +1 -0
- package/lib/services/api-config.js +202 -0
- package/lib/services/api-config.js.map +1 -0
- package/lib/services/auth.service.d.ts +140 -0
- package/lib/services/auth.service.d.ts.map +1 -0
- package/lib/services/auth.service.js +376 -0
- package/lib/services/auth.service.js.map +1 -0
- package/lib/services/favicon.d.ts +46 -0
- package/lib/services/favicon.d.ts.map +1 -0
- package/lib/services/favicon.js +84 -0
- package/lib/services/favicon.js.map +1 -0
- package/lib/services/hibp-cache.d.ts +23 -0
- package/lib/services/hibp-cache.d.ts.map +1 -0
- package/lib/services/hibp-cache.js +56 -0
- package/lib/services/hibp-cache.js.map +1 -0
- package/lib/services/hibp.d.ts +28 -0
- package/lib/services/hibp.d.ts.map +1 -0
- package/lib/services/hibp.js +92 -0
- package/lib/services/hibp.js.map +1 -0
- package/lib/services/index.d.ts +8 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +7 -0
- package/lib/services/index.js.map +1 -0
- package/lib/services/passkey.d.ts +10 -0
- package/lib/services/passkey.d.ts.map +1 -0
- package/lib/services/passkey.js +192 -0
- package/lib/services/passkey.js.map +1 -0
- package/lib/utils/api-fetch.d.ts +11 -0
- package/lib/utils/api-fetch.d.ts.map +1 -0
- package/lib/utils/api-fetch.js +52 -0
- package/lib/utils/api-fetch.js.map +1 -0
- package/lib/utils/clipboard.d.ts +31 -0
- package/lib/utils/clipboard.d.ts.map +1 -0
- package/lib/utils/clipboard.js +66 -0
- package/lib/utils/clipboard.js.map +1 -0
- package/lib/utils/cn.d.ts +9 -0
- package/lib/utils/cn.d.ts.map +1 -0
- package/lib/utils/cn.js +12 -0
- package/lib/utils/cn.js.map +1 -0
- package/lib/utils/debounce.d.ts +13 -0
- package/lib/utils/debounce.d.ts.map +1 -0
- package/lib/utils/debounce.js +28 -0
- package/lib/utils/debounce.js.map +1 -0
- package/lib/utils/error.d.ts +9 -0
- package/lib/utils/error.d.ts.map +1 -0
- package/lib/utils/error.js +11 -0
- package/lib/utils/error.js.map +1 -0
- package/lib/utils/fetch.d.ts +17 -0
- package/lib/utils/fetch.d.ts.map +1 -0
- package/lib/utils/fetch.js +29 -0
- package/lib/utils/fetch.js.map +1 -0
- package/lib/utils/http-error.d.ts +41 -0
- package/lib/utils/http-error.d.ts.map +1 -0
- package/lib/utils/http-error.js +63 -0
- package/lib/utils/http-error.js.map +1 -0
- package/lib/utils/index.d.ts +11 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +11 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/palette.d.ts +46 -0
- package/lib/utils/palette.d.ts.map +1 -0
- package/lib/utils/palette.js +75 -0
- package/lib/utils/palette.js.map +1 -0
- package/lib/utils/password.d.ts +20 -0
- package/lib/utils/password.d.ts.map +1 -0
- package/lib/utils/password.js +51 -0
- package/lib/utils/password.js.map +1 -0
- package/lib/utils/settings-storage.d.ts +3 -0
- package/lib/utils/settings-storage.d.ts.map +1 -0
- package/lib/utils/settings-storage.js +62 -0
- package/lib/utils/settings-storage.js.map +1 -0
- package/lib/utils/validation.d.ts +29 -0
- package/lib/utils/validation.d.ts.map +1 -0
- package/lib/utils/validation.js +58 -0
- package/lib/utils/validation.js.map +1 -0
- package/package.json +204 -0
- package/src/components/__tests__/data-table.test.ts +94 -0
- package/src/components/__tests__/pagination.test.ts +73 -0
- package/src/components/__tests__/stat-card.test.ts +21 -0
- package/src/components/auth/LockOverlay.tsx +122 -0
- package/src/components/auth/PasswordStrengthMeter.tsx +96 -0
- package/src/components/auth/ProtectedRoute.tsx +91 -0
- package/src/components/auth/PwnedPasswordWarning.tsx +54 -0
- package/src/components/auth/index.ts +10 -0
- package/src/components/bottom-nav.tsx +99 -0
- package/src/components/button.tsx +144 -0
- package/src/components/card.tsx +82 -0
- package/src/components/checkbox.tsx +48 -0
- package/src/components/connection-settings.tsx +583 -0
- package/src/components/context-menu.tsx +95 -0
- package/src/components/data-table.tsx +223 -0
- package/src/components/dialog.tsx +376 -0
- package/src/components/dropdown-menu.tsx +120 -0
- package/src/components/entropy-boot-splash.tsx +114 -0
- package/src/components/entropy-mark-animated.tsx +260 -0
- package/src/components/entropy-mark-geometry.ts +11 -0
- package/src/components/entropy-mark-sequential.tsx +132 -0
- package/src/components/entropy-mark.tsx +135 -0
- package/src/components/error-boundary.tsx +70 -0
- package/src/components/index.ts +156 -0
- package/src/components/input.tsx +246 -0
- package/src/components/item-icon.tsx +111 -0
- package/src/components/label.tsx +25 -0
- package/src/components/legal-dialog.tsx +47 -0
- package/src/components/license-gate.tsx +28 -0
- package/src/components/logo.tsx +34 -0
- package/src/components/onboarding-wizard.tsx +353 -0
- package/src/components/pagination.tsx +154 -0
- package/src/components/password-generator.tsx +393 -0
- package/src/components/pin-pad.tsx +156 -0
- package/src/components/popover.tsx +38 -0
- package/src/components/profile/ProfileDialog.tsx +129 -0
- package/src/components/profile/ProfileTab.tsx +151 -0
- package/src/components/profile/SecurityTab.tsx +229 -0
- package/src/components/profile/index.ts +3 -0
- package/src/components/segmented-toggle.tsx +119 -0
- package/src/components/separator.tsx +41 -0
- package/src/components/server-settings.tsx +442 -0
- package/src/components/settings/AccountSection.tsx +76 -0
- package/src/components/settings/DangerZoneSection.tsx +37 -0
- package/src/components/settings/GeneralSection.tsx +39 -0
- package/src/components/settings/SupportSection.tsx +53 -0
- package/src/components/settings/index.ts +4 -0
- package/src/components/settings-row.tsx +126 -0
- package/src/components/skeleton.tsx +48 -0
- package/src/components/social-connections.tsx +55 -0
- package/src/components/stat-card.tsx +64 -0
- package/src/components/tag-chip.tsx +78 -0
- package/src/components/tag-multi-select.tsx +136 -0
- package/src/components/text.tsx +77 -0
- package/src/components/toast/ToastPortal.tsx +16 -0
- package/src/components/toast/ToastPortal.web.tsx +47 -0
- package/src/components/toast/index.ts +2 -0
- package/src/components/toast/toast-config.tsx +31 -0
- package/src/components/tooltip.tsx +30 -0
- package/src/components/totp-display.tsx +207 -0
- package/src/components/user-avatar.tsx +46 -0
- package/src/context/AppConfigContext.tsx +76 -0
- package/src/context/NavigationContext.tsx +75 -0
- package/src/context/NotificationContext.tsx +69 -0
- package/src/context/ThemeContext.tsx +83 -0
- package/src/context/__tests__/NavigationContext.test.tsx +53 -0
- package/src/context/index.ts +24 -0
- package/src/flags.ts +44 -0
- package/src/forms/form-error.tsx +20 -0
- package/src/forms/index.ts +2 -0
- package/src/forms/shake-field.tsx +52 -0
- package/src/hooks/__tests__/useUploadBlobUrl.test.tsx +77 -0
- package/src/hooks/index.ts +18 -0
- package/src/hooks/useAuth.tsx +567 -0
- package/src/hooks/useAutoLock.ts +110 -0
- package/src/hooks/useDebouncedValue.ts +32 -0
- package/src/hooks/useShakeAnimation.ts +42 -0
- package/src/hooks/useUploadBlobUrl.ts +75 -0
- package/src/index.ts +48 -0
- package/src/screens/auth/AccountPickerScreen.tsx +103 -0
- package/src/screens/auth/AuthScreen.tsx +941 -0
- package/src/screens/auth/ConsentScreen.tsx +118 -0
- package/src/screens/auth/ErrorScreen.tsx +96 -0
- package/src/screens/auth/ExpiredLinkScreen.tsx +87 -0
- package/src/screens/auth/ForgotPasswordScreen.tsx +182 -0
- package/src/screens/auth/ImportDataScreen.tsx +112 -0
- package/src/screens/auth/LoginScreen.tsx +484 -0
- package/src/screens/auth/MfaChallengeScreen.tsx +216 -0
- package/src/screens/auth/MfaEnrollScreen.tsx +388 -0
- package/src/screens/auth/PasskeyEnrollScreen.tsx +96 -0
- package/src/screens/auth/PrivacyPolicyScreen.tsx +249 -0
- package/src/screens/auth/RegisterScreen.tsx +430 -0
- package/src/screens/auth/ResetPasswordScreen.tsx +377 -0
- package/src/screens/auth/ServerConfigScreen.tsx +388 -0
- package/src/screens/auth/TermsOfServiceScreen.tsx +236 -0
- package/src/screens/auth/VerifyEmailScreen.tsx +310 -0
- package/src/screens/auth/WelcomeScreen.tsx +78 -0
- package/src/screens/auth/index.ts +36 -0
- package/src/screens/index.ts +1 -0
- package/src/services/__tests__/api-config.test.ts +67 -0
- package/src/services/__tests__/favicon.test.ts +88 -0
- package/src/services/__tests__/hibp-cache.test.ts +37 -0
- package/src/services/__tests__/hibp.test.ts +39 -0
- package/src/services/api-config.ts +260 -0
- package/src/services/auth.service.ts +498 -0
- package/src/services/favicon.ts +102 -0
- package/src/services/hibp-cache.ts +71 -0
- package/src/services/hibp.ts +120 -0
- package/src/services/index.ts +52 -0
- package/src/services/passkey.ts +213 -0
- package/src/types/external.d.ts +24 -0
- package/src/utils/__tests__/clipboard.test.ts +59 -0
- package/src/utils/__tests__/cn.test.ts +24 -0
- package/src/utils/__tests__/debounce.test.ts +42 -0
- package/src/utils/__tests__/error.test.ts +18 -0
- package/src/utils/__tests__/http-error.test.ts +33 -0
- package/src/utils/__tests__/palette.test.ts +22 -0
- package/src/utils/__tests__/password.test.ts +55 -0
- package/src/utils/__tests__/settings-storage.test.ts +15 -0
- package/src/utils/__tests__/validation.test.ts +52 -0
- package/src/utils/api-fetch.ts +61 -0
- package/src/utils/clipboard.ts +69 -0
- package/src/utils/cn.ts +12 -0
- package/src/utils/debounce.ts +33 -0
- package/src/utils/error.ts +10 -0
- package/src/utils/fetch.ts +33 -0
- package/src/utils/http-error.ts +81 -0
- package/src/utils/index.ts +23 -0
- package/src/utils/palette.ts +105 -0
- package/src/utils/password.ts +64 -0
- package/src/utils/settings-storage.ts +68 -0
- package/src/utils/validation.ts +71 -0
- package/styles/globals.css +262 -0
- package/tailwind-preset.js +163 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// Runtime configuration for the auth/HTTP layer.
|
|
2
|
+
//
|
|
3
|
+
// Apps call `configureApi({...})` at startup with their API base URL
|
|
4
|
+
// and storage-key prefix. The prefix namespaces SecureStore /
|
|
5
|
+
// sessionStorage entries so apps that share a host (vault-on-localhost
|
|
6
|
+
// ↔ bootstrap-on-localhost during dev) do not collide on each other's
|
|
7
|
+
// session tokens.
|
|
8
|
+
//
|
|
9
|
+
// State lives on a singleton `ApiConfigStore` instance. The exported
|
|
10
|
+
// free functions are thin wrappers so existing consumers don't need to
|
|
11
|
+
// import the class — tests call `__resetApiConfigStoreForTests()`
|
|
12
|
+
// between cases to isolate state.
|
|
13
|
+
import { Platform } from "react-native";
|
|
14
|
+
import * as SecureStore from "expo-secure-store";
|
|
15
|
+
const DEFAULT_RUNTIME_CONFIG_KEY = "__ENTROPY_RUNTIME_CONFIG__";
|
|
16
|
+
class ApiConfigStore {
|
|
17
|
+
storagePrefix = "app";
|
|
18
|
+
configuredDefaultBaseUrl = null;
|
|
19
|
+
baseUrl = null;
|
|
20
|
+
runtimeConfigKey = DEFAULT_RUNTIME_CONFIG_KEY;
|
|
21
|
+
authMode = "email";
|
|
22
|
+
tenant = null;
|
|
23
|
+
configure(config) {
|
|
24
|
+
if (this.storagePrefix === "app") {
|
|
25
|
+
this.storagePrefix = config.storagePrefix;
|
|
26
|
+
}
|
|
27
|
+
if (config.runtimeConfigKey) {
|
|
28
|
+
this.runtimeConfigKey = config.runtimeConfigKey;
|
|
29
|
+
}
|
|
30
|
+
if (config.authMode) {
|
|
31
|
+
this.authMode = config.authMode;
|
|
32
|
+
}
|
|
33
|
+
if (config.tenant) {
|
|
34
|
+
this.tenant = config.tenant;
|
|
35
|
+
}
|
|
36
|
+
this.configuredDefaultBaseUrl = this.readRuntimeApiUrl() ?? config.apiBaseUrl;
|
|
37
|
+
if (this.baseUrl === null) {
|
|
38
|
+
this.baseUrl = this.configuredDefaultBaseUrl;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
readRuntimeApiUrl() {
|
|
42
|
+
if (typeof window === "undefined") {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const cfg = window[this.runtimeConfigKey];
|
|
46
|
+
return cfg && typeof cfg.apiUrl === "string" && cfg.apiUrl.length > 0 ? cfg.apiUrl : null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Test-only: reset back to factory defaults. Production code never
|
|
50
|
+
* calls this — module-level singletons stay alive for the lifetime
|
|
51
|
+
* of the JS context.
|
|
52
|
+
*/
|
|
53
|
+
reset() {
|
|
54
|
+
this.storagePrefix = "app";
|
|
55
|
+
this.configuredDefaultBaseUrl = null;
|
|
56
|
+
this.baseUrl = null;
|
|
57
|
+
this.runtimeConfigKey = DEFAULT_RUNTIME_CONFIG_KEY;
|
|
58
|
+
this.authMode = "email";
|
|
59
|
+
this.tenant = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const store = new ApiConfigStore();
|
|
63
|
+
/**
|
|
64
|
+
* Install runtime configuration. Apps call this once at startup,
|
|
65
|
+
* BEFORE `AuthService` is used. Re-configuring at runtime is
|
|
66
|
+
* supported but only the base URL changes — the storage prefix is
|
|
67
|
+
* locked after first call.
|
|
68
|
+
*/
|
|
69
|
+
export function configureApi(config) {
|
|
70
|
+
store.configure(config);
|
|
71
|
+
}
|
|
72
|
+
function sessionTokenKey() {
|
|
73
|
+
return `${store.storagePrefix}_session_token`;
|
|
74
|
+
}
|
|
75
|
+
function serverUrlOverrideKey() {
|
|
76
|
+
return `${store.storagePrefix}_server_url_override`;
|
|
77
|
+
}
|
|
78
|
+
export function getStoragePrefix() {
|
|
79
|
+
return store.storagePrefix;
|
|
80
|
+
}
|
|
81
|
+
/** Current auth request shape (see {@link ApiConfig.authMode}). */
|
|
82
|
+
export function getAuthMode() {
|
|
83
|
+
return store.authMode;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Active tenant for `"multi-tenant"` auth mode. In an IdP the tenant is
|
|
87
|
+
* contextual (resolved from the OIDC `?tenant=` param / the client), not
|
|
88
|
+
* typed by the user — the consuming app calls this before login. Returns
|
|
89
|
+
* an empty string when unset.
|
|
90
|
+
*/
|
|
91
|
+
export function getTenant() {
|
|
92
|
+
return store.tenant ?? "";
|
|
93
|
+
}
|
|
94
|
+
/** Set the active tenant for `"multi-tenant"` auth mode. */
|
|
95
|
+
export function setTenant(tenant) {
|
|
96
|
+
store.tenant = tenant;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Internal key-value put. Native: SecureStore (encrypted at rest,
|
|
100
|
+
* Keychain on iOS, AES-encrypted on Android). Web: sessionStorage
|
|
101
|
+
* (origin-isolated, but plaintext AND readable by XSS).
|
|
102
|
+
*
|
|
103
|
+
* Web callers MUST NOT pass secrets — only UI preferences whose
|
|
104
|
+
* disclosure is acceptable (server-url override, etc.). The web
|
|
105
|
+
* branch deliberately uses sessionStorage rather than localStorage
|
|
106
|
+
* so a misconfigured caller leaks values for the current tab only.
|
|
107
|
+
*
|
|
108
|
+
* For session credentials, use {@link storeSessionToken} (no-op on
|
|
109
|
+
* web — the server sets an HttpOnly cookie). For the authenticated
|
|
110
|
+
* user record, use {@link AuthService.persistAuthSession} (web path
|
|
111
|
+
* stores in process memory).
|
|
112
|
+
*/
|
|
113
|
+
export async function kvPut(key, value) {
|
|
114
|
+
if (Platform.OS === "web") {
|
|
115
|
+
if (typeof window === "undefined" || !window.sessionStorage) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (value === null) {
|
|
119
|
+
window.sessionStorage.removeItem(key);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
window.sessionStorage.setItem(key, value);
|
|
123
|
+
}
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (value === null) {
|
|
127
|
+
await SecureStore.deleteItemAsync(key);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
await SecureStore.setItemAsync(key, value);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Internal key-value get. See {@link kvPut} for the storage tier matrix. */
|
|
134
|
+
export async function kvGet(key) {
|
|
135
|
+
if (Platform.OS === "web") {
|
|
136
|
+
if (typeof window === "undefined" || !window.sessionStorage) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return window.sessionStorage.getItem(key);
|
|
140
|
+
}
|
|
141
|
+
return await SecureStore.getItemAsync(key);
|
|
142
|
+
}
|
|
143
|
+
export function getBaseUrl() {
|
|
144
|
+
if (store.baseUrl === null) {
|
|
145
|
+
throw new Error("entropy-ui: api base URL is not configured. Call configureApi({ apiBaseUrl, storagePrefix }) before using AuthService.");
|
|
146
|
+
}
|
|
147
|
+
return store.baseUrl;
|
|
148
|
+
}
|
|
149
|
+
export function getDefaultBaseUrl() {
|
|
150
|
+
if (store.configuredDefaultBaseUrl === null) {
|
|
151
|
+
throw new Error("entropy-ui: api base URL is not configured. Call configureApi({ apiBaseUrl, storagePrefix }) before using AuthService.");
|
|
152
|
+
}
|
|
153
|
+
return store.configuredDefaultBaseUrl;
|
|
154
|
+
}
|
|
155
|
+
export async function setBaseUrl(url) {
|
|
156
|
+
let parsed;
|
|
157
|
+
try {
|
|
158
|
+
parsed = new URL(url);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
throw new Error("Invalid server URL");
|
|
162
|
+
}
|
|
163
|
+
const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
|
|
164
|
+
if (parsed.protocol !== "https:" && !(isLocalhost && parsed.protocol === "http:")) {
|
|
165
|
+
throw new Error("Server URL must use HTTPS");
|
|
166
|
+
}
|
|
167
|
+
store.baseUrl = url;
|
|
168
|
+
await kvPut(serverUrlOverrideKey(), url);
|
|
169
|
+
}
|
|
170
|
+
export async function resetBaseUrl() {
|
|
171
|
+
store.baseUrl = store.configuredDefaultBaseUrl;
|
|
172
|
+
await kvPut(serverUrlOverrideKey(), null);
|
|
173
|
+
}
|
|
174
|
+
export async function loadServerUrlOverride() {
|
|
175
|
+
const override = await kvGet(serverUrlOverrideKey());
|
|
176
|
+
if (override) {
|
|
177
|
+
store.baseUrl = override;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Session credential used as a `Bearer` token.
|
|
182
|
+
* - Native: SecureStore (encrypted at rest).
|
|
183
|
+
* - Web: sessionStorage (origin-isolated, cleared on tab close). Production
|
|
184
|
+
* web also has the HttpOnly session cookie; the sessionStorage Bearer is what
|
|
185
|
+
* keeps a *split-origin dev* session (Expo :8081 → API :8100) alive across a
|
|
186
|
+
* refresh, since a SameSite=Lax cookie can't ride cross-origin XHR. Readable
|
|
187
|
+
* by XSS — acceptable tradeoff chosen for dev parity; clears on tab close.
|
|
188
|
+
*/
|
|
189
|
+
export async function getSessionToken() {
|
|
190
|
+
return await kvGet(sessionTokenKey());
|
|
191
|
+
}
|
|
192
|
+
export async function storeSessionToken(token) {
|
|
193
|
+
await kvPut(sessionTokenKey(), token);
|
|
194
|
+
}
|
|
195
|
+
export async function clearSessionToken() {
|
|
196
|
+
await kvPut(sessionTokenKey(), null);
|
|
197
|
+
}
|
|
198
|
+
/** Test-only — reset the singleton's state. */
|
|
199
|
+
export function __resetApiConfigStoreForTests() {
|
|
200
|
+
store.reset();
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=api-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-config.js","sourceRoot":"","sources":["../../src/services/api-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { validateEmail as validateEmailUtil, validatePassword as validatePasswordUtil, validateUsername as validateUsernameUtil } from "../utils/validation";
|
|
2
|
+
import * as ApiConfig from "./api-config";
|
|
3
|
+
/**
|
|
4
|
+
* Shape of the user record returned by Entropy Softworks servers. Apps
|
|
5
|
+
* may carry additional fields — extend the interface in the consumer if
|
|
6
|
+
* needed and pass the extended type through `useAuth<TUser>()`.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Conventional onboarding-step values produced by Entropy Softworks
|
|
10
|
+
* servers. Apps may carry additional vendor-specific steps — keep the
|
|
11
|
+
* field typed as `string` to stay compatible with the openapi-generated
|
|
12
|
+
* `UserPublic` shape that vault and bootstrap import from their shared
|
|
13
|
+
* packages.
|
|
14
|
+
*/
|
|
15
|
+
export type OnboardingStep = "email_verification" | "mfa_enrollment" | "import" | "complete";
|
|
16
|
+
export interface User {
|
|
17
|
+
id: string;
|
|
18
|
+
email: string;
|
|
19
|
+
/** Optional: email-only servers (e.g. Simple Finance) don't issue usernames. */
|
|
20
|
+
username?: string;
|
|
21
|
+
display_name?: string;
|
|
22
|
+
role: "Admin" | "User";
|
|
23
|
+
/**
|
|
24
|
+
* Pending step in the post-signup onboarding flow. Typed as `string`
|
|
25
|
+
* (rather than the `OnboardingStep` union) to stay assignment-compatible
|
|
26
|
+
* with server-generated openapi types; the auth screens compare against
|
|
27
|
+
* the known constants and treat unknown values as "complete".
|
|
28
|
+
*/
|
|
29
|
+
onboarding_step?: string | null;
|
|
30
|
+
email_verified?: boolean;
|
|
31
|
+
mfa_enabled?: boolean;
|
|
32
|
+
mfa_verified?: boolean;
|
|
33
|
+
created_at?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface AuthResponse {
|
|
36
|
+
user: User;
|
|
37
|
+
/**
|
|
38
|
+
* Bearer token for native clients. Web clients receive an HttpOnly
|
|
39
|
+
* cookie and ignore this field.
|
|
40
|
+
*/
|
|
41
|
+
session_token: string;
|
|
42
|
+
}
|
|
43
|
+
/** Public server feature flags from `GET /config`. */
|
|
44
|
+
export interface ServerConfig {
|
|
45
|
+
/** New accounts must enroll a passkey/TOTP during onboarding. */
|
|
46
|
+
require_mfa_enrollment: boolean;
|
|
47
|
+
registration_enabled: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface LoginRequest {
|
|
50
|
+
email: string;
|
|
51
|
+
password: string;
|
|
52
|
+
}
|
|
53
|
+
export interface RegisterRequest {
|
|
54
|
+
email: string;
|
|
55
|
+
/** Optional: omitted for email-only servers (e.g. Simple Finance). */
|
|
56
|
+
username?: string;
|
|
57
|
+
password: string;
|
|
58
|
+
display_name?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface ErrorResponse {
|
|
61
|
+
error: {
|
|
62
|
+
message: string;
|
|
63
|
+
details?: string[];
|
|
64
|
+
code?: string;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface MfaSetupResponse {
|
|
68
|
+
uri: string;
|
|
69
|
+
secret: string;
|
|
70
|
+
recovery_codes: string[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Auth client for Entropy Softworks servers. Apps call `configureApi`
|
|
74
|
+
* (from `@entropy-softworks/ui/services`) at startup so storage keys and
|
|
75
|
+
* the base URL are wired up before any of these methods run.
|
|
76
|
+
*/
|
|
77
|
+
declare class AuthService {
|
|
78
|
+
static loadServerUrlOverride: typeof ApiConfig.loadServerUrlOverride;
|
|
79
|
+
static getBaseUrl: typeof ApiConfig.getBaseUrl;
|
|
80
|
+
static setBaseUrl: typeof ApiConfig.setBaseUrl;
|
|
81
|
+
static resetBaseUrl: typeof ApiConfig.resetBaseUrl;
|
|
82
|
+
static getSessionToken: typeof ApiConfig.getSessionToken;
|
|
83
|
+
/**
|
|
84
|
+
* Persist the session credential + user record produced by an
|
|
85
|
+
* alternative auth path (passkey-finish, magic-link, etc.) so the
|
|
86
|
+
* rest of `useAuth` / `getCurrentUser` sees the same state the
|
|
87
|
+
* password `login` flow leaves behind.
|
|
88
|
+
*
|
|
89
|
+
* Web: session credential is a server-set HttpOnly cookie; only
|
|
90
|
+
* the user record persists here, and it lives in process memory
|
|
91
|
+
* (NOT sessionStorage) so an XSS exploit cannot read it.
|
|
92
|
+
* Native: token goes through SecureStore, user record goes
|
|
93
|
+
* through SecureStore alongside it.
|
|
94
|
+
*/
|
|
95
|
+
static persistAuthSession(data: AuthResponse): Promise<void>;
|
|
96
|
+
static login(email: string, password: string): Promise<AuthResponse>;
|
|
97
|
+
static register(email: string, username: string | undefined, password: string, displayName?: string): Promise<AuthResponse>;
|
|
98
|
+
static logout(): Promise<void>;
|
|
99
|
+
static getCurrentUser(): Promise<User | null>;
|
|
100
|
+
static refreshUserData(): Promise<User | null>;
|
|
101
|
+
/**
|
|
102
|
+
* Web: HttpOnly cookies aren't readable from JS. We use the
|
|
103
|
+
* presence of the (non-HttpOnly) `csrf_token` cookie — set by the
|
|
104
|
+
* server alongside the session cookie at login — as the
|
|
105
|
+
* "authenticated" probe. Falls back to the in-memory user record if
|
|
106
|
+
* cookies are unreadable (SSR / non-browser test envs).
|
|
107
|
+
* Native: a token in SecureStore.
|
|
108
|
+
*/
|
|
109
|
+
static isAuthenticated(): Promise<boolean>;
|
|
110
|
+
static hasRole(role: "Admin" | "User"): Promise<boolean>;
|
|
111
|
+
static deleteAccount(password: string): Promise<void>;
|
|
112
|
+
static changePassword(currentPassword: string, newPassword: string, reWrappedKey?: {
|
|
113
|
+
symmetric_key_enc: string;
|
|
114
|
+
pbkdf2_salt: string;
|
|
115
|
+
}): Promise<void>;
|
|
116
|
+
static changeEmail(newEmail: string, password: string): Promise<void>;
|
|
117
|
+
static updateDisplayName(displayName: string): Promise<void>;
|
|
118
|
+
static setupMfa(): Promise<MfaSetupResponse>;
|
|
119
|
+
static verifyMfaSetup(code: string): Promise<void>;
|
|
120
|
+
static verifyMfa(code: string): Promise<void>;
|
|
121
|
+
static disableMfa(password: string): Promise<void>;
|
|
122
|
+
static forgotPassword(email: string): Promise<void>;
|
|
123
|
+
static validateResetCode(code: string): Promise<void>;
|
|
124
|
+
static resetPassword(code: string, newPassword: string): Promise<void>;
|
|
125
|
+
static verifyEmail(code: string): Promise<void>;
|
|
126
|
+
static resendVerification(): Promise<void>;
|
|
127
|
+
static completeOnboarding(): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Public server configuration (feature flags) — read pre-auth to adapt the
|
|
130
|
+
* UI, e.g. whether MFA enrollment is mandatory during onboarding. Returns
|
|
131
|
+
* permissive defaults if the endpoint is unavailable so onboarding never
|
|
132
|
+
* hard-blocks on a missing/older server.
|
|
133
|
+
*/
|
|
134
|
+
static getServerConfig(): Promise<ServerConfig>;
|
|
135
|
+
static validatePassword: typeof validatePasswordUtil;
|
|
136
|
+
static validateEmail: typeof validateEmailUtil;
|
|
137
|
+
static validateUsername: typeof validateUsernameUtil;
|
|
138
|
+
}
|
|
139
|
+
export default AuthService;
|
|
140
|
+
//# sourceMappingURL=auth.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"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"}
|