import { CommerceAPIConfig } from 'lib/commerce/api'; import { GetAllProductsQueryVariables } from '../schema'; import fetchAPI from './utils/fetch-api'; export interface Images { small?: ImageOptions; medium?: ImageOptions; large?: ImageOptions; xl?: ImageOptions; } export interface ImageOptions { width: number; height?: number; } export type ProductImageVariables = Pick< GetAllProductsQueryVariables, | 'imgSmallWidth' | 'imgSmallHeight' | 'imgMediumWidth' | 'imgMediumHeight' | 'imgLargeWidth' | 'imgLargeHeight' | 'imgXLWidth' | 'imgXLHeight' >; export interface BigcommerceConfigOptions extends CommerceAPIConfig { images?: Images; } export interface BigcommerceConfig extends BigcommerceConfigOptions { readonly imageVariables?: ProductImageVariables; } const API_URL = process.env.BIGCOMMERCE_STOREFRONT_API_URL; const API_TOKEN = process.env.BIGCOMMERCE_STOREFRONT_API_TOKEN; if (!API_URL) { throw new Error( `The environment variable BIGCOMMERCE_STOREFRONT_API_URL is missing and it's required to access your store` ); } if (!API_TOKEN) { throw new Error( `The environment variable BIGCOMMERCE_STOREFRONT_API_TOKEN is missing and it's required to access your store` ); } export class Config { private config: BigcommerceConfig; constructor(config: BigcommerceConfigOptions) { this.config = { ...config, get imageVariables() { const { images } = this; return images ? { imgSmallWidth: images.small?.width, imgSmallHeight: images.small?.height, imgMediumWidth: images.medium?.height, imgMediumHeight: images.medium?.height, imgLargeWidth: images.large?.height, imgLargeHeight: images.large?.height, imgXLWidth: images.xl?.height, imgXLHeight: images.xl?.height, } : undefined; }, }; } getConfig() { return this.config; } setConfig(newConfig: Partial) { Object.assign(this.config, newConfig); } } const config = new Config({ commerceUrl: API_URL, apiToken: API_TOKEN, fetch: fetchAPI, }); export function getConfig() { return config.getConfig(); } export function setConfig(newConfig: Partial) { return config.setConfig(newConfig); }