@strands.gg/accui 0.2.8 → 0.2.9

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.
Files changed (35) hide show
  1. package/dist/accui.css +1 -1
  2. package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js +1 -1
  3. package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts +18 -3
  4. package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts.map +1 -1
  5. package/dist/nuxt/runtime/composables/useStrandsAuth.es.js +1 -1
  6. package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js +1 -1
  7. package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js +1 -1
  8. package/dist/strands-auth-ui.cjs.js +11 -1
  9. package/dist/strands-auth-ui.cjs.js.map +1 -1
  10. package/dist/strands-auth-ui.es.js +1672 -1514
  11. package/dist/strands-auth-ui.es.js.map +1 -1
  12. package/dist/useStrandsAuth-CPyy4tH6.js +213 -0
  13. package/dist/useStrandsAuth-CPyy4tH6.js.map +1 -0
  14. package/dist/useStrandsAuth-C_MiRZbU.cjs +2 -0
  15. package/dist/useStrandsAuth-C_MiRZbU.cjs.map +1 -0
  16. package/dist/vue/components/SignedIn.vue.d.ts +1 -0
  17. package/dist/vue/components/SignedIn.vue.d.ts.map +1 -1
  18. package/dist/vue/components/SignedOut.vue.d.ts.map +1 -1
  19. package/dist/vue/components/StrandsAuth.vue.d.ts.map +1 -1
  20. package/dist/vue/components/StrandsSignIn.vue.d.ts.map +1 -1
  21. package/dist/vue/components/StrandsUserProfile.vue.d.ts +4 -1
  22. package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -1
  23. package/dist/vue/composables/useOAuthProviders.d.ts +18 -15
  24. package/dist/vue/composables/useOAuthProviders.d.ts.map +1 -1
  25. package/dist/vue/composables/useStrandsAuth.d.ts +18 -3
  26. package/dist/vue/composables/useStrandsAuth.d.ts.map +1 -1
  27. package/dist/vue/ui/UiLoader.vue.d.ts +15 -0
  28. package/dist/vue/ui/UiLoader.vue.d.ts.map +1 -0
  29. package/dist/vue/ui/index.d.ts +1 -0
  30. package/dist/vue/ui/index.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/useStrandsAuth-BGunGG2x.cjs +0 -2
  33. package/dist/useStrandsAuth-BGunGG2x.cjs.map +0 -1
  34. package/dist/useStrandsAuth-DiD32KI7.js +0 -91
  35. package/dist/useStrandsAuth-DiD32KI7.js.map +0 -1
