@commercengine/storefront-sdk 0.3.11 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +354 -53
- package/dist/index.cjs +2459 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{types/storefront.d.ts → index.d.cts} +1489 -5
- package/dist/index.d.ts +9971 -23
- package/dist/index.global.js +2990 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +2407 -235
- package/dist/index.js.map +1 -0
- package/package.json +6 -3
- package/dist/lib/auth-utils.d.ts +0 -16
- package/dist/lib/auth-utils.js +0 -38
- package/dist/lib/auth.d.ts +0 -186
- package/dist/lib/auth.js +0 -324
- package/dist/lib/cart.d.ts +0 -163
- package/dist/lib/cart.js +0 -302
- package/dist/lib/catalog.d.ts +0 -101
- package/dist/lib/catalog.js +0 -204
- package/dist/lib/client.d.ts +0 -113
- package/dist/lib/client.js +0 -297
- package/dist/lib/customer.d.ts +0 -87
- package/dist/lib/customer.js +0 -153
- package/dist/lib/header-utils.d.ts +0 -26
- package/dist/lib/header-utils.js +0 -66
- package/dist/lib/helper.d.ts +0 -27
- package/dist/lib/helper.js +0 -40
- package/dist/lib/jwt-utils.d.ts +0 -75
- package/dist/lib/jwt-utils.js +0 -84
- package/dist/lib/logger-utils.d.ts +0 -88
- package/dist/lib/logger-utils.js +0 -211
- package/dist/lib/middleware.d.ts +0 -129
- package/dist/lib/middleware.js +0 -333
- package/dist/lib/order.d.ts +0 -72
- package/dist/lib/order.js +0 -125
- package/dist/lib/shipping.d.ts +0 -21
- package/dist/lib/shipping.js +0 -30
- package/dist/types/storefront-api-types.d.ts +0 -368
- package/dist/types/storefront-api-types.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/openapi-fetch@0.13.8/node_modules/openapi-fetch/dist/index.js","../../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/webapi/lib/buffer_utils.js","../../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/webapi/lib/base64.js","../../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/webapi/util/base64url.js","../../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/webapi/util/errors.js","../../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/webapi/lib/is_object.js","../../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/webapi/util/decode_jwt.js","../src/lib/jwt-utils.ts","../src/lib/auth-utils.ts","../src/lib/middleware.ts","../src/lib/logger-utils.ts","../src/lib/header-utils.ts","../src/lib/client.ts","../src/lib/catalog.ts","../src/lib/cart.ts","../src/lib/auth.ts","../src/lib/order.ts","../src/lib/shipping.ts","../src/lib/helper.ts","../src/lib/customer.ts"],"sourcesContent":["import { StorefrontAPIClient, Environment } from \"./lib/client\";\nimport { CatalogClient } from \"./lib/catalog\";\nimport { CartClient } from \"./lib/cart\";\nimport { AuthClient } from \"./lib/auth\";\nimport { OrderClient } from \"./lib/order\";\nimport { ShippingClient } from \"./lib/shipping\";\nimport { HelpersClient } from \"./lib/helper\";\nimport { CustomerClient } from \"./lib/customer\";\nimport {\n TokenStorage,\n MemoryTokenStorage,\n BrowserTokenStorage,\n CookieTokenStorage,\n} from \"./lib/middleware\";\nimport {\n extractUserInfoFromToken,\n getUserIdFromToken,\n isUserLoggedIn,\n isUserAnonymous,\n type UserInfo,\n} from \"./lib/jwt-utils\";\nimport { ResponseUtils, type DebugLoggerFn } from \"./lib/logger-utils\";\n\n/**\n * Supported default headers that can be set at the SDK level\n * Only includes headers that are actually supported by API endpoints\n */\nexport interface SupportedDefaultHeaders {\n /**\n * Customer group ID used for pricing, promotions, and subscription rates\n * If not provided, the API will use default pricing\n */\n customer_group_id?: string;\n // Future: Add other supported headers here as they become available\n}\n\n/**\n * SDK initialization options\n */\nexport interface StorefrontSDKOptions {\n /**\n * Store ID for the API requests\n */\n storeId: string;\n\n /**\n * Environment to use (defaults to Production)\n */\n environment?: Environment;\n\n /**\n * Custom base URL (overrides environment if provided)\n */\n baseUrl?: string;\n\n /**\n * Optional initial access token\n * - If tokenStorage is provided: Used as initial token value, then managed automatically\n * - If tokenStorage is not provided: Used for manual token management\n */\n accessToken?: string;\n\n /**\n * Optional initial refresh token\n * - Only used when tokenStorage is provided\n * - Allows initialization with both access and refresh tokens\n */\n refreshToken?: string;\n\n /**\n * X-Api-Key for anonymous authentication endpoints\n * Required for initial authentication\n */\n apiKey?: string;\n\n /**\n * Optional timeout in milliseconds\n */\n timeout?: number;\n\n /**\n * Optional token storage for automatic token management\n * If provided, enables automatic token refresh and management\n */\n tokenStorage?: TokenStorage;\n\n /**\n * Callback when tokens are updated (login/refresh)\n */\n onTokensUpdated?: (accessToken: string, refreshToken: string) => void;\n\n /**\n * Callback when tokens are cleared (logout/error)\n */\n onTokensCleared?: () => void;\n\n /**\n * Default headers to include with API requests\n * These can be overridden at the method level\n * Only supports headers that are actually available in the API\n */\n defaultHeaders?: SupportedDefaultHeaders;\n\n /**\n * Enable debug mode for detailed request/response logging\n * When enabled, detailed debug information will be logged via the logger\n * Note: Response objects are always included in ApiResult regardless of debug mode\n */\n debug?: boolean;\n\n /**\n * Custom logger function for debug information\n * If not provided and debug is enabled, will use console.log\n */\n logger?: DebugLoggerFn;\n}\n\n/**\n * Main SDK class for the Storefront API\n */\nexport class StorefrontSDK {\n /**\n * Client for catalog-related endpoints (products, categories, etc.)\n */\n public readonly catalog: CatalogClient;\n\n /**\n * Client for cart-related endpoints\n */\n public readonly cart: CartClient;\n\n /**\n * Client for authentication-related endpoints\n */\n public readonly auth: AuthClient;\n\n /**\n * Client for customer-related endpoints\n */\n public readonly customer: CustomerClient;\n\n /**\n * Client for helper-related endpoints\n */\n public readonly helpers: HelpersClient;\n\n /**\n * Client for shipping-related endpoints\n */\n public readonly shipping: ShippingClient;\n\n /**\n * Client for order-related endpoints\n */\n public readonly order: OrderClient;\n\n /**\n * Create a new StorefrontSDK instance\n *\n * @param options - Configuration options for the SDK\n */\n constructor(options: StorefrontSDKOptions) {\n // Convert options to internal config format\n const config: StorefrontSDKOptions = {\n storeId: options.storeId,\n environment: options.environment,\n baseUrl: options.baseUrl,\n accessToken: options.accessToken,\n refreshToken: options.refreshToken,\n apiKey: options.apiKey,\n timeout: options.timeout,\n tokenStorage: options.tokenStorage,\n onTokensUpdated: options.onTokensUpdated,\n onTokensCleared: options.onTokensCleared,\n defaultHeaders: options.defaultHeaders,\n debug: options.debug,\n logger: options.logger,\n };\n\n this.catalog = new CatalogClient(config);\n this.cart = new CartClient(config);\n this.auth = new AuthClient(config);\n this.customer = new CustomerClient(config);\n this.helpers = new HelpersClient(config);\n this.shipping = new ShippingClient(config);\n this.order = new OrderClient(config);\n }\n\n /**\n * Set authentication tokens for all clients\n *\n * @param accessToken - The access token (required)\n * @param refreshToken - The refresh token (optional)\n *\n * Behavior:\n * - If tokenStorage is provided: Stores tokens for automatic management\n * - If tokenStorage is not provided: Only stores access token for manual management\n */\n public async setTokens(\n accessToken: string,\n refreshToken?: string\n ): Promise<void> {\n await this.catalog.setTokens(accessToken, refreshToken);\n await this.cart.setTokens(accessToken, refreshToken);\n await this.auth.setTokens(accessToken, refreshToken);\n await this.customer.setTokens(accessToken, refreshToken);\n await this.helpers.setTokens(accessToken, refreshToken);\n await this.shipping.setTokens(accessToken, refreshToken);\n await this.order.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Clear all authentication tokens from all clients\n *\n * Behavior:\n * - If tokenStorage is provided: Clears both access and refresh tokens from storage\n * - If tokenStorage is not provided: Clears the manual access token\n */\n public async clearTokens(): Promise<void> {\n await this.catalog.clearTokens();\n await this.cart.clearTokens();\n await this.auth.clearTokens();\n await this.customer.clearTokens();\n await this.helpers.clearTokens();\n await this.shipping.clearTokens();\n await this.order.clearTokens();\n }\n\n /**\n * Set the API key for all clients\n *\n * @param apiKey - The API key to set\n */\n public setApiKey(apiKey: string): void {\n this.catalog.setApiKey(apiKey);\n this.cart.setApiKey(apiKey);\n this.auth.setApiKey(apiKey);\n this.customer.setApiKey(apiKey);\n this.helpers.setApiKey(apiKey);\n this.shipping.setApiKey(apiKey);\n this.order.setApiKey(apiKey);\n }\n\n /**\n * Clear the API key from all clients\n */\n public clearApiKey(): void {\n this.catalog.clearApiKey();\n this.cart.clearApiKey();\n this.auth.clearApiKey();\n this.customer.clearApiKey();\n this.helpers.clearApiKey();\n this.shipping.clearApiKey();\n this.order.clearApiKey();\n }\n\n /**\n * Get the current access token if using token storage\n */\n public async getAccessToken(): Promise<string | null> {\n return await this.auth\n .getAuthorizationHeader()\n .then((header) =>\n header.startsWith(\"Bearer \") ? header.substring(7) : null\n );\n }\n\n /**\n * Get user information from the current access token\n *\n * @returns User information extracted from JWT token, or null if no token or invalid token\n */\n public async getUserInfo(): Promise<UserInfo | null> {\n const token = await this.getAccessToken();\n if (!token) return null;\n return extractUserInfoFromToken(token);\n }\n\n /**\n * Get the current user ID from the access token\n *\n * @returns User ID (ulid) or null if no token or invalid token\n */\n public async getUserId(): Promise<string | null> {\n const token = await this.getAccessToken();\n if (!token) return null;\n return getUserIdFromToken(token);\n }\n\n /**\n * Check if the current user is logged in (not anonymous)\n *\n * @returns True if user is logged in, false if anonymous or no token\n */\n public async isLoggedIn(): Promise<boolean> {\n const token = await this.getAccessToken();\n if (!token) return false;\n return isUserLoggedIn(token);\n }\n\n /**\n * Check if the current user is anonymous\n *\n * @returns True if user is anonymous or no token, false if logged in\n */\n public async isAnonymous(): Promise<boolean> {\n const token = await this.getAccessToken();\n if (!token) return true;\n return isUserAnonymous(token);\n }\n\n /**\n * Get the customer ID from the current access token\n *\n * @returns Customer ID or null if no token, invalid token, or user has no customer ID\n */\n public async getCustomerId(): Promise<string | null> {\n const userInfo = await this.getUserInfo();\n return userInfo?.customerId || null;\n }\n\n /**\n * Get the customer group ID from the current access token\n *\n * @returns Customer group ID or null if no token, invalid token, or user has no customer group\n */\n public async getCustomerGroupId(): Promise<string | null> {\n const userInfo = await this.getUserInfo();\n return userInfo?.customerGroupId || null;\n }\n\n /**\n * Set default headers for all clients\n *\n * @param headers - Default headers to set (only supported headers allowed)\n */\n public setDefaultHeaders(headers: SupportedDefaultHeaders): void {\n // Update config for all clients\n const newConfig = { ...this.catalog[\"config\"], defaultHeaders: headers };\n\n this.catalog[\"config\"] = newConfig;\n this.cart[\"config\"] = newConfig;\n this.auth[\"config\"] = newConfig;\n this.customer[\"config\"] = newConfig;\n this.helpers[\"config\"] = newConfig;\n this.shipping[\"config\"] = newConfig;\n this.order[\"config\"] = newConfig;\n }\n\n /**\n * Get current default headers\n *\n * @returns Current default headers\n */\n public getDefaultHeaders(): SupportedDefaultHeaders | undefined {\n return this.catalog[\"config\"].defaultHeaders;\n }\n}\n\n// Export the main SDK class\nexport default StorefrontSDK;\n\n// Export individual clients for advanced usage\nexport {\n StorefrontAPIClient,\n AuthClient,\n CartClient,\n CatalogClient,\n CustomerClient,\n HelpersClient,\n ShippingClient,\n OrderClient,\n ResponseUtils,\n};\n// Export environment enum\nexport { Environment };\n// Export token storage types\nexport {\n TokenStorage,\n MemoryTokenStorage,\n BrowserTokenStorage,\n CookieTokenStorage,\n};\n\n// Export token storage options\nexport type { CookieTokenStorageOptions } from \"./lib/middleware\";\n\n// Export JWT types that are used in public API\nexport type { UserInfo } from \"./lib/jwt-utils\";\n\n// Export logger types that are used in public API\nexport type { DebugLoggerFn } from \"./lib/logger-utils\";\n\n// Export API types for consumer usage\nexport type { components, operations, paths } from \"./types/storefront\";\n\nexport type * from \"./types/storefront-api-types\";\n","// settings & const\nconst PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nconst supportsRequestInitExt = () => {\n return (\n typeof process === \"object\" &&\n Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 &&\n process.versions.undici\n );\n};\n\n/**\n * Returns a cheap, non-cryptographically-secure random ID\n * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya)\n */\nexport function randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\n\n/**\n * Create an openapi-fetch client.\n * @type {import(\"./index.js\").default}\n */\nexport default function createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = undefined,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : undefined;\n baseUrl = removeTrailingSlash(baseUrl);\n const middlewares = [];\n\n /**\n * Per-request fetch (keeps settings created in createClient()\n * @param {T} url\n * @param {import('./index.js').FetchOptions<T>} fetchOptions\n */\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n ...init\n } = fetchOptions || {};\n let finalBaseUrl = baseUrl;\n if (localBaseUrl) {\n finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;\n }\n\n let querySerializer =\n typeof globalQuerySerializer === \"function\"\n ? globalQuerySerializer\n : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer =\n typeof requestQuerySerializer === \"function\"\n ? requestQuerySerializer\n : createQuerySerializer({\n ...(typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {}),\n ...requestQuerySerializer,\n });\n }\n\n const serializedBody =\n body === undefined\n ? undefined\n : bodySerializer(\n body,\n // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:\n // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,\n // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,\n // setting the content-type at the very beginning to be overwritten.\n // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.\n mergeHeaders(baseHeaders, headers, params.header),\n );\n const finalHeaders = mergeHeaders(\n // with no body, we should not to set Content-Type\n serializedBody === undefined ||\n // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData\n ? {}\n : {\n \"Content-Type\": \"application/json\",\n },\n baseHeaders,\n headers,\n params.header,\n );\n\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: finalHeaders,\n };\n\n let id;\n let options;\n let request = new CustomRequest(\n createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),\n requestInit,\n );\n let response;\n\n /** Add custom parameters to Request object */\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n\n if (middlewares.length) {\n id = randomID();\n\n // middleware (request)\n options = Object.freeze({\n baseUrl: finalBaseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer,\n });\n for (const m of middlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (result instanceof CustomRequest) {\n request = result;\n } else if (result instanceof Response) {\n response = result;\n break;\n } else {\n throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n }\n }\n }\n }\n }\n\n if (!response) {\n // fetch!\n try {\n response = await fetch(request, requestInitExt);\n } catch (error) {\n let errorAfterMiddleware = error;\n // middleware (error)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n // if error is handled by returning a response, skip remaining middleware\n if (result instanceof Response) {\n errorAfterMiddleware = undefined;\n response = result;\n break;\n }\n\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n\n // rethrow error if not handled by middleware\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n\n // middleware (response)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n }\n\n // handle empty content\n if (response.status === 204 || request.method === \"HEAD\" || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: undefined, response } : { error: undefined, response };\n }\n\n // parse response (falling back to .text() when necessary)\n if (response.ok) {\n // if \"stream\", skip parsing entirely\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n\n // handle errors\n let error = await response.text();\n try {\n error = JSON.parse(error); // attempt to parse as JSON\n } catch {\n // noop\n }\n return { error, response };\n }\n\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n middlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = middlewares.indexOf(m);\n if (i !== -1) {\n middlewares.splice(i, 1);\n }\n }\n },\n };\n}\n\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n\n GET = (init) => {\n return this.client.GET(this.url, init);\n };\n PUT = (init) => {\n return this.client.PUT(this.url, init);\n };\n POST = (init) => {\n return this.client.POST(this.url, init);\n };\n DELETE = (init) => {\n return this.client.DELETE(this.url, init);\n };\n OPTIONS = (init) => {\n return this.client.OPTIONS(this.url, init);\n };\n HEAD = (init) => {\n return this.client.HEAD(this.url, init);\n };\n PATCH = (init) => {\n return this.client.PATCH(this.url, init);\n };\n TRACE = (init) => {\n return this.client.TRACE(this.url, init);\n };\n}\n\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\n\n/**\n * Wrap openapi-fetch client to support a path based API.\n * @type {import(\"./index.js\").wrapAsPathBasedClient}\n */\nexport function wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n\n // Put the proxy on the prototype chain of the actual client.\n // This means if we do not have a memoized PathCallForwarder,\n // we fall back to the proxy to synthesize it.\n // However, the proxy itself is not on the hot-path (if we fetch the same\n // endpoint multiple times, only the first call will hit the proxy).\n function Client() {}\n Client.prototype = proxy;\n\n const client = new Client();\n\n // Feed the client back to the proxy handler so it can store the generated\n // PathCallForwarder.\n handler.client = client;\n\n return client;\n}\n\n/**\n * Convenience method to an openapi-fetch path based client.\n * Strictly equivalent to `wrapAsPathBasedClient(createClient(...))`.\n * @type {import(\"./index.js\").createPathBasedClient}\n */\nexport function createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\n\n// utils\n\n/**\n * Serialize primitive param values\n * @type {import(\"./index.js\").serializePrimitiveParam}\n */\nexport function serializePrimitiveParam(name, value, options) {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\n\n/**\n * Serialize object param (shallow only)\n * @type {import(\"./index.js\").serializeObjectParam}\n */\nexport function serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner =\n {\n simple: \",\",\n label: \".\",\n matrix: \";\",\n }[options.style] || \"&\";\n\n // explode: false\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final = values.join(\",\"); // note: values are always joined by comma in explode: false (but joiner can prefix)\n switch (options.style) {\n case \"form\": {\n return `${name}=${final}`;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n default: {\n return final;\n }\n }\n }\n\n // explode: true\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\n\n/**\n * Serialize array param (shallow only)\n * @type {import(\"./index.js\").serializeArrayParam}\n */\nexport function serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n // explode: false\n if (options.explode === false) {\n const joiner = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\"; // note: for arrays, joiners vary wildly based on style + explode behavior\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n\n // explode: true\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\"\n ? `${joiner}${values.join(joiner)}`\n : values.join(joiner);\n}\n\n/**\n * Serialize query params to string\n * @type {import(\"./index.js\").createQuerySerializer}\n */\nexport function createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\n\n/**\n * Handle different OpenAPI 3.x serialization styles\n * @type {import(\"./index.js\").defaultPathSerializer}\n * @see https://swagger.io/docs/specification/serialization/#path\n */\nexport function defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === undefined || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\n\n/**\n * Serialize body object to string\n * @type {import(\"./index.js\").defaultBodySerializer}\n */\nexport function defaultBodySerializer(body, headers) {\n if (body instanceof FormData) {\n return body;\n }\n if (headers) {\n const contentType =\n headers.get instanceof Function\n ? (headers.get(\"Content-Type\") ?? headers.get(\"content-type\"))\n : (headers[\"Content-Type\"] ?? headers[\"content-type\"]);\n if (contentType === \"application/x-www-form-urlencoded\") {\n return new URLSearchParams(body).toString();\n }\n }\n return JSON.stringify(body);\n}\n\n/**\n * Construct URL string from baseUrl and handle path and query params\n * @type {import(\"./index.js\").createFinalURL}\n */\nexport function createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\n\n/**\n * Merge headers a and b, with b taking priority\n * @type {import(\"./index.js\").mergeHeaders}\n */\nexport function mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== undefined) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\n\n/**\n * Remove trailing slash from url\n * @type {import(\"./index.js\").removeTrailingSlash}\n */\nexport function removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n","export const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\n","export function encodeBase64(input) {\n if (Uint8Array.prototype.toBase64) {\n return input.toBase64();\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < input.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n}\nexport function decodeBase64(encoded) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(encoded);\n }\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nexport function decode(input) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(typeof input === 'string' ? input : decoder.decode(input), {\n alphabet: 'base64url',\n });\n }\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n}\nexport function encode(input) {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n if (Uint8Array.prototype.toBase64) {\n return unencoded.toBase64({ alphabet: 'base64url', omitPadding: true });\n }\n return encodeBase64(unencoded).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","export class JOSEError extends Error {\n static code = 'ERR_JOSE_GENERIC';\n code = 'ERR_JOSE_GENERIC';\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class JWTClaimValidationFailed extends JOSEError {\n static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JWTExpired extends JOSEError {\n static code = 'ERR_JWT_EXPIRED';\n code = 'ERR_JWT_EXPIRED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JOSEAlgNotAllowed extends JOSEError {\n static code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n}\nexport class JOSENotSupported extends JOSEError {\n static code = 'ERR_JOSE_NOT_SUPPORTED';\n code = 'ERR_JOSE_NOT_SUPPORTED';\n}\nexport class JWEDecryptionFailed extends JOSEError {\n static code = 'ERR_JWE_DECRYPTION_FAILED';\n code = 'ERR_JWE_DECRYPTION_FAILED';\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n }\n}\nexport class JWEInvalid extends JOSEError {\n static code = 'ERR_JWE_INVALID';\n code = 'ERR_JWE_INVALID';\n}\nexport class JWSInvalid extends JOSEError {\n static code = 'ERR_JWS_INVALID';\n code = 'ERR_JWS_INVALID';\n}\nexport class JWTInvalid extends JOSEError {\n static code = 'ERR_JWT_INVALID';\n code = 'ERR_JWT_INVALID';\n}\nexport class JWKInvalid extends JOSEError {\n static code = 'ERR_JWK_INVALID';\n code = 'ERR_JWK_INVALID';\n}\nexport class JWKSInvalid extends JOSEError {\n static code = 'ERR_JWKS_INVALID';\n code = 'ERR_JWKS_INVALID';\n}\nexport class JWKSNoMatchingKey extends JOSEError {\n static code = 'ERR_JWKS_NO_MATCHING_KEY';\n code = 'ERR_JWKS_NO_MATCHING_KEY';\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n [Symbol.asyncIterator];\n static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSTimeout extends JOSEError {\n static code = 'ERR_JWKS_TIMEOUT';\n code = 'ERR_JWKS_TIMEOUT';\n constructor(message = 'request timed out', options) {\n super(message, options);\n }\n}\nexport class JWSSignatureVerificationFailed extends JOSEError {\n static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n }\n}\n","function isObjectLike(value) {\n return typeof value === 'object' && value !== null;\n}\nexport default (input) => {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n};\n","import { decode as b64u } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport isObject from '../lib/is_object.js';\nimport { JWTInvalid } from './errors.js';\nexport function decodeJwt(jwt) {\n if (typeof jwt !== 'string')\n throw new JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n const { 1: payload, length } = jwt.split('.');\n if (length === 5)\n throw new JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n if (length !== 3)\n throw new JWTInvalid('Invalid JWT');\n if (!payload)\n throw new JWTInvalid('JWTs must contain a payload');\n let decoded;\n try {\n decoded = b64u(payload);\n }\n catch {\n throw new JWTInvalid('Failed to base64url decode the payload');\n }\n let result;\n try {\n result = JSON.parse(decoder.decode(decoded));\n }\n catch {\n throw new JWTInvalid('Failed to parse the decoded payload as JSON');\n }\n if (!isObject(result))\n throw new JWTInvalid('Invalid JWT Claims Set');\n return result;\n}\n","import { decodeJwt } from \"jose\";\n\n/**\n * JWT payload structure for storefront tokens\n */\nexport interface JwtPayload {\n token_type: string;\n exp: number;\n iat: number;\n jti: string;\n ulid: string;\n email: string | null;\n phone: string | null;\n username: string;\n first_name: string | null;\n last_name: string | null;\n store_id: string;\n is_logged_in: boolean;\n customer_id: string | null;\n customer_group_id: string | null;\n anonymous_id: string;\n}\n\n/**\n * User information extracted from JWT token\n */\nexport interface UserInfo {\n id: string;\n email: string | null;\n phone: string | null;\n username: string;\n firstName: string | null;\n lastName: string | null;\n storeId: string;\n isLoggedIn: boolean;\n isAnonymous: boolean;\n customerId: string | null;\n customerGroupId: string | null;\n anonymousId: string;\n tokenExpiry: Date;\n tokenIssuedAt: Date;\n}\n\n/**\n * Decode and extract user information from a JWT token\n * \n * @param token - The JWT token to decode\n * @returns User information or null if token is invalid\n */\nexport function extractUserInfoFromToken(token: string): UserInfo | null {\n try {\n const payload = decodeJwt(token) as JwtPayload;\n \n return {\n id: payload.ulid,\n email: payload.email,\n phone: payload.phone,\n username: payload.username,\n firstName: payload.first_name,\n lastName: payload.last_name,\n storeId: payload.store_id,\n isLoggedIn: payload.is_logged_in,\n isAnonymous: !payload.is_logged_in,\n customerId: payload.customer_id,\n customerGroupId: payload.customer_group_id,\n anonymousId: payload.anonymous_id,\n tokenExpiry: new Date(payload.exp * 1000),\n tokenIssuedAt: new Date(payload.iat * 1000),\n };\n } catch (error) {\n console.warn(\"Failed to decode JWT token:\", error);\n return null;\n }\n}\n\n/**\n * Check if a JWT token is expired\n * \n * @param token - The JWT token to check\n * @param bufferSeconds - Buffer time in seconds (default: 30)\n * @returns True if token is expired or will expire within buffer time\n */\nexport function isTokenExpired(token: string, bufferSeconds: number = 30): boolean {\n try {\n const payload = decodeJwt(token);\n if (!payload.exp) return true;\n\n const currentTime = Math.floor(Date.now() / 1000);\n const expiryTime = payload.exp;\n \n // Consider token expired if it expires within the buffer time\n return currentTime >= (expiryTime - bufferSeconds);\n } catch (error) {\n console.warn(\"Failed to decode JWT token:\", error);\n return true; // Treat invalid tokens as expired\n }\n}\n\n/**\n * Get the user ID from a JWT token\n * \n * @param token - The JWT token\n * @returns User ID (ulid) or null if token is invalid\n */\nexport function getUserIdFromToken(token: string): string | null {\n const userInfo = extractUserInfoFromToken(token);\n return userInfo?.id || null;\n}\n\n/**\n * Check if user is logged in based on JWT token\n * \n * @param token - The JWT token\n * @returns True if user is logged in, false otherwise\n */\nexport function isUserLoggedIn(token: string): boolean {\n const userInfo = extractUserInfoFromToken(token);\n return userInfo?.isLoggedIn || false;\n}\n\n/**\n * Check if user is anonymous based on JWT token\n * \n * @param token - The JWT token\n * @returns True if user is anonymous, false otherwise\n */\nexport function isUserAnonymous(token: string): boolean {\n const userInfo = extractUserInfoFromToken(token);\n return userInfo?.isAnonymous || true;\n} ","/**\n * Extract pathname from URL\n */\nexport function getPathnameFromUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.pathname;\n } catch {\n // If URL parsing fails, assume it's a relative path\n return url.split('?')[0];\n }\n}\n\n/**\n * Check if a URL path is an auth endpoint that should use API key\n */\nexport function isAnonymousAuthEndpoint(pathname: string): boolean {\n return pathname.endsWith(\"/auth/anonymous\");\n}\n\n/**\n * Check if a URL path is a login/register endpoint that returns tokens\n */\nexport function isTokenReturningEndpoint(pathname: string): boolean {\n const tokenEndpoints = [\n \"/auth/login/password\",\n \"/auth/register/phone\",\n \"/auth/register/email\",\n \"/auth/verify-otp\",\n \"/auth/refresh-token\"\n ];\n return tokenEndpoints.some(endpoint => pathname.endsWith(endpoint));\n}\n\n/**\n * Check if a URL path is the logout endpoint\n */\nexport function isLogoutEndpoint(pathname: string): boolean {\n return pathname.endsWith(\"/auth/logout\");\n} ","import type { Middleware } from \"openapi-fetch\";\nimport { isTokenExpired } from \"./jwt-utils\";\nimport {\n getPathnameFromUrl,\n isAnonymousAuthEndpoint,\n isTokenReturningEndpoint,\n isLogoutEndpoint,\n} from \"./auth-utils\";\n\n/**\n * Token storage interface for the auth middleware\n */\nexport interface TokenStorage {\n getAccessToken(): Promise<string | null>;\n setAccessToken(token: string): Promise<void>;\n getRefreshToken(): Promise<string | null>;\n setRefreshToken(token: string): Promise<void>;\n clearTokens(): Promise<void>;\n}\n\n/**\n * Simple in-memory token storage implementation\n */\nexport class MemoryTokenStorage implements TokenStorage {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n\n async getAccessToken(): Promise<string | null> {\n return this.accessToken;\n }\n\n async setAccessToken(token: string): Promise<void> {\n this.accessToken = token;\n }\n\n async getRefreshToken(): Promise<string | null> {\n return this.refreshToken;\n }\n\n async setRefreshToken(token: string): Promise<void> {\n this.refreshToken = token;\n }\n\n async clearTokens(): Promise<void> {\n this.accessToken = null;\n this.refreshToken = null;\n }\n}\n\n/**\n * Browser localStorage token storage implementation\n */\nexport class BrowserTokenStorage implements TokenStorage {\n private accessTokenKey: string;\n private refreshTokenKey: string;\n\n constructor(prefix: string = \"storefront_\") {\n this.accessTokenKey = `${prefix}access_token`;\n this.refreshTokenKey = `${prefix}refresh_token`;\n }\n\n async getAccessToken(): Promise<string | null> {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(this.accessTokenKey);\n }\n\n async setAccessToken(token: string): Promise<void> {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(this.accessTokenKey, token);\n }\n }\n\n async getRefreshToken(): Promise<string | null> {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage.getItem(this.refreshTokenKey);\n }\n\n async setRefreshToken(token: string): Promise<void> {\n if (typeof localStorage !== \"undefined\") {\n localStorage.setItem(this.refreshTokenKey, token);\n }\n }\n\n async clearTokens(): Promise<void> {\n if (typeof localStorage !== \"undefined\") {\n localStorage.removeItem(this.accessTokenKey);\n localStorage.removeItem(this.refreshTokenKey);\n }\n }\n}\n\n/**\n * Cookie-based token storage implementation\n */\nexport class CookieTokenStorage implements TokenStorage {\n private accessTokenKey: string;\n private refreshTokenKey: string;\n private options: CookieOptions;\n\n constructor(options: CookieTokenStorageOptions = {}) {\n const prefix = options.prefix || \"storefront_\";\n this.accessTokenKey = `${prefix}access_token`;\n this.refreshTokenKey = `${prefix}refresh_token`;\n\n this.options = {\n maxAge: options.maxAge || 7 * 24 * 60 * 60, // 7 days default\n path: options.path || \"/\",\n domain: options.domain,\n secure:\n options.secure ??\n (typeof window !== \"undefined\" &&\n window.location?.protocol === \"https:\"),\n sameSite: options.sameSite || \"Lax\",\n httpOnly: false, // Must be false for client-side access\n };\n }\n\n async getAccessToken(): Promise<string | null> {\n return this.getCookie(this.accessTokenKey);\n }\n\n async setAccessToken(token: string): Promise<void> {\n this.setCookie(this.accessTokenKey, token);\n }\n\n async getRefreshToken(): Promise<string | null> {\n return this.getCookie(this.refreshTokenKey);\n }\n\n async setRefreshToken(token: string): Promise<void> {\n this.setCookie(this.refreshTokenKey, token);\n }\n\n async clearTokens(): Promise<void> {\n this.deleteCookie(this.accessTokenKey);\n this.deleteCookie(this.refreshTokenKey);\n }\n\n private getCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n\n if (parts.length === 2) {\n const cookieValue = parts.pop()?.split(\";\").shift();\n return cookieValue ? decodeURIComponent(cookieValue) : null;\n }\n\n return null;\n }\n\n private setCookie(name: string, value: string): void {\n if (typeof document === \"undefined\") return;\n\n const encodedValue = encodeURIComponent(value);\n let cookieString = `${name}=${encodedValue}`;\n\n if (this.options.maxAge) {\n cookieString += `; Max-Age=${this.options.maxAge}`;\n }\n\n if (this.options.path) {\n cookieString += `; Path=${this.options.path}`;\n }\n\n if (this.options.domain) {\n cookieString += `; Domain=${this.options.domain}`;\n }\n\n if (this.options.secure) {\n cookieString += `; Secure`;\n }\n\n if (this.options.sameSite) {\n cookieString += `; SameSite=${this.options.sameSite}`;\n }\n\n document.cookie = cookieString;\n }\n\n private deleteCookie(name: string): void {\n if (typeof document === \"undefined\") return;\n\n let cookieString = `${name}=; Max-Age=0`;\n\n if (this.options.path) {\n cookieString += `; Path=${this.options.path}`;\n }\n\n if (this.options.domain) {\n cookieString += `; Domain=${this.options.domain}`;\n }\n\n document.cookie = cookieString;\n }\n}\n\n/**\n * Configuration options for CookieTokenStorage\n */\nexport interface CookieTokenStorageOptions {\n /**\n * Prefix for cookie names (default: \"storefront_\")\n */\n prefix?: string;\n\n /**\n * Maximum age of cookies in seconds (default: 7 days)\n */\n maxAge?: number;\n\n /**\n * Cookie path (default: \"/\")\n */\n path?: string;\n\n /**\n * Cookie domain (default: current domain)\n */\n domain?: string;\n\n /**\n * Whether cookies should be secure (default: auto-detect based on protocol)\n */\n secure?: boolean;\n\n /**\n * SameSite cookie attribute (default: \"Lax\")\n */\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n}\n\n/**\n * Internal cookie options interface\n */\ninterface CookieOptions {\n maxAge?: number;\n path?: string;\n domain?: string;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n httpOnly?: boolean;\n}\n\n/**\n * Configuration for the auth middleware\n */\nexport interface AuthMiddlewareConfig {\n /**\n * Token storage implementation\n */\n tokenStorage: TokenStorage;\n\n /**\n * API key for anonymous endpoints\n */\n apiKey?: string;\n\n /**\n * Base URL for the API (used for refresh token endpoint)\n */\n baseUrl: string;\n\n /**\n * Function to refresh tokens\n * Should make a call to /auth/refresh-token endpoint\n */\n refreshTokenFn?: (refreshToken: string) => Promise<{\n access_token: string;\n refresh_token: string;\n }>;\n\n /**\n * Callback when tokens are updated (login/refresh)\n */\n onTokensUpdated?: (accessToken: string, refreshToken: string) => void;\n\n /**\n * Callback when tokens are cleared (logout/error)\n */\n onTokensCleared?: () => void;\n}\n\n/**\n * Create authentication middleware for openapi-fetch\n */\nexport function createAuthMiddleware(config: AuthMiddlewareConfig): Middleware {\n let isRefreshing = false;\n let refreshPromise: Promise<void> | null = null;\n\n const refreshTokens = async (): Promise<void> => {\n if (isRefreshing && refreshPromise) {\n return refreshPromise;\n }\n\n isRefreshing = true;\n refreshPromise = (async () => {\n try {\n const refreshToken = await config.tokenStorage.getRefreshToken();\n let newTokens: { access_token: string; refresh_token: string };\n\n if (refreshToken && !isTokenExpired(refreshToken)) {\n // Try normal refresh token flow first (only if refresh token is not expired)\n if (config.refreshTokenFn) {\n // Use provided refresh function\n newTokens = await config.refreshTokenFn(refreshToken);\n } else {\n // Default refresh implementation\n const response = await fetch(\n `${config.baseUrl}/auth/refresh-token`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ refresh_token: refreshToken }),\n }\n );\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const data = await response.json();\n newTokens = data.content;\n }\n } else {\n // No refresh token available OR refresh token is expired - try anonymous token fallback\n // This handles cases where:\n // 1. SDK was initialized with just an access token\n // 2. Refresh token has expired\n const currentAccessToken = await config.tokenStorage.getAccessToken();\n\n if (!currentAccessToken) {\n throw new Error(\"No tokens available for refresh\");\n }\n\n const reason = refreshToken\n ? \"refresh token expired\"\n : \"no refresh token available\";\n\n // Get new anonymous tokens while preserving user_id\n const response = await fetch(`${config.baseUrl}/auth/anonymous`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(config.apiKey && { \"X-Api-Key\": config.apiKey }),\n Authorization: `Bearer ${currentAccessToken}`, // For user_id continuity\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Anonymous token fallback failed: ${response.status}`\n );\n }\n\n const data = await response.json();\n newTokens = data.content;\n\n console.info(\n `Token refreshed via anonymous fallback (${reason}) - user may need to re-authenticate for privileged operations`\n );\n }\n\n // Store new tokens\n await config.tokenStorage.setAccessToken(newTokens.access_token);\n await config.tokenStorage.setRefreshToken(newTokens.refresh_token);\n\n // Notify callback\n config.onTokensUpdated?.(\n newTokens.access_token,\n newTokens.refresh_token\n );\n } catch (error) {\n console.error(\"Token refresh failed:\", error);\n // Clear tokens on refresh failure\n await config.tokenStorage.clearTokens();\n config.onTokensCleared?.();\n throw error;\n } finally {\n isRefreshing = false;\n refreshPromise = null;\n }\n })();\n\n return refreshPromise;\n };\n\n return {\n async onRequest({ request }) {\n const pathname = getPathnameFromUrl(request.url);\n\n // Handle anonymous auth endpoint - use API key\n if (isAnonymousAuthEndpoint(pathname)) {\n if (config.apiKey) {\n request.headers.set(\"X-Api-Key\", config.apiKey);\n }\n\n // Also send existing access token if available (even if expired)\n // This helps the server maintain anonymous user continuity\n const existingToken = await config.tokenStorage.getAccessToken();\n if (existingToken) {\n request.headers.set(\"Authorization\", `Bearer ${existingToken}`);\n }\n\n return request;\n }\n\n // For all other endpoints, use access token\n let accessToken = await config.tokenStorage.getAccessToken();\n\n // Check if token needs refresh\n if (accessToken && isTokenExpired(accessToken)) {\n try {\n await refreshTokens();\n accessToken = await config.tokenStorage.getAccessToken();\n } catch (error) {\n // If refresh fails, continue with expired token\n // The server will return 401 and we'll handle it in onResponse\n }\n }\n\n // Add Authorization header if we have a token\n if (accessToken) {\n request.headers.set(\"Authorization\", `Bearer ${accessToken}`);\n }\n\n return request;\n },\n\n async onResponse({ request, response }) {\n const pathname = getPathnameFromUrl(request.url);\n\n // Handle successful responses that return tokens\n if (response.ok) {\n if (\n isTokenReturningEndpoint(pathname) ||\n isAnonymousAuthEndpoint(pathname)\n ) {\n try {\n const data = await response.clone().json();\n const content = data.content;\n\n if (content?.access_token && content?.refresh_token) {\n await config.tokenStorage.setAccessToken(content.access_token);\n await config.tokenStorage.setRefreshToken(content.refresh_token);\n config.onTokensUpdated?.(\n content.access_token,\n content.refresh_token\n );\n }\n } catch (error) {\n console.warn(\"Failed to extract tokens from response:\", error);\n }\n } else if (isLogoutEndpoint(pathname)) {\n // Clear tokens on successful logout\n await config.tokenStorage.clearTokens();\n config.onTokensCleared?.();\n }\n }\n\n // Handle 401 responses - only retry if token was expired\n if (response.status === 401 && !isAnonymousAuthEndpoint(pathname)) {\n const currentToken = await config.tokenStorage.getAccessToken();\n\n // Only attempt refresh if we have a token and it's expired\n // This prevents infinite retries for privilege-related 401s\n if (currentToken && isTokenExpired(currentToken, 0)) {\n try {\n await refreshTokens();\n\n // Retry the original request with new token\n const newToken = await config.tokenStorage.getAccessToken();\n if (newToken) {\n const retryRequest = request.clone();\n retryRequest.headers.set(\"Authorization\", `Bearer ${newToken}`);\n return fetch(retryRequest);\n }\n } catch (error) {\n // If refresh fails, let the original 401 response through\n console.warn(\"Token refresh failed on 401 response:\", error);\n }\n }\n }\n\n return response;\n },\n };\n}\n\n/**\n * Helper function to create auth middleware with sensible defaults\n */\nexport function createDefaultAuthMiddleware(options: {\n apiKey?: string;\n baseUrl: string;\n tokenStorage?: TokenStorage;\n onTokensUpdated?: (accessToken: string, refreshToken: string) => void;\n onTokensCleared?: () => void;\n}): Middleware {\n const tokenStorage =\n options.tokenStorage ||\n (typeof localStorage !== \"undefined\"\n ? new BrowserTokenStorage()\n : new MemoryTokenStorage());\n\n return createAuthMiddleware({\n tokenStorage,\n apiKey: options.apiKey,\n baseUrl: options.baseUrl,\n onTokensUpdated: options.onTokensUpdated,\n onTokensCleared: options.onTokensCleared,\n });\n}\n","import type { Middleware } from \"openapi-fetch\";\n\n/**\n * Debug logger function interface\n */\nexport interface DebugLoggerFn {\n (level: \"info\" | \"warn\" | \"error\", message: string, data?: any): void;\n}\n\n/**\n * Response utilities for debugging and working with Response objects\n */\nexport class ResponseUtils {\n /**\n * Get response headers as a plain object\n */\n static getHeaders(response: Response): Record<string, string> {\n return Object.fromEntries(response.headers.entries());\n }\n\n /**\n * Get specific header value\n */\n static getHeader(response: Response, name: string): string | null {\n return response.headers.get(name);\n }\n\n /**\n * Check if response was successful\n */\n static isSuccess(response: Response): boolean {\n return response.ok;\n }\n\n /**\n * Get response metadata\n */\n static getMetadata(response: Response) {\n return {\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n url: response.url,\n redirected: response.redirected,\n type: response.type,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n /**\n * Clone and read response as text (useful for debugging)\n * Note: This can only be called once per response\n */\n static async getText(response: Response): Promise<string> {\n const cloned = response.clone();\n return await cloned.text();\n }\n\n /**\n * Clone and read response as JSON (useful for debugging)\n * Note: This can only be called once per response\n */\n static async getJSON(response: Response): Promise<any> {\n const cloned = response.clone();\n return await cloned.json();\n }\n\n /**\n * Format response information for debugging\n */\n static format(response: Response): string {\n const metadata = this.getMetadata(response);\n return `${metadata.status} ${metadata.statusText} - ${metadata.url}`;\n }\n}\n\n/**\n * Debug logging utilities\n */\nexport class DebugLogger {\n private logger: DebugLoggerFn;\n private responseTextCache: Map<string, string> = new Map();\n\n constructor(logger?: DebugLoggerFn) {\n this.logger =\n logger ||\n ((level, message, data) => {\n console.log(`[${level.toUpperCase()}]`, message);\n if (data) console.log(data);\n });\n }\n\n /**\n * Log debug information about API request\n */\n logRequest(request: Request, requestBody?: any): void {\n this.logger(\"info\", \"API Request Debug Info\", {\n method: request.method,\n url: request.url,\n headers: Object.fromEntries(request.headers.entries()),\n body: requestBody,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Log debug information about API response\n */\n async logResponse(response: Response, responseBody?: any): Promise<void> {\n // Cache response text for later use by ResponseUtils\n if (responseBody && typeof responseBody === \"string\") {\n this.responseTextCache.set(response.url, responseBody);\n }\n\n // Log response metadata\n this.logger(\"info\", \"API Response Debug Info\", {\n url: response.url,\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n headers: Object.fromEntries(response.headers.entries()),\n redirected: response.redirected,\n type: response.type,\n timestamp: new Date().toISOString(),\n });\n\n // Log response body if available\n if (responseBody) {\n this.logger(\"info\", \"API Response Data\", {\n data: responseBody,\n contentType: response.headers.get(\"content-type\"),\n contentLength: response.headers.get(\"content-length\"),\n });\n }\n }\n\n /**\n * Log error information\n */\n logError(message: string, error: any): void {\n this.logger(\"error\", message, error);\n }\n\n /**\n * Get cached response text for a URL (if available)\n */\n getCachedResponseText(url: string): string | null {\n return this.responseTextCache.get(url) || null;\n }\n\n /**\n * Clear cached response texts\n */\n clearCache(): void {\n this.responseTextCache.clear();\n }\n}\n\n/**\n * Extract request body for logging\n */\nexport async function extractRequestBody(request: Request): Promise<any> {\n if (request.method === \"GET\" || request.method === \"HEAD\") {\n return null;\n }\n\n try {\n const clonedRequest = request.clone();\n const contentType = request.headers.get(\"content-type\")?.toLowerCase();\n\n if (contentType?.startsWith(\"application/json\")) {\n return await clonedRequest.json();\n } else if (contentType?.startsWith(\"multipart/form-data\")) {\n return \"[FormData - cannot display]\";\n } else if (contentType?.startsWith(\"text/\")) {\n return await clonedRequest.text();\n }\n\n return \"[Request body - unknown format]\";\n } catch (error) {\n return \"[Request body unavailable]\";\n }\n}\n\n/**\n * Create debug middleware for openapi-fetch (internal use)\n */\nexport function createDebugMiddleware(logger?: DebugLoggerFn): Middleware {\n const debugLogger = new DebugLogger(logger);\n\n return {\n async onRequest({ request }) {\n // Log request information\n const requestBody = await extractRequestBody(request);\n debugLogger.logRequest(request, requestBody);\n return request;\n },\n\n async onResponse({ response }) {\n // Clone response to read body without consuming it\n const cloned = response.clone();\n let responseBody: any = null;\n\n try {\n const contentType = response.headers.get(\"content-type\")?.toLowerCase();\n if (contentType?.startsWith(\"application/json\")) {\n responseBody = await cloned.json();\n } else if (contentType?.startsWith(\"text/\")) {\n responseBody = await cloned.text();\n }\n } catch (error) {\n // Ignore body reading errors\n }\n\n // Log response information\n await debugLogger.logResponse(response, responseBody);\n return response;\n },\n\n async onError({ error, request }) {\n // Log error information with request context\n debugLogger.logError(\"API Request Failed\", {\n error: {\n name: error instanceof Error ? error.name : \"Unknown\",\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n },\n request: {\n method: request.method,\n url: request.url,\n headers: Object.fromEntries(request.headers.entries()),\n },\n timestamp: new Date().toISOString(),\n });\n\n // Re-throw the error to maintain normal error handling\n throw error;\n },\n };\n}\n","import type { SupportedDefaultHeaders } from \"../index\";\n\n/**\n * Mapping of SDK header parameter names to actual HTTP header names\n * Only include headers that need transformation - others pass through as-is\n */\nconst HEADER_TRANSFORMATIONS: Record<string, string> = {\n customer_group_id: \"x-customer-group-id\",\n // Future transformations can be added here:\n // some_param: \"X-Some-Header\",\n // another_param: \"X-Another-Header\",\n};\n\n/**\n * Transform SDK header parameters to actual HTTP header names\n * Headers not in the transformation map are passed through unchanged\n *\n * @param headers - Headers object with SDK parameter names\n * @returns Headers object with actual HTTP header names\n */\nexport function transformHeaders(\n headers: SupportedDefaultHeaders\n): Record<string, string> {\n const transformed: Record<string, string> = {};\n\n // Iterate through all headers in the input\n for (const [key, value] of Object.entries(headers)) {\n if (value !== undefined) {\n // Use transformation if available, otherwise use the original key\n const headerName = HEADER_TRANSFORMATIONS[key] || key;\n transformed[headerName] = value;\n }\n }\n\n return transformed;\n}\n\n/**\n * Merge default headers with method-level headers\n * Method-level headers take precedence over default headers\n * Automatically transforms SDK parameter names to HTTP header names\n *\n * @param defaultHeaders - Default headers from SDK configuration\n * @param methodHeaders - Headers passed to the specific method call\n * @returns Merged headers object with proper HTTP header names\n */\nexport function mergeHeaders<\n T extends Record<string, any> = Record<string, any>\n>(defaultHeaders?: SupportedDefaultHeaders, methodHeaders?: T): T {\n const merged = {} as T;\n\n // Transform and add default headers if they exist\n if (defaultHeaders) {\n const transformedDefaults = transformHeaders(defaultHeaders);\n Object.assign(merged, transformedDefaults);\n }\n\n // Method headers override default headers\n if (methodHeaders) {\n Object.assign(merged, methodHeaders);\n }\n\n // Remove undefined values\n Object.keys(merged).forEach((key) => {\n if (merged[key] === undefined) {\n delete merged[key];\n }\n });\n\n return merged;\n}\n\n/**\n * Get the list of supported header transformations\n * Useful for debugging or documentation purposes\n *\n * @returns Copy of the header transformations mapping\n */\nexport function getHeaderTransformations(): Record<string, string> {\n return { ...HEADER_TRANSFORMATIONS };\n}\n","import createClient from \"openapi-fetch\";\nimport type { paths } from \"../types/storefront\";\nimport { ApiErrorResponse, ApiResult } from \"../types/storefront-api-types\";\nimport { createDefaultAuthMiddleware, type TokenStorage } from \"./middleware\";\nimport { getPathnameFromUrl, isAnonymousAuthEndpoint } from \"./auth-utils\";\nimport { createDebugMiddleware, type DebugLoggerFn } from \"./logger-utils\";\nimport { mergeHeaders } from \"./header-utils\";\nimport type { StorefrontSDKOptions, SupportedDefaultHeaders } from \"../index\";\n\n/**\n * Available API environments\n */\nexport enum Environment {\n /**\n * Staging environment\n */\n Staging = \"staging\",\n\n /**\n * Production environment\n */\n Production = \"production\",\n}\n\n/**\n * Base API client for Storefront API\n */\nexport class StorefrontAPIClient {\n protected client: ReturnType<typeof createClient<paths>>;\n protected config: StorefrontSDKOptions;\n private readonly baseUrl: string;\n private initializationPromise: Promise<void> | null = null;\n\n /**\n * Create a new StorefrontAPIClient\n *\n * @param config - Configuration for the API client\n */\n constructor(config: StorefrontSDKOptions) {\n this.config = { ...config };\n\n // Determine base URL from environment or use custom URL if provided\n this.baseUrl = this.getBaseUrlFromConfig(this.config);\n\n this.client = createClient<paths>({\n baseUrl: this.baseUrl,\n });\n\n // Set up auth middleware if token storage is provided\n if (this.config.tokenStorage) {\n const authMiddleware = createDefaultAuthMiddleware({\n apiKey: this.config.apiKey,\n baseUrl: this.baseUrl,\n tokenStorage: this.config.tokenStorage,\n onTokensUpdated: this.config.onTokensUpdated,\n onTokensCleared: this.config.onTokensCleared,\n });\n this.client.use(authMiddleware);\n\n // If initial tokens were provided, store them in tokenStorage\n if (this.config.accessToken) {\n this.initializationPromise = this.initializeTokens(\n this.config.accessToken,\n this.config.refreshToken\n );\n // Clear the manual tokens since we're using storage\n this.config.accessToken = undefined;\n this.config.refreshToken = undefined;\n }\n } else {\n // For manual token management, add simple header injection middleware\n this.client.use({\n onRequest: async ({ request }) => {\n const pathname = getPathnameFromUrl(request.url);\n\n // Handle anonymous auth endpoint - use API key\n if (isAnonymousAuthEndpoint(pathname)) {\n if (this.config.apiKey) {\n request.headers.set(\"X-Api-Key\", this.config.apiKey);\n }\n\n // Also send existing access token if available for continuity\n if (this.config.accessToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${this.config.accessToken}`\n );\n }\n\n return request;\n }\n\n // For all other endpoints, use access token\n if (this.config.accessToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${this.config.accessToken}`\n );\n }\n\n return request;\n },\n });\n }\n\n // Set up timeout middleware if configured\n if (this.config.timeout) {\n this.setupTimeoutMiddleware();\n }\n\n // Set up debug middleware if enabled\n if (this.config.debug) {\n const debugMiddleware = createDebugMiddleware(this.config.logger);\n this.client.use(debugMiddleware);\n }\n }\n\n /**\n * Set up timeout middleware\n */\n private setupTimeoutMiddleware(): void {\n this.client.use({\n onRequest: async ({ request }) => {\n // Add timeout signal\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.config.timeout\n );\n\n // Merge with existing signal if present\n if (request.signal) {\n request.signal.addEventListener(\"abort\", () => controller.abort());\n }\n\n // Create new request with timeout signal\n const newRequest = new Request(request, {\n signal: controller.signal,\n });\n\n // Clean up timeout when request completes\n controller.signal.addEventListener(\"abort\", () =>\n clearTimeout(timeoutId)\n );\n\n return newRequest;\n },\n });\n }\n\n /**\n * Constructs the base URL from the configuration\n *\n * @param config - The client configuration\n * @returns The constructed base URL\n */\n private getBaseUrlFromConfig(config: StorefrontSDKOptions): string {\n // If explicit baseUrl is provided, use it\n if (config.baseUrl) {\n return config.baseUrl;\n }\n\n // Otherwise construct URL based on environment and storeId\n const env = config.environment || Environment.Production;\n\n switch (env) {\n case Environment.Staging:\n return `https://staging.api.commercengine.io/api/v1/${config.storeId}/storefront`;\n case Environment.Production:\n default:\n return `https://prod.api.commercengine.io/api/v1/${config.storeId}/storefront`;\n }\n }\n\n /**\n * Get the base URL of the API\n *\n * @returns The base URL of the API\n */\n public getBaseUrl(): string {\n return this.baseUrl;\n }\n\n /**\n * Get the authorization header value\n * If using token storage, gets the current token from storage\n * Otherwise returns the manual token\n *\n * @returns The Authorization header value or empty string if no token is set\n */\n public async getAuthorizationHeader(): Promise<string> {\n // Wait for initialization to complete if using token storage\n if (this.config.tokenStorage && this.initializationPromise) {\n await this.initializationPromise;\n }\n\n if (this.config.tokenStorage) {\n const token = await this.config.tokenStorage.getAccessToken();\n return token ? `Bearer ${token}` : \"\";\n }\n return this.config.accessToken ? `Bearer ${this.config.accessToken}` : \"\";\n }\n\n /**\n * Set authentication tokens\n *\n * @param accessToken - The access token (required)\n * @param refreshToken - The refresh token (optional)\n *\n * Behavior:\n * - If tokenStorage is provided: Stores tokens for automatic management\n * - If tokenStorage is not provided: Only stores access token for manual management\n */\n public async setTokens(\n accessToken: string,\n refreshToken?: string\n ): Promise<void> {\n if (this.config.tokenStorage) {\n // Automatic token management\n await this.config.tokenStorage.setAccessToken(accessToken);\n if (refreshToken) {\n await this.config.tokenStorage.setRefreshToken(refreshToken);\n }\n } else {\n // Manual token management - only access token\n this.config.accessToken = accessToken;\n if (refreshToken) {\n console.warn(\n \"Refresh token provided but ignored in manual token management mode. Use tokenStorage for automatic management.\"\n );\n }\n }\n }\n\n /**\n * Clear all authentication tokens\n *\n * Behavior:\n * - If tokenStorage is provided: Clears both access and refresh tokens from storage\n * - If tokenStorage is not provided: Clears the manual access token\n */\n public async clearTokens(): Promise<void> {\n if (this.config.tokenStorage) {\n await this.config.tokenStorage.clearTokens();\n } else {\n this.config.accessToken = undefined;\n }\n }\n\n /**\n * Set the X-Api-Key header\n *\n * @param apiKey - The API key to set\n */\n public setApiKey(apiKey: string): void {\n this.config.apiKey = apiKey;\n }\n\n /**\n * Clear the X-Api-Key header\n */\n public clearApiKey(): void {\n this.config.apiKey = undefined;\n }\n\n /**\n * Execute a request and handle the response\n *\n * @param apiCall - Function that executes the API request\n * @returns Promise with the API response\n */\n protected async executeRequest<T>(\n apiCall: () => Promise<{\n data?: { message?: string; success?: boolean; content?: T };\n error?: ApiErrorResponse;\n response: Response;\n }>\n ): Promise<ApiResult<T>> {\n try {\n const { data, error, response } = await apiCall();\n\n // Debug logging is now handled by middleware\n\n // openapi-fetch returns error for 4xx/5xx, data for 2xx\n if (error) {\n return {\n data: null,\n error,\n response,\n };\n }\n\n // If response has content, return it directly\n if (data && data.content !== undefined) {\n return {\n data: data.content,\n error: null,\n response,\n };\n }\n\n // If no content, return the response object (with message, success, etc.)\n return {\n data: data! as T,\n error: null,\n response,\n };\n } catch (err) {\n // This handles network errors or other unexpected errors\n // Network errors don't have Response objects, so we create a mock response\n const mockResponse = new Response(null, {\n status: 0,\n statusText: \"Network Error\",\n });\n\n const errorResult = {\n data: null,\n error: {\n success: false,\n code: \"NETWORK_ERROR\",\n message: \"Network error occurred\",\n error: err,\n },\n response: mockResponse,\n };\n\n // Network errors are logged by middleware if debug is enabled\n\n return errorResult;\n }\n }\n\n /**\n * Initialize tokens in storage (private helper method)\n */\n private async initializeTokens(\n accessToken: string,\n refreshToken?: string\n ): Promise<void> {\n try {\n if (this.config.tokenStorage) {\n await this.config.tokenStorage.setAccessToken(accessToken);\n if (refreshToken) {\n await this.config.tokenStorage.setRefreshToken(refreshToken);\n }\n }\n } catch (error) {\n console.warn(\"Failed to initialize tokens in storage:\", error);\n }\n }\n\n /**\n * Merge default headers with method-level headers\n * Method-level headers take precedence over default headers\n *\n * @param methodHeaders - Headers passed to the specific method call\n * @returns Merged headers object with proper HTTP header names\n */\n protected mergeHeaders<T extends Record<string, any> = Record<string, any>>(\n methodHeaders?: T\n ): T {\n return mergeHeaders(this.config.defaultHeaders, methodHeaders);\n }\n}\n","import { StorefrontAPIClient } from \"./client\";\nimport type {\n ApiResult,\n GetProductDetailContent,\n GetProductDetailPathParams,\n GetProductDetailHeaderParams,\n GetVariantDetailContent,\n GetVariantDetailPathParams,\n GetVariantDetailHeaderParams,\n ListProductsContent,\n ListProductsQuery,\n ListProductsHeaderParams,\n ListProductVariantsContent,\n ListProductVariantsPathParams,\n ListProductVariantsHeaderParams,\n ListCategoriesQuery,\n ListCategoriesContent,\n ListProductReviewsQuery,\n ListProductReviewsPathParams,\n ListProductReviewsContent,\n CreateProductReviewPathParams,\n CreateProductReviewFormData,\n CreateProductReviewResponse,\n SearchProductsBody,\n SearchProductsContent,\n ListSkusQuery,\n ListSkusContent,\n ListSkusHeaderParams,\n ListCrosssellProductsContent,\n ListCrosssellProductsQuery,\n ListCrosssellProductsHeaderParams,\n ListUpsellProductsQuery,\n ListUpsellProductsContent,\n ListUpsellProductsHeaderParams,\n ListSimilarProductsQuery,\n ListSimilarProductsContent,\n ListSimilarProductsHeaderParams,\n SearchProductsHeaderParams,\n} from \"../types/storefront-api-types\";\n\n/**\n * Client for interacting with catalog endpoints\n */\nexport class CatalogClient extends StorefrontAPIClient {\n /**\n * List all products\n *\n * @param options - Optional query parameters\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with products and pagination info\n */\n public async listProducts(\n options?: ListProductsQuery,\n headers?: ListProductsHeaderParams\n ): Promise<ApiResult<ListProductsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products\", {\n params: {\n query: options,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * List all skus\n *\n * @param options - Optional query parameters\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with skus and pagination info\n */\n public async listSkus(\n options?: ListSkusQuery,\n headers?: ListSkusHeaderParams\n ): Promise<ApiResult<ListSkusContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/skus\", {\n params: {\n query: options,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * Get details for a specific product\n *\n * @param pathParams - The path parameters (product ID or slug)\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with product details\n */\n public async getProductDetail(\n pathParams: GetProductDetailPathParams,\n headers?: GetProductDetailHeaderParams\n ): Promise<ApiResult<GetProductDetailContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/{product_id_or_slug}\", {\n params: {\n path: pathParams,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * List variants for a specific product\n *\n * @param pathParams - The path parameters (product ID)\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with variants\n */\n public async listProductVariants(\n pathParams: ListProductVariantsPathParams,\n headers?: ListProductVariantsHeaderParams\n ): Promise<ApiResult<ListProductVariantsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/{product_id}/variants\", {\n params: {\n path: pathParams,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * Get details for a specific variant\n *\n * @param pathParams - The path parameters (product ID and variant ID)\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with variant details\n */\n public async getVariantDetail(\n pathParams: GetVariantDetailPathParams,\n headers?: GetVariantDetailHeaderParams\n ): Promise<ApiResult<GetVariantDetailContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/{product_id}/variants/{variant_id}\", {\n params: {\n path: pathParams,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * List all categories\n *\n * @param options - Optional query parameters\n * @returns Promise with categories and pagination info\n */\n public async listCategories(\n options?: ListCategoriesQuery\n ): Promise<ApiResult<ListCategoriesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/categories\", {\n params: { query: options },\n })\n );\n }\n\n /**\n * List reviews for a specific product\n *\n * @param pathParams - The path parameters (product ID)\n * @param queryParams - Optional query parameters\n * @returns Promise with reviews and pagination info\n */\n public async listProductReviews(\n pathParams: ListProductReviewsPathParams,\n queryParams?: ListProductReviewsQuery\n ): Promise<ApiResult<ListProductReviewsContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/{product_id}/reviews\", {\n params: {\n path: pathParams,\n query: queryParams,\n },\n })\n );\n }\n\n /**\n * Create a review for a specific product\n *\n * @param pathParams - The path parameters (product ID)\n * @param formData - The review data\n * @returns Promise that resolves when the review is created\n */\n public async createProductReview(\n pathParams: CreateProductReviewPathParams,\n formData: CreateProductReviewFormData\n ): Promise<ApiResult<CreateProductReviewResponse>> {\n return this.executeRequest(() =>\n this.client.POST(\"/catalog/products/{product_id}/reviews\", {\n params: {\n path: pathParams,\n },\n body: formData,\n bodySerializer: (body) => {\n const fd = new FormData();\n for (const [key, value] of Object.entries(body)) {\n if (value !== undefined && value !== null) {\n // Handle File objects directly\n if (value instanceof File || value instanceof Blob) {\n fd.append(key, value);\n } else {\n // Convert other values to string\n fd.append(key, String(value));\n }\n }\n }\n return fd;\n },\n })\n );\n }\n\n /**\n * Search for products\n *\n * @param searchData - The search parameters\n * @returns Promise with search results, facet distribution, facet stats, and pagination\n */\n public async searchProducts(\n searchData: SearchProductsBody,\n headers?: SearchProductsHeaderParams\n ): Promise<ApiResult<SearchProductsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.POST(\"/catalog/products/search\", {\n body: searchData,\n header: mergedHeaders,\n })\n );\n }\n\n /**\n * List cross-sell products\n *\n * @param options - Optional query parameters\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with cross-sell products\n */\n public async listCrossSellProducts(\n options?: ListCrosssellProductsQuery,\n headers?: ListCrosssellProductsHeaderParams\n ): Promise<ApiResult<ListCrosssellProductsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/cross-sell\", {\n params: {\n query: options,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * List up-sell products\n *\n * @param options - Optional query parameters\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with up-sell products\n */\n public async listUpSellProducts(\n options?: ListUpsellProductsQuery,\n headers?: ListUpsellProductsHeaderParams\n ): Promise<ApiResult<ListUpsellProductsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/up-sell\", {\n params: {\n query: options,\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * List similar products\n *\n * @param options - Optional query parameters\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with similar products\n */\n public async listSimilarProducts(\n options?: ListSimilarProductsQuery,\n headers?: ListSimilarProductsHeaderParams\n ): Promise<ApiResult<ListSimilarProductsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/catalog/products/similar\", {\n params: {\n query: options,\n header: mergedHeaders,\n },\n })\n );\n }\n}\n","import { StorefrontAPIClient } from \"./client\";\nimport type {\n AddToWishlistBody,\n AddToWishlistContent,\n AddToWishlistPathParams,\n ApiResult,\n ApplyCouponBody,\n ApplyCouponContent,\n ApplyCouponPathParams,\n CreateCartContent,\n CreateCartAddressBody,\n CreateCartAddressContent,\n CreateCartAddressPathParams,\n CreateCartBody,\n DeleteCartPathParams,\n DeleteCartResponse,\n DeleteFromWishlistBody,\n DeleteFromWishlistContent,\n DeleteFromWishlistPathParams,\n DeleteUserCartPathParams,\n DeleteUserCartResponse,\n GetCartContent,\n GetCartPathParams,\n GetUserCartContent,\n GetUserCartPathParams,\n GetWishlistContent,\n GetWishlistPathParams,\n RedeemCreditBalanceBody,\n RedeemCreditBalanceContent,\n RedeemCreditBalancePathParams,\n RedeemGiftCardBody,\n RedeemGiftCardContent,\n RedeemGiftCardPathParams,\n RedeemLoyaltyPointsBody,\n RedeemLoyaltyPointsContent,\n RedeemLoyaltyPointsPathParams,\n RemoveCouponContent,\n RemoveCouponPathParams,\n RemoveCreditBalanceContent,\n RemoveCreditBalancePathParams,\n RemoveGiftCardContent,\n RemoveGiftCardPathParams,\n RemoveLoyaltyPointsContent,\n RemoveLoyaltyPointsPathParams,\n UpdateCartBody,\n UpdateCartContent,\n UpdateCartPathParams,\n UpdateShippingMethodBody,\n UpdateShippingMethodContent,\n UpdateShippingMethodPathParams,\n ListCouponsContent,\n ListPromotionsContent,\n ListCouponsHeaderParams,\n ListPromotionsHeaderParams,\n} from \"../types/storefront-api-types\";\n\n/**\n * Client for interacting with cart endpoints\n */\nexport class CartClient extends StorefrontAPIClient {\n /**\n * Create a new cart\n *\n * @param payload - Object containing the items to add to the cart\n * @returns Promise with the created cart\n */\n public async createCart(\n payload: CreateCartBody\n ): Promise<ApiResult<CreateCartContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts\", {\n body: payload,\n })\n );\n }\n\n /**\n * Get cart details - either by ID or using the stored cart ID\n *\n * @param cartId - The ID of the cart\n * @returns Promise with cart details\n */\n public async getCart(\n cartId: GetCartPathParams\n ): Promise<ApiResult<GetCartContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/carts/{id}\", {\n params: {\n path: cartId,\n },\n })\n );\n }\n\n /**\n * Delete a cart - either by ID or using the stored cart ID\n *\n * @param cartId - The ID of the cart\n * @returns Promise that resolves when the cart is deleted\n */\n public async deleteCart(\n cartId: DeleteCartPathParams\n ): Promise<ApiResult<DeleteCartResponse>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/carts/{id}\", {\n params: {\n path: cartId,\n },\n })\n );\n }\n\n /**\n * Update cart items (add, update quantity, remove)\n *\n * @param cartId - The cart id\n * @param body - The body of the request\n * @returns Promise with updated cart\n */\n public async addDeleteCartItem(\n cartId: UpdateCartPathParams,\n body: UpdateCartBody\n ): Promise<ApiResult<UpdateCartContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/items\", {\n params: {\n path: cartId,\n },\n body: body,\n })\n );\n }\n\n /**\n * Get cart details by user ID\n *\n * @param userId - The ID of the user\n * @returns Promise with cart details\n */\n public async getUserCart(\n userId: GetUserCartPathParams\n ): Promise<ApiResult<GetUserCartContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/carts/users/{user_id}\", {\n params: {\n path: userId,\n },\n })\n );\n }\n\n /**\n * Delete a cart by user ID\n *\n * @param userId - The ID of the user\n * @returns Promise that resolves when the cart is deleted\n */\n public async deleteUserCart(\n userId: DeleteUserCartPathParams\n ): Promise<ApiResult<DeleteUserCartResponse>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/carts/users/{user_id}\", {\n params: {\n path: userId,\n },\n body: undefined,\n })\n );\n }\n\n /**\n * Update cart addresses\n *\n * @param cartId - The ID of the cart\n * @param addressData - The address data\n * @returns Promise with updated cart\n */\n public async updateCartAddress(\n cartId: CreateCartAddressPathParams,\n addressData: CreateCartAddressBody\n ): Promise<ApiResult<CreateCartAddressContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/address\", {\n params: {\n path: cartId,\n },\n body: addressData,\n })\n );\n }\n\n /**\n * Apply a coupon to the cart\n *\n * @param cartId - The ID of the cart\n * @param couponCode - The coupon code\n * @returns Promise with updated cart\n */\n public async applyCoupon(\n cartId: ApplyCouponPathParams,\n couponCode: ApplyCouponBody\n ): Promise<ApiResult<ApplyCouponContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/coupon\", {\n params: {\n path: cartId,\n },\n body: couponCode,\n })\n );\n }\n\n /**\n * Remove a coupon from the cart\n *\n * @param cartId - The ID of the cart\n * @returns Promise with updated cart\n */\n public async removeCoupon(\n cartId: RemoveCouponPathParams\n ): Promise<ApiResult<RemoveCouponContent>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/carts/{id}/coupon\", {\n params: {\n path: cartId,\n },\n body: undefined,\n })\n );\n }\n\n /**\n * Redeem loyalty points\n *\n * @param cartId - The ID of the cart\n * @param points - The number of points to redeem\n * @returns Promise with updated cart\n */\n public async redeemLoyaltyPoints(\n cartId: RedeemLoyaltyPointsPathParams,\n points: RedeemLoyaltyPointsBody\n ): Promise<ApiResult<RedeemLoyaltyPointsContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/loyalty-points\", {\n params: {\n path: cartId,\n },\n body: points,\n })\n );\n }\n\n /**\n * Remove loyalty points\n *\n * @param cartId - The ID of the cart\n * @returns Promise with updated cart\n */\n public async removeLoyaltyPoints(\n cartId: RemoveLoyaltyPointsPathParams\n ): Promise<ApiResult<RemoveLoyaltyPointsContent>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/carts/{id}/loyalty-points\", {\n params: {\n path: cartId,\n },\n body: undefined,\n })\n );\n }\n\n /**\n * Update shipping method\n *\n * @param cartId - The ID of the cart\n * @param body - The body of the request\n * @returns Promise with updated cart\n */\n public async updateShippingMethod(\n cartId: UpdateShippingMethodPathParams,\n body: UpdateShippingMethodBody\n ): Promise<ApiResult<UpdateShippingMethodContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/shipping-method\", {\n params: {\n path: cartId,\n },\n body: body,\n })\n );\n }\n\n /**\n * Use credit balance\n *\n * @param cartId - The ID of the cart\n * @param body - The body of the request\n * @returns Promise with updated cart\n */\n public async redeemCreditBalance(\n cartId: RedeemCreditBalancePathParams,\n body: RedeemCreditBalanceBody\n ): Promise<ApiResult<RedeemCreditBalanceContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/credit-balance\", {\n params: {\n path: cartId,\n },\n body: body,\n })\n );\n }\n\n /**\n * Remove credit balance\n *\n * @param cartId - The ID of the cart\n * @returns Promise with updated cart\n */\n public async removeCreditBalance(\n cartId: RemoveCreditBalancePathParams\n ): Promise<ApiResult<RemoveCreditBalanceContent>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/carts/{id}/credit-balance\", {\n params: {\n path: cartId,\n },\n body: undefined,\n })\n );\n }\n\n /**\n * Redeem gift card\n *\n * @param cartId - The ID of the cart\n * @param body - The body of the request\n * @returns Promise with updated cart\n */\n public async redeemGiftCard(\n cartId: RedeemGiftCardPathParams,\n body: RedeemGiftCardBody\n ): Promise<ApiResult<RedeemGiftCardContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/carts/{id}/gift-card\", {\n params: {\n path: cartId,\n },\n body: body,\n })\n );\n }\n\n /**\n * Remove gift card\n *\n * @param cartId - The ID of the cart\n * @returns Promise with updated cart\n */\n public async removeGiftCard(\n cartId: RemoveGiftCardPathParams\n ): Promise<ApiResult<RemoveGiftCardContent>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/carts/{id}/gift-card\", {\n params: {\n path: cartId,\n },\n body: undefined,\n })\n );\n }\n\n /**\n * Get wishlist items\n *\n * @param userId - The ID of the user\n * @returns Promise with wishlist items\n */\n public async getWishlist(\n userId: GetWishlistPathParams\n ): Promise<ApiResult<GetWishlistContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/wishlist/{user_id}\", {\n params: {\n path: userId,\n },\n })\n );\n }\n\n /**\n * Add item to wishlist\n *\n * @param userId - The ID of the user\n * @param itemId - The ID of the item\n * @returns Promise with updated wishlist\n */\n public async addToWishlist(\n userId: AddToWishlistPathParams,\n itemId: AddToWishlistBody\n ): Promise<ApiResult<AddToWishlistContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/wishlist/{user_id}\", {\n params: {\n path: userId,\n },\n body: itemId,\n })\n );\n }\n\n /**\n * Remove item from wishlist\n *\n * @param userId - The ID of the user\n * @param itemId - The ID of the item\n * @returns Promise with updated wishlist\n */\n public async removeFromWishlist(\n userId: DeleteFromWishlistPathParams,\n body: DeleteFromWishlistBody\n ): Promise<ApiResult<DeleteFromWishlistContent>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/wishlist/{user_id}\", {\n params: {\n path: userId,\n },\n body: body,\n })\n );\n }\n\n /**\n * Get all available coupons\n *\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with all available coupons\n */\n public async getAvailableCoupons(\n headers?: ListCouponsHeaderParams\n ): Promise<ApiResult<ListCouponsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/carts/available-coupons\", {\n params: {\n header: mergedHeaders,\n },\n })\n );\n }\n\n /**\n * Get all available promotions\n *\n * @param headers - Optional header parameters (customer_group_id, etc.)\n * @returns Promise with all available promotions\n */\n public async getAvailablePromotions(\n headers?: ListPromotionsHeaderParams\n ): Promise<ApiResult<ListPromotionsContent>> {\n const mergedHeaders = this.mergeHeaders(headers);\n return this.executeRequest(() =>\n this.client.GET(\"/carts/available-promotions\", {\n params: {\n header: mergedHeaders,\n },\n })\n );\n }\n}\n","import { StorefrontAPIClient } from \"./client\";\nimport type { AddProfileImageContent, AddProfileImageFormData, AddProfileImagePathParams, ApiResult, ChangePasswordBody, ChangePasswordContent, CheckVerificationStatusBody, CheckVerificationStatusContent, CreateNotificationPreferencesBody, CreateNotificationPreferencesContent, CreateNotificationPreferencesPathParams, DeactivateUserPathParams, DeactivateUserResponse, ForgotPasswordBody, ForgotPasswordContent, GenerateOtpBody, GenerateOtpContent, GetAnonymousTokenContent, GetNotificationPreferencesContent, GetNotificationPreferencesPathParams, GetProfileImageContent, GetProfileImagePathParams, GetUserDetailContent, GetUserDetailPathParams, LoginWithEmailBody, LoginWithEmailContent, LoginWithPasswordBody, LoginWithPasswordContent, LoginWithPhoneBody, LoginWithPhoneContent, LoginWithWhatsappBody, LoginWithWhatsappContent, LogoutContent, LogoutResponse, RefreshTokenBody, RefreshTokenContent, RegisterWithEmailBody, RegisterWithEmailContent, RegisterWithPhoneBody, RegisterWithPhoneContent, RemoveProfileImagePathParams, RemoveProfileImageResponse, ResetPasswordBody, ResetPasswordContent, UpdateNotificationPreferencesBody, UpdateNotificationPreferencesContent, UpdateNotificationPreferencesPathParams, UpdateProfileImageContent, UpdateProfileImageFormData, UpdateProfileImagePathParams, UpdateUserBody, UpdateUserContent, UpdateUserPathParams, VerifyOtpBody, VerifyOtpContent } from \"../types/storefront-api-types\";\n\n/**\n * Client for interacting with authentication endpoints\n */\nexport class AuthClient extends StorefrontAPIClient {\n /**\n * Get anonymous token for guest users\n */\n public async getAnonymousToken(): Promise<ApiResult<GetAnonymousTokenContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/anonymous\")\n );\n }\n\n /**\n * Login with phone number\n *\n * @param phoneNumber - Phone number (without country code)\n * @param countryCode - Country code (defaults to +91)\n * @param registerIfNotExists - Whether to register if user doesn't exist\n * @returns Promise with OTP token and action \n */\n public async loginWithPhone(\n body: LoginWithPhoneBody,\n ): Promise<ApiResult<LoginWithPhoneContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/login/phone\", {\n body: body,\n })\n );\n }\n\n /**\n * Login with WhatsApp\n *\n * @param phoneNumber - Phone number (without country code)\n * @param countryCode - Country code (defaults to +91)\n * @param registerIfNotExists - Whether to register if user doesn't exist\n * @returns Promise with OTP token and action\n */\n public async loginWithWhatsApp(\n body: LoginWithWhatsappBody,\n ): Promise<ApiResult<LoginWithWhatsappContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/login/whatsapp\", {\n body: body,\n })\n );\n }\n\n /**\n * Login with email\n *\n * @param email - Email address\n * @param registerIfNotExists - Whether to register if user doesn't exist\n * @returns Promise with OTP token and action\n */\n public async loginWithEmail(\n body: LoginWithEmailBody,\n ): Promise<ApiResult<LoginWithEmailContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/login/email\", {\n body: body,\n })\n );\n }\n\n\n /**\n * Login with password\n *\n * @param credentials - Login credentials\n * @returns Promise with user info and tokens\n */\n public async loginWithPassword(body: LoginWithPasswordBody): Promise<ApiResult<LoginWithPasswordContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/login/password\", {\n body: body,\n })\n );\n }\n\n /**\n * Forgot password\n *\n * @param email - Email address\n * @returns Promise with user info and tokens\n */\n public async forgotPassword(body: ForgotPasswordBody): Promise<ApiResult<ForgotPasswordContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/forgot-password\", {\n body: body,\n })\n );\n }\n\n /**\n * Reset password\n *\n * @param email - Email address\n * @returns Promise with user info and tokens\n */\n public async resetPassword(body: ResetPasswordBody): Promise<ApiResult<ResetPasswordContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/reset-password\", {\n body: body,\n })\n );\n }\n\n /**\n * Change password\n *\n * @param oldPassword - Old password\n * @param newPassword - New password\n * @param newPasswordConfirmation - New password confirmation\n * @returns Promise with new access token and refresh token\n */\n public async changePassword(body: ChangePasswordBody): Promise<ApiResult<ChangePasswordContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/change-password\", {\n body: body,\n })\n );\n }\n\n /**\n * Verify OTP\n *\n * @param otp - One-time password\n * @param otpToken - OTP token from login request\n * @param otpAction - OTP action from login request\n * @returns Promise with user info and tokens\n */\n\n public async verifyOtp(\n body: VerifyOtpBody,\n ): Promise<ApiResult<VerifyOtpContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/verify-otp\", {\n body: body,\n })\n );\n }\n\n /**\n * Register with phone\n *\n * @param options - Registration details\n * @returns Promise with user info and tokens\n */\n public async registerWithPhone(body: RegisterWithPhoneBody): Promise<ApiResult<RegisterWithPhoneContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/register/phone\", {\n body: body,\n })\n );\n }\n\n /**\n * Register with email\n *\n * @param options - Registration details\n * @returns Promise with user info and tokens\n */\n public async registerWithEmail(body: RegisterWithEmailBody): Promise<ApiResult<RegisterWithEmailContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/register/email\", {\n body: body,\n })\n );\n }\n\n /**\n * Refresh the access token using a refresh token\n * @param refreshToken - The refresh token to use for refreshing the access token\n * @returns Promise with the new access token and refresh token\n */\n public async refreshToken(body: RefreshTokenBody): Promise<ApiResult<RefreshTokenContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/refresh-token\", {\n body: body,\n })\n );\n }\n\n /**\n * Logout\n *\n * @returns Promise that resolves when logout is complete\n */\n public async logout(): Promise<ApiResult<LogoutContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/logout\")\n );\n }\n\n /**\n * Get user details\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async getUserDetails(\n pathParams: GetUserDetailPathParams,\n ): Promise<ApiResult<GetUserDetailContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/auth/user/{id}\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Update user details\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async updateUserDetails(\n pathParams: UpdateUserPathParams,\n body: UpdateUserBody,\n ): Promise<ApiResult<UpdateUserContent>> {\n return this.executeRequest(() =>\n this.client.PUT(\"/auth/user/{id}\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n\n /**\n * Add profile image\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async addProfileImage(\n pathParams: AddProfileImagePathParams,\n formData: AddProfileImageFormData,\n ): Promise<ApiResult<AddProfileImageContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/user/{id}/profile-image\", {\n params: {\n path: pathParams,\n },\n body: formData,\n bodySerializer: (body) => {\n const fd = new FormData();\n for (const [key, value] of Object.entries(body)) {\n if (value !== undefined && value !== null) {\n fd.append(key, value);\n }\n }\n return fd;\n }\n })\n );\n }\n\n /**\n * Update profile image\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async updateProfileImage(\n pathParams: UpdateProfileImagePathParams,\n formData: UpdateProfileImageFormData,\n ): Promise<ApiResult<UpdateProfileImageContent>> {\n return this.executeRequest(() =>\n this.client.PUT(\"/auth/user/{id}/profile-image\", {\n params: {\n path: pathParams,\n },\n body: formData,\n bodySerializer: (body) => {\n const fd = new FormData();\n for (const [key, value] of Object.entries(body)) {\n if (value !== undefined && value !== null) {\n fd.append(key, value);\n }\n }\n return fd;\n }\n })\n );\n }\n\n /**\n * Delete profile image\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async deleteProfileImage(\n pathParams: RemoveProfileImagePathParams,\n ): Promise<ApiResult<RemoveProfileImageResponse>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/auth/user/{id}/profile-image\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Get profile image\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async getProfileImage(\n pathParams: GetProfileImagePathParams,\n ): Promise<ApiResult<GetProfileImageContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/auth/user/{id}/profile-image\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Deactivate user account\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async deactivateUserAccount(\n pathParams: DeactivateUserPathParams,\n ): Promise<ApiResult<DeactivateUserResponse>> {\n return this.executeRequest(() =>\n this.client.PUT(\"/auth/user/{id}/deactivate\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Get user notification preferences\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async getUserNotificationPreferences(\n pathParams: GetNotificationPreferencesPathParams,\n ): Promise<ApiResult<GetNotificationPreferencesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/auth/user/{id}/notification-preferences\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Update user notification preferences\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async updateUserNotificationPreferences(\n pathParams: UpdateNotificationPreferencesPathParams,\n body: UpdateNotificationPreferencesBody,\n ): Promise<ApiResult<UpdateNotificationPreferencesContent>> {\n return this.executeRequest(() =>\n this.client.PUT(\"/auth/user/{id}/notification-preferences\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n\n /**\n * Create user notification preference\n *\n * @param userId - User ID\n * @returns Promise with user details\n */\n public async createUserNotificationPreference(\n pathParams: CreateNotificationPreferencesPathParams,\n body: CreateNotificationPreferencesBody,\n ): Promise<ApiResult<CreateNotificationPreferencesContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/user/{id}/notification-preferences\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n \n /**\n * Generate OTP\n * \n * @param body - OTP generation body\n * @returns Promise with OTP generation response\n */\n public async generateOtp(\n body: GenerateOtpBody,\n ): Promise<ApiResult<GenerateOtpContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/generate-otp\", {\n body: body,\n })\n );\n }\n\n /**\n * Check whether email or phone is already verified\n *\n * @param body - OTP generation body\n * @returns Promise with OTP generation response\n */\n public async checkEmailOrPhoneIsVerified(\n body: CheckVerificationStatusBody,\n ): Promise<ApiResult<CheckVerificationStatusContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/auth/verified-email-phone\", {\n body: body,\n })\n );\n }\n}\n","import type { ApiResult, CancelOrderBody, CancelOrderContent, CancelOrderPathParams, CreateOrderBody, CreateOrderContent, CreateOrderResponse, GetOrderDetailContent, GetOrderDetailPathParams, GetOrderReturnDetailContent, GetOrderReturnDetailPathParams, GetPaymentStatusContent, ListOrderPaymentsContent, ListOrderPaymentsPathParams, ListOrderRefundsContent, ListOrderRefundsPathParams, ListOrdersContent, ListOrderShipmentsContent, ListOrderShipmentsPathParams, ListOrdersQuery, RetryOrderPaymentBody, RetryOrderPaymentContent, RetryOrderPaymentPathParams } from \"../types/storefront-api-types\";\nimport { StorefrontAPIClient } from \"./client\";\n\n/**\n * Client for interacting with order endpoints\n */\nexport class OrderClient extends StorefrontAPIClient {\n\n /**\n * Get order details\n *\n * @param orderNumber - Order number\n * @returns Promise with order details\n */\n public async getOrderDetails(\n pathParams: GetOrderDetailPathParams,\n ): Promise<ApiResult<GetOrderDetailContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/orders/{order_number}\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Create order\n *\n * @param cartId - Cart ID\n * @param paymentGateway - Payment gateway\n * @param paymentGatewayParams - Params for the selected payment gateway\n * @returns Promise with order details\n */\n public async createOrder(body: CreateOrderBody): Promise<ApiResult<CreateOrderContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/orders\", {\n body: body,\n })\n );\n }\n\n /**\n * List all orders\n *\n * @param queryParams - Query parameters\n * @returns Promise with order details\n */\n public async listOrders(queryParams: ListOrdersQuery): Promise<ApiResult<ListOrdersContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/orders\", {\n params: {\n query: queryParams,\n },\n })\n );\n }\n\n /**\n * Get payment status for an order\n *\n * @param orderNumber - Order number\n * @returns Promise with payment status\n */\n public async getPaymentStatus(orderNumber: string): Promise<ApiResult<GetPaymentStatusContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/orders/{order_number}/payment-status\", {\n params: {\n path: { order_number: orderNumber },\n },\n })\n );\n }\n\n /**\n * Get all shipments for an order\n *\n * @param orderNumber - Order number\n * @returns Promise with shipments\n */\n public async listOrderShipments(pathParams: ListOrderShipmentsPathParams): Promise<ApiResult<ListOrderShipmentsContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/orders/{order_number}/shipments\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * List order payments\n *\n * @param orderNumber - Order number\n * @returns Promise with payments\n */\n public async listOrderPayments(pathParams: ListOrderPaymentsPathParams): Promise<ApiResult<ListOrderPaymentsContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/orders/{order_number}/payments\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * List order refunds\n *\n * @param orderNumber - Order number\n * @returns Promise with refunds\n */\n public async listOrderRefunds(pathParams: ListOrderRefundsPathParams): Promise<ApiResult<ListOrderRefundsContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/orders/{order_number}/refunds\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Cancel an order\n *\n * @param orderNumber - Order number\n * @returns Promise with order details\n */\n public async cancelOrder(pathParams: CancelOrderPathParams, body: CancelOrderBody): Promise<ApiResult<CancelOrderContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/orders/{order_number}/cancel\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n\n /**\n * Retry payment for an order\n *\n * @param orderNumber - Order number\n * @returns Promise with order details\n */\n public async retryOrderPayment(pathParams: RetryOrderPaymentPathParams, body: RetryOrderPaymentBody): Promise<ApiResult<RetryOrderPaymentContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/orders/{order_number}/retry-payment\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n}","import type {\n ApiResult,\n CheckPincodeServiceabilityContent,\n CheckPincodeServiceabilityPathParams,\n CheckPincodeServiceabilityResponse,\n GetShippingMethodsBody,\n GetShippingMethodsContent,\n} from \"../types/storefront-api-types\";\nimport { StorefrontAPIClient } from \"./client\";\n\n/**\n * Client for interacting with shipping endpoints\n */\nexport class ShippingClient extends StorefrontAPIClient {\n /**\n * Get shipping options for an order\n *\n * @param body - Shipping methods body\n * @returns Promise with shipping options\n */\n public async getShippingMethods(\n body: GetShippingMethodsBody\n ): Promise<ApiResult<GetShippingMethodsContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/shipping/shipping-methods\", {\n body: body,\n })\n );\n }\n\n /**\n * Check pincode deliverability\n *\n * @param pathParams - Path parameters\n * @returns Promise with pincode deliverability result\n */\n public async checkPincodeDeliverability(\n pathParams: CheckPincodeServiceabilityPathParams\n ): Promise<ApiResult<CheckPincodeServiceabilityContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/shipping/serviceability/{pincode}\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n}\n","import type { ApiResult, ListCountriesContent, ListCountryPincodesContent, ListCountryPincodesPathParams, ListCountryStatesContent, ListCountryStatesPathParams } from \"../types/storefront-api-types\";\nimport { StorefrontAPIClient } from \"./client\";\n\n/**\n * Client for interacting with helper endpoints\n */\nexport class HelpersClient extends StorefrontAPIClient {\n\n /**\n * Get a list of countries\n *\n * @returns Promise with countries\n */\n public async listCountries(): Promise<ApiResult<ListCountriesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/common/countries\", {})\n );\n }\n\n /**\n * - Get a list of states for a country\n *\n * @param pathParams - Path parameters\n * @returns Promise with states\n */\n public async listCountryStates(pathParams: ListCountryStatesPathParams): Promise<ApiResult<ListCountryStatesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/common/countries/{country_iso_code}/states\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n \n /**\n * Get pincodes for a country\n *\n * @param pathParams - Path parameters\n * @returns Promise with pincodes\n */\n public async listCountryPincodes(pathParams: ListCountryPincodesPathParams): Promise<ApiResult<ListCountryPincodesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/common/countries/{country_iso_code}/pincodes\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n}","import type { ApiResult, CreateCustomerBody, CreateAddressBody, CreateAddressContent, CreateAddressPathParams, CreateCustomerContent, DeleteAddressPathParams, DeleteAddressResponse, GetAddressDetailContent, GetAddressDetailPathParams, GetCustomerDetailContent, GetCustomerDetailPathParams, GetLoyaltyDetailsContent, GetLoyaltyDetailsPathParams, ListAddressesContent, ListAddressesPathParams, ListLoyaltyActivitiesContent, ListLoyaltyActivitiesPathParams, ListUserReviewsContent, ListUserReviewsPathParams, UpdateAddressDetailBody, UpdateAddressDetailContent, UpdateAddressDetailPathParams, UpdateCustomerBody, UpdateCustomerContent, UpdateCustomerPathParams } from \"../types/storefront-api-types\";\nimport { StorefrontAPIClient } from \"./client\";\n\n\n/**\n * Client for interacting with customer endpoints\n */\nexport class CustomerClient extends StorefrontAPIClient {\n\n /**\n * Create a customer\n *\n * @param body - Customer creation body\n * @returns Promise with customer details\n */\n public async createCustomer(body: CreateCustomerBody): Promise<ApiResult<CreateCustomerContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/customers\", {\n body: body,\n })\n );\n }\n\n /**\n * Get customer details\n *\n * @param pathParams - Path parameters\n * @returns Promise with customer details\n */\n public async getCustomer(pathParams: GetCustomerDetailPathParams): Promise<ApiResult<GetCustomerDetailContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/customers/{id}\", {\n params: {\n path: pathParams,\n },\n })\n ); \n }\n\n /**\n * Update a customer\n *\n * @param pathParams - Path parameters\n * @param body - Customer update body\n * @returns Promise with customer details\n */\n public async updateCustomer(pathParams: UpdateCustomerPathParams, body: UpdateCustomerBody): Promise<ApiResult<UpdateCustomerContent>> {\n return this.executeRequest(() =>\n this.client.PUT(\"/customers/{id}\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n \n /**\n * Get all saved addresses for a customer\n *\n * @param pathParams - Path parameters\n * @returns Promise with addresses\n */\n public async listAddresses(pathParams: ListAddressesPathParams): Promise<ApiResult<ListAddressesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/customers/{user_id}/addresses\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Create a new address for a customer\n *\n * @param pathParams - Path parameters\n * @param body - Address creation body\n * @returns Promise with address details\n */\n public async createAddress(pathParams: CreateAddressPathParams, body: CreateAddressBody): Promise<ApiResult<CreateAddressContent>> {\n return this.executeRequest(() =>\n this.client.POST(\"/customers/{user_id}/addresses\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n \n /**\n * Get an address for a customer\n *\n * @param pathParams - Path parameters\n * @returns Promise with address details\n */\n public async getAddress(pathParams: GetAddressDetailPathParams): Promise<ApiResult<GetAddressDetailContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/customers/{user_id}/addresses/{address_id}\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Update an address for a customer\n *\n * @param pathParams - Path parameters\n * @param body - Address update body\n * @returns Promise with address details\n */\n public async updateAddress(pathParams: UpdateAddressDetailPathParams, body: UpdateAddressDetailBody): Promise<ApiResult<UpdateAddressDetailContent>> {\n return this.executeRequest(() =>\n this.client.PUT(\"/customers/{user_id}/addresses/{address_id}\", {\n params: {\n path: pathParams,\n },\n body: body,\n })\n );\n }\n\n /**\n * Delete an address for a customer\n *\n * @param pathParams - Path parameters\n * @returns Promise with address details\n */\n public async deleteAddress(pathParams: DeleteAddressPathParams): Promise<ApiResult<DeleteAddressResponse>> {\n return this.executeRequest(() =>\n this.client.DELETE(\"/customers/{user_id}/addresses/{address_id}\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * Get customer loyalty details\n *\n * @param pathParams - Path parameters\n * @returns Promise with loyalty details\n */\n public async getLoyaltyDetails(pathParams: GetLoyaltyDetailsPathParams): Promise<ApiResult<GetLoyaltyDetailsContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/customers/{user_id}/loyalty\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * List all loyalty points activity for a customer\n *\n * @param pathParams - Path parameters\n * @returns Promise with loyalty points activity\n */\n public async listLoyaltyPointsActivity(pathParams: ListLoyaltyActivitiesPathParams): Promise<ApiResult<ListLoyaltyActivitiesContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/customers/{user_id}/loyalty-points-activity\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n\n /**\n * List all reviews left by a customer\n *\n * @param pathParams - Path parameters\n * @returns Promise with reviews\n */\n public async listCustomerReviews(pathParams: ListUserReviewsPathParams): Promise<ApiResult<ListUserReviewsContent>> {\n return this.executeRequest(() =>\n this.client.GET(\"/customers/{user_id}/reviews\", {\n params: {\n path: pathParams,\n },\n })\n );\n }\n}"],"mappings":"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","names":["fetch","Request","error","final","joiner","mergeHeaders","Environment","mergeHeaders"]}
|