UNPKG

@shopify/storefront-api-client

Version:

Shopify Storefront API Client - A lightweight JS client to interact with Shopify's Storefront API

90 lines (87 loc) 3.67 kB
import { getCurrentSupportedApiVersions, validateDomainAndGetStoreUrl, validateApiVersion, createGraphQLClient, generateGetHeaders, generateGetGQLClientParams } from '@shopify/graphql-client'; import { CLIENT, DEFAULT_CLIENT_VERSION, DEFAULT_SDK_VARIANT, DEFAULT_CONTENT_TYPE, PUBLIC_ACCESS_TOKEN_HEADER, PRIVATE_ACCESS_TOKEN_HEADER, SDK_VARIANT_SOURCE_HEADER, SDK_VERSION_HEADER, SDK_VARIANT_HEADER } from './constants.mjs'; import { validateRequiredAccessTokens, validatePrivateAccessTokenUsage } from './validations.mjs'; function createStorefrontApiClient({ storeDomain, apiVersion, publicAccessToken, privateAccessToken, clientName, retries = 0, customFetchApi, logger, }) { const currentSupportedApiVersions = getCurrentSupportedApiVersions(); const storeUrl = validateDomainAndGetStoreUrl({ client: CLIENT, storeDomain, }); const baseApiVersionValidationParams = { client: CLIENT, currentSupportedApiVersions, logger, }; validateApiVersion({ ...baseApiVersionValidationParams, apiVersion }); validateRequiredAccessTokens(publicAccessToken, privateAccessToken); validatePrivateAccessTokenUsage(privateAccessToken); const apiUrlFormatter = generateApiUrlFormatter(storeUrl, apiVersion, baseApiVersionValidationParams); const config = { storeDomain: storeUrl, apiVersion, ...(publicAccessToken ? { publicAccessToken } : { privateAccessToken: privateAccessToken, }), headers: { 'Content-Type': DEFAULT_CONTENT_TYPE, Accept: DEFAULT_CONTENT_TYPE, [SDK_VARIANT_HEADER]: DEFAULT_SDK_VARIANT, [SDK_VERSION_HEADER]: DEFAULT_CLIENT_VERSION, ...(clientName ? { [SDK_VARIANT_SOURCE_HEADER]: clientName } : {}), ...(publicAccessToken ? { [PUBLIC_ACCESS_TOKEN_HEADER]: publicAccessToken } : { [PRIVATE_ACCESS_TOKEN_HEADER]: privateAccessToken }), }, apiUrl: apiUrlFormatter(), clientName, }; const graphqlClient = createGraphQLClient({ headers: config.headers, url: config.apiUrl, retries, customFetchApi, logger, }); const getHeaders = generateGetHeaders(config); const getApiUrl = generateGetApiUrl(config, apiUrlFormatter); const getGQLClientParams = generateGetGQLClientParams({ getHeaders, getApiUrl, }); const client = { config, getHeaders, getApiUrl, fetch: (...props) => { return graphqlClient.fetch(...getGQLClientParams(...props)); }, request: (...props) => { return graphqlClient.request(...getGQLClientParams(...props)); }, requestStream: (...props) => { return graphqlClient.requestStream(...getGQLClientParams(...props)); }, }; return Object.freeze(client); } function generateApiUrlFormatter(storeUrl, defaultApiVersion, baseApiVersionValidationParams) { return (apiVersion) => { if (apiVersion) { validateApiVersion({ ...baseApiVersionValidationParams, apiVersion, }); } const urlApiVersion = (apiVersion ?? defaultApiVersion).trim(); return `${storeUrl}/api/${urlApiVersion}/graphql.json`; }; } function generateGetApiUrl(config, apiUrlFormatter) { return (propApiVersion) => { return propApiVersion ? apiUrlFormatter(propApiVersion) : config.apiUrl; }; } export { createStorefrontApiClient }; //# sourceMappingURL=storefront-api-client.mjs.map