@sdg.la/wishlist-stack-sdk 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/client/query.ts","../src/client/errors.ts","../src/client/request.ts","../src/resources/lists/index.ts","../src/resources/groups/index.ts","../src/resources/shared/index.ts","../src/client/createWishlistStackClient.ts","../src/WishlistStackClient.ts","../src/types/pagination.ts","../src/types/query-options.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const MAX_PAGINATION_SIZE = 25 as const;\nexport const BASE_URL = \"https://wishlist.devteam.run\" as const;\n\n","export type QueryValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Array<string | number | boolean | null | undefined>;\n\nexport type Query = Record<string, QueryValue>;\n\nexport function toQueryString(query?: Query): string {\n if (!query) return \"\";\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v === undefined || v === null) continue;\n params.append(key, String(v));\n }\n continue;\n }\n params.set(key, String(value));\n }\n\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\n","export type WishlistStackApiErrorDetails<TBody = unknown> = {\n status: number;\n url: string;\n method: string;\n requestId?: string;\n body?: TBody;\n};\n\ntype ApiErrorItemLike = { message?: unknown; field?: unknown };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isApiErrorItemLike(value: unknown): value is ApiErrorItemLike {\n return isRecord(value) && \"message\" in value;\n}\n\nfunction extractApiErrors(body: unknown): Array<{ message: string; field?: string }> | undefined {\n if (!isRecord(body)) return undefined;\n const errors = body.errors;\n if (!Array.isArray(errors)) return undefined;\n const out: Array<{ message: string; field?: string }> = [];\n for (const e of errors) {\n if (!isApiErrorItemLike(e)) continue;\n const msg = typeof e.message === \"string\" ? e.message : undefined;\n if (!msg) continue;\n const field = typeof (e as any).field === \"string\" ? (e as any).field : undefined;\n out.push(field ? { message: msg, field } : { message: msg });\n }\n return out.length ? out : undefined;\n}\n\nexport class WishlistStackApiError<TBody = unknown> extends Error {\n readonly name = \"WishlistStackApiError\";\n readonly status: number;\n readonly url: string;\n readonly method: string;\n readonly requestId?: string;\n readonly body?: TBody;\n\n constructor(message: string, details: WishlistStackApiErrorDetails<TBody>) {\n super(message);\n this.status = details.status;\n this.url = details.url;\n this.method = details.method;\n this.requestId = details.requestId;\n this.body = details.body;\n }\n\n /**\n * Best-effort extraction of API error items from the response body.\n * Useful for UI/logging without needing to know the exact response shape.\n */\n get apiErrors(): Array<{ message: string; field?: string }> | undefined {\n return extractApiErrors(this.body);\n }\n\n /**\n * Convenience: extracted error messages (if present).\n */\n get apiErrorMessages(): string[] | undefined {\n const errs = this.apiErrors;\n return errs?.map((e) => e.message);\n }\n}\n\n/**\n * Bundler-safe type guard (prefer this over `instanceof WishlistStackApiError`).\n */\nexport function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown> {\n if (!isRecord(value)) return false;\n return (\n (value as any).name === \"WishlistStackApiError\" &&\n typeof (value as any).status === \"number\" &&\n typeof (value as any).url === \"string\" &&\n typeof (value as any).method === \"string\"\n );\n}\n\n","import { toQueryString, type Query } from \"./query\";\nimport { WishlistStackApiError } from \"./errors\";\nimport type { ApiErrorResponse } from \"../types/common\";\n\nexport type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport type AuthMode = \"authenticated\" | \"merchant\";\n\nexport type RequestContext = {\n baseUrl: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch: FetchLike;\n};\n\nexport type RequestArgs<TBody> = {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthMode;\n query?: Query;\n body?: TBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeoutMs?: number;\n};\n\nasync function safeParseJson(res: Response): Promise<unknown | undefined> {\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.toLowerCase().includes(\"application/json\")) return undefined;\n try {\n return await res.json();\n } catch {\n return undefined;\n }\n}\n\nexport function createRequest(ctx: RequestContext) {\n return async function request<TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n ): Promise<TResponse> {\n const url = `${ctx.baseUrl}${args.path}${toQueryString(args.query)}`;\n\n const headers: Record<string, string> = {\n \"X-Wishlist-Stack-Api-Key\": ctx.apiKey,\n ...(args.headers ?? {}),\n };\n\n if (args.auth === \"authenticated\") {\n const token = ctx.customerAccessToken;\n // If token is missing, still perform the request and let the API return the appropriate\n // error response (which we will surface as a WishlistStackApiError based on the HTTP response).\n if (token) headers[\"X-Shopify-Customer-Access-Token\"] = token;\n }\n\n let body: BodyInit | undefined;\n if (args.body !== undefined) {\n // Only JSON bodies are supported for this SDK.\n headers[\"content-type\"] ??= \"application/json\";\n body = JSON.stringify(args.body);\n }\n\n const controller = args.timeoutMs ? new AbortController() : undefined;\n const timeout =\n args.timeoutMs && controller\n ? setTimeout(() => controller.abort(), args.timeoutMs)\n : undefined;\n\n const signal = args.signal\n ? args.signal\n : controller\n ? controller.signal\n : undefined;\n\n const res = await ctx.fetch(url, {\n method: args.method,\n headers,\n body,\n signal,\n });\n\n if (timeout) clearTimeout(timeout);\n\n if (!res.ok) {\n const errBody = (await safeParseJson(res)) as ApiErrorResponse | unknown;\n const requestId =\n res.headers.get(\"fly-request-id\") ??\n res.headers.get(\"x-request-id\") ??\n undefined;\n throw new WishlistStackApiError<ApiErrorResponse | unknown>(`Wishlist Stack API request failed (${res.status})`, {\n status: res.status,\n url,\n method: args.method,\n requestId,\n body: errBody,\n });\n }\n\n if (res.status === 204) return undefined as TResponse;\n\n const parsed = await safeParseJson(res);\n // If server didn't return JSON, return the raw text as unknown.\n if (parsed === undefined) {\n const text = await res.text().catch(() => \"\");\n return text as unknown as TResponse;\n }\n\n return parsed as TResponse;\n };\n}\n\n","import type { RequestArgs } from \"../../client/request\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n AddItemsToListBody,\n CreateListBody,\n DuplicateListBody,\n ReorderListItemsBody,\n UpdateListBody,\n UpdateListItemBody,\n} from \"../../types/requests/lists\";\nimport type {\n AddItemsToListResponse,\n CreateListResponse,\n DuplicateListResponse,\n GetListResponse,\n GetListsResponse,\n MarkListSharedResponse,\n RemoveItemFromListResponse,\n RemoveListResponse,\n ReorderListItemsResponse,\n RevokeListSharedResponse,\n UpdateListDetailsResponse,\n UpdateListItemResponse,\n} from \"../../types/responses/lists\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetListsQuery = PaginatedQuery;\nexport type GetListQuery = Omit<PaginatedQuery, \"query\">;\n\nexport function createListsResource(request: RequestFn) {\n return {\n /** Returns all lists for the authenticated customer under the current merchant. */\n getAll: (query?: GetListsQuery) =>\n request<GetListsResponse>({\n method: \"GET\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n query,\n }),\n\n /** Fetch list details by id. */\n getById: (listId: string, query?: GetListQuery) =>\n request<GetListResponse>({\n method: \"GET\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n query,\n }),\n\n /** Create a new list. */\n create: (body: CreateListBody) =>\n request<CreateListResponse, CreateListBody>({\n method: \"POST\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update list name/description. */\n update: (listId: string, body: UpdateListBody) =>\n request<UpdateListDetailsResponse, UpdateListBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a list. */\n remove: (listId: string) =>\n request<RemoveListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a list (including all items) in a single call.\n * By default the copy stays in the same group as the source. Pass `groupId`\n * to place it in another group, or `groupId: null` to leave it ungrouped.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (listId: string, body?: DuplicateListBody) =>\n request<DuplicateListResponse, DuplicateListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Add one or more items to a list. */\n addItems: (listId: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/add`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Update an item on a list. */\n updateItem: (listId: string, itemId: string, body: UpdateListItemBody) =>\n request<UpdateListItemResponse, UpdateListItemBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove an item from a list. */\n removeItem: (listId: string, itemId: string) =>\n request<RemoveItemFromListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n }),\n\n /** Reorder all items in a list. */\n reorderItems: (listId: string, body: ReorderListItemsBody) =>\n request<ReorderListItemsResponse, ReorderListItemsBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/reorder`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark list as shared (public read-only). */\n share: (listId: string) =>\n request<MarkListSharedResponse>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke list sharing. */\n unshare: (listId: string) =>\n request<RevokeListSharedResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /**\n * Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).\n * Prefer `addItems(listId, body)` unless your server only supports the legacy route.\n */\n addItemsLegacy: (id: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/wishlists/${encodeURIComponent(id)}/add`,\n auth: \"authenticated\",\n body,\n }),\n };\n}\n\n","import type { RequestArgs } from \"../../client/request\";\nimport type { CreateGroupBody, ReorderGroupBody, UpdateGroupBody } from \"../../types/requests/groups\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n CreateGroupResponse,\n DuplicateGroupResponse,\n GetGroupResponse,\n GetGroupsResponse,\n MarkGroupSharedResponse,\n RemoveGroupResponse,\n ReorderGroupResponse,\n RevokeGroupSharedResponse,\n UpdateGroupDetailsResponse,\n} from \"../../types/responses/groups\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetGroupsQuery = PaginatedQuery<{\n /**\n * When truthy (`true`, `1`, or `\"1\"`), each group includes its full `lists`\n * array with hydrated items. Sent to the API as `includeLists=1`.\n */\n includeLists?: boolean | 1 | \"1\";\n}>;\nexport type GetGroupQuery = PaginatedQuery;\n\nfunction normalizeGetGroupsQuery(query?: GetGroupsQuery): GetGroupsQuery | undefined {\n if (!query) return undefined;\n const { includeLists, ...rest } = query;\n if (includeLists) {\n return { ...rest, includeLists: 1 };\n }\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nexport function createGroupsResource(request: RequestFn) {\n return {\n /** Fetch groups for the authenticated customer. */\n getAll: (query?: GetGroupsQuery) =>\n request<GetGroupsResponse>({\n method: \"GET\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n query: normalizeGetGroupsQuery(query),\n }),\n\n /** Fetch group details by id. */\n getById: (groupId: string, query?: GetGroupQuery) =>\n request<GetGroupResponse>({\n method: \"GET\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n query,\n }),\n\n /** Create a new group. */\n create: (body: CreateGroupBody) =>\n request<CreateGroupResponse, CreateGroupBody>({\n method: \"POST\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update group name/description. */\n update: (groupId: string, body: UpdateGroupBody) =>\n request<UpdateGroupDetailsResponse, UpdateGroupBody>({\n method: \"PATCH\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a group. */\n remove: (groupId: string) =>\n request<RemoveGroupResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a group (including all lists and items) in a single call.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (groupId: string) =>\n request<DuplicateGroupResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/duplicate`,\n auth: \"authenticated\",\n }),\n\n /** Reorder a group (spec uses listIds payload). */\n reorder: (groupId: string, body: ReorderGroupBody) =>\n request<ReorderGroupResponse, ReorderGroupBody>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/reorder`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark group as shared (public read-only). */\n share: (groupId: string) =>\n request<MarkGroupSharedResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke group sharing. */\n unshare: (groupId: string) =>\n request<RevokeGroupSharedResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n };\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetSharedListQuery = Omit<PaginatedQuery, \"query\">;\nexport type GetSharedGroupQuery = PaginatedQuery;\n\nexport function createSharedResource(request: RequestFn) {\n return {\n /** Public read-only view of a shared list. Requires only merchant apiKey. */\n getSharedList: (listId: string, query?: GetSharedListQuery) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n query,\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string, query?: GetSharedGroupQuery) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\n query,\n }),\n };\n}\n\n","import { BASE_URL } from \"../constants\";\nimport { createRequest, type FetchLike } from \"./request\";\nimport { createListsResource } from \"../resources/lists\";\nimport { createGroupsResource } from \"../resources/groups\";\nimport { createSharedResource } from \"../resources/shared\";\n\nexport type CreateWishlistStackClientOptions = {\n baseUrl?: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch?: FetchLike;\n};\n\nexport type WishlistStackClient = {\n lists: ReturnType<typeof createListsResource>;\n groups: ReturnType<typeof createGroupsResource>;\n shared: ReturnType<typeof createSharedResource>;\n};\n\nexport function createWishlistStackClient(opts: CreateWishlistStackClientOptions): WishlistStackClient {\n if (!opts.apiKey) {\n throw new Error(\n \"merchant api key is required. Pass it to createWishlistStackClient({ apiKey })\",\n );\n }\n\n // Cloudflare Workers (and some other runtimes) can throw \"Illegal invocation\" if you\n // capture `globalThis.fetch` and call it later without the correct `this` binding.\n // So: default to a wrapper that calls `globalThis.fetch(...)` directly.\n const fetchImpl: FetchLike | undefined =\n opts.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? ((input, init) => globalThis.fetch(input, init)) // keep correct invocation context\n : undefined);\n\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation found. Provide one via createWishlistStackClient({ fetch }) or use Node 18+ / modern browsers.\",\n );\n }\n\n const request = createRequest({\n baseUrl: opts.baseUrl ?? BASE_URL,\n apiKey: opts.apiKey,\n customerAccessToken: opts.customerAccessToken,\n fetch: fetchImpl,\n });\n\n return {\n lists: createListsResource(request),\n groups: createGroupsResource(request),\n shared: createSharedResource(request),\n };\n}\n","import { createWishlistStackClient, type CreateWishlistStackClientOptions, type WishlistStackClient as IWishlistStackClient } from \"./client/createWishlistStackClient\";\n\n/**\n * Class wrapper around `createWishlistStackClient()` for users who prefer `new`.\n * Exposes `lists`, `groups`, and `shared` resources.\n */\nexport class WishlistStackClient implements IWishlistStackClient {\n readonly lists: IWishlistStackClient[\"lists\"];\n readonly groups: IWishlistStackClient[\"groups\"];\n readonly shared: IWishlistStackClient[\"shared\"];\n\n constructor(opts: CreateWishlistStackClientOptions) {\n const client = createWishlistStackClient(opts);\n this.lists = client.lists;\n this.groups = client.groups;\n this.shared = client.shared;\n }\n\n /** Back-compat alias: `client.groups.getAll()` */\n getGroups() {\n return this.groups.getAll();\n }\n\n /** Back-compat alias: `client.groups.getById(groupId)` */\n getGroupById(groupId: string) {\n return this.groups.getById(groupId);\n }\n\n /** Back-compat alias: `client.lists.getAll()` */\n getLists() {\n return this.lists.getAll();\n }\n}\n","import { MAX_PAGINATION_SIZE } from \"../constants\";\n\nexport type PaginationParams = {\n page?: number;\n pageSize?: number;\n query?: string;\n};\n\nexport const DEFAULT_PAGE = 1 as const;\nexport const DEFAULT_PAGE_SIZE = MAX_PAGINATION_SIZE;\n\n","import type { Query } from \"../client/query\";\nimport type { PaginationParams } from \"./pagination\";\n\nexport const SORT_FIELDS = [\"position\", \"createdAt\", \"updatedAt\"] as const;\nexport const SORT_DIRECTIONS = [\"asc\", \"desc\"] as const;\n\nexport type SortField = (typeof SORT_FIELDS)[number];\nexport type SortDirection = (typeof SORT_DIRECTIONS)[number];\n\n/**\n * Collection sort options for multi-resource GET endpoints.\n * Defaults on the API are `sortBy=position` and `sortDirection=asc`.\n */\nexport type SortParams = {\n sortBy?: SortField;\n sortDirection?: SortDirection;\n};\n\n/**\n * Shared query option building blocks for list/group endpoints.\n *\n * Keep this extendable: as we add filters/sorts, we can add additional helpers/types here\n * and reuse them across endpoints without duplicating logic.\n */\nexport type PaginatedQuery<TExtra extends Query = Query> = PaginationParams & SortParams & TExtra;\n\n/**\n * Merge a base query with pagination parameters.\n * (Useful when an endpoint also gains filter/sort params over time.)\n */\nexport function withPagination<TExtra extends Query>(\n query?: TExtra,\n pagination?: PaginationParams,\n): PaginatedQuery<TExtra> | undefined {\n if (!query && !pagination) return undefined;\n return { ...(query ?? {}), ...(pagination ?? {}) } as PaginatedQuery<TExtra>;\n}\n\n/**\n * Merge a base query with sort parameters.\n */\nexport function withSort<TExtra extends Query>(\n query?: TExtra,\n sort?: SortParams,\n): (TExtra & SortParams) | undefined {\n if (!query && !sort) return undefined;\n return { ...(query ?? {}), ...(sort ?? {}) } as TExtra & SortParams;\n}\n\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/client/query.ts","../src/client/errors.ts","../src/client/request.ts","../src/helpers/pagination.ts","../src/resources/lists/index.ts","../src/resources/groups/index.ts","../src/resources/shared/index.ts","../src/client/createWishlistStackClient.ts","../src/WishlistStackClient.ts","../src/types/pagination.ts","../src/types/query-options.ts","../src/types/guards.ts"],"names":["isRecord"],"mappings":"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","file":"index.cjs","sourcesContent":["export const MAX_PAGINATION_SIZE = 25 as const;\nexport const BASE_URL = \"https://wishlist.devteam.run\" as const;\n\n","export type QueryValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | Array<string | number | boolean | null | undefined>;\n\nexport type Query = Record<string, QueryValue>;\n\nexport function toQueryString(query?: Query): string {\n if (!query) return \"\";\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n if (v === undefined || v === null) continue;\n params.append(key, String(v));\n }\n continue;\n }\n params.set(key, String(value));\n }\n\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\n","export type WishlistStackApiErrorDetails<TBody = unknown> = {\n status: number;\n url: string;\n method: string;\n requestId?: string;\n body?: TBody;\n /** Value of the `Retry-After` response header when present (seconds or HTTP-date). */\n retryAfter?: string;\n /** Selected rate-limit response headers when present. */\n rateLimit?: {\n limit?: string;\n remaining?: string;\n reset?: string;\n };\n};\n\ntype ApiErrorItemLike = { message?: unknown; field?: unknown };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isApiErrorItemLike(value: unknown): value is ApiErrorItemLike {\n return isRecord(value) && \"message\" in value;\n}\n\nfunction extractApiErrors(body: unknown): Array<{ message: string; field?: string }> | undefined {\n if (!isRecord(body)) return undefined;\n const errors = body.errors;\n if (!Array.isArray(errors)) return undefined;\n const out: Array<{ message: string; field?: string }> = [];\n for (const e of errors) {\n if (!isApiErrorItemLike(e)) continue;\n const msg = typeof e.message === \"string\" ? e.message : undefined;\n if (!msg) continue;\n const field = typeof (e as any).field === \"string\" ? (e as any).field : undefined;\n out.push(field ? { message: msg, field } : { message: msg });\n }\n return out.length ? out : undefined;\n}\n\nexport class WishlistStackApiError<TBody = unknown> extends Error {\n readonly name = \"WishlistStackApiError\";\n readonly status: number;\n readonly url: string;\n readonly method: string;\n readonly requestId?: string;\n readonly body?: TBody;\n readonly retryAfter?: string;\n readonly rateLimit?: WishlistStackApiErrorDetails[\"rateLimit\"];\n\n constructor(message: string, details: WishlistStackApiErrorDetails<TBody>) {\n super(message);\n this.status = details.status;\n this.url = details.url;\n this.method = details.method;\n this.requestId = details.requestId;\n this.body = details.body;\n this.retryAfter = details.retryAfter;\n this.rateLimit = details.rateLimit;\n }\n\n /**\n * Best-effort extraction of API error items from the response body.\n * Useful for UI/logging without needing to know the exact response shape.\n */\n get apiErrors(): Array<{ message: string; field?: string }> | undefined {\n return extractApiErrors(this.body);\n }\n\n /**\n * Convenience: extracted error messages (if present).\n */\n get apiErrorMessages(): string[] | undefined {\n const errs = this.apiErrors;\n return errs?.map((e) => e.message);\n }\n}\n\n/**\n * Bundler-safe type guard (prefer this over `instanceof WishlistStackApiError`).\n */\nexport function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown> {\n if (!isRecord(value)) return false;\n return (\n (value as any).name === \"WishlistStackApiError\" &&\n typeof (value as any).status === \"number\" &&\n typeof (value as any).url === \"string\" &&\n typeof (value as any).method === \"string\"\n );\n}\n","import { toQueryString, type Query } from \"./query\";\nimport { WishlistStackApiError } from \"./errors\";\nimport type { ApiErrorResponse } from \"../types/common\";\n\nexport type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;\n\nexport type AuthMode = \"authenticated\" | \"merchant\";\n\nexport type RequestContext = {\n baseUrl: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch: FetchLike;\n /** Applied when a call does not pass `timeoutMs`. */\n defaultTimeoutMs?: number;\n /** When true, retry a single time on HTTP 429 with jittered delay. */\n retryOnRateLimit?: boolean;\n};\n\nexport type RequestArgs<TBody> = {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n auth: AuthMode;\n query?: Query;\n body?: TBody;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeoutMs?: number;\n};\n\nasync function safeParseJson(res: Response): Promise<unknown | undefined> {\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.toLowerCase().includes(\"application/json\")) return undefined;\n try {\n return await res.json();\n } catch {\n return undefined;\n }\n}\n\nfunction pickRequestId(res: Response): string | undefined {\n return (\n res.headers.get(\"fly-request-id\") ??\n res.headers.get(\"x-request-id\") ??\n res.headers.get(\"x-nf-request-id\") ??\n res.headers.get(\"x-netlify-request-id\") ??\n undefined\n );\n}\n\nfunction pickRateLimit(res: Response): { limit?: string; remaining?: string; reset?: string } | undefined {\n const limit = res.headers.get(\"x-ratelimit-limit\") ?? undefined;\n const remaining = res.headers.get(\"x-ratelimit-remaining\") ?? undefined;\n const reset = res.headers.get(\"x-ratelimit-reset\") ?? undefined;\n if (!limit && !remaining && !reset) return undefined;\n return { limit, remaining, reset };\n}\n\nfunction errorMessageFor(status: number, path: string): string {\n if (status === 503 && path.includes(\"/api/groups\")) {\n return \"Groups API disabled for this merchant\";\n }\n return `Wishlist Stack API request failed (${status})`;\n}\n\nfunction parseRetryAfterMs(retryAfter: string | undefined): number {\n if (!retryAfter) return 0;\n const asSeconds = Number(retryAfter);\n if (Number.isFinite(asSeconds) && asSeconds >= 0) {\n return Math.min(asSeconds * 1000, 30_000);\n }\n const asDate = Date.parse(retryAfter);\n if (!Number.isNaN(asDate)) {\n return Math.min(Math.max(0, asDate - Date.now()), 30_000);\n }\n return 0;\n}\n\nfunction jitterDelayMs(baseMs: number): number {\n const base = Math.max(100, baseMs || 500);\n const jitter = Math.floor(Math.random() * 250);\n return Math.min(base + jitter, 30_000);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function createRequest(ctx: RequestContext) {\n return async function request<TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n ): Promise<TResponse> {\n const url = `${ctx.baseUrl}${args.path}${toQueryString(args.query)}`;\n\n const headers: Record<string, string> = {\n \"X-Wishlist-Stack-Api-Key\": ctx.apiKey,\n ...(args.headers ?? {}),\n };\n\n if (args.auth === \"authenticated\") {\n const token = ctx.customerAccessToken;\n // If token is missing, still perform the request and let the API return the appropriate\n // error response (which we will surface as a WishlistStackApiError based on the HTTP response).\n if (token) headers[\"X-Shopify-Customer-Access-Token\"] = token;\n }\n\n let body: BodyInit | undefined;\n if (args.body !== undefined) {\n // Only JSON bodies are supported for this SDK.\n headers[\"content-type\"] ??= \"application/json\";\n body = JSON.stringify(args.body);\n }\n\n const timeoutMs = args.timeoutMs ?? ctx.defaultTimeoutMs;\n\n const doFetch = async (): Promise<Response> => {\n const controller = timeoutMs ? new AbortController() : undefined;\n const timeout =\n timeoutMs && controller\n ? setTimeout(() => controller.abort(), timeoutMs)\n : undefined;\n\n const signal = args.signal\n ? args.signal\n : controller\n ? controller.signal\n : undefined;\n\n try {\n return await ctx.fetch(url, {\n method: args.method,\n headers,\n body,\n signal,\n });\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n };\n\n let res = await doFetch();\n\n if (!res.ok && res.status === 429 && ctx.retryOnRateLimit) {\n const retryAfter = res.headers.get(\"retry-after\") ?? undefined;\n await sleep(jitterDelayMs(parseRetryAfterMs(retryAfter)));\n res = await doFetch();\n }\n\n if (!res.ok) {\n const errBody = (await safeParseJson(res)) as ApiErrorResponse | unknown;\n const retryAfter = res.headers.get(\"retry-after\") ?? undefined;\n throw new WishlistStackApiError<ApiErrorResponse | unknown>(errorMessageFor(res.status, args.path), {\n status: res.status,\n url,\n method: args.method,\n requestId: pickRequestId(res),\n body: errBody,\n retryAfter,\n rateLimit: pickRateLimit(res),\n });\n }\n\n if (res.status === 204) return undefined as TResponse;\n\n const parsed = await safeParseJson(res);\n // If server didn't return JSON, return the raw text as unknown.\n if (parsed === undefined) {\n const text = await res.text().catch(() => \"\");\n return text as unknown as TResponse;\n }\n\n return parsed as TResponse;\n };\n}\n","import { MAX_PAGINATION_SIZE } from \"../constants\";\n\n/**\n * Clamp a page size to the API-allowed range (1–25) so requests\n * do not send invalid `pageSize` values.\n */\nexport function clampPageSize(n: number): number {\n if (!Number.isFinite(n)) return MAX_PAGINATION_SIZE;\n return Math.min(MAX_PAGINATION_SIZE, Math.max(1, Math.trunc(n)));\n}\n\n/**\n * Clamp a 1-based page index to at least 1.\n */\nexport function clampPage(n: number): number {\n if (!Number.isFinite(n)) return 1;\n return Math.max(1, Math.trunc(n));\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport { MAX_PAGINATION_SIZE } from \"../../constants\";\nimport { clampPage, clampPageSize } from \"../../helpers/pagination\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n AddItemsToListBody,\n CreateListBody,\n DuplicateListBody,\n ReorderListItemsBody,\n UpdateListBody,\n UpdateListItemBody,\n} from \"../../types/requests/lists\";\nimport type {\n AddItemsToListResponse,\n CreateListResponse,\n DuplicateListResponse,\n GetListResponse,\n GetListsResponse,\n HydratedWishlistItem,\n MarkListSharedResponse,\n RemoveItemFromListResponse,\n RemoveListResponse,\n ReorderListItemsResponse,\n RevokeListSharedResponse,\n UpdateListDetailsResponse,\n UpdateListItemResponse,\n} from \"../../types/responses/lists\";\nimport type { Pagination } from \"../../types/responses/common\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetListsQuery = PaginatedQuery;\nexport type GetListQuery = Omit<PaginatedQuery, \"query\">;\n\nexport type AddItemsBatchedOptions = {\n /** Max items per POST (API hard max is 25). */\n batchSize?: number;\n};\n\nexport type GetByIdAllItemsOptions = {\n pageSize?: number;\n sortBy?: GetListQuery[\"sortBy\"];\n sortDirection?: GetListQuery[\"sortDirection\"];\n};\n\nfunction chunkItems<T>(items: T[], batchSize: number): T[][] {\n const size = Math.max(1, Math.min(MAX_PAGINATION_SIZE, Math.trunc(batchSize) || MAX_PAGINATION_SIZE));\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks.length ? chunks : [[]];\n}\n\nexport function createListsResource(request: RequestFn) {\n const getById = (listId: string, query?: GetListQuery) =>\n request<GetListResponse>({\n method: \"GET\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n query,\n });\n\n const addItems = (listId: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/add`,\n auth: \"authenticated\",\n body,\n });\n\n return {\n /** Returns all lists for the authenticated customer under the current merchant. */\n getAll: (query?: GetListsQuery) =>\n request<GetListsResponse>({\n method: \"GET\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n query,\n }),\n\n /** Fetch list details by id. */\n getById,\n\n /**\n * Fetch every item on a list by walking pages (list detail is paginated;\n * max pageSize 25).\n */\n getByIdAllItems: async (listId: string, opts?: GetByIdAllItemsOptions): Promise<GetListResponse> => {\n const pageSize = clampPageSize(opts?.pageSize ?? MAX_PAGINATION_SIZE);\n const sortBy = opts?.sortBy;\n const sortDirection = opts?.sortDirection;\n\n const first = await getById(listId, {\n page: 1,\n pageSize,\n ...(sortBy ? { sortBy } : {}),\n ...(sortDirection ? { sortDirection } : {}),\n });\n\n const totalPages = first.pagination.totalPages;\n const allItems: HydratedWishlistItem[] = [...(first.items ?? [])];\n\n for (let page = 2; page <= totalPages; page++) {\n const next = await getById(listId, {\n page: clampPage(page),\n pageSize,\n ...(sortBy ? { sortBy } : {}),\n ...(sortDirection ? { sortDirection } : {}),\n });\n allItems.push(...(next.items ?? []));\n }\n\n const pagination: Pagination = {\n ...first.pagination,\n page: 1,\n pageSize,\n };\n\n return {\n ...first,\n items: allItems,\n pagination,\n };\n },\n\n /**\n * Create a new list. Do not send `variantIds` — add items via `addItems`\n * or `addItemsBatched` after create.\n */\n create: (body: CreateListBody) =>\n request<CreateListResponse, CreateListBody>({\n method: \"POST\",\n path: \"/api/lists\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update list name/description. */\n update: (listId: string, body: UpdateListBody) =>\n request<UpdateListDetailsResponse, UpdateListBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a list. */\n remove: (listId: string) =>\n request<RemoveListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a list (including all items) in a single call.\n * By default the copy stays in the same group as the source. Pass `groupId`\n * to place it in another group, or `groupId: null` to leave it ungrouped.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (listId: string, body?: DuplicateListBody) =>\n request<DuplicateListResponse, DuplicateListBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,\n auth: \"authenticated\",\n body,\n }),\n\n /**\n * Add one or more items to a list.\n * Returns `{ listId, addedItems, addedCount }`. Prefer `addItemsBatched`\n * when sending more than 25 items.\n */\n addItems,\n\n /**\n * Add items in sequential batches of ≤25 (API hard max).\n * Merges `{ addedItems, addedCount }` across batches.\n */\n addItemsBatched: async (\n listId: string,\n body: AddItemsToListBody,\n opts?: AddItemsBatchedOptions,\n ): Promise<AddItemsToListResponse> => {\n const items = body.items ?? [];\n const batchSize = opts?.batchSize ?? MAX_PAGINATION_SIZE;\n const chunks = chunkItems(items, batchSize);\n\n const merged: AddItemsToListResponse = {\n listId,\n addedItems: [],\n addedCount: 0,\n };\n\n for (const chunk of chunks) {\n const res = await addItems(listId, { items: chunk });\n merged.listId = res.listId;\n merged.addedItems.push(...res.addedItems);\n merged.addedCount += res.addedCount;\n }\n\n return merged;\n },\n\n /** Update an item on a list. */\n updateItem: (listId: string, itemId: string, body: UpdateListItemBody) =>\n request<UpdateListItemResponse, UpdateListItemBody>({\n method: \"PATCH\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove an item from a list. */\n removeItem: (listId: string, itemId: string) =>\n request<RemoveItemFromListResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/items/${encodeURIComponent(itemId)}`,\n auth: \"authenticated\",\n }),\n\n /** Reorder all items in a list. */\n reorderItems: (listId: string, body: ReorderListItemsBody) =>\n request<ReorderListItemsResponse, ReorderListItemsBody>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/reorder`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark list as shared (public read-only). */\n share: (listId: string) =>\n request<MarkListSharedResponse>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke list sharing. */\n unshare: (listId: string) =>\n request<RevokeListSharedResponse>({\n method: \"DELETE\",\n path: `/api/lists/${encodeURIComponent(listId)}/share`,\n auth: \"authenticated\",\n }),\n\n /**\n * Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).\n * Prefer `addItems(listId, body)` unless your server only supports the legacy route.\n */\n addItemsLegacy: (id: string, body: AddItemsToListBody) =>\n request<AddItemsToListResponse, AddItemsToListBody>({\n method: \"POST\",\n path: `/api/wishlists/${encodeURIComponent(id)}/add`,\n auth: \"authenticated\",\n body,\n }),\n };\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport type { CreateGroupBody, ReorderGroupsBody, UpdateGroupBody } from \"../../types/requests/groups\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type {\n CreateGroupResponse,\n DuplicateGroupResponse,\n GetGroupResponse,\n GetGroupsResponse,\n MarkGroupSharedResponse,\n RemoveGroupResponse,\n ReorderGroupsResponse,\n RevokeGroupSharedResponse,\n UpdateGroupDetailsResponse,\n} from \"../../types/responses/groups\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetGroupsQuery = PaginatedQuery<{\n /**\n * When truthy (`true`, `1`, or `\"1\"`), each group includes embedded `lists`\n * with hydrated items (`includeLists=1`).\n *\n * Expect at most **10 lists × 25 items** per group. For full data use\n * `groups.getById` plus `lists.getById` / `lists.getByIdAllItems`. Groups\n * endpoints may return **503** until the Groups API is enabled for the merchant.\n */\n includeLists?: boolean | 1 | \"1\";\n}>;\nexport type GetGroupQuery = PaginatedQuery;\n\nfunction normalizeGetGroupsQuery(query?: GetGroupsQuery): GetGroupsQuery | undefined {\n if (!query) return undefined;\n const { includeLists, ...rest } = query;\n if (includeLists) {\n return { ...rest, includeLists: 1 };\n }\n return Object.keys(rest).length > 0 ? rest : undefined;\n}\n\nexport function createGroupsResource(request: RequestFn) {\n return {\n /**\n * Fetch groups for the authenticated customer.\n * May return **503** when the Groups API is disabled for this merchant.\n */\n getAll: (query?: GetGroupsQuery) =>\n request<GetGroupsResponse>({\n method: \"GET\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n query: normalizeGetGroupsQuery(query),\n }),\n\n /**\n * Fetch group details by id.\n * May return **503** when the Groups API is disabled for this merchant.\n */\n getById: (groupId: string, query?: GetGroupQuery) =>\n request<GetGroupResponse>({\n method: \"GET\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n query,\n }),\n\n /** Create a new group. */\n create: (body: CreateGroupBody) =>\n request<CreateGroupResponse, CreateGroupBody>({\n method: \"POST\",\n path: \"/api/groups\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Update group name/description. */\n update: (groupId: string, body: UpdateGroupBody) =>\n request<UpdateGroupDetailsResponse, UpdateGroupBody>({\n method: \"PATCH\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n body,\n }),\n\n /** Remove a group. */\n remove: (groupId: string) =>\n request<RemoveGroupResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}`,\n auth: \"authenticated\",\n }),\n\n /**\n * Duplicate a group (including all lists and items) in a single call.\n * The copy is named `Copy of {original name}` and is not shared.\n */\n duplicate: (groupId: string) =>\n request<DuplicateGroupResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/duplicate`,\n auth: \"authenticated\",\n }),\n\n /**\n * Reorder the customer's groups (`POST /api/groups/reorder`).\n * Body must include `groupIds` in the desired order — not list IDs, and\n * not a per-group path.\n */\n reorder: (body: ReorderGroupsBody) =>\n request<ReorderGroupsResponse, ReorderGroupsBody>({\n method: \"POST\",\n path: \"/api/groups/reorder\",\n auth: \"authenticated\",\n body,\n }),\n\n /** Mark group as shared (public read-only). */\n share: (groupId: string) =>\n request<MarkGroupSharedResponse>({\n method: \"POST\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n\n /** Revoke group sharing. */\n unshare: (groupId: string) =>\n request<RevokeGroupSharedResponse>({\n method: \"DELETE\",\n path: `/api/groups/${encodeURIComponent(groupId)}/share`,\n auth: \"authenticated\",\n }),\n };\n}\n","import type { RequestArgs } from \"../../client/request\";\nimport type { PaginatedQuery } from \"../../types/query-options\";\nimport type { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\n\nexport type GetSharedListQuery = Omit<PaginatedQuery, \"query\">;\nexport type GetSharedGroupQuery = PaginatedQuery;\n\nexport function createSharedResource(request: RequestFn) {\n return {\n /** Public read-only view of a shared list. Requires only merchant apiKey. */\n getSharedList: (listId: string, query?: GetSharedListQuery) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n query,\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string, query?: GetSharedGroupQuery) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\n query,\n }),\n };\n}\n\n","import { BASE_URL } from \"../constants\";\nimport { createRequest, type FetchLike } from \"./request\";\nimport { createListsResource } from \"../resources/lists\";\nimport { createGroupsResource } from \"../resources/groups\";\nimport { createSharedResource } from \"../resources/shared\";\n\nexport type CreateWishlistStackClientOptions = {\n baseUrl?: string;\n apiKey: string;\n customerAccessToken?: string;\n fetch?: FetchLike;\n /** Default request timeout in ms when a call does not pass `timeoutMs`. */\n defaultTimeoutMs?: number;\n /** When true, retry once on HTTP 429 with jittered backoff (default: false). */\n retryOnRateLimit?: boolean;\n};\n\nexport type WishlistStackClient = {\n lists: ReturnType<typeof createListsResource>;\n groups: ReturnType<typeof createGroupsResource>;\n shared: ReturnType<typeof createSharedResource>;\n};\n\nexport function createWishlistStackClient(opts: CreateWishlistStackClientOptions): WishlistStackClient {\n if (!opts.apiKey) {\n throw new Error(\n \"merchant api key is required. Pass it to createWishlistStackClient({ apiKey })\",\n );\n }\n\n // Cloudflare Workers (and some other runtimes) can throw \"Illegal invocation\" if you\n // capture `globalThis.fetch` and call it later without the correct `this` binding.\n // So: default to a wrapper that calls `globalThis.fetch(...)` directly.\n const fetchImpl: FetchLike | undefined =\n opts.fetch ??\n (typeof globalThis.fetch === \"function\"\n ? ((input, init) => globalThis.fetch(input, init)) // keep correct invocation context\n : undefined);\n\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation found. Provide one via createWishlistStackClient({ fetch }) or use Node 18+ / modern browsers.\",\n );\n }\n\n const request = createRequest({\n baseUrl: opts.baseUrl ?? BASE_URL,\n apiKey: opts.apiKey,\n customerAccessToken: opts.customerAccessToken,\n fetch: fetchImpl,\n defaultTimeoutMs: opts.defaultTimeoutMs,\n retryOnRateLimit: opts.retryOnRateLimit,\n });\n\n return {\n lists: createListsResource(request),\n groups: createGroupsResource(request),\n shared: createSharedResource(request),\n };\n}\n","import { createWishlistStackClient, type CreateWishlistStackClientOptions, type WishlistStackClient as IWishlistStackClient } from \"./client/createWishlistStackClient\";\n\n/**\n * Class wrapper around `createWishlistStackClient()` for users who prefer `new`.\n * Exposes `lists`, `groups`, and `shared` resources.\n */\nexport class WishlistStackClient implements IWishlistStackClient {\n readonly lists: IWishlistStackClient[\"lists\"];\n readonly groups: IWishlistStackClient[\"groups\"];\n readonly shared: IWishlistStackClient[\"shared\"];\n\n constructor(opts: CreateWishlistStackClientOptions) {\n const client = createWishlistStackClient(opts);\n this.lists = client.lists;\n this.groups = client.groups;\n this.shared = client.shared;\n }\n\n /** Back-compat alias: `client.groups.getAll()` */\n getGroups() {\n return this.groups.getAll();\n }\n\n /** Back-compat alias: `client.groups.getById(groupId)` */\n getGroupById(groupId: string) {\n return this.groups.getById(groupId);\n }\n\n /** Back-compat alias: `client.lists.getAll()` */\n getLists() {\n return this.lists.getAll();\n }\n}\n","import { MAX_PAGINATION_SIZE } from \"../constants\";\n\nexport type PaginationParams = {\n page?: number;\n pageSize?: number;\n query?: string;\n};\n\nexport const DEFAULT_PAGE = 1 as const;\nexport const DEFAULT_PAGE_SIZE = MAX_PAGINATION_SIZE;\n\n","import type { Query } from \"../client/query\";\nimport type { PaginationParams } from \"./pagination\";\n\nexport const SORT_FIELDS = [\"position\", \"createdAt\", \"updatedAt\"] as const;\nexport const SORT_DIRECTIONS = [\"asc\", \"desc\"] as const;\n\nexport type SortField = (typeof SORT_FIELDS)[number];\nexport type SortDirection = (typeof SORT_DIRECTIONS)[number];\n\n/**\n * Collection sort options for multi-resource GET endpoints.\n * Defaults on the API are `sortBy=position` and `sortDirection=asc`.\n */\nexport type SortParams = {\n sortBy?: SortField;\n sortDirection?: SortDirection;\n};\n\n/**\n * Shared query option building blocks for list/group endpoints.\n *\n * Keep this extendable: as we add filters/sorts, we can add additional helpers/types here\n * and reuse them across endpoints without duplicating logic.\n */\nexport type PaginatedQuery<TExtra extends Query = Query> = PaginationParams & SortParams & TExtra;\n\n/**\n * Merge a base query with pagination parameters.\n * (Useful when an endpoint also gains filter/sort params over time.)\n */\nexport function withPagination<TExtra extends Query>(\n query?: TExtra,\n pagination?: PaginationParams,\n): PaginatedQuery<TExtra> | undefined {\n if (!query && !pagination) return undefined;\n return { ...(query ?? {}), ...(pagination ?? {}) } as PaginatedQuery<TExtra>;\n}\n\n/**\n * Merge a base query with sort parameters.\n */\nexport function withSort<TExtra extends Query>(\n query?: TExtra,\n sort?: SortParams,\n): (TExtra & SortParams) | undefined {\n if (!query && !sort) return undefined;\n return { ...(query ?? {}), ...(sort ?? {}) } as TExtra & SortParams;\n}\n\n","import type { AddItemsToListResponse } from \"./responses/lists\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * True when the value matches the add-items response shape\n * (`{ listId, addedItems, addedCount }`).\n */\nexport function isAddItemsDeltaResponse(\n value: AddItemsToListResponse | unknown,\n): value is AddItemsToListResponse {\n if (!isRecord(value)) return false;\n return (\n typeof value.listId === \"string\" &&\n Array.isArray(value.addedItems) &&\n typeof value.addedCount === \"number\"\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -51,6 +51,10 @@ declare function withPagination<TExtra extends Query>(query?: TExtra, pagination
51
51
  */
52
52
  declare function withSort<TExtra extends Query>(query?: TExtra, sort?: SortParams): (TExtra & SortParams) | undefined;
53
53
 
54
+ /**
55
+ * Create a new list. Do **not** send `variantIds` — the API may reject them.
56
+ * Create the list, then call `lists.addItems` or `lists.addItemsBatched`.
57
+ */
54
58
  type CreateListBody = {
55
59
  name?: string;
56
60
  description?: string;
@@ -64,6 +68,7 @@ type UpdateListBody = {
64
68
  type AddItemsToListBody = {
65
69
  items?: Array<{
66
70
  variantId?: string;
71
+ /** Quantity for the item (1–999). */
67
72
  quantity?: number;
68
73
  note?: string;
69
74
  properties?: Record<string, unknown> | null;
@@ -174,14 +179,23 @@ type GetListsResponse = {
174
179
  lists: ListSummary[];
175
180
  pagination: Pagination;
176
181
  };
177
- /** GET `/api/lists/:listId` */
178
- type GetListResponse = ListDetail;
182
+ /** GET `/api/lists/:listId` — items are paginated (max pageSize 25). */
183
+ type GetListResponse = ListDetail & {
184
+ pagination: Pagination;
185
+ };
179
186
  type ListMutationResponse = Omit<ListSummary, "featuredProducts">;
180
187
  type CreateListResponse = ListMutationResponse;
181
188
  type DuplicateListResponse = ListMutationResponse;
182
189
  type UpdateListDetailsResponse = ListMutationResponse;
183
190
  type RemoveListResponse = OkResponse;
184
- type AddItemsToListResponse = unknown;
191
+ /** POST `/api/lists/:listId/add` — newly added items only. */
192
+ type AddItemsToListResponse = {
193
+ listId: string;
194
+ addedItems: HydratedWishlistItem[];
195
+ addedCount: number;
196
+ };
197
+ /** @deprecated Use `AddItemsToListResponse`. */
198
+ type AddItemsToListDeltaResponse = AddItemsToListResponse;
185
199
  type UpdateListItemResponse = unknown;
186
200
  type RemoveItemFromListResponse = OkResponse;
187
201
  type ReorderListItemsResponse = {
@@ -196,12 +210,29 @@ type RevokeListSharedResponse = ListMutationResponse;
196
210
  type RequestFn$2 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
197
211
  type GetListsQuery = PaginatedQuery;
198
212
  type GetListQuery = Omit<PaginatedQuery, "query">;
213
+ type AddItemsBatchedOptions = {
214
+ /** Max items per POST (API hard max is 25). */
215
+ batchSize?: number;
216
+ };
217
+ type GetByIdAllItemsOptions = {
218
+ pageSize?: number;
219
+ sortBy?: GetListQuery["sortBy"];
220
+ sortDirection?: GetListQuery["sortDirection"];
221
+ };
199
222
  declare function createListsResource(request: RequestFn$2): {
200
223
  /** Returns all lists for the authenticated customer under the current merchant. */
201
224
  getAll: (query?: GetListsQuery) => Promise<GetListsResponse>;
202
225
  /** Fetch list details by id. */
203
- getById: (listId: string, query?: GetListQuery) => Promise<ListDetail>;
204
- /** Create a new list. */
226
+ getById: (listId: string, query?: GetListQuery) => Promise<GetListResponse>;
227
+ /**
228
+ * Fetch every item on a list by walking pages (list detail is paginated;
229
+ * max pageSize 25).
230
+ */
231
+ getByIdAllItems: (listId: string, opts?: GetByIdAllItemsOptions) => Promise<GetListResponse>;
232
+ /**
233
+ * Create a new list. Do not send `variantIds` — add items via `addItems`
234
+ * or `addItemsBatched` after create.
235
+ */
205
236
  create: (body: CreateListBody) => Promise<ListMutationResponse>;
206
237
  /** Update list name/description. */
207
238
  update: (listId: string, body: UpdateListBody) => Promise<ListMutationResponse>;
@@ -214,8 +245,17 @@ declare function createListsResource(request: RequestFn$2): {
214
245
  * The copy is named `Copy of {original name}` and is not shared.
215
246
  */
216
247
  duplicate: (listId: string, body?: DuplicateListBody) => Promise<ListMutationResponse>;
217
- /** Add one or more items to a list. */
218
- addItems: (listId: string, body: AddItemsToListBody) => Promise<unknown>;
248
+ /**
249
+ * Add one or more items to a list.
250
+ * Returns `{ listId, addedItems, addedCount }`. Prefer `addItemsBatched`
251
+ * when sending more than 25 items.
252
+ */
253
+ addItems: (listId: string, body: AddItemsToListBody) => Promise<AddItemsToListResponse>;
254
+ /**
255
+ * Add items in sequential batches of ≤25 (API hard max).
256
+ * Merges `{ addedItems, addedCount }` across batches.
257
+ */
258
+ addItemsBatched: (listId: string, body: AddItemsToListBody, opts?: AddItemsBatchedOptions) => Promise<AddItemsToListResponse>;
219
259
  /** Update an item on a list. */
220
260
  updateItem: (listId: string, itemId: string, body: UpdateListItemBody) => Promise<unknown>;
221
261
  /** Remove an item from a list. */
@@ -230,7 +270,7 @@ declare function createListsResource(request: RequestFn$2): {
230
270
  * Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).
231
271
  * Prefer `addItems(listId, body)` unless your server only supports the legacy route.
232
272
  */
233
- addItemsLegacy: (id: string, body: AddItemsToListBody) => Promise<unknown>;
273
+ addItemsLegacy: (id: string, body: AddItemsToListBody) => Promise<AddItemsToListResponse>;
234
274
  };
235
275
 
236
276
  type CreateGroupBody = {
@@ -241,13 +281,20 @@ type UpdateGroupBody = {
241
281
  name?: string;
242
282
  description?: string;
243
283
  };
244
- type ReorderGroupBody = {
245
- listIds?: string[];
284
+ /**
285
+ * Body for `POST /api/groups/reorder` — reorder the customer's groups.
286
+ * `groupIds` must list every group CUID in the desired order.
287
+ */
288
+ type ReorderGroupsBody = {
289
+ groupIds: string[];
246
290
  };
291
+ /** @deprecated Use `ReorderGroupsBody` (`groupIds` on `POST /api/groups/reorder`). */
292
+ type ReorderGroupBody = ReorderGroupsBody;
247
293
 
248
294
  /**
249
295
  * List embedded on a group when `includeLists=1` is passed to `groups.getAll()`.
250
- * Items are fully hydrated (same shape as `lists.getById`).
296
+ * Items are hydrated (same shape as `lists.getById` items).
297
+ * Expect at most **10 lists × 25 items** per group.
251
298
  */
252
299
  type GroupSummaryList = {
253
300
  id: string;
@@ -267,7 +314,10 @@ type GroupSummary = {
267
314
  position: number;
268
315
  shared: boolean;
269
316
  listCount: number;
270
- /** Empty unless `includeLists=1` was requested. */
317
+ /**
318
+ * Empty unless `includeLists=1` was requested.
319
+ * Cap: 10 lists × 25 items each.
320
+ */
271
321
  lists: GroupSummaryList[];
272
322
  featuredItems: FeaturedItem[];
273
323
  createdAt: string;
@@ -317,23 +367,40 @@ type CreateGroupResponse = GroupMutationResponse;
317
367
  type DuplicateGroupResponse = GroupMutationResponse;
318
368
  type UpdateGroupDetailsResponse = GroupMutationResponse;
319
369
  type RemoveGroupResponse = OkResponse;
320
- type ReorderGroupResponse = unknown;
370
+ type ReorderGroupsResponse = {
371
+ updated: Array<{
372
+ id: string;
373
+ position: number;
374
+ }>;
375
+ };
376
+ /** @deprecated Prefer `ReorderGroupsResponse`. */
377
+ type ReorderGroupResponse = ReorderGroupsResponse;
321
378
  type MarkGroupSharedResponse = GroupMutationResponse;
322
379
  type RevokeGroupSharedResponse = GroupMutationResponse;
323
380
 
324
381
  type RequestFn$1 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
325
382
  type GetGroupsQuery = PaginatedQuery<{
326
383
  /**
327
- * When truthy (`true`, `1`, or `"1"`), each group includes its full `lists`
328
- * array with hydrated items. Sent to the API as `includeLists=1`.
384
+ * When truthy (`true`, `1`, or `"1"`), each group includes embedded `lists`
385
+ * with hydrated items (`includeLists=1`).
386
+ *
387
+ * Expect at most **10 lists × 25 items** per group. For full data use
388
+ * `groups.getById` plus `lists.getById` / `lists.getByIdAllItems`. Groups
389
+ * endpoints may return **503** until the Groups API is enabled for the merchant.
329
390
  */
330
391
  includeLists?: boolean | 1 | "1";
331
392
  }>;
332
393
  type GetGroupQuery = PaginatedQuery;
333
394
  declare function createGroupsResource(request: RequestFn$1): {
334
- /** Fetch groups for the authenticated customer. */
395
+ /**
396
+ * Fetch groups for the authenticated customer.
397
+ * May return **503** when the Groups API is disabled for this merchant.
398
+ */
335
399
  getAll: (query?: GetGroupsQuery) => Promise<GetGroupsResponse>;
336
- /** Fetch group details by id. */
400
+ /**
401
+ * Fetch group details by id.
402
+ * May return **503** when the Groups API is disabled for this merchant.
403
+ */
337
404
  getById: (groupId: string, query?: GetGroupQuery) => Promise<GroupDetail>;
338
405
  /** Create a new group. */
339
406
  create: (body: CreateGroupBody) => Promise<GroupMutationResponse>;
@@ -346,8 +413,12 @@ declare function createGroupsResource(request: RequestFn$1): {
346
413
  * The copy is named `Copy of {original name}` and is not shared.
347
414
  */
348
415
  duplicate: (groupId: string) => Promise<GroupMutationResponse>;
349
- /** Reorder a group (spec uses listIds payload). */
350
- reorder: (groupId: string, body: ReorderGroupBody) => Promise<unknown>;
416
+ /**
417
+ * Reorder the customer's groups (`POST /api/groups/reorder`).
418
+ * Body must include `groupIds` in the desired order — not list IDs, and
419
+ * not a per-group path.
420
+ */
421
+ reorder: (body: ReorderGroupsBody) => Promise<ReorderGroupsResponse>;
351
422
  /** Mark group as shared (public read-only). */
352
423
  share: (groupId: string) => Promise<GroupMutationResponse>;
353
424
  /** Revoke group sharing. */
@@ -359,7 +430,7 @@ type GetSharedListQuery = Omit<PaginatedQuery, "query">;
359
430
  type GetSharedGroupQuery = PaginatedQuery;
360
431
  declare function createSharedResource(request: RequestFn): {
361
432
  /** Public read-only view of a shared list. Requires only merchant apiKey. */
362
- getSharedList: (listId: string, query?: GetSharedListQuery) => Promise<ListDetail>;
433
+ getSharedList: (listId: string, query?: GetSharedListQuery) => Promise<GetListResponse>;
363
434
  /** Public read-only view of a shared group. Requires only merchant apiKey. */
364
435
  getSharedGroup: (groupId: string, query?: GetSharedGroupQuery) => Promise<GroupDetail>;
365
436
  };
@@ -369,6 +440,10 @@ type CreateWishlistStackClientOptions = {
369
440
  apiKey: string;
370
441
  customerAccessToken?: string;
371
442
  fetch?: FetchLike;
443
+ /** Default request timeout in ms when a call does not pass `timeoutMs`. */
444
+ defaultTimeoutMs?: number;
445
+ /** When true, retry once on HTTP 429 with jittered backoff (default: false). */
446
+ retryOnRateLimit?: boolean;
372
447
  };
373
448
  type WishlistStackClient$1 = {
374
449
  lists: ReturnType<typeof createListsResource>;
@@ -389,6 +464,12 @@ type ApiErrorResponse = {
389
464
  type GetSharedListResponse = GetListResponse;
390
465
  type GetSharedGroupResponse = GetGroupResponse;
391
466
 
467
+ /**
468
+ * True when the value matches the add-items response shape
469
+ * (`{ listId, addedItems, addedCount }`).
470
+ */
471
+ declare function isAddItemsDeltaResponse(value: AddItemsToListResponse | unknown): value is AddItemsToListResponse;
472
+
392
473
  /**
393
474
  * Class wrapper around `createWishlistStackClient()` for users who prefer `new`.
394
475
  * Exposes `lists`, `groups`, and `shared` resources.
@@ -412,6 +493,14 @@ type WishlistStackApiErrorDetails<TBody = unknown> = {
412
493
  method: string;
413
494
  requestId?: string;
414
495
  body?: TBody;
496
+ /** Value of the `Retry-After` response header when present (seconds or HTTP-date). */
497
+ retryAfter?: string;
498
+ /** Selected rate-limit response headers when present. */
499
+ rateLimit?: {
500
+ limit?: string;
501
+ remaining?: string;
502
+ reset?: string;
503
+ };
415
504
  };
416
505
  declare class WishlistStackApiError<TBody = unknown> extends Error {
417
506
  readonly name = "WishlistStackApiError";
@@ -420,6 +509,8 @@ declare class WishlistStackApiError<TBody = unknown> extends Error {
420
509
  readonly method: string;
421
510
  readonly requestId?: string;
422
511
  readonly body?: TBody;
512
+ readonly retryAfter?: string;
513
+ readonly rateLimit?: WishlistStackApiErrorDetails["rateLimit"];
423
514
  constructor(message: string, details: WishlistStackApiErrorDetails<TBody>);
424
515
  /**
425
516
  * Best-effort extraction of API error items from the response body.
@@ -439,4 +530,14 @@ declare class WishlistStackApiError<TBody = unknown> extends Error {
439
530
  */
440
531
  declare function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown>;
441
532
 
442
- export { type AddItemsToListBody, type AddItemsToListResponse, type ApiErrorItem, type ApiErrorResponse, type CreateGroupBody, type CreateGroupResponse, type CreateListBody, type CreateListResponse, type CreateWishlistStackClientOptions, DEFAULT_PAGE, DEFAULT_PAGE_SIZE, type DuplicateGroupResponse, type DuplicateListBody, type DuplicateListResponse, type FeaturedItem, type GetGroupResponse, type GetGroupsResponse, type GetListResponse, type GetListsResponse, type GetSharedGroupResponse, type GetSharedListResponse, type GroupDetail, type GroupDetailList, type GroupMutationResponse, type GroupSummary, type GroupSummaryList, type HydratedProduct, type HydratedVariant, type HydratedWishlistItem, type Id, type Image, type ListDetail, type ListMutationResponse, type ListSummary, type MarkGroupSharedResponse, type MarkListSharedResponse, type Metafield, type Money, type OkResponse, type PaginatedQuery, type Pagination, type PaginationParams, type RemoveGroupResponse, type RemoveItemFromListResponse, type RemoveListResponse, type ReorderGroupBody, type ReorderGroupResponse, type ReorderListItemsBody, type ReorderListItemsResponse, type RevokeGroupSharedResponse, type RevokeListSharedResponse, SORT_DIRECTIONS, SORT_FIELDS, type SelectedOption, type SortDirection, type SortField, type SortParams, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, createWishlistStackClient, isWishlistStackApiError, withPagination, withSort };
533
+ /**
534
+ * Clamp a page size to the API-allowed range (1–25) so requests
535
+ * do not send invalid `pageSize` values.
536
+ */
537
+ declare function clampPageSize(n: number): number;
538
+ /**
539
+ * Clamp a 1-based page index to at least 1.
540
+ */
541
+ declare function clampPage(n: number): number;
542
+
543
+ export { type AddItemsToListBody, type AddItemsToListDeltaResponse, type AddItemsToListResponse, type ApiErrorItem, type ApiErrorResponse, type CreateGroupBody, type CreateGroupResponse, type CreateListBody, type CreateListResponse, type CreateWishlistStackClientOptions, DEFAULT_PAGE, DEFAULT_PAGE_SIZE, type DuplicateGroupResponse, type DuplicateListBody, type DuplicateListResponse, type FeaturedItem, type GetGroupResponse, type GetGroupsResponse, type GetListResponse, type GetListsResponse, type GetSharedGroupResponse, type GetSharedListResponse, type GroupDetail, type GroupDetailList, type GroupMutationResponse, type GroupSummary, type GroupSummaryList, type HydratedProduct, type HydratedVariant, type HydratedWishlistItem, type Id, type Image, type ListDetail, type ListMutationResponse, type ListSummary, type MarkGroupSharedResponse, type MarkListSharedResponse, type Metafield, type Money, type OkResponse, type PaginatedQuery, type Pagination, type PaginationParams, type RemoveGroupResponse, type RemoveItemFromListResponse, type RemoveListResponse, type ReorderGroupBody, type ReorderGroupResponse, type ReorderGroupsBody, type ReorderGroupsResponse, type ReorderListItemsBody, type ReorderListItemsResponse, type RevokeGroupSharedResponse, type RevokeListSharedResponse, SORT_DIRECTIONS, SORT_FIELDS, type SelectedOption, type SortDirection, type SortField, type SortParams, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, clampPage, clampPageSize, createWishlistStackClient, isAddItemsDeltaResponse, isWishlistStackApiError, withPagination, withSort };