{"version":3,"file":"index.mjs","sources":["../../src/api/config/constants.ts","../../src/api/config/index.ts","../../src/client/utils/errors.ts","../../src/client/utils/is-object.ts","../../src/client/utils/request.ts","../../src/client/utils/response.ts","../../src/client/utils/timeout.ts","../../src/client/utils/url.ts","../../src/client/create-client.ts","../../src/client/index.ts","../../src/api/categories/search-categories.ts","../../src/api/categories/search-categories-by-path.ts","../../src/api/products/search-products.ts","../../src/api/products/get-product.ts","../../src/api/products/download-product-file.ts","../../src/api/products/search-product-variations.ts","../../src/api/products/get-product-variation.ts","../../src/api/products/search-product-types.ts","../../src/api/products/get-product-type.ts","../../src/api/products/search-product-brands.ts","../../src/api/store/get-store-profile.ts","../../src/api/reviews/get-reviews.ts"],"sourcesContent":["export const API_BASE_URL = 'https://app.ecwid.com/api/v3/';\nexport const API_TIMEOUT = 10000;\n","import { API_BASE_URL } from '@/api/config/constants';\nimport { ERROR_MESSAGES } from '@/client/constants';\nimport { getStoreId } from '@/storefront';\nimport { ApiConfig } from '@/types';\n\nlet apiConfig: Required<ApiConfig> | undefined;\n\n/**\n * Get the API configuration.\n *\n * @example\n * ```typescript\n * import { getApiConfig, ApiConfig } from '@lightspeed/ecom-headless';\n *\n * const config: ApiConfig = getApiConfig();\n * ```\n */\nexport const getApiConfig = (): Required<ApiConfig> => {\n  if (apiConfig === undefined) {\n    throw new Error(ERROR_MESSAGES.CONFIG_NOT_INITIALIZED);\n  }\n\n  return apiConfig;\n};\n\n/**\n * Initialize the Storefront API client.\n *\n * @example\n * ```typescript\n * import { initStorefrontApi } from '@lightspeed/ecom-headless';\n *\n * await initStorefrontApi({\n *   publicToken: 'YOUR_PUBLIC_TOKEN',\n *   storeId: 'YOUR_STORE_ID'\n * });\n * ```\n *\n * @remarks\n * - This method must be called before using any other API methods.\n * - If storeId is not provided, it will be auto-detected. If detection fails, an error will be thrown.\n */\nexport const initStorefrontApi = async (config: ApiConfig): Promise<void> => {\n  if (config.publicToken === undefined) {\n    throw new Error(ERROR_MESSAGES.CONFIG_PUBLIC_TOKEN_REQUIRED);\n  }\n\n  const storeId = config.storeId ?? await getStoreId();\n\n  if (storeId === undefined) {\n    throw new Error(ERROR_MESSAGES.CONFIG_STORE_ID_NOT_FOUND);\n  }\n\n  apiConfig = {\n    baseURL: config.baseURL ?? API_BASE_URL,\n    publicToken: config.publicToken,\n    storeId,\n  } satisfies Required<ApiConfig>;\n};\n","export class TimeoutError extends Error {\n  constructor(url?: string, method?: string, timeout?: number) {\n    super(\n      `Request timeout${timeout ? ` after ${timeout}ms` : ''}${url ? ` for ${method} ${url}` : ''}`,\n    );\n    this.name = 'TimeoutError';\n  }\n}\n\nexport function createTimeoutError(url?: string, method?: string, timeout?: number): TimeoutError {\n  return new TimeoutError(url, method, timeout);\n}\n\nexport function isAbortError(error: unknown): boolean {\n  return error instanceof Error && error.name === 'AbortError';\n}\n","export function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { isObject } from '@/client/utils';\nimport { BaseHeaders, RequestConfig, RequestData } from '@/types';\n\nexport function isFetchAvailable(): boolean {\n  return typeof globalThis.fetch === 'function';\n}\n\nexport function buildRequestHeaders(\n  publicToken: string,\n  config: RequestConfig = {},\n): Record<string, string> & BaseHeaders {\n  return {\n    'Authorization': `Bearer ${publicToken}`,\n    'X-Lightspeed-Request-Origin': 'ecom-headless',\n    'redirect': 'follow',\n    ...config.headers,\n  };\n}\n\nexport function prepareRequestBody(\n  method: string,\n  data: RequestData,\n): BodyInit | undefined {\n  if (method === 'GET' || data === undefined) {\n    return undefined;\n  }\n\n  if (typeof data === 'string') {\n    return data;\n  }\n\n  if (isObject(data)) {\n    return JSON.stringify(data);\n  }\n\n  return undefined;\n}\n","import { ResponseType } from '@/types';\n\nexport async function parseResponseData(\n  response: Response,\n  responseType?: ResponseType,\n): Promise<ReturnType<typeof response.json> | ReturnType<typeof response.blob> | Response> {\n  switch (responseType) {\n    case 'json':\n      return response.json();\n    case 'blob':\n      return response.blob();\n    default:\n      try {\n        return await response.json();\n      } catch {\n        return response;\n      }\n  }\n}\n","interface TimeoutController {\n  controller?: AbortController;\n  timer?: ReturnType<typeof setTimeout>;\n}\n\nexport function createTimeoutController(timeout: number): {\n  controller?: AbortController;\n  timer?: ReturnType<typeof setTimeout>;\n} {\n  if (typeof AbortController === 'undefined') {\n    return {};\n  }\n\n  const controller = new AbortController();\n  const timer = setTimeout(() => {\n    controller.abort();\n  }, timeout);\n\n  return { controller, timer };\n}\n\nexport function clearTimeoutController(timeoutController: TimeoutController): void {\n  if (timeoutController.timer !== undefined) {\n    clearTimeout(timeoutController.timer);\n  }\n}\n","import { getApiConfig } from '@/api';\nimport { QueryParams } from '@/types';\n\nfunction processQueryParam(\n  key: string,\n  value: QueryParams[string],\n): string | undefined {\n  if (value === undefined) {\n    return;\n  }\n\n  return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n}\n\nfunction createUrl(path: string): string {\n  if (path.startsWith('http://') || path.startsWith('https://')) {\n    return path;\n  }\n\n  const { baseURL } = getApiConfig();\n  const normalizedBase = baseURL.endsWith('/') ? baseURL : baseURL + '/';\n  const normalizedPath = path.startsWith('/') ? path.slice(1) : path;\n\n  return normalizedBase + normalizedPath;\n}\n\nexport function buildUrlWithParams(path: string, params?: QueryParams): string {\n  const url = createUrl(path);\n\n  if (params === undefined) {\n    return url;\n  }\n\n  const queryParams = Object\n    .entries(params)\n    .map(([key, value]) => processQueryParam(key, value))\n    .filter((param): param is string => param !== undefined);\n\n  if (queryParams.length > 0) {\n    return `${url}?${queryParams.join('&')}`;\n  }\n\n  return url;\n}\n","import { getApiConfig } from '@/api/config';\nimport { API_TIMEOUT } from '@/api/config/constants';\nimport {\n  buildRequestHeaders,\n  buildUrlWithParams,\n  clearTimeoutController,\n  createTimeoutController,\n  createTimeoutError,\n  isAbortError,\n  parseResponseData,\n  prepareRequestBody,\n} from '@/client/utils';\nimport { HttpClient, RequestConfig, RequestData, HttpResponse } from '@/types';\n\nexport function createClient(): HttpClient {\n  const { publicToken } = getApiConfig();\n\n  async function request<T = unknown>(\n    method: string,\n    path: string,\n    config?: RequestConfig,\n    requestData?: RequestData,\n  ): Promise<HttpResponse<T>> {\n    const timeout = config?.timeout ?? API_TIMEOUT;\n    const timeoutController = createTimeoutController(timeout);\n\n    try {\n      const headers = buildRequestHeaders(publicToken, config);\n      const finalUrl = buildUrlWithParams(path, config?.params);\n\n      const response = await fetch(finalUrl, {\n        method,\n        headers,\n        body: prepareRequestBody(method, requestData),\n        signal: timeoutController.controller?.signal,\n      });\n\n      const parsedResponseData = await parseResponseData(response, config?.responseType);\n\n      return Object.assign(response, {\n        data: parsedResponseData,\n      }) satisfies HttpResponse<T>;\n    } catch (error) {\n      if (isAbortError(error)) {\n        throw createTimeoutError(path, method, timeout);\n      }\n\n      throw error;\n    } finally {\n      clearTimeoutController(timeoutController);\n    }\n  }\n\n  return {\n    get: <T>(url: string, config?: RequestConfig) => request<T>('GET', url, config),\n    post: <T>(url: string, data?: RequestData, config?: RequestConfig) => request<T>('POST', url, config, data),\n    put: <T>(url: string, data?: RequestData, config?: RequestConfig) => request<T>('PUT', url, config, data),\n    patch: <T>(url: string, data?: RequestData, config?: RequestConfig) => request<T>('PATCH', url, config, data),\n    delete: <T>(url: string, config?: RequestConfig) => request<T>('DELETE', url, config),\n  };\n}\n","import { ERROR_MESSAGES } from '@/client/constants';\nimport { createClient } from '@/client/create-client';\nimport { isFetchAvailable } from '@/client/utils';\nimport { HttpClient } from '@/types';\n\nlet client: HttpClient | undefined;\n\n/**\n * Get the singleton instance of the API client.\n * @returns The HTTP client instance\n * @throws {Error} If the fetch API is not available or client creation fails\n */\nexport function getApiClient(): HttpClient {\n  if (client !== undefined) {\n    return client;\n  }\n\n  if (!isFetchAvailable()) {\n    throw new Error(ERROR_MESSAGES.FETCH_API_NOT_AVAILABLE);\n  }\n\n  client = createClient();\n\n  return client;\n}\n\n/**\n * Reset the singleton API client instance.\n * Useful for testing or when configuration changes require a fresh client.\n */\nexport function resetApiClient(): void {\n  client = undefined;\n}\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { SearchCategoriesParams, SearchCategoriesResponse, RequestConfig } from '@/types';\n\n/**\n * Search categories in the store based on provided parameters.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/categories/search-categories | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { searchCategories, SearchCategoriesResponse } from '@lightspeed/ecom-headless';\n *\n * const categories: SearchCategoriesResponse = await searchCategories();\n * ```\n */\nexport const searchCategories = async (\n  params?: SearchCategoriesParams,\n): Promise<SearchCategoriesResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<SearchCategoriesParams> = {\n    params,\n  };\n\n  const url = `${storeId}/categories`;\n  const response = await apiClient.get<SearchCategoriesResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { SearchCategoriesByPathParams, SearchCategoriesByPathResponse, RequestConfig } from '@/types';\n\n/**\n * Search categories by path using a delimiter-separated path string.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/categories/search-categories-by-path | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { searchCategoriesByPath, SearchCategoriesByPathResponse } from '@lightspeed/ecom-headless';\n *\n * const categories: SearchCategoriesByPathResponse = await searchCategoriesByPath({\n *   path: \"Electronics/Phones/Smartphones\",\n *   delimiter: \"/\"\n * });\n * ```\n */\nexport const searchCategoriesByPath = async (\n  params: SearchCategoriesByPathParams,\n): Promise<SearchCategoriesByPathResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<SearchCategoriesByPathParams> = {\n    params,\n  };\n\n  const url = `${storeId}/categoriesByPath`;\n  const response = await apiClient.get<SearchCategoriesByPathResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { SearchProductsParams, SearchProductsResponse, RequestConfig } from '@/types';\n\n/**\n * Search for products in a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/search-products | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { searchProducts, SearchProductsResponse } from '@lightspeed/ecom-headless';\n *\n * const products: SearchProductsResponse = await searchProducts({ keyword: 'laptop' });\n * ```\n */\nexport const searchProducts = async (\n  params?: SearchProductsParams,\n): Promise<SearchProductsResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<SearchProductsParams> = {\n    params,\n  };\n\n  const url = `${storeId}/products`;\n  const response = await apiClient.get<SearchProductsResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { GetProductParams, GetProductResponse, RequestConfig } from '@/types';\n\n/**\n * Get a product from a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/get-product | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { getProduct, GetProductResponse } from '@lightspeed/ecom-headless';\n *\n * const product: GetProductResponse = await getProduct({ productId: 123 });\n * ```\n */\nexport const getProduct = async (\n  params: GetProductParams,\n): Promise<GetProductResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const { productId } = params;\n  const options: RequestConfig<GetProductParams> = {\n    params,\n  };\n\n  const url = `${storeId}/products/${productId}`;\n  const response = await apiClient.get<GetProductResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { DownloadProductFileParams, DownloadProductFileResponse, RequestConfig } from '@/types';\n\n/**\n * Download a product file from a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/product-files/download-product-file | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { downloadProductFile, DownloadProductFileResponse } from '@lightspeed/ecom-headless';\n *\n * const file: DownloadProductFileResponse = await downloadProductFile({ productId: 123, fileId: 456 });\n * ```\n */\nexport const downloadProductFile = async (\n  params: DownloadProductFileParams,\n): Promise<DownloadProductFileResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const { productId, fileId } = params;\n  const options: RequestConfig<DownloadProductFileParams> = {\n    responseType: 'blob',\n  };\n\n  const url = `${storeId}/products/${productId}/files/${fileId}`;\n  const response = await apiClient.get<DownloadProductFileResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { SearchProductVariationsParams, SearchProductVariationsResponse, RequestConfig } from '@/types';\n\n/**\n * Search for product variations in a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/product-variations/search-product-variations | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { searchProductVariations, SearchProductVariationsResponse } from '@lightspeed/ecom-headless';\n *\n * const variations: SearchProductVariationsResponse = await searchProductVariations({ productId: 123 });\n * ```\n */\nexport const searchProductVariations = async (\n  params: SearchProductVariationsParams,\n): Promise<SearchProductVariationsResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const { productId } = params;\n  const options: RequestConfig<SearchProductVariationsParams> = {\n    params,\n  };\n\n  const url = `${storeId}/products/${productId}/combinations`;\n  const response = await apiClient.get<SearchProductVariationsResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { GetProductVariationParams, GetProductVariationResponse, RequestConfig } from '@/types';\n\n/**\n * Get a product variation from a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/product-variations/get-product-variation | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { getProductVariation, GetProductVariationResponse } from '@lightspeed/ecom-headless';\n *\n * const variation: GetProductVariationResponse = await getProductVariation({\n *   productId: 123,\n *   combinationId: 456\n * });\n * ```\n */\nexport const getProductVariation = async (\n  params: GetProductVariationParams,\n): Promise<GetProductVariationResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const { productId, combinationId } = params;\n  const options: RequestConfig<GetProductVariationParams> = {\n    params,\n  };\n\n  const url = `${storeId}/products/${productId}/combinations/${combinationId}`;\n  const response = await apiClient.get<GetProductVariationResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { SearchProductTypesResponse } from '@/types';\n\n/**\n * Search for product types in a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/product-types-and-attributes/search-product-types | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { searchProductTypes, SearchProductTypesResponse } from '@lightspeed/ecom-headless';\n *\n * const productTypes: SearchProductTypesResponse = await searchProductTypes();\n * ```\n */\nexport const searchProductTypes = async (): Promise<SearchProductTypesResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n\n  const url = `${storeId}/classes`;\n  const response = await apiClient.get<SearchProductTypesResponse>(url);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { GetProductTypeParams, GetProductTypeResponse, RequestConfig } from '@/types';\n\n/**\n * Get a product type from a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/product-types-and-attributes/get-product-type | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { getProductType, GetProductTypeResponse } from '@lightspeed/ecom-headless';\n *\n * const productType: GetProductTypeResponse = await getProductType({ classId: 0 });\n * ```\n */\nexport const getProductType = async (\n  params: GetProductTypeParams,\n): Promise<GetProductTypeResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<GetProductTypeParams> = {\n    params,\n  };\n\n  const url = `${storeId}/classes/${params.classId}`;\n  const response = await apiClient.get<GetProductTypeResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { SearchProductBrandsParams, SearchProductBrandsResponse, RequestConfig } from '@/types';\n\n/**\n * Search for product brands in a store.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/products/search-product-brands | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { searchProductBrands, SearchProductBrandsResponse } from '@lightspeed/ecom-headless';\n *\n * const brands: SearchProductBrandsResponse = await searchProductBrands({ limit: 10 });\n * ```\n */\nexport const searchProductBrands = async (\n  params?: SearchProductBrandsParams,\n): Promise<SearchProductBrandsResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<SearchProductBrandsParams> = {\n    params,\n  };\n\n  const url = `${storeId}/brands`;\n  const response = await apiClient.get<SearchProductBrandsResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { GetStoreProfileParams, GetStoreProfileResponse, RequestConfig } from '@/types';\n\n/**\n * Get basic information about an Ecwid store: settings, store location, email, etc.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/store-profile/get-store-profile | Ecwid API Documentation}\n *\n * @example\n * ```typescript\n * import { getStoreProfile, GetStoreProfileResponse } from '@lightspeed/ecom-headless';\n *\n * const profile: GetStoreProfileResponse = await getStoreProfile();\n * ```\n */\nexport const getStoreProfile = async (\n  params?: GetStoreProfileParams,\n): Promise<GetStoreProfileResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<GetStoreProfileParams> = {\n    params,\n  };\n\n  const url = `${storeId}/profile`;\n  const response = await apiClient.get<GetStoreProfileResponse>(url, options);\n  return response.data;\n};\n","import { getApiConfig } from '@/api/config';\nimport { getApiClient } from '@/client';\nimport { GetReviewsParams, GetReviewsResponse, RequestConfig } from '@/types';\n\n/**\n * Get product reviews from a store.\n * Returns published reviews when accessed with a public token.\n *\n * @see {@link https://docs.ecwid.com/api-reference/rest-api/reviews/get-reviews | Ecwid API Documentation}\n *\n * @param params - Query parameters with optional offset and limit for pagination\n * @returns Promise resolving to GetReviewsResponse containing paginated reviews\n * @throws Error if API client is not initialized or request fails\n *\n * @example\n * ```typescript\n * import { getReviews } from '@lightspeed/ecom-headless';\n *\n * const response = await getReviews({ limit: 3 });\n * response.items.forEach(review => {\n *   console.log(`${review.rating}⭐ - ${review.review}`);\n * });\n * ```\n */\nexport const getReviews = async (\n  params?: GetReviewsParams,\n): Promise<GetReviewsResponse> => {\n  const apiClient = getApiClient();\n  const { storeId } = getApiConfig();\n  const options: RequestConfig<GetReviewsParams> = {\n    params,\n  };\n\n  const url = `${storeId}/reviews`;\n  const response = await apiClient.get<GetReviewsResponse>(url, options);\n  return response.data;\n};\n"],"names":["API_BASE_URL","API_TIMEOUT","apiConfig","getApiConfig","ERROR_MESSAGES","initStorefrontApi","config","storeId","getStoreId","TimeoutError","url","method","timeout","createTimeoutError","isAbortError","error","isObject","value","isFetchAvailable","buildRequestHeaders","publicToken","prepareRequestBody","data","parseResponseData","response","responseType","createTimeoutController","controller","timer","clearTimeoutController","timeoutController","processQueryParam","key","createUrl","path","baseURL","normalizedBase","normalizedPath","buildUrlWithParams","params","queryParams","param","createClient","request","requestData","headers","finalUrl","parsedResponseData","client","getApiClient","searchCategories","apiClient","options","searchCategoriesByPath","searchProducts","getProduct","productId","downloadProductFile","fileId","searchProductVariations","getProductVariation","combinationId","searchProductTypes","getProductType","searchProductBrands","getStoreProfile","getReviews"],"mappings":"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"}