@@ -0,0 +1,213 @@
1
+ import { ref as c, computed as n } from "vue";
2
+ const s = c(null), r = c(null), l = c(!1), o = c(!0), u = c(!1);
3
+ let i = null;
4
+ function x() {
5
+ const w = n(() => s.value !== null), y = async (e) => {
6
+ o.value = !0;
7
+ try {
8
+ const t = await fetch("http://localhost:8000/api/v1/auth/sign-in", {
9
+ method: "POST",
10
+ headers: {
11
+ "Content-Type": "application/json"
12
+ },
13
+ body: JSON.stringify(e)
14
+ });
15
+ if (!t.ok)
16
+ throw t.status === 401 ? new Error("Invalid email or password") : t.status === 403 ? new Error("Please verify your email address before signing in") : new Error(`Sign in failed: ${t.status} ${t.statusText}`);
17
+ const a = await t.json();
18
+ return m(a), a;
19
+ } finally {
20
+ o.value = !1;
21
+ }
22
+ }, T = async (e) => {
23
+ o.value = !0;
24
+ try {
25
+ throw new Error("Sign up not implemented - please integrate with auth SDK");
26
+ } finally {
27
+ o.value = !1;
28
+ }
29
+ }, d = async () => {
30
+ o.value = !0;
31
+ try {
32
+ g(), s.value = null, r.value = null, typeof window < "u" && (localStorage.removeItem("strands_auth_session"), localStorage.removeItem("strands_auth_user")), console.log("User signed out successfully");
33
+ } finally {
34
+ o.value = !1;
35
+ }
36
+ }, h = async () => {
37
+ if (!r.value?.refreshToken)
38
+ return console.warn("No refresh token available"), !1;
39
+ console.log("Attempting to refresh token...", {
40
+ refreshToken: r.value.refreshToken.substring(0, 50) + "...",
41
+ expiresAt: r.value.expiresAt
42
+ });
43
+ try {
44
+ const e = await fetch("http://localhost:8000/api/v1/auth/refresh", {
45
+ method: "POST",
46
+ headers: {
47
+ "Content-Type": "application/json"
48
+ },
49
+ body: JSON.stringify({
50
+ refresh_token: r.value.refreshToken
51
+ })
52
+ });
53
+ if (!e.ok) {
54
+ const a = await e.text();
55
+ if (console.error("Token refresh failed:", {
56
+ status: e.status,
57
+ statusText: e.statusText,
58
+ body: a
59
+ }), e.status === 401)
60
+ return console.warn("Refresh token expired, signing out user"), await d(), !1;
61
+ throw new Error(`Token refresh failed: ${e.status} ${e.statusText}`);
62
+ }
63
+ const t = await e.json();
64
+ return m(t), console.log("Token refreshed successfully"), !0;
65
+ } catch (e) {
66
+ return console.error("Failed to refresh token:", e), await d(), !1;
67
+ }
68
+ }, _ = async () => {
69
+ if (!r.value?.accessToken)
70
+ throw new Error("No access token available");
71
+ l.value = !0;
72
+ try {
73
+ const e = await fetch("http://localhost:8000/api/v1/user/profile", {
74
+ method: "GET",
75
+ headers: {
76
+ "Content-Type": "application/json",
77
+ Authorization: `Bearer ${r.value.accessToken}`
78
+ }
79
+ });
80
+ if (!e.ok)
81
+ throw e.status === 401 ? new Error("Authentication expired. Please sign in again.") : new Error(`Failed to fetch profile: ${e.status} ${e.statusText}`);
82
+ const t = await e.json();
83
+ return s.value = {
84
+ id: t.id,
85
+ email: t.email,
86
+ firstName: t.first_name,
87
+ lastName: t.last_name,
88
+ phone: t.phone,
89
+ avatar: t.avatar,
90
+ mfaEnabled: t.mfaEnabled || !1,
91
+ emailVerified: t.email_verified,
92
+ createdAt: t.created_at,
93
+ updatedAt: t.updated_at || (/* @__PURE__ */ new Date()).toISOString()
94
+ }, typeof window < "u" && localStorage.setItem("strands_auth_user", JSON.stringify(s.value)), s.value;
95
+ } finally {
96
+ l.value = !1;
97
+ }
98
+ }, S = async (e) => {
99
+ if (!r.value?.accessToken)
100
+ throw new Error("No access token available");
101
+ l.value = !0;
102
+ try {
103
+ const t = await fetch("http://localhost:8000/api/v1/user/profile", {
104
+ method: "POST",
105
+ headers: {
106
+ "Content-Type": "application/json",
107
+ Authorization: `Bearer ${r.value.accessToken}`
108
+ },
109
+ body: JSON.stringify({
110
+ first_name: e.firstName,
111
+ last_name: e.lastName,
112
+ email: e.email,
113
+ phone: e.phone
114
+ })
115
+ });
116
+ if (!t.ok)
117
+ throw t.status === 401 ? new Error("Authentication expired. Please sign in again.") : new Error(`Profile update failed: ${t.status} ${t.statusText}`);
118
+ const a = await t.json();
119
+ return s.value && (s.value = {
120
+ ...s.value,
121
+ id: a.id,
122
+ email: a.email,
123
+ firstName: a.first_name,
124
+ lastName: a.last_name,
125
+ emailVerified: a.email_verified,
126
+ // Keep existing properties not returned by API
127
+ phone: e.phone,
128
+ avatar: s.value.avatar,
129
+ mfaEnabled: s.value.mfaEnabled,
130
+ createdAt: a.created_at,
131
+ updatedAt: a.updated_at || (/* @__PURE__ */ new Date()).toISOString()
132
+ }, typeof window < "u" && localStorage.setItem("strands_auth_user", JSON.stringify(s.value))), s.value;
133
+ } finally {
134
+ l.value = !1;
135
+ }
136
+ }, m = (e) => {
137
+ try {
138
+ s.value = e.user;
139
+ const t = {
140
+ accessToken: e.access_token,
141
+ refreshToken: e.refresh_token,
142
+ expiresAt: new Date(Date.now() + 300 * 1e3),
143
+ // 5 minutes from now (matching API token expiry)
144
+ userId: e.user.id
145
+ };
146
+ r.value = t, typeof window < "u" && (localStorage.setItem("strands_auth_session", JSON.stringify(t)), localStorage.setItem("strands_auth_user", JSON.stringify(e.user))), f(), console.log("Auth data stored successfully", { user: e.user.email });
147
+ } catch (t) {
148
+ console.error("Failed to store auth data:", t);
149
+ }
150
+ }, f = () => {
151
+ if (i && clearTimeout(i), !r.value) return;
152
+ const e = /* @__PURE__ */ new Date(), a = r.value.expiresAt.getTime() - e.getTime() - 60 * 1e3;
153
+ if (a <= 0) {
154
+ console.log("Token expired or expires soon, refreshing immediately"), h();
155
+ return;
156
+ }
157
+ console.log(`Scheduling token refresh in ${Math.round(a / 1e3)} seconds`), i = setTimeout(async () => {
158
+ console.log("Auto-refreshing token..."), await h() && f();
159
+ }, a);
160
+ }, g = () => {
161
+ i && (clearTimeout(i), i = null);
162
+ }, v = async () => {
163
+ if (!u.value) {
164
+ o.value = !0;
165
+ try {
166
+ if (typeof window < "u") {
167
+ const e = localStorage.getItem("strands_auth_session"), t = localStorage.getItem("strands_auth_user");
168
+ if (e && t)
169
+ try {
170
+ const a = JSON.parse(e), p = JSON.parse(t);
171
+ a.expiresAt = new Date(a.expiresAt), a.expiresAt > /* @__PURE__ */ new Date() ? (r.value = a, s.value = p, console.log("Restored auth session for user:", p.email), f()) : (localStorage.removeItem("strands_auth_session"), localStorage.removeItem("strands_auth_user"), console.log("Stored session expired, cleared from storage"));
172
+ } catch (a) {
173
+ console.warn("Failed to restore auth session:", a), localStorage.removeItem("strands_auth_session"), localStorage.removeItem("strands_auth_user");
174
+ }
175
+ }
176
+ u.value = !0, await new Promise((e) => setTimeout(e, 50));
177
+ } catch (e) {
178
+ console.error("Auth initialization error:", e);
179
+ } finally {
180
+ o.value = !1;
181
+ }
182
+ }
183
+ };
184
+ return u.value || v(), {
185
+ // State
186
+ user: n(() => s.value),
187
+ currentUser: n(() => s.value),
188
+ currentSession: n(() => r.value),
189
+ isAuthenticated: w,
190
+ isLoading: n(() => o.value || !u.value),
191
+ loading: n(() => l.value),
192
+ // Methods
193
+ signIn: y,
194
+ signUp: T,
195
+ signOut: d,
196
+ refreshToken: h,
197
+ fetchProfile: _,
198
+ updateProfile: S,
199
+ initialize: v,
200
+ setAuthData: m,
201
+ // Token management
202
+ startTokenRefreshTimer: f,
203
+ stopTokenRefreshTimer: g,
204
+ // Force re-initialization (useful for testing or navigation)
205
+ forceReInit: () => {
206
+ u.value = !1, o.value = !0, v();
207
+ }
208
+ };
209
+ }
210
+ export {
211
+ x as u
212
+ };
213
+ //# sourceMappingURL=useStrandsAuth-CPyy4tH6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrandsAuth-CPyy4tH6.js","sources":["../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["import { ref, computed } from 'vue'\nimport type { User, Session, SignInCredentials, SignUpData, AuthResponse } from '../../types'\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(true)\nconst isInitialized = ref(false)\n\n// Token refresh timer\nlet refreshTimer: NodeJS.Timeout | null = null\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n isLoading.value = true\n try {\n // Make API call to sign-in endpoint\n const response = await fetch('http://localhost:8000/api/v1/auth/sign-in', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\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 // Store the authentication data\n setAuthData(authData)\n \n return authData\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n isLoading.value = 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 isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // Stop token refresh timer\n stopTokenRefreshTimer()\n \n // Clear user and session state\n currentUser.value = null\n currentSession.value = null\n \n // Clear stored tokens\n if (typeof window !== 'undefined') {\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n \n console.log('User signed out successfully')\n } finally {\n isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value?.refreshToken) {\n console.warn('No refresh token available')\n return false\n }\n \n console.log('Attempting to refresh token...', {\n refreshToken: currentSession.value.refreshToken.substring(0, 50) + '...',\n expiresAt: currentSession.value.expiresAt\n })\n \n try {\n const response = await fetch('http://localhost:8000/api/v1/auth/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 const responseText = await response.text()\n console.error('Token refresh failed:', {\n status: response.status,\n statusText: response.statusText,\n body: responseText\n })\n \n if (response.status === 401) {\n // Refresh token is invalid/expired, sign out user\n console.warn('Refresh token expired, signing out user')\n await signOut()\n return false\n }\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Update auth data with new tokens\n setAuthData(authData)\n \n console.log('Token refreshed successfully')\n return true\n } catch (error) {\n console.error('Failed to refresh token:', error)\n // On refresh failure, sign out the user\n await signOut()\n return false\n }\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 loading.value = true\n try {\n const response = await fetch('http://localhost:8000/api/v1/user/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\n currentUser.value = {\n id: userData.id,\n email: userData.email,\n firstName: userData.first_name,\n lastName: userData.last_name,\n phone: userData.phone,\n avatar: userData.avatar,\n mfaEnabled: userData.mfaEnabled || false,\n emailVerified: userData.email_verified,\n createdAt: userData.created_at,\n updatedAt: userData.updated_at || 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 return currentUser.value\n } finally {\n loading.value = 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 loading.value = true\n try {\n const response = await fetch('http://localhost:8000/api/v1/user/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 email: profileData.email,\n phone: profileData.phone,\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\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n id: updatedUserData.id,\n email: updatedUserData.email,\n firstName: updatedUserData.first_name,\n lastName: updatedUserData.last_name,\n emailVerified: updatedUserData.email_verified,\n // Keep existing properties not returned by API\n phone: profileData.phone,\n avatar: currentUser.value.avatar,\n mfaEnabled: currentUser.value.mfaEnabled,\n createdAt: updatedUserData.created_at,\n updatedAt: updatedUserData.updated_at || 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 currentUser.value\n } finally {\n loading.value = false\n }\n }\n\n const setAuthData = (authResponse: AuthResponse) => {\n try {\n // Set current user\n currentUser.value = authResponse.user\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: authResponse.user.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n localStorage.setItem('strands_auth_user', JSON.stringify(authResponse.user))\n }\n \n // Start automatic token refresh\n startTokenRefreshTimer()\n \n console.log('Auth data stored successfully', { user: authResponse.user.email })\n } catch (error) {\n console.error('Failed to store auth data:', error)\n }\n }\n\n // Token refresh timer management\n const startTokenRefreshTimer = () => {\n // Clear existing timer\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n }\n \n if (!currentSession.value) return\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 console.log('Token expired or expires soon, refreshing immediately')\n refreshToken()\n return\n }\n \n console.log(`Scheduling token refresh in ${Math.round(timeUntilRefresh / 1000)} seconds`)\n \n // Set timer to refresh token\n refreshTimer = setTimeout(async () => {\n console.log('Auto-refreshing token...')\n const success = await refreshToken()\n \n if (success) {\n // Schedule next refresh\n startTokenRefreshTimer()\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 isLoading.value = 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 console.log('Restored auth session for user:', user.email)\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 console.log('Stored session expired, cleared from storage')\n }\n } catch (error) {\n console.warn('Failed to restore auth session:', 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 console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\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\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n fetchProfile,\n updateProfile,\n initialize,\n setAuthData,\n \n // Token management\n startTokenRefreshTimer,\n stopTokenRefreshTimer,\n \n // Force re-initialization (useful for testing or navigation)\n forceReInit: () => {\n isInitialized.value = false\n isLoading.value = true\n initialize()\n },\n }\n}"],"names":["currentUser","ref","currentSession","loading","isLoading","isInitialized","refreshTimer","useStrandsAuth","isAuthenticated","computed","signIn","credentials","response","authData","setAuthData","signUp","userData","signOut","stopTokenRefreshTimer","refreshToken","responseText","error","fetchProfile","updateProfile","profileData","updatedUserData","authResponse","session","startTokenRefreshTimer","now","timeUntilRefresh","initialize","storedSession","storedUser","user","resolve"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const o=require("vue"),a=o.ref(null),r=o.ref(null),l=o.ref(!1),n=o.ref(!0),u=o.ref(!1);let i=null;function S(){const g=o.computed(()=>a.value!==null),w=async e=>{n.value=!0;try{const t=await fetch("http://localhost:8000/api/v1/auth/sign-in",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!t.ok)throw t.status===401?new Error("Invalid email or password"):t.status===403?new Error("Please verify your email address before signing in"):new Error(`Sign in failed: ${t.status} ${t.statusText}`);const s=await t.json();return h(s),s}finally{n.value=!1}},y=async e=>{n.value=!0;try{throw new Error("Sign up not implemented - please integrate with auth SDK")}finally{n.value=!1}},f=async()=>{n.value=!0;try{p(),a.value=null,r.value=null,typeof window<"u"&&(localStorage.removeItem("strands_auth_session"),localStorage.removeItem("strands_auth_user")),console.log("User signed out successfully")}finally{n.value=!1}},d=async()=>{if(!r.value?.refreshToken)return console.warn("No refresh token available"),!1;console.log("Attempting to refresh token...",{refreshToken:r.value.refreshToken.substring(0,50)+"...",expiresAt:r.value.expiresAt});try{const e=await fetch("http://localhost:8000/api/v1/auth/refresh",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:r.value.refreshToken})});if(!e.ok){const s=await e.text();if(console.error("Token refresh failed:",{status:e.status,statusText:e.statusText,body:s}),e.status===401)return console.warn("Refresh token expired, signing out user"),await f(),!1;throw new Error(`Token refresh failed: ${e.status} ${e.statusText}`)}const t=await e.json();return h(t),console.log("Token refreshed successfully"),!0}catch(e){return console.error("Failed to refresh token:",e),await f(),!1}},T=async()=>{if(!r.value?.accessToken)throw new Error("No access token available");l.value=!0;try{const e=await fetch("http://localhost:8000/api/v1/user/profile",{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r.value.accessToken}`}});if(!e.ok)throw e.status===401?new Error("Authentication expired. Please sign in again."):new Error(`Failed to fetch profile: ${e.status} ${e.statusText}`);const t=await e.json();return a.value={id:t.id,email:t.email,firstName:t.first_name,lastName:t.last_name,phone:t.phone,avatar:t.avatar,mfaEnabled:t.mfaEnabled||!1,emailVerified:t.email_verified,createdAt:t.created_at,updatedAt:t.updated_at||new Date().toISOString()},typeof window<"u"&&localStorage.setItem("strands_auth_user",JSON.stringify(a.value)),a.value}finally{l.value=!1}},_=async e=>{if(!r.value?.accessToken)throw new Error("No access token available");l.value=!0;try{const t=await fetch("http://localhost:8000/api/v1/user/profile",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r.value.accessToken}`},body:JSON.stringify({first_name:e.firstName,last_name:e.lastName,email:e.email,phone:e.phone})});if(!t.ok)throw t.status===401?new Error("Authentication expired. Please sign in again."):new Error(`Profile update failed: ${t.status} ${t.statusText}`);const s=await t.json();return a.value&&(a.value={...a.value,id:s.id,email:s.email,firstName:s.first_name,lastName:s.last_name,emailVerified:s.email_verified,phone:e.phone,avatar:a.value.avatar,mfaEnabled:a.value.mfaEnabled,createdAt:s.created_at,updatedAt:s.updated_at||new Date().toISOString()},typeof window<"u"&&localStorage.setItem("strands_auth_user",JSON.stringify(a.value))),a.value}finally{l.value=!1}},h=e=>{try{a.value=e.user;const t={accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:new Date(Date.now()+300*1e3),userId:e.user.id};r.value=t,typeof window<"u"&&(localStorage.setItem("strands_auth_session",JSON.stringify(t)),localStorage.setItem("strands_auth_user",JSON.stringify(e.user))),c(),console.log("Auth data stored successfully",{user:e.user.email})}catch(t){console.error("Failed to store auth data:",t)}},c=()=>{if(i&&clearTimeout(i),!r.value)return;const e=new Date,s=r.value.expiresAt.getTime()-e.getTime()-60*1e3;if(s<=0){console.log("Token expired or expires soon, refreshing immediately"),d();return}console.log(`Scheduling token refresh in ${Math.round(s/1e3)} seconds`),i=setTimeout(async()=>{console.log("Auto-refreshing token..."),await d()&&c()},s)},p=()=>{i&&(clearTimeout(i),i=null)},m=async()=>{if(!u.value){n.value=!0;try{if(typeof window<"u"){const e=localStorage.getItem("strands_auth_session"),t=localStorage.getItem("strands_auth_user");if(e&&t)try{const s=JSON.parse(e),v=JSON.parse(t);s.expiresAt=new Date(s.expiresAt),s.expiresAt>new Date?(r.value=s,a.value=v,console.log("Restored auth session for user:",v.email),c()):(localStorage.removeItem("strands_auth_session"),localStorage.removeItem("strands_auth_user"),console.log("Stored session expired, cleared from storage"))}catch(s){console.warn("Failed to restore auth session:",s),localStorage.removeItem("strands_auth_session"),localStorage.removeItem("strands_auth_user")}}u.value=!0,await new Promise(e=>setTimeout(e,50))}catch(e){console.error("Auth initialization error:",e)}finally{n.value=!1}}};return u.value||m(),{user:o.computed(()=>a.value),currentUser:o.computed(()=>a.value),currentSession:o.computed(()=>r.value),isAuthenticated:g,isLoading:o.computed(()=>n.value||!u.value),loading:o.computed(()=>l.value),signIn:w,signUp:y,signOut:f,refreshToken:d,fetchProfile:T,updateProfile:_,initialize:m,setAuthData:h,startTokenRefreshTimer:c,stopTokenRefreshTimer:p,forceReInit:()=>{u.value=!1,n.value=!0,m()}}}exports.useStrandsAuth=S;
2
+ //# sourceMappingURL=useStrandsAuth-C_MiRZbU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStrandsAuth-C_MiRZbU.cjs","sources":["../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["import { ref, computed } from 'vue'\nimport type { User, Session, SignInCredentials, SignUpData, AuthResponse } from '../../types'\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(true)\nconst isInitialized = ref(false)\n\n// Token refresh timer\nlet refreshTimer: NodeJS.Timeout | null = null\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n isLoading.value = true\n try {\n // Make API call to sign-in endpoint\n const response = await fetch('http://localhost:8000/api/v1/auth/sign-in', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\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 // Store the authentication data\n setAuthData(authData)\n \n return authData\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n isLoading.value = 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 isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // Stop token refresh timer\n stopTokenRefreshTimer()\n \n // Clear user and session state\n currentUser.value = null\n currentSession.value = null\n \n // Clear stored tokens\n if (typeof window !== 'undefined') {\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n }\n \n console.log('User signed out successfully')\n } finally {\n isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value?.refreshToken) {\n console.warn('No refresh token available')\n return false\n }\n \n console.log('Attempting to refresh token...', {\n refreshToken: currentSession.value.refreshToken.substring(0, 50) + '...',\n expiresAt: currentSession.value.expiresAt\n })\n \n try {\n const response = await fetch('http://localhost:8000/api/v1/auth/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 const responseText = await response.text()\n console.error('Token refresh failed:', {\n status: response.status,\n statusText: response.statusText,\n body: responseText\n })\n \n if (response.status === 401) {\n // Refresh token is invalid/expired, sign out user\n console.warn('Refresh token expired, signing out user')\n await signOut()\n return false\n }\n throw new Error(`Token refresh failed: ${response.status} ${response.statusText}`)\n }\n\n const authData: AuthResponse = await response.json()\n \n // Update auth data with new tokens\n setAuthData(authData)\n \n console.log('Token refreshed successfully')\n return true\n } catch (error) {\n console.error('Failed to refresh token:', error)\n // On refresh failure, sign out the user\n await signOut()\n return false\n }\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 loading.value = true\n try {\n const response = await fetch('http://localhost:8000/api/v1/user/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\n currentUser.value = {\n id: userData.id,\n email: userData.email,\n firstName: userData.first_name,\n lastName: userData.last_name,\n phone: userData.phone,\n avatar: userData.avatar,\n mfaEnabled: userData.mfaEnabled || false,\n emailVerified: userData.email_verified,\n createdAt: userData.created_at,\n updatedAt: userData.updated_at || 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 return currentUser.value\n } finally {\n loading.value = 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 loading.value = true\n try {\n const response = await fetch('http://localhost:8000/api/v1/user/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 email: profileData.email,\n phone: profileData.phone,\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\n if (currentUser.value) {\n currentUser.value = {\n ...currentUser.value,\n id: updatedUserData.id,\n email: updatedUserData.email,\n firstName: updatedUserData.first_name,\n lastName: updatedUserData.last_name,\n emailVerified: updatedUserData.email_verified,\n // Keep existing properties not returned by API\n phone: profileData.phone,\n avatar: currentUser.value.avatar,\n mfaEnabled: currentUser.value.mfaEnabled,\n createdAt: updatedUserData.created_at,\n updatedAt: updatedUserData.updated_at || 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 currentUser.value\n } finally {\n loading.value = false\n }\n }\n\n const setAuthData = (authResponse: AuthResponse) => {\n try {\n // Set current user\n currentUser.value = authResponse.user\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: authResponse.user.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n localStorage.setItem('strands_auth_user', JSON.stringify(authResponse.user))\n }\n \n // Start automatic token refresh\n startTokenRefreshTimer()\n \n console.log('Auth data stored successfully', { user: authResponse.user.email })\n } catch (error) {\n console.error('Failed to store auth data:', error)\n }\n }\n\n // Token refresh timer management\n const startTokenRefreshTimer = () => {\n // Clear existing timer\n if (refreshTimer) {\n clearTimeout(refreshTimer)\n }\n \n if (!currentSession.value) return\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 console.log('Token expired or expires soon, refreshing immediately')\n refreshToken()\n return\n }\n \n console.log(`Scheduling token refresh in ${Math.round(timeUntilRefresh / 1000)} seconds`)\n \n // Set timer to refresh token\n refreshTimer = setTimeout(async () => {\n console.log('Auto-refreshing token...')\n const success = await refreshToken()\n \n if (success) {\n // Schedule next refresh\n startTokenRefreshTimer()\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 isLoading.value = 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 console.log('Restored auth session for user:', user.email)\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 console.log('Stored session expired, cleared from storage')\n }\n } catch (error) {\n console.warn('Failed to restore auth session:', 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 console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\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\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n fetchProfile,\n updateProfile,\n initialize,\n setAuthData,\n \n // Token management\n startTokenRefreshTimer,\n stopTokenRefreshTimer,\n \n // Force re-initialization (useful for testing or navigation)\n forceReInit: () => {\n isInitialized.value = false\n isLoading.value = true\n initialize()\n },\n }\n}"],"names":["currentUser","ref","currentSession","loading","isLoading","isInitialized","refreshTimer","useStrandsAuth","isAuthenticated","computed","signIn","credentials","response","authData","setAuthData","signUp","userData","signOut","stopTokenRefreshTimer","refreshToken","responseText","error","fetchProfile","updateProfile","profileData","updatedUserData","authResponse","session","startTokenRefreshTimer","now","timeUntilRefresh","initialize","storedSession","storedUser","user","resolve"],"mappings":"oCAGMA,EAAcC,EAAAA,IAAiB,IAAI,EACnCC,EAAiBD,EAAAA,IAAoB,IAAI,EACzCE,EAAUF,EAAAA,IAAI,EAAK,EACnBG,EAAYH,EAAAA,IAAI,EAAI,EACpBI,EAAgBJ,EAAAA,IAAI,EAAK,EAG/B,IAAIK,EAAsC,KAEnC,SAASC,GAAiB,CAC/B,MAAMC,EAAkBC,EAAAA,SAAS,IAAMT,EAAY,QAAU,IAAI,EAEzDU,EAAS,MAAOC,GAAmC,CACzDP,EAAU,MAAQ,GAClB,GAAI,CAEF,MAAMQ,EAAW,MAAM,MAAM,4CAA6C,CACxE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAUD,CAAW,CAAA,CACjC,EAED,GAAI,CAACC,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM,2BAA2B,EAClCA,EAAS,SAAW,IACvB,IAAI,MAAM,oDAAoD,EAE9D,IAAI,MAAM,mBAAmBA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAI/E,MAAMC,EAAyB,MAAMD,EAAS,KAAA,EAG9C,OAAAE,EAAYD,CAAQ,EAEbA,CACT,QAAA,CACET,EAAU,MAAQ,EACpB,CACF,EAEMW,EAAS,MAAOC,GAAyB,CAC7CZ,EAAU,MAAQ,GAClB,GAAI,CAIF,MAAM,IAAI,MAAM,0DAA0D,CAC5E,QAAA,CACEA,EAAU,MAAQ,EACpB,CACF,EAEMa,EAAU,SAAY,CAC1Bb,EAAU,MAAQ,GAClB,GAAI,CAEFc,EAAA,EAGAlB,EAAY,MAAQ,KACpBE,EAAe,MAAQ,KAGnB,OAAO,OAAW,MACpB,aAAa,WAAW,sBAAsB,EAC9C,aAAa,WAAW,mBAAmB,GAG7C,QAAQ,IAAI,8BAA8B,CAC5C,QAAA,CACEE,EAAU,MAAQ,EACpB,CACF,EAEMe,EAAe,SAAY,CAC/B,GAAI,CAACjB,EAAe,OAAO,aACzB,eAAQ,KAAK,4BAA4B,EAClC,GAGT,QAAQ,IAAI,iCAAkC,CAC5C,aAAcA,EAAe,MAAM,aAAa,UAAU,EAAG,EAAE,EAAI,MACnE,UAAWA,EAAe,MAAM,SAAA,CACjC,EAED,GAAI,CACF,MAAMU,EAAW,MAAM,MAAM,4CAA6C,CACxE,OAAQ,OACR,QAAS,CACP,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CACnB,cAAeV,EAAe,MAAM,YAAA,CACrC,CAAA,CACF,EAED,GAAI,CAACU,EAAS,GAAI,CAChB,MAAMQ,EAAe,MAAMR,EAAS,KAAA,EAOpC,GANA,QAAQ,MAAM,wBAAyB,CACrC,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,KAAMQ,CAAA,CACP,EAEGR,EAAS,SAAW,IAEtB,eAAQ,KAAK,yCAAyC,EACtD,MAAMK,EAAA,EACC,GAET,MAAM,IAAI,MAAM,yBAAyBL,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,CACnF,CAEA,MAAMC,EAAyB,MAAMD,EAAS,KAAA,EAG9C,OAAAE,EAAYD,CAAQ,EAEpB,QAAQ,IAAI,8BAA8B,EACnC,EACT,OAASQ,EAAO,CACd,eAAQ,MAAM,2BAA4BA,CAAK,EAE/C,MAAMJ,EAAA,EACC,EACT,CACF,EAEMK,EAAe,SAAkC,CACrD,GAAI,CAACpB,EAAe,OAAO,YACzB,MAAM,IAAI,MAAM,2BAA2B,EAG7CC,EAAQ,MAAQ,GAChB,GAAI,CACF,MAAMS,EAAW,MAAM,MAAM,4CAA6C,CACxE,OAAQ,MACR,QAAS,CACP,eAAgB,mBAChB,cAAiB,UAAUV,EAAe,MAAM,WAAW,EAAA,CAC7D,CACD,EAED,GAAI,CAACU,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM,+CAA+C,EAEzD,IAAI,MAAM,4BAA4BA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAIxF,MAAMI,EAAW,MAAMJ,EAAS,KAAA,EAGhC,OAAAZ,EAAY,MAAQ,CAClB,GAAIgB,EAAS,GACb,MAAOA,EAAS,MAChB,UAAWA,EAAS,WACpB,SAAUA,EAAS,UACnB,MAAOA,EAAS,MAChB,OAAQA,EAAS,OACjB,WAAYA,EAAS,YAAc,GACnC,cAAeA,EAAS,eACxB,UAAWA,EAAS,WACpB,UAAWA,EAAS,YAAc,IAAI,KAAA,EAAO,YAAA,CAAY,EAIvD,OAAO,OAAW,KACpB,aAAa,QAAQ,oBAAqB,KAAK,UAAUhB,EAAY,KAAK,CAAC,EAGtEA,EAAY,KACrB,QAAA,CACEG,EAAQ,MAAQ,EAClB,CACF,EAEMoB,EAAgB,MAAOC,GAA+B,CAC1D,GAAI,CAACtB,EAAe,OAAO,YACzB,MAAM,IAAI,MAAM,2BAA2B,EAG7CC,EAAQ,MAAQ,GAChB,GAAI,CACF,MAAMS,EAAW,MAAM,MAAM,4CAA6C,CACxE,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAiB,UAAUV,EAAe,MAAM,WAAW,EAAA,EAE7D,KAAM,KAAK,UAAU,CACnB,WAAYsB,EAAY,UACxB,UAAWA,EAAY,SACvB,MAAOA,EAAY,MACnB,MAAOA,EAAY,KAAA,CACpB,CAAA,CACF,EAED,GAAI,CAACZ,EAAS,GACZ,MAAIA,EAAS,SAAW,IAChB,IAAI,MAAM,+CAA+C,EAEzD,IAAI,MAAM,0BAA0BA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAItF,MAAMa,EAAkB,MAAMb,EAAS,KAAA,EAGvC,OAAIZ,EAAY,QACdA,EAAY,MAAQ,CAClB,GAAGA,EAAY,MACf,GAAIyB,EAAgB,GACpB,MAAOA,EAAgB,MACvB,UAAWA,EAAgB,WAC3B,SAAUA,EAAgB,UAC1B,cAAeA,EAAgB,eAE/B,MAAOD,EAAY,MACnB,OAAQxB,EAAY,MAAM,OAC1B,WAAYA,EAAY,MAAM,WAC9B,UAAWyB,EAAgB,WAC3B,UAAWA,EAAgB,YAAc,IAAI,KAAA,EAAO,YAAA,CAAY,EAI9D,OAAO,OAAW,KACpB,aAAa,QAAQ,oBAAqB,KAAK,UAAUzB,EAAY,KAAK,CAAC,GAIxEA,EAAY,KACrB,QAAA,CACEG,EAAQ,MAAQ,EAClB,CACF,EAEMW,EAAeY,GAA+B,CAClD,GAAI,CAEF1B,EAAY,MAAQ0B,EAAa,KAGjC,MAAMC,EAAmB,CACvB,YAAaD,EAAa,aAC1B,aAAcA,EAAa,cAC3B,UAAW,IAAI,KAAK,KAAK,MAAQ,IAAS,GAAI,EAC9C,OAAQA,EAAa,KAAK,EAAA,EAG5BxB,EAAe,MAAQyB,EAGnB,OAAO,OAAW,MACpB,aAAa,QAAQ,uBAAwB,KAAK,UAAUA,CAAO,CAAC,EACpE,aAAa,QAAQ,oBAAqB,KAAK,UAAUD,EAAa,IAAI,CAAC,GAI7EE,EAAA,EAEA,QAAQ,IAAI,gCAAiC,CAAE,KAAMF,EAAa,KAAK,MAAO,CAChF,OAASL,EAAO,CACd,QAAQ,MAAM,6BAA8BA,CAAK,CACnD,CACF,EAGMO,EAAyB,IAAM,CAMnC,GAJItB,GACF,aAAaA,CAAY,EAGvB,CAACJ,EAAe,MAAO,OAG3B,MAAM2B,MAAU,KAEVC,EADY5B,EAAe,MAAM,UACJ,QAAA,EAAY2B,EAAI,QAAA,EAAa,GAAS,IAGzE,GAAIC,GAAoB,EAAG,CACzB,QAAQ,IAAI,uDAAuD,EACnEX,EAAA,EACA,MACF,CAEA,QAAQ,IAAI,+BAA+B,KAAK,MAAMW,EAAmB,GAAI,CAAC,UAAU,EAGxFxB,EAAe,WAAW,SAAY,CACpC,QAAQ,IAAI,0BAA0B,EACtB,MAAMa,EAAA,GAIpBS,EAAA,CAEJ,EAAGE,CAAgB,CACrB,EAEMZ,EAAwB,IAAM,CAC9BZ,IACF,aAAaA,CAAY,EACzBA,EAAe,KAEnB,EAEMyB,EAAa,SAAY,CAC7B,GAAI,CAAA1B,EAAc,MAElB,CAAAD,EAAU,MAAQ,GAClB,GAAI,CAEF,GAAI,OAAO,OAAW,IAAa,CACjC,MAAM4B,EAAgB,aAAa,QAAQ,sBAAsB,EAC3DC,EAAa,aAAa,QAAQ,mBAAmB,EAE3D,GAAID,GAAiBC,EACnB,GAAI,CACF,MAAMN,EAAU,KAAK,MAAMK,CAAa,EAClCE,EAAO,KAAK,MAAMD,CAAU,EAGlCN,EAAQ,UAAY,IAAI,KAAKA,EAAQ,SAAS,EAG1CA,EAAQ,UAAY,IAAI,MAC1BzB,EAAe,MAAQyB,EACvB3B,EAAY,MAAQkC,EACpB,QAAQ,IAAI,kCAAmCA,EAAK,KAAK,EAGzDN,EAAA,IAGA,aAAa,WAAW,sBAAsB,EAC9C,aAAa,WAAW,mBAAmB,EAC3C,QAAQ,IAAI,8CAA8C,EAE9D,OAASP,EAAO,CACd,QAAQ,KAAK,kCAAmCA,CAAK,EAErD,aAAa,WAAW,sBAAsB,EAC9C,aAAa,WAAW,mBAAmB,CAC7C,CAEJ,CAEAhB,EAAc,MAAQ,GAGtB,MAAM,IAAI,QAAQ8B,GAAW,WAAWA,EAAS,EAAE,CAAC,CACtD,OAASd,EAAO,CACd,QAAQ,MAAM,6BAA8BA,CAAK,CACnD,QAAA,CACEjB,EAAU,MAAQ,EACpB,EACF,EAGA,OAAKC,EAAc,OACjB0B,EAAA,EAGK,CAEL,KAAMtB,EAAAA,SAAS,IAAMT,EAAY,KAAK,EACtC,YAAaS,EAAAA,SAAS,IAAMT,EAAY,KAAK,EAC7C,eAAgBS,EAAAA,SAAS,IAAMP,EAAe,KAAK,EACnD,gBAAAM,EACA,UAAWC,EAAAA,SAAS,IAAML,EAAU,OAAS,CAACC,EAAc,KAAK,EACjE,QAASI,EAAAA,SAAS,IAAMN,EAAQ,KAAK,EAGrC,OAAAO,EACA,OAAAK,EACA,QAAAE,EACA,aAAAE,EACA,aAAAG,EACA,cAAAC,EACA,WAAAQ,EACA,YAAAjB,EAGA,uBAAAc,EACA,sBAAAV,EAGA,YAAa,IAAM,CACjBb,EAAc,MAAQ,GACtBD,EAAU,MAAQ,GAClB2B,EAAA,CACF,CAAA,CAEJ"}
@@ -22,6 +22,7 @@ declare function __VLS_template(): {
22
22
  fallback?(_: {
23
23
  signIn: () => void;
24
24
  }): any;
25
+ loading?(_: {}): any;
25
26
  };
