keepa-api 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/resources/products/index.d.ts +1 -1
- package/dist/resources/products/index.d.ts.map +1 -1
- package/dist/resources/products/index.js +1 -1
- package/dist/resources/products/index.js.map +1 -1
- package/dist/resources/products/product.raw.type.d.ts +10 -2
- package/dist/resources/products/product.raw.type.d.ts.map +1 -1
- package/dist/resources/products/product.type.d.ts +1 -1
- package/dist/resources/products/product.type.d.ts.map +1 -1
- package/dist/resources/products/products.d.ts +0 -10
- package/dist/resources/products/products.d.ts.map +1 -1
- package/dist/resources/products/products.js +12 -21
- package/dist/resources/products/products.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -86,7 +86,7 @@ The SDK maps Keepa's raw wire shape into a friendlier `KeepaProduct`:
|
|
|
86
86
|
- `images: string[]` — full image URLs (region-neutral CDN). Replaces Keepa's awkward `imagesCSV` string.
|
|
87
87
|
- `bsr: number | null` — most recent real BSR for the product's `rootCategory`. `null` when missing or every history entry is Keepa's `-1` "no data captured" sentinel.
|
|
88
88
|
|
|
89
|
-
The raw `salesRanks` record is preserved for consumers that need to walk the full rank history. Other Keepa fields (`title`, `parentAsin`, `categoryTree`, `variations`, `
|
|
89
|
+
The raw `salesRanks` record is preserved for consumers that need to walk the full rank history. Other Keepa fields (`title`, `parentAsin`, `categoryTree`, `variations`, `features`, …) pass through unchanged.
|
|
90
90
|
|
|
91
91
|
**Stub records:** Keepa returns one record per requested ASIN even when it has no data — these stubs have `title === undefined`. Filter with `isFoundProduct` (below).
|
|
92
92
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Products, extractBsr,
|
|
1
|
+
export { Products, extractBsr, isFoundProduct } from './products.js';
|
|
2
2
|
export type { ProductListParams, KeepaProduct, KeepaVariation, KeepaVariationAttribute, KeepaCategoryNode, } from './product.type.js';
|
|
3
3
|
export { PRODUCT_PATH, PRODUCT_LIST_CONTEXT, DEFAULT_DAYS, AMAZON_IMAGE_BASE, KEEPA_NO_DATA_SENTINEL, } from './constant.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/resources/products/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/resources/products/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAErE,YAAY,EACV,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,eAAe,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { Products, extractBsr,
|
|
1
|
+
export { Products, extractBsr, isFoundProduct } from './products.js';
|
|
2
2
|
// NOTE: raw Keepa wire types (KeepaProductRaw, KeepaProductResponseRaw) are
|
|
3
3
|
// intentionally NOT re-exported. They are an implementation detail — Products.list
|
|
4
4
|
// maps them to the consumer-friendly KeepaProduct shape before returning.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resources/products/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resources/products/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAUrE,4EAA4E;AAC5E,mFAAmF;AACnF,0EAA0E;AAE1E,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,eAAe,CAAC"}
|
|
@@ -10,6 +10,14 @@ export interface KeepaVariationRaw {
|
|
|
10
10
|
asin: string;
|
|
11
11
|
attributes?: KeepaVariationAttributeRaw[];
|
|
12
12
|
}
|
|
13
|
+
export interface KeepaImageRaw {
|
|
14
|
+
l: string;
|
|
15
|
+
lH: number;
|
|
16
|
+
lW: number;
|
|
17
|
+
m: string;
|
|
18
|
+
mH: number;
|
|
19
|
+
mW: number;
|
|
20
|
+
}
|
|
13
21
|
export interface KeepaProductRaw {
|
|
14
22
|
asin: string;
|
|
15
23
|
title?: string;
|
|
@@ -18,9 +26,9 @@ export interface KeepaProductRaw {
|
|
|
18
26
|
categoryTree?: KeepaCategoryNodeRaw[];
|
|
19
27
|
rootCategory?: number;
|
|
20
28
|
salesRanks?: Record<string, number[]>;
|
|
21
|
-
|
|
29
|
+
images?: KeepaImageRaw[];
|
|
22
30
|
variations?: KeepaVariationRaw[];
|
|
23
|
-
|
|
31
|
+
features?: string[];
|
|
24
32
|
}
|
|
25
33
|
export interface KeepaProductResponseRaw {
|
|
26
34
|
products?: KeepaProductRaw[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.raw.type.d.ts","sourceRoot":"","sources":["../../../src/resources/products/product.raw.type.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,0BAA0B,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,
|
|
1
|
+
{"version":3,"file":"product.raw.type.d.ts","sourceRoot":"","sources":["../../../src/resources/products/product.raw.type.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,0BAA0B,EAAE,CAAC;CAC3C;AAID,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B"}
|
|
@@ -31,7 +31,7 @@ export interface KeepaProduct {
|
|
|
31
31
|
rootCategory?: number;
|
|
32
32
|
salesRanks?: Record<string, number[]>;
|
|
33
33
|
variations?: KeepaVariation[];
|
|
34
|
-
|
|
34
|
+
features?: string[];
|
|
35
35
|
/** Full image URLs derived from imagesCSV using a region-neutral Amazon CDN. */
|
|
36
36
|
images: string[];
|
|
37
37
|
/** Most recent real BSR for the rootCategory. Null when missing or every entry is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.type.d.ts","sourceRoot":"","sources":["../../../src/resources/products/product.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wEAAwE;IACxE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACxC;AAED;;;+DAG+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,
|
|
1
|
+
{"version":3,"file":"product.type.d.ts","sourceRoot":"","sources":["../../../src/resources/products/product.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wEAAwE;IACxE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACxC;AAED;;;+DAG+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,gFAAgF;IAChF,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB;oDACgD;IAChD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB"}
|
|
@@ -12,20 +12,10 @@ export declare class Products extends APIResource {
|
|
|
12
12
|
* returning a placeholder title), tighten this predicate to also require
|
|
13
13
|
* `categoryTree` or another non-string field. */
|
|
14
14
|
export declare function isFoundProduct(product: KeepaProduct): boolean;
|
|
15
|
-
/** Build the full image-URL list from a Keepa imagesCSV string. Region-neutral CDN.
|
|
16
|
-
* Filters out entries that don't look like image filenames (path traversal,
|
|
17
|
-
* arbitrary extensions, etc.) — defense in case the CSV is ever influenced by
|
|
18
|
-
* untrusted input. Most consumers won't need this directly: `Products.list`
|
|
19
|
-
* already fills `images[]` on every returned product. */
|
|
20
|
-
export declare function parseImagesCsv(imagesCSV: string | undefined): string[];
|
|
21
15
|
/** Extract the most recent real BSR from Keepa's `[ts, rank, ts, rank, ...]` salesRanks array.
|
|
22
16
|
* Walks backward through rank entries (odd indices) and skips Keepa's `-1` sentinel which
|
|
23
17
|
* marks "no data captured at that timestamp". Returns `null` if every entry is sentinel.
|
|
24
18
|
* Most consumers won't need this — `Products.list` already fills `bsr` on every returned
|
|
25
19
|
* product. Useful when working with a raw Keepa response. */
|
|
26
20
|
export declare function extractBsr(salesRanks: Record<string, number[]> | undefined, rootCategory: number | undefined): number | null;
|
|
27
|
-
/** Build a single Amazon image URL from the first entry in Keepa's imagesCSV.
|
|
28
|
-
* Equivalent to `parseImagesCsv(imagesCSV)[0] ?? null`. Useful when working with
|
|
29
|
-
* a raw Keepa response. */
|
|
30
|
-
export declare function extractImageUrl(imagesCSV: string | undefined): string | null;
|
|
31
21
|
//# sourceMappingURL=products.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../src/resources/products/products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAWrD,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["../../../src/resources/products/products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAWrD,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAOzE,qBAAa,QAAS,SAAQ,WAAW;IACjC,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAuB/D;AA6BD;;;;;;;kDAOkD;AAClD,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAE7D;AAED;;;;8DAI8D;AAC9D,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,EAChD,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,MAAM,GAAG,IAAI,CAaf"}
|
|
@@ -36,11 +36,21 @@ function toKeepaProduct(raw) {
|
|
|
36
36
|
rootCategory: raw.rootCategory,
|
|
37
37
|
salesRanks: raw.salesRanks,
|
|
38
38
|
variations: raw.variations,
|
|
39
|
-
|
|
40
|
-
images:
|
|
39
|
+
features: raw.features,
|
|
40
|
+
images: rawImagesToUrls(raw.images),
|
|
41
41
|
bsr: extractBsr(raw.salesRanks, raw.rootCategory),
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
+
/** Convert Keepa's raw images array into full Amazon image URLs (the large
|
|
45
|
+
* variant). Filters entries whose filename doesn't match the expected
|
|
46
|
+
* alphanumeric image-name pattern as defense-in-depth. */
|
|
47
|
+
function rawImagesToUrls(images) {
|
|
48
|
+
if (!images || images.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
return images
|
|
51
|
+
.filter((img) => typeof img.l === 'string' && VALID_IMAGE_FILENAME.test(img.l))
|
|
52
|
+
.map((img) => `${AMAZON_IMAGE_BASE}/${img.l}`);
|
|
53
|
+
}
|
|
44
54
|
/** Returns true when Keepa returned an actual product record (not just a stub
|
|
45
55
|
* for an unknown ASIN). Use as a `.filter()` predicate to drop empty matches.
|
|
46
56
|
*
|
|
@@ -52,19 +62,6 @@ function toKeepaProduct(raw) {
|
|
|
52
62
|
export function isFoundProduct(product) {
|
|
53
63
|
return typeof product.title === 'string' && product.title.length > 0;
|
|
54
64
|
}
|
|
55
|
-
/** Build the full image-URL list from a Keepa imagesCSV string. Region-neutral CDN.
|
|
56
|
-
* Filters out entries that don't look like image filenames (path traversal,
|
|
57
|
-
* arbitrary extensions, etc.) — defense in case the CSV is ever influenced by
|
|
58
|
-
* untrusted input. Most consumers won't need this directly: `Products.list`
|
|
59
|
-
* already fills `images[]` on every returned product. */
|
|
60
|
-
export function parseImagesCsv(imagesCSV) {
|
|
61
|
-
if (!imagesCSV)
|
|
62
|
-
return [];
|
|
63
|
-
return imagesCSV
|
|
64
|
-
.split(',')
|
|
65
|
-
.filter((entry) => VALID_IMAGE_FILENAME.test(entry))
|
|
66
|
-
.map((filename) => `${AMAZON_IMAGE_BASE}/${filename}`);
|
|
67
|
-
}
|
|
68
65
|
/** Extract the most recent real BSR from Keepa's `[ts, rank, ts, rank, ...]` salesRanks array.
|
|
69
66
|
* Walks backward through rank entries (odd indices) and skips Keepa's `-1` sentinel which
|
|
70
67
|
* marks "no data captured at that timestamp". Returns `null` if every entry is sentinel.
|
|
@@ -87,10 +84,4 @@ export function extractBsr(salesRanks, rootCategory) {
|
|
|
87
84
|
}
|
|
88
85
|
return null;
|
|
89
86
|
}
|
|
90
|
-
/** Build a single Amazon image URL from the first entry in Keepa's imagesCSV.
|
|
91
|
-
* Equivalent to `parseImagesCsv(imagesCSV)[0] ?? null`. Useful when working with
|
|
92
|
-
* a raw Keepa response. */
|
|
93
|
-
export function extractImageUrl(imagesCSV) {
|
|
94
|
-
return parseImagesCsv(imagesCSV)[0] ?? null;
|
|
95
|
-
}
|
|
96
87
|
//# sourceMappingURL=products.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/resources/products/products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/resources/products/products.ts"],"names":[],"mappings":"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"}
|