import type { Client } from '@spree/storefront-api-v2-sdk' import SpreeSdkMethodFromEndpointPathError from '../errors/SpreeSdkMethodFromEndpointPathError' import type { SpreeSdkMethod, SpreeSdkResultResponseSuccessType, } from '../types' const getSpreeSdkMethodFromEndpointPath = < ExactSpreeSdkClientType extends Client, ResultResponseSuccessType extends SpreeSdkResultResponseSuccessType = SpreeSdkResultResponseSuccessType >( client: ExactSpreeSdkClientType, path: string ): SpreeSdkMethod => { const pathParts = path.split('.') const reachedPath: string[] = [] let node = >client console.log(`Looking for ${path} in Spree Sdk.`) while (reachedPath.length < pathParts.length - 1) { const checkedPathPart = pathParts[reachedPath.length] const checkedNode = node[checkedPathPart] console.log(`Checking part ${checkedPathPart}.`) if (typeof checkedNode !== 'object') { throw new SpreeSdkMethodFromEndpointPathError( `Couldn't reach ${path}. Farthest path reached was: ${reachedPath.join( '.' )}.` ) } if (checkedNode === null) { throw new SpreeSdkMethodFromEndpointPathError( `Path ${path} doesn't exist.` ) } node = >checkedNode reachedPath.push(checkedPathPart) } const foundEndpointMethod = node[pathParts[reachedPath.length]] if ( reachedPath.length !== pathParts.length - 1 || typeof foundEndpointMethod !== 'function' ) { throw new SpreeSdkMethodFromEndpointPathError( `Couldn't reach ${path}. Farthest path reached was: ${reachedPath.join( '.' )}.` ) } return foundEndpointMethod.bind(node) } export default getSpreeSdkMethodFromEndpointPath