26
27
  refs: {};
27
28
  rootEl: any;
@@ -1 +1 @@
1
- {"version":3,"file":"SignedIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedIn.vue"],"names":[],"mappings":"AAyBA;AAsDA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAyBD,iBAAS,cAAc;WAiET,OAAO,IAA6B;;;;;;;;;;;;;;;;YAXrB,GAAG;;;YACF,GAAG;;;;EAehC;AAcD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;kBA/GJ,OAAO;6EAuHtB,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
+ {"version":3,"file":"SignedIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedIn.vue"],"names":[],"mappings":"AAmCA;AA+EA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAsCD,iBAAS,cAAc;WAwFT,OAAO,IAA6B;;;;;;;;;;;;;;;;YAZrB,GAAG;;;YACF,GAAG;yBACJ,GAAG;;;;EAe/B;AAgBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;kBArJJ,OAAO;6EA6JtB,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 +1 @@
1
- {"version":3,"file":"SignedOut.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedOut.vue"],"names":[],"mappings":"AAuCA;AAuEA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AA8BD,iBAAS,cAAc;WAsGT,OAAO,IAA6B;;;;;YAZrB,GAAG;;;;;;;;;;;;;;;YACF,GAAG;yBACJ,GAAG;;;;EAe/B;AAgBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;kBA3JJ,OAAO;6EAmKtB,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
+ {"version":3,"file":"SignedOut.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/SignedOut.vue"],"names":[],"mappings":"AAmCA;AAqEA,UAAU,KAAK;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AA8BD,iBAAS,cAAc;WA0FT,OAAO,IAA6B;;;;;YAZrB,GAAG;;;;;;;;;;;;;;;YACF,GAAG;yBACJ,GAAG;;;;EAe/B;AAiBD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;kBAhJJ,OAAO;6EAwJtB,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 +1 @@
1
- {"version":3,"file":"StrandsAuth.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue"],"names":[],"mappings":"AAgKA;AAmxBA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAG1F,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;;;;;iBAHe,MAAM;UADb,QAAQ,GAAG,QAAQ,GAAG,gBAAgB;;AAu0B/C,wBASG"}
1
+ {"version":3,"file":"StrandsAuth.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue"],"names":[],"mappings":"AAgKA;AAgyBA,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;IAEpB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;;;;;iBAHe,MAAM;UADb,QAAQ,GAAG,QAAQ,GAAG,gBAAgB;;AAk1B/C,wBASG"}
@@ -1 +1 @@
1
- {"version":3,"file":"StrandsSignIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue"],"names":[],"mappings":"AAqGA;AAgMA,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;;;;;;;;;;;;iBAHe,MAAM;iBACN,MAAM,EAAE;;AAubxB,wBASG"}
1
+ {"version":3,"file":"StrandsSignIn.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue"],"names":[],"mappings":"AAqGA;AAgOA,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;;;;;;;;;;;;iBAHe,MAAM;iBACN,MAAM,EAAE;;AAqdxB,wBASG"}
@@ -13,6 +13,7 @@ interface User {
13
13
  interface Props {
14
14
  user?: User;
15
15
  config?: StrandsAuthConfig;
16
+ autoFetch?: boolean;
16
17
  }
17
18
  declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
18
19
  error: (error: string) => any;
@@ -24,6 +25,8 @@ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, imp
24
25
  "onProfile-updated"?: ((user: User) => any) | undefined;
25
26
  "onManage-sessions"?: (() => any) | undefined;
26
27
  "onMfa-toggle"?: ((enabled: boolean) => any) | undefined;
27
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
28
+ }>, {
29
+ autoFetch: boolean;
30
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
28
31
  export default _default;
29
32
  //# sourceMappingURL=StrandsUserProfile.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StrandsUserProfile.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue"],"names":[],"mappings":"AAmRA;AA6cA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAE1F,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;;;;;;;;;;;;AAomBD,wBAQG"}
1
+ {"version":3,"file":"StrandsUserProfile.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue"],"names":[],"mappings":"AA+OA;AA8cA,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAG1F,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;;;;;;;;;;;;eADa,OAAO;;AAsuBrB,wBASG"}
@@ -2,19 +2,16 @@ export interface OAuthProvider {
2
2
  id: string;
3
3
  name: string;
4
4
  displayName?: string;
5
+ icon?: string;
5
6
  iconUrl?: string;
6
- redirectUrl: string;
7
- scopes?: string[];
7
+ auth_url: string;
8
+ scopes: string[];
8
9
  enabled: boolean;
10
+ metadata?: Record<string, string>;
9
11
  }
