@sdg.la/wishlist-stack-sdk 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUTH_EXAMPLE.md +209 -0
- package/README.md +191 -1
- package/dist/index.cjs +28 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +63 -18
- package/dist/index.d.ts +63 -18
- package/dist/index.js +28 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/AUTH_EXAMPLE.md
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Getting a customer access token (Shopify Liquid storefront)
|
|
2
|
+
|
|
3
|
+
Authenticated SDK endpoints require a `customerAccessToken`. In a Liquid theme, you typically run client-side JavaScript (theme asset or inline script) to perform the OAuth 2.0 + PKCE flow and pass the resulting `access_token` into `createWishlistStackClient({ customerAccessToken })`.
|
|
4
|
+
|
|
5
|
+
**Official Shopify documentation:**
|
|
6
|
+
|
|
7
|
+
- [Getting started with the Customer Account API](https://shopify.dev/docs/storefronts/headless/building-with-the-customer-account-api/getting-started) — setup, credentials, OAuth overview
|
|
8
|
+
- [Customer Account API reference (OAuth)](https://shopify.dev/docs/api/customer/latest) — authorize/token endpoints, PKCE, `prompt=none` silent auth
|
|
9
|
+
|
|
10
|
+
> **Example only.** This snippet is adapted from Shopify's documentation for illustration. It is not maintained or supported by this SDK. Your theme, Customer Account API settings, and Shopify session behavior may differ — mileage may vary. For Hydrogen storefronts, use [`@sdg.la/wishlist-stack-hydrogen`](../hydrogen/README.md) instead.
|
|
11
|
+
|
|
12
|
+
## Flow
|
|
13
|
+
|
|
14
|
+
1. Handle OAuth callback — exchange `code` for tokens
|
|
15
|
+
2. Refresh existing tokens when possible
|
|
16
|
+
3. Otherwise redirect with `prompt=none` for silent auth (requires an existing Shopify login session)
|
|
17
|
+
|
|
18
|
+
## Prerequisites
|
|
19
|
+
|
|
20
|
+
- Store ID and client ID from Customer Account API settings in Shopify admin
|
|
21
|
+
- Redirect URI registered in admin (must match `redirectUri` in the script)
|
|
22
|
+
- Customer logged in via the account link for silent auth to succeed
|
|
23
|
+
|
|
24
|
+
## Example
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
(async function () {
|
|
28
|
+
const storeId = "YOUR_STORE_ID";
|
|
29
|
+
const clientId = ""; // Client id from headless environment
|
|
30
|
+
const redirectUri = window.location.origin;
|
|
31
|
+
|
|
32
|
+
function generateRandomCode() {
|
|
33
|
+
const array = new Uint8Array(32);
|
|
34
|
+
crypto.getRandomValues(array);
|
|
35
|
+
return String.fromCharCode.apply(null, Array.from(array));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function base64UrlEncode(str) {
|
|
39
|
+
const base64 = btoa(str);
|
|
40
|
+
return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function convertBufferToString(hash) {
|
|
44
|
+
const uintArray = new Uint8Array(hash);
|
|
45
|
+
const numberArray = Array.from(uintArray);
|
|
46
|
+
return String.fromCharCode(...numberArray);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function generateCodeVerifier() {
|
|
50
|
+
const rando = generateRandomCode();
|
|
51
|
+
return base64UrlEncode(rando);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async function generateCodeChallenge(codeVerifier) {
|
|
55
|
+
const digestOp = await crypto.subtle.digest(
|
|
56
|
+
{ name: "SHA-256" },
|
|
57
|
+
new TextEncoder().encode(codeVerifier),
|
|
58
|
+
);
|
|
59
|
+
const hash = convertBufferToString(digestOp);
|
|
60
|
+
return base64UrlEncode(hash);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function generateState() {
|
|
64
|
+
const timestamp = Date.now().toString();
|
|
65
|
+
const randomString = Math.random().toString(36).substring(2);
|
|
66
|
+
return timestamp + randomString;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function generateNonce(length) {
|
|
70
|
+
const characters =
|
|
71
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
|
72
|
+
let nonce = "";
|
|
73
|
+
for (let i = 0; i < length; i++) {
|
|
74
|
+
const randomIndex = Math.floor(Math.random() * characters.length);
|
|
75
|
+
nonce += characters.charAt(randomIndex);
|
|
76
|
+
}
|
|
77
|
+
return nonce;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ── Step 1: Check for authorization code in URL (callback handler) ──
|
|
81
|
+
|
|
82
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
83
|
+
const code = urlParams.get("code");
|
|
84
|
+
|
|
85
|
+
if (code) {
|
|
86
|
+
console.log("Authorization code found, exchanging for tokens...");
|
|
87
|
+
|
|
88
|
+
const codeVerifier = localStorage.getItem("code-verifier");
|
|
89
|
+
if (!codeVerifier) {
|
|
90
|
+
console.error("No code-verifier found in localStorage. Cannot exchange code.");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Clean up URL
|
|
95
|
+
urlParams.delete("code");
|
|
96
|
+
urlParams.delete("state");
|
|
97
|
+
const newUrl = `${window.location.pathname}${urlParams.toString() ? `?${urlParams.toString()}` : ""}${window.location.hash}`;
|
|
98
|
+
window.history.replaceState({}, "", newUrl);
|
|
99
|
+
localStorage.removeItem("code-verifier");
|
|
100
|
+
|
|
101
|
+
// Exchange code for tokens
|
|
102
|
+
const body = new URLSearchParams();
|
|
103
|
+
body.append("grant_type", "authorization_code");
|
|
104
|
+
body.append("client_id", clientId);
|
|
105
|
+
body.append("redirect_uri", redirectUri);
|
|
106
|
+
body.append("code", code);
|
|
107
|
+
body.append("code_verifier", codeVerifier);
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const response = await fetch(
|
|
111
|
+
`https://shopify.com/authentication/${storeId}/oauth/token`,
|
|
112
|
+
{
|
|
113
|
+
method: "POST",
|
|
114
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
115
|
+
body,
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
const data = await response.json();
|
|
119
|
+
|
|
120
|
+
if (!data.access_token) {
|
|
121
|
+
console.error("Token exchange failed:", data);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const { access_token, expires_in, id_token, refresh_token } = data;
|
|
126
|
+
localStorage.setItem(
|
|
127
|
+
"customer-access-data",
|
|
128
|
+
JSON.stringify({ access_token, expires_in, id_token, refresh_token }),
|
|
129
|
+
);
|
|
130
|
+
console.log("Access token obtained successfully!");
|
|
131
|
+
console.log("Access Token:", access_token);
|
|
132
|
+
|
|
133
|
+
return;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error("Error exchanging code for tokens:", error);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ── Step 2: Check for existing tokens and try refresh ──
|
|
141
|
+
|
|
142
|
+
const existingData = localStorage.getItem("customer-access-data");
|
|
143
|
+
if (existingData) {
|
|
144
|
+
const parsed = JSON.parse(existingData);
|
|
145
|
+
if (parsed.refresh_token) {
|
|
146
|
+
console.log("Found existing refresh token, attempting refresh...");
|
|
147
|
+
|
|
148
|
+
const body = new URLSearchParams();
|
|
149
|
+
body.append("grant_type", "refresh_token");
|
|
150
|
+
body.append("client_id", clientId);
|
|
151
|
+
body.append("refresh_token", parsed.refresh_token);
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(
|
|
155
|
+
`https://shopify.com/authentication/${storeId}/oauth/token`,
|
|
156
|
+
{
|
|
157
|
+
method: "POST",
|
|
158
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
159
|
+
body,
|
|
160
|
+
},
|
|
161
|
+
);
|
|
162
|
+
const data = await response.json();
|
|
163
|
+
|
|
164
|
+
if (data.access_token) {
|
|
165
|
+
localStorage.setItem(
|
|
166
|
+
"customer-access-data",
|
|
167
|
+
JSON.stringify({
|
|
168
|
+
access_token: data.access_token,
|
|
169
|
+
expires_in: data.expires_in,
|
|
170
|
+
id_token: data.id_token || parsed.id_token,
|
|
171
|
+
refresh_token: data.refresh_token,
|
|
172
|
+
}),
|
|
173
|
+
);
|
|
174
|
+
console.log("Token refreshed successfully!");
|
|
175
|
+
console.log("Access Token:", data.access_token);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
} catch (error) {
|
|
179
|
+
console.warn("Refresh failed, will attempt silent auth:", error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const state = await generateState();
|
|
185
|
+
const nonce = await generateNonce(16);
|
|
186
|
+
const verifier = await generateCodeVerifier();
|
|
187
|
+
const challenge = await generateCodeChallenge(verifier);
|
|
188
|
+
localStorage.setItem("code-verifier", verifier);
|
|
189
|
+
|
|
190
|
+
const authUrl = new URL(
|
|
191
|
+
`https://shopify.com/authentication/${storeId}/oauth/authorize`,
|
|
192
|
+
);
|
|
193
|
+
authUrl.searchParams.append("scope", "openid email customer-account-api:full");
|
|
194
|
+
authUrl.searchParams.append("client_id", clientId);
|
|
195
|
+
authUrl.searchParams.append("response_type", "code");
|
|
196
|
+
authUrl.searchParams.append("redirect_uri", redirectUri);
|
|
197
|
+
authUrl.searchParams.append("state", state);
|
|
198
|
+
authUrl.searchParams.append("nonce", nonce);
|
|
199
|
+
authUrl.searchParams.append("code_challenge", challenge);
|
|
200
|
+
authUrl.searchParams.append("code_challenge_method", "S256");
|
|
201
|
+
authUrl.searchParams.append("prompt", "none"); // Silent auth - no login UI
|
|
202
|
+
|
|
203
|
+
console.log("Redirecting for silent auth...");
|
|
204
|
+
console.log("If you see a login_required error in the URL after redirect,");
|
|
205
|
+
console.log("it means no Shopify session exists - log in via the account link first.");
|
|
206
|
+
|
|
207
|
+
window.location.href = authUrl.toString();
|
|
208
|
+
})();
|
|
209
|
+
```
|
package/README.md
CHANGED
|
@@ -14,6 +14,8 @@ TypeScript/JavaScript SDK for the Wishlist Stack API.
|
|
|
14
14
|
- [Usage](#usage)
|
|
15
15
|
- [Server / Node.js / Workers](#server--nodejs--workers)
|
|
16
16
|
- [Browser](#browser)
|
|
17
|
+
- [Raw HTML (script module)](#raw-html-script-module)
|
|
18
|
+
- [Shopify Liquid authentication](#shopify-liquid-authentication)
|
|
17
19
|
- [Class API](#class-api)
|
|
18
20
|
- [Error Handling](#error-handling)
|
|
19
21
|
- [Pagination](#pagination)
|
|
@@ -102,6 +104,35 @@ const { lists } = await client.lists.getAll();
|
|
|
102
104
|
|
|
103
105
|
> **Note:** If you use a strict Content Security Policy (CSP), you must allow your API domain in `connect-src`.
|
|
104
106
|
|
|
107
|
+
### Raw HTML (script module)
|
|
108
|
+
|
|
109
|
+
You can load the SDK in plain HTML without a bundler by using a `<script type="module">` tag and importing from a CDN:
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<script type="module">
|
|
113
|
+
import { createWishlistStackClient } from "https://cdn.jsdelivr.net/npm/@sdg.la/wishlist-stack-sdk@0.10.1/+esm";
|
|
114
|
+
|
|
115
|
+
window.wishlistClient = createWishlistStackClient({
|
|
116
|
+
apiKey: "YOUR_MERCHANT_API_KEY",
|
|
117
|
+
customerAccessToken: "...",
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Example usage:
|
|
121
|
+
await window.wishlistClient.groups.getAll();
|
|
122
|
+
await window.wishlistClient.lists.getAll();
|
|
123
|
+
</script>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Pin the version in the CDN URL (as shown above) so updates do not break your integration unexpectedly.
|
|
127
|
+
|
|
128
|
+
> **Note:** With a strict CSP, allow `https://cdn.jsdelivr.net` in `script-src` (for the module import) and your API domain in `connect-src`.
|
|
129
|
+
|
|
130
|
+
### Shopify Liquid authentication
|
|
131
|
+
|
|
132
|
+
Authenticated SDK calls require a customer access token. For Liquid themes, obtain one via Shopify's Customer Account API OAuth flow in the browser.
|
|
133
|
+
|
|
134
|
+
See [AUTH_EXAMPLE.md](./AUTH_EXAMPLE.md) for an example-only reference implementation adapted from Shopify's docs.
|
|
135
|
+
|
|
105
136
|
### Class API
|
|
106
137
|
|
|
107
138
|
If you prefer a class-based API, use `WishlistStackSDK`:
|
|
@@ -154,6 +185,9 @@ Endpoints that return lists support pagination via query parameters:
|
|
|
154
185
|
// Paginate groups
|
|
155
186
|
await client.groups.getAll({ page: 2, pageSize: 10 });
|
|
156
187
|
|
|
188
|
+
// Include lists + hydrated items on groups.getAll
|
|
189
|
+
await client.groups.getAll({ includeLists: true });
|
|
190
|
+
|
|
157
191
|
// Paginate lists within a group
|
|
158
192
|
await client.groups.getById('group-id', { page: 1, pageSize: 25 });
|
|
159
193
|
|
|
@@ -185,11 +219,16 @@ await client.lists.getById('list-id', { page: 1, pageSize: 25 });
|
|
|
185
219
|
Fetch all groups for the authenticated customer.
|
|
186
220
|
|
|
187
221
|
- **Endpoint:** `GET /api/groups`
|
|
188
|
-
- **Parameters:** `query?` — `{ page?: number; pageSize?: number
|
|
222
|
+
- **Parameters:** `query?` — `{ page?: number; pageSize?: number; query?: string; includeLists?: boolean | 1 | "1" }`
|
|
189
223
|
- **Returns:** `Promise<GetGroupsResponse>`
|
|
190
224
|
|
|
225
|
+
Pass `includeLists: true` (sent as `includeLists=1`) to embed every list under each group with fully hydrated items — useful for loading projects/boards in one call instead of per-group `getById` fan-out. Without it, `lists` is an empty array and only `featuredItems` are populated.
|
|
226
|
+
|
|
191
227
|
```ts
|
|
192
228
|
const { groups, pagination } = await client.groups.getAll({ page: 1, pageSize: 10, query: 'holiday' });
|
|
229
|
+
|
|
230
|
+
// Include lists + hydrated items
|
|
231
|
+
const { groups: withLists } = await client.groups.getAll({ includeLists: true });
|
|
193
232
|
```
|
|
194
233
|
|
|
195
234
|
<details>
|
|
@@ -205,6 +244,7 @@ const { groups, pagination } = await client.groups.getAll({ page: 1, pageSize: 1
|
|
|
205
244
|
"position": 1,
|
|
206
245
|
"shared": false,
|
|
207
246
|
"listCount": 2,
|
|
247
|
+
"lists": [],
|
|
208
248
|
"createdAt": "2025-01-10T08:00:00.000Z",
|
|
209
249
|
"updatedAt": "2025-01-18T12:00:00.000Z",
|
|
210
250
|
"featuredItems": [
|
|
@@ -231,6 +271,75 @@ const { groups, pagination } = await client.groups.getAll({ page: 1, pageSize: 1
|
|
|
231
271
|
|
|
232
272
|
</details>
|
|
233
273
|
|
|
274
|
+
<details>
|
|
275
|
+
<summary>Example response with <code>includeLists: true</code></summary>
|
|
276
|
+
|
|
277
|
+
```json
|
|
278
|
+
{
|
|
279
|
+
"groups": [
|
|
280
|
+
{
|
|
281
|
+
"id": "cml8drad90001js09weonjojg",
|
|
282
|
+
"name": "Holiday Lists",
|
|
283
|
+
"description": "All my holiday wishlists",
|
|
284
|
+
"position": 1,
|
|
285
|
+
"shared": false,
|
|
286
|
+
"listCount": 1,
|
|
287
|
+
"lists": [
|
|
288
|
+
{
|
|
289
|
+
"id": "cml8drg8x0003js093j4ua6p8",
|
|
290
|
+
"name": "Gift Ideas",
|
|
291
|
+
"description": "Birthday gift ideas",
|
|
292
|
+
"position": 1,
|
|
293
|
+
"shared": false,
|
|
294
|
+
"itemCount": 1,
|
|
295
|
+
"items": [
|
|
296
|
+
{
|
|
297
|
+
"id": "item_1",
|
|
298
|
+
"quantity": 1,
|
|
299
|
+
"position": 1,
|
|
300
|
+
"userNote": null,
|
|
301
|
+
"product": {
|
|
302
|
+
"id": "gid://shopify/Product/1",
|
|
303
|
+
"title": "Example Product",
|
|
304
|
+
"description": "",
|
|
305
|
+
"availableForSale": true,
|
|
306
|
+
"handle": "example-product",
|
|
307
|
+
"productType": null,
|
|
308
|
+
"category": null,
|
|
309
|
+
"tags": [],
|
|
310
|
+
"onlineStoreUrl": null,
|
|
311
|
+
"metafields": [],
|
|
312
|
+
"vendor": null,
|
|
313
|
+
"variant": {
|
|
314
|
+
"id": "46932429275374",
|
|
315
|
+
"title": "Default",
|
|
316
|
+
"price": { "amount": "10.00", "currencyCode": "USD" },
|
|
317
|
+
"availableForSale": true,
|
|
318
|
+
"currentlyNotInStock": false,
|
|
319
|
+
"selectedOptions": [],
|
|
320
|
+
"metafields": []
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
]
|
|
325
|
+
}
|
|
326
|
+
],
|
|
327
|
+
"featuredItems": [],
|
|
328
|
+
"createdAt": "2025-01-10T08:00:00.000Z",
|
|
329
|
+
"updatedAt": "2025-01-18T12:00:00.000Z"
|
|
330
|
+
}
|
|
331
|
+
],
|
|
332
|
+
"pagination": {
|
|
333
|
+
"page": 1,
|
|
334
|
+
"pageSize": 10,
|
|
335
|
+
"totalCount": 1,
|
|
336
|
+
"totalPages": 1
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
</details>
|
|
342
|
+
|
|
234
343
|
---
|
|
235
344
|
|
|
236
345
|
#### `groups.getById(groupId, query?)`
|
|
@@ -383,6 +492,38 @@ await client.groups.remove('group-id');
|
|
|
383
492
|
|
|
384
493
|
---
|
|
385
494
|
|
|
495
|
+
#### `groups.duplicate(groupId)`
|
|
496
|
+
|
|
497
|
+
Duplicate a group in a single call, including all of its lists and items. The copy is named `Copy of {original name}` and is not shared.
|
|
498
|
+
|
|
499
|
+
- **Endpoint:** `POST /api/groups/{groupId}/duplicate`
|
|
500
|
+
- **Parameters:** `groupId` — `string`
|
|
501
|
+
- **Returns:** `Promise<DuplicateGroupResponse>`
|
|
502
|
+
|
|
503
|
+
```ts
|
|
504
|
+
const copy = await client.groups.duplicate('group-id');
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
<details>
|
|
508
|
+
<summary>Example response</summary>
|
|
509
|
+
|
|
510
|
+
```json
|
|
511
|
+
{
|
|
512
|
+
"id": "cmlbe49qk0001ju094x1ya9co",
|
|
513
|
+
"name": "Copy of Holiday Lists",
|
|
514
|
+
"description": "All my holiday wishlists",
|
|
515
|
+
"position": 2,
|
|
516
|
+
"shared": false,
|
|
517
|
+
"listCount": 2,
|
|
518
|
+
"createdAt": "2025-01-22T09:15:00.000Z",
|
|
519
|
+
"updatedAt": "2025-01-22T09:15:00.000Z"
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
</details>
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
386
527
|
#### `groups.reorder(groupId, body)`
|
|
387
528
|
|
|
388
529
|
Reorder lists within a group.
|
|
@@ -685,6 +826,38 @@ await client.lists.remove('list-id');
|
|
|
685
826
|
|
|
686
827
|
---
|
|
687
828
|
|
|
829
|
+
#### `lists.duplicate(listId)`
|
|
830
|
+
|
|
831
|
+
Duplicate a list in a single call, including all of its items. The copy stays in the same group (if any), is named `Copy of {original name}`, and is not shared.
|
|
832
|
+
|
|
833
|
+
- **Endpoint:** `POST /api/lists/{listId}/duplicate`
|
|
834
|
+
- **Parameters:** `listId` — `string`
|
|
835
|
+
- **Returns:** `Promise<DuplicateListResponse>`
|
|
836
|
+
|
|
837
|
+
```ts
|
|
838
|
+
const copy = await client.lists.duplicate('list-id');
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
<details>
|
|
842
|
+
<summary>Example response</summary>
|
|
843
|
+
|
|
844
|
+
```json
|
|
845
|
+
{
|
|
846
|
+
"id": "cml8drg8x0003js093j4ua6p8",
|
|
847
|
+
"name": "Copy of Gift Ideas",
|
|
848
|
+
"description": "Birthday gift ideas",
|
|
849
|
+
"position": 2,
|
|
850
|
+
"shared": false,
|
|
851
|
+
"itemCount": 3,
|
|
852
|
+
"createdAt": "2025-01-22T09:15:00.000Z",
|
|
853
|
+
"updatedAt": "2025-01-22T09:15:00.000Z"
|
|
854
|
+
}
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
</details>
|
|
858
|
+
|
|
859
|
+
---
|
|
860
|
+
|
|
688
861
|
#### `lists.addItems(listId, body)`
|
|
689
862
|
|
|
690
863
|
Add one or more items to a list.
|
|
@@ -962,23 +1135,28 @@ import type {
|
|
|
962
1135
|
GetGroupsResponse,
|
|
963
1136
|
GetGroupResponse,
|
|
964
1137
|
GroupSummary,
|
|
1138
|
+
GroupSummaryList,
|
|
965
1139
|
GroupDetail,
|
|
966
1140
|
GroupDetailList,
|
|
1141
|
+
GroupMutationResponse,
|
|
967
1142
|
CreateGroupBody,
|
|
968
1143
|
UpdateGroupBody,
|
|
969
1144
|
ReorderGroupBody,
|
|
1145
|
+
DuplicateGroupResponse,
|
|
970
1146
|
|
|
971
1147
|
// Lists
|
|
972
1148
|
GetListsResponse,
|
|
973
1149
|
GetListResponse,
|
|
974
1150
|
ListSummary,
|
|
975
1151
|
ListDetail,
|
|
1152
|
+
ListMutationResponse,
|
|
976
1153
|
CreateListBody,
|
|
977
1154
|
UpdateListBody,
|
|
978
1155
|
AddItemsToListBody,
|
|
979
1156
|
UpdateListItemBody,
|
|
980
1157
|
ReorderListItemsBody,
|
|
981
1158
|
ReorderListItemsResponse,
|
|
1159
|
+
DuplicateListResponse,
|
|
982
1160
|
|
|
983
1161
|
// Shared
|
|
984
1162
|
GetSharedListResponse,
|
|
@@ -1030,10 +1208,22 @@ type GroupSummary = {
|
|
|
1030
1208
|
position: number;
|
|
1031
1209
|
shared: boolean;
|
|
1032
1210
|
listCount: number;
|
|
1211
|
+
/** Empty unless `includeLists` was requested on `groups.getAll()`. */
|
|
1212
|
+
lists: GroupSummaryList[];
|
|
1033
1213
|
featuredItems: FeaturedItem[];
|
|
1034
1214
|
createdAt: string;
|
|
1035
1215
|
updatedAt: string;
|
|
1036
1216
|
};
|
|
1217
|
+
|
|
1218
|
+
type GroupSummaryList = {
|
|
1219
|
+
id: string;
|
|
1220
|
+
name: string;
|
|
1221
|
+
description: string | null;
|
|
1222
|
+
position: number;
|
|
1223
|
+
shared: boolean;
|
|
1224
|
+
itemCount: number;
|
|
1225
|
+
items: HydratedWishlistItem[];
|
|
1226
|
+
};
|
|
1037
1227
|
```
|
|
1038
1228
|
|
|
1039
1229
|
</details>
|
package/dist/index.cjs
CHANGED
|
@@ -177,6 +177,16 @@ function createListsResource(request) {
|
|
|
177
177
|
path: `/api/lists/${encodeURIComponent(listId)}`,
|
|
178
178
|
auth: "authenticated"
|
|
179
179
|
}),
|
|
180
|
+
/**
|
|
181
|
+
* Duplicate a list (including all items) in a single call.
|
|
182
|
+
* The copy stays in the same group (if any), is named `Copy of {original name}`,
|
|
183
|
+
* and is not shared.
|
|
184
|
+
*/
|
|
185
|
+
duplicate: (listId) => request({
|
|
186
|
+
method: "POST",
|
|
187
|
+
path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,
|
|
188
|
+
auth: "authenticated"
|
|
189
|
+
}),
|
|
180
190
|
/** Add one or more items to a list. */
|
|
181
191
|
addItems: (listId, body) => request({
|
|
182
192
|
method: "POST",
|
|
@@ -230,6 +240,14 @@ function createListsResource(request) {
|
|
|
230
240
|
}
|
|
231
241
|
|
|
232
242
|
// src/resources/groups/index.ts
|
|
243
|
+
function normalizeGetGroupsQuery(query) {
|
|
244
|
+
if (!query) return void 0;
|
|
245
|
+
const { includeLists, ...rest } = query;
|
|
246
|
+
if (includeLists) {
|
|
247
|
+
return { ...rest, includeLists: 1 };
|
|
248
|
+
}
|
|
249
|
+
return Object.keys(rest).length > 0 ? rest : void 0;
|
|
250
|
+
}
|
|
233
251
|
function createGroupsResource(request) {
|
|
234
252
|
return {
|
|
235
253
|
/** Fetch groups for the authenticated customer. */
|
|
@@ -237,7 +255,7 @@ function createGroupsResource(request) {
|
|
|
237
255
|
method: "GET",
|
|
238
256
|
path: "/api/groups",
|
|
239
257
|
auth: "authenticated",
|
|
240
|
-
query
|
|
258
|
+
query: normalizeGetGroupsQuery(query)
|
|
241
259
|
}),
|
|
242
260
|
/** Fetch group details by id. */
|
|
243
261
|
getById: (groupId, query) => request({
|
|
@@ -266,6 +284,15 @@ function createGroupsResource(request) {
|
|
|
266
284
|
path: `/api/groups/${encodeURIComponent(groupId)}`,
|
|
267
285
|
auth: "authenticated"
|
|
268
286
|
}),
|
|
287
|
+
/**
|
|
288
|
+
* Duplicate a group (including all lists and items) in a single call.
|
|
289
|
+
* The copy is named `Copy of {original name}` and is not shared.
|
|
290
|
+
*/
|
|
291
|
+
duplicate: (groupId) => request({
|
|
292
|
+
method: "POST",
|
|
293
|
+
path: `/api/groups/${encodeURIComponent(groupId)}/duplicate`,
|
|
294
|
+
auth: "authenticated"
|
|
295
|
+
}),
|
|
269
296
|
/** Reorder a group (spec uses listIds payload). */
|
|
270
297
|
reorder: (groupId, body) => request({
|
|
271
298
|
method: "POST",
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 ReorderListItemsBody,\n UpdateListBody,\n UpdateListItemBody,\n} from \"../../types/requests/lists\";\nimport type {\n AddItemsToListResponse,\n CreateListResponse,\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 /** 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 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;\nexport type GetGroupQuery = PaginatedQuery;\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,\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 /** 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\n","import type { RequestArgs } from \"../../client/request\";\nimport type { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\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) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\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\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 & 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"]}
|
|
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 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 * The copy stays in the same group (if any), is named `Copy of {original name}`,\n * and is not shared.\n */\n duplicate: (listId: string) =>\n request<DuplicateListResponse>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,\n auth: \"authenticated\",\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 { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\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) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\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\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 & 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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -154,8 +154,10 @@ type GetListsResponse = {
|
|
|
154
154
|
};
|
|
155
155
|
/** GET `/api/lists/:listId` */
|
|
156
156
|
type GetListResponse = ListDetail;
|
|
157
|
-
type
|
|
158
|
-
type
|
|
157
|
+
type ListMutationResponse = Omit<ListSummary, "featuredProducts">;
|
|
158
|
+
type CreateListResponse = ListMutationResponse;
|
|
159
|
+
type DuplicateListResponse = ListMutationResponse;
|
|
160
|
+
type UpdateListDetailsResponse = ListMutationResponse;
|
|
159
161
|
type RemoveListResponse = OkResponse;
|
|
160
162
|
type AddItemsToListResponse = unknown;
|
|
161
163
|
type UpdateListItemResponse = unknown;
|
|
@@ -166,8 +168,8 @@ type ReorderListItemsResponse = {
|
|
|
166
168
|
position: number;
|
|
167
169
|
}>;
|
|
168
170
|
};
|
|
169
|
-
type MarkListSharedResponse =
|
|
170
|
-
type RevokeListSharedResponse =
|
|
171
|
+
type MarkListSharedResponse = ListMutationResponse;
|
|
172
|
+
type RevokeListSharedResponse = ListMutationResponse;
|
|
171
173
|
|
|
172
174
|
type RequestFn$2 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
173
175
|
type GetListsQuery = PaginatedQuery;
|
|
@@ -178,11 +180,17 @@ declare function createListsResource(request: RequestFn$2): {
|
|
|
178
180
|
/** Fetch list details by id. */
|
|
179
181
|
getById: (listId: string, query?: GetListQuery) => Promise<ListDetail>;
|
|
180
182
|
/** Create a new list. */
|
|
181
|
-
create: (body: CreateListBody) => Promise<
|
|
183
|
+
create: (body: CreateListBody) => Promise<ListMutationResponse>;
|
|
182
184
|
/** Update list name/description. */
|
|
183
|
-
update: (listId: string, body: UpdateListBody) => Promise<
|
|
185
|
+
update: (listId: string, body: UpdateListBody) => Promise<ListMutationResponse>;
|
|
184
186
|
/** Remove a list. */
|
|
185
187
|
remove: (listId: string) => Promise<OkResponse>;
|
|
188
|
+
/**
|
|
189
|
+
* Duplicate a list (including all items) in a single call.
|
|
190
|
+
* The copy stays in the same group (if any), is named `Copy of {original name}`,
|
|
191
|
+
* and is not shared.
|
|
192
|
+
*/
|
|
193
|
+
duplicate: (listId: string) => Promise<ListMutationResponse>;
|
|
186
194
|
/** Add one or more items to a list. */
|
|
187
195
|
addItems: (listId: string, body: AddItemsToListBody) => Promise<unknown>;
|
|
188
196
|
/** Update an item on a list. */
|
|
@@ -192,9 +200,9 @@ declare function createListsResource(request: RequestFn$2): {
|
|
|
192
200
|
/** Reorder all items in a list. */
|
|
193
201
|
reorderItems: (listId: string, body: ReorderListItemsBody) => Promise<ReorderListItemsResponse>;
|
|
194
202
|
/** Mark list as shared (public read-only). */
|
|
195
|
-
share: (listId: string) => Promise<
|
|
203
|
+
share: (listId: string) => Promise<ListMutationResponse>;
|
|
196
204
|
/** Revoke list sharing. */
|
|
197
|
-
unshare: (listId: string) => Promise<
|
|
205
|
+
unshare: (listId: string) => Promise<ListMutationResponse>;
|
|
198
206
|
/**
|
|
199
207
|
* Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).
|
|
200
208
|
* Prefer `addItems(listId, body)` unless your server only supports the legacy route.
|
|
@@ -214,6 +222,19 @@ type ReorderGroupBody = {
|
|
|
214
222
|
listIds?: string[];
|
|
215
223
|
};
|
|
216
224
|
|
|
225
|
+
/**
|
|
226
|
+
* List embedded on a group when `includeLists=1` is passed to `groups.getAll()`.
|
|
227
|
+
* Items are fully hydrated (same shape as `lists.getById`).
|
|
228
|
+
*/
|
|
229
|
+
type GroupSummaryList = {
|
|
230
|
+
id: string;
|
|
231
|
+
name: string;
|
|
232
|
+
description: string | null;
|
|
233
|
+
position: number;
|
|
234
|
+
shared: boolean;
|
|
235
|
+
itemCount: number;
|
|
236
|
+
items: HydratedWishlistItem[];
|
|
237
|
+
};
|
|
217
238
|
type GroupSummary = {
|
|
218
239
|
id: string;
|
|
219
240
|
name: string;
|
|
@@ -221,6 +242,8 @@ type GroupSummary = {
|
|
|
221
242
|
position: number;
|
|
222
243
|
shared: boolean;
|
|
223
244
|
listCount: number;
|
|
245
|
+
/** Empty unless `includeLists=1` was requested. */
|
|
246
|
+
lists: GroupSummaryList[];
|
|
224
247
|
featuredItems: FeaturedItem[];
|
|
225
248
|
createdAt: string;
|
|
226
249
|
updatedAt: string;
|
|
@@ -252,16 +275,33 @@ type GroupDetail = {
|
|
|
252
275
|
lists: GroupDetailList[];
|
|
253
276
|
pagination: Pagination;
|
|
254
277
|
};
|
|
278
|
+
type GroupMutationResponse = {
|
|
279
|
+
id: string;
|
|
280
|
+
name: string;
|
|
281
|
+
description: string | null;
|
|
282
|
+
position: number;
|
|
283
|
+
shared: boolean;
|
|
284
|
+
listCount: number;
|
|
285
|
+
createdAt: string;
|
|
286
|
+
updatedAt: string;
|
|
287
|
+
};
|
|
255
288
|
type GetGroupResponse = GroupDetail;
|
|
256
|
-
type CreateGroupResponse =
|
|
257
|
-
type
|
|
289
|
+
type CreateGroupResponse = GroupMutationResponse;
|
|
290
|
+
type DuplicateGroupResponse = GroupMutationResponse;
|
|
291
|
+
type UpdateGroupDetailsResponse = GroupMutationResponse;
|
|
258
292
|
type RemoveGroupResponse = OkResponse;
|
|
259
293
|
type ReorderGroupResponse = unknown;
|
|
260
|
-
type MarkGroupSharedResponse =
|
|
261
|
-
type RevokeGroupSharedResponse =
|
|
294
|
+
type MarkGroupSharedResponse = GroupMutationResponse;
|
|
295
|
+
type RevokeGroupSharedResponse = GroupMutationResponse;
|
|
262
296
|
|
|
263
297
|
type RequestFn$1 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
264
|
-
type GetGroupsQuery = PaginatedQuery
|
|
298
|
+
type GetGroupsQuery = PaginatedQuery<{
|
|
299
|
+
/**
|
|
300
|
+
* When truthy (`true`, `1`, or `"1"`), each group includes its full `lists`
|
|
301
|
+
* array with hydrated items. Sent to the API as `includeLists=1`.
|
|
302
|
+
*/
|
|
303
|
+
includeLists?: boolean | 1 | "1";
|
|
304
|
+
}>;
|
|
265
305
|
type GetGroupQuery = PaginatedQuery;
|
|
266
306
|
declare function createGroupsResource(request: RequestFn$1): {
|
|
267
307
|
/** Fetch groups for the authenticated customer. */
|
|
@@ -269,17 +309,22 @@ declare function createGroupsResource(request: RequestFn$1): {
|
|
|
269
309
|
/** Fetch group details by id. */
|
|
270
310
|
getById: (groupId: string, query?: GetGroupQuery) => Promise<GroupDetail>;
|
|
271
311
|
/** Create a new group. */
|
|
272
|
-
create: (body: CreateGroupBody) => Promise<
|
|
312
|
+
create: (body: CreateGroupBody) => Promise<GroupMutationResponse>;
|
|
273
313
|
/** Update group name/description. */
|
|
274
|
-
update: (groupId: string, body: UpdateGroupBody) => Promise<
|
|
314
|
+
update: (groupId: string, body: UpdateGroupBody) => Promise<GroupMutationResponse>;
|
|
275
315
|
/** Remove a group. */
|
|
276
316
|
remove: (groupId: string) => Promise<OkResponse>;
|
|
317
|
+
/**
|
|
318
|
+
* Duplicate a group (including all lists and items) in a single call.
|
|
319
|
+
* The copy is named `Copy of {original name}` and is not shared.
|
|
320
|
+
*/
|
|
321
|
+
duplicate: (groupId: string) => Promise<GroupMutationResponse>;
|
|
277
322
|
/** Reorder a group (spec uses listIds payload). */
|
|
278
323
|
reorder: (groupId: string, body: ReorderGroupBody) => Promise<unknown>;
|
|
279
324
|
/** Mark group as shared (public read-only). */
|
|
280
|
-
share: (groupId: string) => Promise<
|
|
325
|
+
share: (groupId: string) => Promise<GroupMutationResponse>;
|
|
281
326
|
/** Revoke group sharing. */
|
|
282
|
-
unshare: (groupId: string) => Promise<
|
|
327
|
+
unshare: (groupId: string) => Promise<GroupMutationResponse>;
|
|
283
328
|
};
|
|
284
329
|
|
|
285
330
|
type RequestFn = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
@@ -365,4 +410,4 @@ declare class WishlistStackApiError<TBody = unknown> extends Error {
|
|
|
365
410
|
*/
|
|
366
411
|
declare function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown>;
|
|
367
412
|
|
|
368
|
-
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 FeaturedItem, type GetGroupResponse, type GetGroupsResponse, type GetListResponse, type GetListsResponse, type GetSharedGroupResponse, type GetSharedListResponse, type GroupDetail, type GroupDetailList, type GroupSummary, type HydratedProduct, type HydratedVariant, type HydratedWishlistItem, type Id, type Image, type ListDetail, 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, type SelectedOption, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, createWishlistStackClient, isWishlistStackApiError, withPagination };
|
|
413
|
+
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 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, type SelectedOption, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, createWishlistStackClient, isWishlistStackApiError, withPagination };
|
package/dist/index.d.ts
CHANGED
|
@@ -154,8 +154,10 @@ type GetListsResponse = {
|
|
|
154
154
|
};
|
|
155
155
|
/** GET `/api/lists/:listId` */
|
|
156
156
|
type GetListResponse = ListDetail;
|
|
157
|
-
type
|
|
158
|
-
type
|
|
157
|
+
type ListMutationResponse = Omit<ListSummary, "featuredProducts">;
|
|
158
|
+
type CreateListResponse = ListMutationResponse;
|
|
159
|
+
type DuplicateListResponse = ListMutationResponse;
|
|
160
|
+
type UpdateListDetailsResponse = ListMutationResponse;
|
|
159
161
|
type RemoveListResponse = OkResponse;
|
|
160
162
|
type AddItemsToListResponse = unknown;
|
|
161
163
|
type UpdateListItemResponse = unknown;
|
|
@@ -166,8 +168,8 @@ type ReorderListItemsResponse = {
|
|
|
166
168
|
position: number;
|
|
167
169
|
}>;
|
|
168
170
|
};
|
|
169
|
-
type MarkListSharedResponse =
|
|
170
|
-
type RevokeListSharedResponse =
|
|
171
|
+
type MarkListSharedResponse = ListMutationResponse;
|
|
172
|
+
type RevokeListSharedResponse = ListMutationResponse;
|
|
171
173
|
|
|
172
174
|
type RequestFn$2 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
173
175
|
type GetListsQuery = PaginatedQuery;
|
|
@@ -178,11 +180,17 @@ declare function createListsResource(request: RequestFn$2): {
|
|
|
178
180
|
/** Fetch list details by id. */
|
|
179
181
|
getById: (listId: string, query?: GetListQuery) => Promise<ListDetail>;
|
|
180
182
|
/** Create a new list. */
|
|
181
|
-
create: (body: CreateListBody) => Promise<
|
|
183
|
+
create: (body: CreateListBody) => Promise<ListMutationResponse>;
|
|
182
184
|
/** Update list name/description. */
|
|
183
|
-
update: (listId: string, body: UpdateListBody) => Promise<
|
|
185
|
+
update: (listId: string, body: UpdateListBody) => Promise<ListMutationResponse>;
|
|
184
186
|
/** Remove a list. */
|
|
185
187
|
remove: (listId: string) => Promise<OkResponse>;
|
|
188
|
+
/**
|
|
189
|
+
* Duplicate a list (including all items) in a single call.
|
|
190
|
+
* The copy stays in the same group (if any), is named `Copy of {original name}`,
|
|
191
|
+
* and is not shared.
|
|
192
|
+
*/
|
|
193
|
+
duplicate: (listId: string) => Promise<ListMutationResponse>;
|
|
186
194
|
/** Add one or more items to a list. */
|
|
187
195
|
addItems: (listId: string, body: AddItemsToListBody) => Promise<unknown>;
|
|
188
196
|
/** Update an item on a list. */
|
|
@@ -192,9 +200,9 @@ declare function createListsResource(request: RequestFn$2): {
|
|
|
192
200
|
/** Reorder all items in a list. */
|
|
193
201
|
reorderItems: (listId: string, body: ReorderListItemsBody) => Promise<ReorderListItemsResponse>;
|
|
194
202
|
/** Mark list as shared (public read-only). */
|
|
195
|
-
share: (listId: string) => Promise<
|
|
203
|
+
share: (listId: string) => Promise<ListMutationResponse>;
|
|
196
204
|
/** Revoke list sharing. */
|
|
197
|
-
unshare: (listId: string) => Promise<
|
|
205
|
+
unshare: (listId: string) => Promise<ListMutationResponse>;
|
|
198
206
|
/**
|
|
199
207
|
* Legacy endpoint kept in the OpenAPI spec (`/api/wishlists/{id}/add`).
|
|
200
208
|
* Prefer `addItems(listId, body)` unless your server only supports the legacy route.
|
|
@@ -214,6 +222,19 @@ type ReorderGroupBody = {
|
|
|
214
222
|
listIds?: string[];
|
|
215
223
|
};
|
|
216
224
|
|
|
225
|
+
/**
|
|
226
|
+
* List embedded on a group when `includeLists=1` is passed to `groups.getAll()`.
|
|
227
|
+
* Items are fully hydrated (same shape as `lists.getById`).
|
|
228
|
+
*/
|
|
229
|
+
type GroupSummaryList = {
|
|
230
|
+
id: string;
|
|
231
|
+
name: string;
|
|
232
|
+
description: string | null;
|
|
233
|
+
position: number;
|
|
234
|
+
shared: boolean;
|
|
235
|
+
itemCount: number;
|
|
236
|
+
items: HydratedWishlistItem[];
|
|
237
|
+
};
|
|
217
238
|
type GroupSummary = {
|
|
218
239
|
id: string;
|
|
219
240
|
name: string;
|
|
@@ -221,6 +242,8 @@ type GroupSummary = {
|
|
|
221
242
|
position: number;
|
|
222
243
|
shared: boolean;
|
|
223
244
|
listCount: number;
|
|
245
|
+
/** Empty unless `includeLists=1` was requested. */
|
|
246
|
+
lists: GroupSummaryList[];
|
|
224
247
|
featuredItems: FeaturedItem[];
|
|
225
248
|
createdAt: string;
|
|
226
249
|
updatedAt: string;
|
|
@@ -252,16 +275,33 @@ type GroupDetail = {
|
|
|
252
275
|
lists: GroupDetailList[];
|
|
253
276
|
pagination: Pagination;
|
|
254
277
|
};
|
|
278
|
+
type GroupMutationResponse = {
|
|
279
|
+
id: string;
|
|
280
|
+
name: string;
|
|
281
|
+
description: string | null;
|
|
282
|
+
position: number;
|
|
283
|
+
shared: boolean;
|
|
284
|
+
listCount: number;
|
|
285
|
+
createdAt: string;
|
|
286
|
+
updatedAt: string;
|
|
287
|
+
};
|
|
255
288
|
type GetGroupResponse = GroupDetail;
|
|
256
|
-
type CreateGroupResponse =
|
|
257
|
-
type
|
|
289
|
+
type CreateGroupResponse = GroupMutationResponse;
|
|
290
|
+
type DuplicateGroupResponse = GroupMutationResponse;
|
|
291
|
+
type UpdateGroupDetailsResponse = GroupMutationResponse;
|
|
258
292
|
type RemoveGroupResponse = OkResponse;
|
|
259
293
|
type ReorderGroupResponse = unknown;
|
|
260
|
-
type MarkGroupSharedResponse =
|
|
261
|
-
type RevokeGroupSharedResponse =
|
|
294
|
+
type MarkGroupSharedResponse = GroupMutationResponse;
|
|
295
|
+
type RevokeGroupSharedResponse = GroupMutationResponse;
|
|
262
296
|
|
|
263
297
|
type RequestFn$1 = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
264
|
-
type GetGroupsQuery = PaginatedQuery
|
|
298
|
+
type GetGroupsQuery = PaginatedQuery<{
|
|
299
|
+
/**
|
|
300
|
+
* When truthy (`true`, `1`, or `"1"`), each group includes its full `lists`
|
|
301
|
+
* array with hydrated items. Sent to the API as `includeLists=1`.
|
|
302
|
+
*/
|
|
303
|
+
includeLists?: boolean | 1 | "1";
|
|
304
|
+
}>;
|
|
265
305
|
type GetGroupQuery = PaginatedQuery;
|
|
266
306
|
declare function createGroupsResource(request: RequestFn$1): {
|
|
267
307
|
/** Fetch groups for the authenticated customer. */
|
|
@@ -269,17 +309,22 @@ declare function createGroupsResource(request: RequestFn$1): {
|
|
|
269
309
|
/** Fetch group details by id. */
|
|
270
310
|
getById: (groupId: string, query?: GetGroupQuery) => Promise<GroupDetail>;
|
|
271
311
|
/** Create a new group. */
|
|
272
|
-
create: (body: CreateGroupBody) => Promise<
|
|
312
|
+
create: (body: CreateGroupBody) => Promise<GroupMutationResponse>;
|
|
273
313
|
/** Update group name/description. */
|
|
274
|
-
update: (groupId: string, body: UpdateGroupBody) => Promise<
|
|
314
|
+
update: (groupId: string, body: UpdateGroupBody) => Promise<GroupMutationResponse>;
|
|
275
315
|
/** Remove a group. */
|
|
276
316
|
remove: (groupId: string) => Promise<OkResponse>;
|
|
317
|
+
/**
|
|
318
|
+
* Duplicate a group (including all lists and items) in a single call.
|
|
319
|
+
* The copy is named `Copy of {original name}` and is not shared.
|
|
320
|
+
*/
|
|
321
|
+
duplicate: (groupId: string) => Promise<GroupMutationResponse>;
|
|
277
322
|
/** Reorder a group (spec uses listIds payload). */
|
|
278
323
|
reorder: (groupId: string, body: ReorderGroupBody) => Promise<unknown>;
|
|
279
324
|
/** Mark group as shared (public read-only). */
|
|
280
|
-
share: (groupId: string) => Promise<
|
|
325
|
+
share: (groupId: string) => Promise<GroupMutationResponse>;
|
|
281
326
|
/** Revoke group sharing. */
|
|
282
|
-
unshare: (groupId: string) => Promise<
|
|
327
|
+
unshare: (groupId: string) => Promise<GroupMutationResponse>;
|
|
283
328
|
};
|
|
284
329
|
|
|
285
330
|
type RequestFn = <TResponse = unknown, TBody = unknown>(args: RequestArgs<TBody>) => Promise<TResponse>;
|
|
@@ -365,4 +410,4 @@ declare class WishlistStackApiError<TBody = unknown> extends Error {
|
|
|
365
410
|
*/
|
|
366
411
|
declare function isWishlistStackApiError(value: unknown): value is WishlistStackApiError<unknown>;
|
|
367
412
|
|
|
368
|
-
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 FeaturedItem, type GetGroupResponse, type GetGroupsResponse, type GetListResponse, type GetListsResponse, type GetSharedGroupResponse, type GetSharedListResponse, type GroupDetail, type GroupDetailList, type GroupSummary, type HydratedProduct, type HydratedVariant, type HydratedWishlistItem, type Id, type Image, type ListDetail, 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, type SelectedOption, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, createWishlistStackClient, isWishlistStackApiError, withPagination };
|
|
413
|
+
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 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, type SelectedOption, type UpdateGroupBody, type UpdateGroupDetailsResponse, type UpdateListBody, type UpdateListDetailsResponse, type UpdateListItemBody, type UpdateListItemResponse, WishlistStackApiError, type WishlistStackClient$1 as WishlistStackClient, WishlistStackClient as WishlistStackSDK, createWishlistStackClient, isWishlistStackApiError, withPagination };
|
package/dist/index.js
CHANGED
|
@@ -175,6 +175,16 @@ function createListsResource(request) {
|
|
|
175
175
|
path: `/api/lists/${encodeURIComponent(listId)}`,
|
|
176
176
|
auth: "authenticated"
|
|
177
177
|
}),
|
|
178
|
+
/**
|
|
179
|
+
* Duplicate a list (including all items) in a single call.
|
|
180
|
+
* The copy stays in the same group (if any), is named `Copy of {original name}`,
|
|
181
|
+
* and is not shared.
|
|
182
|
+
*/
|
|
183
|
+
duplicate: (listId) => request({
|
|
184
|
+
method: "POST",
|
|
185
|
+
path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,
|
|
186
|
+
auth: "authenticated"
|
|
187
|
+
}),
|
|
178
188
|
/** Add one or more items to a list. */
|
|
179
189
|
addItems: (listId, body) => request({
|
|
180
190
|
method: "POST",
|
|
@@ -228,6 +238,14 @@ function createListsResource(request) {
|
|
|
228
238
|
}
|
|
229
239
|
|
|
230
240
|
// src/resources/groups/index.ts
|
|
241
|
+
function normalizeGetGroupsQuery(query) {
|
|
242
|
+
if (!query) return void 0;
|
|
243
|
+
const { includeLists, ...rest } = query;
|
|
244
|
+
if (includeLists) {
|
|
245
|
+
return { ...rest, includeLists: 1 };
|
|
246
|
+
}
|
|
247
|
+
return Object.keys(rest).length > 0 ? rest : void 0;
|
|
248
|
+
}
|
|
231
249
|
function createGroupsResource(request) {
|
|
232
250
|
return {
|
|
233
251
|
/** Fetch groups for the authenticated customer. */
|
|
@@ -235,7 +253,7 @@ function createGroupsResource(request) {
|
|
|
235
253
|
method: "GET",
|
|
236
254
|
path: "/api/groups",
|
|
237
255
|
auth: "authenticated",
|
|
238
|
-
query
|
|
256
|
+
query: normalizeGetGroupsQuery(query)
|
|
239
257
|
}),
|
|
240
258
|
/** Fetch group details by id. */
|
|
241
259
|
getById: (groupId, query) => request({
|
|
@@ -264,6 +282,15 @@ function createGroupsResource(request) {
|
|
|
264
282
|
path: `/api/groups/${encodeURIComponent(groupId)}`,
|
|
265
283
|
auth: "authenticated"
|
|
266
284
|
}),
|
|
285
|
+
/**
|
|
286
|
+
* Duplicate a group (including all lists and items) in a single call.
|
|
287
|
+
* The copy is named `Copy of {original name}` and is not shared.
|
|
288
|
+
*/
|
|
289
|
+
duplicate: (groupId) => request({
|
|
290
|
+
method: "POST",
|
|
291
|
+
path: `/api/groups/${encodeURIComponent(groupId)}/duplicate`,
|
|
292
|
+
auth: "authenticated"
|
|
293
|
+
}),
|
|
267
294
|
/** Reorder a group (spec uses listIds payload). */
|
|
268
295
|
reorder: (groupId, body) => request({
|
|
269
296
|
method: "POST",
|
package/dist/index.js.map
CHANGED
|
@@ -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.js","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 ReorderListItemsBody,\n UpdateListBody,\n UpdateListItemBody,\n} from \"../../types/requests/lists\";\nimport type {\n AddItemsToListResponse,\n CreateListResponse,\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 /** 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 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;\nexport type GetGroupQuery = PaginatedQuery;\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,\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 /** 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\n","import type { RequestArgs } from \"../../client/request\";\nimport type { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\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) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\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\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 & 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"]}
|
|
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.js","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 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 * The copy stays in the same group (if any), is named `Copy of {original name}`,\n * and is not shared.\n */\n duplicate: (listId: string) =>\n request<DuplicateListResponse>({\n method: \"POST\",\n path: `/api/lists/${encodeURIComponent(listId)}/duplicate`,\n auth: \"authenticated\",\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 { GetSharedGroupResponse, GetSharedListResponse } from \"../../types/responses/shared\";\n\ntype RequestFn = <TResponse = unknown, TBody = unknown>(\n args: RequestArgs<TBody>,\n) => Promise<TResponse>;\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) =>\n request<GetSharedListResponse>({\n method: \"GET\",\n path: `/api/shared/list/${encodeURIComponent(listId)}`,\n auth: \"merchant\",\n }),\n\n /** Public read-only view of a shared group. Requires only merchant apiKey. */\n getSharedGroup: (groupId: string) =>\n request<GetSharedGroupResponse>({\n method: \"GET\",\n path: `/api/shared/group/${encodeURIComponent(groupId)}`,\n auth: \"merchant\",\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\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 & 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sdg.la/wishlist-stack-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "TypeScript SDK for the Wishlist Stack API",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"files": [
|
|
22
|
-
"dist"
|
|
22
|
+
"dist",
|
|
23
|
+
"AUTH_EXAMPLE.md"
|
|
23
24
|
],
|
|
24
25
|
"sideEffects": false,
|
|
25
26
|
"scripts": {
|