From b9e040a1d677daef4e240986c9c25c4c501fb35a Mon Sep 17 00:00:00 2001 From: ZerNico Date: Sun, 28 May 2023 10:20:18 +0200 Subject: [PATCH] refactor: clean up config handling --- src/module.ts | 14 +++++++------- src/runtime/composables/useLogto.ts | 7 ++++--- src/runtime/config.ts | 8 ++++---- src/runtime/logto/client.ts | 6 +++--- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/module.ts b/src/module.ts index 07ef34d..e8803cc 100644 --- a/src/module.ts +++ b/src/module.ts @@ -10,22 +10,22 @@ export default defineNuxtModule({ setup(options, nuxt) { const { resolve } = createResolver(import.meta.url) + const { basePath, appId, origin, ...privateOptions } = options + // @ts-ignore nuxt.options.runtimeConfig.logto = defu( nuxt.options.runtimeConfig.logto, - { ...options }, - { coookieSecure: true, basePath: '/api/logto' } + { ...privateOptions }, + { coookieSecure: true } ) // @ts-ignore nuxt.options.runtimeConfig.public.logto = defu( nuxt.options.runtimeConfig.public.logto, { - appId: options.appId, - basePath: options.basePath, - }, - { - appId: nuxt.options.runtimeConfig.logto.appId, + appId: appId, + basePath: basePath, + origin: origin, }, { basePath: '/api/logto' } ) diff --git a/src/runtime/composables/useLogto.ts b/src/runtime/composables/useLogto.ts index 70bdecf..ba669d9 100644 --- a/src/runtime/composables/useLogto.ts +++ b/src/runtime/composables/useLogto.ts @@ -26,6 +26,7 @@ export interface UseLogtoReturn { */ export const useLogto = (): UseLogtoReturn => { const basePath = useRuntimeConfig().public.logto.basePath + const origin = useRuntimeConfig().public.logto.origin const { data } = useLogtoState() @@ -35,7 +36,7 @@ export const useLogto = (): UseLogtoReturn => { * It can be used to refresh the user context. */ const fetchContext = async () => { - const contextUrl = `${basePath}/context` + const contextUrl = joinURL(origin, basePath, 'context') const headers = useRequestHeaders(['cookie']) as HeadersInit data.value = await $fetch(contextUrl, { headers }) } @@ -88,7 +89,7 @@ export const useLogto = (): UseLogtoReturn => { * @returns The sign in url. */ const getSigInUrl = (redirectTo?: string) => { - return withQuery(joinURL(basePath, 'sign-in'), { redirectTo }) + return withQuery(joinURL(origin, basePath, 'sign-in'), { redirectTo }) } /** @@ -105,7 +106,7 @@ export const useLogto = (): UseLogtoReturn => { * @returns The sign up url. */ const getSignUpUrl = (redirectTo?: string) => { - return withQuery(joinURL(basePath, 'sign-up'), { redirectTo }) + return withQuery(joinURL(origin, basePath, 'sign-up'), { redirectTo }) } /** diff --git a/src/runtime/config.ts b/src/runtime/config.ts index 38fc191..a88eb2c 100644 --- a/src/runtime/config.ts +++ b/src/runtime/config.ts @@ -3,14 +3,14 @@ import type { LogtoNuxtConfig } from './types' export const useConfig = () => { const config = useRuntimeConfig().logto + const publicConfig = useRuntimeConfig().public.logto - let resources = config.resources if (resources && typeof resources === 'string') { try { resources = JSON.parse(config.resources) } catch (e) { - console.warn("Failed to parse resources string") + console.warn('Failed to parse resources string') } } @@ -19,9 +19,9 @@ export const useConfig = () => { try { scopes = JSON.parse(config.scopes) } catch (e) { - console.warn("Failed to parse scopes string") + console.warn('Failed to parse scopes string') } } - return { ...config, scopes, resources } as unknown as LogtoNuxtConfig + return { ...config, ...publicConfig, scopes, resources } as unknown as LogtoNuxtConfig } diff --git a/src/runtime/logto/client.ts b/src/runtime/logto/client.ts index 9a55a56..64ace19 100644 --- a/src/runtime/logto/client.ts +++ b/src/runtime/logto/client.ts @@ -3,7 +3,7 @@ import { H3Event, eventHandler, sendRedirect, getQuery } from 'h3' import { joinURL } from 'ufo' import { LogtoNuxtConfig } from '../types' import { createLogtoEvent } from './event' -import { useConfig } from "../config" +import { useConfig } from '../config' export class LogtoClient { protected logtoConfig: LogtoNuxtConfig @@ -20,7 +20,7 @@ export class LogtoClient { * @returns An event handler to handle sign in / sign up. */ handleSignIn = ( - redirectUri = `${this.logtoConfig.origin}${this.logtoConfig.basePath}/sign-in-callback`, + redirectUri = joinURL(this.logtoConfig.origin, this.logtoConfig.basePath, 'sign-in-callback'), interactionMode?: InteractionMode ) => eventHandler(async (event) => { @@ -59,7 +59,7 @@ export class LogtoClient { const url = event.node.req.url if (url) { - await logtoEvent.nodeClient.handleSignInCallback(`${this.logtoConfig.origin}${url}`) + await logtoEvent.nodeClient.handleSignInCallback(joinURL(this.logtoConfig.origin, url)) await logtoEvent.storage.save() return sendRedirect(event, redirect) }