10
12
  export interface OAuthProvidersResponse {
11
- success: boolean;
12
- data: OAuthProvider[];
13
- error?: {
14
- code: string;
15
- message: string;
16
- details?: any;
17
- };
13
+ providers: OAuthProvider[];
14
+ redirect_url: string;
18
15
  }
19
16
  export interface OAuthProviderDetailsResponse {
20
17
  success: boolean;
@@ -38,19 +35,23 @@ export declare function useOAuthProviders(options?: UseOAuthProvidersOptions): {
38
35
  id: string;
39
36
  name: string;
40
37
  displayName?: string | undefined;
38
+ icon?: string | undefined;
41
39
  iconUrl?: string | undefined;
42
- redirectUrl: string;
43
- scopes?: string[] | undefined;
40
+ auth_url: string;
41
+ scopes: string[];
44
42
  enabled: boolean;
43
+ metadata?: Record<string, string> | undefined;
45
44
  }[]>;
46
45
  enabledProviders: import('vue').ComputedRef<{
47
46
  id: string;
48
47
  name: string;
49
48
  displayName?: string | undefined;
49
+ icon?: string | undefined;
50
50
  iconUrl?: string | undefined;
51
- redirectUrl: string;
52
- scopes?: string[] | undefined;
51
+ auth_url: string;
52
+ scopes: string[];
53
53
  enabled: boolean;
54
+ metadata?: Record<string, string> | undefined;
54
55
  }[]>;
55
56
  loading: import('vue').ComputedRef<boolean>;
56
57
  error: import('vue').ComputedRef<string | null>;
@@ -61,10 +62,12 @@ export declare function useOAuthProviders(options?: UseOAuthProvidersOptions): {
61
62
  id: string;
62
63
  name: string;
63
64
  displayName?: string | undefined;
65
+ icon?: string | undefined;
64
66
  iconUrl?: string | undefined;
65
- redirectUrl: string;
66
- scopes?: string[] | undefined;
67
+ auth_url: string;
68
+ scopes: string[];
67
69
  enabled: boolean;
70
+ metadata?: Record<string, string> | undefined;
68
71
  } | undefined;
69
72
  getProviderIcon: (provider: OAuthProvider) => string;
70
73
  };
