diff --git a/.changeset/hungry-ties-bet.md b/.changeset/hungry-ties-bet.md new file mode 100644 index 00000000..6d47cfad --- /dev/null +++ b/.changeset/hungry-ties-bet.md @@ -0,0 +1,6 @@ +--- +'@asgardeo/javascript': patch +--- + +Refactor embedded sign-in and sign-up flows: clean payload by removing 'verbose' parameter and conditionally add +'verbose: true' based on payload structure. diff --git a/packages/javascript/src/api/v2/executeEmbeddedSignInFlowV2.ts b/packages/javascript/src/api/v2/executeEmbeddedSignInFlowV2.ts index 85c677a4..991af3fc 100644 --- a/packages/javascript/src/api/v2/executeEmbeddedSignInFlowV2.ts +++ b/packages/javascript/src/api/v2/executeEmbeddedSignInFlowV2.ts @@ -42,9 +42,30 @@ const executeEmbeddedSignInFlowV2 = async ({ let endpoint: string = url ?? `${baseUrl}/flow/execute`; + // Strip any user-provided 'verbose' parameter as it should only be used internally + const cleanPayload: typeof payload = + typeof payload === 'object' && payload !== null + ? Object.fromEntries(Object.entries(payload).filter(([key]) => key !== 'verbose')) + : payload; + // `verbose: true` is required to get the `meta` field in the response that includes component details. + // Add verbose:true if: + // 1. payload contains only applicationId and flowType + // 2. payload contains only flowId + const hasOnlyAppIdAndFlowType: boolean = + typeof cleanPayload === 'object' && + cleanPayload !== null && + 'applicationId' in cleanPayload && + 'flowType' in cleanPayload && + Object.keys(cleanPayload).length === 2; + const hasOnlyFlowId: boolean = + typeof cleanPayload === 'object' && + cleanPayload !== null && + 'flowId' in cleanPayload && + Object.keys(cleanPayload).length === 1; + const requestPayload: Record = - typeof payload === 'object' && payload !== null && 'flowType' in payload ? {...payload, verbose: true} : payload; + hasOnlyAppIdAndFlowType || hasOnlyFlowId ? {...cleanPayload, verbose: true} : cleanPayload; const response: Response = await fetch(endpoint, { ...requestConfig, diff --git a/packages/javascript/src/api/v2/executeEmbeddedSignUpFlowV2.ts b/packages/javascript/src/api/v2/executeEmbeddedSignUpFlowV2.ts index 939bc523..67bfd83e 100644 --- a/packages/javascript/src/api/v2/executeEmbeddedSignUpFlowV2.ts +++ b/packages/javascript/src/api/v2/executeEmbeddedSignUpFlowV2.ts @@ -42,9 +42,30 @@ const executeEmbeddedSignUpFlowV2 = async ({ let endpoint: string = url ?? `${baseUrl}/flow/execute`; + // Strip any user-provided 'verbose' parameter as it should only be used internally + const cleanPayload: typeof payload = + typeof payload === 'object' && payload !== null + ? Object.fromEntries(Object.entries(payload).filter(([key]) => key !== 'verbose')) + : payload; + // `verbose: true` is required to get the `meta` field in the response that includes component details. + // Add verbose:true if: + // 1. payload contains only applicationId and flowType + // 2. payload contains only flowId + const hasOnlyAppIdAndFlowType: boolean = + typeof cleanPayload === 'object' && + cleanPayload !== null && + 'applicationId' in cleanPayload && + 'flowType' in cleanPayload && + Object.keys(cleanPayload).length === 2; + const hasOnlyFlowId: boolean = + typeof cleanPayload === 'object' && + cleanPayload !== null && + 'flowId' in cleanPayload && + Object.keys(cleanPayload).length === 1; + const requestPayload: Record = - typeof payload === 'object' && payload !== null && 'flowType' in payload ? {...payload, verbose: true} : payload; + hasOnlyAppIdAndFlowType || hasOnlyFlowId ? {...cleanPayload, verbose: true} : cleanPayload; const response: Response = await fetch(endpoint, { ...requestConfig,