sound-tank 2.0.0 → 2.1.1
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/CHANGELOG.md +14 -0
- package/dist/index.d.mts +11 -14
- package/dist/index.d.ts +11 -14
- package/dist/index.js +138 -85
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +136 -83
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# sound-tank
|
|
2
2
|
|
|
3
|
+
## 2.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8563389: Add `throttle` option to `PaginationOptions` (`delayMs`, `everyNPages`) to prevent 429 rate-limit errors on large fetches. `getAllMyListings()` and `streamAllMyListings()` now pause 5s every 5 pages by default.
|
|
8
|
+
|
|
9
|
+
## 2.1.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- f3a8df0: Add `streamAllMy()` to `ListingsResource` and `streamAllMyListings()` method. Returns an `AsyncGenerator<Listing>` that yields listings one at a time as paginated responses arrive, rather than waiting for all pages to complete.
|
|
14
|
+
|
|
15
|
+
Also adds the underlying `paginateStream<T>()` utility in `pagination.ts` for streaming any paginated endpoint.
|
|
16
|
+
|
|
3
17
|
## 2.0.0
|
|
4
18
|
|
|
5
19
|
### Major Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import { Axios } from 'axios';
|
|
2
|
-
|
|
3
1
|
interface HttpRequestConfig {
|
|
4
|
-
headers?: Record<string, string>;
|
|
2
|
+
headers?: Record<string, string | undefined>;
|
|
5
3
|
params?: Record<string, string | number | boolean | undefined | null>;
|
|
6
4
|
/**
|
|
7
5
|
* Request timeout in milliseconds
|
|
8
6
|
*/
|
|
9
7
|
timeout?: number;
|
|
10
|
-
/**
|
|
11
|
-
* Additional axios-compatible config options
|
|
12
|
-
*/
|
|
13
8
|
[key: string]: any;
|
|
14
9
|
}
|
|
15
10
|
/**
|
|
@@ -463,6 +458,7 @@ declare class ListingsResource {
|
|
|
463
458
|
getOne(options: GetOneListingOptions): Promise<HttpResponse<Listing>>;
|
|
464
459
|
getPhotos(options: GetOneListingOptions): Promise<string[]>;
|
|
465
460
|
getAllMy(options?: GetAllMyListingsOptions): Promise<HttpResponse<Listing[]>>;
|
|
461
|
+
streamAllMy(options?: GetAllMyListingsOptions): AsyncGenerator<Listing, any, any>;
|
|
466
462
|
create(body: ListingPostBody): Promise<HttpResponse<Listing>>;
|
|
467
463
|
}
|
|
468
464
|
|
|
@@ -518,14 +514,15 @@ interface ReverbOptions {
|
|
|
518
514
|
shippingRegion?: ShippingRegion | undefined;
|
|
519
515
|
locale?: Locale | undefined;
|
|
520
516
|
}
|
|
521
|
-
type ReverbHeaders =
|
|
522
|
-
|
|
523
|
-
|
|
517
|
+
type ReverbHeaders = {
|
|
518
|
+
"Content-Type": string;
|
|
519
|
+
"Accept-Version": ApiVersion;
|
|
524
520
|
Accept: string;
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
521
|
+
"Accept-Language": Locale;
|
|
522
|
+
"X-Display-Currency": DisplayCurrency;
|
|
523
|
+
"X-Shipping-Region"?: ShippingRegion | undefined;
|
|
524
|
+
"User-Agent"?: string;
|
|
525
|
+
[key: string]: string | undefined;
|
|
529
526
|
};
|
|
530
527
|
interface AuthReverbHeaders extends ReverbHeaders {
|
|
531
528
|
Authorization: `Bearer ${ApiKey}`;
|
|
@@ -559,7 +556,7 @@ declare class Reverb {
|
|
|
559
556
|
set rootEndpoint(rootEndpoint: RootEndpoint);
|
|
560
557
|
get rootEndpoint(): RootEndpoint;
|
|
561
558
|
get config(): ReverbConfig;
|
|
562
|
-
_getArbitraryEndpoint<T = any>(url: string, params?: GetArbitraryEndpointOptions[
|
|
559
|
+
_getArbitraryEndpoint<T = any>(url: string, params?: GetArbitraryEndpointOptions["params"]): Promise<HttpResponse<T>>;
|
|
563
560
|
}
|
|
564
561
|
|
|
565
562
|
export { type ApiKey, type ApiVersion, type AuthReverbHeaders, type DisplayCurrency, ListingsResource, type Locale, OrdersResource, type ReverbHeaders, type ReverbOptions, type RootEndpoint, type ShippingRegion, Reverb as default };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import { Axios } from 'axios';
|
|
2
|
-
|
|
3
1
|
interface HttpRequestConfig {
|
|
4
|
-
headers?: Record<string, string>;
|
|
2
|
+
headers?: Record<string, string | undefined>;
|
|
5
3
|
params?: Record<string, string | number | boolean | undefined | null>;
|
|
6
4
|
/**
|
|
7
5
|
* Request timeout in milliseconds
|
|
8
6
|
*/
|
|
9
7
|
timeout?: number;
|
|
10
|
-
/**
|
|
11
|
-
* Additional axios-compatible config options
|
|
12
|
-
*/
|
|
13
8
|
[key: string]: any;
|
|
14
9
|
}
|
|
15
10
|
/**
|
|
@@ -463,6 +458,7 @@ declare class ListingsResource {
|
|
|
463
458
|
getOne(options: GetOneListingOptions): Promise<HttpResponse<Listing>>;
|
|
464
459
|
getPhotos(options: GetOneListingOptions): Promise<string[]>;
|
|
465
460
|
getAllMy(options?: GetAllMyListingsOptions): Promise<HttpResponse<Listing[]>>;
|
|
461
|
+
streamAllMy(options?: GetAllMyListingsOptions): AsyncGenerator<Listing, any, any>;
|
|
466
462
|
create(body: ListingPostBody): Promise<HttpResponse<Listing>>;
|
|
467
463
|
}
|
|
468
464
|
|
|
@@ -518,14 +514,15 @@ interface ReverbOptions {
|
|
|
518
514
|
shippingRegion?: ShippingRegion | undefined;
|
|
519
515
|
locale?: Locale | undefined;
|
|
520
516
|
}
|
|
521
|
-
type ReverbHeaders =
|
|
522
|
-
|
|
523
|
-
|
|
517
|
+
type ReverbHeaders = {
|
|
518
|
+
"Content-Type": string;
|
|
519
|
+
"Accept-Version": ApiVersion;
|
|
524
520
|
Accept: string;
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
521
|
+
"Accept-Language": Locale;
|
|
522
|
+
"X-Display-Currency": DisplayCurrency;
|
|
523
|
+
"X-Shipping-Region"?: ShippingRegion | undefined;
|
|
524
|
+
"User-Agent"?: string;
|
|
525
|
+
[key: string]: string | undefined;
|
|
529
526
|
};
|
|
530
527
|
interface AuthReverbHeaders extends ReverbHeaders {
|
|
531
528
|
Authorization: `Bearer ${ApiKey}`;
|
|
@@ -559,7 +556,7 @@ declare class Reverb {
|
|
|
559
556
|
set rootEndpoint(rootEndpoint: RootEndpoint);
|
|
560
557
|
get rootEndpoint(): RootEndpoint;
|
|
561
558
|
get config(): ReverbConfig;
|
|
562
|
-
_getArbitraryEndpoint<T = any>(url: string, params?: GetArbitraryEndpointOptions[
|
|
559
|
+
_getArbitraryEndpoint<T = any>(url: string, params?: GetArbitraryEndpointOptions["params"]): Promise<HttpResponse<T>>;
|
|
563
560
|
}
|
|
564
561
|
|
|
565
562
|
export { type ApiKey, type ApiVersion, type AuthReverbHeaders, type DisplayCurrency, ListingsResource, type Locale, OrdersResource, type ReverbHeaders, type ReverbOptions, type RootEndpoint, type ShippingRegion, Reverb as default };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
4
|
// src/config/ReverbConfig.ts
|
|
@@ -15,9 +15,6 @@ function createReverbConfig(params) {
|
|
|
15
15
|
}
|
|
16
16
|
__name(createReverbConfig, "createReverbConfig");
|
|
17
17
|
|
|
18
|
-
// src/http/AxiosHttpClient.ts
|
|
19
|
-
var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios);
|
|
20
|
-
|
|
21
18
|
// src/utils/logger.ts
|
|
22
19
|
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
23
20
|
LogLevel2["ERROR"] = "0";
|
|
@@ -134,95 +131,88 @@ var _Logger = class _Logger {
|
|
|
134
131
|
__name(_Logger, "Logger");
|
|
135
132
|
var Logger = _Logger;
|
|
136
133
|
|
|
137
|
-
// src/http/
|
|
138
|
-
var
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
134
|
+
// src/http/FetchHttpClient.ts
|
|
135
|
+
var _FetchHttpClient = class _FetchHttpClient {
|
|
136
|
+
async request(method, url, data, config) {
|
|
137
|
+
const { headers, params, timeout } = _nullishCoalesce(config, () => ( {}));
|
|
138
|
+
let fullUrl = url;
|
|
139
|
+
if (params) {
|
|
140
|
+
const query = Object.entries(params).filter(([, v]) => v != null).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`).join("&");
|
|
141
|
+
if (query) fullUrl += (url.includes("?") ? "&" : "?") + query;
|
|
142
|
+
}
|
|
143
|
+
let controller;
|
|
144
|
+
let timeoutId;
|
|
145
|
+
if (timeout) {
|
|
146
|
+
controller = new AbortController();
|
|
147
|
+
timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const resolvedHeaders = headers ? Object.fromEntries(
|
|
151
|
+
Object.entries(headers).filter(([, v]) => v !== void 0)
|
|
152
|
+
) : void 0;
|
|
153
|
+
const init = {
|
|
154
|
+
method,
|
|
155
|
+
headers: resolvedHeaders,
|
|
156
|
+
signal: _optionalChain([controller, 'optionalAccess', _2 => _2.signal])
|
|
157
|
+
};
|
|
158
|
+
if (data !== void 0) {
|
|
159
|
+
init.body = JSON.stringify(data);
|
|
160
|
+
}
|
|
161
|
+
const res = await fetch(fullUrl, init);
|
|
162
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
163
|
+
const responseHeaders = {};
|
|
164
|
+
res.headers.forEach((value, key) => {
|
|
165
|
+
responseHeaders[key] = value;
|
|
166
|
+
});
|
|
167
|
+
const contentType = _nullishCoalesce(res.headers.get("content-type"), () => ( ""));
|
|
168
|
+
const responseData = contentType.includes("json") ? await res.json() : await res.text();
|
|
169
|
+
if (!res.ok) {
|
|
170
|
+
const err = new Error(`HTTP ${res.status}: ${res.statusText}`);
|
|
171
|
+
err.status = res.status;
|
|
172
|
+
err.response = {
|
|
173
|
+
data: responseData,
|
|
174
|
+
status: res.status,
|
|
175
|
+
statusText: res.statusText,
|
|
176
|
+
headers: responseHeaders,
|
|
177
|
+
config: _nullishCoalesce(config, () => ( {}))
|
|
178
|
+
};
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
data: responseData,
|
|
183
|
+
status: res.status,
|
|
184
|
+
statusText: res.statusText,
|
|
185
|
+
headers: responseHeaders,
|
|
186
|
+
config: _nullishCoalesce(config, () => ( {}))
|
|
187
|
+
};
|
|
188
|
+
} catch (err) {
|
|
189
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
166
192
|
}
|
|
167
193
|
async get(url, config) {
|
|
168
|
-
const response = await this.axiosInstance.get(url, config);
|
|
169
194
|
Logger.trace("GET request to %s with config: %o", url, config);
|
|
170
|
-
return this.
|
|
195
|
+
return this.request("GET", url, void 0, config);
|
|
171
196
|
}
|
|
172
197
|
async post(url, data, config) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
"POST request to %s with data: %o and config: %o",
|
|
176
|
-
url,
|
|
177
|
-
data,
|
|
178
|
-
config
|
|
179
|
-
);
|
|
180
|
-
return this.convertResponse(response);
|
|
198
|
+
Logger.trace("POST request to %s with data: %o and config: %o", url, data, config);
|
|
199
|
+
return this.request("POST", url, data, config);
|
|
181
200
|
}
|
|
182
201
|
async put(url, data, config) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
"PUT request to %s with data: %o and config: %o",
|
|
186
|
-
url,
|
|
187
|
-
data,
|
|
188
|
-
config
|
|
189
|
-
);
|
|
190
|
-
return this.convertResponse(response);
|
|
202
|
+
Logger.trace("PUT request to %s with data: %o and config: %o", url, data, config);
|
|
203
|
+
return this.request("PUT", url, data, config);
|
|
191
204
|
}
|
|
192
205
|
async delete(url, config) {
|
|
193
|
-
const response = await this.axiosInstance.delete(url, config);
|
|
194
206
|
Logger.trace("DELETE request to %s with config: %o", url, config);
|
|
195
|
-
return this.
|
|
207
|
+
return this.request("DELETE", url, void 0, config);
|
|
196
208
|
}
|
|
197
209
|
async patch(url, data, config) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
"PATCH request to %s with data: %o and config: %o",
|
|
201
|
-
url,
|
|
202
|
-
data,
|
|
203
|
-
config
|
|
204
|
-
);
|
|
205
|
-
return this.convertResponse(response);
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Useful for advanced axios features like interceptors.
|
|
209
|
-
*
|
|
210
|
-
* @example
|
|
211
|
-
* ```ts
|
|
212
|
-
* const client = new AxiosHttpClient();
|
|
213
|
-
* const axios = client.getAxiosInstance();
|
|
214
|
-
* axios.interceptors.request.use(config => {
|
|
215
|
-
* console.log('Request:', config);
|
|
216
|
-
* return config;
|
|
217
|
-
* });
|
|
218
|
-
* ```
|
|
219
|
-
*/
|
|
220
|
-
getAxiosInstance() {
|
|
221
|
-
return this.axiosInstance;
|
|
210
|
+
Logger.trace("PATCH request to %s with data: %o and config: %o", url, data, config);
|
|
211
|
+
return this.request("PATCH", url, data, config);
|
|
222
212
|
}
|
|
223
213
|
};
|
|
224
|
-
__name(
|
|
225
|
-
var
|
|
214
|
+
__name(_FetchHttpClient, "FetchHttpClient");
|
|
215
|
+
var FetchHttpClient = _FetchHttpClient;
|
|
226
216
|
|
|
227
217
|
// src/utils/urlBuilder.ts
|
|
228
218
|
function buildUrl(baseUrl, path) {
|
|
@@ -270,7 +260,8 @@ async function paginateAll(fetchPage, options = {}) {
|
|
|
270
260
|
const {
|
|
271
261
|
perPage = 50,
|
|
272
262
|
startPage = 1,
|
|
273
|
-
maxPages = Number.MAX_SAFE_INTEGER
|
|
263
|
+
maxPages = Number.MAX_SAFE_INTEGER,
|
|
264
|
+
throttle
|
|
274
265
|
} = options;
|
|
275
266
|
const allItems = [];
|
|
276
267
|
let currentPage = startPage;
|
|
@@ -291,6 +282,10 @@ async function paginateAll(fetchPage, options = {}) {
|
|
|
291
282
|
}
|
|
292
283
|
currentPage++;
|
|
293
284
|
pagesProcessed++;
|
|
285
|
+
if (throttle && pagesProcessed % throttle.everyNPages === 0) {
|
|
286
|
+
Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
|
|
287
|
+
await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
|
|
288
|
+
}
|
|
294
289
|
}
|
|
295
290
|
Logger.debug(
|
|
296
291
|
"Pagination complete. Total items fetched: %d across %d pages.",
|
|
@@ -300,6 +295,41 @@ async function paginateAll(fetchPage, options = {}) {
|
|
|
300
295
|
return allItems;
|
|
301
296
|
}
|
|
302
297
|
__name(paginateAll, "paginateAll");
|
|
298
|
+
async function* paginateStream(fetchPage, options = {}) {
|
|
299
|
+
const {
|
|
300
|
+
perPage = 50,
|
|
301
|
+
startPage = 1,
|
|
302
|
+
maxPages = Number.MAX_SAFE_INTEGER,
|
|
303
|
+
throttle
|
|
304
|
+
} = options;
|
|
305
|
+
let currentPage = startPage;
|
|
306
|
+
let pagesProcessed = 0;
|
|
307
|
+
while (pagesProcessed < maxPages) {
|
|
308
|
+
const result = await fetchPage(currentPage, perPage);
|
|
309
|
+
if (result.items.length > 0) {
|
|
310
|
+
yield result.items;
|
|
311
|
+
}
|
|
312
|
+
if (!result.hasMore || result.items.length === 0) {
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
if (result.items.length < perPage) {
|
|
316
|
+
Logger.debug(
|
|
317
|
+
"Received fewer items than perPage (%d < %d), assuming last page reached.",
|
|
318
|
+
result.items.length,
|
|
319
|
+
perPage
|
|
320
|
+
);
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
currentPage++;
|
|
324
|
+
pagesProcessed++;
|
|
325
|
+
if (throttle && pagesProcessed % throttle.everyNPages === 0) {
|
|
326
|
+
Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
|
|
327
|
+
await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
Logger.debug("Stream pagination complete after %d pages.", pagesProcessed + 1);
|
|
331
|
+
}
|
|
332
|
+
__name(paginateStream, "paginateStream");
|
|
303
333
|
function createPaginatedResult(items, perPage, currentPage) {
|
|
304
334
|
return {
|
|
305
335
|
items,
|
|
@@ -335,7 +365,7 @@ var getAllMyListings = /* @__PURE__ */ __name(async (client, config, options) =>
|
|
|
335
365
|
});
|
|
336
366
|
return createPaginatedResult(response.data.listings || [], perPage, page);
|
|
337
367
|
},
|
|
338
|
-
{ perPage: 50 }
|
|
368
|
+
{ perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
|
|
339
369
|
);
|
|
340
370
|
return {
|
|
341
371
|
data: allListings,
|
|
@@ -345,6 +375,27 @@ var getAllMyListings = /* @__PURE__ */ __name(async (client, config, options) =>
|
|
|
345
375
|
config: {}
|
|
346
376
|
};
|
|
347
377
|
}, "getAllMyListings");
|
|
378
|
+
async function* streamAllMyListings(client, config, options) {
|
|
379
|
+
const { query, state } = options;
|
|
380
|
+
const pages = paginateStream(
|
|
381
|
+
async (page, perPage) => {
|
|
382
|
+
const response = await getMyListings(client, config, {
|
|
383
|
+
page,
|
|
384
|
+
perPage,
|
|
385
|
+
query,
|
|
386
|
+
state
|
|
387
|
+
});
|
|
388
|
+
return createPaginatedResult(response.data.listings || [], perPage, page);
|
|
389
|
+
},
|
|
390
|
+
{ perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
|
|
391
|
+
);
|
|
392
|
+
for await (const page of pages) {
|
|
393
|
+
for (const listing of page) {
|
|
394
|
+
yield listing;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
__name(streamAllMyListings, "streamAllMyListings");
|
|
348
399
|
var getOneListing = /* @__PURE__ */ __name(async (client, config, options) => {
|
|
349
400
|
const { id } = options;
|
|
350
401
|
const url = buildUrl(config.rootEndpoint, `/listings/${id}`);
|
|
@@ -379,12 +430,15 @@ var _ListingsResource = class _ListingsResource {
|
|
|
379
430
|
this.getConfig(),
|
|
380
431
|
options
|
|
381
432
|
);
|
|
382
|
-
const photos = _optionalChain([response, 'access',
|
|
433
|
+
const photos = _optionalChain([response, 'access', _3 => _3.data, 'optionalAccess', _4 => _4.photos, 'optionalAccess', _5 => _5.map, 'call', _6 => _6((photo) => photo._links.full.href)]) || [];
|
|
383
434
|
return photos;
|
|
384
435
|
}
|
|
385
436
|
getAllMy(options = {}) {
|
|
386
437
|
return getAllMyListings(this.getClient(), this.getConfig(), options);
|
|
387
438
|
}
|
|
439
|
+
streamAllMy(options = {}) {
|
|
440
|
+
return streamAllMyListings(this.getClient(), this.getConfig(), options);
|
|
441
|
+
}
|
|
388
442
|
create(body) {
|
|
389
443
|
return postListing(this.getClient(), this.getConfig(), body);
|
|
390
444
|
}
|
|
@@ -494,7 +548,7 @@ var _Reverb = class _Reverb {
|
|
|
494
548
|
..._Reverb.defaultHeaders,
|
|
495
549
|
Authorization: `Bearer ${this.apiKey}`
|
|
496
550
|
};
|
|
497
|
-
this._httpClient = new
|
|
551
|
+
this._httpClient = new FetchHttpClient();
|
|
498
552
|
this.updateHeaders();
|
|
499
553
|
this._updateConfig();
|
|
500
554
|
this.listings = new ListingsResource(
|
|
@@ -513,8 +567,7 @@ var _Reverb = class _Reverb {
|
|
|
513
567
|
}
|
|
514
568
|
updateHeaders() {
|
|
515
569
|
const optionalHeaders = {};
|
|
516
|
-
if (this._shippingRegion)
|
|
517
|
-
optionalHeaders["X-Shipping-Region"] = this._shippingRegion;
|
|
570
|
+
if (this._shippingRegion) optionalHeaders["X-Shipping-Region"] = this._shippingRegion;
|
|
518
571
|
Logger.debug(
|
|
519
572
|
"Updating headers with API key and config values. Shipping region included: %s",
|
|
520
573
|
!!this._shippingRegion
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/sound-tank/sound-tank/dist/index.js","../src/config/ReverbConfig.ts","../src/http/AxiosHttpClient.ts","../src/utils/logger.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"names":["LogLevel"],"mappings":"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","file":"/home/runner/work/sound-tank/sound-tank/dist/index.js","sourcesContent":[null,"import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class AxiosHttpClient implements HttpClient {\n private axiosInstance: AxiosInstance;\n\n /**\n * @example\n * ```ts\n * // Using default axios\n * const client = new AxiosHttpClient();\n *\n * // Using custom axios instance\n * const customAxios = axios.create({ baseURL: 'https://api.example.com' });\n * const client = new AxiosHttpClient(customAxios);\n * ```\n */\n constructor(axiosInstance?: AxiosInstance) {\n this.axiosInstance = axiosInstance || axios;\n }\n\n /**\n * Converts an AxiosResponse to HttpResponse.\n * In practice, they're compatible, but this ensures type safety.\n */\n private convertResponse<T>(response: AxiosResponse<T>): HttpResponse<T> {\n return {\n data: response.data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Record<string, string>,\n config: response.config as HttpRequestConfig,\n request: response.request,\n };\n }\n\n async get<T = any>(\n url: string,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.get<T>(url, config);\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.convertResponse(response);\n }\n\n async post<T = any>(\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.post<T>(url, data, config);\n Logger.trace(\n 'POST request to %s with data: %o and config: %o',\n url,\n data,\n config,\n );\n return this.convertResponse(response);\n }\n\n async put<T = any>(\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.put<T>(url, data, config);\n Logger.trace(\n 'PUT request to %s with data: %o and config: %o',\n url,\n data,\n config,\n );\n return this.convertResponse(response);\n }\n\n async delete<T = any>(\n url: string,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.delete<T>(url, config);\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.convertResponse(response);\n }\n\n async patch<T = any>(\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.patch<T>(url, data, config);\n Logger.trace(\n 'PATCH request to %s with data: %o and config: %o',\n url,\n data,\n config,\n );\n return this.convertResponse(response);\n }\n\n /**\n * Useful for advanced axios features like interceptors.\n *\n * @example\n * ```ts\n * const client = new AxiosHttpClient();\n * const axios = client.getAxiosInstance();\n * axios.interceptors.request.use(config => {\n * console.log('Request:', config);\n * return config;\n * });\n * ```\n */\n getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\n/**\n * Generic pagination helper that fetches all items across multiple pages.\n *\n * @param fetchPage - Function that fetches a single page of results\n * @param options - Pagination configuration options\n * @returns Promise resolving to all items across all pages\n *\n * @example\n * ```ts\n * const allListings = await paginateAll(\n * async (page, perPage) => {\n * const response = await getMyListings({ page, perPage });\n * return {\n * items: response.data.listings,\n * hasMore: response.data.listings.length === perPage,\n * currentPage: page\n * };\n * },\n * { perPage: 50 }\n * );\n * ```\n */\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n // Stop if we got fewer items than requested (indicates last page)\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\n/**\n * Helper to create a PaginatedFetchResult from common API response patterns.\n * Useful when your API returns the count of items in a response.\n *\n * @param items - Array of items from the current page\n * @param perPage - Number of items requested per page\n * @param currentPage - Current page number\n * @returns PaginatedFetchResult\n *\n * @example\n * ```ts\n * return createPaginatedResult(response.data.listings, 50, page);\n * ```\n */\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50 },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { Axios } from 'axios';\nimport { ReverbConfig, createReverbConfig } from './config/ReverbConfig';\nimport { AxiosHttpClient, HttpClient } from './http';\nimport { ListingsResource } from './resources/ListingsResource';\nimport { OrdersResource } from './resources/OrdersResource';\nimport { NegotiationsResource } from './resources/NegotiationsResource';\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from './methods';\nimport Logger from './utils/logger';\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = Axios['get']['arguments'][1] & {\n 'Content-Type': string;\n 'Accept-Version': ApiVersion;\n Accept: string;\n 'Accept-Language': Locale;\n 'X-Display-Currency': DisplayCurrency;\n 'X-Shipping-Region'?: ShippingRegion | undefined;\n 'User-Agent'?: string;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n 'Content-Type': 'application/hal+json',\n 'Accept-Version': '3.0',\n Accept: 'application/hal+json',\n 'Accept-Language': 'en',\n 'X-Display-Currency': 'USD',\n 'User-Agent': 'Reverb Node SDK',\n };\n\n private _rootEndpoint: RootEndpoint = 'https://api.reverb.com/api';\n private _version: ApiVersion = Reverb.defaultHeaders['Accept-Version'];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency =\n Reverb.defaultHeaders['X-Display-Currency'];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders['Accept-Language'];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === '') {\n throw new Error('Reverb: apiKey is required');\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new AxiosHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\t\t\n Logger.trace('Reverb client initialized with config: %o', this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion)\n optionalHeaders['X-Shipping-Region'] = this._shippingRegion;\n\n Logger.debug(\n 'Updating headers with API key and config values. Shipping region included: %s',\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n 'Accept-Version': this._version,\n 'X-Display-Currency': this._displayCurrency,\n 'Accept-Language': this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n 'Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s',\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug('Setting locale to: %s', locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug('Setting shipping region to: %s', shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug('Setting display currency to: %s', displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug('Setting API version to: %s', version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug('Setting root endpoint to: %s', rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions['params'],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/sound-tank/sound-tank/dist/index.js","../src/config/ReverbConfig.ts","../src/utils/logger.ts","../src/http/FetchHttpClient.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"names":["LogLevel"],"mappings":"AAAA,qrBAAI,UAAU,EAAE,MAAM,CAAC,cAAc;AACrC,IAAI,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AACxF;AACA;ACiBO,SAAS,kBAAA,CAAmB,MAAA,EAQlB;AACf,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,MAAA,CAAO,YAAA;AAAA,IACrB,MAAA,EAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAA,EAAS,MAAA,CAAO,OAAA;AAAA,IAChB,OAAA,EAAS,MAAA,CAAO,OAAA;AAAA,IAChB,MAAA,EAAQ,MAAA,CAAO,MAAA;AAAA,IACf,eAAA,EAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,cAAA,EAAgB,MAAA,CAAO;AAAA,EACzB,CAAA;AACF;AAlBgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;ADJhB;AACA;AEjBO,IAAK,SAAA,kBAAL,CAAA,CAAKA,SAAAA,EAAAA,GAAL;AACL,EAAAA,SAAAA,CAAA,OAAA,EAAA,EAAQ,GAAA;AACR,EAAAA,SAAAA,CAAA,MAAA,EAAA,EAAO,GAAA;AACP,EAAAA,SAAAA,CAAA,MAAA,EAAA,EAAO,GAAA;AACP,EAAAA,SAAAA,CAAA,OAAA,EAAA,EAAQ,GAAA;AACR,EAAAA,SAAAA,CAAA,OAAA,EAAA,EAAQ,GAAA;AALE,EAAA,OAAAA,SAAAA;AAAA,CAAA,CAAA,CAAA,SAAA,GAAA,CAAA,CAAA,CAAA;AAQZ,IAAqB,QAAA,EAArB,MAAqB,QAAO;AAAA,EAC1B,OAAO,GAAA,CAAI,OAAA,EAAA,GAAoB,IAAA,EAAa;AAC1C,IAAA,GAAA,CACE,CAAC,OAAA,CAAQ,GAAA,CAAI,oBAAA,GACb,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,mBAA4C,EAAA,EAC/D,eAAA,EACF;AACA,MAAA,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA;AAC5C,EAAA;AAE8C,EAAA;AAG1C,IAAA;AAGA,MAAA;AACF,IAAA;AACqC,IAAA;AACvC,EAAA;AAE6C,EAAA;AAGzC,IAAA;AAGA,MAAA;AACF,IAAA;AAC2C,IAAA;AAC7C,EAAA;AAE6C,EAAA;AAGzC,IAAA;AAGA,MAAA;AACF,IAAA;AAC2C,IAAA;AAC7C,EAAA;AAE8C,EAAA;AAG1C,IAAA;AAGA,MAAA;AACF,IAAA;AACqC,IAAA;AACvC,EAAA;AAE8C,EAAA;AAG1C,IAAA;AAGA,MAAA;AACF,IAAA;AACqC,IAAA;AACvC,EAAA;AAE+D,EAAA;AAG3D,IAAA;AAEA,MAAA;AACF,IAAA;AAEqC,IAAA;AACvC,EAAA;AAEiC,EAAA;AAG7B,IAAA;AAEA,MAAA;AACF,IAAA;AAEiB,IAAA;AACnB,EAAA;AAE4C,EAAA;AAGxC,IAAA;AAEA,MAAA;AACF,IAAA;AAE2C,IAAA;AAC7C,EAAA;AAE+C,EAAA;AAG3C,IAAA;AAEA,MAAA;AACF,IAAA;AAEuC,IAAA;AACzC,EAAA;AAE+D,EAAA;AAG3D,IAAA;AAGA,MAAA;AACF,IAAA;AAC0B,IAAA;AAC5B,EAAA;AAE8B,EAAA;AAG1B,IAAA;AAEA,MAAA;AACF,IAAA;AACc,IAAA;AAChB,EAAA;AAE6C,EAAA;AAGzC,IAAA;AAEA,MAAA;AACF,IAAA;AAC0C,IAAA;AAC5C,EAAA;AAEkD,EAAA;AAG9C,IAAA;AAEA,MAAA;AACF,IAAA;AAC0C,IAAA;AAC5C,EAAA;AAEyC,EAAA;AAGrC,IAAA;AAEA,MAAA;AACF,IAAA;AACkB,IAAA;AACpB,EAAA;AAEyC,EAAA;AAGrC,IAAA;AAEA,MAAA;AACF,IAAA;AACkB,IAAA;AACpB,EAAA;AAE2D,EAAA;AAGvD,IAAA;AAEA,MAAA;AACF,IAAA;AACuB,IAAA;AACzB,EAAA;AACF;AArL4B;AAA5B;AF4H+C;AACA;AGjII;AAMrB,EAAA;AACW,IAAA;AAEvB,IAAA;AACF,IAAA;AAEP,MAAA;AAGoC,MAAA;AACzC,IAAA;AAEI,IAAA;AACA,IAAA;AACS,IAAA;AACsB,MAAA;AACQ,MAAA;AAC3C,IAAA;AAEI,IAAA;AAEU,MAAA;AAC8B,QAAA;AAEtC,MAAA;AAEsB,MAAA;AACxB,QAAA;AACS,QAAA;AACW,QAAA;AACtB,MAAA;AACwB,MAAA;AACS,QAAA;AACjC,MAAA;AAEqC,MAAA;AAEA,MAAA;AAEY,MAAA;AACb,MAAA;AACX,QAAA;AACxB,MAAA;AAEmC,MAAA;AAEtB,MAAA;AAID,MAAA;AACuB,QAAA;AACjB,QAAA;AACF,QAAA;AACP,UAAA;AACM,UAAA;AACI,UAAA;AACP,UAAA;AACU,UAAA;AACrB,QAAA;AACM,QAAA;AACR,MAAA;AAEO,MAAA;AACC,QAAA;AACM,QAAA;AACI,QAAA;AACP,QAAA;AACU,QAAA;AACrB,MAAA;AACY,IAAA;AACyB,MAAA;AAC/B,MAAA;AACR,IAAA;AACF,EAAA;AAEsF,EAAA;AACvE,IAAA;AACiC,IAAA;AAChD,EAAA;AAEmG,EAAA;AACpF,IAAA;AAC6B,IAAA;AAC5C,EAAA;AAEkG,EAAA;AACnF,IAAA;AAC4B,IAAA;AAC3C,EAAA;AAEyF,EAAA;AAC1E,IAAA;AACoC,IAAA;AACnD,EAAA;AAEoG,EAAA;AACrF,IAAA;AAC8B,IAAA;AAC7C,EAAA;AACF;AA1GmD;AAA5C;AHmNwC;AACA;AInMiB;AACvB,EAAA;AACxB,IAAA;AACN,IAAA;AACT,EAAA;AAE2C,EAAA;AACD,EAAA;AAEN,EAAA;AAC7B,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAjBgB;AJqN+B;AACA;AKjNrC;AAEL,EAAA;AAEsC,IAAA;AACtC,EAAA;AAEI,EAAA;AACL,IAAA;AACgB,IAAA;AAChB,IAAA;AACF,EAAA;AACuB,EAAA;AACzB;AAfgB;AAoCN;AACmC,EAAA;AACzB,EAAA;AACT,IAAA;AACT,EAAA;AACgC,EAAA;AAClC;AATgB;ALuM+B;AACA;AM7O7C;AAEM,EAAA;AACM,IAAA;AACE,IAAA;AACM,IAAA;AAClB,IAAA;AACE,EAAA;AAEmB,EAAA;AACL,EAAA;AACG,EAAA;AAEa,EAAA;AACD,IAAA;AAEF,IAAA;AAEO,IAAA;AAClC,MAAA;AACF,IAAA;AAEmC,IAAA;AAC1B,MAAA;AACL,QAAA;AACa,QAAA;AACb,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA;AACA,IAAA;AAE0C,IAAA;AAC3B,MAAA;AACkB,MAAA;AACjC,IAAA;AACF,EAAA;AAEO,EAAA;AACL,IAAA;AACS,IAAA;AACT,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAnDsB;AA0DpB;AAEM,EAAA;AACM,IAAA;AACE,IAAA;AACM,IAAA;AAClB,IAAA;AACE,EAAA;AAEc,EAAA;AACG,EAAA;AAEa,EAAA;AACD,IAAA;AAEF,IAAA;AACd,MAAA;AACf,IAAA;AAEoC,IAAA;AAClC,MAAA;AACF,IAAA;AAEmC,IAAA;AAC1B,MAAA;AACL,QAAA;AACa,QAAA;AACb,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA;AACA,IAAA;AAE0C,IAAA;AAC3B,MAAA;AACkB,MAAA;AACjC,IAAA;AACF,EAAA;AAEa,EAAA;AACf;AA/CuB;AAoDrB;AAEO,EAAA;AACL,IAAA;AAC0B,IAAA;AAC1B,IAAA;AACF,EAAA;AACF;AAVgB;AN+N+B;AACA;AOlUlB;AAKa,EAAA;AAED,EAAA;AACrC,IAAA;AACU,IAAA;AACV,IAAA;AACA,IAAA;AACD,EAAA;AACY,EAAA;AAE4D,EAAA;AACvD,IAAA;AACjB,EAAA;AAjB0B;AAyBG;AAKL,EAAA;AAEC,EAAA;AACC,IAAA;AACc,MAAA;AACnC,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACqC,MAAA;AACxC,IAAA;AAC0C,IAAA;AAC5C,EAAA;AAEO,EAAA;AACC,IAAA;AACE,IAAA;AACI,IAAA;AACF,IAAA;AACD,IAAA;AACX,EAAA;AA1B8B;AA+B9B;AAGyB,EAAA;AAEX,EAAA;AACa,IAAA;AACc,MAAA;AACnC,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACD,MAAA;AACqC,MAAA;AACxC,IAAA;AAC0C,IAAA;AAC5C,EAAA;AAEgC,EAAA;AACF,IAAA;AACpB,MAAA;AACR,IAAA;AACF,EAAA;AACF;AAzBuB;AA+BM;AAKZ,EAAA;AAC2B,EAAA;AAC7B,EAAA;AACqC,EAAA;AARvB;AP4SkB;AACA;AQ/YpB;AAKiB,EAAA;AAC7B,EAAA;AACuC,EAAA;AAClC,IAAA;AACjB,EAAA;AATwB;ARuZoB;AACA;AShZlC;AAIT,EAAA;AAFQ,IAAA;AACA,IAAA;AACP,EAAA;AAEuC,EAAA;AACD,IAAA;AACzC,EAAA;AAEsC,EAAA;AACG,IAAA;AACzC,EAAA;AAE+C,EAAA;AACtB,IAAA;AACN,MAAA;AACA,MAAA;AACf,MAAA;AACF,IAAA;AAE8B,IAAA;AACvB,IAAA;AACT,EAAA;AAEgD,EAAA;AACJ,IAAA;AAC5C,EAAA;AAEmD,EAAA;AACP,IAAA;AAC5C,EAAA;AAE8B,EAAA;AACc,IAAA;AAC5C,EAAA;AACF;AApC8B;AAAvB;ATibwC;AACA;AUtbpB;AAKR,EAAA;AAEL,EAAA;AACoB,IAAA;AACvB,IAAA;AACT,EAAA;AAEa,EAAA;AAEwD,EAAA;AACnD,IAAA;AACjB,EAAA;AAhBwB;AVkcoB;AACA;AWzcnB;AAIxB,EAAA;AAFQ,IAAA;AACA,IAAA;AACP,EAAA;AAEqC,EAAA;AACI,IAAA;AAC5C,EAAA;AACF;AAT4B;AAArB;AXqdwC;AACA;AYlbhB;AAKC,EAAA;AAEQ,EAAA;AACtC,IAAA;AACU,IAAA;AACV,IAAA;AACA,IAAA;AACA,EAAA;AAEwF,EAAA;AACxE,IAAA;AAChB,EAAA;AAhB6B;AAmBD;AAKa,EAAA;AAEN,EAAA;AACnB,IAAA;AAChB,EAAA;AAT4B;AZkbiB;AACA;AatelC;AAIT,EAAA;AAFQ,IAAA;AACA,IAAA;AACP,EAAA;AAE6C,EAAA;AACP,IAAA;AAC1C,EAAA;AAEgC,EAAA;AACS,IAAA;AACzC,EAAA;AACD;AAbkC;AAA3B;AbqfwC;AACA;Ac/eX;AAKV,EAAA;AAEpB,EAAA;AAGG,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAE4C,EAAA;AAhBV;Ad0fW;AACA;AejenB;AAuBU,EAAA;AAbE,IAAA;AACe,IAAA;AAGF,IAAA;AAEH,IAAA;AAQxC,IAAA;AACJ,MAAA;AACA,MAAA;AACc,MAAA;AACd,MAAA;AACA,MAAA;AACA,MAAA;AACE,IAAA;AAE0B,IAAA;AACZ,MAAA;AAClB,IAAA;AAE6B,IAAA;AACa,IAAA;AAChB,IAAA;AACiB,IAAA;AAChB,IAAA;AAEb,IAAA;AACE,IAAA;AACJ,MAAA;AAC0B,MAAA;AACtC,IAAA;AAEuC,IAAA;AACpB,IAAA;AACA,IAAA;AAEC,IAAA;AACP,MAAA;AACA,MAAA;AACb,IAAA;AACkB,IAAA;AACL,MAAA;AACA,MAAA;AACb,IAAA;AACwB,IAAA;AACX,MAAA;AACA,MAAA;AACb,IAAA;AAEa,IAAA;AACf,EAAA;AAEwB,EAAA;AACG,IAAA;AACiB,IAAA;AAEnC,IAAA;AACL,MAAA;AACO,MAAA;AACT,IAAA;AAEgB,IAAA;AACN,MAAA;AAC4B,MAAA;AACb,MAAA;AACI,MAAA;AACH,MAAA;AACrB,MAAA;AACL,IAAA;AACF,EAAA;AAEwB,EAAA;AACf,IAAA;AACL,MAAA;AACK,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACP,IAAA;AAEkC,IAAA;AACb,MAAA;AACN,MAAA;AACC,MAAA;AACA,MAAA;AACD,MAAA;AACS,MAAA;AACD,MAAA;AACtB,IAAA;AACH,EAAA;AAE2B,EAAA;AACa,IAAA;AAEvB,IAAA;AACI,IAAA;AACA,IAAA;AACrB,EAAA;AACa,EAAA;AACC,IAAA;AACd,EAAA;AAE+D,EAAA;AAChD,IAAA;AAEU,IAAA;AACJ,IAAA;AACA,IAAA;AACrB,EAAA;AACiD,EAAA;AACnC,IAAA;AACd,EAAA;AAEiC,EAAA;AACnB,IAAA;AACd,EAAA;AAEsD,EAAA;AACvC,IAAA;AAEW,IAAA;AACL,IAAA;AACA,IAAA;AACrB,EAAA;AACuC,EAAA;AACzB,IAAA;AACd,EAAA;AAEiC,EAAA;AACY,IAAA;AAE3B,IAAA;AACG,IAAA;AACA,IAAA;AACrB,EAAA;AAC0B,EAAA;AACZ,IAAA;AACd,EAAA;AAE6C,EAAA;AAC9B,IAAA;AAEQ,IAAA;AACF,IAAA;AACrB,EAAA;AACiC,EAAA;AACnB,IAAA;AACd,EAAA;AAE2B,EAAA;AACb,IAAA;AACd,EAAA;AAKE,EAAA;AACoC,IAAA;AAClC,MAAA;AACA,MAAA;AACD,IAAA;AACH,EAAA;AACF;AApL4B;AACa;AACrB,EAAA;AACE,EAAA;AACV,EAAA;AACW,EAAA;AACG,EAAA;AACR,EAAA;AAChB;AARF;AfonB+C;AACA;AgBxpBhC;AhB0pBgC;AACA;AACA;AACA;AACA","file":"/home/runner/work/sound-tank/sound-tank/dist/index.js","sourcesContent":[null,"import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class FetchHttpClient implements HttpClient {\n private async request<T>(\n method: string,\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const { headers, params, timeout } = config ?? {};\n\n let fullUrl = url;\n if (params) {\n const query = Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n if (query) fullUrl += (url.includes('?') ? '&' : '?') + query;\n }\n\n let controller: AbortController | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeout) {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller!.abort(), timeout);\n }\n\n try {\n const resolvedHeaders = headers\n ? (Object.fromEntries(\n Object.entries(headers).filter(([, v]) => v !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n const init: RequestInit = {\n method,\n headers: resolvedHeaders,\n signal: controller?.signal,\n };\n if (data !== undefined) {\n init.body = JSON.stringify(data);\n }\n\n const res = await fetch(fullUrl, init);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const contentType = res.headers.get('content-type') ?? '';\n const responseData: T =\n contentType.includes('json')\n ? await res.json()\n : (await res.text()) as unknown as T;\n\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}: ${res.statusText}`) as any;\n err.status = res.status;\n err.response = {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n throw err;\n }\n\n return {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n throw err;\n }\n }\n\n async get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('POST request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('POST', url, data, config);\n }\n\n async put<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PUT request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PUT', url, data, config);\n }\n\n async delete<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PATCH request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PATCH', url, data, config);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n throttle?: { delayMs: number; everyNPages: number };\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\nexport async function* paginateStream<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): AsyncGenerator<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n if (result.items.length > 0) {\n yield result.items;\n }\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug('Stream pagination complete after %d pages.', pagesProcessed + 1);\n}\n\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n paginateStream,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport async function* streamAllMyListings(\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): AsyncGenerator<Listing> {\n const { query, state } = options;\n\n const pages = paginateStream<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n for await (const page of pages) {\n for (const listing of page) {\n yield listing;\n }\n }\n}\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n streamAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n streamAllMy(options: GetAllMyListingsOptions = {}) {\n return streamAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { ReverbConfig, createReverbConfig } from \"./config/ReverbConfig\";\nimport { FetchHttpClient, HttpClient } from \"./http\";\nimport { ListingsResource } from \"./resources/ListingsResource\";\nimport { OrdersResource } from \"./resources/OrdersResource\";\nimport { NegotiationsResource } from \"./resources/NegotiationsResource\";\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from \"./methods\";\nimport Logger from \"./utils/logger\";\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = {\n \"Content-Type\": string;\n \"Accept-Version\": ApiVersion;\n Accept: string;\n \"Accept-Language\": Locale;\n \"X-Display-Currency\": DisplayCurrency;\n \"X-Shipping-Region\"?: ShippingRegion | undefined;\n \"User-Agent\"?: string;\n [key: string]: string | undefined;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n \"Content-Type\": \"application/hal+json\",\n \"Accept-Version\": \"3.0\",\n Accept: \"application/hal+json\",\n \"Accept-Language\": \"en\",\n \"X-Display-Currency\": \"USD\",\n \"User-Agent\": \"Reverb Node SDK\",\n };\n\n private _rootEndpoint: RootEndpoint = \"https://api.reverb.com/api\";\n private _version: ApiVersion = Reverb.defaultHeaders[\"Accept-Version\"];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency = Reverb.defaultHeaders[\"X-Display-Currency\"];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders[\"Accept-Language\"];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === \"\") {\n throw new Error(\"Reverb: apiKey is required\");\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new FetchHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\n Logger.trace(\"Reverb client initialized with config: %o\", this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion) optionalHeaders[\"X-Shipping-Region\"] = this._shippingRegion;\n\n Logger.debug(\n \"Updating headers with API key and config values. Shipping region included: %s\",\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n \"Accept-Version\": this._version,\n \"X-Display-Currency\": this._displayCurrency,\n \"Accept-Language\": this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n \"Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s\",\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug(\"Setting locale to: %s\", locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug(\"Setting shipping region to: %s\", shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug(\"Setting display currency to: %s\", displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug(\"Setting API version to: %s\", version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug(\"Setting root endpoint to: %s\", rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions[\"params\"],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -15,9 +15,6 @@ function createReverbConfig(params) {
|
|
|
15
15
|
}
|
|
16
16
|
__name(createReverbConfig, "createReverbConfig");
|
|
17
17
|
|
|
18
|
-
// src/http/AxiosHttpClient.ts
|
|
19
|
-
import axios from "axios";
|
|
20
|
-
|
|
21
18
|
// src/utils/logger.ts
|
|
22
19
|
var LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
23
20
|
LogLevel2["ERROR"] = "0";
|
|
@@ -134,95 +131,88 @@ var _Logger = class _Logger {
|
|
|
134
131
|
__name(_Logger, "Logger");
|
|
135
132
|
var Logger = _Logger;
|
|
136
133
|
|
|
137
|
-
// src/http/
|
|
138
|
-
var
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
134
|
+
// src/http/FetchHttpClient.ts
|
|
135
|
+
var _FetchHttpClient = class _FetchHttpClient {
|
|
136
|
+
async request(method, url, data, config) {
|
|
137
|
+
const { headers, params, timeout } = config ?? {};
|
|
138
|
+
let fullUrl = url;
|
|
139
|
+
if (params) {
|
|
140
|
+
const query = Object.entries(params).filter(([, v]) => v != null).map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`).join("&");
|
|
141
|
+
if (query) fullUrl += (url.includes("?") ? "&" : "?") + query;
|
|
142
|
+
}
|
|
143
|
+
let controller;
|
|
144
|
+
let timeoutId;
|
|
145
|
+
if (timeout) {
|
|
146
|
+
controller = new AbortController();
|
|
147
|
+
timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const resolvedHeaders = headers ? Object.fromEntries(
|
|
151
|
+
Object.entries(headers).filter(([, v]) => v !== void 0)
|
|
152
|
+
) : void 0;
|
|
153
|
+
const init = {
|
|
154
|
+
method,
|
|
155
|
+
headers: resolvedHeaders,
|
|
156
|
+
signal: controller?.signal
|
|
157
|
+
};
|
|
158
|
+
if (data !== void 0) {
|
|
159
|
+
init.body = JSON.stringify(data);
|
|
160
|
+
}
|
|
161
|
+
const res = await fetch(fullUrl, init);
|
|
162
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
163
|
+
const responseHeaders = {};
|
|
164
|
+
res.headers.forEach((value, key) => {
|
|
165
|
+
responseHeaders[key] = value;
|
|
166
|
+
});
|
|
167
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
168
|
+
const responseData = contentType.includes("json") ? await res.json() : await res.text();
|
|
169
|
+
if (!res.ok) {
|
|
170
|
+
const err = new Error(`HTTP ${res.status}: ${res.statusText}`);
|
|
171
|
+
err.status = res.status;
|
|
172
|
+
err.response = {
|
|
173
|
+
data: responseData,
|
|
174
|
+
status: res.status,
|
|
175
|
+
statusText: res.statusText,
|
|
176
|
+
headers: responseHeaders,
|
|
177
|
+
config: config ?? {}
|
|
178
|
+
};
|
|
179
|
+
throw err;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
data: responseData,
|
|
183
|
+
status: res.status,
|
|
184
|
+
statusText: res.statusText,
|
|
185
|
+
headers: responseHeaders,
|
|
186
|
+
config: config ?? {}
|
|
187
|
+
};
|
|
188
|
+
} catch (err) {
|
|
189
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
190
|
+
throw err;
|
|
191
|
+
}
|
|
166
192
|
}
|
|
167
193
|
async get(url, config) {
|
|
168
|
-
const response = await this.axiosInstance.get(url, config);
|
|
169
194
|
Logger.trace("GET request to %s with config: %o", url, config);
|
|
170
|
-
return this.
|
|
195
|
+
return this.request("GET", url, void 0, config);
|
|
171
196
|
}
|
|
172
197
|
async post(url, data, config) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
"POST request to %s with data: %o and config: %o",
|
|
176
|
-
url,
|
|
177
|
-
data,
|
|
178
|
-
config
|
|
179
|
-
);
|
|
180
|
-
return this.convertResponse(response);
|
|
198
|
+
Logger.trace("POST request to %s with data: %o and config: %o", url, data, config);
|
|
199
|
+
return this.request("POST", url, data, config);
|
|
181
200
|
}
|
|
182
201
|
async put(url, data, config) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
"PUT request to %s with data: %o and config: %o",
|
|
186
|
-
url,
|
|
187
|
-
data,
|
|
188
|
-
config
|
|
189
|
-
);
|
|
190
|
-
return this.convertResponse(response);
|
|
202
|
+
Logger.trace("PUT request to %s with data: %o and config: %o", url, data, config);
|
|
203
|
+
return this.request("PUT", url, data, config);
|
|
191
204
|
}
|
|
192
205
|
async delete(url, config) {
|
|
193
|
-
const response = await this.axiosInstance.delete(url, config);
|
|
194
206
|
Logger.trace("DELETE request to %s with config: %o", url, config);
|
|
195
|
-
return this.
|
|
207
|
+
return this.request("DELETE", url, void 0, config);
|
|
196
208
|
}
|
|
197
209
|
async patch(url, data, config) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
"PATCH request to %s with data: %o and config: %o",
|
|
201
|
-
url,
|
|
202
|
-
data,
|
|
203
|
-
config
|
|
204
|
-
);
|
|
205
|
-
return this.convertResponse(response);
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Useful for advanced axios features like interceptors.
|
|
209
|
-
*
|
|
210
|
-
* @example
|
|
211
|
-
* ```ts
|
|
212
|
-
* const client = new AxiosHttpClient();
|
|
213
|
-
* const axios = client.getAxiosInstance();
|
|
214
|
-
* axios.interceptors.request.use(config => {
|
|
215
|
-
* console.log('Request:', config);
|
|
216
|
-
* return config;
|
|
217
|
-
* });
|
|
218
|
-
* ```
|
|
219
|
-
*/
|
|
220
|
-
getAxiosInstance() {
|
|
221
|
-
return this.axiosInstance;
|
|
210
|
+
Logger.trace("PATCH request to %s with data: %o and config: %o", url, data, config);
|
|
211
|
+
return this.request("PATCH", url, data, config);
|
|
222
212
|
}
|
|
223
213
|
};
|
|
224
|
-
__name(
|
|
225
|
-
var
|
|
214
|
+
__name(_FetchHttpClient, "FetchHttpClient");
|
|
215
|
+
var FetchHttpClient = _FetchHttpClient;
|
|
226
216
|
|
|
227
217
|
// src/utils/urlBuilder.ts
|
|
228
218
|
function buildUrl(baseUrl, path) {
|
|
@@ -270,7 +260,8 @@ async function paginateAll(fetchPage, options = {}) {
|
|
|
270
260
|
const {
|
|
271
261
|
perPage = 50,
|
|
272
262
|
startPage = 1,
|
|
273
|
-
maxPages = Number.MAX_SAFE_INTEGER
|
|
263
|
+
maxPages = Number.MAX_SAFE_INTEGER,
|
|
264
|
+
throttle
|
|
274
265
|
} = options;
|
|
275
266
|
const allItems = [];
|
|
276
267
|
let currentPage = startPage;
|
|
@@ -291,6 +282,10 @@ async function paginateAll(fetchPage, options = {}) {
|
|
|
291
282
|
}
|
|
292
283
|
currentPage++;
|
|
293
284
|
pagesProcessed++;
|
|
285
|
+
if (throttle && pagesProcessed % throttle.everyNPages === 0) {
|
|
286
|
+
Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
|
|
287
|
+
await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
|
|
288
|
+
}
|
|
294
289
|
}
|
|
295
290
|
Logger.debug(
|
|
296
291
|
"Pagination complete. Total items fetched: %d across %d pages.",
|
|
@@ -300,6 +295,41 @@ async function paginateAll(fetchPage, options = {}) {
|
|
|
300
295
|
return allItems;
|
|
301
296
|
}
|
|
302
297
|
__name(paginateAll, "paginateAll");
|
|
298
|
+
async function* paginateStream(fetchPage, options = {}) {
|
|
299
|
+
const {
|
|
300
|
+
perPage = 50,
|
|
301
|
+
startPage = 1,
|
|
302
|
+
maxPages = Number.MAX_SAFE_INTEGER,
|
|
303
|
+
throttle
|
|
304
|
+
} = options;
|
|
305
|
+
let currentPage = startPage;
|
|
306
|
+
let pagesProcessed = 0;
|
|
307
|
+
while (pagesProcessed < maxPages) {
|
|
308
|
+
const result = await fetchPage(currentPage, perPage);
|
|
309
|
+
if (result.items.length > 0) {
|
|
310
|
+
yield result.items;
|
|
311
|
+
}
|
|
312
|
+
if (!result.hasMore || result.items.length === 0) {
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
if (result.items.length < perPage) {
|
|
316
|
+
Logger.debug(
|
|
317
|
+
"Received fewer items than perPage (%d < %d), assuming last page reached.",
|
|
318
|
+
result.items.length,
|
|
319
|
+
perPage
|
|
320
|
+
);
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
currentPage++;
|
|
324
|
+
pagesProcessed++;
|
|
325
|
+
if (throttle && pagesProcessed % throttle.everyNPages === 0) {
|
|
326
|
+
Logger.debug("Throttling: waiting %dms after %d pages.", throttle.delayMs, pagesProcessed);
|
|
327
|
+
await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
Logger.debug("Stream pagination complete after %d pages.", pagesProcessed + 1);
|
|
331
|
+
}
|
|
332
|
+
__name(paginateStream, "paginateStream");
|
|
303
333
|
function createPaginatedResult(items, perPage, currentPage) {
|
|
304
334
|
return {
|
|
305
335
|
items,
|
|
@@ -335,7 +365,7 @@ var getAllMyListings = /* @__PURE__ */ __name(async (client, config, options) =>
|
|
|
335
365
|
});
|
|
336
366
|
return createPaginatedResult(response.data.listings || [], perPage, page);
|
|
337
367
|
},
|
|
338
|
-
{ perPage: 50 }
|
|
368
|
+
{ perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
|
|
339
369
|
);
|
|
340
370
|
return {
|
|
341
371
|
data: allListings,
|
|
@@ -345,6 +375,27 @@ var getAllMyListings = /* @__PURE__ */ __name(async (client, config, options) =>
|
|
|
345
375
|
config: {}
|
|
346
376
|
};
|
|
347
377
|
}, "getAllMyListings");
|
|
378
|
+
async function* streamAllMyListings(client, config, options) {
|
|
379
|
+
const { query, state } = options;
|
|
380
|
+
const pages = paginateStream(
|
|
381
|
+
async (page, perPage) => {
|
|
382
|
+
const response = await getMyListings(client, config, {
|
|
383
|
+
page,
|
|
384
|
+
perPage,
|
|
385
|
+
query,
|
|
386
|
+
state
|
|
387
|
+
});
|
|
388
|
+
return createPaginatedResult(response.data.listings || [], perPage, page);
|
|
389
|
+
},
|
|
390
|
+
{ perPage: 50, throttle: { delayMs: 5e3, everyNPages: 5 } }
|
|
391
|
+
);
|
|
392
|
+
for await (const page of pages) {
|
|
393
|
+
for (const listing of page) {
|
|
394
|
+
yield listing;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
__name(streamAllMyListings, "streamAllMyListings");
|
|
348
399
|
var getOneListing = /* @__PURE__ */ __name(async (client, config, options) => {
|
|
349
400
|
const { id } = options;
|
|
350
401
|
const url = buildUrl(config.rootEndpoint, `/listings/${id}`);
|
|
@@ -385,6 +436,9 @@ var _ListingsResource = class _ListingsResource {
|
|
|
385
436
|
getAllMy(options = {}) {
|
|
386
437
|
return getAllMyListings(this.getClient(), this.getConfig(), options);
|
|
387
438
|
}
|
|
439
|
+
streamAllMy(options = {}) {
|
|
440
|
+
return streamAllMyListings(this.getClient(), this.getConfig(), options);
|
|
441
|
+
}
|
|
388
442
|
create(body) {
|
|
389
443
|
return postListing(this.getClient(), this.getConfig(), body);
|
|
390
444
|
}
|
|
@@ -494,7 +548,7 @@ var _Reverb = class _Reverb {
|
|
|
494
548
|
..._Reverb.defaultHeaders,
|
|
495
549
|
Authorization: `Bearer ${this.apiKey}`
|
|
496
550
|
};
|
|
497
|
-
this._httpClient = new
|
|
551
|
+
this._httpClient = new FetchHttpClient();
|
|
498
552
|
this.updateHeaders();
|
|
499
553
|
this._updateConfig();
|
|
500
554
|
this.listings = new ListingsResource(
|
|
@@ -513,8 +567,7 @@ var _Reverb = class _Reverb {
|
|
|
513
567
|
}
|
|
514
568
|
updateHeaders() {
|
|
515
569
|
const optionalHeaders = {};
|
|
516
|
-
if (this._shippingRegion)
|
|
517
|
-
optionalHeaders["X-Shipping-Region"] = this._shippingRegion;
|
|
570
|
+
if (this._shippingRegion) optionalHeaders["X-Shipping-Region"] = this._shippingRegion;
|
|
518
571
|
Logger.debug(
|
|
519
572
|
"Updating headers with API key and config values. Shipping region included: %s",
|
|
520
573
|
!!this._shippingRegion
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/ReverbConfig.ts","../src/http/AxiosHttpClient.ts","../src/utils/logger.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"sourcesContent":["import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\nimport { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class AxiosHttpClient implements HttpClient {\n private axiosInstance: AxiosInstance;\n\n /**\n * @example\n * ```ts\n * // Using default axios\n * const client = new AxiosHttpClient();\n *\n * // Using custom axios instance\n * const customAxios = axios.create({ baseURL: 'https://api.example.com' });\n * const client = new AxiosHttpClient(customAxios);\n * ```\n */\n constructor(axiosInstance?: AxiosInstance) {\n this.axiosInstance = axiosInstance || axios;\n }\n\n /**\n * Converts an AxiosResponse to HttpResponse.\n * In practice, they're compatible, but this ensures type safety.\n */\n private convertResponse<T>(response: AxiosResponse<T>): HttpResponse<T> {\n return {\n data: response.data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers as Record<string, string>,\n config: response.config as HttpRequestConfig,\n request: response.request,\n };\n }\n\n async get<T = any>(\n url: string,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.get<T>(url, config);\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.convertResponse(response);\n }\n\n async post<T = any>(\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.post<T>(url, data, config);\n Logger.trace(\n 'POST request to %s with data: %o and config: %o',\n url,\n data,\n config,\n );\n return this.convertResponse(response);\n }\n\n async put<T = any>(\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.put<T>(url, data, config);\n Logger.trace(\n 'PUT request to %s with data: %o and config: %o',\n url,\n data,\n config,\n );\n return this.convertResponse(response);\n }\n\n async delete<T = any>(\n url: string,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.delete<T>(url, config);\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.convertResponse(response);\n }\n\n async patch<T = any>(\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const response = await this.axiosInstance.patch<T>(url, data, config);\n Logger.trace(\n 'PATCH request to %s with data: %o and config: %o',\n url,\n data,\n config,\n );\n return this.convertResponse(response);\n }\n\n /**\n * Useful for advanced axios features like interceptors.\n *\n * @example\n * ```ts\n * const client = new AxiosHttpClient();\n * const axios = client.getAxiosInstance();\n * axios.interceptors.request.use(config => {\n * console.log('Request:', config);\n * return config;\n * });\n * ```\n */\n getAxiosInstance(): AxiosInstance {\n return this.axiosInstance;\n }\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\n/**\n * Generic pagination helper that fetches all items across multiple pages.\n *\n * @param fetchPage - Function that fetches a single page of results\n * @param options - Pagination configuration options\n * @returns Promise resolving to all items across all pages\n *\n * @example\n * ```ts\n * const allListings = await paginateAll(\n * async (page, perPage) => {\n * const response = await getMyListings({ page, perPage });\n * return {\n * items: response.data.listings,\n * hasMore: response.data.listings.length === perPage,\n * currentPage: page\n * };\n * },\n * { perPage: 50 }\n * );\n * ```\n */\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n // Stop if we got fewer items than requested (indicates last page)\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\n/**\n * Helper to create a PaginatedFetchResult from common API response patterns.\n * Useful when your API returns the count of items in a response.\n *\n * @param items - Array of items from the current page\n * @param perPage - Number of items requested per page\n * @param currentPage - Current page number\n * @returns PaginatedFetchResult\n *\n * @example\n * ```ts\n * return createPaginatedResult(response.data.listings, 50, page);\n * ```\n */\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50 },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { Axios } from 'axios';\nimport { ReverbConfig, createReverbConfig } from './config/ReverbConfig';\nimport { AxiosHttpClient, HttpClient } from './http';\nimport { ListingsResource } from './resources/ListingsResource';\nimport { OrdersResource } from './resources/OrdersResource';\nimport { NegotiationsResource } from './resources/NegotiationsResource';\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from './methods';\nimport Logger from './utils/logger';\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = Axios['get']['arguments'][1] & {\n 'Content-Type': string;\n 'Accept-Version': ApiVersion;\n Accept: string;\n 'Accept-Language': Locale;\n 'X-Display-Currency': DisplayCurrency;\n 'X-Shipping-Region'?: ShippingRegion | undefined;\n 'User-Agent'?: string;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n 'Content-Type': 'application/hal+json',\n 'Accept-Version': '3.0',\n Accept: 'application/hal+json',\n 'Accept-Language': 'en',\n 'X-Display-Currency': 'USD',\n 'User-Agent': 'Reverb Node SDK',\n };\n\n private _rootEndpoint: RootEndpoint = 'https://api.reverb.com/api';\n private _version: ApiVersion = Reverb.defaultHeaders['Accept-Version'];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency =\n Reverb.defaultHeaders['X-Display-Currency'];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders['Accept-Language'];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === '') {\n throw new Error('Reverb: apiKey is required');\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new AxiosHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\t\t\n Logger.trace('Reverb client initialized with config: %o', this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion)\n optionalHeaders['X-Shipping-Region'] = this._shippingRegion;\n\n Logger.debug(\n 'Updating headers with API key and config values. Shipping region included: %s',\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n 'Accept-Version': this._version,\n 'X-Display-Currency': this._displayCurrency,\n 'Accept-Language': this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n 'Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s',\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug('Setting locale to: %s', locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug('Setting shipping region to: %s', shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug('Setting display currency to: %s', displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug('Setting API version to: %s', version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug('Setting root endpoint to: %s', rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions['params'],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"],"mappings":"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","names":["LogLevel"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/ReverbConfig.ts","../src/utils/logger.ts","../src/http/FetchHttpClient.ts","../src/utils/urlBuilder.ts","../src/utils/queryBuilder.ts","../src/utils/pagination.ts","../src/methods/listings/getListings.ts","../src/methods/listings/postListing.ts","../src/resources/ListingsResource.ts","../src/methods/orders/getOrders.ts","../src/resources/OrdersResource.ts","../src/methods/negotiations/getNegotiations.ts","../src/resources/NegotiationsResource.ts","../src/methods/index.ts","../src/Reverb.ts","../src/index.ts"],"sourcesContent":["import {\n ApiKey,\n ApiVersion,\n AuthReverbHeaders,\n DisplayCurrency,\n Locale,\n RootEndpoint,\n ShippingRegion,\n} from '../Reverb';\n\nexport interface ReverbConfig {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}\n\nexport function createReverbConfig(params: {\n rootEndpoint: RootEndpoint;\n apiKey: ApiKey;\n headers: AuthReverbHeaders;\n version: ApiVersion;\n locale: Locale;\n displayCurrency: DisplayCurrency;\n shippingRegion?: ShippingRegion;\n}): ReverbConfig {\n return {\n rootEndpoint: params.rootEndpoint,\n apiKey: params.apiKey,\n headers: params.headers,\n version: params.version,\n locale: params.locale,\n displayCurrency: params.displayCurrency,\n shippingRegion: params.shippingRegion,\n };\n}\n","export enum LogLevel {\n ERROR = '0',\n WARN = '1',\n INFO = '2',\n DEBUG = '3',\n TRACE = '4',\n}\n\nexport default class Logger {\n static log(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.log(`[Reverb API Client] ${message}`, ...args);\n }\n\n static error(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.error(`[Reverb API Client] ${message}`, ...args);\n }\n\n static warn(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.WARN\n ) {\n return;\n }\n console.warn(`[Reverb API Client] ${message}`, ...args);\n }\n\n static info(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.INFO\n ) {\n return;\n }\n console.info(`[Reverb API Client] ${message}`, ...args);\n }\n\n static debug(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.DEBUG\n ) {\n return;\n }\n console.debug(`[Reverb API Client] ${message}`, ...args);\n }\n\n static trace(message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.TRACE\n ) {\n return;\n }\n console.trace(`[Reverb API Client] ${message}`, ...args);\n }\n\n static group(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.group(`[Reverb API Client] ${message}`, ...args);\n }\n\n static groupEnd(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.groupEnd();\n }\n\n static time(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.time(`[Reverb API Client] ${label}`);\n }\n\n static timeEnd(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n\n console.timeEnd(`[Reverb API Client] ${label}`);\n }\n\n static assert(condition: any, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] <\n LogLevel.ERROR\n ) {\n return;\n }\n console.assert(condition, `[Reverb API Client] ${message}`, ...args);\n }\n\n static clear(level: LogLevel) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.clear();\n }\n\n static count(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.count(`[Reverb API Client] ${label}`);\n }\n\n static countReset(level: LogLevel, label: string) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.countReset(`[Reverb API Client] ${label}`);\n }\n\n static dir(level: LogLevel, object: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.dir(object);\n }\n\n static table(level: LogLevel, data: any) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.table(data);\n }\n\n static groupCollapsed(level: LogLevel, message: string, ...args: any[]) {\n if (\n !process.env.SOUNDTANK_LOG_LEVEL ||\n LogLevel[process.env.SOUNDTANK_LOG_LEVEL as keyof typeof LogLevel] < level\n ) {\n return;\n }\n console.groupCollapsed(`[Reverb API Client] ${message}`, ...args);\n }\n}\n","import { HttpClient } from './HttpClient';\nimport { HttpRequestConfig, HttpResponse } from './types';\nimport Logger from '~/utils/logger';\n\nexport class FetchHttpClient implements HttpClient {\n private async request<T>(\n method: string,\n url: string,\n data?: any,\n config?: HttpRequestConfig,\n ): Promise<HttpResponse<T>> {\n const { headers, params, timeout } = config ?? {};\n\n let fullUrl = url;\n if (params) {\n const query = Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n if (query) fullUrl += (url.includes('?') ? '&' : '?') + query;\n }\n\n let controller: AbortController | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (timeout) {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller!.abort(), timeout);\n }\n\n try {\n const resolvedHeaders = headers\n ? (Object.fromEntries(\n Object.entries(headers).filter(([, v]) => v !== undefined),\n ) as Record<string, string>)\n : undefined;\n\n const init: RequestInit = {\n method,\n headers: resolvedHeaders,\n signal: controller?.signal,\n };\n if (data !== undefined) {\n init.body = JSON.stringify(data);\n }\n\n const res = await fetch(fullUrl, init);\n\n if (timeoutId) clearTimeout(timeoutId);\n\n const responseHeaders: Record<string, string> = {};\n res.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const contentType = res.headers.get('content-type') ?? '';\n const responseData: T =\n contentType.includes('json')\n ? await res.json()\n : (await res.text()) as unknown as T;\n\n if (!res.ok) {\n const err = new Error(`HTTP ${res.status}: ${res.statusText}`) as any;\n err.status = res.status;\n err.response = {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n throw err;\n }\n\n return {\n data: responseData,\n status: res.status,\n statusText: res.statusText,\n headers: responseHeaders,\n config: config ?? {},\n };\n } catch (err) {\n if (timeoutId) clearTimeout(timeoutId);\n throw err;\n }\n }\n\n async get<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('GET request to %s with config: %o', url, config);\n return this.request<T>('GET', url, undefined, config);\n }\n\n async post<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('POST request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('POST', url, data, config);\n }\n\n async put<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PUT request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PUT', url, data, config);\n }\n\n async delete<T = any>(url: string, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('DELETE request to %s with config: %o', url, config);\n return this.request<T>('DELETE', url, undefined, config);\n }\n\n async patch<T = any>(url: string, data?: any, config?: HttpRequestConfig): Promise<HttpResponse<T>> {\n Logger.trace('PATCH request to %s with data: %o and config: %o', url, data, config);\n return this.request<T>('PATCH', url, data, config);\n }\n}\n","import Logger from './logger';\n\n/**\n * Builds a complete URL from a base URL and path, handling both absolute and relative URLs.\n *\n * @param baseUrl - The base URL (e.g., \"https://api.reverb.com/api\")\n * @param path - The path to append (e.g., \"/my/listings\" or \"my/listings\")\n * @returns The complete URL\n *\n * @example\n * ```ts\n * buildUrl(\"https://api.reverb.com/api\", \"/my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"my/listings\")\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n *\n * buildUrl(\"https://api.reverb.com/api\", \"https://example.com/absolute\")\n * // Returns: \"https://example.com/absolute\"\n * ```\n */\nexport function buildUrl(baseUrl: string, path: string): string {\n if (path.startsWith('http://') || path.startsWith('https://')) {\n Logger.debug('Provided path is an absolute URL: %s', path);\n return path;\n }\n\n const normalizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n\n const fullUrl = `${normalizedBase}${normalizedPath}`;\n Logger.debug(\n 'Built URL: %s from base: %s and path: %s',\n fullUrl,\n baseUrl,\n path,\n );\n return fullUrl;\n}\n","import Logger from './logger';\n\n/**\n * Builds a URL-encoded query string from an object of parameters.\n * Filters out undefined and null values.\n *\n * @param params - An object containing query parameters\n * @returns A query string (without leading \"?\") or empty string if no valid params\n *\n * @example\n * ```ts\n * buildQueryString({ page: 1, per_page: 50 })\n * // Returns: \"page=1&per_page=50\"\n *\n * buildQueryString({ query: \"guitar\", state: undefined })\n * // Returns: \"query=guitar\"\n *\n * buildQueryString({ search: \"hello world\" })\n * // Returns: \"search=hello%20world\"\n *\n * buildQueryString({})\n * // Returns: \"\"\n * ```\n */\nexport function buildQueryString(\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const entries = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\n });\n\n Logger.debug(\n 'Built query string: %s from params: %o',\n entries.join('&'),\n params,\n );\n return entries.join('&');\n}\n\n/**\n * Builds a complete URL with query parameters.\n *\n * @param baseUrl - The base URL\n * @param params - An object containing query parameters\n * @returns The complete URL with query string\n *\n * @example\n * ```ts\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", { page: 1 })\n * // Returns: \"https://api.reverb.com/api/my/listings?page=1\"\n *\n * buildUrlWithQuery(\"https://api.reverb.com/api/my/listings\", {})\n * // Returns: \"https://api.reverb.com/api/my/listings\"\n * ```\n */\nexport function buildUrlWithQuery(\n baseUrl: string,\n params: Record<string, string | number | boolean | undefined | null>,\n): string {\n const queryString = buildQueryString(params);\n if (!queryString) {\n return baseUrl;\n }\n return `${baseUrl}?${queryString}`;\n}\n","import Logger from './logger';\n\nexport interface PaginationOptions {\n perPage?: number;\n startPage?: number;\n maxPages?: number;\n throttle?: { delayMs: number; everyNPages: number };\n}\n\nexport interface PaginatedFetchResult<T> {\n items: T[];\n hasMore: boolean;\n currentPage: number;\n}\n\nexport async function paginateAll<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): Promise<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n const allItems: T[] = [];\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n allItems.push(...result.items);\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug(\n 'Pagination complete. Total items fetched: %d across %d pages.',\n allItems.length,\n pagesProcessed,\n );\n return allItems;\n}\n\nexport async function* paginateStream<T>(\n fetchPage: (\n page: number,\n perPage: number,\n ) => Promise<PaginatedFetchResult<T>>,\n options: PaginationOptions = {},\n): AsyncGenerator<T[]> {\n const {\n perPage = 50,\n startPage = 1,\n maxPages = Number.MAX_SAFE_INTEGER,\n throttle,\n } = options;\n\n let currentPage = startPage;\n let pagesProcessed = 0;\n\n while (pagesProcessed < maxPages) {\n const result = await fetchPage(currentPage, perPage);\n\n if (result.items.length > 0) {\n yield result.items;\n }\n\n if (!result.hasMore || result.items.length === 0) {\n break;\n }\n\n if (result.items.length < perPage) {\n Logger.debug(\n 'Received fewer items than perPage (%d < %d), assuming last page reached.',\n result.items.length,\n perPage,\n );\n break;\n }\n\n currentPage++;\n pagesProcessed++;\n\n if (throttle && pagesProcessed % throttle.everyNPages === 0) {\n Logger.debug('Throttling: waiting %dms after %d pages.', throttle.delayMs, pagesProcessed);\n await new Promise((resolve) => setTimeout(resolve, throttle.delayMs));\n }\n }\n\n Logger.debug('Stream pagination complete after %d pages.', pagesProcessed + 1);\n}\n\nexport function createPaginatedResult<T>(\n items: T[],\n perPage: number,\n currentPage: number,\n): PaginatedFetchResult<T> {\n return {\n items,\n hasMore: items.length === perPage,\n currentPage,\n };\n}\n","import { Listing, ListingStates, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n buildUrl,\n buildUrlWithQuery,\n paginateAll,\n paginateStream,\n createPaginatedResult,\n} from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyListingsOptions {\n page?: number;\n perPage?: number;\n query?: string;\n state?: string;\n}\n\nexport const getMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyListingsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: Listing[] }>>> => {\n const { page, perPage, query, state } = options;\n\n const url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings'), {\n page,\n per_page: perPage,\n query,\n state,\n });\n Logger.debug('Fetching my listings with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ listings: Listing[] }>>(url, {\n headers: config.headers,\n });\n};\n\nexport interface GetAllMyListingsOptions {\n query?: string;\n state?: ListingStates;\n}\n\nexport const getAllMyListings = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): Promise<HttpResponse<Listing[]>> => {\n const { query, state } = options;\n\n const allListings = await paginateAll<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n return {\n data: allListings,\n status: 200,\n statusText: 'OK',\n headers: {},\n config: {},\n };\n};\n\nexport async function* streamAllMyListings(\n client: HttpClient,\n config: ReverbConfig,\n options: GetAllMyListingsOptions,\n): AsyncGenerator<Listing> {\n const { query, state } = options;\n\n const pages = paginateStream<Listing>(\n async (page, perPage) => {\n const response = await getMyListings(client, config, {\n page,\n perPage,\n query,\n state,\n });\n return createPaginatedResult(response.data.listings || [], perPage, page);\n },\n { perPage: 50, throttle: { delayMs: 5000, everyNPages: 5 } },\n );\n\n for await (const page of pages) {\n for (const listing of page) {\n yield listing;\n }\n }\n}\n\nexport interface GetOneListingOptions {\n id: string;\n}\n\nexport const getOneListing = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingOptions,\n): Promise<HttpResponse<Listing>> => {\n const { id } = options;\n const url = buildUrl(config.rootEndpoint, `/listings/${id}`);\n Logger.debug('Fetching listing with ID: %s using URL: %s', id, url);\n return client.get<Listing>(url, { headers: config.headers });\n};\n\nexport interface GetOneListingPhotosOptions {\n id: string;\n}\n\nexport const getOneListingPhotos = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetOneListingPhotosOptions,\n): Promise<HttpResponse<{ photos: string[] }>> => {\n const { id } = options;\n\n const oneListingResponse = await getOneListing(client, config, { id });\n\n const photos =\n oneListingResponse.data?.photos?.map((photo) => photo._links.full.href) ||\n [];\n Logger.debug('Fetched %d photos for listing with ID: %s', photos.length, id);\n\n return {\n data: { photos },\n status: oneListingResponse.status,\n statusText: oneListingResponse.statusText,\n headers: oneListingResponse.headers,\n config: oneListingResponse.config,\n };\n};\n","import type { Listing, ListingPostBody } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport const postListing = async (\n client: HttpClient,\n config: ReverbConfig,\n body: ListingPostBody,\n): Promise<HttpResponse<Listing>> => {\n const url = buildUrl(config.rootEndpoint, '/listings');\n Logger.debug('Posting new listing with URL: %s and body: %o', url, body);\n return client.post<Listing>(url, JSON.stringify(body), {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getMyListings,\n getAllMyListings,\n streamAllMyListings,\n getOneListing,\n GetMyListingsOptions,\n GetAllMyListingsOptions,\n GetOneListingOptions,\n} from '~/methods/listings/getListings';\nimport { postListing } from '~/methods/listings/postListing';\nimport { ListingPostBody } from '~/types';\n\nexport class ListingsResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyListingsOptions = {}) {\n return getMyListings(this.getClient(), this.getConfig(), options);\n }\n\n getOne(options: GetOneListingOptions) {\n return getOneListing(this.getClient(), this.getConfig(), options);\n }\n\n async getPhotos(options: GetOneListingOptions) {\n const response = await getOneListing(\n this.getClient(),\n this.getConfig(),\n options,\n );\n const photos =\n response.data?.photos?.map((photo) => photo._links.full.href) || [];\n return photos;\n }\n\n getAllMy(options: GetAllMyListingsOptions = {}) {\n return getAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n streamAllMy(options: GetAllMyListingsOptions = {}) {\n return streamAllMyListings(this.getClient(), this.getConfig(), options);\n }\n\n create(body: ListingPostBody) {\n return postListing(this.getClient(), this.getConfig(), body);\n }\n}\n","import { Order, PaginatedReverbResponse } from '~/types';\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl, buildUrlWithQuery } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport interface GetMyOrdersOptions {\n page?: number;\n}\n\nexport const getMyOrders = async (\n client: HttpClient,\n config: ReverbConfig,\n options: GetMyOrdersOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ orders: Order[] }>>> => {\n const { page } = options;\n\n const url = buildUrlWithQuery(\n buildUrl(config.rootEndpoint, '/my/orders/selling/all'),\n { page },\n );\n\n Logger.debug('Fetching my orders with URL: %s', url);\n\n return client.get<PaginatedReverbResponse<{ orders: Order[] }>>(url, {\n headers: config.headers,\n });\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { getMyOrders, GetMyOrdersOptions } from '~/methods/orders/getOrders';\n\nexport class OrdersResource {\n constructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n getMy(options: GetMyOrdersOptions = {}) {\n return getMyOrders(this.getClient(), this.getConfig(), options);\n }\n}\n","\n\n/*\n\nFind your Active Offers\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\" \nhttps://api.reverb.com/api/my/listings/negotiations\n\n */\n\n/*\n\nGet the details of an individual Offer\n\ncurl -XGET \n-H \"Content-Type: application/hal+json\" \n-H \"Accept: application/hal+json\" \n-H \"Accept-Version: 3.0\" \n-H \"Authorization: Bearer [personal_token]\"\nhttps://api.reverb.com/api/my/negotiations/[offer_id]\n\n */\n\nimport { HttpClient, HttpResponse } from '../../http';\nimport { ReverbConfig } from '../../config/ReverbConfig';\nimport { Negotiation, ListingWithNegotiations, PaginatedReverbResponse } from '../../types';\nimport { buildUrlWithQuery, buildUrl } from '../../utils';\n\nexport interface GetNegotiationsOptions {\n\tpage?: number;\n\tperPage?: number;\n\tstatus?: 'active' | 'active_for_seller' | 'all';\n\tnegotiation_type?: 'standard' | 'auto_push_offer';\n}\n\nexport const getNegotiations = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\toptions: GetNegotiationsOptions,\n): Promise<HttpResponse<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>> => {\n\tconst { page, perPage, status, negotiation_type } = options;\n\n\tconst url = buildUrlWithQuery(buildUrl(config.rootEndpoint, '/my/listings/negotiations'), {\n\t\tpage,\n\t\tper_page: perPage,\n\t\tstatus,\n\t\tnegotiation_type,\n\t});\n\n\treturn client.get<PaginatedReverbResponse<{ listings: ListingWithNegotiations[] }>>(url, {\n\t\theaders: config.headers,\n\t});\n};\n\nexport const getNegotiation = async (\n\tclient: HttpClient,\n\tconfig: ReverbConfig,\n\tofferId: number,\n): Promise<HttpResponse<Negotiation>> => {\n\tconst url = buildUrl(config.rootEndpoint, `/my/negotiations/${offerId}`);\n\n\treturn client.get<Negotiation>(url, {\n\t\theaders: config.headers,\n\t});\n};\n","import { HttpClient } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport {\n getNegotiation,\n getNegotiations,\n\tGetNegotiationsOptions\n} from '../methods/negotiations/getNegotiations';\n\nexport class NegotiationsResource {\n\tconstructor(\n private getClient: () => HttpClient,\n private getConfig: () => ReverbConfig,\n ) {}\n\n\tgetNegotiations(options: GetNegotiationsOptions) {\n\t\treturn getNegotiations(this.getClient(), this.getConfig(), options);\n\t}\n\n\tgetNegotiation(offerId: number) {\n\t\treturn getNegotiation(this.getClient(), this.getConfig(), offerId);\n\t}\n}\n","export * from './listings/getListings';\nexport * from './listings/postListing';\nexport * from './orders/getOrders';\nexport type { PaginatedReverbResponse } from '~/types';\n\nimport { HttpClient, HttpResponse } from '~/http';\nimport { ReverbConfig } from '~/config/ReverbConfig';\nimport { buildUrl } from '~/utils';\nimport Logger from '~/utils/logger';\n\nexport type GetArbitraryEndpointOptions = {\n url: string;\n params?: { [key: string]: string };\n};\n\nexport const getArbitraryEndpoint = async <T = any>(\n client: HttpClient,\n config: ReverbConfig,\n options: GetArbitraryEndpointOptions,\n): Promise<HttpResponse<T>> => {\n const { url, params } = options;\n const requestUrl = url.startsWith('http')\n ? url\n : buildUrl(config.rootEndpoint, url);\n\n Logger.debug(\n 'Fetching arbitrary endpoint with URL: %s and params: %o',\n requestUrl,\n params,\n );\n\n return client.get<T>(requestUrl, { headers: config.headers, params });\n};\n","import { ReverbConfig, createReverbConfig } from \"./config/ReverbConfig\";\nimport { FetchHttpClient, HttpClient } from \"./http\";\nimport { ListingsResource } from \"./resources/ListingsResource\";\nimport { OrdersResource } from \"./resources/OrdersResource\";\nimport { NegotiationsResource } from \"./resources/NegotiationsResource\";\nimport { getArbitraryEndpoint, GetArbitraryEndpointOptions } from \"./methods\";\nimport Logger from \"./utils/logger\";\n\nexport type ApiVersion = string;\nexport type ApiKey = string;\nexport type Locale = string;\nexport type ShippingRegion = string;\nexport type DisplayCurrency = string;\nexport type RootEndpoint = Domain;\n\ntype Domain = `${string}.${string}` | `${string}.${string}.${string}`;\n\nexport interface ReverbOptions {\n apiKey: ApiKey;\n version?: ApiVersion | undefined;\n rootEndpoint?: RootEndpoint | undefined;\n displayCurrency?: DisplayCurrency | undefined;\n shippingRegion?: ShippingRegion | undefined;\n locale?: Locale | undefined;\n}\n\nexport type ReverbHeaders = {\n \"Content-Type\": string;\n \"Accept-Version\": ApiVersion;\n Accept: string;\n \"Accept-Language\": Locale;\n \"X-Display-Currency\": DisplayCurrency;\n \"X-Shipping-Region\"?: ShippingRegion | undefined;\n \"User-Agent\"?: string;\n [key: string]: string | undefined;\n};\n\nexport interface AuthReverbHeaders extends ReverbHeaders {\n Authorization: `Bearer ${ApiKey}`;\n}\n\nexport default class Reverb {\n static defaultHeaders: ReverbHeaders = {\n \"Content-Type\": \"application/hal+json\",\n \"Accept-Version\": \"3.0\",\n Accept: \"application/hal+json\",\n \"Accept-Language\": \"en\",\n \"X-Display-Currency\": \"USD\",\n \"User-Agent\": \"Reverb Node SDK\",\n };\n\n private _rootEndpoint: RootEndpoint = \"https://api.reverb.com/api\";\n private _version: ApiVersion = Reverb.defaultHeaders[\"Accept-Version\"];\n private apiKey: string;\n private _headers: AuthReverbHeaders;\n private _displayCurrency: DisplayCurrency = Reverb.defaultHeaders[\"X-Display-Currency\"];\n private _shippingRegion: ShippingRegion | undefined;\n private _locale: Locale = Reverb.defaultHeaders[\"Accept-Language\"];\n private _config!: ReverbConfig;\n private _httpClient: HttpClient;\n\n readonly listings: ListingsResource;\n readonly orders: OrdersResource;\n readonly negotiations: NegotiationsResource;\n constructor(options: ReverbOptions) {\n const {\n apiKey,\n version,\n rootEndpoint: defaultEndpoint,\n displayCurrency,\n shippingRegion,\n locale,\n } = options;\n\n if (!apiKey || apiKey === \"\") {\n throw new Error(\"Reverb: apiKey is required\");\n }\n\n if (version) this._version = version;\n if (defaultEndpoint) this._rootEndpoint = defaultEndpoint;\n if (displayCurrency) this._displayCurrency = displayCurrency;\n if (shippingRegion) this._shippingRegion = shippingRegion;\n if (locale) this._locale = locale;\n\n this.apiKey = apiKey;\n this._headers = {\n ...Reverb.defaultHeaders,\n Authorization: `Bearer ${this.apiKey}`,\n };\n\n this._httpClient = new FetchHttpClient();\n this.updateHeaders();\n this._updateConfig();\n\n this.listings = new ListingsResource(\n () => this._httpClient,\n () => this._config,\n );\n this.orders = new OrdersResource(\n () => this._httpClient,\n () => this._config,\n );\n this.negotiations = new NegotiationsResource(\n () => this._httpClient,\n () => this._config,\n );\n\n Logger.trace(\"Reverb client initialized with config: %o\", this._config);\n }\n\n private updateHeaders() {\n const optionalHeaders = {} as any;\n if (this._shippingRegion) optionalHeaders[\"X-Shipping-Region\"] = this._shippingRegion;\n\n Logger.debug(\n \"Updating headers with API key and config values. Shipping region included: %s\",\n !!this._shippingRegion,\n );\n\n this._headers = {\n ...this._headers,\n Authorization: `Bearer ${this.apiKey}`,\n \"Accept-Version\": this._version,\n \"X-Display-Currency\": this._displayCurrency,\n \"Accept-Language\": this._locale,\n ...optionalHeaders,\n };\n }\n\n private _updateConfig() {\n Logger.debug(\n \"Updating Reverb config with current settings. Root endpoint: %s, Version: %s, Display currency: %s, Locale: %s, Shipping region: %s\",\n this._rootEndpoint,\n this._version,\n this._displayCurrency,\n this._locale,\n this._shippingRegion,\n );\n\n this._config = createReverbConfig({\n rootEndpoint: this._rootEndpoint,\n apiKey: this.apiKey,\n headers: this._headers,\n version: this._version,\n locale: this._locale,\n displayCurrency: this._displayCurrency,\n shippingRegion: this._shippingRegion,\n });\n }\n\n set locale(locale: Locale) {\n Logger.debug(\"Setting locale to: %s\", locale);\n\n this._locale = locale;\n this.updateHeaders();\n this._updateConfig();\n }\n get locale() {\n return this._locale;\n }\n\n set shippingRegion(shippingRegion: ShippingRegion | undefined) {\n Logger.debug(\"Setting shipping region to: %s\", shippingRegion);\n\n this._shippingRegion = shippingRegion;\n this.updateHeaders();\n this._updateConfig();\n }\n get shippingRegion(): ShippingRegion | undefined {\n return this._shippingRegion;\n }\n\n get headers(): AuthReverbHeaders {\n return this._headers;\n }\n\n set displayCurrency(displayCurrency: DisplayCurrency) {\n Logger.debug(\"Setting display currency to: %s\", displayCurrency);\n\n this._displayCurrency = displayCurrency;\n this.updateHeaders();\n this._updateConfig();\n }\n get displayCurrency(): DisplayCurrency {\n return this._displayCurrency;\n }\n\n set version(version: ApiVersion) {\n Logger.debug(\"Setting API version to: %s\", version);\n\n this._version = version;\n this.updateHeaders();\n this._updateConfig();\n }\n get version(): ApiVersion {\n return this._version;\n }\n\n set rootEndpoint(rootEndpoint: RootEndpoint) {\n Logger.debug(\"Setting root endpoint to: %s\", rootEndpoint);\n\n this._rootEndpoint = rootEndpoint;\n this._updateConfig();\n }\n get rootEndpoint(): RootEndpoint {\n return this._rootEndpoint;\n }\n\n get config(): ReverbConfig {\n return this._config;\n }\n\n async _getArbitraryEndpoint<T = any>(\n url: string,\n params?: GetArbitraryEndpointOptions[\"params\"],\n ) {\n return getArbitraryEndpoint<T>(this._httpClient, this._config, {\n url,\n params,\n });\n }\n}\n","export * from './Reverb';\nexport * from './resources/ListingsResource';\nexport * from './resources/OrdersResource';\n\nimport Reverb from './Reverb';\n\nexport default Reverb;\n"],"mappings":"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","names":["LogLevel"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sound-tank",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "A library for interacting with the Reverb Marketplace API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -31,7 +31,5 @@
|
|
|
31
31
|
"vite": "^8.0.0",
|
|
32
32
|
"vitest": "^4.1.0"
|
|
33
33
|
},
|
|
34
|
-
"dependencies": {
|
|
35
|
-
"axios": "^1.13.6"
|
|
36
|
-
}
|
|
34
|
+
"dependencies": {}
|
|
37
35
|
}
|