# storefrontRedirect Queries the Storefront API to see if there is any redirect [created for the current route](https://help.shopify.com/en/manual/online-store/menus-and-links/url-redirect) and performs it. Otherwise, it returns the response passed in the parameters. Useful for conditionally redirecting after a 404 response. ```js import {storefrontRedirect, createStorefrontClient} from '@shopify/hydrogen'; import * as remixBuild from '@remix-run/dev/server-build'; import { createRequestHandler, getStorefrontHeaders, } from '@shopify/remix-oxygen'; export default { async fetch(request, env, executionContext) { const {storefront} = createStorefrontClient({ cache: await caches.open('hydrogen'), waitUntil: (p) => executionContext.waitUntil(p), privateStorefrontToken: env.PRIVATE_STOREFRONT_API_TOKEN, publicStorefrontToken: env.PUBLIC_STOREFRONT_API_TOKEN, storeDomain: env.PUBLIC_STORE_DOMAIN, storefrontHeaders: getStorefrontHeaders(request), }); const handleRequest = createRequestHandler({ build: remixBuild, mode: process.env.NODE_ENV, }); const response = await handleRequest(request); if (response.status === 404) { /** * Check for redirects only when there's a 404 from * the app. If the redirect doesn't exist, then * `storefrontRedirect` will pass through the 404 * response. */ return storefrontRedirect({request, response, storefront}); } return response; }, }; ``` ```ts import {storefrontRedirect, createStorefrontClient} from '@shopify/hydrogen'; import * as remixBuild from '@remix-run/dev/server-build'; import { createRequestHandler, getStorefrontHeaders, } from '@shopify/remix-oxygen'; export default { async fetch(request: Request, env: Env, executionContext: ExecutionContext) { const {storefront} = createStorefrontClient({ cache: await caches.open('hydrogen'), waitUntil: (p: Promise) => executionContext.waitUntil(p), privateStorefrontToken: env.PRIVATE_STOREFRONT_API_TOKEN, publicStorefrontToken: env.PUBLIC_STOREFRONT_API_TOKEN, storeDomain: env.PUBLIC_STORE_DOMAIN, storefrontHeaders: getStorefrontHeaders(request), }); const handleRequest = createRequestHandler({ build: remixBuild, mode: process.env.NODE_ENV, }); const response = await handleRequest(request); if (response.status === 404) { /** * Check for redirects only when there's a 404 from * the app. If the redirect doesn't exist, then * `storefrontRedirect` will pass through the 404 * response. */ return storefrontRedirect({request, response, storefront}); } return response; }, }; ``` ## Arguments ### StorefrontRedirectGeneratedType Queries the Storefront API to see if there is any redirect created for the current route and performs it. Otherwise, it returns the response passed in the parameters. Useful for conditionally redirecting after a 404 response. #### Returns: Promise #### Params: - options: StorefrontRedirect export async function storefrontRedirect( options: StorefrontRedirect, ): Promise { const { storefront, request, noAdminRedirect, response = new Response('Not Found', {status: 404}), } = options; const {pathname, search} = new URL(request.url); const redirectFrom = pathname + search; if (pathname === '/admin' && !noAdminRedirect) { return redirect(`${storefront.getShopifyDomain()}/admin`); } try { const {urlRedirects} = await storefront.query<{ urlRedirects: UrlRedirectConnection; }>(REDIRECT_QUERY, { variables: {query: 'path:' + redirectFrom}, }); const location = urlRedirects?.edges?.[0]?.node?.target; if (location) { return new Response(null, {status: 301, headers: {location}}); } const searchParams = new URLSearchParams(search); const redirectTo = searchParams.get('return_to') || searchParams.get('redirect'); if (redirectTo) { if (isLocalPath(redirectTo)) { return redirect(redirectTo); } else { console.warn( `Cross-domain redirects are not supported. Tried to redirect from ${redirectFrom} to ${redirectTo}`, ); } } } catch (error) { console.error( `Failed to fetch redirects from Storefront API for route ${redirectFrom}`, error, ); } return response; } ### StorefrontRedirect ### storefront value: `Storefront` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } - I18nBase: { language: LanguageCode; country: CountryCode; } The [Storefront client](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/createstorefrontclient) instance ### request value: `Request` The [MDN Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object that was passed to the `server.ts` request handler. ### response value: `Response` The [MDN Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) object created by `handleRequest` ### noAdminRedirect value: `boolean` By default the `/admin` route is redirected to the Shopify Admin page for the current storefront. Disable this redirect by passing `true`. ### Storefront Interface to interact with the Storefront API. ### query value: `(query: RawGqlString, ...options: RawGqlString extends never ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] : [StorefrontQuerySecondParam] : [StorefrontQuerySecondParam?]) => Promise` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } - IsOptionalVariables: Omit< OperationTypeValue['variables'], AutoAddedVariableNames > extends EmptyVariables ? true // No need to pass variables : GenericVariables extends OperationTypeValue['variables'] ? true // We don't know what variables are needed : false - StorefrontQueries: export interface StorefrontQueries { // Example of how a generated query type looks like: // '#graphql query q1 {...}': {return: Q1Query; variables: Q1QueryVariables}; } - StorefrontQuerySecondParam: (RawGqlString extends keyof StorefrontQueries ? StorefrontCommonOptions : StorefrontCommonOptions) & {cache?: CachingStrategy} The function to run a query on Storefront API. ### mutate value: `(mutation: RawGqlString, ...options: RawGqlString extends never ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] : [StorefrontMutateSecondParam] : [StorefrontCommonOptions<{ readonly [variable: string]: unknown; }>?]) => Promise` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } - IsOptionalVariables: Omit< OperationTypeValue['variables'], AutoAddedVariableNames > extends EmptyVariables ? true // No need to pass variables : GenericVariables extends OperationTypeValue['variables'] ? true // We don't know what variables are needed : false - StorefrontCommonOptions: { headers?: HeadersInit; storefrontApiVersion?: string; } & (IsOptionalVariables<{variables: Variables}> extends true ? {variables?: Variables} : {variables: Variables}) - StorefrontMutations: export interface StorefrontMutations { // Example of how a generated mutation type looks like: // '#graphql mutation m1 {...}': {return: M1Mutation; variables: M1MutationVariables}; } - StorefrontMutateSecondParam: RawGqlString extends keyof StorefrontMutations ? StorefrontCommonOptions : StorefrontCommonOptions The function to run a mutation on Storefront API. ### cache value: `Cache` The cache instance passed in from the `createStorefrontClient` argument. ### CacheNone value: `() => NoStoreStrategy` - NoStoreStrategy: { mode: string; } Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). ### CacheLong value: `(overrideOptions?: AllCacheOptions) => AllCacheOptions` - AllCacheOptions: export interface AllCacheOptions { /** * The caching mode, generally `public`, `private`, or `no-store`. */ mode?: string; /** * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). */ maxAge?: number; /** * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). */ staleWhileRevalidate?: number; /** * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). */ sMaxAge?: number; /** * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). */ staleIfError?: number; } Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). ### CacheShort value: `(overrideOptions?: AllCacheOptions) => AllCacheOptions` - AllCacheOptions: export interface AllCacheOptions { /** * The caching mode, generally `public`, `private`, or `no-store`. */ mode?: string; /** * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). */ maxAge?: number; /** * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). */ staleWhileRevalidate?: number; /** * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). */ sMaxAge?: number; /** * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). */ staleIfError?: number; } Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). ### CacheCustom value: `(overrideOptions: AllCacheOptions) => AllCacheOptions` - AllCacheOptions: export interface AllCacheOptions { /** * The caching mode, generally `public`, `private`, or `no-store`. */ mode?: string; /** * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). */ maxAge?: number; /** * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). */ staleWhileRevalidate?: number; /** * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). */ sMaxAge?: number; /** * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). */ staleIfError?: number; } Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). ### generateCacheControlHeader value: `(cacheOptions: AllCacheOptions) => string` - AllCacheOptions: export interface AllCacheOptions { /** * The caching mode, generally `public`, `private`, or `no-store`. */ mode?: string; /** * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). */ maxAge?: number; /** * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). */ staleWhileRevalidate?: number; /** * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). */ sMaxAge?: number; /** * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). */ staleIfError?: number; } Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). ### getPublicTokenHeaders value: `(props?: Partial> & Pick) => Record` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. ### getPrivateTokenHeaders value: `(props?: Partial> & Pick & { buyerIp?: string; }) => Record` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details. ### getShopifyDomain value: `(props?: Partial>) => string` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. ### getApiUrl value: `(props?: Partial>) => string` - Storefront: { /** The function to run a query on Storefront API. */ query: ( query: RawGqlString, ...options: RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? IsOptionalVariables extends true ? [StorefrontQuerySecondParam?] // Using codegen, query has no variables : [StorefrontQuerySecondParam] // Using codegen, query needs variables : [StorefrontQuerySecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontQueries // Do we have any generated query types? ? StorefrontQueries[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The function to run a mutation on Storefront API. */ mutate: ( mutation: RawGqlString, ...options: RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? IsOptionalVariables extends true ? [StorefrontMutateSecondParam?] // Using codegen, mutation has no variables : [StorefrontMutateSecondParam] // Using codegen, mutation needs variables : [StorefrontMutateSecondParam?] // No codegen, variables always optional ) => Promise< RawGqlString extends keyof StorefrontMutations // Do we have any generated mutation types? ? StorefrontMutations[RawGqlString]['return'] // Using codegen, return type is known : OverrideReturnType // No codegen, let user specify return type >; /** The cache instance passed in from the `createStorefrontClient` argument. */ cache?: Cache; /** Re-export of [`CacheNone`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachenone). */ CacheNone: typeof CacheNone; /** Re-export of [`CacheLong`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachelong). */ CacheLong: typeof CacheLong; /** Re-export of [`CacheShort`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cacheshort). */ CacheShort: typeof CacheShort; /** Re-export of [`CacheCustom`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/cachecustom). */ CacheCustom: typeof CacheCustom; /** Re-export of [`generateCacheControlHeader`](https://shopify.dev/docs/api/hydrogen/2023-10/utilities/generatecachecontrolheader). */ generateCacheControlHeader: typeof generateCacheControlHeader; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */ getPublicTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPublicTokenHeaders']; /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/ getPrivateTokenHeaders: ReturnType< typeof createStorefrontUtilities >['getPrivateTokenHeaders']; /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */ getShopifyDomain: ReturnType< typeof createStorefrontUtilities >['getShopifyDomain']; /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/ getApiUrl: ReturnType< typeof createStorefrontUtilities >['getStorefrontApiUrl']; /** Determines if the error is resulted from a Storefront API call. */ isApiError: (error: any) => boolean; /** The `i18n` object passed in from the `createStorefrontClient` argument. */ i18n: TI18n; } Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](https://shopify.dev/docs/api/hydrogen-react/2023-10/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details. ### isApiError value: `(error: any) => boolean` Determines if the error is resulted from a Storefront API call. ### i18n value: `TI18n` The `i18n` object passed in from the `createStorefrontClient` argument. ### CachingStrategy Use the `CachingStrategy` to define a custom caching mechanism for your data. Or use one of the pre-defined caching strategies: CacheNone, CacheShort, CacheLong. ### mode value: `string` The caching mode, generally `public`, `private`, or `no-store`. ### maxAge value: `number` The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). ### staleWhileRevalidate value: `number` Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). ### sMaxAge value: `number` Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). ### staleIfError value: `number` Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). ### NoStoreStrategy ### mode value: `string` ### AllCacheOptions Override options for a cache strategy. ### mode value: `string` The caching mode, generally `public`, `private`, or `no-store`. ### maxAge value: `number` The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage). ### staleWhileRevalidate value: `number` Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate). ### sMaxAge value: `number` Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage). ### staleIfError value: `number` Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error). ### I18nBase ### language value: `LanguageCode` ### country value: `CountryCode`