@01.software/sdk 0.2.9-dev.260311.892250f → 0.2.9-dev.260311.bb95a4e
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 +8 -8
- package/dist/index.cjs +5 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -25
- package/dist/index.d.ts +5 -25
- package/dist/index.js +5 -17
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/internal/utils/jwt.ts","../src/core/internal/utils/encoding.ts","../src/core/internal/errors/index.ts","../src/core/client/types.ts","../src/core/internal/utils/http.ts","../src/core/api/base-api.ts","../src/core/api/order-api.ts","../src/core/api/cart-api.ts","../src/core/api/product-api.ts","../src/utils/types.ts","../src/core/metadata/index.ts","../src/core/collection/query-builder.ts","../src/core/collection/http-client.ts","../src/core/collection/collection-client.ts","../src/core/collection/const.ts","../src/core/customer/customer-auth.ts","../src/core/query/get-query-client.ts","../src/core/query/collection-hooks.ts","../src/core/query/query-keys.ts","../src/core/query/customer-hooks.ts","../src/core/query/query-hooks.ts","../src/core/client/client.ts","../src/core/client/client.server.ts","../src/core/webhook/index.ts","../src/utils/image.ts","../src/utils/order/generateOrderNumber.ts","../src/utils/order/formatOrderName.ts","../src/utils/video.ts"],"sourcesContent":["import { SignJWT, jwtVerify, decodeJwt } from 'jose'\n\nexport interface JwtPayload {\n clientKey: string\n iat?: number\n exp?: number\n}\n\n/**\n * Creates a JWT token for server-side authentication.\n * The token is valid for 1 hour by default.\n */\nexport async function createServerToken(\n clientKey: string,\n secretKey: string,\n expiresIn: string = '1h',\n): Promise<string> {\n if (!clientKey || !secretKey) {\n throw new Error('clientKey and secretKey are required.')\n }\n\n const secret = new TextEncoder().encode(secretKey)\n return new SignJWT({ clientKey })\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuedAt()\n .setExpirationTime(expiresIn)\n .sign(secret)\n}\n\n/**\n * Verifies a JWT token and returns the payload.\n */\nexport async function verifyServerToken(\n token: string,\n secretKey: string,\n): Promise<JwtPayload> {\n if (!token || !secretKey) {\n throw new Error('token and secretKey are required.')\n }\n\n const secret = new TextEncoder().encode(secretKey)\n const { payload } = await jwtVerify(token, secret, {\n algorithms: ['HS256'],\n })\n\n if (!payload.clientKey || typeof payload.clientKey !== 'string') {\n throw new Error('Invalid token payload: clientKey is missing')\n }\n\n return {\n clientKey: payload.clientKey as string,\n iat: payload.iat,\n exp: payload.exp,\n }\n}\n\n/**\n * Decodes a JWT token without verification.\n * WARNING: Use this only when you need to inspect token contents.\n * Always use verifyServerToken for authentication.\n */\nexport function decodeServerToken(token: string): JwtPayload {\n if (!token) {\n throw new Error('token is required.')\n }\n\n const payload = decodeJwt(token)\n\n if (!payload.clientKey || typeof payload.clientKey !== 'string') {\n throw new Error('Invalid token payload: clientKey is missing')\n }\n\n return {\n clientKey: payload.clientKey as string,\n iat: payload.iat,\n exp: payload.exp,\n }\n}\n","/**\n * Creates a Base64-encoded API key from clientKey and secretKey.\n */\nexport function createApiKey(clientKey: string, secretKey: string): string {\n if (!clientKey || !secretKey) {\n throw new Error('clientKey and secretKey are required.')\n }\n\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(`${clientKey}:${secretKey}`).toString('base64')\n }\n return btoa(`${clientKey}:${secretKey}`)\n}\n\n/**\n * Parses a Base64-encoded API key to extract clientKey and secretKey.\n */\nexport function parseApiKey(apiKey: string): {\n clientKey: string\n secretKey: string\n} {\n if (!apiKey) {\n throw new Error('apiKey is required.')\n }\n\n try {\n let decoded: string\n if (typeof Buffer !== 'undefined') {\n decoded = Buffer.from(apiKey, 'base64').toString('utf-8')\n } else {\n decoded = atob(apiKey)\n }\n\n const colonIndex = decoded.indexOf(':')\n if (colonIndex === -1) {\n throw new Error('Invalid format: missing colon separator')\n }\n\n const clientKey = decoded.substring(0, colonIndex)\n const secretKey = decoded.substring(colonIndex + 1)\n\n if (!clientKey || !secretKey) {\n throw new Error('Invalid format: empty clientKey or secretKey')\n }\n\n return { clientKey, secretKey }\n } catch {\n throw new Error('Invalid API key. Expected Base64 encoded \"clientKey:secretKey\"')\n }\n}\n","// ============================================================================\n// Error Classes\n// ============================================================================\n\nexport class SDKError extends Error {\n readonly code: string\n readonly status?: number\n readonly details?: unknown\n readonly userMessage?: string\n readonly suggestion?: string\n\n constructor(\n code: string,\n message: string,\n status?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n this.code = code\n this.status = status\n this.details = details\n this.userMessage = userMessage\n this.suggestion = suggestion\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SDKError)\n }\n }\n\n getUserMessage(): string {\n return this.userMessage || this.message\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n userMessage: this.userMessage,\n suggestion: this.suggestion,\n }\n }\n}\n\nexport class NetworkError extends SDKError {\n constructor(\n message: string,\n status?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('NETWORK_ERROR', message, status, details, userMessage, suggestion)\n this.name = 'NetworkError'\n }\n}\n\nexport class ValidationError extends SDKError {\n constructor(\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('VALIDATION_ERROR', message, 400, details, userMessage, suggestion)\n this.name = 'ValidationError'\n }\n}\n\nexport class ApiError extends SDKError {\n constructor(\n message: string,\n status: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('API_ERROR', message, status, details, userMessage, suggestion)\n this.name = 'ApiError'\n }\n}\n\nexport class ConfigError extends SDKError {\n constructor(\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('CONFIG_ERROR', message, undefined, details, userMessage, suggestion)\n this.name = 'ConfigError'\n }\n}\n\nexport class TimeoutError extends SDKError {\n constructor(\n message = 'Request timed out.',\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('TIMEOUT_ERROR', message, 408, details, userMessage, suggestion)\n this.name = 'TimeoutError'\n }\n}\n\nexport class GoneError extends SDKError {\n constructor(\n message = 'The requested resource is no longer available.',\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('GONE_ERROR', message, 410, details, userMessage, suggestion)\n this.name = 'GoneError'\n }\n}\n\nexport class ServiceUnavailableError extends SDKError {\n readonly retryAfter?: number\n\n constructor(\n message = 'Service temporarily unavailable.',\n retryAfter?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('SERVICE_UNAVAILABLE_ERROR', message, 503, details, userMessage, suggestion)\n this.name = 'ServiceUnavailableError'\n this.retryAfter = retryAfter\n }\n}\n\nexport class UsageLimitError extends SDKError {\n readonly usage: { limit: number; current: number; remaining: number }\n\n constructor(\n message: string,\n usage: { limit: number; current: number; remaining: number },\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('USAGE_LIMIT_ERROR', message, 429, details, userMessage, suggestion)\n this.name = 'UsageLimitError'\n this.usage = usage\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n usage: this.usage,\n }\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isSDKError(error: unknown): error is SDKError {\n return error instanceof SDKError\n}\n\nexport function isNetworkError(error: unknown): error is NetworkError {\n return error instanceof NetworkError\n}\n\nexport function isValidationError(error: unknown): error is ValidationError {\n return error instanceof ValidationError\n}\n\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError\n}\n\nexport function isConfigError(error: unknown): error is ConfigError {\n return error instanceof ConfigError\n}\n\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError\n}\n\nexport function isGoneError(error: unknown): error is GoneError {\n return error instanceof GoneError\n}\n\nexport function isServiceUnavailableError(error: unknown): error is ServiceUnavailableError {\n return error instanceof ServiceUnavailableError\n}\n\nexport function isUsageLimitError(error: unknown): error is UsageLimitError {\n return error instanceof UsageLimitError\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport const createNetworkError = (\n message: string,\n status?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new NetworkError(message, status, details, userMessage, suggestion)\n\nexport const createValidationError = (\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ValidationError(message, details, userMessage, suggestion)\n\nexport const createApiError = (\n message: string,\n status: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ApiError(message, status, details, userMessage, suggestion)\n\nexport const createConfigError = (\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ConfigError(message, details, userMessage, suggestion)\n\nexport const createTimeoutError = (\n message?: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new TimeoutError(message, details, userMessage, suggestion)\n\nexport const createGoneError = (\n message?: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new GoneError(message, details, userMessage, suggestion)\n\nexport const createServiceUnavailableError = (\n message?: string,\n retryAfter?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ServiceUnavailableError(message, retryAfter, details, userMessage, suggestion)\n\nexport const createUsageLimitError = (\n message: string,\n usage: { limit: number; current: number; remaining: number },\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new UsageLimitError(message, usage, details, userMessage, suggestion)\n","import type { Sort, Where } from 'payload'\nimport type { SDKError } from '../internal/errors'\nimport type { Collection, PublicCollection } from '../collection/const'\n\nexport type { Collection, PublicCollection }\n\n// ============================================================================\n// Environment & API URL Configuration\n// ============================================================================\n\nexport type Environment = 'local' | 'development' | 'staging' | 'production'\n\nexport const API_URLS: Record<Environment, string> = {\n local: 'http://localhost:3000',\n development: 'https://api-dev.01.software',\n staging: 'https://api-stg.01.software',\n production: 'https://api.01.software',\n}\n\n/**\n * 환경에 맞는 API URL을 반환합니다.\n * 우선순위: baseUrl > environment > 환경변수 > 기본값(production)\n */\nexport function resolveApiUrl(config?: {\n baseUrl?: string\n environment?: Environment\n}): string {\n // 1. 직접 지정된 baseUrl이 있으면 사용\n if (config?.baseUrl) {\n return config.baseUrl.replace(/\\/$/, '') // trailing slash 제거\n }\n\n // 2. 환경변수로 지정된 URL이 있으면 사용\n const envUrl =\n process.env.SOFTWARE_API_URL || process.env.NEXT_PUBLIC_SOFTWARE_API_URL\n if (envUrl) {\n return envUrl.replace(/\\/$/, '')\n }\n\n // 3. environment 설정이 있으면 사용\n if (config?.environment) {\n return API_URLS[config.environment]\n }\n\n // 4. 기본값: production\n return API_URLS.production\n}\n\n// ============================================================================\n// Client Configuration\n// ============================================================================\n\nexport interface ClientBrowserConfig {\n clientKey: string\n /**\n * API 환경 설정.\n * - 'local': localhost:3000\n * - 'development': dev.01.software\n * - 'staging': stg.01.software\n * - 'production': api.01.software\n *\n * baseUrl이 설정되면 이 값은 무시됩니다.\n * @default 'production'\n */\n environment?: Environment\n /**\n * 커스텀 API URL. 설정 시 environment 값은 무시됩니다.\n * @example 'https://my-custom-api.example.com'\n */\n baseUrl?: string\n /**\n * Customer authentication options.\n * Used to initialize CustomerAuth on BrowserClient.\n */\n customer?: {\n /**\n * Automatically persist token in localStorage.\n * - `true`: uses default key `'customer-token'`\n * - `string`: uses the given string as localStorage key\n *\n * Handles SSR safely (no-op on server).\n * When set, `token` and `onTokenChange` are ignored.\n */\n persist?: boolean | string\n /** Initial token (e.g. from SSR cookie) */\n token?: string\n /** Called when token changes (login/logout) — use to persist in localStorage/cookie */\n onTokenChange?: (token: string | null) => void\n }\n}\n\nexport interface ClientServerConfig extends ClientBrowserConfig {\n secretKey: string\n}\n\nexport interface ClientMetadata {\n userAgent?: string\n timestamp: number\n}\n\nexport interface ClientState {\n metadata: ClientMetadata\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\nexport interface PaginationMeta {\n page: number\n limit: number\n totalDocs: number\n totalPages: number\n hasNextPage: boolean\n hasPrevPage: boolean\n pagingCounter: number\n prevPage: number | null\n nextPage: number | null\n}\n\n// ============================================================================\n// Payload CMS Native Response Types\n// ============================================================================\n\n/**\n * Payload CMS Find (List) Response\n * GET /api/{collection}\n */\nexport interface PayloadFindResponse<T = unknown> {\n docs: T[]\n totalDocs: number\n limit: number\n totalPages: number\n page: number\n pagingCounter: number\n hasPrevPage: boolean\n hasNextPage: boolean\n prevPage: number | null\n nextPage: number | null\n}\n\n/**\n * Payload CMS Create/Update Response\n * POST /api/{collection}\n * PATCH /api/{collection}/{id}\n */\nexport interface PayloadMutationResponse<T = unknown> {\n message: string\n doc: T\n errors?: unknown[]\n}\n\n// ============================================================================\n// Query Options\n// ============================================================================\n\nexport interface ApiQueryOptions {\n page?: number\n limit?: number\n sort?: Sort\n where?: Where\n depth?: number\n select?: Record<string, boolean>\n}\n\nexport interface ApiQueryReactOptions {\n keepPreviousData?: boolean\n}\n\n// ============================================================================\n// Debug & Retry Configuration\n// ============================================================================\n\nexport interface DebugConfig {\n logRequests?: boolean\n logResponses?: boolean\n logErrors?: boolean\n}\n\nexport interface RetryConfig {\n maxRetries?: number\n retryableStatuses?: number[]\n retryDelay?: (attempt: number) => number\n}\n\nexport interface ErrorLogger {\n log(error: SDKError | Error, context?: Record<string, unknown>): void\n}\n\n// ============================================================================\n// Collection Types (re-exported from collection/const)\n// ============================================================================\n\n// ============================================================================\n// Type Utilities\n// ============================================================================\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]\n}\n\nexport type ExtractArrayType<T> = T extends (infer U)[] ? U : never\n","import { createNetworkError, createUsageLimitError, createTimeoutError, TimeoutError, NetworkError } from '../errors'\nimport type { DebugConfig, RetryConfig } from '../../client/types'\nimport { API_URLS } from '../../client/types'\nimport { createServerToken } from './jwt'\n\nconst DEFAULT_TIMEOUT = 30000\nconst DEFAULT_RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504]\nconst NON_RETRYABLE_STATUSES = [401, 403, 404, 422]\nconst SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']\n\nexport interface FetchOptions extends RequestInit {\n clientKey?: string\n secretKey?: string\n customerToken?: string\n timeout?: number\n baseUrl?: string\n debug?: boolean | DebugConfig\n retry?: RetryConfig\n /** Called on 401 when customerToken is set. Return a new token to retry, or null to fail. */\n onUnauthorized?: () => Promise<string | null>\n}\n\nfunction debugLog(\n debug: boolean | DebugConfig | undefined,\n type: 'request' | 'response' | 'error',\n message: string,\n data?: unknown,\n) {\n if (!debug) return\n\n const shouldLog =\n debug === true ||\n (type === 'request' && (debug as DebugConfig).logRequests) ||\n (type === 'response' && (debug as DebugConfig).logResponses) ||\n (type === 'error' && (debug as DebugConfig).logErrors)\n\n if (shouldLog) {\n console.group(`[SDK ${type.toUpperCase()}] ${message}`)\n if (data) console.log(data)\n console.groupEnd()\n }\n}\n\nfunction getErrorSuggestion(status: number): string | undefined {\n if (status === 401) return 'Please check your authentication credentials.'\n if (status === 404) return 'The requested resource was not found.'\n if (status >= 500)\n return 'A server error occurred. Please try again later.'\n return undefined\n}\n\nasync function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport async function httpFetch(\n url: string,\n options?: FetchOptions,\n): Promise<Response> {\n const {\n clientKey,\n secretKey,\n customerToken,\n timeout = DEFAULT_TIMEOUT,\n baseUrl = API_URLS.production,\n debug,\n retry,\n onUnauthorized,\n ...requestInit\n } = options || {}\n\n const retryConfig = {\n maxRetries: retry?.maxRetries ?? 3,\n retryableStatuses: retry?.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES,\n retryDelay:\n retry?.retryDelay ??\n ((attempt: number) => Math.min(1000 * 2 ** attempt, 10000)),\n }\n\n // Generate JWT once before retry loop (token valid for 1h)\n let authToken: string | undefined\n if (secretKey && clientKey) {\n authToken = await createServerToken(clientKey, secretKey)\n } else if (customerToken) {\n authToken = customerToken\n }\n\n let lastError: Error | undefined\n let hasRetried401 = false\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n const headers = new Headers(requestInit.headers)\n\n if (clientKey) {\n headers.set('X-Client-Key', clientKey)\n }\n\n if (authToken) {\n headers.set('Authorization', `Bearer ${authToken}`)\n }\n\n if (!headers.has('Content-Type') && requestInit.body && !(requestInit.body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n // Redact sensitive headers for debug logging\n const redactedHeaders = Object.fromEntries(headers.entries())\n if (redactedHeaders['authorization']) {\n const token = redactedHeaders['authorization']\n redactedHeaders['authorization'] = token.length > 15\n ? `${token.slice(0, 15)}...****`\n : '****'\n }\n\n debugLog(debug, 'request', url, {\n method: requestInit.method || 'GET',\n headers: redactedHeaders,\n attempt: attempt + 1,\n })\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const response = await fetch(`${baseUrl}${url}`, {\n ...requestInit,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n debugLog(debug, 'response', url, {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n })\n\n if (!response.ok) {\n // Usage limit 429 — never retry (distinguished by X-Usage-Limit header)\n if (\n response.status === 429 &&\n response.headers.get('X-Usage-Limit')\n ) {\n const limit = parseInt(response.headers.get('X-Usage-Limit') || '0', 10)\n const current = parseInt(response.headers.get('X-Usage-Current') || '0', 10)\n const remaining = parseInt(response.headers.get('X-Usage-Remaining') || '0', 10)\n\n throw createUsageLimitError(\n `Monthly API usage limit exceeded (${current.toLocaleString()}/${limit.toLocaleString()})`,\n { limit, current, remaining },\n { url, method: requestInit.method || 'GET', attempt: attempt + 1 },\n 'Monthly API call limit exceeded. Please upgrade your plan.',\n 'Upgrade your tenant plan to increase the monthly API call limit.',\n )\n }\n\n // Auto-refresh customer token on 401\n if (response.status === 401 && onUnauthorized && customerToken && !hasRetried401) {\n hasRetried401 = true\n try {\n const newToken = await onUnauthorized()\n if (newToken) {\n authToken = newToken\n continue\n }\n } catch {\n // Refresh failed, fall through to throw\n }\n }\n\n // Never retry non-retryable statuses regardless of user config\n if (NON_RETRYABLE_STATUSES.includes(response.status)) {\n throw createNetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n { url, method: requestInit.method || 'GET', attempt: attempt + 1 },\n `Request failed (status: ${response.status})`,\n getErrorSuggestion(response.status),\n )\n }\n\n const error = createNetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n { url, method: requestInit.method || 'GET', attempt: attempt + 1 },\n `Request failed (status: ${response.status})`,\n getErrorSuggestion(response.status),\n )\n\n const method = (requestInit.method || 'GET').toUpperCase()\n if (\n attempt < retryConfig.maxRetries &&\n SAFE_METHODS.includes(method) &&\n retryConfig.retryableStatuses.includes(response.status)\n ) {\n lastError = error\n const retryDelay = retryConfig.retryDelay(attempt)\n debugLog(debug, 'error', `Retrying in ${retryDelay}ms...`, error)\n await delay(retryDelay)\n continue\n }\n\n throw error\n }\n\n return response\n } catch (error) {\n debugLog(debug, 'error', url, error)\n\n const method = (requestInit.method || 'GET').toUpperCase()\n const isSafe = SAFE_METHODS.includes(method)\n\n if (error instanceof Error && error.name === 'AbortError') {\n const timeoutError = createTimeoutError(\n `Request timed out after ${timeout}ms.`,\n { url, timeout, attempt: attempt + 1 },\n 'The request timed out.',\n 'Please check your network connection or try again later.',\n )\n\n if (isSafe && attempt < retryConfig.maxRetries) {\n lastError = timeoutError\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw timeoutError\n }\n\n if (error instanceof TypeError) {\n const networkError = createNetworkError(\n 'Network connection failed.',\n undefined,\n { url, originalError: error.message, attempt: attempt + 1 },\n 'Network connection failed.',\n 'Please check your internet connection and try again.',\n )\n\n if (isSafe && attempt < retryConfig.maxRetries) {\n lastError = networkError\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw networkError\n }\n\n if (error instanceof NetworkError || error instanceof TimeoutError) {\n if (\n isSafe &&\n attempt < retryConfig.maxRetries &&\n error.status &&\n !NON_RETRYABLE_STATUSES.includes(error.status) &&\n retryConfig.retryableStatuses.includes(error.status)\n ) {\n lastError = error\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw error\n }\n\n const unknownError = createNetworkError(\n error instanceof Error\n ? error.message\n : 'An unknown network error occurred.',\n undefined,\n { url, originalError: error, attempt: attempt + 1 },\n 'An unknown error occurred.',\n 'Please try again later.',\n )\n\n if (isSafe && attempt < retryConfig.maxRetries) {\n lastError = unknownError\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw unknownError\n }\n }\n\n throw lastError ?? new NetworkError('Request failed after retries')\n}\n\n","import { httpFetch } from '../internal/utils'\nimport { createApiError, createConfigError } from '../internal/errors'\n\nexport interface ServerApiOptions {\n clientKey: string\n secretKey: string\n baseUrl?: string\n}\n\nexport abstract class BaseApi {\n protected readonly clientKey: string\n protected readonly secretKey: string\n protected readonly baseUrl?: string\n\n constructor(apiName: string, options: ServerApiOptions) {\n if (!options.clientKey) {\n throw createConfigError(`clientKey is required for ${apiName}.`)\n }\n if (!options.secretKey) {\n throw createConfigError(`secretKey is required for ${apiName}.`)\n }\n\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n this.baseUrl = options.baseUrl\n }\n\n protected async request<T>(endpoint: string, body: unknown): Promise<T> {\n const response = await httpFetch(endpoint, {\n method: 'POST',\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n baseUrl: this.baseUrl,\n body: JSON.stringify(body),\n })\n\n let data: Record<string, unknown>\n try {\n data = await response.json()\n } catch {\n throw createApiError(\n `Invalid JSON response from ${endpoint}`,\n response.status,\n undefined,\n 'Server returned an invalid response.',\n 'Check if the API endpoint is available.',\n )\n }\n\n if (data.error) {\n const errorMessage = typeof data.error === 'string' ? data.error : 'Unknown API error'\n throw createApiError(\n errorMessage,\n response.status,\n data,\n errorMessage,\n 'An error occurred while processing the request.',\n )\n }\n\n return data as T\n }\n}\n","import type { Order, OrderProduct, Transaction, Fulfillment, Return, Exchange } from '../../payload-types'\nimport { BaseApi, type ServerApiOptions } from './base-api'\n\nexport type OrderApiOptions = ServerApiOptions\n\nexport type CreateOrderParams = {\n orderNumber: string\n customer?: string\n customerSnapshot: {\n name?: string\n email: string\n phone?: string\n }\n shippingAddress: Order['shippingAddress']\n orderProducts: Omit<\n OrderProduct,\n 'id' | 'brand' | 'createdAt' | 'updatedAt' | 'order' | 'status'\n >[]\n totalAmount: number\n shippingFee?: number\n paymentId?: string\n discountCode?: string\n}\n\nexport type UpdateOrderParams = {\n orderNumber: string\n status: Order['status']\n}\n\nexport type UpdateTransactionParams = {\n paymentId: string\n status: Transaction['status']\n paymentMethod?: string\n receiptUrl?: string\n}\n\nexport type CheckoutParams = {\n cartId: string\n orderNumber: string\n customerSnapshot: {\n name?: string\n email: string\n phone?: string\n }\n paymentId?: string\n discountCode?: string\n}\n\nexport type ValidateDiscountParams = {\n code: string\n orderAmount: number\n customerId?: string\n}\n\nexport type ValidateDiscountResult = {\n valid: boolean\n code: string\n type?: 'percentage' | 'fixed_amount' | 'free_shipping' | 'tiered'\n discountAmount: number\n freeShipping?: boolean\n reason?: string\n}\n\nexport type CalculateShippingParams = {\n shippingPolicyId?: string\n orderAmount: number\n postalCode?: string\n}\n\nexport type CalculateShippingResult = {\n shippingFee: number\n baseFee: number\n extraFee: number\n freeShipping: boolean\n freeShippingThreshold: number | null\n isJeju: boolean\n}\n\nexport type CreateFulfillmentParams = {\n orderNumber: string\n carrier?: string\n trackingNumber?: string\n items: Array<{\n orderProduct: string\n quantity: number\n }>\n}\n\nexport type UpdateFulfillmentParams = {\n fulfillmentId: string\n status: 'packed' | 'shipped' | 'delivered' | 'failed'\n carrier?: string\n trackingNumber?: string\n}\n\nexport type GetOrderParams = {\n orderNumber: string\n}\n\nexport type CreateReturnParams = {\n orderNumber: string\n reason?: 'change_of_mind' | 'defective' | 'wrong_delivery' | 'damaged' | 'other'\n reasonDetail?: string\n returnProducts: Array<{\n orderProduct: string\n quantity: number\n }>\n refundAmount: number\n}\n\nexport type UpdateReturnParams = {\n returnId: string\n status: 'processing' | 'approved' | 'rejected' | 'completed'\n}\n\nexport type ReturnWithRefundParams = {\n orderNumber: string\n reason?: 'change_of_mind' | 'defective' | 'wrong_delivery' | 'damaged' | 'other'\n reasonDetail?: string\n returnProducts: Array<{\n orderProduct: string\n quantity: number\n }>\n refundAmount: number\n paymentId: string\n refundReceiptUrl?: string\n}\n\nexport type CreateExchangeParams = {\n orderNumber: string\n reason?: 'wrong_size' | 'wrong_color' | 'defective' | 'other'\n reasonDetail?: string\n exchangeProducts: Array<{\n orderProduct: string\n quantity: number\n }>\n}\n\nexport type UpdateExchangeParams = {\n exchangeId: string\n status: 'processing' | 'shipped' | 'completed' | 'rejected'\n}\n\nexport class OrderApi extends BaseApi {\n constructor(options: OrderApiOptions) {\n super('OrderApi', options)\n }\n\n createOrder(params: CreateOrderParams): Promise<Order> {\n return this.request<Order>('/api/orders/create', params)\n }\n\n updateOrder(params: UpdateOrderParams): Promise<Order> {\n return this.request<Order>('/api/orders/update', params)\n }\n\n getOrder(params: GetOrderParams): Promise<Order> {\n return this.request<Order>('/api/orders/get', params)\n }\n\n updateTransaction(params: UpdateTransactionParams): Promise<Transaction> {\n return this.request<Transaction>('/api/transactions/update', params)\n }\n\n checkout(params: CheckoutParams): Promise<Order> {\n return this.request<Order>('/api/orders/checkout', params)\n }\n\n createFulfillment(params: CreateFulfillmentParams): Promise<Fulfillment> {\n return this.request<Fulfillment>('/api/orders/create-fulfillment', params)\n }\n\n updateFulfillment(params: UpdateFulfillmentParams): Promise<Fulfillment> {\n return this.request<Fulfillment>('/api/orders/update-fulfillment', params)\n }\n\n returnWithRefund(params: ReturnWithRefundParams): Promise<{ return: Return; transaction: Transaction | null }> {\n return this.request<{ return: Return; transaction: Transaction | null }>('/api/returns/return-refund', params)\n }\n\n createReturn(params: CreateReturnParams): Promise<Return> {\n return this.request<Return>('/api/returns/create', params)\n }\n\n updateReturn(params: UpdateReturnParams): Promise<Return> {\n return this.request<Return>('/api/returns/update', params)\n }\n\n validateDiscount(params: ValidateDiscountParams): Promise<ValidateDiscountResult> {\n return this.request<ValidateDiscountResult>('/api/discounts/validate', params)\n }\n\n calculateShipping(params: CalculateShippingParams): Promise<CalculateShippingResult> {\n return this.request<CalculateShippingResult>('/api/shipping-policies/calculate', params)\n }\n\n createExchange(params: CreateExchangeParams): Promise<Exchange> {\n return this.request<Exchange>('/api/exchanges/create', params)\n }\n\n updateExchange(params: UpdateExchangeParams): Promise<Exchange> {\n return this.request<Exchange>('/api/exchanges/update', params)\n }\n}\n","import type { Cart, CartItem } from '../../payload-types'\nimport { httpFetch } from '../internal/utils'\nimport { createApiError, createConfigError } from '../internal/errors'\n\nexport interface CartApiOptions {\n clientKey: string\n secretKey?: string\n customerToken?: string | (() => string | null)\n baseUrl?: string\n onUnauthorized?: () => Promise<string | null>\n}\n\nexport type AddItemParams = {\n cartId: string\n product: string\n variant: string\n option: string\n quantity: number\n}\n\nexport type UpdateItemParams = {\n cartItemId: string\n quantity: number\n}\n\nexport type RemoveItemParams = {\n cartItemId: string\n}\n\nexport type ApplyDiscountParams = {\n cartId: string\n discountCode: string\n}\n\nexport type RemoveDiscountParams = {\n cartId: string\n}\n\nexport type ClearCartParams = {\n cartId: string\n}\n\nexport class CartApi {\n private readonly clientKey: string\n private readonly secretKey?: string\n private readonly customerToken?: string | (() => string | null)\n private readonly baseUrl?: string\n private readonly onUnauthorized?: () => Promise<string | null>\n\n constructor(options: CartApiOptions) {\n if (!options.clientKey) {\n throw createConfigError('clientKey is required for CartApi.')\n }\n if (!options.secretKey && !options.customerToken) {\n throw createConfigError('Either secretKey or customerToken is required for CartApi.')\n }\n\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n this.customerToken = options.customerToken\n this.baseUrl = options.baseUrl\n this.onUnauthorized = options.onUnauthorized\n }\n\n private async execute<T>(endpoint: string, method: 'GET' | 'POST', body?: unknown): Promise<T> {\n const token = typeof this.customerToken === 'function'\n ? this.customerToken()\n : this.customerToken\n\n const response = await httpFetch(endpoint, {\n method,\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n customerToken: token ?? undefined,\n baseUrl: this.baseUrl,\n ...(token && this.onUnauthorized && { onUnauthorized: this.onUnauthorized }),\n ...(body !== undefined && { body: JSON.stringify(body) }),\n })\n\n let data: Record<string, unknown>\n try {\n data = await response.json()\n } catch {\n throw createApiError(\n `Invalid JSON response from ${endpoint}`,\n response.status,\n undefined,\n 'Server returned an invalid response.',\n 'Check if the API endpoint is available.',\n )\n }\n\n if (data.error) {\n const errorMessage = typeof data.error === 'string' ? data.error : 'Unknown API error'\n throw createApiError(\n errorMessage,\n response.status,\n data,\n errorMessage,\n 'An error occurred while processing the request.',\n )\n }\n\n return data as T\n }\n\n getCart(cartId: string): Promise<Cart> {\n return this.execute<Cart>(`/api/carts/${cartId}`, 'GET')\n }\n\n addItem(params: AddItemParams): Promise<CartItem> {\n return this.execute<CartItem>('/api/carts/add-item', 'POST', params)\n }\n\n updateItem(params: UpdateItemParams): Promise<CartItem> {\n return this.execute<CartItem>('/api/carts/update-item', 'POST', params)\n }\n\n removeItem(params: RemoveItemParams): Promise<{ success: boolean }> {\n return this.execute<{ success: boolean }>('/api/carts/remove-item', 'POST', params)\n }\n\n applyDiscount(params: ApplyDiscountParams): Promise<Cart> {\n return this.execute<Cart>('/api/carts/apply-discount', 'POST', params)\n }\n\n removeDiscount(params: RemoveDiscountParams): Promise<Cart> {\n return this.execute<Cart>('/api/carts/remove-discount', 'POST', params)\n }\n\n clearCart(params: ClearCartParams): Promise<{ success: boolean }> {\n return this.execute<{ success: boolean }>('/api/carts/clear', 'POST', params)\n }\n}\n","import { BaseApi, type ServerApiOptions } from './base-api'\n\nexport type ProductApiOptions = ServerApiOptions\n\nexport type StockCheckParams = {\n items: Array<{\n optionId: string\n quantity: number\n }>\n}\n\nexport type StockCheckResult = {\n optionId: string\n available: boolean\n availableStock: number\n requestedQuantity: number\n error?: string\n}\n\nexport type StockCheckResponse = {\n results: StockCheckResult[]\n allAvailable: boolean\n}\n\nexport class ProductApi extends BaseApi {\n constructor(options: ProductApiOptions) {\n super('ProductApi', options)\n }\n\n stockCheck(params: StockCheckParams): Promise<StockCheckResponse> {\n return this.request<StockCheckResponse>('/api/products/stock-check', params)\n }\n}\n","/**\n * Resolves a Payload CMS relation field value.\n * When depth is 0, relation fields return just the ID (string or number).\n * When depth > 0, they return the full document object (T).\n * This utility normalizes both cases to T | null.\n *\n * @param ref - The relation field value (T, string, number, null, or undefined)\n * @returns The resolved document object, or null if not populated\n */\nexport const resolveRelation = <T>(ref: T | string | number | null | undefined): T | null => {\n if (typeof ref === 'string' || typeof ref === 'number' || ref === null || ref === undefined)\n return null\n return ref\n}\n","import type { Metadata } from 'next'\nimport { resolveRelation } from '../../utils/types'\n\nexport interface ImageLike {\n url?: string | null\n width?: number | null\n height?: number | null\n alt?: string | null\n sizes?: Record<string, { url?: string | null; width?: number | null; height?: number | null } | undefined>\n}\n\nexport interface SeoInput {\n title?: string | null\n description?: string | null\n noIndex?: boolean | null\n canonical?: string | null\n openGraph?: {\n title?: string | null\n description?: string | null\n image?: ImageLike | string | null\n } | null\n}\n\nexport interface GenerateMetadataOptions {\n siteName?: string\n}\n\nexport function extractSeo(doc: Record<string, unknown>): SeoInput {\n const seo = (doc.seo ?? {}) as Record<string, unknown>\n const og = (seo.openGraph ?? {}) as Record<string, unknown>\n\n return {\n title: (seo.title as string) ?? (doc.title as string) ?? null,\n description: (seo.description as string) ?? null,\n noIndex: (seo.noIndex as boolean) ?? null,\n canonical: (seo.canonical as string) ?? null,\n openGraph: {\n title: (og.title as string) ?? null,\n description: (og.description as string) ?? null,\n image: (og.image as ImageLike | string | null) ?? null,\n },\n }\n}\n\nexport function generateMetadata(\n input: SeoInput,\n options?: GenerateMetadataOptions,\n): Metadata {\n const title = input.title ?? undefined\n const description = input.description ?? undefined\n\n const ogTitle = input.openGraph?.title ?? title\n const ogDescription = input.openGraph?.description ?? description\n const image = resolveMetaImage(input.openGraph?.image)\n\n return {\n title,\n description,\n ...(input.noIndex && { robots: { index: false, follow: false } }),\n ...(input.canonical && { alternates: { canonical: input.canonical } }),\n openGraph: {\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(options?.siteName && { siteName: options.siteName }),\n ...(image && { images: [image] }),\n },\n twitter: {\n card: image ? 'summary_large_image' : 'summary',\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(image && { images: [image.url] }),\n },\n }\n}\n\nfunction resolveMetaImage(\n ref: ImageLike | string | null | undefined,\n): { url: string; width?: number; height?: number; alt?: string } | null {\n const image = resolveRelation<ImageLike>(ref)\n if (!image) return null\n\n // Prefer sizes['1536'] (closest to OG 1200px standard), fallback to original url\n const sized = image.sizes?.['1536']\n const url = sized?.url || image.url\n if (!url) return null\n\n const width = sized?.url ? sized.width : image.width\n const height = sized?.url ? sized.height : image.height\n\n return {\n url,\n ...(width && { width }),\n ...(height && { height }),\n ...(image.alt && { alt: image.alt }),\n }\n}\n","import type { Metadata } from 'next'\nimport type {\n ApiQueryOptions,\n PublicCollection,\n PayloadFindResponse,\n PayloadMutationResponse,\n} from '../client/types'\nimport { generateMetadata, extractSeo } from '../metadata'\nimport type { GenerateMetadataOptions } from '../metadata'\nimport type { CollectionClient } from './collection-client'\nimport type { CollectionType } from './types'\n\n/**\n * Read-only subset of CollectionQueryBuilder.\n * BrowserClient.from() returns this type to prevent write operations at compile time.\n */\nexport type ReadOnlyQueryBuilder<T extends PublicCollection> = Pick<\n CollectionQueryBuilder<T>,\n 'find' | 'findById' | 'count' | 'findMetadata' | 'findMetadataById'\n>\n\nexport class CollectionQueryBuilder<T extends PublicCollection> {\n constructor(\n private api: CollectionClient,\n private collection: T,\n ) {}\n\n /**\n * Find documents (list query)\n * GET /api/{collection}\n * @returns Payload CMS find response with docs array and pagination\n */\n async find(options?: ApiQueryOptions): Promise<PayloadFindResponse<CollectionType<T>>> {\n return this.api.requestFind<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n options,\n )\n }\n\n /**\n * Find document by ID\n * GET /api/{collection}/{id}\n * @returns Document object directly (no wrapper)\n */\n async findById(\n id: string,\n options?: ApiQueryOptions,\n ): Promise<CollectionType<T>> {\n return this.api.requestFindById<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n options,\n )\n }\n\n /**\n * Create a new document\n * POST /api/{collection}\n * @returns Payload CMS mutation response with doc and message\n */\n async create(\n data: Partial<CollectionType<T>>,\n options?: { file?: File | Blob; filename?: string },\n ): Promise<PayloadMutationResponse<CollectionType<T>>> {\n const endpoint = `/api/${String(this.collection)}`\n if (options?.file) {\n return this.api.requestCreateWithFile<CollectionType<T>>(\n endpoint, data, options.file, options.filename,\n )\n }\n return this.api.requestCreate<CollectionType<T>>(endpoint, data)\n }\n\n /**\n * Update a document by ID\n * PATCH /api/{collection}/{id}\n * @returns Payload CMS mutation response with doc and message\n */\n async update(\n id: string,\n data: Partial<CollectionType<T>>,\n options?: { file?: File | Blob; filename?: string },\n ): Promise<PayloadMutationResponse<CollectionType<T>>> {\n const endpoint = `/api/${String(this.collection)}/${String(id)}`\n if (options?.file) {\n return this.api.requestUpdateWithFile<CollectionType<T>>(\n endpoint, data, options.file, options.filename,\n )\n }\n return this.api.requestUpdate<CollectionType<T>>(endpoint, data)\n }\n\n /**\n * Count documents\n * GET /api/{collection}/count\n * @returns Count response with totalDocs\n */\n async count(options?: ApiQueryOptions): Promise<{ totalDocs: number }> {\n return this.api.requestCount(\n `/api/${String(this.collection)}/count`,\n options,\n )\n }\n\n /**\n * Find first matching document and return its Next.js Metadata.\n * Applies depth: 1 (image populate) and limit: 1 automatically.\n * @returns Metadata or null if no document matches\n */\n async findMetadata(\n options?: ApiQueryOptions,\n metadataOptions?: GenerateMetadataOptions,\n ): Promise<Metadata | null> {\n const { docs } = await this.find({ ...options, limit: 1, depth: 1 })\n const doc = docs[0]\n if (!doc) return null\n return generateMetadata(\n extractSeo(doc as unknown as Record<string, unknown>),\n metadataOptions,\n )\n }\n\n /**\n * Find document by ID and return its Next.js Metadata.\n * Applies depth: 1 (image populate) automatically.\n * @returns Metadata (throws on 404)\n */\n async findMetadataById(\n id: string,\n metadataOptions?: GenerateMetadataOptions,\n ): Promise<Metadata> {\n const doc = await this.findById(id, { depth: 1 })\n return generateMetadata(\n extractSeo(doc as unknown as Record<string, unknown>),\n metadataOptions,\n )\n }\n\n /**\n * Update multiple documents (bulk update)\n * PATCH /api/{collection}\n * @returns Payload CMS find response with updated docs\n */\n async updateMany(\n where: ApiQueryOptions['where'],\n data: Partial<CollectionType<T>>,\n ): Promise<PayloadFindResponse<CollectionType<T>>> {\n return this.api.requestUpdateMany<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n { where, data },\n )\n }\n\n /**\n * Delete a document by ID\n * DELETE /api/{collection}/{id}\n * @returns Deleted document object directly (no wrapper)\n */\n async remove(id: string): Promise<CollectionType<T>> {\n return this.api.requestDelete<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n )\n }\n\n /**\n * Delete multiple documents (bulk delete)\n * DELETE /api/{collection}\n * @returns Payload CMS find response with deleted docs\n */\n async removeMany(where: ApiQueryOptions['where']): Promise<PayloadFindResponse<CollectionType<T>>> {\n return this.api.requestDeleteMany<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n { where },\n )\n }\n}\n","import { stringify } from 'qs-esm'\nimport type { FetchOptions } from '../internal/utils'\nimport type {\n ApiQueryOptions,\n PayloadFindResponse,\n PayloadMutationResponse,\n} from '../client/types'\nimport { SDKError, createApiError, createValidationError } from '../internal/errors'\n\nexport class HttpClient {\n protected clientKey: string\n protected secretKey?: string\n protected baseUrl?: string\n private getCustomerToken?: () => string | null\n private onUnauthorized?: () => Promise<string | null>\n\n constructor(clientKey: string, secretKey?: string, baseUrl?: string, getCustomerToken?: () => string | null, onUnauthorized?: () => Promise<string | null>) {\n if (!clientKey) {\n throw createValidationError('clientKey is required.')\n }\n\n this.clientKey = clientKey\n this.secretKey = secretKey\n this.baseUrl = baseUrl\n this.getCustomerToken = getCustomerToken\n this.onUnauthorized = onUnauthorized\n }\n\n protected get defaultOptions(): FetchOptions {\n const opts: FetchOptions = { clientKey: this.clientKey, secretKey: this.secretKey, baseUrl: this.baseUrl }\n const token = this.getCustomerToken?.()\n if (token) {\n opts.customerToken = token\n if (this.onUnauthorized) {\n opts.onUnauthorized = this.onUnauthorized\n }\n }\n return opts\n }\n\n protected buildUrl(endpoint: string, options?: ApiQueryOptions): string {\n if (!options) return endpoint\n const queryString = stringify(options, { addQueryPrefix: true })\n return queryString ? `${endpoint}${queryString}` : endpoint\n }\n\n protected assertJsonResponse(response: Response): void {\n const contentType = response.headers.get('content-type')\n if (!contentType?.includes('application/json')) {\n throw createApiError('Response is not in JSON format.', response.status, { contentType })\n }\n }\n\n /**\n * Parse Payload CMS find response (list query)\n * Returns native Payload response structure\n */\n protected async parseFindResponse<T>(response: Response): Promise<PayloadFindResponse<T>> {\n const contentType = response.headers.get('content-type')\n\n try {\n this.assertJsonResponse(response)\n\n const jsonData = await response.json()\n\n // Validate it's a find response\n if (jsonData.docs === undefined) {\n throw createApiError('Invalid find response.', response.status, { jsonData })\n }\n\n return {\n docs: jsonData.docs,\n totalDocs: jsonData.totalDocs || 0,\n limit: jsonData.limit || 20,\n totalPages: jsonData.totalPages || 0,\n page: jsonData.page || 1,\n pagingCounter: jsonData.pagingCounter || 1,\n hasPrevPage: jsonData.hasPrevPage || false,\n hasNextPage: jsonData.hasNextPage || false,\n prevPage: jsonData.prevPage ?? null,\n nextPage: jsonData.nextPage ?? null,\n }\n } catch (error) {\n if (error instanceof SDKError) throw error\n throw createApiError('Failed to parse response.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n /**\n * Parse Payload CMS mutation response (create/update)\n * Returns native Payload response structure\n */\n protected async parseMutationResponse<T>(response: Response): Promise<PayloadMutationResponse<T>> {\n const contentType = response.headers.get('content-type')\n\n try {\n this.assertJsonResponse(response)\n\n const jsonData = await response.json()\n\n // Validate it's a mutation response\n if (jsonData.doc === undefined) {\n throw createApiError('Invalid mutation response.', response.status, { jsonData })\n }\n\n return {\n message: jsonData.message || '',\n doc: jsonData.doc,\n errors: jsonData.errors,\n }\n } catch (error) {\n if (error instanceof SDKError) throw error\n throw createApiError('Failed to parse response.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n /**\n * Parse Payload CMS document response (findById/delete)\n * Returns document directly without wrapper\n */\n protected async parseDocumentResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n\n try {\n this.assertJsonResponse(response)\n\n const jsonData = await response.json()\n return jsonData as T\n } catch (error) {\n if (error instanceof SDKError) throw error\n throw createApiError('Failed to parse response.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n}\n","import { HttpClient } from './http-client'\nimport type {\n ApiQueryOptions,\n PublicCollection,\n PayloadFindResponse,\n PayloadMutationResponse,\n} from '../client/types'\nimport { CollectionQueryBuilder } from './query-builder'\nimport { httpFetch } from '../internal/utils'\n\nfunction buildPayloadFormData(data: unknown, file: File | Blob, filename?: string): FormData {\n const formData = new FormData()\n formData.append('file', file, filename)\n if (data != null) {\n formData.append('_payload', JSON.stringify(data))\n }\n return formData\n}\n\nexport class CollectionClient extends HttpClient {\n constructor(clientKey: string, secretKey?: string, baseUrl?: string, getCustomerToken?: () => string | null, onUnauthorized?: () => Promise<string | null>) {\n super(clientKey, secretKey, baseUrl, getCustomerToken, onUnauthorized)\n }\n\n from<T extends PublicCollection>(collection: T): CollectionQueryBuilder<T> {\n return new CollectionQueryBuilder(this, collection)\n }\n\n // ============================================================================\n // Payload-native methods\n // ============================================================================\n\n /**\n * Find documents (list query)\n * GET /api/{collection}\n */\n async requestFind<T = unknown>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<PayloadFindResponse<T>> {\n const url = this.buildUrl(endpoint, options)\n const response = await httpFetch(url, { ...this.defaultOptions, method: 'GET' })\n return this.parseFindResponse<T>(response)\n }\n\n /**\n * Find document by ID\n * GET /api/{collection}/{id}\n */\n async requestFindById<T = unknown>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<T> {\n const url = this.buildUrl(endpoint, options)\n const response = await httpFetch(url, { ...this.defaultOptions, method: 'GET' })\n return this.parseDocumentResponse<T>(response)\n }\n\n /**\n * Create document\n * POST /api/{collection}\n */\n async requestCreate<T = unknown>(\n endpoint: string,\n data?: unknown,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'POST',\n body: data ? JSON.stringify(data) : undefined,\n })\n return this.parseMutationResponse<T>(response)\n }\n\n /**\n * Update document\n * PATCH /api/{collection}/{id}\n */\n async requestUpdate<T = unknown>(\n endpoint: string,\n data?: unknown,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'PATCH',\n body: data ? JSON.stringify(data) : undefined,\n })\n return this.parseMutationResponse<T>(response)\n }\n\n /**\n * Count documents\n * GET /api/{collection}/count\n */\n async requestCount(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<{ totalDocs: number }> {\n const url = this.buildUrl(endpoint, options)\n const response = await httpFetch(url, { ...this.defaultOptions, method: 'GET' })\n return this.parseDocumentResponse<{ totalDocs: number }>(response)\n }\n\n /**\n * Update multiple documents (bulk update)\n * PATCH /api/{collection}\n */\n async requestUpdateMany<T = unknown>(\n endpoint: string,\n data: { where?: unknown; data: unknown },\n ): Promise<PayloadFindResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'PATCH',\n body: JSON.stringify(data),\n })\n return this.parseFindResponse<T>(response)\n }\n\n /**\n * Delete document\n * DELETE /api/{collection}/{id}\n */\n async requestDelete<T = unknown>(endpoint: string): Promise<T> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'DELETE',\n })\n return this.parseDocumentResponse<T>(response)\n }\n\n /**\n * Delete multiple documents (bulk delete)\n * DELETE /api/{collection}\n */\n async requestDeleteMany<T = unknown>(\n endpoint: string,\n data: { where?: unknown },\n ): Promise<PayloadFindResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'DELETE',\n body: JSON.stringify(data),\n })\n return this.parseFindResponse<T>(response)\n }\n\n /**\n * Create document with file upload\n * POST /api/{collection} (multipart/form-data)\n */\n async requestCreateWithFile<T = unknown>(\n endpoint: string,\n data: unknown,\n file: File | Blob,\n filename?: string,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'POST',\n body: buildPayloadFormData(data, file, filename),\n })\n return this.parseMutationResponse<T>(response)\n }\n\n /**\n * Update document with file upload\n * PATCH /api/{collection}/{id} (multipart/form-data)\n */\n async requestUpdateWithFile<T = unknown>(\n endpoint: string,\n data: unknown,\n file: File | Blob,\n filename?: string,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'PATCH',\n body: buildPayloadFormData(data, file, filename),\n })\n return this.parseMutationResponse<T>(response)\n }\n\n}\n","import type { Config } from '../../payload-types'\n\n/**\n * Collection type derived from Payload Config.\n * This ensures type safety and automatic synchronization with payload-types.ts\n */\nexport type Collection = keyof Config['collections']\n\n/**\n * Internal collections that should not be exposed via SDK.\n * Includes Payload system collections and admin-only collections.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst INTERNAL_COLLECTIONS = [\n 'users',\n 'payload-kv',\n 'payload-locked-documents',\n 'payload-preferences',\n 'payload-migrations',\n 'field-configs',\n 'audiences',\n 'email-logs',\n 'api-usage',\n 'subscriptions',\n 'billing-history',\n 'post-authors',\n 'order-status-logs',\n] as const\n\ntype InternalCollection = (typeof INTERNAL_COLLECTIONS)[number]\n\n/**\n * Array of all public collection names for runtime use (e.g., Zod enum validation).\n * This is the single source of truth for which collections are publicly accessible via SDK.\n */\nexport const COLLECTIONS = [\n 'tenants',\n 'tenant-metadata',\n 'tenant-logos',\n 'tenant-og-images',\n 'products',\n 'product-variants',\n 'product-options',\n 'product-categories',\n 'product-tags',\n 'product-images',\n 'product-collections',\n 'brands',\n 'brand-logos',\n 'orders',\n 'order-products',\n 'returns',\n 'return-products',\n 'exchanges',\n 'exchange-products',\n 'fulfillments',\n 'fulfillment-items',\n 'transactions',\n 'customers',\n 'customer-addresses',\n 'customer-groups',\n 'customer-group-images',\n 'carts',\n 'cart-items',\n 'discounts',\n 'shipping-policies',\n 'documents',\n 'document-categories',\n 'document-types',\n 'document-images',\n 'posts',\n 'post-categories',\n 'post-tags',\n 'post-images',\n 'playlists',\n 'playlist-images',\n 'playlist-categories',\n 'playlist-tags',\n 'musics',\n 'galleries',\n 'gallery-images',\n 'gallery-categories',\n 'gallery-tags',\n 'flows',\n 'flow-images',\n 'flow-node-types',\n 'flow-edge-types',\n 'flow-categories',\n 'flow-tags',\n 'videos',\n 'video-images',\n 'video-categories',\n 'video-tags',\n 'live-streams',\n 'live-stream-images',\n 'forms',\n 'form-submissions',\n 'media',\n] as const\n\n/**\n * Public collections available for SDK access.\n * Derived from the COLLECTIONS array (single source of truth).\n */\nexport type PublicCollection = (typeof COLLECTIONS)[number]\n\n/**\n * Compile-time completeness check: every Config collection must be either public or internal.\n * If this fails, a new collection was added to Payload but not categorized.\n */\ntype _Uncategorized = Exclude<Collection, PublicCollection | InternalCollection>\nconst _assertAllCategorized: [_Uncategorized] extends [never] ? true : _Uncategorized = true\n","import { ApiError, NetworkError, TimeoutError } from '../internal/errors'\nimport type { PayloadFindResponse } from '../client/types'\nimport type { Order } from '../../payload-types'\nimport type {\n CustomerAuthResponse,\n CustomerRefreshResponse,\n CustomerRegisterData,\n CustomerLoginData,\n CustomerProfile,\n CustomerAuthOptions,\n UpdateProfileData,\n} from './types'\n\nconst DEFAULT_TIMEOUT = 15000\n\n/**\n * Customer authentication client for BrowserClient.\n *\n * Manages customer registration, login, logout, and token lifecycle.\n * All requests include X-Client-Key for tenant resolution.\n */\nexport class CustomerAuth {\n private clientKey: string\n private baseUrl: string\n private token: string | null\n private onTokenChange?: (token: string | null) => void\n private refreshPromise: Promise<CustomerRefreshResponse> | null = null\n\n constructor(clientKey: string, baseUrl: string, options?: CustomerAuthOptions) {\n this.clientKey = clientKey\n this.baseUrl = baseUrl\n\n if (options?.persist) {\n const key = typeof options.persist === 'string' ? options.persist : 'customer-token'\n const isBrowser = typeof window !== 'undefined'\n this.token = isBrowser ? (localStorage.getItem(key) ?? null) : null\n this.onTokenChange = isBrowser\n ? (token) => {\n if (token) localStorage.setItem(key, token)\n else localStorage.removeItem(key)\n }\n : undefined\n } else {\n this.token = options?.token ?? null\n this.onTokenChange = options?.onTokenChange\n }\n }\n\n /**\n * Register a new customer account\n */\n async register(data: CustomerRegisterData): Promise<{ customer: CustomerProfile }> {\n return this.requestJson('/api/customers/register', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Login with email and password. Stores the token internally.\n */\n async login(data: CustomerLoginData): Promise<CustomerAuthResponse> {\n const result: CustomerAuthResponse = await this.requestJson('/api/customers/login', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n\n this.setToken(result.token)\n return result\n }\n\n /**\n * Refresh the current token. Requires a valid (non-expired) token.\n */\n async refreshToken(): Promise<CustomerRefreshResponse> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n if (this.refreshPromise) return this.refreshPromise\n\n this.refreshPromise = this._doRefreshToken()\n try {\n return await this.refreshPromise\n } finally {\n this.refreshPromise = null\n }\n }\n\n private async _doRefreshToken(): Promise<CustomerRefreshResponse> {\n const result: CustomerRefreshResponse = await this.requestJson('/api/customers/refresh', {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.token}` },\n })\n\n this.setToken(result.token)\n return result\n }\n\n /**\n * Clear the stored token\n */\n logout(): void {\n this.setToken(null)\n }\n\n /**\n * Get the current authenticated customer's profile\n */\n async me(): Promise<CustomerProfile | null> {\n if (!this.token) return null\n\n try {\n const data = await this.requestJson<{ customer: CustomerProfile }>('/api/customers/me', {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.token}` },\n })\n return data.customer ?? null\n } catch (error) {\n if (error instanceof ApiError && error.status === 401) {\n this.setToken(null)\n return null\n }\n throw error\n }\n }\n\n /**\n * Request a password reset email\n */\n async forgotPassword(email: string): Promise<void> {\n await this.requestJson('/api/customers/forgot-password', {\n method: 'POST',\n body: JSON.stringify({ email }),\n })\n }\n\n /**\n * Reset password using a token from the reset email\n */\n async resetPassword(token: string, password: string): Promise<void> {\n await this.requestJson('/api/customers/reset-password', {\n method: 'POST',\n body: JSON.stringify({ token, password }),\n })\n }\n\n /**\n * Update the authenticated customer's profile (name, phone, marketingConsent)\n */\n async updateProfile(data: UpdateProfileData): Promise<CustomerProfile> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n const result = await this.requestJson<{ customer: CustomerProfile }>('/api/customers/me', {\n method: 'PATCH',\n headers: { Authorization: `Bearer ${this.token}` },\n body: JSON.stringify(data),\n })\n return result.customer\n }\n\n /**\n * Change the password of the currently authenticated customer\n */\n async changePassword(currentPassword: string, newPassword: string): Promise<void> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n await this.requestJson('/api/customers/change-password', {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.token}` },\n body: JSON.stringify({ currentPassword, newPassword }),\n })\n }\n\n /**\n * Verify email using the verification token\n */\n async verifyEmail(token: string): Promise<void> {\n await this.requestJson('/api/customers/verify-email', {\n method: 'POST',\n body: JSON.stringify({ token }),\n })\n }\n\n /**\n * Get the authenticated customer's orders with pagination and optional status filter\n */\n async getMyOrders(options?: { page?: number; limit?: number; status?: string }): Promise<PayloadFindResponse<Order>> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n const params = new URLSearchParams()\n if (options?.page) params.set('page', String(options.page))\n if (options?.limit) params.set('limit', String(options.limit))\n if (options?.status) params.set('status', options.status)\n\n const qs = params.toString()\n return this.requestJson(`/api/customers/me/orders${qs ? `?${qs}` : ''}`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.token}` },\n })\n }\n\n /**\n * Get the current token (or null if not authenticated)\n */\n getToken(): string | null {\n return this.token\n }\n\n /**\n * Set the token manually (e.g. from SSR)\n */\n setToken(token: string | null): void {\n this.token = token\n this.onTokenChange?.(token)\n }\n\n /**\n * Check if the customer is currently authenticated\n */\n isAuthenticated(): boolean {\n return this.token !== null\n }\n\n /**\n * Internal: make a request with timeout and error handling.\n * Auth endpoints don't retry — failures are final.\n */\n private async requestJson<T = unknown>(path: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n headers.set('X-Client-Key', this.clientKey)\n if (!headers.has('Content-Type') && init.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT)\n\n let res: Response\n try {\n res = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers,\n signal: controller.signal,\n })\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(\n `Request timed out after ${DEFAULT_TIMEOUT}ms`,\n { url: path, timeout: DEFAULT_TIMEOUT },\n )\n }\n\n throw new NetworkError(\n error instanceof Error ? error.message : 'Network request failed',\n undefined,\n { url: path },\n 'Network connection failed.',\n 'Please check your internet connection and try again.',\n )\n }\n\n clearTimeout(timeoutId)\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n throw new ApiError(\n body.error || `HTTP ${res.status}`,\n res.status,\n body.details,\n body.error,\n )\n }\n\n try {\n return await res.json()\n } catch {\n throw new ApiError('Invalid JSON response from server', res.status, undefined, 'INVALID_RESPONSE')\n }\n }\n}\n","import { isServer, QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query'\n\nfunction makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // Infinite staleTime: server-fetched data persists until explicitly invalidated.\n // For browser clients needing fresher data, override per-query:\n // useQuery({ ..., staleTime: 5 * 60 * 1000 })\n staleTime: Number.POSITIVE_INFINITY,\n refetchOnWindowFocus: false,\n },\n dehydrate: {\n shouldDehydrateQuery: (query) =>\n defaultShouldDehydrateQuery(query) || query.state.status === 'pending',\n shouldRedactErrors: () => false,\n },\n },\n })\n}\n\nlet browserQueryClient: QueryClient | undefined\n\nexport function getQueryClient() {\n if (isServer) {\n return makeQueryClient()\n }\n if (!browserQueryClient) {\n browserQueryClient = makeQueryClient()\n }\n return browserQueryClient\n}\n","import {\n QueryClient,\n useQuery as useQueryOriginal,\n useSuspenseQuery as useSuspenseQueryOriginal,\n useInfiniteQuery as useInfiniteQueryOriginal,\n useSuspenseInfiniteQuery as useSuspenseInfiniteQueryOriginal,\n useMutation as useMutationOriginal,\n} from '@tanstack/react-query'\nimport type { PublicCollection, ApiQueryOptions, PayloadFindResponse, PayloadMutationResponse } from '../client/types'\nimport { type CollectionClient, type CollectionType } from '../collection'\nimport { SDKError } from '../internal/errors'\nimport { collectionKeys } from './query-keys'\n\n// ============================================================================\n// Query Params Types\n// ============================================================================\n\nexport interface CollectionQueryParams<T extends PublicCollection> {\n collection: T\n options?: ApiQueryOptions\n}\n\nexport interface CollectionDetailQueryParams<T extends PublicCollection> {\n collection: T\n id: string\n options?: ApiQueryOptions\n}\n\nexport interface CollectionInfiniteQueryParams<T extends PublicCollection> {\n collection: T\n options?: Omit<ApiQueryOptions, 'page'>\n pageSize?: number\n}\n\n// ============================================================================\n// Shared option types\n// ============================================================================\n\ninterface QueryOptions {\n enabled?: boolean\n staleTime?: number\n gcTime?: number\n refetchOnWindowFocus?: boolean\n refetchOnMount?: boolean\n refetchInterval?: number | false\n retry?: boolean | number\n}\n\ntype SuspenseQueryOptions = Omit<QueryOptions, 'enabled'>\n\ninterface MutationCallbacks<TData> {\n onSuccess?: (data: TData) => void\n onError?: (error: SDKError) => void\n onSettled?: () => void\n}\n\n// ============================================================================\n// Collection Hooks Mixin\n// ============================================================================\n\nconst DEFAULT_PAGE_SIZE = 20\n\nexport class CollectionHooks {\n protected queryClient: QueryClient\n protected collectionClient: CollectionClient\n\n constructor(queryClient: QueryClient, collectionClient: CollectionClient) {\n this.queryClient = queryClient\n this.collectionClient = collectionClient\n }\n\n // ===== useQuery =====\n useQuery<T extends PublicCollection>(\n params: CollectionQueryParams<T>,\n options?: QueryOptions,\n ) {\n const { collection, options: queryOptions } = params\n\n return useQueryOriginal({\n queryKey: collectionKeys(collection).list(queryOptions),\n queryFn: async () => {\n const response = await this.collectionClient.from(collection).find(queryOptions)\n return response.docs ?? []\n },\n ...options,\n })\n }\n\n // ===== useSuspenseQuery =====\n useSuspenseQuery<T extends PublicCollection>(\n params: CollectionQueryParams<T>,\n options?: SuspenseQueryOptions,\n ) {\n const { collection, options: queryOptions } = params\n\n return useSuspenseQueryOriginal({\n queryKey: collectionKeys(collection).list(queryOptions),\n queryFn: async () => {\n const response = await this.collectionClient.from(collection).find(queryOptions)\n return response.docs ?? []\n },\n ...options,\n })\n }\n\n // ===== useQueryById =====\n useQueryById<T extends PublicCollection>(\n params: CollectionDetailQueryParams<T>,\n options?: QueryOptions,\n ) {\n const { collection, id, options: queryOptions } = params\n\n return useQueryOriginal({\n queryKey: collectionKeys(collection).detail(id, queryOptions),\n queryFn: async () => {\n return await this.collectionClient.from(collection).findById(id, queryOptions)\n },\n ...options,\n })\n }\n\n // ===== useSuspenseQueryById =====\n useSuspenseQueryById<T extends PublicCollection>(\n params: CollectionDetailQueryParams<T>,\n options?: SuspenseQueryOptions,\n ) {\n const { collection, id, options: queryOptions } = params\n\n return useSuspenseQueryOriginal({\n queryKey: collectionKeys(collection).detail(id, queryOptions),\n queryFn: async () => {\n return await this.collectionClient.from(collection).findById(id, queryOptions)\n },\n ...options,\n })\n }\n\n // ===== useInfiniteQuery =====\n useInfiniteQuery<T extends PublicCollection>(\n params: CollectionInfiniteQueryParams<T>,\n options?: QueryOptions,\n ) {\n const { collection, options: queryOptions, pageSize = DEFAULT_PAGE_SIZE } = params\n\n return useInfiniteQueryOriginal({\n queryKey: collectionKeys(collection).infinite(queryOptions),\n queryFn: async ({ pageParam }) => {\n const response = await this.collectionClient\n .from(collection)\n .find({ ...queryOptions, page: pageParam, limit: pageSize })\n return response\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage: PayloadFindResponse<CollectionType<T>>) => {\n return lastPage.hasNextPage ? lastPage.nextPage : undefined\n },\n ...options,\n })\n }\n\n // ===== useSuspenseInfiniteQuery =====\n useSuspenseInfiniteQuery<T extends PublicCollection>(\n params: CollectionInfiniteQueryParams<T>,\n options?: SuspenseQueryOptions,\n ) {\n const { collection, options: queryOptions, pageSize = DEFAULT_PAGE_SIZE } = params\n\n return useSuspenseInfiniteQueryOriginal({\n queryKey: collectionKeys(collection).infinite(queryOptions),\n queryFn: async ({ pageParam }) => {\n const response = await this.collectionClient\n .from(collection)\n .find({ ...queryOptions, page: pageParam, limit: pageSize })\n return response\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage: PayloadFindResponse<CollectionType<T>>) => {\n return lastPage.hasNextPage ? lastPage.nextPage : undefined\n },\n ...options,\n })\n }\n\n // ===== prefetchQuery =====\n async prefetchQuery<T extends PublicCollection>(\n params: CollectionQueryParams<T>,\n options?: { staleTime?: number },\n ) {\n const { collection, options: queryOptions } = params\n\n return this.queryClient.prefetchQuery({\n queryKey: collectionKeys(collection).list(queryOptions),\n queryFn: async () => {\n const response = await this.collectionClient.from(collection).find(queryOptions)\n return response.docs ?? []\n },\n ...options,\n })\n }\n\n // ===== prefetchQueryById =====\n async prefetchQueryById<T extends PublicCollection>(\n params: CollectionDetailQueryParams<T>,\n options?: { staleTime?: number },\n ) {\n const { collection, id, options: queryOptions } = params\n\n return this.queryClient.prefetchQuery({\n queryKey: collectionKeys(collection).detail(id, queryOptions),\n queryFn: async () => {\n return await this.collectionClient.from(collection).findById(id, queryOptions)\n },\n ...options,\n })\n }\n\n // ===== prefetchInfiniteQuery =====\n async prefetchInfiniteQuery<T extends PublicCollection>(\n params: CollectionInfiniteQueryParams<T>,\n options?: { pages?: number; staleTime?: number },\n ) {\n const { collection, options: queryOptions, pageSize = DEFAULT_PAGE_SIZE } = params\n\n return this.queryClient.prefetchInfiniteQuery({\n queryKey: collectionKeys(collection).infinite(queryOptions),\n queryFn: async ({ pageParam }) => {\n const response = await this.collectionClient\n .from(collection)\n .find({ ...queryOptions, page: pageParam, limit: pageSize })\n return response\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage: PayloadFindResponse<CollectionType<T>>) => {\n return lastPage.hasNextPage ? lastPage.nextPage : undefined\n },\n pages: options?.pages ?? 1,\n staleTime: options?.staleTime,\n })\n }\n\n // ===== Mutation Hooks =====\n\n useCreate<T extends PublicCollection>(\n params: { collection: T },\n options?: MutationCallbacks<PayloadMutationResponse<CollectionType<T>>>,\n ) {\n const { collection } = params\n\n return useMutationOriginal<\n PayloadMutationResponse<CollectionType<T>>,\n SDKError,\n { data: Partial<CollectionType<T>>; file?: File | Blob; filename?: string }\n >({\n mutationFn: async (variables) => {\n return await this.collectionClient.from(collection).create(\n variables.data,\n variables.file ? { file: variables.file, filename: variables.filename } : undefined,\n )\n },\n onSuccess: (data) => {\n this.queryClient.invalidateQueries({ queryKey: collectionKeys(collection).all })\n options?.onSuccess?.(data)\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n useUpdate<T extends PublicCollection>(\n params: { collection: T },\n options?: MutationCallbacks<PayloadMutationResponse<CollectionType<T>>>,\n ) {\n const { collection } = params\n\n return useMutationOriginal<\n PayloadMutationResponse<CollectionType<T>>,\n SDKError,\n { id: string; data: Partial<CollectionType<T>>; file?: File | Blob; filename?: string }\n >({\n mutationFn: async (variables) => {\n return await this.collectionClient.from(collection).update(\n variables.id,\n variables.data,\n variables.file ? { file: variables.file, filename: variables.filename } : undefined,\n )\n },\n onSuccess: (data) => {\n this.queryClient.invalidateQueries({ queryKey: collectionKeys(collection).all })\n options?.onSuccess?.(data)\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n useRemove<T extends PublicCollection>(\n params: { collection: T },\n options?: MutationCallbacks<CollectionType<T>>,\n ) {\n const { collection } = params\n\n return useMutationOriginal<\n CollectionType<T>,\n SDKError,\n string\n >({\n mutationFn: async (id) => {\n return await this.collectionClient.from(collection).remove(id)\n },\n onSuccess: (data) => {\n this.queryClient.invalidateQueries({ queryKey: collectionKeys(collection).all })\n options?.onSuccess?.(data)\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n // ===== Cache Utilities =====\n\n invalidateQueries<T extends PublicCollection>(collection: T, type?: 'list' | 'detail' | 'infinite') {\n const queryKey = type ? [collection, type] : [collection]\n return this.queryClient.invalidateQueries({ queryKey })\n }\n\n getQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list',\n options?: ApiQueryOptions\n ): CollectionType<T>[] | undefined\n getQueryData<T extends PublicCollection>(\n collection: T,\n type: 'detail',\n id: string,\n options?: ApiQueryOptions\n ): CollectionType<T> | null | undefined\n getQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list' | 'detail',\n idOrOptions?: string | ApiQueryOptions,\n options?: ApiQueryOptions\n ) {\n if (type === 'list') {\n return this.queryClient.getQueryData(collectionKeys(collection).list(idOrOptions as ApiQueryOptions))\n }\n return this.queryClient.getQueryData(collectionKeys(collection).detail(idOrOptions as string, options))\n }\n\n setQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list',\n data: CollectionType<T>[],\n options?: ApiQueryOptions\n ): void\n setQueryData<T extends PublicCollection>(\n collection: T,\n type: 'detail',\n id: string,\n data: CollectionType<T> | null,\n options?: ApiQueryOptions\n ): void\n setQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list' | 'detail',\n dataOrId: CollectionType<T>[] | string,\n dataOrOptions?: CollectionType<T> | null | ApiQueryOptions,\n options?: ApiQueryOptions\n ) {\n if (type === 'list') {\n this.queryClient.setQueryData(\n collectionKeys(collection).list(dataOrOptions as ApiQueryOptions),\n dataOrId as CollectionType<T>[]\n )\n } else {\n this.queryClient.setQueryData(\n collectionKeys(collection).detail(dataOrId as string, options),\n dataOrOptions as CollectionType<T> | null\n )\n }\n }\n}\n","import type { PublicCollection, ApiQueryOptions } from '../client/types'\n\nexport function collectionKeys<T extends PublicCollection>(collection: T) {\n return {\n all: [collection] as const,\n lists: () => [collection, 'list'] as const,\n list: (options?: ApiQueryOptions) => [collection, 'list', options] as const,\n details: () => [collection, 'detail'] as const,\n detail: (id: string, options?: ApiQueryOptions) => [collection, 'detail', id, options] as const,\n infinites: () => [collection, 'infinite'] as const,\n infinite: (options?: Omit<ApiQueryOptions, 'page'>) => [collection, 'infinite', options] as const,\n }\n}\n\nexport const customerKeys = {\n all: ['customer'] as const,\n me: () => ['customer', 'me'] as const,\n}\n","import {\n QueryClient,\n useQuery as useQueryOriginal,\n useMutation as useMutationOriginal,\n} from '@tanstack/react-query'\nimport type { CustomerAuth } from '../customer/customer-auth'\nimport type {\n CustomerAuthResponse,\n CustomerRefreshResponse,\n CustomerProfile,\n CustomerRegisterData,\n CustomerLoginData,\n UpdateProfileData,\n} from '../customer/types'\nimport { createConfigError, SDKError } from '../internal/errors'\nimport { customerKeys } from './query-keys'\n\n// ============================================================================\n// Mutation helper\n// ============================================================================\n\ninterface MutationCallbacks<TData> {\n onSuccess?: (data: TData) => void\n onError?: (error: SDKError) => void\n onSettled?: () => void\n}\n\nfunction createMutation<TData, TVariables>(\n mutationFn: (variables: TVariables) => Promise<TData>,\n callbacks?: MutationCallbacks<TData>,\n onSuccessExtra?: (data: TData) => void,\n) {\n return useMutationOriginal({\n mutationFn,\n onSuccess: (data) => {\n onSuccessExtra?.(data)\n callbacks?.onSuccess?.(data)\n },\n onError: callbacks?.onError,\n onSettled: callbacks?.onSettled,\n })\n}\n\n// ============================================================================\n// Customer Hooks Mixin\n// ============================================================================\n\nexport class CustomerHooks {\n private queryClient: QueryClient\n private customerAuth?: CustomerAuth\n\n constructor(queryClient: QueryClient, customerAuth?: CustomerAuth) {\n this.queryClient = queryClient\n this.customerAuth = customerAuth\n }\n\n private ensureCustomerAuth(): CustomerAuth {\n if (!this.customerAuth) {\n throw createConfigError(\n 'Customer hooks require BrowserClient. Use createBrowserClient() instead of createServerClient().',\n )\n }\n return this.customerAuth\n }\n\n private invalidateMe = () => {\n this.queryClient.invalidateQueries({ queryKey: customerKeys.me() })\n }\n\n // ===== useCustomerMe =====\n useCustomerMe(\n options?: {\n enabled?: boolean\n staleTime?: number\n gcTime?: number\n refetchOnWindowFocus?: boolean\n refetchOnMount?: boolean\n refetchInterval?: number | false\n retry?: boolean | number\n }\n ) {\n return useQueryOriginal({\n queryKey: customerKeys.me(),\n queryFn: async () => {\n return await this.ensureCustomerAuth().me()\n },\n ...options,\n enabled: (options?.enabled ?? true) && !!this.customerAuth?.isAuthenticated(),\n })\n }\n\n // ===== Mutations =====\n\n useCustomerLogin(options?: MutationCallbacks<CustomerAuthResponse>) {\n return createMutation(\n (data: CustomerLoginData) => this.ensureCustomerAuth().login(data),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerRegister(options?: MutationCallbacks<{ customer: CustomerProfile }>) {\n return createMutation(\n (data: CustomerRegisterData) => this.ensureCustomerAuth().register(data),\n options,\n )\n }\n\n useCustomerLogout(options?: MutationCallbacks<void>) {\n return useMutationOriginal({\n mutationFn: async () => {\n this.ensureCustomerAuth().logout()\n },\n onSuccess: () => {\n this.queryClient.removeQueries({ queryKey: customerKeys.all })\n options?.onSuccess?.()\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n useCustomerForgotPassword(options?: MutationCallbacks<void>) {\n return createMutation(\n (email: string) => this.ensureCustomerAuth().forgotPassword(email).then(() => {}),\n options,\n )\n }\n\n useCustomerResetPassword(options?: MutationCallbacks<void>) {\n return createMutation(\n (data: { token: string; password: string }) =>\n this.ensureCustomerAuth().resetPassword(data.token, data.password).then(() => {}),\n options,\n )\n }\n\n useCustomerVerifyEmail(options?: MutationCallbacks<void>) {\n return createMutation(\n (token: string) => this.ensureCustomerAuth().verifyEmail(token).then(() => {}),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerRefreshToken(options?: MutationCallbacks<CustomerRefreshResponse>) {\n return createMutation(\n () => this.ensureCustomerAuth().refreshToken(),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerUpdateProfile(options?: MutationCallbacks<CustomerProfile>) {\n return createMutation(\n (data: UpdateProfileData) => this.ensureCustomerAuth().updateProfile(data),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerChangePassword(options?: MutationCallbacks<void>) {\n return createMutation(\n (data: { currentPassword: string; newPassword: string }) =>\n this.ensureCustomerAuth().changePassword(data.currentPassword, data.newPassword).then(() => {}),\n options,\n )\n }\n\n // ===== Customer Cache Utilities =====\n\n invalidateCustomerQueries() {\n return this.queryClient.invalidateQueries({ queryKey: customerKeys.all })\n }\n\n getCustomerData(): CustomerProfile | null | undefined {\n return this.queryClient.getQueryData(customerKeys.me())\n }\n\n setCustomerData(data: CustomerProfile | null) {\n this.queryClient.setQueryData(customerKeys.me(), data)\n }\n}\n","import { QueryClient } from '@tanstack/react-query'\nimport type { CollectionClient } from '../collection'\nimport type { CustomerAuth } from '../customer/customer-auth'\nimport { CollectionHooks } from './collection-hooks'\nimport { CustomerHooks } from './customer-hooks'\n\n// Re-export everything from sub-modules for barrel compatibility\nexport { collectionKeys, customerKeys } from './query-keys'\nexport type {\n CollectionQueryParams,\n CollectionDetailQueryParams,\n CollectionInfiniteQueryParams,\n} from './collection-hooks'\n\nexport type ReadOnlyQueryHooks = Omit<QueryHooks, 'useCreate' | 'useUpdate' | 'useRemove'>\n\n/**\n * Composes CollectionHooks + CustomerHooks into a single API surface.\n * All methods are delegated; no logic lives here.\n */\nexport class QueryHooks extends CollectionHooks {\n private _customer: CustomerHooks\n\n constructor(queryClient: QueryClient, collectionClient: CollectionClient, customerAuth?: CustomerAuth) {\n super(queryClient, collectionClient)\n this._customer = new CustomerHooks(queryClient, customerAuth)\n }\n\n // --- Customer hooks delegation ---\n useCustomerMe: CustomerHooks['useCustomerMe'] = (...args) => this._customer.useCustomerMe(...args)\n useCustomerLogin: CustomerHooks['useCustomerLogin'] = (...args) => this._customer.useCustomerLogin(...args)\n useCustomerRegister: CustomerHooks['useCustomerRegister'] = (...args) => this._customer.useCustomerRegister(...args)\n useCustomerLogout: CustomerHooks['useCustomerLogout'] = (...args) => this._customer.useCustomerLogout(...args)\n useCustomerForgotPassword: CustomerHooks['useCustomerForgotPassword'] = (...args) => this._customer.useCustomerForgotPassword(...args)\n useCustomerResetPassword: CustomerHooks['useCustomerResetPassword'] = (...args) => this._customer.useCustomerResetPassword(...args)\n useCustomerVerifyEmail: CustomerHooks['useCustomerVerifyEmail'] = (...args) => this._customer.useCustomerVerifyEmail(...args)\n useCustomerRefreshToken: CustomerHooks['useCustomerRefreshToken'] = (...args) => this._customer.useCustomerRefreshToken(...args)\n useCustomerUpdateProfile: CustomerHooks['useCustomerUpdateProfile'] = (...args) => this._customer.useCustomerUpdateProfile(...args)\n useCustomerChangePassword: CustomerHooks['useCustomerChangePassword'] = (...args) => this._customer.useCustomerChangePassword(...args)\n\n // --- Customer cache delegation ---\n invalidateCustomerQueries: CustomerHooks['invalidateCustomerQueries'] = () => this._customer.invalidateCustomerQueries()\n getCustomerData: CustomerHooks['getCustomerData'] = () => this._customer.getCustomerData()\n setCustomerData: CustomerHooks['setCustomerData'] = (data) => this._customer.setCustomerData(data)\n}\n","import type { QueryClient } from '@tanstack/react-query'\nimport { CartApi } from '../api'\nimport { CollectionClient, type ReadOnlyQueryBuilder } from '../collection'\nimport { CustomerAuth } from '../customer'\nimport { createConfigError } from '../internal/errors'\nimport { getQueryClient } from '../query/get-query-client'\nimport { QueryHooks, type ReadOnlyQueryHooks } from '../query/query-hooks'\nimport {\n resolveApiUrl,\n type ClientBrowserConfig,\n type ClientState,\n type ClientMetadata,\n type PublicCollection,\n} from './types'\n\nexport default class BrowserClient {\n cart: CartApi\n query: ReadOnlyQueryHooks\n collections: CollectionClient\n queryClient: QueryClient\n customer: CustomerAuth\n\n protected state: ClientState\n protected config: ClientBrowserConfig\n protected baseUrl: string\n\n constructor(options: ClientBrowserConfig) {\n if (!options.clientKey) {\n throw createConfigError('clientKey is required.')\n }\n\n this.config = { ...options }\n this.baseUrl = resolveApiUrl(options)\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = { metadata }\n this.queryClient = getQueryClient()\n\n this.customer = new CustomerAuth(this.config.clientKey, this.baseUrl, options.customer)\n\n const onUnauthorized = async (): Promise<string | null> => {\n try {\n const result = await this.customer.refreshToken()\n return result.token ?? null\n } catch {\n return null\n }\n }\n\n this.cart = new CartApi({\n clientKey: this.config.clientKey,\n customerToken: () => this.customer.getToken(),\n baseUrl: this.baseUrl,\n onUnauthorized,\n })\n\n this.collections = new CollectionClient(\n this.config.clientKey,\n undefined,\n this.baseUrl,\n () => this.customer.getToken(),\n onUnauthorized,\n )\n\n this.query = new QueryHooks(this.queryClient, this.collections, this.customer)\n }\n\n from<T extends PublicCollection>(collection: T): ReadOnlyQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n getState(): ClientState {\n return { ...this.state }\n }\n\n getConfig(): ClientBrowserConfig {\n return { ...this.config }\n }\n}\n\nexport function createBrowserClient(\n options: ClientBrowserConfig,\n): BrowserClient {\n return new BrowserClient(options)\n}\n","import type { QueryClient } from '@tanstack/react-query'\nimport { OrderApi, CartApi, ProductApi } from '../api'\nimport { CollectionClient, CollectionQueryBuilder } from '../collection'\nimport { createConfigError } from '../internal/errors'\nimport { getQueryClient } from '../query/get-query-client'\nimport { QueryHooks } from '../query/query-hooks'\nimport {\n resolveApiUrl,\n type ClientServerConfig,\n type ClientState,\n type ClientMetadata,\n type PublicCollection,\n type ClientBrowserConfig,\n} from './types'\n\nexport default class ServerClient {\n api: OrderApi\n cart: CartApi\n product: ProductApi\n query: QueryHooks\n collections: CollectionClient\n queryClient: QueryClient\n\n protected state: ClientState\n protected config: ClientServerConfig\n protected baseUrl: string\n\n constructor(options: ClientServerConfig) {\n if (typeof window !== 'undefined') {\n throw createConfigError(\n 'ServerClient must not be used in a browser environment. ' +\n 'This risks exposing your secretKey in client bundles. ' +\n 'Use createBrowserClient() for browser code instead.',\n )\n }\n\n if (!options.clientKey) {\n throw createConfigError('clientKey is required.')\n }\n if (!options.secretKey) {\n throw createConfigError('secretKey is required.')\n }\n\n this.config = { ...options }\n this.baseUrl = resolveApiUrl(options)\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent: 'Node.js',\n }\n\n this.state = { metadata }\n\n this.api = new OrderApi({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.baseUrl,\n })\n\n this.cart = new CartApi({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.baseUrl,\n })\n\n this.product = new ProductApi({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.baseUrl,\n })\n\n this.collections = new CollectionClient(\n this.config.clientKey,\n this.config.secretKey,\n this.baseUrl,\n )\n\n this.queryClient = getQueryClient()\n this.query = new QueryHooks(this.queryClient, this.collections)\n }\n\n from<T extends PublicCollection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n getState(): ClientState {\n return { ...this.state }\n }\n\n getConfig(): ClientBrowserConfig {\n const { secretKey: _, ...safeConfig } = this.config\n return safeConfig\n }\n}\n\nexport function createServerClient(options: ClientServerConfig): ServerClient {\n return new ServerClient(options)\n}\n","import type { Collection } from '../client/types'\nimport type { CollectionType } from '../collection/types'\n\nexport type WebhookOperation = 'create' | 'update'\n\nexport interface WebhookEvent<T extends Collection = Collection> {\n collection: T\n operation: WebhookOperation\n data: CollectionType<T>\n}\n\nexport type WebhookHandler<T extends Collection = Collection> = (\n event: WebhookEvent<T>,\n) => Promise<void> | void\n\nexport interface WebhookOptions {\n secret?: string\n}\n\nexport function isValidWebhookEvent(data: unknown): data is WebhookEvent {\n if (typeof data !== 'object' || data === null) return false\n const obj = data as Record<string, unknown>\n return (\n typeof obj.collection === 'string' &&\n (obj.operation === 'create' || obj.operation === 'update') &&\n typeof obj.data === 'object' &&\n obj.data !== null\n )\n}\n\nasync function verifySignature(\n payload: string,\n secret: string,\n signature: string,\n): Promise<boolean> {\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(payload))\n const expected = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n // Constant-time comparison to prevent timing attacks\n let result = expected.length !== signature.length ? 1 : 0\n const len = Math.max(expected.length, signature.length)\n for (let i = 0; i < len; i++) {\n result |= (expected.charCodeAt(i) || 0) ^ (signature.charCodeAt(i) || 0)\n }\n return result === 0\n}\n\nexport async function handleWebhook<T extends Collection = Collection>(\n request: Request,\n handler: WebhookHandler<T>,\n options?: WebhookOptions,\n): Promise<Response> {\n try {\n const rawBody = await request.text()\n\n if (options?.secret) {\n const signature = request.headers.get('x-webhook-signature') || ''\n const valid = await verifySignature(rawBody, options.secret, signature)\n if (!valid) {\n return new Response(\n JSON.stringify({ error: 'Invalid webhook signature' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } },\n )\n }\n } else {\n console.warn(\n '[@01.software/sdk] Webhook signature verification is disabled. ' +\n 'Set { secret } in handleWebhook() options to enable HMAC-SHA256 verification.',\n )\n }\n\n const body = JSON.parse(rawBody)\n\n if (!isValidWebhookEvent(body)) {\n return new Response(\n JSON.stringify({ error: 'Invalid webhook event format' }),\n { status: 400, headers: { 'Content-Type': 'application/json' } },\n )\n }\n\n await handler(body as WebhookEvent<T>)\n\n return new Response(\n JSON.stringify({ success: true, message: 'Webhook processed' }),\n { status: 200, headers: { 'Content-Type': 'application/json' } },\n )\n } catch (error) {\n console.error('Webhook processing error:', error)\n\n return new Response(\n JSON.stringify({ error: 'Internal server error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n )\n }\n}\n\nexport function createTypedWebhookHandler<T extends Collection>(\n collection: T,\n handler: (event: WebhookEvent<T>) => Promise<void> | void,\n): WebhookHandler<T> {\n return async (event: WebhookEvent<T>) => {\n if (event.collection !== collection) {\n throw new Error(`Expected collection \"${collection}\", got \"${event.collection}\"`)\n }\n return handler(event)\n }\n}\n","/** Palette colors extracted from an image */\nexport interface ImagePalette {\n vibrant?: string | null\n muted?: string | null\n darkVibrant?: string | null\n darkMuted?: string | null\n lightVibrant?: string | null\n lightMuted?: string | null\n}\n\n/** Common image data shape from Payload CMS upload collections */\nexport interface ImageData {\n url?: string | null\n width?: number | null\n height?: number | null\n alt?: string | null\n lqip?: string | null\n palette?: ImagePalette | null\n sizes?: Record<\n string,\n | {\n url?: string | null\n width?: number | null\n height?: number | null\n }\n | undefined\n >\n}\n\n/** Pre-generated image size breakpoints (px) */\nexport const IMAGE_SIZES = [384, 768, 1536] as const\n\n/**\n * Returns the optimal image URL for a given display width.\n *\n * Picks the smallest pre-generated size whose width >= displayWidth × dpr.\n * Falls back to the original URL when no matching size exists.\n *\n * @param image - Payload image document\n * @param displayWidth - CSS pixel width the image will be displayed at\n * @param dpr - Device pixel ratio (default: 1)\n * @returns URL string, or empty string if no URL is available\n */\nexport function getImageUrl(\n image: ImageData,\n displayWidth: number,\n dpr: number = 1,\n): string {\n const target = displayWidth * dpr\n const sizes = image.sizes\n\n if (sizes) {\n for (const size of IMAGE_SIZES) {\n if (size >= target) {\n const entry = sizes[String(size)]\n if (entry?.url) return entry.url\n }\n }\n }\n\n return image.url ?? ''\n}\n\n/**\n * Generates an HTML `srcset` attribute string from pre-generated sizes.\n *\n * Includes all available sizes plus the original image.\n * Example output: `\"url-384 384w, url-768 768w, url-1536 1536w, url-original 2000w\"`\n *\n * @param image - Payload image document\n * @returns srcset string, or empty string if no URLs are available\n */\nexport function getImageSrcSet(image: ImageData): string {\n const parts: string[] = []\n const sizes = image.sizes\n\n if (sizes) {\n for (const size of IMAGE_SIZES) {\n const entry = sizes[String(size)]\n if (entry?.url && entry.width) {\n parts.push(`${entry.url} ${entry.width}w`)\n }\n }\n }\n\n if (image.url && image.width) {\n parts.push(`${image.url} ${image.width}w`)\n }\n\n return parts.join(', ')\n}\n\n/**\n * Returns the LQIP (Low Quality Image Placeholder) data URL for an image.\n *\n * @param image - Payload image document\n * @returns LQIP data URL string, or undefined if not available\n */\nexport function getImageLqip(image: ImageData): string | undefined {\n return image.lqip ?? undefined\n}\n\n/**\n * Returns the extracted color palette for an image.\n *\n * @param image - Payload image document\n * @returns ImagePalette object, or undefined if not available\n */\nexport function getImagePalette(image: ImageData): ImagePalette | undefined {\n return image.palette ?? undefined\n}\n\n/** Options for `getImagePlaceholderStyle` */\nexport interface ImagePlaceholderOptions {\n /** Placeholder strategy (default: 'blur') */\n type?: 'blur' | 'color' | 'none'\n /** Which palette color to use for 'color' strategy (default: 'muted') */\n paletteColor?: keyof ImagePalette\n}\n\n/**\n * Returns inline CSS styles for an image placeholder.\n *\n * - `blur`: uses LQIP as background, falls back to palette color, then empty\n * - `color`: uses palette color as background, falls back to empty\n * - `none`: always returns empty\n *\n * @param image - Payload image document\n * @param options - Placeholder options\n * @returns CSS style object compatible with React CSSProperties\n */\nexport function getImagePlaceholderStyle(\n image: ImageData,\n options?: ImagePlaceholderOptions,\n): Record<string, string> {\n const type = options?.type ?? 'blur'\n const paletteColor = options?.paletteColor ?? 'muted'\n\n if (type === 'none') return {}\n\n const color = image.palette?.[paletteColor]\n\n if (type === 'blur') {\n const lqip = image.lqip\n if (lqip) {\n return {\n backgroundImage: `url(${lqip})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n }\n // Cascade: fall back to color\n if (color) {\n return { backgroundColor: color }\n }\n return {}\n }\n\n // type === 'color'\n if (color) {\n return { backgroundColor: color }\n }\n return {}\n}\n","export const generateOrderNumber = () => {\n // YYMMDDRRRRRR\n const year = new Date().getFullYear().toString().slice(-2)\n const month = (new Date().getMonth() + 1).toString().padStart(2, '0')\n const day = new Date().getDate().toString().padStart(2, '0')\n // Use crypto.getRandomValues for cryptographically secure randomness (works in both browser and Node.js)\n const array = new Uint32Array(1)\n globalThis.crypto.getRandomValues(array)\n const random = ((array[0] ?? 0) % 1000000).toString().padStart(6, '0')\n\n return `${year}${month}${day}${random}`\n}\n","import { Product } from '../../payload-types'\nimport { resolveRelation } from '../types'\n\ntype OrderItem = {\n product: Product | string | null | undefined\n}\n\nexport const formatOrderName = (items: OrderItem[]) => {\n if (items.length === 0) return ''\n\n const firstTitle = resolveRelation(items[0]?.product)?.title || ''\n\n return items.length === 1\n ? firstTitle\n : `${firstTitle} 외 ${items.length - 1}건`\n}\n","const MUX_IMAGE_BASE = 'https://image.mux.com'\nconst MUX_STREAM_BASE = 'https://stream.mux.com'\n\n// ── Thumbnail ──\n\nexport interface VideoThumbnailOptions {\n /** Width in pixels (default: 640) */\n width?: number\n /** Height in pixels (auto if omitted) */\n height?: number\n /** Time offset in seconds (default: 0) */\n time?: number\n /** Fit mode (default: 'smartcrop') */\n fitMode?: 'preserve' | 'stretch' | 'crop' | 'smartcrop' | 'pad'\n /** Flip horizontally */\n flipH?: boolean\n /** Flip vertically */\n flipV?: boolean\n /** Rotation in degrees (90, 180, 270) */\n rotate?: 90 | 180 | 270\n}\n\n/**\n * Returns a Mux thumbnail URL for a video.\n *\n * @example\n * ```ts\n * getVideoThumbnail('abc123')\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=640'\n *\n * getVideoThumbnail('abc123', { width: 320, time: 5 })\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=320&time=5'\n * ```\n */\nexport function getVideoThumbnail(\n playbackId: string,\n options?: VideoThumbnailOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 640))\n if (options?.height) params.set('height', String(options.height))\n if (options?.time != null) params.set('time', String(options.time))\n if (options?.fitMode) params.set('fit_mode', options.fitMode)\n if (options?.flipH) params.set('flip_h', 'true')\n if (options?.flipV) params.set('flip_v', 'true')\n if (options?.rotate) params.set('rotate', String(options.rotate))\n return `${MUX_IMAGE_BASE}/${playbackId}/thumbnail.jpg?${params}`\n}\n\n// ── Animated GIF ──\n\nexport interface VideoGifOptions {\n /** Width in pixels (default: 320) */\n width?: number\n /** Start time in seconds (default: 0) */\n start?: number\n /** End time in seconds (default: start + 5) */\n end?: number\n /** Frames per second (default: 15) */\n fps?: number\n}\n\n/**\n * Returns a Mux animated GIF URL for a video.\n *\n * @example\n * ```ts\n * getVideoGif('abc123')\n * // => 'https://image.mux.com/abc123/animated.gif?width=320'\n *\n * getVideoGif('abc123', { width: 240, start: 2, end: 6 })\n * // => 'https://image.mux.com/abc123/animated.gif?width=240&start=2&end=6'\n * ```\n */\nexport function getVideoGif(\n playbackId: string,\n options?: VideoGifOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 320))\n if (options?.start != null) params.set('start', String(options.start))\n if (options?.end != null) params.set('end', String(options.end))\n if (options?.fps) params.set('fps', String(options.fps))\n return `${MUX_IMAGE_BASE}/${playbackId}/animated.gif?${params}`\n}\n\n// ── Storyboard ──\n\n/**\n * Returns a Mux storyboard VTT URL for timeline hover previews.\n *\n * @example\n * ```ts\n * getVideoStoryboard('abc123')\n * // => 'https://image.mux.com/abc123/storyboard.vtt'\n * ```\n */\nexport function getVideoStoryboard(playbackId: string): string {\n return `${MUX_IMAGE_BASE}/${playbackId}/storyboard.vtt`\n}\n\n// ── Stream / Playback URLs ──\n\n/**\n * Returns the HLS stream URL for a video.\n *\n * @example\n * ```ts\n * getVideoStreamUrl('abc123')\n * // => 'https://stream.mux.com/abc123.m3u8'\n * ```\n */\nexport function getVideoStreamUrl(playbackId: string): string {\n return `${MUX_STREAM_BASE}/${playbackId}.m3u8`\n}\n\n/**\n * Returns a Mux MP4 download URL for a video.\n * Only available if the asset was created with `mp4_support` enabled.\n *\n * @example\n * ```ts\n * getVideoMp4Url('abc123', 'high')\n * // => 'https://stream.mux.com/abc123/high.mp4'\n * ```\n */\nexport function getVideoMp4Url(\n playbackId: string,\n resolution: 'high' | 'medium' | 'low' = 'high',\n): string {\n return `${MUX_STREAM_BASE}/${playbackId}/${resolution}.mp4`\n}\n"],"mappings":"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","names":["DEFAULT_TIMEOUT","useQueryOriginal","useMutationOriginal","useMutationOriginal","useQueryOriginal","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/internal/utils/jwt.ts","../src/core/internal/utils/encoding.ts","../src/core/internal/errors/index.ts","../src/core/client/types.ts","../src/core/internal/utils/http.ts","../src/core/api/base-api.ts","../src/core/api/order-api.ts","../src/core/api/cart-api.ts","../src/core/api/product-api.ts","../src/utils/types.ts","../src/core/metadata/index.ts","../src/core/collection/query-builder.ts","../src/core/collection/http-client.ts","../src/core/collection/collection-client.ts","../src/core/collection/const.ts","../src/core/customer/customer-auth.ts","../src/core/query/get-query-client.ts","../src/core/query/collection-hooks.ts","../src/core/query/query-keys.ts","../src/core/query/customer-hooks.ts","../src/core/query/query-hooks.ts","../src/core/client/client.ts","../src/core/client/client.server.ts","../src/core/webhook/index.ts","../src/utils/image.ts","../src/utils/order/generateOrderNumber.ts","../src/utils/order/formatOrderName.ts","../src/utils/video.ts"],"sourcesContent":["import { SignJWT, jwtVerify, decodeJwt } from 'jose'\n\nexport interface JwtPayload {\n clientKey: string\n iat?: number\n exp?: number\n}\n\n/**\n * Creates a JWT token for server-side authentication.\n * The token is valid for 1 hour by default.\n */\nexport async function createServerToken(\n clientKey: string,\n secretKey: string,\n expiresIn: string = '1h',\n): Promise<string> {\n if (!clientKey || !secretKey) {\n throw new Error('clientKey and secretKey are required.')\n }\n\n const secret = new TextEncoder().encode(secretKey)\n return new SignJWT({ clientKey })\n .setProtectedHeader({ alg: 'HS256' })\n .setIssuedAt()\n .setExpirationTime(expiresIn)\n .sign(secret)\n}\n\n/**\n * Verifies a JWT token and returns the payload.\n */\nexport async function verifyServerToken(\n token: string,\n secretKey: string,\n): Promise<JwtPayload> {\n if (!token || !secretKey) {\n throw new Error('token and secretKey are required.')\n }\n\n const secret = new TextEncoder().encode(secretKey)\n const { payload } = await jwtVerify(token, secret, {\n algorithms: ['HS256'],\n })\n\n if (!payload.clientKey || typeof payload.clientKey !== 'string') {\n throw new Error('Invalid token payload: clientKey is missing')\n }\n\n return {\n clientKey: payload.clientKey as string,\n iat: payload.iat,\n exp: payload.exp,\n }\n}\n\n/**\n * Decodes a JWT token without verification.\n * WARNING: Use this only when you need to inspect token contents.\n * Always use verifyServerToken for authentication.\n */\nexport function decodeServerToken(token: string): JwtPayload {\n if (!token) {\n throw new Error('token is required.')\n }\n\n const payload = decodeJwt(token)\n\n if (!payload.clientKey || typeof payload.clientKey !== 'string') {\n throw new Error('Invalid token payload: clientKey is missing')\n }\n\n return {\n clientKey: payload.clientKey as string,\n iat: payload.iat,\n exp: payload.exp,\n }\n}\n","/**\n * Creates a Base64-encoded API key from clientKey and secretKey.\n */\nexport function createApiKey(clientKey: string, secretKey: string): string {\n if (!clientKey || !secretKey) {\n throw new Error('clientKey and secretKey are required.')\n }\n\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(`${clientKey}:${secretKey}`).toString('base64')\n }\n return btoa(`${clientKey}:${secretKey}`)\n}\n\n/**\n * Parses a Base64-encoded API key to extract clientKey and secretKey.\n */\nexport function parseApiKey(apiKey: string): {\n clientKey: string\n secretKey: string\n} {\n if (!apiKey) {\n throw new Error('apiKey is required.')\n }\n\n try {\n let decoded: string\n if (typeof Buffer !== 'undefined') {\n decoded = Buffer.from(apiKey, 'base64').toString('utf-8')\n } else {\n decoded = atob(apiKey)\n }\n\n const colonIndex = decoded.indexOf(':')\n if (colonIndex === -1) {\n throw new Error('Invalid format: missing colon separator')\n }\n\n const clientKey = decoded.substring(0, colonIndex)\n const secretKey = decoded.substring(colonIndex + 1)\n\n if (!clientKey || !secretKey) {\n throw new Error('Invalid format: empty clientKey or secretKey')\n }\n\n return { clientKey, secretKey }\n } catch {\n throw new Error('Invalid API key. Expected Base64 encoded \"clientKey:secretKey\"')\n }\n}\n","// ============================================================================\n// Error Classes\n// ============================================================================\n\nexport class SDKError extends Error {\n readonly code: string\n readonly status?: number\n readonly details?: unknown\n readonly userMessage?: string\n readonly suggestion?: string\n\n constructor(\n code: string,\n message: string,\n status?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n this.code = code\n this.status = status\n this.details = details\n this.userMessage = userMessage\n this.suggestion = suggestion\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, SDKError)\n }\n }\n\n getUserMessage(): string {\n return this.userMessage || this.message\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n userMessage: this.userMessage,\n suggestion: this.suggestion,\n }\n }\n}\n\nexport class NetworkError extends SDKError {\n constructor(\n message: string,\n status?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('NETWORK_ERROR', message, status, details, userMessage, suggestion)\n this.name = 'NetworkError'\n }\n}\n\nexport class ValidationError extends SDKError {\n constructor(\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('VALIDATION_ERROR', message, 400, details, userMessage, suggestion)\n this.name = 'ValidationError'\n }\n}\n\nexport class ApiError extends SDKError {\n constructor(\n message: string,\n status: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('API_ERROR', message, status, details, userMessage, suggestion)\n this.name = 'ApiError'\n }\n}\n\nexport class ConfigError extends SDKError {\n constructor(\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('CONFIG_ERROR', message, undefined, details, userMessage, suggestion)\n this.name = 'ConfigError'\n }\n}\n\nexport class TimeoutError extends SDKError {\n constructor(\n message = 'Request timed out.',\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('TIMEOUT_ERROR', message, 408, details, userMessage, suggestion)\n this.name = 'TimeoutError'\n }\n}\n\nexport class GoneError extends SDKError {\n constructor(\n message = 'The requested resource is no longer available.',\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('GONE_ERROR', message, 410, details, userMessage, suggestion)\n this.name = 'GoneError'\n }\n}\n\nexport class ServiceUnavailableError extends SDKError {\n readonly retryAfter?: number\n\n constructor(\n message = 'Service temporarily unavailable.',\n retryAfter?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('SERVICE_UNAVAILABLE_ERROR', message, 503, details, userMessage, suggestion)\n this.name = 'ServiceUnavailableError'\n this.retryAfter = retryAfter\n }\n}\n\nexport class UsageLimitError extends SDKError {\n readonly usage: { limit: number; current: number; remaining: number }\n\n constructor(\n message: string,\n usage: { limit: number; current: number; remaining: number },\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n ) {\n super('USAGE_LIMIT_ERROR', message, 429, details, userMessage, suggestion)\n this.name = 'UsageLimitError'\n this.usage = usage\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n usage: this.usage,\n }\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isSDKError(error: unknown): error is SDKError {\n return error instanceof SDKError\n}\n\nexport function isNetworkError(error: unknown): error is NetworkError {\n return error instanceof NetworkError\n}\n\nexport function isValidationError(error: unknown): error is ValidationError {\n return error instanceof ValidationError\n}\n\nexport function isApiError(error: unknown): error is ApiError {\n return error instanceof ApiError\n}\n\nexport function isConfigError(error: unknown): error is ConfigError {\n return error instanceof ConfigError\n}\n\nexport function isTimeoutError(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError\n}\n\nexport function isGoneError(error: unknown): error is GoneError {\n return error instanceof GoneError\n}\n\nexport function isServiceUnavailableError(error: unknown): error is ServiceUnavailableError {\n return error instanceof ServiceUnavailableError\n}\n\nexport function isUsageLimitError(error: unknown): error is UsageLimitError {\n return error instanceof UsageLimitError\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\nexport const createNetworkError = (\n message: string,\n status?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new NetworkError(message, status, details, userMessage, suggestion)\n\nexport const createValidationError = (\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ValidationError(message, details, userMessage, suggestion)\n\nexport const createApiError = (\n message: string,\n status: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ApiError(message, status, details, userMessage, suggestion)\n\nexport const createConfigError = (\n message: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ConfigError(message, details, userMessage, suggestion)\n\nexport const createTimeoutError = (\n message?: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new TimeoutError(message, details, userMessage, suggestion)\n\nexport const createGoneError = (\n message?: string,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new GoneError(message, details, userMessage, suggestion)\n\nexport const createServiceUnavailableError = (\n message?: string,\n retryAfter?: number,\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new ServiceUnavailableError(message, retryAfter, details, userMessage, suggestion)\n\nexport const createUsageLimitError = (\n message: string,\n usage: { limit: number; current: number; remaining: number },\n details?: unknown,\n userMessage?: string,\n suggestion?: string,\n) => new UsageLimitError(message, usage, details, userMessage, suggestion)\n","import type { Sort, Where } from 'payload'\nimport type { SDKError } from '../internal/errors'\nimport type { Collection, PublicCollection } from '../collection/const'\n\nexport type { Collection, PublicCollection }\n\n// ============================================================================\n// API URL Configuration\n// ============================================================================\n\ndeclare const __DEFAULT_API_URL__: string\n\n/**\n * API URL을 반환합니다.\n * 환경변수 SOFTWARE_API_URL 또는 NEXT_PUBLIC_SOFTWARE_API_URL로 오버라이드 가능.\n * 빌드 시 버전에 따라 기본값 결정: dev 빌드 → api-dev, 정식 → api.01.software\n */\nexport function resolveApiUrl(): string {\n const envUrl =\n process.env.SOFTWARE_API_URL || process.env.NEXT_PUBLIC_SOFTWARE_API_URL\n if (envUrl) {\n return envUrl.replace(/\\/$/, '')\n }\n return __DEFAULT_API_URL__\n}\n\n// ============================================================================\n// Client Configuration\n// ============================================================================\n\nexport interface ClientBrowserConfig {\n clientKey: string\n /**\n * Customer authentication options.\n * Used to initialize CustomerAuth on BrowserClient.\n */\n customer?: {\n /**\n * Automatically persist token in localStorage.\n * - `true`: uses default key `'customer-token'`\n * - `string`: uses the given string as localStorage key\n *\n * Handles SSR safely (no-op on server).\n * When set, `token` and `onTokenChange` are ignored.\n */\n persist?: boolean | string\n /** Initial token (e.g. from SSR cookie) */\n token?: string\n /** Called when token changes (login/logout) — use to persist in localStorage/cookie */\n onTokenChange?: (token: string | null) => void\n }\n}\n\nexport interface ClientServerConfig extends ClientBrowserConfig {\n secretKey: string\n}\n\nexport interface ClientMetadata {\n userAgent?: string\n timestamp: number\n}\n\nexport interface ClientState {\n metadata: ClientMetadata\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\nexport interface PaginationMeta {\n page: number\n limit: number\n totalDocs: number\n totalPages: number\n hasNextPage: boolean\n hasPrevPage: boolean\n pagingCounter: number\n prevPage: number | null\n nextPage: number | null\n}\n\n// ============================================================================\n// Payload CMS Native Response Types\n// ============================================================================\n\n/**\n * Payload CMS Find (List) Response\n * GET /api/{collection}\n */\nexport interface PayloadFindResponse<T = unknown> {\n docs: T[]\n totalDocs: number\n limit: number\n totalPages: number\n page: number\n pagingCounter: number\n hasPrevPage: boolean\n hasNextPage: boolean\n prevPage: number | null\n nextPage: number | null\n}\n\n/**\n * Payload CMS Create/Update Response\n * POST /api/{collection}\n * PATCH /api/{collection}/{id}\n */\nexport interface PayloadMutationResponse<T = unknown> {\n message: string\n doc: T\n errors?: unknown[]\n}\n\n// ============================================================================\n// Query Options\n// ============================================================================\n\nexport interface ApiQueryOptions {\n page?: number\n limit?: number\n sort?: Sort\n where?: Where\n depth?: number\n select?: Record<string, boolean>\n}\n\nexport interface ApiQueryReactOptions {\n keepPreviousData?: boolean\n}\n\n// ============================================================================\n// Debug & Retry Configuration\n// ============================================================================\n\nexport interface DebugConfig {\n logRequests?: boolean\n logResponses?: boolean\n logErrors?: boolean\n}\n\nexport interface RetryConfig {\n maxRetries?: number\n retryableStatuses?: number[]\n retryDelay?: (attempt: number) => number\n}\n\nexport interface ErrorLogger {\n log(error: SDKError | Error, context?: Record<string, unknown>): void\n}\n\n// ============================================================================\n// Collection Types (re-exported from collection/const)\n// ============================================================================\n\n// ============================================================================\n// Type Utilities\n// ============================================================================\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]\n}\n\nexport type ExtractArrayType<T> = T extends (infer U)[] ? U : never\n","import { createNetworkError, createUsageLimitError, createTimeoutError, TimeoutError, NetworkError } from '../errors'\nimport type { DebugConfig, RetryConfig } from '../../client/types'\nimport { resolveApiUrl } from '../../client/types'\nimport { createServerToken } from './jwt'\n\nconst DEFAULT_TIMEOUT = 30000\nconst DEFAULT_RETRYABLE_STATUSES = [408, 429, 500, 502, 503, 504]\nconst NON_RETRYABLE_STATUSES = [401, 403, 404, 422]\nconst SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']\n\nexport interface FetchOptions extends RequestInit {\n clientKey?: string\n secretKey?: string\n customerToken?: string\n timeout?: number\n baseUrl?: string\n debug?: boolean | DebugConfig\n retry?: RetryConfig\n /** Called on 401 when customerToken is set. Return a new token to retry, or null to fail. */\n onUnauthorized?: () => Promise<string | null>\n}\n\nfunction debugLog(\n debug: boolean | DebugConfig | undefined,\n type: 'request' | 'response' | 'error',\n message: string,\n data?: unknown,\n) {\n if (!debug) return\n\n const shouldLog =\n debug === true ||\n (type === 'request' && (debug as DebugConfig).logRequests) ||\n (type === 'response' && (debug as DebugConfig).logResponses) ||\n (type === 'error' && (debug as DebugConfig).logErrors)\n\n if (shouldLog) {\n console.group(`[SDK ${type.toUpperCase()}] ${message}`)\n if (data) console.log(data)\n console.groupEnd()\n }\n}\n\nfunction getErrorSuggestion(status: number): string | undefined {\n if (status === 401) return 'Please check your authentication credentials.'\n if (status === 404) return 'The requested resource was not found.'\n if (status >= 500)\n return 'A server error occurred. Please try again later.'\n return undefined\n}\n\nasync function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport async function httpFetch(\n url: string,\n options?: FetchOptions,\n): Promise<Response> {\n const {\n clientKey,\n secretKey,\n customerToken,\n timeout = DEFAULT_TIMEOUT,\n baseUrl = resolveApiUrl(),\n debug,\n retry,\n onUnauthorized,\n ...requestInit\n } = options || {}\n\n const retryConfig = {\n maxRetries: retry?.maxRetries ?? 3,\n retryableStatuses: retry?.retryableStatuses ?? DEFAULT_RETRYABLE_STATUSES,\n retryDelay:\n retry?.retryDelay ??\n ((attempt: number) => Math.min(1000 * 2 ** attempt, 10000)),\n }\n\n // Generate JWT once before retry loop (token valid for 1h)\n let authToken: string | undefined\n if (secretKey && clientKey) {\n authToken = await createServerToken(clientKey, secretKey)\n } else if (customerToken) {\n authToken = customerToken\n }\n\n let lastError: Error | undefined\n let hasRetried401 = false\n\n for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n try {\n const headers = new Headers(requestInit.headers)\n\n if (clientKey) {\n headers.set('X-Client-Key', clientKey)\n }\n\n if (authToken) {\n headers.set('Authorization', `Bearer ${authToken}`)\n }\n\n if (!headers.has('Content-Type') && requestInit.body && !(requestInit.body instanceof FormData)) {\n headers.set('Content-Type', 'application/json')\n }\n\n // Redact sensitive headers for debug logging\n const redactedHeaders = Object.fromEntries(headers.entries())\n if (redactedHeaders['authorization']) {\n const token = redactedHeaders['authorization']\n redactedHeaders['authorization'] = token.length > 15\n ? `${token.slice(0, 15)}...****`\n : '****'\n }\n\n debugLog(debug, 'request', url, {\n method: requestInit.method || 'GET',\n headers: redactedHeaders,\n attempt: attempt + 1,\n })\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n const response = await fetch(`${baseUrl}${url}`, {\n ...requestInit,\n headers,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n debugLog(debug, 'response', url, {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n })\n\n if (!response.ok) {\n // Usage limit 429 — never retry (distinguished by X-Usage-Limit header)\n if (\n response.status === 429 &&\n response.headers.get('X-Usage-Limit')\n ) {\n const limit = parseInt(response.headers.get('X-Usage-Limit') || '0', 10)\n const current = parseInt(response.headers.get('X-Usage-Current') || '0', 10)\n const remaining = parseInt(response.headers.get('X-Usage-Remaining') || '0', 10)\n\n throw createUsageLimitError(\n `Monthly API usage limit exceeded (${current.toLocaleString()}/${limit.toLocaleString()})`,\n { limit, current, remaining },\n { url, method: requestInit.method || 'GET', attempt: attempt + 1 },\n 'Monthly API call limit exceeded. Please upgrade your plan.',\n 'Upgrade your tenant plan to increase the monthly API call limit.',\n )\n }\n\n // Auto-refresh customer token on 401\n if (response.status === 401 && onUnauthorized && customerToken && !hasRetried401) {\n hasRetried401 = true\n try {\n const newToken = await onUnauthorized()\n if (newToken) {\n authToken = newToken\n continue\n }\n } catch {\n // Refresh failed, fall through to throw\n }\n }\n\n // Never retry non-retryable statuses regardless of user config\n if (NON_RETRYABLE_STATUSES.includes(response.status)) {\n throw createNetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n { url, method: requestInit.method || 'GET', attempt: attempt + 1 },\n `Request failed (status: ${response.status})`,\n getErrorSuggestion(response.status),\n )\n }\n\n const error = createNetworkError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n { url, method: requestInit.method || 'GET', attempt: attempt + 1 },\n `Request failed (status: ${response.status})`,\n getErrorSuggestion(response.status),\n )\n\n const method = (requestInit.method || 'GET').toUpperCase()\n if (\n attempt < retryConfig.maxRetries &&\n SAFE_METHODS.includes(method) &&\n retryConfig.retryableStatuses.includes(response.status)\n ) {\n lastError = error\n const retryDelay = retryConfig.retryDelay(attempt)\n debugLog(debug, 'error', `Retrying in ${retryDelay}ms...`, error)\n await delay(retryDelay)\n continue\n }\n\n throw error\n }\n\n return response\n } catch (error) {\n debugLog(debug, 'error', url, error)\n\n const method = (requestInit.method || 'GET').toUpperCase()\n const isSafe = SAFE_METHODS.includes(method)\n\n if (error instanceof Error && error.name === 'AbortError') {\n const timeoutError = createTimeoutError(\n `Request timed out after ${timeout}ms.`,\n { url, timeout, attempt: attempt + 1 },\n 'The request timed out.',\n 'Please check your network connection or try again later.',\n )\n\n if (isSafe && attempt < retryConfig.maxRetries) {\n lastError = timeoutError\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw timeoutError\n }\n\n if (error instanceof TypeError) {\n const networkError = createNetworkError(\n 'Network connection failed.',\n undefined,\n { url, originalError: error.message, attempt: attempt + 1 },\n 'Network connection failed.',\n 'Please check your internet connection and try again.',\n )\n\n if (isSafe && attempt < retryConfig.maxRetries) {\n lastError = networkError\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw networkError\n }\n\n if (error instanceof NetworkError || error instanceof TimeoutError) {\n if (\n isSafe &&\n attempt < retryConfig.maxRetries &&\n error.status &&\n !NON_RETRYABLE_STATUSES.includes(error.status) &&\n retryConfig.retryableStatuses.includes(error.status)\n ) {\n lastError = error\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw error\n }\n\n const unknownError = createNetworkError(\n error instanceof Error\n ? error.message\n : 'An unknown network error occurred.',\n undefined,\n { url, originalError: error, attempt: attempt + 1 },\n 'An unknown error occurred.',\n 'Please try again later.',\n )\n\n if (isSafe && attempt < retryConfig.maxRetries) {\n lastError = unknownError\n await delay(retryConfig.retryDelay(attempt))\n continue\n }\n\n throw unknownError\n }\n }\n\n throw lastError ?? new NetworkError('Request failed after retries')\n}\n\n","import { httpFetch } from '../internal/utils'\nimport { createApiError, createConfigError } from '../internal/errors'\n\nexport interface ServerApiOptions {\n clientKey: string\n secretKey: string\n baseUrl?: string\n}\n\nexport abstract class BaseApi {\n protected readonly clientKey: string\n protected readonly secretKey: string\n protected readonly baseUrl?: string\n\n constructor(apiName: string, options: ServerApiOptions) {\n if (!options.clientKey) {\n throw createConfigError(`clientKey is required for ${apiName}.`)\n }\n if (!options.secretKey) {\n throw createConfigError(`secretKey is required for ${apiName}.`)\n }\n\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n this.baseUrl = options.baseUrl\n }\n\n protected async request<T>(endpoint: string, body: unknown): Promise<T> {\n const response = await httpFetch(endpoint, {\n method: 'POST',\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n baseUrl: this.baseUrl,\n body: JSON.stringify(body),\n })\n\n let data: Record<string, unknown>\n try {\n data = await response.json()\n } catch {\n throw createApiError(\n `Invalid JSON response from ${endpoint}`,\n response.status,\n undefined,\n 'Server returned an invalid response.',\n 'Check if the API endpoint is available.',\n )\n }\n\n if (data.error) {\n const errorMessage = typeof data.error === 'string' ? data.error : 'Unknown API error'\n throw createApiError(\n errorMessage,\n response.status,\n data,\n errorMessage,\n 'An error occurred while processing the request.',\n )\n }\n\n return data as T\n }\n}\n","import type { Order, OrderProduct, Transaction, Fulfillment, Return, Exchange } from '../../payload-types'\nimport { BaseApi, type ServerApiOptions } from './base-api'\n\nexport type OrderApiOptions = ServerApiOptions\n\nexport type CreateOrderParams = {\n orderNumber: string\n customer?: string\n customerSnapshot: {\n name?: string\n email: string\n phone?: string\n }\n shippingAddress: Order['shippingAddress']\n orderProducts: Omit<\n OrderProduct,\n 'id' | 'brand' | 'createdAt' | 'updatedAt' | 'order' | 'status'\n >[]\n totalAmount: number\n shippingFee?: number\n paymentId?: string\n discountCode?: string\n}\n\nexport type UpdateOrderParams = {\n orderNumber: string\n status: Order['status']\n}\n\nexport type UpdateTransactionParams = {\n paymentId: string\n status: Transaction['status']\n paymentMethod?: string\n receiptUrl?: string\n}\n\nexport type CheckoutParams = {\n cartId: string\n orderNumber: string\n customerSnapshot: {\n name?: string\n email: string\n phone?: string\n }\n paymentId?: string\n discountCode?: string\n}\n\nexport type ValidateDiscountParams = {\n code: string\n orderAmount: number\n customerId?: string\n}\n\nexport type ValidateDiscountResult = {\n valid: boolean\n code: string\n type?: 'percentage' | 'fixed_amount' | 'free_shipping' | 'tiered'\n discountAmount: number\n freeShipping?: boolean\n reason?: string\n}\n\nexport type CalculateShippingParams = {\n shippingPolicyId?: string\n orderAmount: number\n postalCode?: string\n}\n\nexport type CalculateShippingResult = {\n shippingFee: number\n baseFee: number\n extraFee: number\n freeShipping: boolean\n freeShippingThreshold: number | null\n isJeju: boolean\n}\n\nexport type CreateFulfillmentParams = {\n orderNumber: string\n carrier?: string\n trackingNumber?: string\n items: Array<{\n orderProduct: string\n quantity: number\n }>\n}\n\nexport type UpdateFulfillmentParams = {\n fulfillmentId: string\n status: 'packed' | 'shipped' | 'delivered' | 'failed'\n carrier?: string\n trackingNumber?: string\n}\n\nexport type GetOrderParams = {\n orderNumber: string\n}\n\nexport type CreateReturnParams = {\n orderNumber: string\n reason?: 'change_of_mind' | 'defective' | 'wrong_delivery' | 'damaged' | 'other'\n reasonDetail?: string\n returnProducts: Array<{\n orderProduct: string\n quantity: number\n }>\n refundAmount: number\n}\n\nexport type UpdateReturnParams = {\n returnId: string\n status: 'processing' | 'approved' | 'rejected' | 'completed'\n}\n\nexport type ReturnWithRefundParams = {\n orderNumber: string\n reason?: 'change_of_mind' | 'defective' | 'wrong_delivery' | 'damaged' | 'other'\n reasonDetail?: string\n returnProducts: Array<{\n orderProduct: string\n quantity: number\n }>\n refundAmount: number\n paymentId: string\n refundReceiptUrl?: string\n}\n\nexport type CreateExchangeParams = {\n orderNumber: string\n reason?: 'wrong_size' | 'wrong_color' | 'defective' | 'other'\n reasonDetail?: string\n exchangeProducts: Array<{\n orderProduct: string\n quantity: number\n }>\n}\n\nexport type UpdateExchangeParams = {\n exchangeId: string\n status: 'processing' | 'shipped' | 'completed' | 'rejected'\n}\n\nexport class OrderApi extends BaseApi {\n constructor(options: OrderApiOptions) {\n super('OrderApi', options)\n }\n\n createOrder(params: CreateOrderParams): Promise<Order> {\n return this.request<Order>('/api/orders/create', params)\n }\n\n updateOrder(params: UpdateOrderParams): Promise<Order> {\n return this.request<Order>('/api/orders/update', params)\n }\n\n getOrder(params: GetOrderParams): Promise<Order> {\n return this.request<Order>('/api/orders/get', params)\n }\n\n updateTransaction(params: UpdateTransactionParams): Promise<Transaction> {\n return this.request<Transaction>('/api/transactions/update', params)\n }\n\n checkout(params: CheckoutParams): Promise<Order> {\n return this.request<Order>('/api/orders/checkout', params)\n }\n\n createFulfillment(params: CreateFulfillmentParams): Promise<Fulfillment> {\n return this.request<Fulfillment>('/api/orders/create-fulfillment', params)\n }\n\n updateFulfillment(params: UpdateFulfillmentParams): Promise<Fulfillment> {\n return this.request<Fulfillment>('/api/orders/update-fulfillment', params)\n }\n\n returnWithRefund(params: ReturnWithRefundParams): Promise<{ return: Return; transaction: Transaction | null }> {\n return this.request<{ return: Return; transaction: Transaction | null }>('/api/returns/return-refund', params)\n }\n\n createReturn(params: CreateReturnParams): Promise<Return> {\n return this.request<Return>('/api/returns/create', params)\n }\n\n updateReturn(params: UpdateReturnParams): Promise<Return> {\n return this.request<Return>('/api/returns/update', params)\n }\n\n validateDiscount(params: ValidateDiscountParams): Promise<ValidateDiscountResult> {\n return this.request<ValidateDiscountResult>('/api/discounts/validate', params)\n }\n\n calculateShipping(params: CalculateShippingParams): Promise<CalculateShippingResult> {\n return this.request<CalculateShippingResult>('/api/shipping-policies/calculate', params)\n }\n\n createExchange(params: CreateExchangeParams): Promise<Exchange> {\n return this.request<Exchange>('/api/exchanges/create', params)\n }\n\n updateExchange(params: UpdateExchangeParams): Promise<Exchange> {\n return this.request<Exchange>('/api/exchanges/update', params)\n }\n}\n","import type { Cart, CartItem } from '../../payload-types'\nimport { httpFetch } from '../internal/utils'\nimport { createApiError, createConfigError } from '../internal/errors'\n\nexport interface CartApiOptions {\n clientKey: string\n secretKey?: string\n customerToken?: string | (() => string | null)\n baseUrl?: string\n onUnauthorized?: () => Promise<string | null>\n}\n\nexport type AddItemParams = {\n cartId: string\n product: string\n variant: string\n option: string\n quantity: number\n}\n\nexport type UpdateItemParams = {\n cartItemId: string\n quantity: number\n}\n\nexport type RemoveItemParams = {\n cartItemId: string\n}\n\nexport type ApplyDiscountParams = {\n cartId: string\n discountCode: string\n}\n\nexport type RemoveDiscountParams = {\n cartId: string\n}\n\nexport type ClearCartParams = {\n cartId: string\n}\n\nexport class CartApi {\n private readonly clientKey: string\n private readonly secretKey?: string\n private readonly customerToken?: string | (() => string | null)\n private readonly baseUrl?: string\n private readonly onUnauthorized?: () => Promise<string | null>\n\n constructor(options: CartApiOptions) {\n if (!options.clientKey) {\n throw createConfigError('clientKey is required for CartApi.')\n }\n if (!options.secretKey && !options.customerToken) {\n throw createConfigError('Either secretKey or customerToken is required for CartApi.')\n }\n\n this.clientKey = options.clientKey\n this.secretKey = options.secretKey\n this.customerToken = options.customerToken\n this.baseUrl = options.baseUrl\n this.onUnauthorized = options.onUnauthorized\n }\n\n private async execute<T>(endpoint: string, method: 'GET' | 'POST', body?: unknown): Promise<T> {\n const token = typeof this.customerToken === 'function'\n ? this.customerToken()\n : this.customerToken\n\n const response = await httpFetch(endpoint, {\n method,\n clientKey: this.clientKey,\n secretKey: this.secretKey,\n customerToken: token ?? undefined,\n baseUrl: this.baseUrl,\n ...(token && this.onUnauthorized && { onUnauthorized: this.onUnauthorized }),\n ...(body !== undefined && { body: JSON.stringify(body) }),\n })\n\n let data: Record<string, unknown>\n try {\n data = await response.json()\n } catch {\n throw createApiError(\n `Invalid JSON response from ${endpoint}`,\n response.status,\n undefined,\n 'Server returned an invalid response.',\n 'Check if the API endpoint is available.',\n )\n }\n\n if (data.error) {\n const errorMessage = typeof data.error === 'string' ? data.error : 'Unknown API error'\n throw createApiError(\n errorMessage,\n response.status,\n data,\n errorMessage,\n 'An error occurred while processing the request.',\n )\n }\n\n return data as T\n }\n\n getCart(cartId: string): Promise<Cart> {\n return this.execute<Cart>(`/api/carts/${cartId}`, 'GET')\n }\n\n addItem(params: AddItemParams): Promise<CartItem> {\n return this.execute<CartItem>('/api/carts/add-item', 'POST', params)\n }\n\n updateItem(params: UpdateItemParams): Promise<CartItem> {\n return this.execute<CartItem>('/api/carts/update-item', 'POST', params)\n }\n\n removeItem(params: RemoveItemParams): Promise<{ success: boolean }> {\n return this.execute<{ success: boolean }>('/api/carts/remove-item', 'POST', params)\n }\n\n applyDiscount(params: ApplyDiscountParams): Promise<Cart> {\n return this.execute<Cart>('/api/carts/apply-discount', 'POST', params)\n }\n\n removeDiscount(params: RemoveDiscountParams): Promise<Cart> {\n return this.execute<Cart>('/api/carts/remove-discount', 'POST', params)\n }\n\n clearCart(params: ClearCartParams): Promise<{ success: boolean }> {\n return this.execute<{ success: boolean }>('/api/carts/clear', 'POST', params)\n }\n}\n","import { BaseApi, type ServerApiOptions } from './base-api'\n\nexport type ProductApiOptions = ServerApiOptions\n\nexport type StockCheckParams = {\n items: Array<{\n optionId: string\n quantity: number\n }>\n}\n\nexport type StockCheckResult = {\n optionId: string\n available: boolean\n availableStock: number\n requestedQuantity: number\n error?: string\n}\n\nexport type StockCheckResponse = {\n results: StockCheckResult[]\n allAvailable: boolean\n}\n\nexport class ProductApi extends BaseApi {\n constructor(options: ProductApiOptions) {\n super('ProductApi', options)\n }\n\n stockCheck(params: StockCheckParams): Promise<StockCheckResponse> {\n return this.request<StockCheckResponse>('/api/products/stock-check', params)\n }\n}\n","/**\n * Resolves a Payload CMS relation field value.\n * When depth is 0, relation fields return just the ID (string or number).\n * When depth > 0, they return the full document object (T).\n * This utility normalizes both cases to T | null.\n *\n * @param ref - The relation field value (T, string, number, null, or undefined)\n * @returns The resolved document object, or null if not populated\n */\nexport const resolveRelation = <T>(ref: T | string | number | null | undefined): T | null => {\n if (typeof ref === 'string' || typeof ref === 'number' || ref === null || ref === undefined)\n return null\n return ref\n}\n","import type { Metadata } from 'next'\nimport { resolveRelation } from '../../utils/types'\n\nexport interface ImageLike {\n url?: string | null\n width?: number | null\n height?: number | null\n alt?: string | null\n sizes?: Record<string, { url?: string | null; width?: number | null; height?: number | null } | undefined>\n}\n\nexport interface SeoInput {\n title?: string | null\n description?: string | null\n noIndex?: boolean | null\n canonical?: string | null\n openGraph?: {\n title?: string | null\n description?: string | null\n image?: ImageLike | string | null\n } | null\n}\n\nexport interface GenerateMetadataOptions {\n siteName?: string\n}\n\nexport function extractSeo(doc: Record<string, unknown>): SeoInput {\n const seo = (doc.seo ?? {}) as Record<string, unknown>\n const og = (seo.openGraph ?? {}) as Record<string, unknown>\n\n return {\n title: (seo.title as string) ?? (doc.title as string) ?? null,\n description: (seo.description as string) ?? null,\n noIndex: (seo.noIndex as boolean) ?? null,\n canonical: (seo.canonical as string) ?? null,\n openGraph: {\n title: (og.title as string) ?? null,\n description: (og.description as string) ?? null,\n image: (og.image as ImageLike | string | null) ?? null,\n },\n }\n}\n\nexport function generateMetadata(\n input: SeoInput,\n options?: GenerateMetadataOptions,\n): Metadata {\n const title = input.title ?? undefined\n const description = input.description ?? undefined\n\n const ogTitle = input.openGraph?.title ?? title\n const ogDescription = input.openGraph?.description ?? description\n const image = resolveMetaImage(input.openGraph?.image)\n\n return {\n title,\n description,\n ...(input.noIndex && { robots: { index: false, follow: false } }),\n ...(input.canonical && { alternates: { canonical: input.canonical } }),\n openGraph: {\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(options?.siteName && { siteName: options.siteName }),\n ...(image && { images: [image] }),\n },\n twitter: {\n card: image ? 'summary_large_image' : 'summary',\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(image && { images: [image.url] }),\n },\n }\n}\n\nfunction resolveMetaImage(\n ref: ImageLike | string | null | undefined,\n): { url: string; width?: number; height?: number; alt?: string } | null {\n const image = resolveRelation<ImageLike>(ref)\n if (!image) return null\n\n // Prefer sizes['1536'] (closest to OG 1200px standard), fallback to original url\n const sized = image.sizes?.['1536']\n const url = sized?.url || image.url\n if (!url) return null\n\n const width = sized?.url ? sized.width : image.width\n const height = sized?.url ? sized.height : image.height\n\n return {\n url,\n ...(width && { width }),\n ...(height && { height }),\n ...(image.alt && { alt: image.alt }),\n }\n}\n","import type { Metadata } from 'next'\nimport type {\n ApiQueryOptions,\n PublicCollection,\n PayloadFindResponse,\n PayloadMutationResponse,\n} from '../client/types'\nimport { generateMetadata, extractSeo } from '../metadata'\nimport type { GenerateMetadataOptions } from '../metadata'\nimport type { CollectionClient } from './collection-client'\nimport type { CollectionType } from './types'\n\n/**\n * Read-only subset of CollectionQueryBuilder.\n * BrowserClient.from() returns this type to prevent write operations at compile time.\n */\nexport type ReadOnlyQueryBuilder<T extends PublicCollection> = Pick<\n CollectionQueryBuilder<T>,\n 'find' | 'findById' | 'count' | 'findMetadata' | 'findMetadataById'\n>\n\nexport class CollectionQueryBuilder<T extends PublicCollection> {\n constructor(\n private api: CollectionClient,\n private collection: T,\n ) {}\n\n /**\n * Find documents (list query)\n * GET /api/{collection}\n * @returns Payload CMS find response with docs array and pagination\n */\n async find(options?: ApiQueryOptions): Promise<PayloadFindResponse<CollectionType<T>>> {\n return this.api.requestFind<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n options,\n )\n }\n\n /**\n * Find document by ID\n * GET /api/{collection}/{id}\n * @returns Document object directly (no wrapper)\n */\n async findById(\n id: string,\n options?: ApiQueryOptions,\n ): Promise<CollectionType<T>> {\n return this.api.requestFindById<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n options,\n )\n }\n\n /**\n * Create a new document\n * POST /api/{collection}\n * @returns Payload CMS mutation response with doc and message\n */\n async create(\n data: Partial<CollectionType<T>>,\n options?: { file?: File | Blob; filename?: string },\n ): Promise<PayloadMutationResponse<CollectionType<T>>> {\n const endpoint = `/api/${String(this.collection)}`\n if (options?.file) {\n return this.api.requestCreateWithFile<CollectionType<T>>(\n endpoint, data, options.file, options.filename,\n )\n }\n return this.api.requestCreate<CollectionType<T>>(endpoint, data)\n }\n\n /**\n * Update a document by ID\n * PATCH /api/{collection}/{id}\n * @returns Payload CMS mutation response with doc and message\n */\n async update(\n id: string,\n data: Partial<CollectionType<T>>,\n options?: { file?: File | Blob; filename?: string },\n ): Promise<PayloadMutationResponse<CollectionType<T>>> {\n const endpoint = `/api/${String(this.collection)}/${String(id)}`\n if (options?.file) {\n return this.api.requestUpdateWithFile<CollectionType<T>>(\n endpoint, data, options.file, options.filename,\n )\n }\n return this.api.requestUpdate<CollectionType<T>>(endpoint, data)\n }\n\n /**\n * Count documents\n * GET /api/{collection}/count\n * @returns Count response with totalDocs\n */\n async count(options?: ApiQueryOptions): Promise<{ totalDocs: number }> {\n return this.api.requestCount(\n `/api/${String(this.collection)}/count`,\n options,\n )\n }\n\n /**\n * Find first matching document and return its Next.js Metadata.\n * Applies depth: 1 (image populate) and limit: 1 automatically.\n * @returns Metadata or null if no document matches\n */\n async findMetadata(\n options?: ApiQueryOptions,\n metadataOptions?: GenerateMetadataOptions,\n ): Promise<Metadata | null> {\n const { docs } = await this.find({ ...options, limit: 1, depth: 1 })\n const doc = docs[0]\n if (!doc) return null\n return generateMetadata(\n extractSeo(doc as unknown as Record<string, unknown>),\n metadataOptions,\n )\n }\n\n /**\n * Find document by ID and return its Next.js Metadata.\n * Applies depth: 1 (image populate) automatically.\n * @returns Metadata (throws on 404)\n */\n async findMetadataById(\n id: string,\n metadataOptions?: GenerateMetadataOptions,\n ): Promise<Metadata> {\n const doc = await this.findById(id, { depth: 1 })\n return generateMetadata(\n extractSeo(doc as unknown as Record<string, unknown>),\n metadataOptions,\n )\n }\n\n /**\n * Update multiple documents (bulk update)\n * PATCH /api/{collection}\n * @returns Payload CMS find response with updated docs\n */\n async updateMany(\n where: ApiQueryOptions['where'],\n data: Partial<CollectionType<T>>,\n ): Promise<PayloadFindResponse<CollectionType<T>>> {\n return this.api.requestUpdateMany<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n { where, data },\n )\n }\n\n /**\n * Delete a document by ID\n * DELETE /api/{collection}/{id}\n * @returns Deleted document object directly (no wrapper)\n */\n async remove(id: string): Promise<CollectionType<T>> {\n return this.api.requestDelete<CollectionType<T>>(\n `/api/${String(this.collection)}/${String(id)}`,\n )\n }\n\n /**\n * Delete multiple documents (bulk delete)\n * DELETE /api/{collection}\n * @returns Payload CMS find response with deleted docs\n */\n async removeMany(where: ApiQueryOptions['where']): Promise<PayloadFindResponse<CollectionType<T>>> {\n return this.api.requestDeleteMany<CollectionType<T>>(\n `/api/${String(this.collection)}`,\n { where },\n )\n }\n}\n","import { stringify } from 'qs-esm'\nimport type { FetchOptions } from '../internal/utils'\nimport type {\n ApiQueryOptions,\n PayloadFindResponse,\n PayloadMutationResponse,\n} from '../client/types'\nimport { SDKError, createApiError, createValidationError } from '../internal/errors'\n\nexport class HttpClient {\n protected clientKey: string\n protected secretKey?: string\n protected baseUrl?: string\n private getCustomerToken?: () => string | null\n private onUnauthorized?: () => Promise<string | null>\n\n constructor(clientKey: string, secretKey?: string, baseUrl?: string, getCustomerToken?: () => string | null, onUnauthorized?: () => Promise<string | null>) {\n if (!clientKey) {\n throw createValidationError('clientKey is required.')\n }\n\n this.clientKey = clientKey\n this.secretKey = secretKey\n this.baseUrl = baseUrl\n this.getCustomerToken = getCustomerToken\n this.onUnauthorized = onUnauthorized\n }\n\n protected get defaultOptions(): FetchOptions {\n const opts: FetchOptions = { clientKey: this.clientKey, secretKey: this.secretKey, baseUrl: this.baseUrl }\n const token = this.getCustomerToken?.()\n if (token) {\n opts.customerToken = token\n if (this.onUnauthorized) {\n opts.onUnauthorized = this.onUnauthorized\n }\n }\n return opts\n }\n\n protected buildUrl(endpoint: string, options?: ApiQueryOptions): string {\n if (!options) return endpoint\n const queryString = stringify(options, { addQueryPrefix: true })\n return queryString ? `${endpoint}${queryString}` : endpoint\n }\n\n protected assertJsonResponse(response: Response): void {\n const contentType = response.headers.get('content-type')\n if (!contentType?.includes('application/json')) {\n throw createApiError('Response is not in JSON format.', response.status, { contentType })\n }\n }\n\n /**\n * Parse Payload CMS find response (list query)\n * Returns native Payload response structure\n */\n protected async parseFindResponse<T>(response: Response): Promise<PayloadFindResponse<T>> {\n const contentType = response.headers.get('content-type')\n\n try {\n this.assertJsonResponse(response)\n\n const jsonData = await response.json()\n\n // Validate it's a find response\n if (jsonData.docs === undefined) {\n throw createApiError('Invalid find response.', response.status, { jsonData })\n }\n\n return {\n docs: jsonData.docs,\n totalDocs: jsonData.totalDocs || 0,\n limit: jsonData.limit || 20,\n totalPages: jsonData.totalPages || 0,\n page: jsonData.page || 1,\n pagingCounter: jsonData.pagingCounter || 1,\n hasPrevPage: jsonData.hasPrevPage || false,\n hasNextPage: jsonData.hasNextPage || false,\n prevPage: jsonData.prevPage ?? null,\n nextPage: jsonData.nextPage ?? null,\n }\n } catch (error) {\n if (error instanceof SDKError) throw error\n throw createApiError('Failed to parse response.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n /**\n * Parse Payload CMS mutation response (create/update)\n * Returns native Payload response structure\n */\n protected async parseMutationResponse<T>(response: Response): Promise<PayloadMutationResponse<T>> {\n const contentType = response.headers.get('content-type')\n\n try {\n this.assertJsonResponse(response)\n\n const jsonData = await response.json()\n\n // Validate it's a mutation response\n if (jsonData.doc === undefined) {\n throw createApiError('Invalid mutation response.', response.status, { jsonData })\n }\n\n return {\n message: jsonData.message || '',\n doc: jsonData.doc,\n errors: jsonData.errors,\n }\n } catch (error) {\n if (error instanceof SDKError) throw error\n throw createApiError('Failed to parse response.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n /**\n * Parse Payload CMS document response (findById/delete)\n * Returns document directly without wrapper\n */\n protected async parseDocumentResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type')\n\n try {\n this.assertJsonResponse(response)\n\n const jsonData = await response.json()\n return jsonData as T\n } catch (error) {\n if (error instanceof SDKError) throw error\n throw createApiError('Failed to parse response.', response.status, {\n contentType,\n error: error instanceof Error ? error.message : error,\n })\n }\n }\n\n}\n","import { HttpClient } from './http-client'\nimport type {\n ApiQueryOptions,\n PublicCollection,\n PayloadFindResponse,\n PayloadMutationResponse,\n} from '../client/types'\nimport { CollectionQueryBuilder } from './query-builder'\nimport { httpFetch } from '../internal/utils'\n\nfunction buildPayloadFormData(data: unknown, file: File | Blob, filename?: string): FormData {\n const formData = new FormData()\n formData.append('file', file, filename)\n if (data != null) {\n formData.append('_payload', JSON.stringify(data))\n }\n return formData\n}\n\nexport class CollectionClient extends HttpClient {\n constructor(clientKey: string, secretKey?: string, baseUrl?: string, getCustomerToken?: () => string | null, onUnauthorized?: () => Promise<string | null>) {\n super(clientKey, secretKey, baseUrl, getCustomerToken, onUnauthorized)\n }\n\n from<T extends PublicCollection>(collection: T): CollectionQueryBuilder<T> {\n return new CollectionQueryBuilder(this, collection)\n }\n\n // ============================================================================\n // Payload-native methods\n // ============================================================================\n\n /**\n * Find documents (list query)\n * GET /api/{collection}\n */\n async requestFind<T = unknown>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<PayloadFindResponse<T>> {\n const url = this.buildUrl(endpoint, options)\n const response = await httpFetch(url, { ...this.defaultOptions, method: 'GET' })\n return this.parseFindResponse<T>(response)\n }\n\n /**\n * Find document by ID\n * GET /api/{collection}/{id}\n */\n async requestFindById<T = unknown>(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<T> {\n const url = this.buildUrl(endpoint, options)\n const response = await httpFetch(url, { ...this.defaultOptions, method: 'GET' })\n return this.parseDocumentResponse<T>(response)\n }\n\n /**\n * Create document\n * POST /api/{collection}\n */\n async requestCreate<T = unknown>(\n endpoint: string,\n data?: unknown,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'POST',\n body: data ? JSON.stringify(data) : undefined,\n })\n return this.parseMutationResponse<T>(response)\n }\n\n /**\n * Update document\n * PATCH /api/{collection}/{id}\n */\n async requestUpdate<T = unknown>(\n endpoint: string,\n data?: unknown,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'PATCH',\n body: data ? JSON.stringify(data) : undefined,\n })\n return this.parseMutationResponse<T>(response)\n }\n\n /**\n * Count documents\n * GET /api/{collection}/count\n */\n async requestCount(\n endpoint: string,\n options?: ApiQueryOptions,\n ): Promise<{ totalDocs: number }> {\n const url = this.buildUrl(endpoint, options)\n const response = await httpFetch(url, { ...this.defaultOptions, method: 'GET' })\n return this.parseDocumentResponse<{ totalDocs: number }>(response)\n }\n\n /**\n * Update multiple documents (bulk update)\n * PATCH /api/{collection}\n */\n async requestUpdateMany<T = unknown>(\n endpoint: string,\n data: { where?: unknown; data: unknown },\n ): Promise<PayloadFindResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'PATCH',\n body: JSON.stringify(data),\n })\n return this.parseFindResponse<T>(response)\n }\n\n /**\n * Delete document\n * DELETE /api/{collection}/{id}\n */\n async requestDelete<T = unknown>(endpoint: string): Promise<T> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'DELETE',\n })\n return this.parseDocumentResponse<T>(response)\n }\n\n /**\n * Delete multiple documents (bulk delete)\n * DELETE /api/{collection}\n */\n async requestDeleteMany<T = unknown>(\n endpoint: string,\n data: { where?: unknown },\n ): Promise<PayloadFindResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'DELETE',\n body: JSON.stringify(data),\n })\n return this.parseFindResponse<T>(response)\n }\n\n /**\n * Create document with file upload\n * POST /api/{collection} (multipart/form-data)\n */\n async requestCreateWithFile<T = unknown>(\n endpoint: string,\n data: unknown,\n file: File | Blob,\n filename?: string,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'POST',\n body: buildPayloadFormData(data, file, filename),\n })\n return this.parseMutationResponse<T>(response)\n }\n\n /**\n * Update document with file upload\n * PATCH /api/{collection}/{id} (multipart/form-data)\n */\n async requestUpdateWithFile<T = unknown>(\n endpoint: string,\n data: unknown,\n file: File | Blob,\n filename?: string,\n ): Promise<PayloadMutationResponse<T>> {\n const response = await httpFetch(endpoint, {\n ...this.defaultOptions,\n method: 'PATCH',\n body: buildPayloadFormData(data, file, filename),\n })\n return this.parseMutationResponse<T>(response)\n }\n\n}\n","import type { Config } from '../../payload-types'\n\n/**\n * Collection type derived from Payload Config.\n * This ensures type safety and automatic synchronization with payload-types.ts\n */\nexport type Collection = keyof Config['collections']\n\n/**\n * Internal collections that should not be exposed via SDK.\n * Includes Payload system collections and admin-only collections.\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst INTERNAL_COLLECTIONS = [\n 'users',\n 'payload-kv',\n 'payload-locked-documents',\n 'payload-preferences',\n 'payload-migrations',\n 'field-configs',\n 'audiences',\n 'email-logs',\n 'api-usage',\n 'subscriptions',\n 'billing-history',\n 'post-authors',\n 'order-status-logs',\n] as const\n\ntype InternalCollection = (typeof INTERNAL_COLLECTIONS)[number]\n\n/**\n * Array of all public collection names for runtime use (e.g., Zod enum validation).\n * This is the single source of truth for which collections are publicly accessible via SDK.\n */\nexport const COLLECTIONS = [\n 'tenants',\n 'tenant-metadata',\n 'tenant-logos',\n 'tenant-og-images',\n 'products',\n 'product-variants',\n 'product-options',\n 'product-categories',\n 'product-tags',\n 'product-images',\n 'product-collections',\n 'brands',\n 'brand-logos',\n 'orders',\n 'order-products',\n 'returns',\n 'return-products',\n 'exchanges',\n 'exchange-products',\n 'fulfillments',\n 'fulfillment-items',\n 'transactions',\n 'customers',\n 'customer-addresses',\n 'customer-groups',\n 'customer-group-images',\n 'carts',\n 'cart-items',\n 'discounts',\n 'shipping-policies',\n 'documents',\n 'document-categories',\n 'document-types',\n 'document-images',\n 'posts',\n 'post-categories',\n 'post-tags',\n 'post-images',\n 'playlists',\n 'playlist-images',\n 'playlist-categories',\n 'playlist-tags',\n 'musics',\n 'galleries',\n 'gallery-images',\n 'gallery-categories',\n 'gallery-tags',\n 'flows',\n 'flow-images',\n 'flow-node-types',\n 'flow-edge-types',\n 'flow-categories',\n 'flow-tags',\n 'videos',\n 'video-images',\n 'video-categories',\n 'video-tags',\n 'live-streams',\n 'live-stream-images',\n 'forms',\n 'form-submissions',\n 'media',\n] as const\n\n/**\n * Public collections available for SDK access.\n * Derived from the COLLECTIONS array (single source of truth).\n */\nexport type PublicCollection = (typeof COLLECTIONS)[number]\n\n/**\n * Compile-time completeness check: every Config collection must be either public or internal.\n * If this fails, a new collection was added to Payload but not categorized.\n */\ntype _Uncategorized = Exclude<Collection, PublicCollection | InternalCollection>\nconst _assertAllCategorized: [_Uncategorized] extends [never] ? true : _Uncategorized = true\n","import { ApiError, NetworkError, TimeoutError } from '../internal/errors'\nimport type { PayloadFindResponse } from '../client/types'\nimport type { Order } from '../../payload-types'\nimport type {\n CustomerAuthResponse,\n CustomerRefreshResponse,\n CustomerRegisterData,\n CustomerLoginData,\n CustomerProfile,\n CustomerAuthOptions,\n UpdateProfileData,\n} from './types'\n\nconst DEFAULT_TIMEOUT = 15000\n\n/**\n * Customer authentication client for BrowserClient.\n *\n * Manages customer registration, login, logout, and token lifecycle.\n * All requests include X-Client-Key for tenant resolution.\n */\nexport class CustomerAuth {\n private clientKey: string\n private baseUrl: string\n private token: string | null\n private onTokenChange?: (token: string | null) => void\n private refreshPromise: Promise<CustomerRefreshResponse> | null = null\n\n constructor(clientKey: string, baseUrl: string, options?: CustomerAuthOptions) {\n this.clientKey = clientKey\n this.baseUrl = baseUrl\n\n if (options?.persist) {\n const key = typeof options.persist === 'string' ? options.persist : 'customer-token'\n const isBrowser = typeof window !== 'undefined'\n this.token = isBrowser ? (localStorage.getItem(key) ?? null) : null\n this.onTokenChange = isBrowser\n ? (token) => {\n if (token) localStorage.setItem(key, token)\n else localStorage.removeItem(key)\n }\n : undefined\n } else {\n this.token = options?.token ?? null\n this.onTokenChange = options?.onTokenChange\n }\n }\n\n /**\n * Register a new customer account\n */\n async register(data: CustomerRegisterData): Promise<{ customer: CustomerProfile }> {\n return this.requestJson('/api/customers/register', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n }\n\n /**\n * Login with email and password. Stores the token internally.\n */\n async login(data: CustomerLoginData): Promise<CustomerAuthResponse> {\n const result: CustomerAuthResponse = await this.requestJson('/api/customers/login', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n\n this.setToken(result.token)\n return result\n }\n\n /**\n * Refresh the current token. Requires a valid (non-expired) token.\n */\n async refreshToken(): Promise<CustomerRefreshResponse> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n if (this.refreshPromise) return this.refreshPromise\n\n this.refreshPromise = this._doRefreshToken()\n try {\n return await this.refreshPromise\n } finally {\n this.refreshPromise = null\n }\n }\n\n private async _doRefreshToken(): Promise<CustomerRefreshResponse> {\n const result: CustomerRefreshResponse = await this.requestJson('/api/customers/refresh', {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.token}` },\n })\n\n this.setToken(result.token)\n return result\n }\n\n /**\n * Clear the stored token\n */\n logout(): void {\n this.setToken(null)\n }\n\n /**\n * Get the current authenticated customer's profile\n */\n async me(): Promise<CustomerProfile | null> {\n if (!this.token) return null\n\n try {\n const data = await this.requestJson<{ customer: CustomerProfile }>('/api/customers/me', {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.token}` },\n })\n return data.customer ?? null\n } catch (error) {\n if (error instanceof ApiError && error.status === 401) {\n this.setToken(null)\n return null\n }\n throw error\n }\n }\n\n /**\n * Request a password reset email\n */\n async forgotPassword(email: string): Promise<void> {\n await this.requestJson('/api/customers/forgot-password', {\n method: 'POST',\n body: JSON.stringify({ email }),\n })\n }\n\n /**\n * Reset password using a token from the reset email\n */\n async resetPassword(token: string, password: string): Promise<void> {\n await this.requestJson('/api/customers/reset-password', {\n method: 'POST',\n body: JSON.stringify({ token, password }),\n })\n }\n\n /**\n * Update the authenticated customer's profile (name, phone, marketingConsent)\n */\n async updateProfile(data: UpdateProfileData): Promise<CustomerProfile> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n const result = await this.requestJson<{ customer: CustomerProfile }>('/api/customers/me', {\n method: 'PATCH',\n headers: { Authorization: `Bearer ${this.token}` },\n body: JSON.stringify(data),\n })\n return result.customer\n }\n\n /**\n * Change the password of the currently authenticated customer\n */\n async changePassword(currentPassword: string, newPassword: string): Promise<void> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n await this.requestJson('/api/customers/change-password', {\n method: 'POST',\n headers: { Authorization: `Bearer ${this.token}` },\n body: JSON.stringify({ currentPassword, newPassword }),\n })\n }\n\n /**\n * Verify email using the verification token\n */\n async verifyEmail(token: string): Promise<void> {\n await this.requestJson('/api/customers/verify-email', {\n method: 'POST',\n body: JSON.stringify({ token }),\n })\n }\n\n /**\n * Get the authenticated customer's orders with pagination and optional status filter\n */\n async getMyOrders(options?: { page?: number; limit?: number; status?: string }): Promise<PayloadFindResponse<Order>> {\n if (!this.token) throw new ApiError('Not authenticated', 401)\n\n const params = new URLSearchParams()\n if (options?.page) params.set('page', String(options.page))\n if (options?.limit) params.set('limit', String(options.limit))\n if (options?.status) params.set('status', options.status)\n\n const qs = params.toString()\n return this.requestJson(`/api/customers/me/orders${qs ? `?${qs}` : ''}`, {\n method: 'GET',\n headers: { Authorization: `Bearer ${this.token}` },\n })\n }\n\n /**\n * Get the current token (or null if not authenticated)\n */\n getToken(): string | null {\n return this.token\n }\n\n /**\n * Set the token manually (e.g. from SSR)\n */\n setToken(token: string | null): void {\n this.token = token\n this.onTokenChange?.(token)\n }\n\n /**\n * Check if the customer is currently authenticated\n */\n isAuthenticated(): boolean {\n return this.token !== null\n }\n\n /**\n * Internal: make a request with timeout and error handling.\n * Auth endpoints don't retry — failures are final.\n */\n private async requestJson<T = unknown>(path: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers)\n headers.set('X-Client-Key', this.clientKey)\n if (!headers.has('Content-Type') && init.body) {\n headers.set('Content-Type', 'application/json')\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT)\n\n let res: Response\n try {\n res = await fetch(`${this.baseUrl}${path}`, {\n ...init,\n headers,\n signal: controller.signal,\n })\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(\n `Request timed out after ${DEFAULT_TIMEOUT}ms`,\n { url: path, timeout: DEFAULT_TIMEOUT },\n )\n }\n\n throw new NetworkError(\n error instanceof Error ? error.message : 'Network request failed',\n undefined,\n { url: path },\n 'Network connection failed.',\n 'Please check your internet connection and try again.',\n )\n }\n\n clearTimeout(timeoutId)\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}))\n throw new ApiError(\n body.error || `HTTP ${res.status}`,\n res.status,\n body.details,\n body.error,\n )\n }\n\n try {\n return await res.json()\n } catch {\n throw new ApiError('Invalid JSON response from server', res.status, undefined, 'INVALID_RESPONSE')\n }\n }\n}\n","import { isServer, QueryClient, defaultShouldDehydrateQuery } from '@tanstack/react-query'\n\nfunction makeQueryClient() {\n return new QueryClient({\n defaultOptions: {\n queries: {\n // Infinite staleTime: server-fetched data persists until explicitly invalidated.\n // For browser clients needing fresher data, override per-query:\n // useQuery({ ..., staleTime: 5 * 60 * 1000 })\n staleTime: Number.POSITIVE_INFINITY,\n refetchOnWindowFocus: false,\n },\n dehydrate: {\n shouldDehydrateQuery: (query) =>\n defaultShouldDehydrateQuery(query) || query.state.status === 'pending',\n shouldRedactErrors: () => false,\n },\n },\n })\n}\n\nlet browserQueryClient: QueryClient | undefined\n\nexport function getQueryClient() {\n if (isServer) {\n return makeQueryClient()\n }\n if (!browserQueryClient) {\n browserQueryClient = makeQueryClient()\n }\n return browserQueryClient\n}\n","import {\n QueryClient,\n useQuery as useQueryOriginal,\n useSuspenseQuery as useSuspenseQueryOriginal,\n useInfiniteQuery as useInfiniteQueryOriginal,\n useSuspenseInfiniteQuery as useSuspenseInfiniteQueryOriginal,\n useMutation as useMutationOriginal,\n} from '@tanstack/react-query'\nimport type { PublicCollection, ApiQueryOptions, PayloadFindResponse, PayloadMutationResponse } from '../client/types'\nimport { type CollectionClient, type CollectionType } from '../collection'\nimport { SDKError } from '../internal/errors'\nimport { collectionKeys } from './query-keys'\n\n// ============================================================================\n// Query Params Types\n// ============================================================================\n\nexport interface CollectionQueryParams<T extends PublicCollection> {\n collection: T\n options?: ApiQueryOptions\n}\n\nexport interface CollectionDetailQueryParams<T extends PublicCollection> {\n collection: T\n id: string\n options?: ApiQueryOptions\n}\n\nexport interface CollectionInfiniteQueryParams<T extends PublicCollection> {\n collection: T\n options?: Omit<ApiQueryOptions, 'page'>\n pageSize?: number\n}\n\n// ============================================================================\n// Shared option types\n// ============================================================================\n\ninterface QueryOptions {\n enabled?: boolean\n staleTime?: number\n gcTime?: number\n refetchOnWindowFocus?: boolean\n refetchOnMount?: boolean\n refetchInterval?: number | false\n retry?: boolean | number\n}\n\ntype SuspenseQueryOptions = Omit<QueryOptions, 'enabled'>\n\ninterface MutationCallbacks<TData> {\n onSuccess?: (data: TData) => void\n onError?: (error: SDKError) => void\n onSettled?: () => void\n}\n\n// ============================================================================\n// Collection Hooks Mixin\n// ============================================================================\n\nconst DEFAULT_PAGE_SIZE = 20\n\nexport class CollectionHooks {\n protected queryClient: QueryClient\n protected collectionClient: CollectionClient\n\n constructor(queryClient: QueryClient, collectionClient: CollectionClient) {\n this.queryClient = queryClient\n this.collectionClient = collectionClient\n }\n\n // ===== useQuery =====\n useQuery<T extends PublicCollection>(\n params: CollectionQueryParams<T>,\n options?: QueryOptions,\n ) {\n const { collection, options: queryOptions } = params\n\n return useQueryOriginal({\n queryKey: collectionKeys(collection).list(queryOptions),\n queryFn: async () => {\n const response = await this.collectionClient.from(collection).find(queryOptions)\n return response.docs ?? []\n },\n ...options,\n })\n }\n\n // ===== useSuspenseQuery =====\n useSuspenseQuery<T extends PublicCollection>(\n params: CollectionQueryParams<T>,\n options?: SuspenseQueryOptions,\n ) {\n const { collection, options: queryOptions } = params\n\n return useSuspenseQueryOriginal({\n queryKey: collectionKeys(collection).list(queryOptions),\n queryFn: async () => {\n const response = await this.collectionClient.from(collection).find(queryOptions)\n return response.docs ?? []\n },\n ...options,\n })\n }\n\n // ===== useQueryById =====\n useQueryById<T extends PublicCollection>(\n params: CollectionDetailQueryParams<T>,\n options?: QueryOptions,\n ) {\n const { collection, id, options: queryOptions } = params\n\n return useQueryOriginal({\n queryKey: collectionKeys(collection).detail(id, queryOptions),\n queryFn: async () => {\n return await this.collectionClient.from(collection).findById(id, queryOptions)\n },\n ...options,\n })\n }\n\n // ===== useSuspenseQueryById =====\n useSuspenseQueryById<T extends PublicCollection>(\n params: CollectionDetailQueryParams<T>,\n options?: SuspenseQueryOptions,\n ) {\n const { collection, id, options: queryOptions } = params\n\n return useSuspenseQueryOriginal({\n queryKey: collectionKeys(collection).detail(id, queryOptions),\n queryFn: async () => {\n return await this.collectionClient.from(collection).findById(id, queryOptions)\n },\n ...options,\n })\n }\n\n // ===== useInfiniteQuery =====\n useInfiniteQuery<T extends PublicCollection>(\n params: CollectionInfiniteQueryParams<T>,\n options?: QueryOptions,\n ) {\n const { collection, options: queryOptions, pageSize = DEFAULT_PAGE_SIZE } = params\n\n return useInfiniteQueryOriginal({\n queryKey: collectionKeys(collection).infinite(queryOptions),\n queryFn: async ({ pageParam }) => {\n const response = await this.collectionClient\n .from(collection)\n .find({ ...queryOptions, page: pageParam, limit: pageSize })\n return response\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage: PayloadFindResponse<CollectionType<T>>) => {\n return lastPage.hasNextPage ? lastPage.nextPage : undefined\n },\n ...options,\n })\n }\n\n // ===== useSuspenseInfiniteQuery =====\n useSuspenseInfiniteQuery<T extends PublicCollection>(\n params: CollectionInfiniteQueryParams<T>,\n options?: SuspenseQueryOptions,\n ) {\n const { collection, options: queryOptions, pageSize = DEFAULT_PAGE_SIZE } = params\n\n return useSuspenseInfiniteQueryOriginal({\n queryKey: collectionKeys(collection).infinite(queryOptions),\n queryFn: async ({ pageParam }) => {\n const response = await this.collectionClient\n .from(collection)\n .find({ ...queryOptions, page: pageParam, limit: pageSize })\n return response\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage: PayloadFindResponse<CollectionType<T>>) => {\n return lastPage.hasNextPage ? lastPage.nextPage : undefined\n },\n ...options,\n })\n }\n\n // ===== prefetchQuery =====\n async prefetchQuery<T extends PublicCollection>(\n params: CollectionQueryParams<T>,\n options?: { staleTime?: number },\n ) {\n const { collection, options: queryOptions } = params\n\n return this.queryClient.prefetchQuery({\n queryKey: collectionKeys(collection).list(queryOptions),\n queryFn: async () => {\n const response = await this.collectionClient.from(collection).find(queryOptions)\n return response.docs ?? []\n },\n ...options,\n })\n }\n\n // ===== prefetchQueryById =====\n async prefetchQueryById<T extends PublicCollection>(\n params: CollectionDetailQueryParams<T>,\n options?: { staleTime?: number },\n ) {\n const { collection, id, options: queryOptions } = params\n\n return this.queryClient.prefetchQuery({\n queryKey: collectionKeys(collection).detail(id, queryOptions),\n queryFn: async () => {\n return await this.collectionClient.from(collection).findById(id, queryOptions)\n },\n ...options,\n })\n }\n\n // ===== prefetchInfiniteQuery =====\n async prefetchInfiniteQuery<T extends PublicCollection>(\n params: CollectionInfiniteQueryParams<T>,\n options?: { pages?: number; staleTime?: number },\n ) {\n const { collection, options: queryOptions, pageSize = DEFAULT_PAGE_SIZE } = params\n\n return this.queryClient.prefetchInfiniteQuery({\n queryKey: collectionKeys(collection).infinite(queryOptions),\n queryFn: async ({ pageParam }) => {\n const response = await this.collectionClient\n .from(collection)\n .find({ ...queryOptions, page: pageParam, limit: pageSize })\n return response\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage: PayloadFindResponse<CollectionType<T>>) => {\n return lastPage.hasNextPage ? lastPage.nextPage : undefined\n },\n pages: options?.pages ?? 1,\n staleTime: options?.staleTime,\n })\n }\n\n // ===== Mutation Hooks =====\n\n useCreate<T extends PublicCollection>(\n params: { collection: T },\n options?: MutationCallbacks<PayloadMutationResponse<CollectionType<T>>>,\n ) {\n const { collection } = params\n\n return useMutationOriginal<\n PayloadMutationResponse<CollectionType<T>>,\n SDKError,\n { data: Partial<CollectionType<T>>; file?: File | Blob; filename?: string }\n >({\n mutationFn: async (variables) => {\n return await this.collectionClient.from(collection).create(\n variables.data,\n variables.file ? { file: variables.file, filename: variables.filename } : undefined,\n )\n },\n onSuccess: (data) => {\n this.queryClient.invalidateQueries({ queryKey: collectionKeys(collection).all })\n options?.onSuccess?.(data)\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n useUpdate<T extends PublicCollection>(\n params: { collection: T },\n options?: MutationCallbacks<PayloadMutationResponse<CollectionType<T>>>,\n ) {\n const { collection } = params\n\n return useMutationOriginal<\n PayloadMutationResponse<CollectionType<T>>,\n SDKError,\n { id: string; data: Partial<CollectionType<T>>; file?: File | Blob; filename?: string }\n >({\n mutationFn: async (variables) => {\n return await this.collectionClient.from(collection).update(\n variables.id,\n variables.data,\n variables.file ? { file: variables.file, filename: variables.filename } : undefined,\n )\n },\n onSuccess: (data) => {\n this.queryClient.invalidateQueries({ queryKey: collectionKeys(collection).all })\n options?.onSuccess?.(data)\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n useRemove<T extends PublicCollection>(\n params: { collection: T },\n options?: MutationCallbacks<CollectionType<T>>,\n ) {\n const { collection } = params\n\n return useMutationOriginal<\n CollectionType<T>,\n SDKError,\n string\n >({\n mutationFn: async (id) => {\n return await this.collectionClient.from(collection).remove(id)\n },\n onSuccess: (data) => {\n this.queryClient.invalidateQueries({ queryKey: collectionKeys(collection).all })\n options?.onSuccess?.(data)\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n // ===== Cache Utilities =====\n\n invalidateQueries<T extends PublicCollection>(collection: T, type?: 'list' | 'detail' | 'infinite') {\n const queryKey = type ? [collection, type] : [collection]\n return this.queryClient.invalidateQueries({ queryKey })\n }\n\n getQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list',\n options?: ApiQueryOptions\n ): CollectionType<T>[] | undefined\n getQueryData<T extends PublicCollection>(\n collection: T,\n type: 'detail',\n id: string,\n options?: ApiQueryOptions\n ): CollectionType<T> | null | undefined\n getQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list' | 'detail',\n idOrOptions?: string | ApiQueryOptions,\n options?: ApiQueryOptions\n ) {\n if (type === 'list') {\n return this.queryClient.getQueryData(collectionKeys(collection).list(idOrOptions as ApiQueryOptions))\n }\n return this.queryClient.getQueryData(collectionKeys(collection).detail(idOrOptions as string, options))\n }\n\n setQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list',\n data: CollectionType<T>[],\n options?: ApiQueryOptions\n ): void\n setQueryData<T extends PublicCollection>(\n collection: T,\n type: 'detail',\n id: string,\n data: CollectionType<T> | null,\n options?: ApiQueryOptions\n ): void\n setQueryData<T extends PublicCollection>(\n collection: T,\n type: 'list' | 'detail',\n dataOrId: CollectionType<T>[] | string,\n dataOrOptions?: CollectionType<T> | null | ApiQueryOptions,\n options?: ApiQueryOptions\n ) {\n if (type === 'list') {\n this.queryClient.setQueryData(\n collectionKeys(collection).list(dataOrOptions as ApiQueryOptions),\n dataOrId as CollectionType<T>[]\n )\n } else {\n this.queryClient.setQueryData(\n collectionKeys(collection).detail(dataOrId as string, options),\n dataOrOptions as CollectionType<T> | null\n )\n }\n }\n}\n","import type { PublicCollection, ApiQueryOptions } from '../client/types'\n\nexport function collectionKeys<T extends PublicCollection>(collection: T) {\n return {\n all: [collection] as const,\n lists: () => [collection, 'list'] as const,\n list: (options?: ApiQueryOptions) => [collection, 'list', options] as const,\n details: () => [collection, 'detail'] as const,\n detail: (id: string, options?: ApiQueryOptions) => [collection, 'detail', id, options] as const,\n infinites: () => [collection, 'infinite'] as const,\n infinite: (options?: Omit<ApiQueryOptions, 'page'>) => [collection, 'infinite', options] as const,\n }\n}\n\nexport const customerKeys = {\n all: ['customer'] as const,\n me: () => ['customer', 'me'] as const,\n}\n","import {\n QueryClient,\n useQuery as useQueryOriginal,\n useMutation as useMutationOriginal,\n} from '@tanstack/react-query'\nimport type { CustomerAuth } from '../customer/customer-auth'\nimport type {\n CustomerAuthResponse,\n CustomerRefreshResponse,\n CustomerProfile,\n CustomerRegisterData,\n CustomerLoginData,\n UpdateProfileData,\n} from '../customer/types'\nimport { createConfigError, SDKError } from '../internal/errors'\nimport { customerKeys } from './query-keys'\n\n// ============================================================================\n// Mutation helper\n// ============================================================================\n\ninterface MutationCallbacks<TData> {\n onSuccess?: (data: TData) => void\n onError?: (error: SDKError) => void\n onSettled?: () => void\n}\n\nfunction createMutation<TData, TVariables>(\n mutationFn: (variables: TVariables) => Promise<TData>,\n callbacks?: MutationCallbacks<TData>,\n onSuccessExtra?: (data: TData) => void,\n) {\n return useMutationOriginal({\n mutationFn,\n onSuccess: (data) => {\n onSuccessExtra?.(data)\n callbacks?.onSuccess?.(data)\n },\n onError: callbacks?.onError,\n onSettled: callbacks?.onSettled,\n })\n}\n\n// ============================================================================\n// Customer Hooks Mixin\n// ============================================================================\n\nexport class CustomerHooks {\n private queryClient: QueryClient\n private customerAuth?: CustomerAuth\n\n constructor(queryClient: QueryClient, customerAuth?: CustomerAuth) {\n this.queryClient = queryClient\n this.customerAuth = customerAuth\n }\n\n private ensureCustomerAuth(): CustomerAuth {\n if (!this.customerAuth) {\n throw createConfigError(\n 'Customer hooks require BrowserClient. Use createBrowserClient() instead of createServerClient().',\n )\n }\n return this.customerAuth\n }\n\n private invalidateMe = () => {\n this.queryClient.invalidateQueries({ queryKey: customerKeys.me() })\n }\n\n // ===== useCustomerMe =====\n useCustomerMe(\n options?: {\n enabled?: boolean\n staleTime?: number\n gcTime?: number\n refetchOnWindowFocus?: boolean\n refetchOnMount?: boolean\n refetchInterval?: number | false\n retry?: boolean | number\n }\n ) {\n return useQueryOriginal({\n queryKey: customerKeys.me(),\n queryFn: async () => {\n return await this.ensureCustomerAuth().me()\n },\n ...options,\n enabled: (options?.enabled ?? true) && !!this.customerAuth?.isAuthenticated(),\n })\n }\n\n // ===== Mutations =====\n\n useCustomerLogin(options?: MutationCallbacks<CustomerAuthResponse>) {\n return createMutation(\n (data: CustomerLoginData) => this.ensureCustomerAuth().login(data),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerRegister(options?: MutationCallbacks<{ customer: CustomerProfile }>) {\n return createMutation(\n (data: CustomerRegisterData) => this.ensureCustomerAuth().register(data),\n options,\n )\n }\n\n useCustomerLogout(options?: MutationCallbacks<void>) {\n return useMutationOriginal({\n mutationFn: async () => {\n this.ensureCustomerAuth().logout()\n },\n onSuccess: () => {\n this.queryClient.removeQueries({ queryKey: customerKeys.all })\n options?.onSuccess?.()\n },\n onError: options?.onError,\n onSettled: options?.onSettled,\n })\n }\n\n useCustomerForgotPassword(options?: MutationCallbacks<void>) {\n return createMutation(\n (email: string) => this.ensureCustomerAuth().forgotPassword(email).then(() => {}),\n options,\n )\n }\n\n useCustomerResetPassword(options?: MutationCallbacks<void>) {\n return createMutation(\n (data: { token: string; password: string }) =>\n this.ensureCustomerAuth().resetPassword(data.token, data.password).then(() => {}),\n options,\n )\n }\n\n useCustomerVerifyEmail(options?: MutationCallbacks<void>) {\n return createMutation(\n (token: string) => this.ensureCustomerAuth().verifyEmail(token).then(() => {}),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerRefreshToken(options?: MutationCallbacks<CustomerRefreshResponse>) {\n return createMutation(\n () => this.ensureCustomerAuth().refreshToken(),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerUpdateProfile(options?: MutationCallbacks<CustomerProfile>) {\n return createMutation(\n (data: UpdateProfileData) => this.ensureCustomerAuth().updateProfile(data),\n options,\n this.invalidateMe,\n )\n }\n\n useCustomerChangePassword(options?: MutationCallbacks<void>) {\n return createMutation(\n (data: { currentPassword: string; newPassword: string }) =>\n this.ensureCustomerAuth().changePassword(data.currentPassword, data.newPassword).then(() => {}),\n options,\n )\n }\n\n // ===== Customer Cache Utilities =====\n\n invalidateCustomerQueries() {\n return this.queryClient.invalidateQueries({ queryKey: customerKeys.all })\n }\n\n getCustomerData(): CustomerProfile | null | undefined {\n return this.queryClient.getQueryData(customerKeys.me())\n }\n\n setCustomerData(data: CustomerProfile | null) {\n this.queryClient.setQueryData(customerKeys.me(), data)\n }\n}\n","import { QueryClient } from '@tanstack/react-query'\nimport type { CollectionClient } from '../collection'\nimport type { CustomerAuth } from '../customer/customer-auth'\nimport { CollectionHooks } from './collection-hooks'\nimport { CustomerHooks } from './customer-hooks'\n\n// Re-export everything from sub-modules for barrel compatibility\nexport { collectionKeys, customerKeys } from './query-keys'\nexport type {\n CollectionQueryParams,\n CollectionDetailQueryParams,\n CollectionInfiniteQueryParams,\n} from './collection-hooks'\n\nexport type ReadOnlyQueryHooks = Omit<QueryHooks, 'useCreate' | 'useUpdate' | 'useRemove'>\n\n/**\n * Composes CollectionHooks + CustomerHooks into a single API surface.\n * All methods are delegated; no logic lives here.\n */\nexport class QueryHooks extends CollectionHooks {\n private _customer: CustomerHooks\n\n constructor(queryClient: QueryClient, collectionClient: CollectionClient, customerAuth?: CustomerAuth) {\n super(queryClient, collectionClient)\n this._customer = new CustomerHooks(queryClient, customerAuth)\n }\n\n // --- Customer hooks delegation ---\n useCustomerMe: CustomerHooks['useCustomerMe'] = (...args) => this._customer.useCustomerMe(...args)\n useCustomerLogin: CustomerHooks['useCustomerLogin'] = (...args) => this._customer.useCustomerLogin(...args)\n useCustomerRegister: CustomerHooks['useCustomerRegister'] = (...args) => this._customer.useCustomerRegister(...args)\n useCustomerLogout: CustomerHooks['useCustomerLogout'] = (...args) => this._customer.useCustomerLogout(...args)\n useCustomerForgotPassword: CustomerHooks['useCustomerForgotPassword'] = (...args) => this._customer.useCustomerForgotPassword(...args)\n useCustomerResetPassword: CustomerHooks['useCustomerResetPassword'] = (...args) => this._customer.useCustomerResetPassword(...args)\n useCustomerVerifyEmail: CustomerHooks['useCustomerVerifyEmail'] = (...args) => this._customer.useCustomerVerifyEmail(...args)\n useCustomerRefreshToken: CustomerHooks['useCustomerRefreshToken'] = (...args) => this._customer.useCustomerRefreshToken(...args)\n useCustomerUpdateProfile: CustomerHooks['useCustomerUpdateProfile'] = (...args) => this._customer.useCustomerUpdateProfile(...args)\n useCustomerChangePassword: CustomerHooks['useCustomerChangePassword'] = (...args) => this._customer.useCustomerChangePassword(...args)\n\n // --- Customer cache delegation ---\n invalidateCustomerQueries: CustomerHooks['invalidateCustomerQueries'] = () => this._customer.invalidateCustomerQueries()\n getCustomerData: CustomerHooks['getCustomerData'] = () => this._customer.getCustomerData()\n setCustomerData: CustomerHooks['setCustomerData'] = (data) => this._customer.setCustomerData(data)\n}\n","import type { QueryClient } from '@tanstack/react-query'\nimport { CartApi } from '../api'\nimport { CollectionClient, type ReadOnlyQueryBuilder } from '../collection'\nimport { CustomerAuth } from '../customer'\nimport { createConfigError } from '../internal/errors'\nimport { getQueryClient } from '../query/get-query-client'\nimport { QueryHooks, type ReadOnlyQueryHooks } from '../query/query-hooks'\nimport {\n resolveApiUrl,\n type ClientBrowserConfig,\n type ClientState,\n type ClientMetadata,\n type PublicCollection,\n} from './types'\n\nexport default class BrowserClient {\n cart: CartApi\n query: ReadOnlyQueryHooks\n collections: CollectionClient\n queryClient: QueryClient\n customer: CustomerAuth\n\n protected state: ClientState\n protected config: ClientBrowserConfig\n protected baseUrl: string\n\n constructor(options: ClientBrowserConfig) {\n if (!options.clientKey) {\n throw createConfigError('clientKey is required.')\n }\n\n this.config = { ...options }\n this.baseUrl = resolveApiUrl()\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent:\n typeof window !== 'undefined' ? window.navigator?.userAgent : 'Node.js',\n }\n\n this.state = { metadata }\n this.queryClient = getQueryClient()\n\n this.customer = new CustomerAuth(this.config.clientKey, this.baseUrl, options.customer)\n\n const onUnauthorized = async (): Promise<string | null> => {\n try {\n const result = await this.customer.refreshToken()\n return result.token ?? null\n } catch {\n return null\n }\n }\n\n this.cart = new CartApi({\n clientKey: this.config.clientKey,\n customerToken: () => this.customer.getToken(),\n baseUrl: this.baseUrl,\n onUnauthorized,\n })\n\n this.collections = new CollectionClient(\n this.config.clientKey,\n undefined,\n this.baseUrl,\n () => this.customer.getToken(),\n onUnauthorized,\n )\n\n this.query = new QueryHooks(this.queryClient, this.collections, this.customer)\n }\n\n from<T extends PublicCollection>(collection: T): ReadOnlyQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n getState(): ClientState {\n return { ...this.state }\n }\n\n getConfig(): ClientBrowserConfig {\n return { ...this.config }\n }\n}\n\nexport function createBrowserClient(\n options: ClientBrowserConfig,\n): BrowserClient {\n return new BrowserClient(options)\n}\n","import type { QueryClient } from '@tanstack/react-query'\nimport { OrderApi, CartApi, ProductApi } from '../api'\nimport { CollectionClient, CollectionQueryBuilder } from '../collection'\nimport { createConfigError } from '../internal/errors'\nimport { getQueryClient } from '../query/get-query-client'\nimport { QueryHooks } from '../query/query-hooks'\nimport {\n resolveApiUrl,\n type ClientServerConfig,\n type ClientState,\n type ClientMetadata,\n type PublicCollection,\n type ClientBrowserConfig,\n} from './types'\n\nexport default class ServerClient {\n api: OrderApi\n cart: CartApi\n product: ProductApi\n query: QueryHooks\n collections: CollectionClient\n queryClient: QueryClient\n\n protected state: ClientState\n protected config: ClientServerConfig\n protected baseUrl: string\n\n constructor(options: ClientServerConfig) {\n if (typeof window !== 'undefined') {\n throw createConfigError(\n 'ServerClient must not be used in a browser environment. ' +\n 'This risks exposing your secretKey in client bundles. ' +\n 'Use createBrowserClient() for browser code instead.',\n )\n }\n\n if (!options.clientKey) {\n throw createConfigError('clientKey is required.')\n }\n if (!options.secretKey) {\n throw createConfigError('secretKey is required.')\n }\n\n this.config = { ...options }\n this.baseUrl = resolveApiUrl()\n\n const metadata: ClientMetadata = {\n timestamp: Date.now(),\n userAgent: 'Node.js',\n }\n\n this.state = { metadata }\n\n this.api = new OrderApi({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.baseUrl,\n })\n\n this.cart = new CartApi({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.baseUrl,\n })\n\n this.product = new ProductApi({\n clientKey: this.config.clientKey,\n secretKey: this.config.secretKey,\n baseUrl: this.baseUrl,\n })\n\n this.collections = new CollectionClient(\n this.config.clientKey,\n this.config.secretKey,\n this.baseUrl,\n )\n\n this.queryClient = getQueryClient()\n this.query = new QueryHooks(this.queryClient, this.collections)\n }\n\n from<T extends PublicCollection>(collection: T): CollectionQueryBuilder<T> {\n return this.collections.from(collection)\n }\n\n getState(): ClientState {\n return { ...this.state }\n }\n\n getConfig(): ClientBrowserConfig {\n const { secretKey: _, ...safeConfig } = this.config\n return safeConfig\n }\n}\n\nexport function createServerClient(options: ClientServerConfig): ServerClient {\n return new ServerClient(options)\n}\n","import type { Collection } from '../client/types'\nimport type { CollectionType } from '../collection/types'\n\nexport type WebhookOperation = 'create' | 'update'\n\nexport interface WebhookEvent<T extends Collection = Collection> {\n collection: T\n operation: WebhookOperation\n data: CollectionType<T>\n}\n\nexport type WebhookHandler<T extends Collection = Collection> = (\n event: WebhookEvent<T>,\n) => Promise<void> | void\n\nexport interface WebhookOptions {\n secret?: string\n}\n\nexport function isValidWebhookEvent(data: unknown): data is WebhookEvent {\n if (typeof data !== 'object' || data === null) return false\n const obj = data as Record<string, unknown>\n return (\n typeof obj.collection === 'string' &&\n (obj.operation === 'create' || obj.operation === 'update') &&\n typeof obj.data === 'object' &&\n obj.data !== null\n )\n}\n\nasync function verifySignature(\n payload: string,\n secret: string,\n signature: string,\n): Promise<boolean> {\n const encoder = new TextEncoder()\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n )\n const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(payload))\n const expected = Array.from(new Uint8Array(sig))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n // Constant-time comparison to prevent timing attacks\n let result = expected.length !== signature.length ? 1 : 0\n const len = Math.max(expected.length, signature.length)\n for (let i = 0; i < len; i++) {\n result |= (expected.charCodeAt(i) || 0) ^ (signature.charCodeAt(i) || 0)\n }\n return result === 0\n}\n\nexport async function handleWebhook<T extends Collection = Collection>(\n request: Request,\n handler: WebhookHandler<T>,\n options?: WebhookOptions,\n): Promise<Response> {\n try {\n const rawBody = await request.text()\n\n if (options?.secret) {\n const signature = request.headers.get('x-webhook-signature') || ''\n const valid = await verifySignature(rawBody, options.secret, signature)\n if (!valid) {\n return new Response(\n JSON.stringify({ error: 'Invalid webhook signature' }),\n { status: 401, headers: { 'Content-Type': 'application/json' } },\n )\n }\n } else {\n console.warn(\n '[@01.software/sdk] Webhook signature verification is disabled. ' +\n 'Set { secret } in handleWebhook() options to enable HMAC-SHA256 verification.',\n )\n }\n\n const body = JSON.parse(rawBody)\n\n if (!isValidWebhookEvent(body)) {\n return new Response(\n JSON.stringify({ error: 'Invalid webhook event format' }),\n { status: 400, headers: { 'Content-Type': 'application/json' } },\n )\n }\n\n await handler(body as WebhookEvent<T>)\n\n return new Response(\n JSON.stringify({ success: true, message: 'Webhook processed' }),\n { status: 200, headers: { 'Content-Type': 'application/json' } },\n )\n } catch (error) {\n console.error('Webhook processing error:', error)\n\n return new Response(\n JSON.stringify({ error: 'Internal server error' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n )\n }\n}\n\nexport function createTypedWebhookHandler<T extends Collection>(\n collection: T,\n handler: (event: WebhookEvent<T>) => Promise<void> | void,\n): WebhookHandler<T> {\n return async (event: WebhookEvent<T>) => {\n if (event.collection !== collection) {\n throw new Error(`Expected collection \"${collection}\", got \"${event.collection}\"`)\n }\n return handler(event)\n }\n}\n","/** Palette colors extracted from an image */\nexport interface ImagePalette {\n vibrant?: string | null\n muted?: string | null\n darkVibrant?: string | null\n darkMuted?: string | null\n lightVibrant?: string | null\n lightMuted?: string | null\n}\n\n/** Common image data shape from Payload CMS upload collections */\nexport interface ImageData {\n url?: string | null\n width?: number | null\n height?: number | null\n alt?: string | null\n lqip?: string | null\n palette?: ImagePalette | null\n sizes?: Record<\n string,\n | {\n url?: string | null\n width?: number | null\n height?: number | null\n }\n | undefined\n >\n}\n\n/** Pre-generated image size breakpoints (px) */\nexport const IMAGE_SIZES = [384, 768, 1536] as const\n\n/**\n * Returns the optimal image URL for a given display width.\n *\n * Picks the smallest pre-generated size whose width >= displayWidth × dpr.\n * Falls back to the original URL when no matching size exists.\n *\n * @param image - Payload image document\n * @param displayWidth - CSS pixel width the image will be displayed at\n * @param dpr - Device pixel ratio (default: 1)\n * @returns URL string, or empty string if no URL is available\n */\nexport function getImageUrl(\n image: ImageData,\n displayWidth: number,\n dpr: number = 1,\n): string {\n const target = displayWidth * dpr\n const sizes = image.sizes\n\n if (sizes) {\n for (const size of IMAGE_SIZES) {\n if (size >= target) {\n const entry = sizes[String(size)]\n if (entry?.url) return entry.url\n }\n }\n }\n\n return image.url ?? ''\n}\n\n/**\n * Generates an HTML `srcset` attribute string from pre-generated sizes.\n *\n * Includes all available sizes plus the original image.\n * Example output: `\"url-384 384w, url-768 768w, url-1536 1536w, url-original 2000w\"`\n *\n * @param image - Payload image document\n * @returns srcset string, or empty string if no URLs are available\n */\nexport function getImageSrcSet(image: ImageData): string {\n const parts: string[] = []\n const sizes = image.sizes\n\n if (sizes) {\n for (const size of IMAGE_SIZES) {\n const entry = sizes[String(size)]\n if (entry?.url && entry.width) {\n parts.push(`${entry.url} ${entry.width}w`)\n }\n }\n }\n\n if (image.url && image.width) {\n parts.push(`${image.url} ${image.width}w`)\n }\n\n return parts.join(', ')\n}\n\n/**\n * Returns the LQIP (Low Quality Image Placeholder) data URL for an image.\n *\n * @param image - Payload image document\n * @returns LQIP data URL string, or undefined if not available\n */\nexport function getImageLqip(image: ImageData): string | undefined {\n return image.lqip ?? undefined\n}\n\n/**\n * Returns the extracted color palette for an image.\n *\n * @param image - Payload image document\n * @returns ImagePalette object, or undefined if not available\n */\nexport function getImagePalette(image: ImageData): ImagePalette | undefined {\n return image.palette ?? undefined\n}\n\n/** Options for `getImagePlaceholderStyle` */\nexport interface ImagePlaceholderOptions {\n /** Placeholder strategy (default: 'blur') */\n type?: 'blur' | 'color' | 'none'\n /** Which palette color to use for 'color' strategy (default: 'muted') */\n paletteColor?: keyof ImagePalette\n}\n\n/**\n * Returns inline CSS styles for an image placeholder.\n *\n * - `blur`: uses LQIP as background, falls back to palette color, then empty\n * - `color`: uses palette color as background, falls back to empty\n * - `none`: always returns empty\n *\n * @param image - Payload image document\n * @param options - Placeholder options\n * @returns CSS style object compatible with React CSSProperties\n */\nexport function getImagePlaceholderStyle(\n image: ImageData,\n options?: ImagePlaceholderOptions,\n): Record<string, string> {\n const type = options?.type ?? 'blur'\n const paletteColor = options?.paletteColor ?? 'muted'\n\n if (type === 'none') return {}\n\n const color = image.palette?.[paletteColor]\n\n if (type === 'blur') {\n const lqip = image.lqip\n if (lqip) {\n return {\n backgroundImage: `url(${lqip})`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }\n }\n // Cascade: fall back to color\n if (color) {\n return { backgroundColor: color }\n }\n return {}\n }\n\n // type === 'color'\n if (color) {\n return { backgroundColor: color }\n }\n return {}\n}\n","export const generateOrderNumber = () => {\n // YYMMDDRRRRRR\n const year = new Date().getFullYear().toString().slice(-2)\n const month = (new Date().getMonth() + 1).toString().padStart(2, '0')\n const day = new Date().getDate().toString().padStart(2, '0')\n // Use crypto.getRandomValues for cryptographically secure randomness (works in both browser and Node.js)\n const array = new Uint32Array(1)\n globalThis.crypto.getRandomValues(array)\n const random = ((array[0] ?? 0) % 1000000).toString().padStart(6, '0')\n\n return `${year}${month}${day}${random}`\n}\n","import { Product } from '../../payload-types'\nimport { resolveRelation } from '../types'\n\ntype OrderItem = {\n product: Product | string | null | undefined\n}\n\nexport const formatOrderName = (items: OrderItem[]) => {\n if (items.length === 0) return ''\n\n const firstTitle = resolveRelation(items[0]?.product)?.title || ''\n\n return items.length === 1\n ? firstTitle\n : `${firstTitle} 외 ${items.length - 1}건`\n}\n","const MUX_IMAGE_BASE = 'https://image.mux.com'\nconst MUX_STREAM_BASE = 'https://stream.mux.com'\n\n// ── Thumbnail ──\n\nexport interface VideoThumbnailOptions {\n /** Width in pixels (default: 640) */\n width?: number\n /** Height in pixels (auto if omitted) */\n height?: number\n /** Time offset in seconds (default: 0) */\n time?: number\n /** Fit mode (default: 'smartcrop') */\n fitMode?: 'preserve' | 'stretch' | 'crop' | 'smartcrop' | 'pad'\n /** Flip horizontally */\n flipH?: boolean\n /** Flip vertically */\n flipV?: boolean\n /** Rotation in degrees (90, 180, 270) */\n rotate?: 90 | 180 | 270\n}\n\n/**\n * Returns a Mux thumbnail URL for a video.\n *\n * @example\n * ```ts\n * getVideoThumbnail('abc123')\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=640'\n *\n * getVideoThumbnail('abc123', { width: 320, time: 5 })\n * // => 'https://image.mux.com/abc123/thumbnail.jpg?width=320&time=5'\n * ```\n */\nexport function getVideoThumbnail(\n playbackId: string,\n options?: VideoThumbnailOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 640))\n if (options?.height) params.set('height', String(options.height))\n if (options?.time != null) params.set('time', String(options.time))\n if (options?.fitMode) params.set('fit_mode', options.fitMode)\n if (options?.flipH) params.set('flip_h', 'true')\n if (options?.flipV) params.set('flip_v', 'true')\n if (options?.rotate) params.set('rotate', String(options.rotate))\n return `${MUX_IMAGE_BASE}/${playbackId}/thumbnail.jpg?${params}`\n}\n\n// ── Animated GIF ──\n\nexport interface VideoGifOptions {\n /** Width in pixels (default: 320) */\n width?: number\n /** Start time in seconds (default: 0) */\n start?: number\n /** End time in seconds (default: start + 5) */\n end?: number\n /** Frames per second (default: 15) */\n fps?: number\n}\n\n/**\n * Returns a Mux animated GIF URL for a video.\n *\n * @example\n * ```ts\n * getVideoGif('abc123')\n * // => 'https://image.mux.com/abc123/animated.gif?width=320'\n *\n * getVideoGif('abc123', { width: 240, start: 2, end: 6 })\n * // => 'https://image.mux.com/abc123/animated.gif?width=240&start=2&end=6'\n * ```\n */\nexport function getVideoGif(\n playbackId: string,\n options?: VideoGifOptions,\n): string {\n const params = new URLSearchParams()\n params.set('width', String(options?.width ?? 320))\n if (options?.start != null) params.set('start', String(options.start))\n if (options?.end != null) params.set('end', String(options.end))\n if (options?.fps) params.set('fps', String(options.fps))\n return `${MUX_IMAGE_BASE}/${playbackId}/animated.gif?${params}`\n}\n\n// ── Storyboard ──\n\n/**\n * Returns a Mux storyboard VTT URL for timeline hover previews.\n *\n * @example\n * ```ts\n * getVideoStoryboard('abc123')\n * // => 'https://image.mux.com/abc123/storyboard.vtt'\n * ```\n */\nexport function getVideoStoryboard(playbackId: string): string {\n return `${MUX_IMAGE_BASE}/${playbackId}/storyboard.vtt`\n}\n\n// ── Stream / Playback URLs ──\n\n/**\n * Returns the HLS stream URL for a video.\n *\n * @example\n * ```ts\n * getVideoStreamUrl('abc123')\n * // => 'https://stream.mux.com/abc123.m3u8'\n * ```\n */\nexport function getVideoStreamUrl(playbackId: string): string {\n return `${MUX_STREAM_BASE}/${playbackId}.m3u8`\n}\n\n/**\n * Returns a Mux MP4 download URL for a video.\n * Only available if the asset was created with `mp4_support` enabled.\n *\n * @example\n * ```ts\n * getVideoMp4Url('abc123', 'high')\n * // => 'https://stream.mux.com/abc123/high.mp4'\n * ```\n */\nexport function getVideoMp4Url(\n playbackId: string,\n resolution: 'high' | 'medium' | 'low' = 'high',\n): string {\n return `${MUX_STREAM_BASE}/${playbackId}/${resolution}.mp4`\n}\n"],"mappings":"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","names":["DEFAULT_TIMEOUT","useQueryOriginal","useMutationOriginal","useMutationOriginal","useQueryOriginal","_a"]}
|