@@ -1 +1 @@
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,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,aAAa,EAAE,CAAA;IACrB,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,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;;YAtClE,MAAM;cACJ,MAAM;sBACE,MAAM;kBACV,MAAM;qBACH,MAAM;iBACV,MAAM,EAAE;iBACR,OAAO;;;YANZ,MAAM;cACJ,MAAM;sBACE,MAAM;kBACV,MAAM;qBACH,MAAM;iBACV,MAAM,EAAE;iBACR,OAAO;;;;;qCA4EF,MAAM,kBACF,OAAO,CAAC,wBAAwB,CAAC,KAChD,OAAO,CAAC,MAAM,CAAC;qCA6CJ,MAAM,kBACF,OAAO,CAAC,wBAAwB,CAAC;kCAWd,MAAM;YA7IvC,MAAM;cACJ,MAAM;sBACE,MAAM;kBACV,MAAM;qBACH,MAAM;iBACV,MAAM,EAAE;iBACR,OAAO;;gCA2ImB,aAAa,KAAG,MAAM;EAkC1D"}
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;;;;;qCAsEnB,MAAM,kBACF,OAAO,CAAC,wBAAwB,CAAC,KAChD,OAAO,CAAC,MAAM,CAAC;qCA6CJ,MAAM,kBACF,OAAO,CAAC,wBAAwB,CAAC;kCAoBd,MAAM;YAlJvC,MAAM;cACJ,MAAM;sBACE,MAAM;eACb,MAAM;kBACH,MAAM;kBACN,MAAM;gBACR,MAAM,EAAE;iBACP,OAAO;mBACL,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;gCA8IE,aAAa,KAAG,MAAM;EAkC1D"}
@@ -35,12 +35,27 @@ export declare function useStrandsAuth(): {
35
35
  isAuthenticated: import('vue').ComputedRef<boolean>;
36
36
  isLoading: import('vue').ComputedRef<boolean>;
37
37
  loading: import('vue').ComputedRef<boolean>;
38
- signIn: (credentials: SignInCredentials) => Promise<never>;
38
+ signIn: (credentials: SignInCredentials) => Promise<AuthResponse>;
39
39
  signUp: (userData: SignUpData) => Promise<never>;
40
40
  signOut: () => Promise<void>;
41
- refreshToken: () => Promise<void>;
42
- updateProfile: (profileData: Partial<User>) => Promise<void>;
41
+ refreshToken: () => Promise<boolean>;
42
+ fetchProfile: () => Promise<User | null>;
43
+ updateProfile: (profileData: Partial<User>) => Promise<{
44
+ id: string;
45
+ email: string;
46
+ firstName: string;
47
+ lastName: string;
48
+ phone?: string | undefined;
49
+ avatar?: string | undefined;
50
+ mfaEnabled: boolean;
51
+ emailVerified: boolean;
52
+ createdAt: string | Date;
53
+ updatedAt: string | Date;
54
+ } | null>;
43
55
  initialize: () => Promise<void>;
44
56
  setAuthData: (authResponse: AuthResponse) => void;
57
+ startTokenRefreshTimer: () => void;
58
+ stopTokenRefreshTimer: () => void;
59
+ forceReInit: () => void;
45
60
  };
