@strands.gg/accui 2.1.4 → 2.1.5
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/dist/index.d.ts +0 -1
- package/dist/nuxt/module.d.ts +0 -1
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.d.ts +0 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts +0 -1
- package/dist/nuxt/runtime/middleware/auth.d.ts +0 -1
- package/dist/nuxt/runtime/middleware/auth.global.d.ts +0 -1
- package/dist/nuxt/runtime/middleware/guest.d.ts +0 -1
- package/dist/nuxt/runtime/plugin.client.d.ts +0 -1
- package/dist/nuxt/runtime/plugin.server.d.ts +0 -1
- package/dist/nuxt/runtime/plugins/auth-interceptor.client.d.ts +0 -1
- package/dist/nuxt/types.d.ts +0 -1
- package/dist/nuxt-v4/module.d.ts +0 -1
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.d.ts +0 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.d.ts +0 -1
- package/dist/nuxt-v4/runtime/middleware/auth.global.d.ts +0 -1
- package/dist/nuxt-v4/runtime/plugin.client.d.ts +0 -1
- package/dist/nuxt-v4/runtime/plugin.server.d.ts +0 -1
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.d.ts +0 -1
- package/dist/nuxt-v4/types.d.ts +0 -1
- package/dist/nuxt-v4.d.ts +0 -1
- package/dist/nuxt.d.ts +0 -1
- package/dist/shared/defaults.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/slots.d.ts +0 -1
- package/dist/utils/validation.d.ts +0 -1
- package/dist/vue/components/SignedIn.vue.d.ts +0 -1
- package/dist/vue/components/SignedOut.vue.d.ts +0 -1
- package/dist/vue/components/StrandsAuth.vue.d.ts +0 -1
- package/dist/vue/components/StrandsBackupCodesModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsCompleteSignUp.vue.d.ts +0 -1
- package/dist/vue/components/StrandsConfigProvider.vue.d.ts +0 -1
- package/dist/vue/components/StrandsConfirmModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsEmailMfaSetupModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsHardwareKeySetupModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsLogo.vue.d.ts +0 -1
- package/dist/vue/components/StrandsMFASetup.vue.d.ts +0 -1
- package/dist/vue/components/StrandsMfaModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsMfaVerification.vue.d.ts +0 -1
- package/dist/vue/components/StrandsPasswordReset.vue.d.ts +0 -1
- package/dist/vue/components/StrandsSecuredFooter.vue.d.ts +0 -1
- package/dist/vue/components/StrandsSessionsModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsSettingsModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsSignIn.vue.d.ts +0 -1
- package/dist/vue/components/StrandsSignUp.vue.d.ts +0 -1
- package/dist/vue/components/StrandsTotpSetupModal.vue.d.ts +0 -1
- package/dist/vue/components/StrandsUserButton.vue.d.ts +0 -1
- package/dist/vue/components/StrandsUserProfile.vue.d.ts +0 -1
- package/dist/vue/components/SvgIcon.vue.d.ts +0 -1
- package/dist/vue/components/VirtualList.vue.d.ts +0 -1
- package/dist/vue/components/icons/IconGithub.vue.d.ts +0 -1
- package/dist/vue/components/icons/IconGoogle.vue.d.ts +0 -1
- package/dist/vue/components/icons/index.d.ts +0 -1
- package/dist/vue/components/index.d.ts +0 -1
- package/dist/vue/composables/useAuthenticatedFetch.d.ts +0 -1
- package/dist/vue/composables/useOAuthProviders.d.ts +0 -1
- package/dist/vue/composables/useStrandsAuth.d.ts +0 -1
- package/dist/vue/composables/useStrandsConfig.d.ts +0 -1
- package/dist/vue/composables/useStrandsMfa.d.ts +0 -1
- package/dist/vue/index.d.ts +0 -1
- package/dist/vue/plugins/StrandsUIPlugin.d.ts +0 -1
- package/dist/vue/ui/UiAlert.vue.d.ts +0 -1
- package/dist/vue/ui/UiAvatarEditor.vue.d.ts +0 -1
- package/dist/vue/ui/UiButton.vue.d.ts +0 -1
- package/dist/vue/ui/UiCard.vue.d.ts +0 -1
- package/dist/vue/ui/UiInput.vue.d.ts +0 -1
- package/dist/vue/ui/UiLevelProgress.vue.d.ts +0 -1
- package/dist/vue/ui/UiLink.vue.d.ts +0 -1
- package/dist/vue/ui/UiLoader.vue.d.ts +0 -1
- package/dist/vue/ui/UiModal.vue.d.ts +0 -1
- package/dist/vue/ui/UiTabs.vue.d.ts +0 -1
- package/dist/vue/ui/UiToggle.vue.d.ts +0 -1
- package/dist/vue/ui/index.d.ts +0 -1
- package/dist/vue/utils/contrast.d.ts +0 -1
- package/dist/vue/utils/debounce.d.ts +0 -1
- package/dist/vue/utils/fontPreloader.d.ts +0 -1
- package/dist/vue/utils/iconProps.d.ts +0 -1
- package/dist/vue/utils/lazyComponents.d.ts +0 -1
- package/dist/vue/utils/levels.d.ts +0 -1
- package/dist/vue/utils/performanceInit.d.ts +0 -1
- package/dist/vue/utils/requestCache.d.ts +0 -1
- package/dist/vue/utils/sounds.d.ts +0 -1
- package/package.json +11 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/nuxt/module.cjs.js.map +0 -1
- package/dist/nuxt/module.d.ts.map +0 -1
- package/dist/nuxt/module.es.js.map +0 -1
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.cjs.js.map +0 -1
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.d.ts.map +0 -1
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.es.js.map +0 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js.map +0 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts.map +0 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.es.js.map +0 -1
- package/dist/nuxt/runtime/middleware/auth.d.ts.map +0 -1
- package/dist/nuxt/runtime/middleware/auth.global.cjs.js.map +0 -1
- package/dist/nuxt/runtime/middleware/auth.global.d.ts.map +0 -1
- package/dist/nuxt/runtime/middleware/auth.global.es.js.map +0 -1
- package/dist/nuxt/runtime/middleware/guest.d.ts.map +0 -1
- package/dist/nuxt/runtime/plugin.client.cjs.js.map +0 -1
- package/dist/nuxt/runtime/plugin.client.d.ts.map +0 -1
- package/dist/nuxt/runtime/plugin.client.es.js.map +0 -1
- package/dist/nuxt/runtime/plugin.server.cjs.js.map +0 -1
- package/dist/nuxt/runtime/plugin.server.d.ts.map +0 -1
- package/dist/nuxt/runtime/plugin.server.es.js.map +0 -1
- package/dist/nuxt/runtime/plugins/auth-interceptor.client.cjs.js.map +0 -1
- package/dist/nuxt/runtime/plugins/auth-interceptor.client.d.ts.map +0 -1
- package/dist/nuxt/runtime/plugins/auth-interceptor.client.es.js.map +0 -1
- package/dist/nuxt/types.d.ts.map +0 -1
- package/dist/nuxt-v4/module.cjs.js.map +0 -1
- package/dist/nuxt-v4/module.d.ts.map +0 -1
- package/dist/nuxt-v4/module.es.js.map +0 -1
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.cjs.js.map +0 -1
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.d.ts.map +0 -1
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.es.js.map +0 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js.map +0 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.d.ts.map +0 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js.map +0 -1
- package/dist/nuxt-v4/runtime/middleware/auth.global.cjs.js.map +0 -1
- package/dist/nuxt-v4/runtime/middleware/auth.global.d.ts.map +0 -1
- package/dist/nuxt-v4/runtime/middleware/auth.global.es.js.map +0 -1
- package/dist/nuxt-v4/runtime/plugin.client.cjs.js.map +0 -1
- package/dist/nuxt-v4/runtime/plugin.client.d.ts.map +0 -1
- package/dist/nuxt-v4/runtime/plugin.client.es.js.map +0 -1
- package/dist/nuxt-v4/runtime/plugin.server.cjs.js.map +0 -1
- package/dist/nuxt-v4/runtime/plugin.server.d.ts.map +0 -1
- package/dist/nuxt-v4/runtime/plugin.server.es.js.map +0 -1
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.cjs.js.map +0 -1
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.d.ts.map +0 -1
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.es.js.map +0 -1
- package/dist/nuxt-v4/types.d.ts.map +0 -1
- package/dist/nuxt-v4.cjs.js.map +0 -1
- package/dist/nuxt-v4.d.ts.map +0 -1
- package/dist/nuxt-v4.es.js.map +0 -1
- package/dist/nuxt.cjs.js.map +0 -1
- package/dist/nuxt.d.ts.map +0 -1
- package/dist/nuxt.es.js.map +0 -1
- package/dist/shared/defaults.d.ts.map +0 -1
- package/dist/strands-auth-ui.cjs.js.map +0 -1
- package/dist/strands-auth-ui.es.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/useStrandsAuth-CTlaiFqK.cjs.map +0 -1
- package/dist/useStrandsAuth-Cev-PTun.js.map +0 -1
- package/dist/useStrandsConfig-Cxb360Os.js.map +0 -1
- package/dist/useStrandsConfig-Z9_36OcV.cjs.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/slots.d.ts.map +0 -1
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/vue/components/SignedIn.vue.d.ts.map +0 -1
- package/dist/vue/components/SignedOut.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsAuth.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsBackupCodesModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsCompleteSignUp.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsConfigProvider.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsConfirmModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsEmailMfaSetupModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsHardwareKeySetupModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsLogo.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsMFASetup.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsMfaModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsMfaVerification.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsPasswordReset.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsSecuredFooter.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsSessionsModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsSettingsModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsSignIn.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsSignUp.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsTotpSetupModal.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsUserButton.vue.d.ts.map +0 -1
- package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +0 -1
- package/dist/vue/components/SvgIcon.vue.d.ts.map +0 -1
- package/dist/vue/components/VirtualList.vue.d.ts.map +0 -1
- package/dist/vue/components/icons/IconGithub.vue.d.ts.map +0 -1
- package/dist/vue/components/icons/IconGoogle.vue.d.ts.map +0 -1
- package/dist/vue/components/icons/index.d.ts.map +0 -1
- package/dist/vue/components/index.d.ts.map +0 -1
- package/dist/vue/composables/useAuthenticatedFetch.d.ts.map +0 -1
- package/dist/vue/composables/useOAuthProviders.d.ts.map +0 -1
- package/dist/vue/composables/useStrandsAuth.d.ts.map +0 -1
- package/dist/vue/composables/useStrandsConfig.d.ts.map +0 -1
- package/dist/vue/composables/useStrandsMfa.d.ts.map +0 -1
- package/dist/vue/index.d.ts.map +0 -1
- package/dist/vue/plugins/StrandsUIPlugin.d.ts.map +0 -1
- package/dist/vue/ui/UiAlert.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiAvatarEditor.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiButton.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiCard.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiInput.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiLevelProgress.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiLink.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiLoader.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiModal.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiTabs.vue.d.ts.map +0 -1
- package/dist/vue/ui/UiToggle.vue.d.ts.map +0 -1
- package/dist/vue/ui/index.d.ts.map +0 -1
- package/dist/vue/utils/contrast.d.ts.map +0 -1
- package/dist/vue/utils/debounce.d.ts.map +0 -1
- package/dist/vue/utils/fontPreloader.d.ts.map +0 -1
- package/dist/vue/utils/iconProps.d.ts.map +0 -1
- package/dist/vue/utils/lazyComponents.d.ts.map +0 -1
- package/dist/vue/utils/levels.d.ts.map +0 -1
- package/dist/vue/utils/performanceInit.d.ts.map +0 -1
- package/dist/vue/utils/requestCache.d.ts.map +0 -1
- package/dist/vue/utils/sounds.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsAuth-CTlaiFqK.cjs","sources":["../../../apps/accounts-ui/src/vue/utils/requestCache.ts","../../../apps/accounts-ui/src/vue/utils/debounce.ts","../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["/**\n * Request deduplication and caching utility\n * Prevents duplicate API calls and provides simple caching\n */\n\ninterface CacheEntry {\n promise: Promise<any>\n timestamp: number\n ttl: number\n}\n\nclass RequestCache {\n private cache = new Map<string, CacheEntry>()\n private readonly DEFAULT_TTL = 5 * 60 * 1000 // 5 minutes\n\n /**\n * Memoized fetch - prevents duplicate requests and caches results\n */\n async fetch<T>(key: string, fetcher: () => Promise<T>, ttl = this.DEFAULT_TTL): Promise<T> {\n const now = Date.now()\n const entry = this.cache.get(key)\n\n // Return existing promise if still valid\n if (entry && (now - entry.timestamp) < entry.ttl) {\n return entry.promise\n }\n\n // Clean expired entries periodically\n this.cleanExpired()\n\n // Create new request\n const promise = fetcher().finally(() => {\n // Remove from cache after resolution to allow fresh requests\n setTimeout(() => {\n this.cache.delete(key)\n }, ttl)\n })\n\n // Cache the promise\n this.cache.set(key, {\n promise,\n timestamp: now,\n ttl\n })\n\n return promise\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.cache.clear()\n }\n\n /**\n * Remove a specific cache entry\n */\n invalidate(key: string): void {\n this.cache.delete(key)\n }\n\n /**\n * Clean expired cache entries\n */\n private cleanExpired(): void {\n const now = Date.now()\n for (const [key, entry] of this.cache.entries()) {\n if ((now - entry.timestamp) > entry.ttl) {\n this.cache.delete(key)\n }\n }\n }\n\n /**\n * Get cache statistics (for debugging)\n */\n getStats(): { size: number; entries: string[] } {\n return {\n size: this.cache.size,\n entries: Array.from(this.cache.keys())\n }\n }\n}\n\n// Global cache instance\nexport const requestCache = new RequestCache()\n\n/**\n * Composable for request deduplication\n */\nexport function useRequestCache() {\n return {\n fetch: requestCache.fetch.bind(requestCache),\n clear: requestCache.clear.bind(requestCache),\n invalidate: requestCache.invalidate.bind(requestCache),\n getStats: requestCache.getStats.bind(requestCache)\n }\n}\n\n/**\n * Generate cache key from URL and options\n */\nexport function getCacheKey(url: string, options?: RequestInit): string {\n const method = options?.method || 'GET'\n const body = options?.body ? JSON.stringify(options.body) : ''\n const headers = options?.headers ? JSON.stringify(options.headers) : ''\n \n return `${method}:${url}:${body}:${headers}`\n}","/**\n * Debounce utility for optimizing frequent operations\n */\n\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout)\n }\n \n timeout = setTimeout(() => {\n func(...args)\n }, wait)\n }\n}\n\n/**\n * Debounced localStorage setter\n */\nexport const debouncedSetItem = debounce((key: string, value: string) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(key, value)\n }\n}, 300)\n\n/**\n * Throttle utility for limiting function execution frequency\n */\nexport function throttle<T extends (...args: any[]) => void>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle: boolean\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args)\n inThrottle = true\n setTimeout(() => inThrottle = false, limit)\n }\n }\n}","import { ref, computed, onUnmounted } from 'vue'\nimport type { User, Session, SessionInfo, SessionStats, SignInCredentials, SignUpData, AuthResponse, MfaDevice, MfaErrorResponse } from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\nimport { useRequestCache, getCacheKey } from '../utils/requestCache'\nimport { debouncedSetItem } from '../utils/debounce'\n\n// Utility function to map API user data to frontend format\nconst mapApiUserToFrontend = (apiUser: any): User => {\n return {\n id: apiUser.id,\n email: apiUser.email,\n firstName: apiUser.first_name || apiUser.firstName || '',\n lastName: apiUser.last_name || apiUser.lastName || '',\n avatar: apiUser.avatar_url || apiUser.avatar,\n mfaEnabled: apiUser.mfa_enabled ?? apiUser.mfaEnabled ?? false,\n emailVerified: apiUser.email_verified ?? apiUser.emailVerified ?? false,\n passwordUpdatedAt: apiUser.password_updated_at || apiUser.passwordUpdatedAt,\n settings: apiUser.settings || {},\n xp: apiUser.xp || 0,\n level: apiUser.level || 1,\n next_level_xp: apiUser.next_level_xp || apiUser.next_level_xp || 4,\n username: apiUser.username,\n usernameLastChangedAt: apiUser.username_last_changed_at || apiUser.usernameLastChangedAt,\n createdAt: apiUser.created_at || apiUser.createdAt,\n updatedAt: apiUser.updated_at || apiUser.updatedAt || new Date().toISOString(),\n }\n}\n\n// Global state (shared across all instances) - initialized outside to be truly global\nconst globalState = {\n currentUser: ref<User | null>(null),\n currentSession: ref<Session | null>(null),\n loadingStates: ref({\n initializing: true,\n signingIn: false,\n signingUp: false,\n signingOut: false,\n refreshingToken: false,\n sendingMfaEmail: false,\n verifyingMfa: false,\n loadingProfile: false\n }),\n isInitialized: ref(false),\n mfaRequired: ref(false),\n mfaSessionId: ref<string | null>(null),\n availableMfaMethods: ref<MfaDevice[]>([])\n}\n\n// Token refresh timer and lock mechanism\nlet refreshTimer: NodeJS.Timeout | null = null\nlet refreshPromise: Promise<boolean> | null = null\n\nexport function useStrandsAuth() {\n const { getUrl } = useStrandsConfig()\n const { fetch: cachedFetch, clear: clearCache, invalidate } = useRequestCache()\n \n // Use the global state directly\n const { currentUser, currentSession, loadingStates, isInitialized, mfaRequired, mfaSessionId, availableMfaMethods } = globalState\n \n // Computed properties (created fresh each time but referencing same state)\n const isInitializing = computed(() => loadingStates.value.initializing)\n const isSigningIn = computed(() => loadingStates.value.signingIn)\n const isSigningUp = computed(() => loadingStates.value.signingUp)\n const isSigningOut = computed(() => loadingStates.value.signingOut)\n const isRefreshingToken = computed(() => loadingStates.value.refreshingToken)\n const isSendingMfaEmail = computed(() => loadingStates.value.sendingMfaEmail)\n const isVerifyingMfa = computed(() => loadingStates.value.verifyingMfa)\n const isLoadingProfile = computed(() => loadingStates.value.loadingProfile)\n\n // Legacy loading states for backward compatibility\n const loading = computed(() => \n loadingStates.value.signingIn || \n loadingStates.value.signingUp || \n loadingStates.value.signingOut || \n loadingStates.value.refreshingToken || \n loadingStates.value.sendingMfaEmail || \n loadingStates.value.verifyingMfa || \n loadingStates.value.loadingProfile\n )\n const isLoading = computed(() => loadingStates.value.initializing || loading.value)\n\n // Loading messages for better UX\n const loadingMessage = computed(() => {\n const states = loadingStates.value\n if (states.initializing) return 'Checking authentication...'\n if (states.signingIn) return 'Signing you in...'\n if (states.signingUp) return 'Creating your account...'\n if (states.signingOut) return 'Signing you out...'\n if (states.refreshingToken) return 'Refreshing session...'\n if (states.sendingMfaEmail) return 'Sending verification code...'\n if (states.verifyingMfa) return 'Verifying code...'\n if (states.loadingProfile) return 'Loading profile...'\n return 'Loading...' // Fallback\n })\n \n // Helper function to get authenticated headers with refresh token\n const getAuthHeaders = () => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n // Check if token is expired\n const now = new Date()\n const expiresAt = currentSession.value.expiresAt\n const isExpired = expiresAt <= now\n \n if (isExpired) {\n // Token is expired, but we'll let the API handle the 401 response\n }\n \n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n }\n \n // Include refresh token for session management\n if (currentSession.value?.refreshToken) {\n headers['x-refresh-token'] = currentSession.value.refreshToken\n }\n \n return headers\n }\n /**\n * Complete hardware key (WebAuthn) registration for MFA\n * Returns result with backup codes on success\n */\n const completeHardwareKeyRegistration = async (deviceId: string, credential: any, accessToken: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(getUrl('mfaHardwareCompleteRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n },\n body: JSON.stringify({\n device_id: deviceId,\n credential: credential\n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to complete hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to complete hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n /**\n * Register a hardware key (WebAuthn) for MFA\n * Returns { device_id, challenge } on success\n */\n const registerHardwareKey = async (deviceName: string, accessToken: string, deviceType: 'hardware' | 'passkey' = 'hardware') => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n const response = await fetch(getUrl('mfaHardwareStartRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({ \n device_name: deviceName,\n device_type: deviceType \n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to start hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to start hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n loadingStates.value.signingIn = true\n try {\n // Reset MFA state at start of new sign-in attempt\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Prepare headers with session context information\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n \n // Note: User-Agent is set automatically by the browser and cannot be overridden for security reasons\n // The browser will send the correct User-Agent header automatically\n \n // Add Origin header for session tracking\n if (typeof window !== 'undefined' && window.location) {\n headers['Origin'] = window.location.origin\n }\n \n // Make API call to sign-in endpoint\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers,\n body: JSON.stringify(credentials),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const authData: AuthResponse = await response.json()\n \n // Check if MFA is required\n if (authData.mfa_required) {\n mfaRequired.value = true\n mfaSessionId.value = authData.mfa_session_id || null\n \n // Convert API MFA methods to the expected format\n const methods = (authData.available_mfa_methods || []).map((method: any) => {\n // Create better fallback names for different device types\n let fallbackName = `${method.device_type.charAt(0).toUpperCase() + method.device_type.slice(1)} Authentication`\n \n if (method.device_type === 'hardware') {\n // Better names for hardware keys\n fallbackName = method.device_name || 'Security Key' // Could be YubiKey, FIDO2 Key, etc.\n } else if (method.device_type === 'totp') {\n fallbackName = method.device_name || 'Authenticator App'\n } else if (method.device_type === 'email') {\n fallbackName = method.device_name || 'Email Verification'\n }\n \n return {\n id: method.device_id,\n device_type: method.device_type,\n device_name: method.device_name || fallbackName,\n is_active: true,\n created_at: new Date().toISOString(),\n last_used_at: method.last_used_at,\n // Pass through additional metadata if available\n credential_id: method.credential_id,\n device_info: method.device_info\n }\n })\n availableMfaMethods.value = methods\n \n // Set signIn loading to false immediately so MFA modal can show\n loadingStates.value.signingIn = false\n \n return authData // Return without storing full auth data\n }\n \n // Store the authentication data if MFA not required\n await setAuthData(authData)\n \n return authData\n } catch (error) {\n throw error\n } finally {\n loadingStates.value.signingIn = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n loadingStates.value.signingUp = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signUp(userData)\n \n throw new Error('Sign up not implemented - please integrate with auth SDK')\n } finally {\n loadingStates.value.signingUp = false\n }\n }\n\n const signOut = async () => {\n loadingStates.value.signingOut = true\n try {\n // Stop token refresh timer\n stopTokenRefreshTimer()\n \n // Clear any pending refresh promise\n refreshPromise = null\n \n // Clear request cache\n clearCache()\n \n // Clear user and session state\n currentUser.value = null\n currentSession.value = null\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Clear stored tokens\n if (typeof window !== 'undefined') {\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } finally {\n loadingStates.value.signingOut = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value?.refreshToken) {\n return false\n }\n \n // If a refresh is already in progress, wait for it to complete\n if (refreshPromise) {\n console.log('Token refresh already in progress, waiting for completion...')\n return await refreshPromise\n }\n \n // Create a new refresh promise and store it\n refreshPromise = (async () => {\n loadingStates.value.refreshingToken = true\n try {\n const response = await fetch(getUrl('refresh'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: currentSession.value!.refreshToken,\n }),\n })\n\n if (!response.ok) { \n if (response.status === 401) {\n // Refresh token is invalid/expired, sign out user\n await signOut()\n return false\n }\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`)\n }\n\n const tokenData = await response.json()\n \n // Token refresh now returns full AuthResponse with user data\n if (tokenData.user) {\n // Update user data with fresh information from the server\n currentUser.value = mapApiUserToFrontend(tokenData.user)\n \n // Update localStorage with fresh user data (immediate)\n if (currentUser.value && typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n // Update session with fresh tokens\n const newSession: Session = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes from now\n userId: tokenData.user?.id || currentUser.value?.id,\n }\n \n currentSession.value = newSession\n \n // Update localStorage with new session (immediate)\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(newSession))\n }\n \n // Restart token refresh timer\n startTokenRefreshTimer()\n \n // Invalidate sessions cache to force refresh on next access\n invalidate(`sessions:${currentSession.value.accessToken.slice(0, 20)}`)\n \n return true\n } catch (error) {\n // On refresh failure, sign out the user\n await signOut()\n return false\n } finally {\n loadingStates.value.refreshingToken = false\n }\n })()\n \n // Wait for the refresh to complete and clear the promise\n const result = await refreshPromise\n refreshPromise = null\n return result\n }\n\n const fetchProfile = async (): Promise<User | null> => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n // Use request deduplication for profile fetching\n const cacheKey = `profile:${currentSession.value.accessToken.slice(0, 20)}`\n \n loadingStates.value.loadingProfile = true\n try {\n return await cachedFetch(cacheKey, async () => {\n const response = await fetch(getUrl('profile'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value?.accessToken}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Failed to fetch profile: ${response.status} ${response.statusText}`)\n }\n }\n\n const userData = await response.json()\n \n // Update the current user state using the mapping utility\n currentUser.value = mapApiUserToFrontend(userData)\n \n // Update localStorage (immediate)\n if (currentUser.value && typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n })\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('profile'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n first_name: profileData.firstName,\n last_name: profileData.lastName,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Profile update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state using the mapping utility\n currentUser.value = mapApiUserToFrontend(updatedUserData)\n \n // Update localStorage (debounced)\n if (currentUser.value) {\n debouncedSetItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const updateUserSettings = async (settings: any) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('settings'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n settings: settings,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Settings update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state using the mapping utility\n currentUser.value = mapApiUserToFrontend(updatedUserData)\n \n // Update localStorage (debounced)\n if (currentUser.value) {\n debouncedSetItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const changeEmail = async (newEmail: string, password: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('changeEmail'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n new_email: newEmail,\n password: password,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Email change failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result = await response.json()\n \n // For email change, we need to manually update some fields since API might not return full user\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n email: newEmail,\n emailVerified: false, // Email needs to be verified again\n updatedAt: new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return result\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const verifyMfa = async (deviceId: string, code: string, isBackupCode = false) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n loadingStates.value.verifyingMfa = true\n try {\n const endpoint = isBackupCode ? getUrl('mfaBackupCodeVerify') : getUrl('mfaSigninVerify')\n const body = isBackupCode \n ? { mfa_session_id: mfaSessionId.value, backup_code: code }\n : { mfa_session_id: mfaSessionId.value, device_id: deviceId, code }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'MFA verification failed'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'MFA verification failed'\n }\n \n throw new Error(errorMessage)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Store the authentication data\n await setAuthData(authData)\n \n return authData\n } finally {\n loadingStates.value.verifyingMfa = false\n }\n }\n\n const sendMfaEmailCode = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n loadingStates.value.sendingMfaEmail = true\n try {\n const response = await fetch(getUrl('mfaSigninSendEmail'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId,\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to send MFA email code'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'Failed to send MFA email code'\n }\n \n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return result\n } finally {\n loadingStates.value.sendingMfaEmail = false\n }\n }\n\n const getMfaWebAuthnChallenge = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n \n const response = await fetch(getUrl('mfaWebAuthnChallenge'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to get WebAuthn challenge'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || errorMessage\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n const setAuthData = async (authResponse: AuthResponse) => {\n try {\n // Handle user data (only for sign-in/sign-up, not token refresh)\n if (authResponse.user) {\n currentUser.value = mapApiUserToFrontend(authResponse.user)\n }\n \n // Create session object\n const session: Session = {\n accessToken: authResponse.access_token,\n refreshToken: authResponse.refresh_token,\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes from now (matching API token expiry)\n userId: currentUser.value?.id || authResponse.user?.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence (immediate for critical auth data)\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n if (currentUser.value) {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n // Start automatic token refresh\n startTokenRefreshTimer()\n } catch (error) {\n // Silently handle auth data storage errors\n }\n }\n\n // Token refresh timer management with visibility optimization\n const startTokenRefreshTimer = () => {\n // Clear existing timer\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n }\n \n if (!currentSession.value) return\n \n // Only start timer if page is visible (performance optimization)\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return\n }\n \n // Calculate time until token expires (refresh 1 minute before expiry)\n const now = new Date()\n const expiresAt = currentSession.value.expiresAt\n const timeUntilRefresh = expiresAt.getTime() - now.getTime() - (1 * 60 * 1000) // 1 minute before expiry\n \n // If token is already expired or expires very soon, refresh immediately\n if (timeUntilRefresh <= 0) {\n refreshToken()\n return\n }\n \n // Set timer to refresh token\n refreshTimer = setTimeout(async () => {\n // Double-check page is still visible before refreshing\n if (typeof document === 'undefined' || document.visibilityState === 'visible') {\n const success = await refreshToken()\n \n if (success) {\n // Schedule next refresh\n startTokenRefreshTimer()\n }\n }\n }, timeUntilRefresh)\n }\n\n const stopTokenRefreshTimer = () => {\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n refreshTimer = null\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n loadingStates.value.initializing = true\n try {\n // Check for existing session/token in localStorage\n if (typeof window !== 'undefined') {\n const storedSession = localStorage.getItem('strands_auth_session')\n const storedUser = localStorage.getItem('strands_auth_user')\n \n if (storedSession && storedUser) {\n try {\n const session = JSON.parse(storedSession) as Session\n const user = JSON.parse(storedUser) as User\n \n // Convert expiresAt back to Date object\n session.expiresAt = new Date(session.expiresAt)\n \n // Check if session is still valid\n if (session.expiresAt > new Date()) {\n currentSession.value = session\n currentUser.value = user\n \n // Start token refresh timer for restored session\n startTokenRefreshTimer()\n } else {\n // Session expired, clear storage\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } catch (error) {\n // Clear corrupted data\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n }\n }\n \n isInitialized.value = true\n \n // Add a small delay to ensure state is fully settled before hiding loading\n await new Promise(resolve => setTimeout(resolve, 50))\n } catch (error) {\n // Silently handle initialization errors\n } finally {\n loadingStates.value.initializing = false\n }\n }\n\n const changeUsername = async (newUsername: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('changeUsername'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n username: newUsername,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n if (response.status === 409) {\n throw new Error('Username is already taken')\n } else if (errorData.cooldown_end) {\n throw new Error(`You can only change your username once every 30 days. You can change it again on ${new Date(errorData.cooldown_end).toLocaleDateString()}`)\n }\n throw new Error(errorData.message || `Username change failed: ${response.status} ${response.statusText}`)\n }\n\n const result = await response.json()\n \n // For username change, we need to manually update some fields since API might not return full user\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n username: newUsername,\n usernameLastChangedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return result\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const getUsernameCooldown = async () => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n const response = await fetch(getUrl('usernameCooldown'), {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get username cooldown: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n\n const checkUsernameAvailability = async (username: string) => {\n // Replace {username} in the URL\n const url = getUrl('checkUsernameAvailability').replace('{username}', encodeURIComponent(username))\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to check username availability: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n\n // Session management functions\n const getUserSessions = async () => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n // Use request deduplication for sessions\n const cacheKey = `sessions:${currentSession.value.accessToken.slice(0, 20)}`\n \n try {\n return await cachedFetch(cacheKey, async () => {\n const headers = getAuthHeaders()\n \n const response = await fetch(getUrl('sessions'), {\n method: 'GET',\n headers,\n })\n \n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to get user sessions: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }, 2 * 60 * 1000) // Cache for 2 minutes\n } catch (error) {\n throw error\n }\n }\n\n const getSessionStats = async () => {\n const response = await fetch(getUrl('sessionsStats'), {\n method: 'GET',\n headers: getAuthHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get session stats: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n\n const revokeSession = async (sessionId: string) => {\n const url = getUrl('sessionRevoke').replace('{session_id}', encodeURIComponent(sessionId))\n \n const response = await fetch(url, {\n method: 'POST',\n headers: getAuthHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to revoke session: ${response.status} ${response.statusText}`)\n }\n\n return response.status === 200\n }\n\n const revokeAllOtherSessions = async () => {\n const response = await fetch(getUrl('sessionsRevokeAll'), {\n method: 'POST',\n headers: getAuthHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to revoke all other sessions: ${response.status} ${response.statusText}`)\n }\n\n return response.status === 200\n }\n\n // Visibility change listener for performance optimization\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible' && currentSession.value) {\n // Resume token refresh when page becomes visible\n startTokenRefreshTimer()\n } else if (document.visibilityState === 'hidden') {\n // Stop timer when page is hidden to save resources\n stopTokenRefreshTimer()\n }\n })\n }\n\n // Cleanup function\n const cleanup = () => {\n stopTokenRefreshTimer()\n clearCache()\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', () => {})\n }\n }\n\n // Setup onUnmounted cleanup (only if in component context)\n try {\n onUnmounted(cleanup)\n } catch (e) {\n // If not in component context, onUnmounted will throw - that's okay\n // The cleanup will happen when the page unloads or the module is reloaded\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value || !isInitialized.value),\n loading: computed(() => loading.value),\n loadingMessage,\n \n // Specific loading states\n isInitializing,\n isSigningIn,\n isSigningUp,\n isSigningOut,\n isRefreshingToken,\n isSendingMfaEmail,\n isVerifyingMfa,\n \n // MFA State\n mfaRequired: computed(() => mfaRequired.value),\n mfaSessionId: computed(() => mfaSessionId.value),\n availableMfaMethods: computed(() => availableMfaMethods.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n fetchProfile,\n updateProfile,\n updateUserSettings,\n changeEmail,\n changeUsername,\n getUsernameCooldown,\n checkUsernameAvailability,\n // Session management\n getUserSessions,\n getSessionStats,\n revokeSession,\n revokeAllOtherSessions,\n initialize,\n setAuthData,\n verifyMfa,\n sendMfaEmailCode,\n getMfaWebAuthnChallenge,\n registerHardwareKey,\n completeHardwareKeyRegistration,\n \n // Token management\n startTokenRefreshTimer,\n stopTokenRefreshTimer,\n getAuthHeaders,\n \n // Force re-initialization (useful for testing or navigation)\n forceReInit: () => {\n isInitialized.value = false\n loadingStates.value.initializing = true\n initialize()\n },\n }\n}"],"names":["requestCache","cache","Map","DEFAULT_TTL","fetch","key","fetcher","ttl","this","now","Date","entry","get","timestamp","promise","cleanExpired","finally","setTimeout","delete","set","clear","invalidate","entries","getStats","size","Array","from","keys","debouncedSetItem","func","wait","timeout","args","clearTimeout","debounce","value","window","localStorage","setItem","mapApiUserToFrontend","apiUser","id","email","firstName","first_name","lastName","last_name","avatar","avatar_url","mfaEnabled","mfa_enabled","emailVerified","email_verified","passwordUpdatedAt","password_updated_at","settings","xp","level","next_level_xp","username","usernameLastChangedAt","username_last_changed_at","createdAt","created_at","updatedAt","updated_at","toISOString","globalState","currentUser","ref","currentSession","loadingStates","initializing","signingIn","signingUp","signingOut","refreshingToken","sendingMfaEmail","verifyingMfa","loadingProfile","isInitialized","mfaRequired","mfaSessionId","availableMfaMethods","refreshTimer","refreshPromise","getUrl","useStrandsConfig","cachedFetch","clearCache","bind","isInitializing","computed","isSigningIn","isSigningUp","isSigningOut","isRefreshingToken","isSendingMfaEmail","isVerifyingMfa","loading","isLoading","loadingMessage","states","getAuthHeaders","accessToken","Error","expiresAt","headers","Authorization","refreshToken","isAuthenticated","signOut","async","stopTokenRefreshTimer","removeItem","response","method","body","JSON","stringify","refresh_token","ok","status","statusText","tokenData","json","user","newSession","access_token","userId","startTokenRefreshTimer","slice","error","result","setAuthData","authResponse","session","document","visibilityState","timeUntilRefresh","getTime","initialize","storedSession","getItem","storedUser","parse","Promise","resolve","addEventListener","cleanup","removeEventListener","onUnmounted","e","signIn","credentials","location","origin","authData","mfa_required","mfa_session_id","methods","available_mfa_methods","map","fallbackName","device_type","charAt","toUpperCase","device_name","device_id","is_active","last_used_at","credential_id","device_info","signUp","userData","fetchProfile","cacheKey","updateProfile","profileData","updatedUserData","updateUserSettings","changeEmail","newEmail","password","new_email","errorData","catch","message","changeUsername","newUsername","cooldown_end","toLocaleDateString","getUsernameCooldown","checkUsernameAvailability","url","replace","encodeURIComponent","getUserSessions","text","getSessionStats","revokeSession","sessionId","revokeAllOtherSessions","verifyMfa","deviceId","code","isBackupCode","endpoint","backup_code","errorText","errorMessage","sendMfaEmailCode","getMfaWebAuthnChallenge","registerHardwareKey","deviceName","deviceType","completeHardwareKeyRegistration","credential","forceReInit"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsAuth-Cev-PTun.js","sources":["../../../apps/accounts-ui/src/vue/utils/requestCache.ts","../../../apps/accounts-ui/src/vue/utils/debounce.ts","../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["/**\n * Request deduplication and caching utility\n * Prevents duplicate API calls and provides simple caching\n */\n\ninterface CacheEntry {\n promise: Promise<any>\n timestamp: number\n ttl: number\n}\n\nclass RequestCache {\n private cache = new Map<string, CacheEntry>()\n private readonly DEFAULT_TTL = 5 * 60 * 1000 // 5 minutes\n\n /**\n * Memoized fetch - prevents duplicate requests and caches results\n */\n async fetch<T>(key: string, fetcher: () => Promise<T>, ttl = this.DEFAULT_TTL): Promise<T> {\n const now = Date.now()\n const entry = this.cache.get(key)\n\n // Return existing promise if still valid\n if (entry && (now - entry.timestamp) < entry.ttl) {\n return entry.promise\n }\n\n // Clean expired entries periodically\n this.cleanExpired()\n\n // Create new request\n const promise = fetcher().finally(() => {\n // Remove from cache after resolution to allow fresh requests\n setTimeout(() => {\n this.cache.delete(key)\n }, ttl)\n })\n\n // Cache the promise\n this.cache.set(key, {\n promise,\n timestamp: now,\n ttl\n })\n\n return promise\n }\n\n /**\n * Clear all cached entries\n */\n clear(): void {\n this.cache.clear()\n }\n\n /**\n * Remove a specific cache entry\n */\n invalidate(key: string): void {\n this.cache.delete(key)\n }\n\n /**\n * Clean expired cache entries\n */\n private cleanExpired(): void {\n const now = Date.now()\n for (const [key, entry] of this.cache.entries()) {\n if ((now - entry.timestamp) > entry.ttl) {\n this.cache.delete(key)\n }\n }\n }\n\n /**\n * Get cache statistics (for debugging)\n */\n getStats(): { size: number; entries: string[] } {\n return {\n size: this.cache.size,\n entries: Array.from(this.cache.keys())\n }\n }\n}\n\n// Global cache instance\nexport const requestCache = new RequestCache()\n\n/**\n * Composable for request deduplication\n */\nexport function useRequestCache() {\n return {\n fetch: requestCache.fetch.bind(requestCache),\n clear: requestCache.clear.bind(requestCache),\n invalidate: requestCache.invalidate.bind(requestCache),\n getStats: requestCache.getStats.bind(requestCache)\n }\n}\n\n/**\n * Generate cache key from URL and options\n */\nexport function getCacheKey(url: string, options?: RequestInit): string {\n const method = options?.method || 'GET'\n const body = options?.body ? JSON.stringify(options.body) : ''\n const headers = options?.headers ? JSON.stringify(options.headers) : ''\n \n return `${method}:${url}:${body}:${headers}`\n}","/**\n * Debounce utility for optimizing frequent operations\n */\n\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout)\n }\n \n timeout = setTimeout(() => {\n func(...args)\n }, wait)\n }\n}\n\n/**\n * Debounced localStorage setter\n */\nexport const debouncedSetItem = debounce((key: string, value: string) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(key, value)\n }\n}, 300)\n\n/**\n * Throttle utility for limiting function execution frequency\n */\nexport function throttle<T extends (...args: any[]) => void>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let inThrottle: boolean\n \n return (...args: Parameters<T>) => {\n if (!inThrottle) {\n func(...args)\n inThrottle = true\n setTimeout(() => inThrottle = false, limit)\n }\n }\n}","import { ref, computed, onUnmounted } from 'vue'\nimport type { User, Session, SessionInfo, SessionStats, SignInCredentials, SignUpData, AuthResponse, MfaDevice, MfaErrorResponse } from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\nimport { useRequestCache, getCacheKey } from '../utils/requestCache'\nimport { debouncedSetItem } from '../utils/debounce'\n\n// Utility function to map API user data to frontend format\nconst mapApiUserToFrontend = (apiUser: any): User => {\n return {\n id: apiUser.id,\n email: apiUser.email,\n firstName: apiUser.first_name || apiUser.firstName || '',\n lastName: apiUser.last_name || apiUser.lastName || '',\n avatar: apiUser.avatar_url || apiUser.avatar,\n mfaEnabled: apiUser.mfa_enabled ?? apiUser.mfaEnabled ?? false,\n emailVerified: apiUser.email_verified ?? apiUser.emailVerified ?? false,\n passwordUpdatedAt: apiUser.password_updated_at || apiUser.passwordUpdatedAt,\n settings: apiUser.settings || {},\n xp: apiUser.xp || 0,\n level: apiUser.level || 1,\n next_level_xp: apiUser.next_level_xp || apiUser.next_level_xp || 4,\n username: apiUser.username,\n usernameLastChangedAt: apiUser.username_last_changed_at || apiUser.usernameLastChangedAt,\n createdAt: apiUser.created_at || apiUser.createdAt,\n updatedAt: apiUser.updated_at || apiUser.updatedAt || new Date().toISOString(),\n }\n}\n\n// Global state (shared across all instances) - initialized outside to be truly global\nconst globalState = {\n currentUser: ref<User | null>(null),\n currentSession: ref<Session | null>(null),\n loadingStates: ref({\n initializing: true,\n signingIn: false,\n signingUp: false,\n signingOut: false,\n refreshingToken: false,\n sendingMfaEmail: false,\n verifyingMfa: false,\n loadingProfile: false\n }),\n isInitialized: ref(false),\n mfaRequired: ref(false),\n mfaSessionId: ref<string | null>(null),\n availableMfaMethods: ref<MfaDevice[]>([])\n}\n\n// Token refresh timer and lock mechanism\nlet refreshTimer: NodeJS.Timeout | null = null\nlet refreshPromise: Promise<boolean> | null = null\n\nexport function useStrandsAuth() {\n const { getUrl } = useStrandsConfig()\n const { fetch: cachedFetch, clear: clearCache, invalidate } = useRequestCache()\n \n // Use the global state directly\n const { currentUser, currentSession, loadingStates, isInitialized, mfaRequired, mfaSessionId, availableMfaMethods } = globalState\n \n // Computed properties (created fresh each time but referencing same state)\n const isInitializing = computed(() => loadingStates.value.initializing)\n const isSigningIn = computed(() => loadingStates.value.signingIn)\n const isSigningUp = computed(() => loadingStates.value.signingUp)\n const isSigningOut = computed(() => loadingStates.value.signingOut)\n const isRefreshingToken = computed(() => loadingStates.value.refreshingToken)\n const isSendingMfaEmail = computed(() => loadingStates.value.sendingMfaEmail)\n const isVerifyingMfa = computed(() => loadingStates.value.verifyingMfa)\n const isLoadingProfile = computed(() => loadingStates.value.loadingProfile)\n\n // Legacy loading states for backward compatibility\n const loading = computed(() => \n loadingStates.value.signingIn || \n loadingStates.value.signingUp || \n loadingStates.value.signingOut || \n loadingStates.value.refreshingToken || \n loadingStates.value.sendingMfaEmail || \n loadingStates.value.verifyingMfa || \n loadingStates.value.loadingProfile\n )\n const isLoading = computed(() => loadingStates.value.initializing || loading.value)\n\n // Loading messages for better UX\n const loadingMessage = computed(() => {\n const states = loadingStates.value\n if (states.initializing) return 'Checking authentication...'\n if (states.signingIn) return 'Signing you in...'\n if (states.signingUp) return 'Creating your account...'\n if (states.signingOut) return 'Signing you out...'\n if (states.refreshingToken) return 'Refreshing session...'\n if (states.sendingMfaEmail) return 'Sending verification code...'\n if (states.verifyingMfa) return 'Verifying code...'\n if (states.loadingProfile) return 'Loading profile...'\n return 'Loading...' // Fallback\n })\n \n // Helper function to get authenticated headers with refresh token\n const getAuthHeaders = () => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n // Check if token is expired\n const now = new Date()\n const expiresAt = currentSession.value.expiresAt\n const isExpired = expiresAt <= now\n \n if (isExpired) {\n // Token is expired, but we'll let the API handle the 401 response\n }\n \n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n }\n \n // Include refresh token for session management\n if (currentSession.value?.refreshToken) {\n headers['x-refresh-token'] = currentSession.value.refreshToken\n }\n \n return headers\n }\n /**\n * Complete hardware key (WebAuthn) registration for MFA\n * Returns result with backup codes on success\n */\n const completeHardwareKeyRegistration = async (deviceId: string, credential: any, accessToken: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(getUrl('mfaHardwareCompleteRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n },\n body: JSON.stringify({\n device_id: deviceId,\n credential: credential\n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to complete hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to complete hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n /**\n * Register a hardware key (WebAuthn) for MFA\n * Returns { device_id, challenge } on success\n */\n const registerHardwareKey = async (deviceName: string, accessToken: string, deviceType: 'hardware' | 'passkey' = 'hardware') => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n const response = await fetch(getUrl('mfaHardwareStartRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({ \n device_name: deviceName,\n device_type: deviceType \n })\n })\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to start hardware key registration'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || 'Failed to start hardware key registration'\n }\n \n throw new Error(errorMessage)\n }\n return response.json()\n }\n\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n loadingStates.value.signingIn = true\n try {\n // Reset MFA state at start of new sign-in attempt\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Prepare headers with session context information\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n \n // Note: User-Agent is set automatically by the browser and cannot be overridden for security reasons\n // The browser will send the correct User-Agent header automatically\n \n // Add Origin header for session tracking\n if (typeof window !== 'undefined' && window.location) {\n headers['Origin'] = window.location.origin\n }\n \n // Make API call to sign-in endpoint\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers,\n body: JSON.stringify(credentials),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const authData: AuthResponse = await response.json()\n \n // Check if MFA is required\n if (authData.mfa_required) {\n mfaRequired.value = true\n mfaSessionId.value = authData.mfa_session_id || null\n \n // Convert API MFA methods to the expected format\n const methods = (authData.available_mfa_methods || []).map((method: any) => {\n // Create better fallback names for different device types\n let fallbackName = `${method.device_type.charAt(0).toUpperCase() + method.device_type.slice(1)} Authentication`\n \n if (method.device_type === 'hardware') {\n // Better names for hardware keys\n fallbackName = method.device_name || 'Security Key' // Could be YubiKey, FIDO2 Key, etc.\n } else if (method.device_type === 'totp') {\n fallbackName = method.device_name || 'Authenticator App'\n } else if (method.device_type === 'email') {\n fallbackName = method.device_name || 'Email Verification'\n }\n \n return {\n id: method.device_id,\n device_type: method.device_type,\n device_name: method.device_name || fallbackName,\n is_active: true,\n created_at: new Date().toISOString(),\n last_used_at: method.last_used_at,\n // Pass through additional metadata if available\n credential_id: method.credential_id,\n device_info: method.device_info\n }\n })\n availableMfaMethods.value = methods\n \n // Set signIn loading to false immediately so MFA modal can show\n loadingStates.value.signingIn = false\n \n return authData // Return without storing full auth data\n }\n \n // Store the authentication data if MFA not required\n await setAuthData(authData)\n \n return authData\n } catch (error) {\n throw error\n } finally {\n loadingStates.value.signingIn = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n loadingStates.value.signingUp = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signUp(userData)\n \n throw new Error('Sign up not implemented - please integrate with auth SDK')\n } finally {\n loadingStates.value.signingUp = false\n }\n }\n\n const signOut = async () => {\n loadingStates.value.signingOut = true\n try {\n // Stop token refresh timer\n stopTokenRefreshTimer()\n \n // Clear any pending refresh promise\n refreshPromise = null\n \n // Clear request cache\n clearCache()\n \n // Clear user and session state\n currentUser.value = null\n currentSession.value = null\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Clear stored tokens\n if (typeof window !== 'undefined') {\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } finally {\n loadingStates.value.signingOut = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value?.refreshToken) {\n return false\n }\n \n // If a refresh is already in progress, wait for it to complete\n if (refreshPromise) {\n console.log('Token refresh already in progress, waiting for completion...')\n return await refreshPromise\n }\n \n // Create a new refresh promise and store it\n refreshPromise = (async () => {\n loadingStates.value.refreshingToken = true\n try {\n const response = await fetch(getUrl('refresh'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n refresh_token: currentSession.value!.refreshToken,\n }),\n })\n\n if (!response.ok) { \n if (response.status === 401) {\n // Refresh token is invalid/expired, sign out user\n await signOut()\n return false\n }\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`)\n }\n\n const tokenData = await response.json()\n \n // Token refresh now returns full AuthResponse with user data\n if (tokenData.user) {\n // Update user data with fresh information from the server\n currentUser.value = mapApiUserToFrontend(tokenData.user)\n \n // Update localStorage with fresh user data (immediate)\n if (currentUser.value && typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n // Update session with fresh tokens\n const newSession: Session = {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes from now\n userId: tokenData.user?.id || currentUser.value?.id,\n }\n \n currentSession.value = newSession\n \n // Update localStorage with new session (immediate)\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(newSession))\n }\n \n // Restart token refresh timer\n startTokenRefreshTimer()\n \n // Invalidate sessions cache to force refresh on next access\n invalidate(`sessions:${currentSession.value.accessToken.slice(0, 20)}`)\n \n return true\n } catch (error) {\n // On refresh failure, sign out the user\n await signOut()\n return false\n } finally {\n loadingStates.value.refreshingToken = false\n }\n })()\n \n // Wait for the refresh to complete and clear the promise\n const result = await refreshPromise\n refreshPromise = null\n return result\n }\n\n const fetchProfile = async (): Promise<User | null> => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n // Use request deduplication for profile fetching\n const cacheKey = `profile:${currentSession.value.accessToken.slice(0, 20)}`\n \n loadingStates.value.loadingProfile = true\n try {\n return await cachedFetch(cacheKey, async () => {\n const response = await fetch(getUrl('profile'), {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value?.accessToken}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Failed to fetch profile: ${response.status} ${response.statusText}`)\n }\n }\n\n const userData = await response.json()\n \n // Update the current user state using the mapping utility\n currentUser.value = mapApiUserToFrontend(userData)\n \n // Update localStorage (immediate)\n if (currentUser.value && typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n })\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('profile'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n first_name: profileData.firstName,\n last_name: profileData.lastName,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Profile update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state using the mapping utility\n currentUser.value = mapApiUserToFrontend(updatedUserData)\n \n // Update localStorage (debounced)\n if (currentUser.value) {\n debouncedSetItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const updateUserSettings = async (settings: any) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('settings'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n settings: settings,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n throw new Error(`Settings update failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const updatedUserData = await response.json()\n \n // Update the current user state using the mapping utility\n currentUser.value = mapApiUserToFrontend(updatedUserData)\n \n // Update localStorage (debounced)\n if (currentUser.value) {\n debouncedSetItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n \n return currentUser.value\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const changeEmail = async (newEmail: string, password: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('changeEmail'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n new_email: newEmail,\n password: password,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Authentication expired. Please sign in again.')\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Email change failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result = await response.json()\n \n // For email change, we need to manually update some fields since API might not return full user\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n email: newEmail,\n emailVerified: false, // Email needs to be verified again\n updatedAt: new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return result\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const verifyMfa = async (deviceId: string, code: string, isBackupCode = false) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n loadingStates.value.verifyingMfa = true\n try {\n const endpoint = isBackupCode ? getUrl('mfaBackupCodeVerify') : getUrl('mfaSigninVerify')\n const body = isBackupCode \n ? { mfa_session_id: mfaSessionId.value, backup_code: code }\n : { mfa_session_id: mfaSessionId.value, device_id: deviceId, code }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'MFA verification failed'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'MFA verification failed'\n }\n \n throw new Error(errorMessage)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Clear MFA state\n mfaRequired.value = false\n mfaSessionId.value = null\n availableMfaMethods.value = []\n \n // Store the authentication data\n await setAuthData(authData)\n \n return authData\n } finally {\n loadingStates.value.verifyingMfa = false\n }\n }\n\n const sendMfaEmailCode = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n\n loadingStates.value.sendingMfaEmail = true\n try {\n const response = await fetch(getUrl('mfaSigninSendEmail'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId,\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to send MFA email code'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n // If parsing fails, use the raw text but clean it up\n errorMessage = errorText || 'Failed to send MFA email code'\n }\n \n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return result\n } finally {\n loadingStates.value.sendingMfaEmail = false\n }\n }\n\n const getMfaWebAuthnChallenge = async (deviceId: string) => {\n if (!mfaSessionId.value) {\n throw new Error('No MFA session available')\n }\n \n const response = await fetch(getUrl('mfaWebAuthnChallenge'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n mfa_session_id: mfaSessionId.value,\n device_id: deviceId\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = 'Failed to get WebAuthn challenge'\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorData.error || errorText\n } catch {\n errorMessage = errorText || errorMessage\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n const setAuthData = async (authResponse: AuthResponse) => {\n try {\n // Handle user data (only for sign-in/sign-up, not token refresh)\n if (authResponse.user) {\n currentUser.value = mapApiUserToFrontend(authResponse.user)\n }\n \n // Create session object\n const session: Session = {\n accessToken: authResponse.access_token,\n refreshToken: authResponse.refresh_token,\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes from now (matching API token expiry)\n userId: currentUser.value?.id || authResponse.user?.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence (immediate for critical auth data)\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n if (currentUser.value) {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n // Start automatic token refresh\n startTokenRefreshTimer()\n } catch (error) {\n // Silently handle auth data storage errors\n }\n }\n\n // Token refresh timer management with visibility optimization\n const startTokenRefreshTimer = () => {\n // Clear existing timer\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n }\n \n if (!currentSession.value) return\n \n // Only start timer if page is visible (performance optimization)\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n return\n }\n \n // Calculate time until token expires (refresh 1 minute before expiry)\n const now = new Date()\n const expiresAt = currentSession.value.expiresAt\n const timeUntilRefresh = expiresAt.getTime() - now.getTime() - (1 * 60 * 1000) // 1 minute before expiry\n \n // If token is already expired or expires very soon, refresh immediately\n if (timeUntilRefresh <= 0) {\n refreshToken()\n return\n }\n \n // Set timer to refresh token\n refreshTimer = setTimeout(async () => {\n // Double-check page is still visible before refreshing\n if (typeof document === 'undefined' || document.visibilityState === 'visible') {\n const success = await refreshToken()\n \n if (success) {\n // Schedule next refresh\n startTokenRefreshTimer()\n }\n }\n }, timeUntilRefresh)\n }\n\n const stopTokenRefreshTimer = () => {\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n refreshTimer = null\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n loadingStates.value.initializing = true\n try {\n // Check for existing session/token in localStorage\n if (typeof window !== 'undefined') {\n const storedSession = localStorage.getItem('strands_auth_session')\n const storedUser = localStorage.getItem('strands_auth_user')\n \n if (storedSession && storedUser) {\n try {\n const session = JSON.parse(storedSession) as Session\n const user = JSON.parse(storedUser) as User\n \n // Convert expiresAt back to Date object\n session.expiresAt = new Date(session.expiresAt)\n \n // Check if session is still valid\n if (session.expiresAt > new Date()) {\n currentSession.value = session\n currentUser.value = user\n \n // Start token refresh timer for restored session\n startTokenRefreshTimer()\n } else {\n // Session expired, clear storage\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n } catch (error) {\n // Clear corrupted data\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n }\n }\n \n isInitialized.value = true\n \n // Add a small delay to ensure state is fully settled before hiding loading\n await new Promise(resolve => setTimeout(resolve, 50))\n } catch (error) {\n // Silently handle initialization errors\n } finally {\n loadingStates.value.initializing = false\n }\n }\n\n const changeUsername = async (newUsername: string) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n loadingStates.value.loadingProfile = true\n try {\n const response = await fetch(getUrl('changeUsername'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n body: JSON.stringify({\n username: newUsername,\n }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n if (response.status === 409) {\n throw new Error('Username is already taken')\n } else if (errorData.cooldown_end) {\n throw new Error(`You can only change your username once every 30 days. You can change it again on ${new Date(errorData.cooldown_end).toLocaleDateString()}`)\n }\n throw new Error(errorData.message || `Username change failed: ${response.status} ${response.statusText}`)\n }\n\n const result = await response.json()\n \n // For username change, we need to manually update some fields since API might not return full user\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n username: newUsername,\n usernameLastChangedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n \n // Update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(currentUser.value))\n }\n }\n \n return result\n } finally {\n loadingStates.value.loadingProfile = false\n }\n }\n\n const getUsernameCooldown = async () => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n const response = await fetch(getUrl('usernameCooldown'), {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get username cooldown: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n\n const checkUsernameAvailability = async (username: string) => {\n // Replace {username} in the URL\n const url = getUrl('checkUsernameAvailability').replace('{username}', encodeURIComponent(username))\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to check username availability: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n\n // Session management functions\n const getUserSessions = async () => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n \n // Use request deduplication for sessions\n const cacheKey = `sessions:${currentSession.value.accessToken.slice(0, 20)}`\n \n try {\n return await cachedFetch(cacheKey, async () => {\n const headers = getAuthHeaders()\n \n const response = await fetch(getUrl('sessions'), {\n method: 'GET',\n headers,\n })\n \n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to get user sessions: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }, 2 * 60 * 1000) // Cache for 2 minutes\n } catch (error) {\n throw error\n }\n }\n\n const getSessionStats = async () => {\n const response = await fetch(getUrl('sessionsStats'), {\n method: 'GET',\n headers: getAuthHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get session stats: ${response.status} ${response.statusText}`)\n }\n\n return response.json()\n }\n\n const revokeSession = async (sessionId: string) => {\n const url = getUrl('sessionRevoke').replace('{session_id}', encodeURIComponent(sessionId))\n \n const response = await fetch(url, {\n method: 'POST',\n headers: getAuthHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to revoke session: ${response.status} ${response.statusText}`)\n }\n\n return response.status === 200\n }\n\n const revokeAllOtherSessions = async () => {\n const response = await fetch(getUrl('sessionsRevokeAll'), {\n method: 'POST',\n headers: getAuthHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to revoke all other sessions: ${response.status} ${response.statusText}`)\n }\n\n return response.status === 200\n }\n\n // Visibility change listener for performance optimization\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible' && currentSession.value) {\n // Resume token refresh when page becomes visible\n startTokenRefreshTimer()\n } else if (document.visibilityState === 'hidden') {\n // Stop timer when page is hidden to save resources\n stopTokenRefreshTimer()\n }\n })\n }\n\n // Cleanup function\n const cleanup = () => {\n stopTokenRefreshTimer()\n clearCache()\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', () => {})\n }\n }\n\n // Setup onUnmounted cleanup (only if in component context)\n try {\n onUnmounted(cleanup)\n } catch (e) {\n // If not in component context, onUnmounted will throw - that's okay\n // The cleanup will happen when the page unloads or the module is reloaded\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value || !isInitialized.value),\n loading: computed(() => loading.value),\n loadingMessage,\n \n // Specific loading states\n isInitializing,\n isSigningIn,\n isSigningUp,\n isSigningOut,\n isRefreshingToken,\n isSendingMfaEmail,\n isVerifyingMfa,\n \n // MFA State\n mfaRequired: computed(() => mfaRequired.value),\n mfaSessionId: computed(() => mfaSessionId.value),\n availableMfaMethods: computed(() => availableMfaMethods.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n fetchProfile,\n updateProfile,\n updateUserSettings,\n changeEmail,\n changeUsername,\n getUsernameCooldown,\n checkUsernameAvailability,\n // Session management\n getUserSessions,\n getSessionStats,\n revokeSession,\n revokeAllOtherSessions,\n initialize,\n setAuthData,\n verifyMfa,\n sendMfaEmailCode,\n getMfaWebAuthnChallenge,\n registerHardwareKey,\n completeHardwareKeyRegistration,\n \n // Token management\n startTokenRefreshTimer,\n stopTokenRefreshTimer,\n getAuthHeaders,\n \n // Force re-initialization (useful for testing or navigation)\n forceReInit: () => {\n isInitialized.value = false\n loadingStates.value.initializing = true\n initialize()\n },\n }\n}"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsConfig-Cxb360Os.js","sources":["../../../apps/accounts-ui/src/shared/defaults.ts","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts"],"sourcesContent":["import type { StrandsAuthConfig } from '../types'\n\nexport const STRANDS_AUTH_DEFAULTS: Required<Omit<StrandsAuthConfig, 'clientId' | 'supportEmail' | 'oauth2RedirectUrl'>> = {\n baseUrl: 'https://your-api.example.com',\n accentColor: '#EA00A8',\n redirectUrl: '/',\n onSignInUrl: '/dashboard',\n onSignOutUrl: '/',\n autoRefresh: true,\n refreshInterval: 4,\n protectedRoutes: [],\n guestOnlyRoutes: ['/auth', '/login', '/register'],\n devMode: false,\n styles: true,\n endpoints: {}\n}","import { ref, computed, inject, provide } from 'vue'\nimport { STRANDS_AUTH_DEFAULTS } from '../../shared/defaults'\n\n// Re-export types for components\nexport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\nimport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n completeRegistration: '/api/v1/auth/complete-registration',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}',\n changeEmail: '/api/v1/user/change-email',\n avatar: '/api/v1/user/avatar',\n settings: '/api/v1/user/settings',\n // Username endpoints\n changeUsername: '/api/v1/user/username',\n usernameCooldown: '/api/v1/user/username/cooldown',\n checkUsernameAvailability: '/api/v1/username/{username}/available',\n // MFA endpoints\n mfaDevices: '/api/v1/mfa/devices',\n mfaTotpSetup: '/api/v1/mfa/totp/setup',\n mfaTotpVerify: '/api/v1/mfa/totp/verify',\n mfaEmailSetup: '/api/v1/mfa/email/setup',\n mfaEmailSend: '/api/v1/mfa/email/send',\n mfaEmailVerify: '/api/v1/mfa/email/verify',\n mfaDeviceDisable: '/api/v1/mfa/device/disable',\n mfaBackupCodes: '/api/v1/mfa/backup-codes/regenerate',\n // Hardware key endpoints\n mfaHardwareStartRegistration: '/api/v1/mfa/hardware/start-registration',\n mfaHardwareCompleteRegistration: '/api/v1/mfa/hardware/complete-registration',\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: '/api/v1/auth/mfa/email/send',\n mfaSigninVerify: '/api/v1/auth/mfa/verify',\n mfaBackupCodeVerify: '/api/v1/auth/mfa/backup-code/verify',\n mfaWebAuthnChallenge: '/api/v1/auth/mfa/webauthn/challenge',\n // Session management endpoints\n sessions: '/api/v1/sessions',\n sessionsStats: '/api/v1/sessions/stats',\n sessionRevoke: '/api/v1/sessions/{session_id}/revoke',\n sessionsRevokeAll: '/api/v1/sessions/revoke-all'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n \n try {\n provide(STRANDS_CONFIG_KEY, config)\n } catch (error) {\n console.warn('[Strands Auth] Could not provide config via Vue provide/inject. Config available via global state only.', error)\n }\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Try to get Nuxt runtime config as additional fallback\n let nuxtConfig = null\n try {\n if (typeof window !== 'undefined') {\n // Check window global set by plugin\n if ((window as any).__STRANDS_CONFIG__) {\n nuxtConfig = (window as any).__STRANDS_CONFIG__\n }\n // Fallback to __NUXT__ hydration data\n else if ((window as any).__NUXT__) {\n const nuxtData = (window as any).__NUXT__\n nuxtConfig = nuxtData?.config?.public?.strandsAuth ||\n nuxtData?.public?.strandsAuth ||\n nuxtData?.strandsAuth\n }\n }\n } catch (error) {\n console.error('[Strands Auth] Error accessing runtime configuration:', error)\n }\n \n // Merge configuration sources in priority order\n const activeConfig = computed(() => {\n // Start with defaults, then layer on user configurations\n const config = {\n ...STRANDS_AUTH_DEFAULTS,\n ...(fallbackConfig || {}),\n ...(injectedConfig || {}),\n ...(globalConfig.value || {}),\n ...(nuxtConfig || {})\n }\n \n // Only warn if we're using the exact default URL (indicating no config was provided)\n if (config.baseUrl === STRANDS_AUTH_DEFAULTS.baseUrl && typeof window === 'undefined') {\n console.warn('[Strands Auth] No baseUrl configured for SSR. Please provide a baseUrl in your strandsAuth configuration.')\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n completeRegistration: customEndpoints.completeRegistration || DEFAULT_ENDPOINTS.completeRegistration,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider,\n changeEmail: customEndpoints.changeEmail || DEFAULT_ENDPOINTS.changeEmail,\n avatar: customEndpoints.avatar || DEFAULT_ENDPOINTS.avatar,\n settings: customEndpoints.settings || DEFAULT_ENDPOINTS.settings,\n // Username endpoints\n changeUsername: customEndpoints.changeUsername || DEFAULT_ENDPOINTS.changeUsername,\n usernameCooldown: customEndpoints.usernameCooldown || DEFAULT_ENDPOINTS.usernameCooldown,\n checkUsernameAvailability: customEndpoints.checkUsernameAvailability || DEFAULT_ENDPOINTS.checkUsernameAvailability,\n // MFA endpoints\n mfaDevices: customEndpoints.mfaDevices || DEFAULT_ENDPOINTS.mfaDevices,\n mfaTotpSetup: customEndpoints.mfaTotpSetup || DEFAULT_ENDPOINTS.mfaTotpSetup,\n mfaTotpVerify: customEndpoints.mfaTotpVerify || DEFAULT_ENDPOINTS.mfaTotpVerify,\n mfaEmailSetup: customEndpoints.mfaEmailSetup || DEFAULT_ENDPOINTS.mfaEmailSetup,\n mfaEmailSend: customEndpoints.mfaEmailSend || DEFAULT_ENDPOINTS.mfaEmailSend,\n mfaEmailVerify: customEndpoints.mfaEmailVerify || DEFAULT_ENDPOINTS.mfaEmailVerify,\n mfaDeviceDisable: customEndpoints.mfaDeviceDisable || DEFAULT_ENDPOINTS.mfaDeviceDisable,\n mfaBackupCodes: customEndpoints.mfaBackupCodes || DEFAULT_ENDPOINTS.mfaBackupCodes,\n // Hardware key endpoints\n mfaHardwareStartRegistration: customEndpoints.mfaHardwareStartRegistration || DEFAULT_ENDPOINTS.mfaHardwareStartRegistration,\n mfaHardwareCompleteRegistration: customEndpoints.mfaHardwareCompleteRegistration || DEFAULT_ENDPOINTS.mfaHardwareCompleteRegistration,\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: customEndpoints.mfaSigninSendEmail || DEFAULT_ENDPOINTS.mfaSigninSendEmail,\n mfaSigninVerify: customEndpoints.mfaSigninVerify || DEFAULT_ENDPOINTS.mfaSigninVerify,\n mfaBackupCodeVerify: customEndpoints.mfaBackupCodeVerify || DEFAULT_ENDPOINTS.mfaBackupCodeVerify,\n mfaWebAuthnChallenge: customEndpoints.mfaWebAuthnChallenge || DEFAULT_ENDPOINTS.mfaWebAuthnChallenge,\n // Session management endpoints\n sessions: customEndpoints.sessions || DEFAULT_ENDPOINTS.sessions,\n sessionsStats: customEndpoints.sessionsStats || DEFAULT_ENDPOINTS.sessionsStats,\n sessionRevoke: customEndpoints.sessionRevoke || DEFAULT_ENDPOINTS.sessionRevoke,\n sessionsRevokeAll: customEndpoints.sessionsRevokeAll || DEFAULT_ENDPOINTS.sessionsRevokeAll\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n console.debug(`[Strands Auth] Constructing URL for endpoint \"${endpoint}\": ${baseUrl}${path}`)\n return `${baseUrl}${path}`\n }\n\n const getSupportEmail = () => {\n const config = activeConfig.value\n return config.supportEmail || null\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl,\n getSupportEmail\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsConfig-Z9_36OcV.cjs","sources":["../../../apps/accounts-ui/src/shared/defaults.ts","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts"],"sourcesContent":["import type { StrandsAuthConfig } from '../types'\n\nexport const STRANDS_AUTH_DEFAULTS: Required<Omit<StrandsAuthConfig, 'clientId' | 'supportEmail' | 'oauth2RedirectUrl'>> = {\n baseUrl: 'https://your-api.example.com',\n accentColor: '#EA00A8',\n redirectUrl: '/',\n onSignInUrl: '/dashboard',\n onSignOutUrl: '/',\n autoRefresh: true,\n refreshInterval: 4,\n protectedRoutes: [],\n guestOnlyRoutes: ['/auth', '/login', '/register'],\n devMode: false,\n styles: true,\n endpoints: {}\n}","import { ref, computed, inject, provide } from 'vue'\nimport { STRANDS_AUTH_DEFAULTS } from '../../shared/defaults'\n\n// Re-export types for components\nexport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\nimport type { StrandsAuthConfig, StrandsAuthEndpoints } from '../../types'\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n completeRegistration: '/api/v1/auth/complete-registration',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}',\n changeEmail: '/api/v1/user/change-email',\n avatar: '/api/v1/user/avatar',\n settings: '/api/v1/user/settings',\n // Username endpoints\n changeUsername: '/api/v1/user/username',\n usernameCooldown: '/api/v1/user/username/cooldown',\n checkUsernameAvailability: '/api/v1/username/{username}/available',\n // MFA endpoints\n mfaDevices: '/api/v1/mfa/devices',\n mfaTotpSetup: '/api/v1/mfa/totp/setup',\n mfaTotpVerify: '/api/v1/mfa/totp/verify',\n mfaEmailSetup: '/api/v1/mfa/email/setup',\n mfaEmailSend: '/api/v1/mfa/email/send',\n mfaEmailVerify: '/api/v1/mfa/email/verify',\n mfaDeviceDisable: '/api/v1/mfa/device/disable',\n mfaBackupCodes: '/api/v1/mfa/backup-codes/regenerate',\n // Hardware key endpoints\n mfaHardwareStartRegistration: '/api/v1/mfa/hardware/start-registration',\n mfaHardwareCompleteRegistration: '/api/v1/mfa/hardware/complete-registration',\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: '/api/v1/auth/mfa/email/send',\n mfaSigninVerify: '/api/v1/auth/mfa/verify',\n mfaBackupCodeVerify: '/api/v1/auth/mfa/backup-code/verify',\n mfaWebAuthnChallenge: '/api/v1/auth/mfa/webauthn/challenge',\n // Session management endpoints\n sessions: '/api/v1/sessions',\n sessionsStats: '/api/v1/sessions/stats',\n sessionRevoke: '/api/v1/sessions/{session_id}/revoke',\n sessionsRevokeAll: '/api/v1/sessions/revoke-all'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n \n try {\n provide(STRANDS_CONFIG_KEY, config)\n } catch (error) {\n console.warn('[Strands Auth] Could not provide config via Vue provide/inject. Config available via global state only.', error)\n }\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Try to get Nuxt runtime config as additional fallback\n let nuxtConfig = null\n try {\n if (typeof window !== 'undefined') {\n // Check window global set by plugin\n if ((window as any).__STRANDS_CONFIG__) {\n nuxtConfig = (window as any).__STRANDS_CONFIG__\n }\n // Fallback to __NUXT__ hydration data\n else if ((window as any).__NUXT__) {\n const nuxtData = (window as any).__NUXT__\n nuxtConfig = nuxtData?.config?.public?.strandsAuth ||\n nuxtData?.public?.strandsAuth ||\n nuxtData?.strandsAuth\n }\n }\n } catch (error) {\n console.error('[Strands Auth] Error accessing runtime configuration:', error)\n }\n \n // Merge configuration sources in priority order\n const activeConfig = computed(() => {\n // Start with defaults, then layer on user configurations\n const config = {\n ...STRANDS_AUTH_DEFAULTS,\n ...(fallbackConfig || {}),\n ...(injectedConfig || {}),\n ...(globalConfig.value || {}),\n ...(nuxtConfig || {})\n }\n \n // Only warn if we're using the exact default URL (indicating no config was provided)\n if (config.baseUrl === STRANDS_AUTH_DEFAULTS.baseUrl && typeof window === 'undefined') {\n console.warn('[Strands Auth] No baseUrl configured for SSR. Please provide a baseUrl in your strandsAuth configuration.')\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n completeRegistration: customEndpoints.completeRegistration || DEFAULT_ENDPOINTS.completeRegistration,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider,\n changeEmail: customEndpoints.changeEmail || DEFAULT_ENDPOINTS.changeEmail,\n avatar: customEndpoints.avatar || DEFAULT_ENDPOINTS.avatar,\n settings: customEndpoints.settings || DEFAULT_ENDPOINTS.settings,\n // Username endpoints\n changeUsername: customEndpoints.changeUsername || DEFAULT_ENDPOINTS.changeUsername,\n usernameCooldown: customEndpoints.usernameCooldown || DEFAULT_ENDPOINTS.usernameCooldown,\n checkUsernameAvailability: customEndpoints.checkUsernameAvailability || DEFAULT_ENDPOINTS.checkUsernameAvailability,\n // MFA endpoints\n mfaDevices: customEndpoints.mfaDevices || DEFAULT_ENDPOINTS.mfaDevices,\n mfaTotpSetup: customEndpoints.mfaTotpSetup || DEFAULT_ENDPOINTS.mfaTotpSetup,\n mfaTotpVerify: customEndpoints.mfaTotpVerify || DEFAULT_ENDPOINTS.mfaTotpVerify,\n mfaEmailSetup: customEndpoints.mfaEmailSetup || DEFAULT_ENDPOINTS.mfaEmailSetup,\n mfaEmailSend: customEndpoints.mfaEmailSend || DEFAULT_ENDPOINTS.mfaEmailSend,\n mfaEmailVerify: customEndpoints.mfaEmailVerify || DEFAULT_ENDPOINTS.mfaEmailVerify,\n mfaDeviceDisable: customEndpoints.mfaDeviceDisable || DEFAULT_ENDPOINTS.mfaDeviceDisable,\n mfaBackupCodes: customEndpoints.mfaBackupCodes || DEFAULT_ENDPOINTS.mfaBackupCodes,\n // Hardware key endpoints\n mfaHardwareStartRegistration: customEndpoints.mfaHardwareStartRegistration || DEFAULT_ENDPOINTS.mfaHardwareStartRegistration,\n mfaHardwareCompleteRegistration: customEndpoints.mfaHardwareCompleteRegistration || DEFAULT_ENDPOINTS.mfaHardwareCompleteRegistration,\n // MFA sign-in specific endpoints\n mfaSigninSendEmail: customEndpoints.mfaSigninSendEmail || DEFAULT_ENDPOINTS.mfaSigninSendEmail,\n mfaSigninVerify: customEndpoints.mfaSigninVerify || DEFAULT_ENDPOINTS.mfaSigninVerify,\n mfaBackupCodeVerify: customEndpoints.mfaBackupCodeVerify || DEFAULT_ENDPOINTS.mfaBackupCodeVerify,\n mfaWebAuthnChallenge: customEndpoints.mfaWebAuthnChallenge || DEFAULT_ENDPOINTS.mfaWebAuthnChallenge,\n // Session management endpoints\n sessions: customEndpoints.sessions || DEFAULT_ENDPOINTS.sessions,\n sessionsStats: customEndpoints.sessionsStats || DEFAULT_ENDPOINTS.sessionsStats,\n sessionRevoke: customEndpoints.sessionRevoke || DEFAULT_ENDPOINTS.sessionRevoke,\n sessionsRevokeAll: customEndpoints.sessionsRevokeAll || DEFAULT_ENDPOINTS.sessionsRevokeAll\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n console.debug(`[Strands Auth] Constructing URL for endpoint \"${endpoint}\": ${baseUrl}${path}`)\n return `${baseUrl}${path}`\n }\n\n const getSupportEmail = () => {\n const config = activeConfig.value\n return config.supportEmail || null\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl,\n getSupportEmail\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n"],"names":["STRANDS_AUTH_DEFAULTS","baseUrl","accentColor","redirectUrl","onSignInUrl","onSignOutUrl","autoRefresh","refreshInterval","protectedRoutes","guestOnlyRoutes","devMode","styles","endpoints","DEFAULT_ENDPOINTS","STRANDS_CONFIG_KEY","Symbol","globalConfig","ref","config","value","provide","error","fallbackConfig","injectedConfig","inject","nuxtConfig","window","__STRANDS_CONFIG__","__NUXT__","nuxtData","public","strandsAuth","activeConfig","computed","customEndpoints","signIn","signUp","signOut","refresh","passwordReset","passwordResetConfirm","completeRegistration","profile","verifyEmail","oauthProviders","oauthProvider","changeEmail","avatar","settings","changeUsername","usernameCooldown","checkUsernameAvailability","mfaDevices","mfaTotpSetup","mfaTotpVerify","mfaEmailSetup","mfaEmailSend","mfaEmailVerify","mfaDeviceDisable","mfaBackupCodes","mfaHardwareStartRegistration","mfaHardwareCompleteRegistration","mfaSigninSendEmail","mfaSigninVerify","mfaBackupCodeVerify","mfaWebAuthnChallenge","sessions","sessionsStats","sessionRevoke","sessionsRevokeAll","getUrl","endpoint","Error","endpointPath","replace","startsWith","getSupportEmail","supportEmail"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/utils/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/utils/slots.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,EAAE,OAAO,GAAG,YAQ1D,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/utils/validation.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OAG5C,CAAA;AAGD,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,KAAG;IAClD,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtC,MAAM,EAAE,MAAM,EAAE,CAAA;CA6CjB,CAAA;AAGD,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAE1C,CAAA;AAID,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,OAE1C,CAAA;AAGD,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,EAAE,cAAc,MAAM,KAAG,OAEvE,CAAA;AAGD,eAAO,MAAM,WAAW,GAAI,YAAY,MAAM,EAAE,WAAW,MAAM,KAAG,MAInE,CAAA;AAGD,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,GAAG,IAAI,KAAG,MAOhD,CAAA;AAGD,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,MAAM,CAAC,EACP,MAAM,MAAM,KACX,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAMnC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SignedIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedIn.vue"],"names":[],"mappings":";AAmCA;AA2IA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AA8CD,iBAAS,cAAc;WAkGT,OAAO,IAA6B;;;;;;;;;;;;;;;;;;;;;;;YAZrB,GAAG;;;YACF,GAAG;yBACJ,GAAG;;;;EAe/B;AAkBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;kBA1KJ,OAAO;YACb,OAAO;6EAiLhB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SignedOut.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedOut.vue"],"names":[],"mappings":";AAmCA;AA0HA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AA8BD,iBAAS,cAAc;WAmGT,OAAO,IAA6B;;;;;YAZrB,GAAG;;;;;;;;;;;;;;;;;;;;;YACF,GAAG;yBACJ,GAAG;;;;EAe/B;AAiBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;kBAzJJ,OAAO;6EAiKtB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsAuth.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue"],"names":[],"mappings":";AA4MA;AAsgCA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAK1F,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;;;;;UALQ,QAAQ,GAAG,QAAQ,GAAG,gBAAgB;aAEnC,OAAO;;AAkpCnB,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsBackupCodesModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsBackupCodesModal.vue"],"names":[],"mappings":";AAgHA;AAgcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;CAC1B;;;;;;AA+eD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsCompleteSignUp.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue"],"names":[],"mappings":";AA4KA;AAikBA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAI1F,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;;;;;AAuoBD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsConfigProvider.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue"],"names":[],"mappings":";AAGA;AAyBA,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE9F,UAAU,KAAK;IACb,MAAM,EAAE,iBAAiB,CAAA;CAC1B;AAeD,iBAAS,cAAc;WAoBT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAQD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,sRAMnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAQpG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsConfirmModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsConfirmModal.vue"],"names":[],"mappings":";AA6BA;AAsGA,KAAK,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AAElE,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB;;;;;;;;aADW,aAAa;iBAFT,MAAM;gBACP,MAAM;;AA+JrB,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsEmailMfaSetupModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsEmailMfaSetupModal.vue"],"names":[],"mappings":";AAyIA;AA8cA,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;CACd;;;;;;;;AA+jBD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsHardwareKeySetupModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsHardwareKeySetupModal.vue"],"names":[],"mappings":";AAyMA;AAo3BA,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CACpC;;;;;;;;gBADc,SAAS,GAAG,UAAU;;AAm6BrC,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsLogo.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue"],"names":[],"mappings":";AA2BA;AAsCA,UAAU,KAAK;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;;WADS,MAAM;;AAqEhB,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsMFASetup.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue"],"names":[],"mappings":";AA8HA;AAyrBA,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;;;;;;;;;;UADQ,OAAO;;AAqkBhB,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsMfaModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsMfaModal.vue"],"names":[],"mappings":";AA2PA;AAqgCA,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;CACd;;;;;;;;AAi5BD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsMfaVerification.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsMfaVerification.vue"],"names":[],"mappings":";AA0NA;AAupCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAmH5C,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;IACb,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;;;;;;;;;;AAwlCD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsPasswordReset.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue"],"names":[],"mappings":";AAyDA;AAwOA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE1F,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;AAkTD,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsSecuredFooter.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue"],"names":[],"mappings":";AAcA;AAmEA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAI1F,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;AAoBD,iBAAS,cAAc;WA8CT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAYD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe,iSAQnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsSessionsModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSessionsModal.vue"],"names":[],"mappings":";AAqKA;AA60BA,UAAU,KAAK;IACb,UAAU,EAAE,OAAO,CAAA;CACpB;;;;;;;;;;AA0pBD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsSettingsModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSettingsModal.vue"],"names":[],"mappings":";AAmFA;AAyQA,UAAU,aAAa;IACrB,aAAa,EAAE,OAAO,CAAA;IACtB,eAAe,EAAE,OAAO,CAAA;CACzB;AAED,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;;;;;;;;UADQ,OAAO;;AA2ThB,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsSignIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue"],"names":[],"mappings":";AAoHA;AAwbA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAK1F,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;;;iBAFe,MAAM,EAAE;;AAwiBxB,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsSignUp.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue"],"names":[],"mappings":";AAmJA;AAyhBA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAG1F,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;iBAFe,MAAM,EAAE;;AA4iBxB,wBASG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsTotpSetupModal.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsTotpSetupModal.vue"],"names":[],"mappings":";AA2KA;AAmxBA,UAAU,KAAK;IACb,IAAI,EAAE,OAAO,CAAA;CACd;;;;;;;;AA0qBD,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsUserButton.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsUserButton.vue"],"names":[],"mappings":";AAyJA;AAgsBA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAElC,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACxC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IACvC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACrC;;;;;;;;;;aALW,SAAS,GAAG,SAAS,GAAG,MAAM;iBAC1B,MAAM;UACb,IAAI;cAHA,OAAO;eAIN,MAAM,GAAG,OAAO,GAAG,QAAQ;uBACnB,QAAQ,GAAG,KAAK;;;;;AA+oBtC,wBAUG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsUserProfile.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue"],"names":[],"mappings":";AAwbA;AAm/DA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAoD1F,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,aAAa,CAAA;AAEpD,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;;;;;;;;;;;;aADW,OAAO;eADL,OAAO;;;;AAk9DrB,wBAUG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SvgIcon.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SvgIcon.vue"],"names":[],"mappings":";AAKA;AA+IA,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;;UAHQ,MAAM;WAFL,MAAM;UACP,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;YAE9B,MAAM;gBACF,OAAO;;AAsLtB,wBAQG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"VirtualList.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/VirtualList.vue"],"names":[],"mappings":";AA6BA;AA+JA,UAAU,KAAK;IACb,KAAK,EAAE,GAAG,EAAE,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC,CAAA;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAqGD,iBAAS,cAAc;WAuDT,OAAO,IAA6B;;;;;YAXrB,GAAG;;;;;;EAgB/B;AAcD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;0BAvGQ,MAAM,UAAS,OAAO,GAAG,QAAQ,GAAG,KAAK;;aA3E1D,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC;cACxC,MAAM;;;kBA2LjB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconGithub.vue.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/vue/components/icons/IconGithub.vue"],"names":[],"mappings":";AAMA;;AAqDA,wBAMG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"IconGoogle.vue.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/vue/components/icons/IconGoogle.vue"],"names":[],"mappings":";AAYA;;AAwEA,wBAMG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/vue/components/icons/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAC9E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAChF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAC9E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG1D,cAAc,SAAS,CAAA;AAGvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA;AAGnE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAC9E,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,iCAAiC,CAAA;AACtF,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,oCAAoC,CAAA;AAC5F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,+BAA+B,CAAA;AAClF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthenticatedFetch.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useAuthenticatedFetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAE5D;;;GAGG;AACH,wBAAgB,qBAAqB;8BAK5B,MAAM,GAAG,GAAG,YACR,yBAAyB,KACjC,OAAO,CAAC,QAAQ,CAAC;eA8EF,MAAM,GAAG,GAAG,YAAY,yBAAyB;gBAOhD,MAAM,GAAG,GAAG,SAAS,GAAG,YAAY,yBAAyB;eAmB9D,MAAM,GAAG,GAAG,SAAS,GAAG,YAAY,yBAAyB;kBAkB7D,MAAM,GAAG,GAAG,YAAY,yBAAyB;iBAO/C,MAAM,GAAG,GAAG,SAAS,GAAG,YAAY,yBAAyB;EAuBlF;AAGD,eAAO,MAAM,UAAU;eACJ,MAAM,GAAG,GAAG,YAAY,yBAAyB;gBAIhD,MAAM,GAAG,GAAG,SAAS,GAAG,YAAY,yBAAyB;eAI9D,MAAM,GAAG,GAAG,SAAS,GAAG,YAAY,yBAAyB;kBAI1D,MAAM,GAAG,GAAG,YAAY,yBAAyB;iBAIlD,MAAM,GAAG,GAAG,SAAS,GAAG,YAAY,yBAAyB;CAIjF,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useOAuthProviders.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts"],"names":[],"mappings":";AAGA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE;QACJ,QAAQ,EAAE,aAAa,CAAA;QACvB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,GAAG,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B;;YAnClE,MAAM;cACJ,MAAM;sBACE,MAAM;eACb,MAAM;kBACH,MAAM;kBACN,MAAM;gBACR,MAAM,EAAE;iBACP,OAAO;mBACL,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;YAR7B,MAAM;cACJ,MAAM;sBACE,MAAM;eACb,MAAM;kBACH,MAAM;kBACN,MAAM;gBACR,MAAM,EAAE;iBACP,OAAO;mBACL,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;qCAuFnB,MAAM,kBACF,OAAO,CAAC,wBAAwB,CAAC,KAChD,OAAO,CAAC,MAAM,CAAC;qCAmDJ,MAAM,kBACF,OAAO,CAAC,wBAAwB,CAAC;kCAoBd,MAAM;YAzKvC,MAAM;cACJ,MAAM;sBACE,MAAM;eACb,MAAM;kBACH,MAAM;kBACN,MAAM;gBACR,MAAM,EAAE;iBACP,OAAO;mBACL,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;gCAqKE,aAAa,KAAG,MAAM;EAkC1D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsAuth.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,IAAI,EAAsC,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAA+B,MAAM,aAAa,CAAA;AAmDrJ,wBAAgB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA8IS,iBAAiB;uBA0FtB,UAAU;;;wBA+HX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;iCA4CT,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;mCA2CX,GAAG;;;;;;;;;;;;;;;;;;4BA0CV,MAAM,YAAY,MAAM;kCAwSlB,MAAM;;0CAsEE,MAAM;;;+BA6DjB,MAAM;;;gCAlQL,YAAY;0BAtHlB,MAAM,QAAQ,MAAM;iCAiDb,MAAM;wCAsCC,MAAM;sCAtgBR,MAAM,eAAe,MAAM,eAAc,UAAU,GAAG,SAAS;gDAnCrD,MAAM,cAAc,GAAG,eAAe,MAAM;;;;;EAs8BtG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsConfig.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts"],"names":[],"mappings":";AAIA,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAkD1E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,QAQ7D;AAED,wBAAgB,gBAAgB,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;;;uBA2FhD,MAAM,oBAAoB,GAAG,MAAM;;EAoC9D;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,QAEzD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useStrandsMfa.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useStrandsMfa.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAEV,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,aAAa,CAAA;AAQpB,wBAAgB,aAAa;;;;;;;;;;;;;;;;;;;;2BAkDO,OAAO,CAAC,kBAAkB,CAAC;4BAiBxB,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAAC;gCAkB/B,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;gCAmBxC,MAAM,KAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;iCAkBrD,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;mCAapB,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;iCAkBzC,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;sCAgBjB,MAAM,KAAG,OAAO,CAAC,mBAAmB,CAAC;oCAe7C,MAAM,KAAG,MAAM;oCAgBf,MAAM,KAAG,MAAM;kCAgBjB,MAAM,GAAG,IAAI,KAAG,MAAM;EAsC5D"}
|
package/dist/vue/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/vue/index.ts"],"names":[],"mappings":"AACA,cAAc,oBAAoB,CAAA;AAGlC,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAG5F,cAAc,8BAA8B,CAAA;AAC5C,cAAc,gCAAgC,CAAA;AAC9C,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AAGnD,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StrandsUIPlugin.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/plugins/StrandsUIPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAG9B,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAC9C,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAChD,OAAO,aAAa,MAAM,kBAAkB,CAAA;AAC5C,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAC9C,OAAO,aAAa,MAAM,kBAAkB,CAAA;AAC5C,OAAO,aAAa,MAAM,kBAAkB,CAAA;AAC5C,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAGhD,iBAAS,oBAAoB,SAE5B;AAaD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;;iBAGc,GAAG,YAAW,gBAAgB;;AAD7C,wBAaC;AAGD,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,GAChB,CAAA;AAGD,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAG/B,YAAY,EACV,aAAa,EACb,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,GACb,MAAM,aAAa,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UiAlert.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/ui/UiAlert.vue"],"names":[],"mappings":";AA+BA;AAmQA,UAAU,KAAK;IACb,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;IAClD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAkDD,iBAAS,cAAc;WAsGT,OAAO,IAA6B;;yBAVrB,GAAG;;;;EAe/B;AAcD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;aAhLT,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM;iBAGpC,OAAO;wFAsLrB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UiAvatarEditor.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/ui/UiAvatarEditor.vue"],"names":[],"mappings":";AAuJA;AAu4BA,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,eAAe,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAC9B;;;;;;;;UALQ,MAAM;iBACC,MAAM;iBACN,MAAM;eACR,OAAO;;;;;;AAyvBrB,wBAUG"}
|