@strands.gg/accui 2.1.2 → 2.1.4
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 +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/nuxt/module.d.ts +6 -0
- package/dist/nuxt/module.d.ts.map +1 -0
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.cjs.js +1 -1
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.cjs.js.map +1 -1
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.d.ts +21 -0
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.d.ts.map +1 -0
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.es.js +5 -2
- package/dist/nuxt/runtime/composables/useAuthenticatedFetch.es.js.map +1 -1
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts +143 -0
- package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts.map +1 -0
- package/dist/nuxt/runtime/middleware/auth.d.ts +8 -0
- package/dist/nuxt/runtime/middleware/auth.d.ts.map +1 -0
- package/dist/nuxt/runtime/middleware/auth.global.d.ts +4 -0
- package/dist/nuxt/runtime/middleware/auth.global.d.ts.map +1 -0
- package/dist/nuxt/runtime/middleware/guest.d.ts +8 -0
- package/dist/nuxt/runtime/middleware/guest.d.ts.map +1 -0
- package/dist/nuxt/runtime/plugin.client.d.ts +4 -0
- package/dist/nuxt/runtime/plugin.client.d.ts.map +1 -0
- package/dist/nuxt/runtime/plugin.server.d.ts +4 -0
- package/dist/nuxt/runtime/plugin.server.d.ts.map +1 -0
- package/dist/nuxt/runtime/plugins/auth-interceptor.client.d.ts +4 -0
- package/dist/nuxt/runtime/plugins/auth-interceptor.client.d.ts.map +1 -0
- package/dist/nuxt/types.d.ts +46 -0
- package/dist/nuxt/types.d.ts.map +1 -0
- package/dist/nuxt-v4/module.d.ts +6 -0
- package/dist/nuxt-v4/module.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.d.ts +21 -0
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.es.js +5 -2
- package/dist/nuxt-v4/runtime/composables/useAuthenticatedFetch.es.js.map +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.d.ts +28 -0
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js +1 -0
- package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js.map +1 -1
- package/dist/nuxt-v4/runtime/middleware/auth.global.d.ts +4 -0
- package/dist/nuxt-v4/runtime/middleware/auth.global.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/plugin.client.d.ts +4 -0
- package/dist/nuxt-v4/runtime/plugin.client.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/plugin.server.d.ts +4 -0
- package/dist/nuxt-v4/runtime/plugin.server.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.d.ts +4 -0
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.d.ts.map +1 -0
- package/dist/nuxt-v4/runtime/plugins/auth-interceptor.client.es.js.map +1 -1
- package/dist/nuxt-v4/types.d.ts +64 -0
- package/dist/nuxt-v4/types.d.ts.map +1 -0
- package/dist/nuxt-v4.d.ts +5 -0
- package/dist/nuxt-v4.d.ts.map +1 -0
- package/dist/nuxt.d.ts +5 -0
- package/dist/nuxt.d.ts.map +1 -0
- package/dist/shared/defaults.d.ts +3 -0
- package/dist/shared/defaults.d.ts.map +1 -0
- package/dist/strands-auth-ui.cjs.js +1 -1
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +4 -2
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/dist/types/index.d.ts +237 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/slots.d.ts +2 -0
- package/dist/utils/slots.d.ts.map +1 -0
- package/dist/utils/validation.d.ts +13 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/vue/components/SignedIn.vue.d.ts +55 -0
- package/dist/vue/components/SignedIn.vue.d.ts.map +1 -0
- package/dist/vue/components/SignedOut.vue.d.ts +55 -0
- package/dist/vue/components/SignedOut.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsAuth.vue.d.ts +26 -0
- package/dist/vue/components/StrandsAuth.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsBackupCodesModal.vue.d.ts +13 -0
- package/dist/vue/components/StrandsBackupCodesModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsCompleteSignUp.vue.d.ts +22 -0
- package/dist/vue/components/StrandsCompleteSignUp.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsConfigProvider.vue.d.ts +23 -0
- package/dist/vue/components/StrandsConfigProvider.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsConfirmModal.vue.d.ts +23 -0
- package/dist/vue/components/StrandsConfirmModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsEmailMfaSetupModal.vue.d.ts +13 -0
- package/dist/vue/components/StrandsEmailMfaSetupModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsHardwareKeySetupModal.vue.d.ts +16 -0
- package/dist/vue/components/StrandsHardwareKeySetupModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsLogo.vue.d.ts +9 -0
- package/dist/vue/components/StrandsLogo.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsMFASetup.vue.d.ts +17 -0
- package/dist/vue/components/StrandsMFASetup.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsMfaModal.vue.d.ts +13 -0
- package/dist/vue/components/StrandsMfaModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsMfaVerification.vue.d.ts +18 -0
- package/dist/vue/components/StrandsMfaVerification.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsPasswordReset.vue.d.ts +16 -0
- package/dist/vue/components/StrandsPasswordReset.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsSecuredFooter.vue.d.ts +23 -0
- package/dist/vue/components/StrandsSecuredFooter.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsSessionsModal.vue.d.ts +15 -0
- package/dist/vue/components/StrandsSessionsModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsSettingsModal.vue.d.ts +19 -0
- package/dist/vue/components/StrandsSettingsModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsSignIn.vue.d.ts +22 -0
- package/dist/vue/components/StrandsSignIn.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsSignUp.vue.d.ts +20 -0
- package/dist/vue/components/StrandsSignUp.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsTotpSetupModal.vue.d.ts +13 -0
- package/dist/vue/components/StrandsTotpSetupModal.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsUserButton.vue.d.ts +31 -0
- package/dist/vue/components/StrandsUserButton.vue.d.ts.map +1 -0
- package/dist/vue/components/StrandsUserProfile.vue.d.ts +27 -0
- package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -0
- package/dist/vue/components/SvgIcon.vue.d.ts +18 -0
- package/dist/vue/components/SvgIcon.vue.d.ts.map +1 -0
- package/dist/vue/components/VirtualList.vue.d.ts +38 -0
- package/dist/vue/components/VirtualList.vue.d.ts.map +1 -0
- package/dist/vue/components/icons/IconGithub.vue.d.ts +4 -0
- package/dist/vue/components/icons/IconGithub.vue.d.ts.map +1 -0
- package/dist/vue/components/icons/IconGoogle.vue.d.ts +4 -0
- package/dist/vue/components/icons/IconGoogle.vue.d.ts.map +1 -0
- package/dist/vue/components/icons/index.d.ts +3 -0
- package/dist/vue/components/icons/index.d.ts.map +1 -0
- package/dist/vue/components/index.d.ts +27 -0
- package/dist/vue/components/index.d.ts.map +1 -0
- package/dist/vue/composables/useAuthenticatedFetch.d.ts +21 -0
- package/dist/vue/composables/useAuthenticatedFetch.d.ts.map +1 -0
- package/dist/vue/composables/useOAuthProviders.d.ts +75 -0
- package/dist/vue/composables/useOAuthProviders.d.ts.map +1 -0
- package/dist/vue/composables/useStrandsAuth.d.ts +131 -0
- package/dist/vue/composables/useStrandsAuth.d.ts.map +1 -0
- package/dist/vue/composables/useStrandsConfig.d.ts +12 -0
- package/dist/vue/composables/useStrandsConfig.d.ts.map +1 -0
- package/dist/vue/composables/useStrandsMfa.d.ts +39 -0
- package/dist/vue/composables/useStrandsMfa.d.ts.map +1 -0
- package/dist/vue/index.d.ts +13 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/plugins/StrandsUIPlugin.d.ts +20 -0
- package/dist/vue/plugins/StrandsUIPlugin.d.ts.map +1 -0
- package/dist/vue/ui/UiAlert.vue.d.ts +32 -0
- package/dist/vue/ui/UiAlert.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiAvatarEditor.vue.d.ts +26 -0
- package/dist/vue/ui/UiAvatarEditor.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiButton.vue.d.ts +55 -0
- package/dist/vue/ui/UiButton.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiCard.vue.d.ts +30 -0
- package/dist/vue/ui/UiCard.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiInput.vue.d.ts +49 -0
- package/dist/vue/ui/UiInput.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiLevelProgress.vue.d.ts +20 -0
- package/dist/vue/ui/UiLevelProgress.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiLink.vue.d.ts +43 -0
- package/dist/vue/ui/UiLink.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiLoader.vue.d.ts +16 -0
- package/dist/vue/ui/UiLoader.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiModal.vue.d.ts +34 -0
- package/dist/vue/ui/UiModal.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiTabs.vue.d.ts +18 -0
- package/dist/vue/ui/UiTabs.vue.d.ts.map +1 -0
- package/dist/vue/ui/UiToggle.vue.d.ts +16 -0
- package/dist/vue/ui/UiToggle.vue.d.ts.map +1 -0
- package/dist/vue/ui/index.d.ts +30 -0
- package/dist/vue/ui/index.d.ts.map +1 -0
- package/dist/vue/utils/contrast.d.ts +80 -0
- package/dist/vue/utils/contrast.d.ts.map +1 -0
- package/dist/vue/utils/debounce.d.ts +13 -0
- package/dist/vue/utils/debounce.d.ts.map +1 -0
- package/dist/vue/utils/fontPreloader.d.ts +20 -0
- package/dist/vue/utils/fontPreloader.d.ts.map +1 -0
- package/dist/vue/utils/iconProps.d.ts +10 -0
- package/dist/vue/utils/iconProps.d.ts.map +1 -0
- package/dist/vue/utils/lazyComponents.d.ts +3 -0
- package/dist/vue/utils/lazyComponents.d.ts.map +1 -0
- package/dist/vue/utils/levels.d.ts +28 -0
- package/dist/vue/utils/levels.d.ts.map +1 -0
- package/dist/vue/utils/performanceInit.d.ts +41 -0
- package/dist/vue/utils/performanceInit.d.ts.map +1 -0
- package/dist/vue/utils/requestCache.d.ts +50 -0
- package/dist/vue/utils/requestCache.d.ts.map +1 -0
- package/dist/vue/utils/sounds.d.ts +57 -0
- package/dist/vue/utils/sounds.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './vue/components';
|
|
2
|
+
export * from './vue/ui';
|
|
3
|
+
export { default as StrandsUIPlugin } from './vue/plugins/StrandsUIPlugin';
|
|
4
|
+
export { useStrandsAuth, useStrandsConfig, setStrandsConfig, provideStrandsConfig, useOAuthProviders, useAuthenticatedFetch, $authFetch } from './vue';
|
|
5
|
+
export * from './utils';
|
|
6
|
+
export type * from './types/index';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../apps/accounts-ui/src/index.ts"],"names":[],"mappings":"AACA,OAAO,mBAAmB,CAAA;AAG1B,cAAc,kBAAkB,CAAA;AAGhC,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAG1E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAGtJ,cAAc,SAAS,CAAA;AAGvB,mBAAmB,eAAe,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StrandsAuthConfig } from '../types';
|
|
2
|
+
import { NuxtModule } from '@nuxt/schema';
|
|
3
|
+
export type { StrandsAuthConfig, StrandsAuthEndpoints } from '../types';
|
|
4
|
+
declare const _default: NuxtModule<StrandsAuthConfig, StrandsAuthConfig, false>;
|
|
5
|
+
export default _default;
|
|
6
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/nuxt/module.ts"],"names":[],"mappings":";AAGA,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;;AAmBjD,wBA0HE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useStrandsAuth.cjs.js");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("nuxt/app"),t=require("./useStrandsAuth.cjs.js");function s(){const s=e.useRuntimeConfig().public.strandsAuth,{currentSession:n,refreshToken:o,getAuthHeaders:r}=t.useStrandsAuth(),a=async(e,t={})=>{const{autoRefresh:a=!0,requireAuth:c=!0,baseURL:h,...u}=t;if(c&&!n.value?.accessToken)throw new Error("User is not authenticated");let i=e;const p=h||s.baseUrl;p&&"string"==typeof e&&!e.startsWith("http")&&(i=new URL(e,p).toString());const d=new Headers(u.headers);if(n.value?.accessToken)try{const e=r();Object.entries(e).forEach(([e,t])=>{d.set(e,t)})}catch(l){if(c)throw l}const y={...u,headers:d};let f=await fetch(i,y);if(401===f.status&&a&&n.value?.refreshToken)try{if(await o()&&n.value?.accessToken){const e=r();Object.entries(e).forEach(([e,t])=>{d.set(e,t)}),f=await fetch(i,{...y,headers:d})}}catch(T){}return f};return{authenticatedFetch:a,get:(e,t)=>a(e,{...t,method:"GET"}),post:(e,t,s)=>{const n=new Headers(s?.headers);return t&&"object"==typeof t&&!n.has("Content-Type")&&n.set("Content-Type","application/json"),a(e,{...s,method:"POST",headers:n,body:"object"==typeof t?JSON.stringify(t):t})},put:(e,t,s)=>{const n=new Headers(s?.headers);return t&&"object"==typeof t&&!n.has("Content-Type")&&n.set("Content-Type","application/json"),a(e,{...s,method:"PUT",headers:n,body:"object"==typeof t?JSON.stringify(t):t})},delete:(e,t)=>a(e,{...t,method:"DELETE"}),patch:(e,t,s)=>{const n=new Headers(s?.headers);return t&&"object"==typeof t&&!n.has("Content-Type")&&n.set("Content-Type","application/json"),a(e,{...s,method:"PATCH",headers:n,body:"object"==typeof t?JSON.stringify(t):t})}}}const n={get:async(e,t)=>{const{get:n}=s();return n(e,t)},post:async(e,t,n)=>{const{post:o}=s();return o(e,t,n)},put:async(e,t,n)=>{const{put:o}=s();return o(e,t,n)},delete:async(e,t)=>{const{delete:n}=s();return n(e,t)},patch:async(e,t,n)=>{const{patch:o}=s();return o(e,t,n)}};exports.$authFetch=n,exports.useAuthenticatedFetch=s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthenticatedFetch.cjs.js","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/composables/useAuthenticatedFetch.ts"],"sourcesContent":["import { useStrandsAuth } from './useStrandsAuth'\nimport type { AuthenticatedFetchOptions } from '../../../types'\n\n/**\n * Enhanced fetch composable that automatically includes auth headers\n * and handles token refresh for API requests\n */\nexport function useAuthenticatedFetch() {\n const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth()\n\n const authenticatedFetch = async (\n url: string | URL,\n options: AuthenticatedFetchOptions = {}\n ): Promise<Response> => {\n const {\n autoRefresh = true,\n requireAuth = true,\n baseURL,\n ...fetchOptions\n } = options\n\n // Check if user is authenticated when required\n if (requireAuth && !currentSession.value?.accessToken) {\n throw new Error('User is not authenticated')\n }\n\n // Construct full URL
|
|
1
|
+
{"version":3,"file":"useAuthenticatedFetch.cjs.js","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/composables/useAuthenticatedFetch.ts"],"sourcesContent":["import { useRuntimeConfig } from 'nuxt/app'\nimport { useStrandsAuth } from './useStrandsAuth'\nimport type { AuthenticatedFetchOptions, StrandsAuthConfig } from '../../../types'\n\n/**\n * Enhanced fetch composable that automatically includes auth headers\n * and handles token refresh for API requests\n */\nexport function useAuthenticatedFetch() {\n const config = useRuntimeConfig().public['strandsAuth'] as StrandsAuthConfig\n const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth()\n\n const authenticatedFetch = async (\n url: string | URL,\n options: AuthenticatedFetchOptions = {}\n ): Promise<Response> => {\n const {\n autoRefresh = true,\n requireAuth = true,\n baseURL,\n ...fetchOptions\n } = options\n\n // Check if user is authenticated when required\n if (requireAuth && !currentSession.value?.accessToken) {\n throw new Error('User is not authenticated')\n }\n\n // Construct full URL using baseURL from options or config\n let fullUrl: string | URL = url\n const resolvedBaseURL = baseURL || config.baseUrl\n \n if (resolvedBaseURL && typeof url === 'string' && !url.startsWith('http')) {\n fullUrl = new URL(url, resolvedBaseURL).toString()\n }\n\n // Prepare headers\n const headers = new Headers(fetchOptions.headers)\n \n // Add auth headers if available\n if (currentSession.value?.accessToken) {\n try {\n const authHeaders = getAuthHeaders()\n Object.entries(authHeaders).forEach(([key, value]) => {\n headers.set(key, value)\n })\n } catch (error) {\n console.warn('[Strands Auth] Failed to get auth headers:', error)\n if (requireAuth) {\n throw error\n }\n }\n }\n\n // Make the request\n const enhancedOptions: RequestInit = {\n ...fetchOptions,\n headers\n }\n\n let response = await fetch(fullUrl, enhancedOptions)\n\n // Handle 401 with auto-refresh\n if (response.status === 401 && autoRefresh && currentSession.value?.refreshToken) {\n console.log('[Strands Auth] Request failed with 401, attempting token refresh...')\n \n try {\n // Attempt to refresh token\n const refreshed = await refreshToken()\n \n if (refreshed && currentSession.value?.accessToken) {\n // Update headers with new token\n const newAuthHeaders = getAuthHeaders()\n Object.entries(newAuthHeaders).forEach(([key, value]) => {\n headers.set(key, value)\n })\n\n // Retry the request with new token\n console.log('[Strands Auth] Retrying request with refreshed token')\n response = await fetch(fullUrl, { ...enhancedOptions, headers })\n }\n } catch (refreshError) {\n console.error('[Strands Auth] Token refresh failed:', refreshError)\n // Return the original 401 response\n }\n }\n\n return response\n }\n\n /**\n * Convenience method for making authenticated GET requests\n */\n const get = (url: string | URL, options?: AuthenticatedFetchOptions) => {\n return authenticatedFetch(url, { ...options, method: 'GET' })\n }\n\n /**\n * Convenience method for making authenticated POST requests\n */\n const post = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n // Auto-set content type for JSON requests\n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'POST',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n /**\n * Convenience method for making authenticated PUT requests\n */\n const put = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'PUT',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n /**\n * Convenience method for making authenticated DELETE requests\n */\n const del = (url: string | URL, options?: AuthenticatedFetchOptions) => {\n return authenticatedFetch(url, { ...options, method: 'DELETE' })\n }\n\n /**\n * Convenience method for making authenticated PATCH requests\n */\n const patch = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'PATCH',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n return {\n authenticatedFetch,\n get,\n post,\n put,\n delete: del,\n patch\n }\n}\n\n// Export convenience functions for non-composable usage\nexport const $authFetch = {\n get: async (url: string | URL, options?: AuthenticatedFetchOptions) => {\n const { get } = useAuthenticatedFetch()\n return get(url, options)\n },\n post: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { post } = useAuthenticatedFetch()\n return post(url, body, options)\n },\n put: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { put } = useAuthenticatedFetch()\n return put(url, body, options)\n },\n delete: async (url: string | URL, options?: AuthenticatedFetchOptions) => {\n const { delete: del } = useAuthenticatedFetch()\n return del(url, options)\n },\n patch: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { patch } = useAuthenticatedFetch()\n return patch(url, body, options)\n }\n}"],"names":["useAuthenticatedFetch","config","useRuntimeConfig","public","currentSession","refreshToken","getAuthHeaders","useStrandsAuth","authenticatedFetch","async","url","options","autoRefresh","requireAuth","baseURL","fetchOptions","value","accessToken","Error","fullUrl","resolvedBaseURL","baseUrl","startsWith","URL","toString","headers","Headers","authHeaders","Object","entries","forEach","key","set","error","enhancedOptions","response","fetch","status","newAuthHeaders","refreshError","get","method","post","body","has","JSON","stringify","put","delete","patch","$authFetch","del"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AuthenticatedFetchOptions } from '../../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced fetch composable that automatically includes auth headers
|
|
4
|
+
* and handles token refresh for API requests
|
|
5
|
+
*/
|
|
6
|
+
export declare function useAuthenticatedFetch(): {
|
|
7
|
+
authenticatedFetch: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
8
|
+
get: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
9
|
+
post: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
10
|
+
put: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
11
|
+
delete: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
12
|
+
patch: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
13
|
+
};
|
|
14
|
+
export declare const $authFetch: {
|
|
15
|
+
get: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
16
|
+
post: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
17
|
+
put: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
18
|
+
delete: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
19
|
+
patch: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=useAuthenticatedFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuthenticatedFetch.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/composables/useAuthenticatedFetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAqB,MAAM,gBAAgB,CAAA;AAElF;;;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,5 +1,7 @@
|
|
|
1
|
+
import { useRuntimeConfig } from "nuxt/app";
|
|
1
2
|
import { useStrandsAuth } from "./useStrandsAuth.es.js";
|
|
2
3
|
function useAuthenticatedFetch() {
|
|
4
|
+
const config = useRuntimeConfig().public["strandsAuth"];
|
|
3
5
|
const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth();
|
|
4
6
|
const authenticatedFetch = async (url, options = {}) => {
|
|
5
7
|
const {
|
|
@@ -12,8 +14,9 @@ function useAuthenticatedFetch() {
|
|
|
12
14
|
throw new Error("User is not authenticated");
|
|
13
15
|
}
|
|
14
16
|
let fullUrl = url;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const resolvedBaseURL = baseURL || config.baseUrl;
|
|
18
|
+
if (resolvedBaseURL && typeof url === "string" && !url.startsWith("http")) {
|
|
19
|
+
fullUrl = new URL(url, resolvedBaseURL).toString();
|
|
17
20
|
}
|
|
18
21
|
const headers = new Headers(fetchOptions.headers);
|
|
19
22
|
if (currentSession.value?.accessToken) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthenticatedFetch.es.js","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/composables/useAuthenticatedFetch.ts"],"sourcesContent":["import { useStrandsAuth } from './useStrandsAuth'\nimport type { AuthenticatedFetchOptions } from '../../../types'\n\n/**\n * Enhanced fetch composable that automatically includes auth headers\n * and handles token refresh for API requests\n */\nexport function useAuthenticatedFetch() {\n const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth()\n\n const authenticatedFetch = async (\n url: string | URL,\n options: AuthenticatedFetchOptions = {}\n ): Promise<Response> => {\n const {\n autoRefresh = true,\n requireAuth = true,\n baseURL,\n ...fetchOptions\n } = options\n\n // Check if user is authenticated when required\n if (requireAuth && !currentSession.value?.accessToken) {\n throw new Error('User is not authenticated')\n }\n\n // Construct full URL
|
|
1
|
+
{"version":3,"file":"useAuthenticatedFetch.es.js","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/composables/useAuthenticatedFetch.ts"],"sourcesContent":["import { useRuntimeConfig } from 'nuxt/app'\nimport { useStrandsAuth } from './useStrandsAuth'\nimport type { AuthenticatedFetchOptions, StrandsAuthConfig } from '../../../types'\n\n/**\n * Enhanced fetch composable that automatically includes auth headers\n * and handles token refresh for API requests\n */\nexport function useAuthenticatedFetch() {\n const config = useRuntimeConfig().public['strandsAuth'] as StrandsAuthConfig\n const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth()\n\n const authenticatedFetch = async (\n url: string | URL,\n options: AuthenticatedFetchOptions = {}\n ): Promise<Response> => {\n const {\n autoRefresh = true,\n requireAuth = true,\n baseURL,\n ...fetchOptions\n } = options\n\n // Check if user is authenticated when required\n if (requireAuth && !currentSession.value?.accessToken) {\n throw new Error('User is not authenticated')\n }\n\n // Construct full URL using baseURL from options or config\n let fullUrl: string | URL = url\n const resolvedBaseURL = baseURL || config.baseUrl\n \n if (resolvedBaseURL && typeof url === 'string' && !url.startsWith('http')) {\n fullUrl = new URL(url, resolvedBaseURL).toString()\n }\n\n // Prepare headers\n const headers = new Headers(fetchOptions.headers)\n \n // Add auth headers if available\n if (currentSession.value?.accessToken) {\n try {\n const authHeaders = getAuthHeaders()\n Object.entries(authHeaders).forEach(([key, value]) => {\n headers.set(key, value)\n })\n } catch (error) {\n console.warn('[Strands Auth] Failed to get auth headers:', error)\n if (requireAuth) {\n throw error\n }\n }\n }\n\n // Make the request\n const enhancedOptions: RequestInit = {\n ...fetchOptions,\n headers\n }\n\n let response = await fetch(fullUrl, enhancedOptions)\n\n // Handle 401 with auto-refresh\n if (response.status === 401 && autoRefresh && currentSession.value?.refreshToken) {\n console.log('[Strands Auth] Request failed with 401, attempting token refresh...')\n \n try {\n // Attempt to refresh token\n const refreshed = await refreshToken()\n \n if (refreshed && currentSession.value?.accessToken) {\n // Update headers with new token\n const newAuthHeaders = getAuthHeaders()\n Object.entries(newAuthHeaders).forEach(([key, value]) => {\n headers.set(key, value)\n })\n\n // Retry the request with new token\n console.log('[Strands Auth] Retrying request with refreshed token')\n response = await fetch(fullUrl, { ...enhancedOptions, headers })\n }\n } catch (refreshError) {\n console.error('[Strands Auth] Token refresh failed:', refreshError)\n // Return the original 401 response\n }\n }\n\n return response\n }\n\n /**\n * Convenience method for making authenticated GET requests\n */\n const get = (url: string | URL, options?: AuthenticatedFetchOptions) => {\n return authenticatedFetch(url, { ...options, method: 'GET' })\n }\n\n /**\n * Convenience method for making authenticated POST requests\n */\n const post = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n // Auto-set content type for JSON requests\n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'POST',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n /**\n * Convenience method for making authenticated PUT requests\n */\n const put = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'PUT',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n /**\n * Convenience method for making authenticated DELETE requests\n */\n const del = (url: string | URL, options?: AuthenticatedFetchOptions) => {\n return authenticatedFetch(url, { ...options, method: 'DELETE' })\n }\n\n /**\n * Convenience method for making authenticated PATCH requests\n */\n const patch = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'PATCH',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n return {\n authenticatedFetch,\n get,\n post,\n put,\n delete: del,\n patch\n }\n}\n\n// Export convenience functions for non-composable usage\nexport const $authFetch = {\n get: async (url: string | URL, options?: AuthenticatedFetchOptions) => {\n const { get } = useAuthenticatedFetch()\n return get(url, options)\n },\n post: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { post } = useAuthenticatedFetch()\n return post(url, body, options)\n },\n put: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { put } = useAuthenticatedFetch()\n return put(url, body, options)\n },\n delete: async (url: string | URL, options?: AuthenticatedFetchOptions) => {\n const { delete: del } = useAuthenticatedFetch()\n return del(url, options)\n },\n patch: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { patch } = useAuthenticatedFetch()\n return patch(url, body, options)\n }\n}"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { ComputedRef } from 'vue';
|
|
2
|
+
import { User } from '../../../types';
|
|
3
|
+
import { AuthResponse, MfaDeviceType } from '../../..';
|
|
4
|
+
export declare const useStrandsAuth: () => {
|
|
5
|
+
initialize: () => Promise<void>;
|
|
6
|
+
signIn: (credentials: {
|
|
7
|
+
email: string;
|
|
8
|
+
password: string;
|
|
9
|
+
}) => Promise< AuthResponse>;
|
|
10
|
+
signUp: (userData: {
|
|
11
|
+
email: string;
|
|
12
|
+
}) => Promise<never>;
|
|
13
|
+
signOut: () => Promise<void>;
|
|
14
|
+
user: ComputedRef<{
|
|
15
|
+
id: string;
|
|
16
|
+
email: string;
|
|
17
|
+
firstName: string;
|
|
18
|
+
lastName: string;
|
|
19
|
+
avatar?: string | undefined;
|
|
20
|
+
mfaEnabled: boolean;
|
|
21
|
+
emailVerified: boolean;
|
|
22
|
+
passwordUpdatedAt?: (string | Date) | undefined;
|
|
23
|
+
settings?: any;
|
|
24
|
+
xp: number;
|
|
25
|
+
level: number;
|
|
26
|
+
next_level_xp: number;
|
|
27
|
+
username?: string | undefined;
|
|
28
|
+
usernameLastChangedAt?: (string | Date) | undefined;
|
|
29
|
+
createdAt: string | Date;
|
|
30
|
+
updatedAt: string | Date;
|
|
31
|
+
} | null>;
|
|
32
|
+
currentUser: ComputedRef<{
|
|
33
|
+
id: string;
|
|
34
|
+
email: string;
|
|
35
|
+
firstName: string;
|
|
36
|
+
lastName: string;
|
|
37
|
+
avatar?: string | undefined;
|
|
38
|
+
mfaEnabled: boolean;
|
|
39
|
+
emailVerified: boolean;
|
|
40
|
+
passwordUpdatedAt?: (string | Date) | undefined;
|
|
41
|
+
settings?: any;
|
|
42
|
+
xp: number;
|
|
43
|
+
level: number;
|
|
44
|
+
next_level_xp: number;
|
|
45
|
+
username?: string | undefined;
|
|
46
|
+
usernameLastChangedAt?: (string | Date) | undefined;
|
|
47
|
+
createdAt: string | Date;
|
|
48
|
+
updatedAt: string | Date;
|
|
49
|
+
} | null>;
|
|
50
|
+
currentSession: ComputedRef<{
|
|
51
|
+
id?: string | undefined;
|
|
52
|
+
userId?: string | undefined;
|
|
53
|
+
accessToken: string;
|
|
54
|
+
refreshToken: string;
|
|
55
|
+
expiresAt: Date;
|
|
56
|
+
createdAt?: Date | undefined;
|
|
57
|
+
} | null>;
|
|
58
|
+
isAuthenticated: ComputedRef<boolean>;
|
|
59
|
+
isLoading: ComputedRef<boolean>;
|
|
60
|
+
loading: ComputedRef<boolean>;
|
|
61
|
+
loadingMessage: ComputedRef<"Loading..." | "Checking authentication..." | "Signing you in..." | "Creating your account..." | "Signing you out..." | "Refreshing session..." | "Sending verification code..." | "Verifying code..." | "Loading profile...">;
|
|
62
|
+
isInitializing: ComputedRef<boolean>;
|
|
63
|
+
isSigningIn: ComputedRef<boolean>;
|
|
64
|
+
isSigningUp: ComputedRef<boolean>;
|
|
65
|
+
isSigningOut: ComputedRef<boolean>;
|
|
66
|
+
isRefreshingToken: ComputedRef<boolean>;
|
|
67
|
+
isSendingMfaEmail: ComputedRef<boolean>;
|
|
68
|
+
isVerifyingMfa: ComputedRef<boolean>;
|
|
69
|
+
mfaRequired: ComputedRef<boolean>;
|
|
70
|
+
mfaSessionId: ComputedRef<string | null>;
|
|
71
|
+
availableMfaMethods: ComputedRef<{
|
|
72
|
+
id: string;
|
|
73
|
+
device_type: MfaDeviceType;
|
|
74
|
+
device_name: string;
|
|
75
|
+
is_active: boolean;
|
|
76
|
+
last_used_at?: (string | Date) | undefined;
|
|
77
|
+
created_at: string | Date;
|
|
78
|
+
}[]>;
|
|
79
|
+
refreshToken: () => Promise<boolean>;
|
|
80
|
+
fetchProfile: () => Promise<User | null>;
|
|
81
|
+
updateProfile: (profileData: Partial<User>) => Promise<{
|
|
82
|
+
id: string;
|
|
83
|
+
email: string;
|
|
84
|
+
firstName: string;
|
|
85
|
+
lastName: string;
|
|
86
|
+
avatar?: string | undefined;
|
|
87
|
+
mfaEnabled: boolean;
|
|
88
|
+
emailVerified: boolean;
|
|
89
|
+
passwordUpdatedAt?: (string | Date) | undefined;
|
|
90
|
+
settings?: any;
|
|
91
|
+
xp: number;
|
|
92
|
+
level: number;
|
|
93
|
+
next_level_xp: number;
|
|
94
|
+
username?: string | undefined;
|
|
95
|
+
usernameLastChangedAt?: (string | Date) | undefined;
|
|
96
|
+
createdAt: string | Date;
|
|
97
|
+
updatedAt: string | Date;
|
|
98
|
+
}>;
|
|
99
|
+
updateUserSettings: (settings: any) => Promise<{
|
|
100
|
+
id: string;
|
|
101
|
+
email: string;
|
|
102
|
+
firstName: string;
|
|
103
|
+
lastName: string;
|
|
104
|
+
avatar?: string | undefined;
|
|
105
|
+
mfaEnabled: boolean;
|
|
106
|
+
emailVerified: boolean;
|
|
107
|
+
passwordUpdatedAt?: (string | Date) | undefined;
|
|
108
|
+
settings?: any;
|
|
109
|
+
xp: number;
|
|
110
|
+
level: number;
|
|
111
|
+
next_level_xp: number;
|
|
112
|
+
username?: string | undefined;
|
|
113
|
+
usernameLastChangedAt?: (string | Date) | undefined;
|
|
114
|
+
createdAt: string | Date;
|
|
115
|
+
updatedAt: string | Date;
|
|
116
|
+
}>;
|
|
117
|
+
changeEmail: (newEmail: string, password: string) => Promise<any>;
|
|
118
|
+
changeUsername: (newUsername: string) => Promise<any>;
|
|
119
|
+
getUsernameCooldown: () => Promise<any>;
|
|
120
|
+
checkUsernameAvailability: (username: string) => Promise<any>;
|
|
121
|
+
getUserSessions: () => Promise<any>;
|
|
122
|
+
getSessionStats: () => Promise<any>;
|
|
123
|
+
revokeSession: (sessionId: string) => Promise<boolean>;
|
|
124
|
+
revokeAllOtherSessions: () => Promise<boolean>;
|
|
125
|
+
setAuthData: (authResponse: AuthResponse) => Promise<void>;
|
|
126
|
+
verifyMfa: (deviceId: string, code: string, isBackupCode?: boolean) => Promise< AuthResponse>;
|
|
127
|
+
sendMfaEmailCode: (deviceId: string) => Promise<any>;
|
|
128
|
+
getMfaWebAuthnChallenge: (deviceId: string) => Promise<any>;
|
|
129
|
+
registerHardwareKey: (deviceName: string, accessToken: string, deviceType?: "hardware" | "passkey") => Promise<any>;
|
|
130
|
+
completeHardwareKeyRegistration: (deviceId: string, credential: any, accessToken: string) => Promise<any>;
|
|
131
|
+
startTokenRefreshTimer: () => void;
|
|
132
|
+
stopTokenRefreshTimer: () => void;
|
|
133
|
+
getAuthHeaders: () => Record<string, string>;
|
|
134
|
+
forceReInit: () => void;
|
|
135
|
+
};
|
|
136
|
+
export declare const useAuthUser: () => {
|
|
137
|
+
user: ComputedRef<User | null>;
|
|
138
|
+
};
|
|
139
|
+
export declare const useAuthState: () => {
|
|
140
|
+
isAuthenticated: ComputedRef<boolean>;
|
|
141
|
+
isLoading: ComputedRef<boolean>;
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=useStrandsAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStrandsAuth.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/composables/useStrandsAuth.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAO,WAAW,EAAE,MAAM,KAAK,CAAA;AAK3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAE1C,eAAO,MAAM,cAAc;;0BAYU;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;uBAYtC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqClD,CAAA;AAGD,eAAO,MAAM,WAAW,QAAO;IAAE,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CAG9D,CAAA;AAED,eAAO,MAAM,YAAY,QAAO;IAAE,eAAe,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAAC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAGvG,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { RouteMiddleware } from 'nuxt/app';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware to protect routes - requires authentication
|
|
4
|
+
* Usage: Add `middleware: 'auth'` to your page
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: RouteMiddleware;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/middleware/auth.ts"],"names":[],"mappings":";AAEA;;;GAGG;;AACH,wBA0BE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.global.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/middleware/auth.global.ts"],"names":[],"mappings":";;AAGA,wBAsDE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { RouteMiddleware } from 'nuxt/app';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware for guest-only routes - redirects if authenticated
|
|
4
|
+
* Usage: Add `middleware: 'guest'` to your page
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: RouteMiddleware;
|
|
7
|
+
export default _default;
|
|
8
|
+
//# sourceMappingURL=guest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/middleware/guest.ts"],"names":[],"mappings":";AAGA;;;GAGG;;AACH,wBA4BE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.client.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/nuxt/runtime/plugin.client.ts"],"names":[],"mappings":";;AAKA,wBAkCE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.server.d.ts","sourceRoot":"","sources":["../../../../../apps/accounts-ui/src/nuxt/runtime/plugin.server.ts"],"names":[],"mappings":";;AAIA,wBAgBE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-interceptor.client.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt/runtime/plugins/auth-interceptor.client.ts"],"names":[],"mappings":";;AAEA,wBA+DE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface StrandsUser {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
firstName: string;
|
|
5
|
+
lastName: string;
|
|
6
|
+
avatar?: string;
|
|
7
|
+
mfaEnabled: boolean;
|
|
8
|
+
emailVerified: boolean;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export interface StrandsSession {
|
|
13
|
+
accessToken: string;
|
|
14
|
+
refreshToken: string;
|
|
15
|
+
expiresAt: Date;
|
|
16
|
+
user: StrandsUser;
|
|
17
|
+
}
|
|
18
|
+
declare module '@nuxt/schema' {
|
|
19
|
+
interface PublicRuntimeConfig {
|
|
20
|
+
strandsAuth?: {
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
applicationId?: string;
|
|
23
|
+
publicKey?: string;
|
|
24
|
+
accentColor?: string;
|
|
25
|
+
redirectUrl?: string;
|
|
26
|
+
onSignInUrl?: string;
|
|
27
|
+
onSignOutUrl?: string;
|
|
28
|
+
/** @deprecated OAuth providers are now dynamically fetched from API */
|
|
29
|
+
oauthProviders?: string[];
|
|
30
|
+
autoRefresh?: boolean;
|
|
31
|
+
refreshInterval?: number;
|
|
32
|
+
protectedRoutes?: string[];
|
|
33
|
+
guestOnlyRoutes?: string[];
|
|
34
|
+
devMode?: boolean;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
declare module 'nuxt/app' {
|
|
39
|
+
interface NuxtApp {
|
|
40
|
+
$strandsAuth: {
|
|
41
|
+
accentColor: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/nuxt/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,IAAI,CAAA;IACf,IAAI,EAAE,WAAW,CAAA;CAClB;AAED,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,mBAAmB;QAC3B,WAAW,CAAC,EAAE;YACZ,OAAO,CAAC,EAAE,MAAM,CAAA;YAChB,aAAa,CAAC,EAAE,MAAM,CAAA;YACtB,SAAS,CAAC,EAAE,MAAM,CAAA;YAClB,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,YAAY,CAAC,EAAE,MAAM,CAAA;YACrB,uEAAuE;YACvE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;YACzB,WAAW,CAAC,EAAE,OAAO,CAAA;YACrB,eAAe,CAAC,EAAE,MAAM,CAAA;YACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;YAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;YAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;SAClB,CAAA;KACF;CACF;AAED,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,OAAO;QACf,YAAY,EAAE;YACZ,WAAW,EAAE,MAAM,CAAA;SACpB,CAAA;KACF;CACF;AAED,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StrandsAuthConfig } from '../types';
|
|
2
|
+
import { NuxtModule } from '@nuxt/schema';
|
|
3
|
+
export type { StrandsAuthConfig, StrandsAuthEndpoints } from '../types';
|
|
4
|
+
declare const _default: NuxtModule<StrandsAuthConfig, StrandsAuthConfig, false>;
|
|
5
|
+
export default _default;
|
|
6
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../apps/accounts-ui/src/nuxt-v4/module.ts"],"names":[],"mappings":";AAGA,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;;AAmBjD,wBAuIE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useStrandsAuth.cjs.js");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("nuxt/app"),t=require("./useStrandsAuth.cjs.js");function s(){const s=e.useRuntimeConfig().public.strandsAuth,{currentSession:n,refreshToken:o,getAuthHeaders:r}=t.useStrandsAuth(),a=async(e,t={})=>{const{autoRefresh:a=!0,requireAuth:c=!0,baseURL:h,...u}=t;if(c&&!n.value?.accessToken)throw new Error("User is not authenticated");let i=e;const p=h||s.baseUrl;p&&"string"==typeof e&&!e.startsWith("http")&&(i=new URL(e,p).toString());const d=new Headers(u.headers);if(n.value?.accessToken)try{const e=r();Object.entries(e).forEach(([e,t])=>{d.set(e,t)})}catch(l){if(c)throw l}const y={...u,headers:d};let f=await fetch(i,y);if(401===f.status&&a&&n.value?.refreshToken)try{if(await o()&&n.value?.accessToken){const e=r();Object.entries(e).forEach(([e,t])=>{d.set(e,t)}),f=await fetch(i,{...y,headers:d})}}catch(T){}return f};return{authenticatedFetch:a,get:(e,t)=>a(e,{...t,method:"GET"}),post:(e,t,s)=>{const n=new Headers(s?.headers);return t&&"object"==typeof t&&!n.has("Content-Type")&&n.set("Content-Type","application/json"),a(e,{...s,method:"POST",headers:n,body:"object"==typeof t?JSON.stringify(t):t})},put:(e,t,s)=>{const n=new Headers(s?.headers);return t&&"object"==typeof t&&!n.has("Content-Type")&&n.set("Content-Type","application/json"),a(e,{...s,method:"PUT",headers:n,body:"object"==typeof t?JSON.stringify(t):t})},delete:(e,t)=>a(e,{...t,method:"DELETE"}),patch:(e,t,s)=>{const n=new Headers(s?.headers);return t&&"object"==typeof t&&!n.has("Content-Type")&&n.set("Content-Type","application/json"),a(e,{...s,method:"PATCH",headers:n,body:"object"==typeof t?JSON.stringify(t):t})}}}const n={get:async(e,t)=>{const{get:n}=s();return n(e,t)},post:async(e,t,n)=>{const{post:o}=s();return o(e,t,n)},put:async(e,t,n)=>{const{put:o}=s();return o(e,t,n)},delete:async(e,t)=>{const{delete:n}=s();return n(e,t)},patch:async(e,t,n)=>{const{patch:o}=s();return o(e,t,n)}};exports.$authFetch=n,exports.useAuthenticatedFetch=s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthenticatedFetch.cjs.js","sources":["../../../../../../apps/accounts-ui/src/nuxt-v4/runtime/composables/useAuthenticatedFetch.ts"],"sourcesContent":["import { useStrandsAuth } from './useStrandsAuth'\nimport type { AuthenticatedFetchOptions } from '../../../types'\n\n/**\n * Enhanced fetch composable that automatically includes auth headers\n * and handles token refresh for API requests\n */\nexport function useAuthenticatedFetch() {\n const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth()\n\n const authenticatedFetch = async (\n url: string | URL,\n options: AuthenticatedFetchOptions = {}\n ): Promise<Response> => {\n const {\n autoRefresh = true,\n requireAuth = true,\n baseURL,\n ...fetchOptions\n } = options\n\n // Check if user is authenticated when required\n if (requireAuth && !currentSession.value?.accessToken) {\n throw new Error('User is not authenticated')\n }\n\n // Construct full URL
|
|
1
|
+
{"version":3,"file":"useAuthenticatedFetch.cjs.js","sources":["../../../../../../apps/accounts-ui/src/nuxt-v4/runtime/composables/useAuthenticatedFetch.ts"],"sourcesContent":["import { useRuntimeConfig } from 'nuxt/app'\nimport { useStrandsAuth } from './useStrandsAuth'\nimport type { AuthenticatedFetchOptions, StrandsAuthConfig } from '../../../types'\n\n/**\n * Enhanced fetch composable that automatically includes auth headers\n * and handles token refresh for API requests\n */\nexport function useAuthenticatedFetch() {\n const config = useRuntimeConfig().public['strandsAuth'] as StrandsAuthConfig\n const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth()\n\n const authenticatedFetch = async (\n url: string | URL,\n options: AuthenticatedFetchOptions = {}\n ): Promise<Response> => {\n const {\n autoRefresh = true,\n requireAuth = true,\n baseURL,\n ...fetchOptions\n } = options\n\n // Check if user is authenticated when required\n if (requireAuth && !currentSession.value?.accessToken) {\n throw new Error('User is not authenticated')\n }\n\n // Construct full URL using baseURL from options or config\n let fullUrl: string | URL = url\n const resolvedBaseURL = baseURL || config.baseUrl\n \n if (resolvedBaseURL && typeof url === 'string' && !url.startsWith('http')) {\n fullUrl = new URL(url, resolvedBaseURL).toString()\n }\n\n // Prepare headers\n const headers = new Headers(fetchOptions.headers)\n \n // Add auth headers if available\n if (currentSession.value?.accessToken) {\n try {\n const authHeaders = getAuthHeaders()\n Object.entries(authHeaders).forEach(([key, value]) => {\n headers.set(key, value as string)\n })\n } catch (error) {\n console.warn('[Strands Auth] Failed to get auth headers:', error)\n if (requireAuth) {\n throw error\n }\n }\n }\n\n // Make the request\n const enhancedOptions: RequestInit = {\n ...fetchOptions,\n headers\n }\n\n let response = await fetch(fullUrl, enhancedOptions)\n\n // Handle 401 with auto-refresh\n if (response.status === 401 && autoRefresh && currentSession.value?.refreshToken) {\n console.log('[Strands Auth] Request failed with 401, attempting token refresh...')\n \n try {\n // Attempt to refresh token\n const refreshed = await refreshToken()\n \n if (refreshed && currentSession.value?.accessToken) {\n // Update headers with new token\n const newAuthHeaders = getAuthHeaders()\n Object.entries(newAuthHeaders).forEach(([key, value]) => {\n headers.set(key, value as string)\n })\n\n // Retry the request with new token\n console.log('[Strands Auth] Retrying request with refreshed token')\n response = await fetch(fullUrl, { ...enhancedOptions, headers })\n }\n } catch (refreshError) {\n console.error('[Strands Auth] Token refresh failed:', refreshError)\n // Return the original 401 response\n }\n }\n\n return response\n }\n\n /**\n * Convenience method for making authenticated GET requests\n */\n const get = (url: string | URL, options?: AuthenticatedFetchOptions) => {\n return authenticatedFetch(url, { ...options, method: 'GET' })\n }\n\n /**\n * Convenience method for making authenticated POST requests\n */\n const post = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n // Auto-set content type for JSON requests\n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'POST',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n /**\n * Convenience method for making authenticated PUT requests\n */\n const put = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'PUT',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n /**\n * Convenience method for making authenticated DELETE requests\n */\n const del = (url: string | URL, options?: AuthenticatedFetchOptions) => {\n return authenticatedFetch(url, { ...options, method: 'DELETE' })\n }\n\n /**\n * Convenience method for making authenticated PATCH requests\n */\n const patch = (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const headers = new Headers(options?.headers)\n \n if (body && typeof body === 'object' && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json')\n }\n\n return authenticatedFetch(url, {\n ...options,\n method: 'PATCH',\n headers,\n body: typeof body === 'object' ? JSON.stringify(body) : body\n })\n }\n\n return {\n authenticatedFetch,\n get,\n post,\n put,\n delete: del,\n patch\n }\n}\n\n// Export convenience functions for non-composable usage\nexport const $authFetch = {\n get: async (url: string | URL, options?: AuthenticatedFetchOptions) => {\n const { get } = useAuthenticatedFetch()\n return get(url, options)\n },\n post: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { post } = useAuthenticatedFetch()\n return post(url, body, options)\n },\n put: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { put } = useAuthenticatedFetch()\n return put(url, body, options)\n },\n delete: async (url: string | URL, options?: AuthenticatedFetchOptions) => {\n const { delete: del } = useAuthenticatedFetch()\n return del(url, options)\n },\n patch: async (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => {\n const { patch } = useAuthenticatedFetch()\n return patch(url, body, options)\n }\n}"],"names":["useAuthenticatedFetch","config","useRuntimeConfig","public","currentSession","refreshToken","getAuthHeaders","useStrandsAuth","authenticatedFetch","async","url","options","autoRefresh","requireAuth","baseURL","fetchOptions","value","accessToken","Error","fullUrl","resolvedBaseURL","baseUrl","startsWith","URL","toString","headers","Headers","authHeaders","Object","entries","forEach","key","set","error","enhancedOptions","response","fetch","status","newAuthHeaders","refreshError","get","method","post","body","has","JSON","stringify","put","delete","patch","$authFetch","del"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AuthenticatedFetchOptions } from '../../../types';
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced fetch composable that automatically includes auth headers
|
|
4
|
+
* and handles token refresh for API requests
|
|
5
|
+
*/
|
|
6
|
+
export declare function useAuthenticatedFetch(): {
|
|
7
|
+
authenticatedFetch: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
8
|
+
get: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
9
|
+
post: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
10
|
+
put: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
11
|
+
delete: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
12
|
+
patch: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
13
|
+
};
|
|
14
|
+
export declare const $authFetch: {
|
|
15
|
+
get: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
16
|
+
post: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
17
|
+
put: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
18
|
+
delete: (url: string | URL, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
19
|
+
patch: (url: string | URL, body?: any, options?: AuthenticatedFetchOptions) => Promise<Response>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=useAuthenticatedFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAuthenticatedFetch.d.ts","sourceRoot":"","sources":["../../../../../../apps/accounts-ui/src/nuxt-v4/runtime/composables/useAuthenticatedFetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAqB,MAAM,gBAAgB,CAAA;AAElF;;;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,5 +1,7 @@
|
|
|
1
|
+
import { useRuntimeConfig } from "nuxt/app";
|
|
1
2
|
import { useStrandsAuth } from "./useStrandsAuth.es.js";
|
|
2
3
|
function useAuthenticatedFetch() {
|
|
4
|
+
const config = useRuntimeConfig().public["strandsAuth"];
|
|
3
5
|
const { currentSession, refreshToken, getAuthHeaders } = useStrandsAuth();
|
|
4
6
|
const authenticatedFetch = async (url, options = {}) => {
|
|
5
7
|
const {
|
|
@@ -12,8 +14,9 @@ function useAuthenticatedFetch() {
|
|
|
12
14
|
throw new Error("User is not authenticated");
|
|
13
15
|
}
|
|
14
16
|
let fullUrl = url;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const resolvedBaseURL = baseURL || config.baseUrl;
|
|
18
|
+
if (resolvedBaseURL && typeof url === "string" && !url.startsWith("http")) {
|
|
19
|
+
fullUrl = new URL(url, resolvedBaseURL).toString();
|
|
17
20
|
}
|
|
18
21
|
const headers = new Headers(fetchOptions.headers);
|
|
19
22
|
if (currentSession.value?.accessToken) {
|