46
61
  //# sourceMappingURL=useStrandsAuth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStrandsAuth.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAW,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAQ7F,wBAAgB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAGS,iBAAiB;uBAatB,UAAU;;;iCA4CA,OAAO,CAAC,IAAI,CAAC;;gCAcpB,YAAY;EAgGhD"}
1
+ {"version":3,"file":"useStrandsAuth.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAW,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAW7F,wBAAgB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAGS,iBAAiB;uBAiCtB,UAAU;;;wBAwFX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;iCAkDT,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;;gCA4DpB,YAAY;;;;EA+JhD"}
@@ -0,0 +1,15 @@
1
+ interface Props {
2
+ size?: number;
3
+ variant?: 'light' | 'dark' | 'auto';
4
+ text?: string;
5
+ showParticles?: boolean;
6
+ centered?: boolean;
7
+ }
8
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
9
+ variant: "light" | "dark" | "auto";
10
+ size: number;
11
+ showParticles: boolean;
12
+ centered: boolean;
13
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
14
+ export default _default;
15
+ //# sourceMappingURL=UiLoader.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UiLoader.vue.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/ui/UiLoader.vue"],"names":[],"mappings":"AA4FA;AAqOA,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;;aAJW,OAAO,GAAG,MAAM,GAAG,MAAM;UAD5B,MAAM;mBAGG,OAAO;cACZ,OAAO;;AA0MpB,wBAQG"}
@@ -4,6 +4,7 @@ export { default as UiCard } from './UiCard.vue';
4
4
  export { default as UiInput } from './UiInput.vue';
5
5
  export { default as UiLink } from './UiLink.vue';
6
6
  export { default as UiTabs } from './UiTabs.vue';
7
+ export { default as UILoader } from './UiLoader.vue';
7
8
  export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline';
8
9
  export type ButtonSize = 'sm' | 'md' | 'lg';
9
10
  export type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/ui/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAGhD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC3C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAA;AAChF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAA;AACzE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/vue/ui/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGpD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAA;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC3C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAA;AAChF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,CAAA;AACzE,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strands.gg/accui",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "Strands Authentication UI Components",
5
5
  "type": "module",
6
6
  "main": "./dist/strands-auth-ui.cjs.js",
@@ -1,2 +0,0 @@
1
- "use strict";const t=require("vue"),r=t.ref(null),o=t.ref(null),l=t.ref(!1),s=t.ref(!1),u=t.ref(!1);function S(){const d=t.computed(()=>r.value!==null),f=async e=>{s.value=!0;try{throw new Error("Sign in not implemented - please integrate with auth SDK")}finally{s.value=!1}},v=async e=>{s.value=!0;try{throw new Error("Sign up not implemented - please integrate with auth SDK")}finally{s.value=!1}},g=async()=>{s.value=!0;try{r.value=null,o.value=null,typeof window<"u"&&(localStorage.removeItem("strands_auth_session"),localStorage.removeItem("strands_auth_user"))}finally{s.value=!1}},m=async()=>{o.value&&(l.value=!0,l.value=!1)},h=async e=>{l.value=!0;try{r.value&&Object.assign(r.value,e)}finally{l.value=!1}},y=e=>{try{r.value=e.user;const a={accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:new Date(Date.now()+300*1e3),userId:e.user.id};o.value=a,typeof window<"u"&&(localStorage.setItem("strands_auth_session",JSON.stringify(a)),localStorage.setItem("strands_auth_user",JSON.stringify(e.user))),console.log("Auth data stored successfully",{user:e.user.email})}catch(a){console.error("Failed to store auth data:",a)}},i=async()=>{if(!u.value){s.value=!0;try{if(typeof window<"u"){const e=localStorage.getItem("strands_auth_session"),a=localStorage.getItem("strands_auth_user");if(e&&a)try{const n=JSON.parse(e),c=JSON.parse(a);n.expiresAt=new Date(n.expiresAt),n.expiresAt>new Date?(o.value=n,r.value=c,console.log("Restored auth session for user:",c.email)):(localStorage.removeItem("strands_auth_session"),localStorage.removeItem("strands_auth_user"),console.log("Stored session expired, cleared from storage"))}catch(n){console.warn("Failed to restore auth session:",n),localStorage.removeItem("strands_auth_session"),localStorage.removeItem("strands_auth_user")}}u.value=!0}catch(e){console.error("Auth initialization error:",e)}finally{s.value=!1}}};return u.value||i(),{user:t.computed(()=>r.value),currentUser:t.computed(()=>r.value),currentSession:t.computed(()=>o.value),isAuthenticated:d,isLoading:t.computed(()=>s.value),loading:t.computed(()=>l.value),signIn:f,signUp:v,signOut:g,refreshToken:m,updateProfile:h,initialize:i,setAuthData:y}}exports.useStrandsAuth=S;
2
- //# sourceMappingURL=useStrandsAuth-BGunGG2x.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useStrandsAuth-BGunGG2x.cjs","sources":["../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts"],"sourcesContent":["import { ref, computed } from 'vue'\nimport type { User, Session, SignInCredentials, SignUpData, AuthResponse } from '../../types'\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(false)\nconst isInitialized = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: SignInCredentials) => {\n isLoading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const result = await authSDK.signIn(credentials)\n \n // For now, throw an error to indicate this needs implementation\n throw new Error('Sign in not implemented - please integrate with auth SDK')\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: SignUpData) => {\n isLoading.value = 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 isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: await authSDK.signOut()\n \n currentUser.value = null\n currentSession.value = null\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 isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const newSession = await authSDK.refreshToken(currentSession.value.refreshToken)\n // currentSession.value = newSession\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // Integration point: Replace with actual auth SDK call\n // Example: const updatedUser = await authSDK.updateProfile(profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n const setAuthData = (authResponse: AuthResponse) => {\n try {\n // Set current user\n currentUser.value = authResponse.user\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: authResponse.user.id,\n }\n \n currentSession.value = session\n \n // Store in localStorage for persistence\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_session', JSON.stringify(session))\n localStorage.setItem('strands_auth_user', JSON.stringify(authResponse.user))\n }\n \n console.log('Auth data stored successfully', { user: authResponse.user.email })\n } catch (error) {\n console.error('Failed to store auth data:', error)\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isLoading.value = 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 console.log('Restored auth session for user:', user.email)\n } else {\n // Session expired, clear storage\n localStorage.removeItem('strands_auth_session')\n localStorage.removeItem('strands_auth_user')\n console.log('Stored session expired, cleared from storage')\n }\n } catch (error) {\n console.warn('Failed to restore auth session:', 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 } catch (error) {\n console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\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),\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n initialize,\n setAuthData,\n }\n}"],"names":["currentUser","ref","currentSession","loading","isLoading","isInitialized","useStrandsAuth","isAuthenticated","computed","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData","setAuthData","authResponse","session","error","initialize","storedSession","storedUser","user"],"mappings":"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"}