@bowmark/web 1.5.0 → 1.6.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/package.json +1 -1
- package/src/generated/library.d.ts +898 -15
- package/src/generated/validators.ts +425 -21
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// rather than imported. An `import` or `export` at the top level of this file would
|
|
6
6
|
// turn it into a module and every declaration below would stop being global.
|
|
7
7
|
//
|
|
8
|
-
// Manifest version:
|
|
9
|
-
// 8 capabilities,
|
|
8
|
+
// Manifest version: 5426792a92faf41fd663aa77ef068ec2f38bcc28d33426a6a565458c7a3b4c42
|
|
9
|
+
// 8 capabilities, 95 providers, 316 typed functions, 20 refused.
|
|
10
10
|
// 51,713 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
|
|
11
11
|
//
|
|
12
12
|
// REFUSED — these functions are real and callable, and their declared arguments
|
|
@@ -2103,6 +2103,71 @@ interface BmwusaModelListing {
|
|
|
2103
2103
|
}
|
|
2104
2104
|
}
|
|
2105
2105
|
|
|
2106
|
+
declare namespace BowmarkProvider_bykoket {
|
|
2107
|
+
// ── KOKET — the unit's own declarations, verbatim ──
|
|
2108
|
+
interface KoketProductSummary {
|
|
2109
|
+
id: string;
|
|
2110
|
+
name: string;
|
|
2111
|
+
url: string;
|
|
2112
|
+
price: number;
|
|
2113
|
+
currency: string;
|
|
2114
|
+
inStock: boolean;
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
interface KoketProduct {
|
|
2118
|
+
id: string;
|
|
2119
|
+
name: string;
|
|
2120
|
+
url: string;
|
|
2121
|
+
reference: string;
|
|
2122
|
+
price: number;
|
|
2123
|
+
priceFormatted: string;
|
|
2124
|
+
listPrice: number;
|
|
2125
|
+
onSale: boolean;
|
|
2126
|
+
currency: string;
|
|
2127
|
+
inStock: boolean;
|
|
2128
|
+
quantityLeft: number | null;
|
|
2129
|
+
availabilityMessage: string;
|
|
2130
|
+
description: string;
|
|
2131
|
+
images: string[];
|
|
2132
|
+
}
|
|
2133
|
+
|
|
2134
|
+
interface KoketAddToCartHandoff {
|
|
2135
|
+
id: string;
|
|
2136
|
+
name: string;
|
|
2137
|
+
url: string;
|
|
2138
|
+
price: number;
|
|
2139
|
+
currency: string;
|
|
2140
|
+
inStock: boolean;
|
|
2141
|
+
note: string;
|
|
2142
|
+
}
|
|
2143
|
+
|
|
2144
|
+
/**
|
|
2145
|
+
* Reads KOKET's public furniture, lighting and textiles storefront (bykoket.com/shop) — search
|
|
2146
|
+
* the catalog, read a product's live price, stock and description, and get the handoff to add
|
|
2147
|
+
* it to cart on the real site.
|
|
2148
|
+
*/
|
|
2149
|
+
interface Unit {
|
|
2150
|
+
/**
|
|
2151
|
+
* Searches KOKET's live public catalog (furniture, lighting, textiles) and returns each
|
|
2152
|
+
* match's id, name, product URL, price and stock status.
|
|
2153
|
+
*/
|
|
2154
|
+
searchProducts(query: string): Promise<KoketProductSummary[]>;
|
|
2155
|
+
|
|
2156
|
+
/**
|
|
2157
|
+
* Reads one KOKET product's live page — price (list and current, since KOKET runs promotions),
|
|
2158
|
+
* stock count, availability message, description and images.
|
|
2159
|
+
*/
|
|
2160
|
+
getProduct(idOrUrl: string): Promise<KoketProduct>;
|
|
2161
|
+
|
|
2162
|
+
/**
|
|
2163
|
+
* Hands back the shopper's own KOKET product page — the exact Add to cart button for this
|
|
2164
|
+
* product — since the site's cart requires a per-session token nobody but the shopper can
|
|
2165
|
+
* supply. Writes nothing.
|
|
2166
|
+
*/
|
|
2167
|
+
addToCart(idOrUrl: string): Promise<KoketAddToCartHandoff>;
|
|
2168
|
+
}
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2106
2171
|
declare namespace BowmarkProvider_cancer {
|
|
2107
2172
|
// ── National Cancer Institute (cancer.gov) — the unit's own declarations, verbatim ──
|
|
2108
2173
|
type cancerCenterDesignation =
|
|
@@ -3957,6 +4022,50 @@ interface ExtraspaceUnitAvailability {
|
|
|
3957
4022
|
}
|
|
3958
4023
|
}
|
|
3959
4024
|
|
|
4025
|
+
declare namespace BowmarkProvider_firstdibs {
|
|
4026
|
+
// ── 1stDibs — the unit's own declarations, verbatim ──
|
|
4027
|
+
interface FirstdibsSearchResult {
|
|
4028
|
+
name: string;
|
|
4029
|
+
url: string;
|
|
4030
|
+
price: number;
|
|
4031
|
+
priceCurrency: string;
|
|
4032
|
+
availability: string;
|
|
4033
|
+
image: string | null;
|
|
4034
|
+
}
|
|
4035
|
+
interface FirstdibsCompletingAction {
|
|
4036
|
+
makeOffer: boolean;
|
|
4037
|
+
contactSeller: boolean;
|
|
4038
|
+
purchase: false;
|
|
4039
|
+
}
|
|
4040
|
+
interface FirstdibsListing {
|
|
4041
|
+
name: string;
|
|
4042
|
+
url: string;
|
|
4043
|
+
description: string;
|
|
4044
|
+
brand: string | null;
|
|
4045
|
+
price: number;
|
|
4046
|
+
priceCurrency: string;
|
|
4047
|
+
completingAction: FirstdibsCompletingAction;
|
|
4048
|
+
}
|
|
4049
|
+
|
|
4050
|
+
/**
|
|
4051
|
+
* Search 1stDibs' luxury/vintage marketplace and read a listing's real price plus its concrete
|
|
4052
|
+
* completing action (Make an Offer / Contact Seller) — no login.
|
|
4053
|
+
*/
|
|
4054
|
+
interface Unit {
|
|
4055
|
+
/**
|
|
4056
|
+
* Runs 1stDibs' keyword search (or a category-facet URL) and returns real listings with real
|
|
4057
|
+
* price, currency, availability and url.
|
|
4058
|
+
*/
|
|
4059
|
+
search(query: string): Promise<FirstdibsSearchResult[]>;
|
|
4060
|
+
|
|
4061
|
+
/**
|
|
4062
|
+
* Reads one listing's real price and its concrete completing action(s) — Make an Offer and/or
|
|
4063
|
+
* Contact Seller, whichever this seller has enabled.
|
|
4064
|
+
*/
|
|
4065
|
+
getListing(url: string): Promise<FirstdibsListing>;
|
|
4066
|
+
}
|
|
4067
|
+
}
|
|
4068
|
+
|
|
3960
4069
|
declare namespace BowmarkProvider_flightradar24 {
|
|
3961
4070
|
// ── Flightradar24 — the unit's own declarations, verbatim ──
|
|
3962
4071
|
interface flightradar24Airline {
|
|
@@ -5110,6 +5219,79 @@ interface graingerStockRow {
|
|
|
5110
5219
|
}
|
|
5111
5220
|
}
|
|
5112
5221
|
|
|
5222
|
+
declare namespace BowmarkProvider_hauslabs {
|
|
5223
|
+
// ── Haus Labs by Lady Gaga — the unit's own declarations, verbatim ──
|
|
5224
|
+
interface HauslabsVariant {
|
|
5225
|
+
id: string;
|
|
5226
|
+
title: string;
|
|
5227
|
+
price: string;
|
|
5228
|
+
compareAtPrice: string | null;
|
|
5229
|
+
sku: string | null;
|
|
5230
|
+
available: boolean;
|
|
5231
|
+
options: string[];
|
|
5232
|
+
}
|
|
5233
|
+
interface HauslabsProduct {
|
|
5234
|
+
handle: string;
|
|
5235
|
+
title: string;
|
|
5236
|
+
vendor: string;
|
|
5237
|
+
productType: string;
|
|
5238
|
+
url: string;
|
|
5239
|
+
descriptionHtml: string | null;
|
|
5240
|
+
optionNames: string[];
|
|
5241
|
+
variants: HauslabsVariant[];
|
|
5242
|
+
priceRange: { min: string; max: string } | null;
|
|
5243
|
+
inStock: boolean;
|
|
5244
|
+
tags: string[];
|
|
5245
|
+
images: string[];
|
|
5246
|
+
}
|
|
5247
|
+
interface HauslabsShadeMatch {
|
|
5248
|
+
quiz: { family: string; depth: string; undertone: string; hasAddOne: boolean };
|
|
5249
|
+
variant: {
|
|
5250
|
+
number: number;
|
|
5251
|
+
family: string;
|
|
5252
|
+
sku: string | null;
|
|
5253
|
+
price: string;
|
|
5254
|
+
available: boolean;
|
|
5255
|
+
};
|
|
5256
|
+
product: HauslabsProduct;
|
|
5257
|
+
warnings: string[];
|
|
5258
|
+
}
|
|
5259
|
+
|
|
5260
|
+
/**
|
|
5261
|
+
* Haus Labs by Lady Gaga product catalogue — every clean-beauty SKU, its variants, its prices
|
|
5262
|
+
* and what is in stock — read off the live Shopify Plus storefront. The Foundation Shade
|
|
5263
|
+
* Finder is the broadcast wedge: a multi-step quiz ChatGPT cannot operate, mapped locally to
|
|
5264
|
+
* one specific priced shade with the buy-page handoff.
|
|
5265
|
+
*/
|
|
5266
|
+
interface Unit {
|
|
5267
|
+
/**
|
|
5268
|
+
* Reads the live Haus Labs catalogue as the storefront publishes it — every product, its
|
|
5269
|
+
* handle, title, vendor, description, tags, images and the per-variant price the storefront is
|
|
5270
|
+
* quoting right now. Optional productType narrows to FACE / LIPS / EYES / SETS / etc. before
|
|
5271
|
+
* the limit. Returns [] on a transport failure (warnings would be on an object envelope; this
|
|
5272
|
+
* is a list). The catalog page is the line and the parse is the unit of work.
|
|
5273
|
+
*/
|
|
5274
|
+
listHauslabsProducts(opts?: { limit?: number; productType?: string }): Promise<HauslabsProduct[]>;
|
|
5275
|
+
|
|
5276
|
+
/**
|
|
5277
|
+
* Reads one product by its handle — every variant, its exact price, the image the storefront
|
|
5278
|
+
* is showing and whether that specific variant is purchasable right now. Takes the handle
|
|
5279
|
+
* listHauslabsProducts returns. THROWS on an unknown handle (the store answers a real 404).
|
|
5280
|
+
*/
|
|
5281
|
+
getHauslabsProduct(handle: string): Promise<HauslabsProduct>;
|
|
5282
|
+
|
|
5283
|
+
/**
|
|
5284
|
+
* Resolves a buyer's Foundation Lab quiz answers to ONE specific shade: the variant title, the
|
|
5285
|
+
* SKU, the real price, the availability, the buy-page URL. Mirrors the quiz's `shadeLogic`
|
|
5286
|
+
* decision tree natively against Cartful Solutions' published `pd.json` (keyless, browserless)
|
|
5287
|
+
* and resolves the matching variant through /products/<handle>.js for live price and stock.
|
|
5288
|
+
* The quiz is a 5-step Shopify section ChatGPT cannot operate on the buyer's behalf; this
|
|
5289
|
+
* function returns the single shade the quiz's terminal page renders for the same inputs.
|
|
5290
|
+
*/
|
|
5291
|
+
runFoundationShadeFinder(input: { family: 'Deep' | 'Medium Deep' | 'Medium' | 'Light Medium' | 'Light' | 'Fair'; depth: 'deeper' | 'medium' | 'lighter'; undertone: 'warm' | 'cool' | 'neutral' | 'rosy' | 'golden'; hasAddOne?: boolean }): Promise<HauslabsShadeMatch>;
|
|
5292
|
+
}
|
|
5293
|
+
}
|
|
5294
|
+
|
|
5113
5295
|
declare namespace BowmarkProvider_healthcare_gov {
|
|
5114
5296
|
// ── HealthCare.gov — the unit's own declarations, verbatim ──
|
|
5115
5297
|
interface healthcare_govPlan {
|
|
@@ -7976,6 +8158,80 @@ interface LululemonVariant {
|
|
|
7976
8158
|
available: boolean;
|
|
7977
8159
|
price: number | null;
|
|
7978
8160
|
salePrice: number | null;
|
|
8161
|
+
/** Why this SKU's price is, or is not, a markdown. Derived from price and
|
|
8162
|
+
* salePrice, so it can never disagree with them. */
|
|
8163
|
+
sale: SaleEvidence;
|
|
8164
|
+
}
|
|
8165
|
+
interface SaleEvidence {
|
|
8166
|
+
/** True only with retailer evidence. NEVER from a low price or a title. */
|
|
8167
|
+
onSale: boolean;
|
|
8168
|
+
currentPrice: number | null;
|
|
8169
|
+
/** The list price, when the markdown is against one. */
|
|
8170
|
+
originalPrice: number | null;
|
|
8171
|
+
/** ISO 4217, or null. ALWAYS null here: this feed publishes bare numbers with
|
|
8172
|
+
* no currency code anywhere in the payload. */
|
|
8173
|
+
currency: string | null;
|
|
8174
|
+
promotionMessage: string | null;
|
|
8175
|
+
evidenceType: "compare_at_price" | "sale_price" | "retailer_sale_badge" | "published_promotion" | "none";
|
|
8176
|
+
/** The retailer text or field the classification rests on, verbatim. */
|
|
8177
|
+
evidenceText: string | null;
|
|
8178
|
+
}
|
|
8179
|
+
interface ProductImage {
|
|
8180
|
+
/** Absolute HTTPS url. */
|
|
8181
|
+
url: string;
|
|
8182
|
+
altText: string | null;
|
|
8183
|
+
/** The colourway's own colour — sound because lululemon publishes its image
|
|
8184
|
+
* list PER COLOURWAY, so every picture in it is that colour by construction. */
|
|
8185
|
+
color: string | null;
|
|
8186
|
+
colorId: string | null;
|
|
8187
|
+
/** Always [] here: this feed links a picture to a COLOUR, never to a size. */
|
|
8188
|
+
variantIds: string[];
|
|
8189
|
+
}
|
|
8190
|
+
/** The retailer's own labels. On this door that is audience and nothing else —
|
|
8191
|
+
* the HPDP feed publishes no description, tags, fabric, collection or category.
|
|
8192
|
+
* Every other field is null or [], honestly. */
|
|
8193
|
+
interface PublishedProductAttributes {
|
|
8194
|
+
audience: string | null;
|
|
8195
|
+
garmentType: "sports_bra" | "tank" | "crop_top" | "leggings" | "shorts" | "other" | null;
|
|
8196
|
+
categories: string[];
|
|
8197
|
+
collections: string[];
|
|
8198
|
+
fabrics: string[];
|
|
8199
|
+
materials: string[];
|
|
8200
|
+
color: string | null;
|
|
8201
|
+
colorFamily: string | null;
|
|
8202
|
+
pattern: string | null;
|
|
8203
|
+
styleTags: string[];
|
|
8204
|
+
neckline: string | null;
|
|
8205
|
+
strapWidth: string | null;
|
|
8206
|
+
backDesign: string | null;
|
|
8207
|
+
sleeveLength: string | null;
|
|
8208
|
+
rise: string | null;
|
|
8209
|
+
waistband: string | null;
|
|
8210
|
+
inseam: string | null;
|
|
8211
|
+
legShape: string | null;
|
|
8212
|
+
fit: string | null;
|
|
8213
|
+
coverage: string | null;
|
|
8214
|
+
}
|
|
8215
|
+
/** Shared colour and family — what makes two pieces PLAUSIBLY coordinate. None
|
|
8216
|
+
* of it establishes a set. */
|
|
8217
|
+
interface CoordinationMetadata {
|
|
8218
|
+
collectionNames: string[];
|
|
8219
|
+
fabricNames: string[];
|
|
8220
|
+
colorName: string | null;
|
|
8221
|
+
colorId: string | null;
|
|
8222
|
+
colorFamily: string | null;
|
|
8223
|
+
productFamily: string | null;
|
|
8224
|
+
}
|
|
8225
|
+
/** An EXPLICIT retailer-published relationship. ALWAYS [] on this door: the feed's
|
|
8226
|
+
* only product-to-product relation is the ALGORITHMIC similarity rail, which is
|
|
8227
|
+
* getSimilarProducts. Reading that as a set would turn "the recommender put these
|
|
8228
|
+
* near each other" into "lululemon sells these together". */
|
|
8229
|
+
interface RetailerSetEvidence {
|
|
8230
|
+
evidenceType: "official_set" | "shop_the_set" | "complete_the_look" | "matching_piece";
|
|
8231
|
+
evidenceText: string | null;
|
|
8232
|
+
sourceUrl: string | null;
|
|
8233
|
+
setId: string | null;
|
|
8234
|
+
relatedProducts: Array<{ productId: string | null; handle: string | null; title: string | null; url: string | null }>;
|
|
7979
8235
|
}
|
|
7980
8236
|
interface LululemonOptionGroup {
|
|
7981
8237
|
/** The machine name. "size" on every lululemon product measured. */
|
|
@@ -7997,6 +8253,13 @@ interface LululemonColorway {
|
|
|
7997
8253
|
url: string;
|
|
7998
8254
|
swatchImage: string | null;
|
|
7999
8255
|
images: string[];
|
|
8256
|
+
/** The SAME pictures as images, carrying this colourway's colour and colorId.
|
|
8257
|
+
* images stays a bare string[] for existing callers; this is the additive half. */
|
|
8258
|
+
imageAssets: ProductImage[];
|
|
8259
|
+
sale: SaleEvidence;
|
|
8260
|
+
coordination: CoordinationMetadata;
|
|
8261
|
+
/** ISO 4217, or null. Always null — see SaleEvidence.currency. */
|
|
8262
|
+
currency: string | null;
|
|
8000
8263
|
inStock: boolean;
|
|
8001
8264
|
optionGroups: LululemonOptionGroup[];
|
|
8002
8265
|
/** What can be BOUGHT in this colour right now — not the full size run. */
|
|
@@ -8024,6 +8287,37 @@ interface LululemonProduct {
|
|
|
8024
8287
|
/** Other lengths of the same style. Empty on every product measured — on this
|
|
8025
8288
|
* site an inseam is its OWN product, not an option. */
|
|
8026
8289
|
sizeTypes: LululemonSizeType[];
|
|
8290
|
+
attributes: PublishedProductAttributes;
|
|
8291
|
+
coordination: CoordinationMetadata;
|
|
8292
|
+
retailerSetEvidence: RetailerSetEvidence[];
|
|
8293
|
+
}
|
|
8294
|
+
/** One published product-detail block from the page, verbatim. */
|
|
8295
|
+
interface LululemonFeature {
|
|
8296
|
+
heading: string;
|
|
8297
|
+
body: string;
|
|
8298
|
+
}
|
|
8299
|
+
/** What lululemon's OWN product page publishes about a garment, which the
|
|
8300
|
+
* third-party pricing door does not carry at all. */
|
|
8301
|
+
interface LululemonProductAttributes {
|
|
8302
|
+
productId: string;
|
|
8303
|
+
url: string;
|
|
8304
|
+
title: string;
|
|
8305
|
+
/** The site's own ProductGroup category, e.g. "Leggings". */
|
|
8306
|
+
category: string | null;
|
|
8307
|
+
description: string | null;
|
|
8308
|
+
/** Trademarked fabric names off the detail accordion, e.g. ["Nulu"]. */
|
|
8309
|
+
fabrics: string[];
|
|
8310
|
+
fit: string | null;
|
|
8311
|
+
/** "High-Rise" / "Mid-Rise" / "Low-Rise", as the title spells it. */
|
|
8312
|
+
rise: string | null;
|
|
8313
|
+
/** Every detail block, unmapped and in page order. */
|
|
8314
|
+
features: LululemonFeature[];
|
|
8315
|
+
/** The site's own aggregate — the honest one. The pricing door reports 0
|
|
8316
|
+
* reviews on products whose live page shows 22,748. */
|
|
8317
|
+
ratingValue: number | null;
|
|
8318
|
+
reviewCount: number | null;
|
|
8319
|
+
/** What could not be reached. Non-empty means the page refused. */
|
|
8320
|
+
warnings: string[];
|
|
8027
8321
|
}
|
|
8028
8322
|
interface LululemonRow {
|
|
8029
8323
|
id: string;
|
|
@@ -8079,6 +8373,19 @@ interface LululemonSimilarProducts {
|
|
|
8079
8373
|
*/
|
|
8080
8374
|
getProduct(query: { productId: string }): Promise<LululemonProduct>;
|
|
8081
8375
|
|
|
8376
|
+
/**
|
|
8377
|
+
* Reads what lululemon's OWN product page publishes about a garment and the third-party
|
|
8378
|
+
* pricing door does not carry at all: the category the site files it under, the collection
|
|
8379
|
+
* description, the trademarked fabric it is cut from, the fit and the rise, its real review
|
|
8380
|
+
* aggregate, and every product-detail block verbatim. This is the expensive door on this
|
|
8381
|
+
* provider — a headed Google Chrome, ~10-20x the latency of `getProduct` — so call it when the
|
|
8382
|
+
* ATTRIBUTES are the answer and `getProduct` when the price, colourways and sizes are. It
|
|
8383
|
+
* never throws on a refused page: a page that will not render comes back with every field
|
|
8384
|
+
* empty and a `warnings` entry naming it, so an empty `fabrics` is distinguishable from an
|
|
8385
|
+
* unread one.
|
|
8386
|
+
*/
|
|
8387
|
+
getProductAttributes(query: { productId: string }): Promise<LululemonProductAttributes>;
|
|
8388
|
+
|
|
8082
8389
|
/**
|
|
8083
8390
|
* Returns the products lululemon's own product pages recommend alongside one product — the
|
|
8084
8391
|
* 'You may also like' rail — as priced rows in the store's own ranked order, de-duplicated to
|
|
@@ -8091,6 +8398,82 @@ interface LululemonSimilarProducts {
|
|
|
8091
8398
|
}
|
|
8092
8399
|
}
|
|
8093
8400
|
|
|
8401
|
+
declare namespace BowmarkProvider_maidenhome {
|
|
8402
|
+
// ── Maiden Home — the unit's own declarations, verbatim ──
|
|
8403
|
+
// Maiden Home's OWN shapes — not a capability contract.
|
|
8404
|
+
|
|
8405
|
+
interface MaidenHomeVariant {
|
|
8406
|
+
productHandle: string;
|
|
8407
|
+
productTitle: string;
|
|
8408
|
+
productType: string; // e.g. "Sofa", "Modular Component", "Dining Table"
|
|
8409
|
+
size: string; // e.g. "85\" Width", or a non-numeric value like "Right-Facing Chaise"
|
|
8410
|
+
woodFinish: string; // e.g. "Driftwood Ash"
|
|
8411
|
+
sku: string;
|
|
8412
|
+
price: number;
|
|
8413
|
+
priceFormatted: string;
|
|
8414
|
+
available: boolean;
|
|
8415
|
+
url: string; // the product page, preselecting this exact variant
|
|
8416
|
+
}
|
|
8417
|
+
|
|
8418
|
+
interface MaidenHomeConfiguratorProduct {
|
|
8419
|
+
handle: string;
|
|
8420
|
+
title: string;
|
|
8421
|
+
productType: string;
|
|
8422
|
+
url: string;
|
|
8423
|
+
sizeOptions: string[];
|
|
8424
|
+
woodFinishOptions: string[];
|
|
8425
|
+
priceRange: { min: number; max: number };
|
|
8426
|
+
variants: MaidenHomeVariant[];
|
|
8427
|
+
}
|
|
8428
|
+
|
|
8429
|
+
interface MaidenHomeVariantResolution {
|
|
8430
|
+
productQuery: string;
|
|
8431
|
+
size: string;
|
|
8432
|
+
woodFinish: string;
|
|
8433
|
+
matched: boolean;
|
|
8434
|
+
variant: MaidenHomeVariant | null;
|
|
8435
|
+
candidates: MaidenHomeVariant[]; // populated when not narrowed to exactly one real variant
|
|
8436
|
+
message: string;
|
|
8437
|
+
}
|
|
8438
|
+
|
|
8439
|
+
/**
|
|
8440
|
+
* Maiden Home's Size x Wood Finish product configurator (sofas, sectionals/modular components,
|
|
8441
|
+
* tables) — list every configurable product, read one product's complete priced variant grid,
|
|
8442
|
+
* and resolve a free-text product + size + wood finish to the exact live price and SKU, off
|
|
8443
|
+
* the storefront's own live catalog rather than a researched estimate or a hedged price range.
|
|
8444
|
+
*/
|
|
8445
|
+
interface Unit {
|
|
8446
|
+
/**
|
|
8447
|
+
* Lists every Maiden Home product configurable by Size x Wood Finish (sofas,
|
|
8448
|
+
* sectionals/modular components, tables) from the storefront's own live catalog — every size
|
|
8449
|
+
* and wood-finish option, its live price range and variant count. `query` (optional) narrows
|
|
8450
|
+
* the list by a fuzzy match on the product title or product type, e.g. "chelsea" or "dining
|
|
8451
|
+
* table".
|
|
8452
|
+
*/
|
|
8453
|
+
searchConfigurations(query?: string): Promise<MaidenHomeConfiguratorProduct[]>;
|
|
8454
|
+
|
|
8455
|
+
/**
|
|
8456
|
+
* Reads one configurator product's complete Size x Wood Finish variant grid — a handle, e.g.
|
|
8457
|
+
* "the-chelsea-sofa-heritage-belgian-linen-lake" — every size x finish combination, each with
|
|
8458
|
+
* its own exact live price, SKU and availability. THROWS on an unrecognized handle, naming
|
|
8459
|
+
* searchConfigurations() as the way to find current ones.
|
|
8460
|
+
*/
|
|
8461
|
+
getProduct(handle: string): Promise<MaidenHomeConfiguratorProduct>;
|
|
8462
|
+
|
|
8463
|
+
/**
|
|
8464
|
+
* Resolves a free-text product (e.g. "Chelsea Sofa Heritage Belgian Linen Lake"), size (e.g.
|
|
8465
|
+
* "85\"") and wood finish (e.g. "Driftwood Ash") to the exact priced variant and its product
|
|
8466
|
+
* URL, mirroring the on-page configurator's own selection flow. `matched: true` with a
|
|
8467
|
+
* populated `variant` means exactly one real variant narrowed to; otherwise `candidates` lists
|
|
8468
|
+
* every real variant the product query DID match, so a caller can narrow with an exact
|
|
8469
|
+
* size/finish rather than guessing again. Never throws for an ambiguous or zero match — an
|
|
8470
|
+
* unmatched product name is the one case this DOES treat as a caller error (throws, naming
|
|
8471
|
+
* searchConfigurations()).
|
|
8472
|
+
*/
|
|
8473
|
+
resolveVariant(productQuery: string, size: string, woodFinish: string): Promise<MaidenHomeVariantResolution>;
|
|
8474
|
+
}
|
|
8475
|
+
}
|
|
8476
|
+
|
|
8094
8477
|
declare namespace BowmarkProvider_mailchimp {
|
|
8095
8478
|
// ── Mailchimp — the unit's own declarations, verbatim ──
|
|
8096
8479
|
interface mailchimpPlanTier {
|
|
@@ -9980,13 +10363,30 @@ interface PaypalFeeSchedule {
|
|
|
9980
10363
|
sourceUrl: string;
|
|
9981
10364
|
tables: PaypalFeeTable[];
|
|
9982
10365
|
}
|
|
10366
|
+
type PaypalConversionKind = "goodsOrServices" | "personal" | "payouts" | "other";
|
|
10367
|
+
interface PaypalCurrencyConversionCitation {
|
|
10368
|
+
documentId: string; // the CMS table id this figure came from, e.g. "FEETB26"
|
|
10369
|
+
feeDataKey: string; // the exact published value used, e.g. "4.00%"
|
|
10370
|
+
internalName: string;
|
|
10371
|
+
}
|
|
10372
|
+
interface PaypalGetCurrencyConversionQuoteArgs {
|
|
10373
|
+
kind?: PaypalConversionKind; // "goodsOrServices" | "personal" | "payouts" | "other"
|
|
10374
|
+
audience?: "consumer"; // defaults to "consumer"; merchant is a separate, unverified page
|
|
10375
|
+
country?: string; // ISO 3166-1 alpha-2, defaults to "us"; only "us" is verified end-to-end
|
|
10376
|
+
}
|
|
10377
|
+
interface PaypalCurrencyConversionQuote {
|
|
10378
|
+
kind: PaypalConversionKind; // which PayPal-conversion context the spread applies to
|
|
10379
|
+
paypalSpread: number; // 0.04 for goodsOrServices/personal/payouts; 0.03 for "other"
|
|
10380
|
+
citations: { paypal: PaypalCurrencyConversionCitation };
|
|
10381
|
+
}
|
|
9983
10382
|
|
|
9984
10383
|
/**
|
|
9985
10384
|
* PayPal's public, signed-out surfaces: the published consumer and merchant fee schedules, the
|
|
9986
|
-
* fee on one concrete personal (friends-and-family) transaction,
|
|
9987
|
-
*
|
|
9988
|
-
*
|
|
9989
|
-
*
|
|
10385
|
+
* fee on one concrete personal (friends-and-family) transaction, the spread PayPal adds on a
|
|
10386
|
+
* currency conversion, Pay Later instalment plans, PayPal.Me handle lookup, Help Center search
|
|
10387
|
+
* and articles, the binding policy documents, PayPal Shopping cashback offers, crypto prices,
|
|
10388
|
+
* and invoice payer-view reads. Three functions callable today — estimateFee, getFees,
|
|
10389
|
+
* getCurrencyConversionQuote.
|
|
9990
10390
|
*/
|
|
9991
10391
|
interface Unit {
|
|
9992
10392
|
/**
|
|
@@ -10006,6 +10406,18 @@ interface PaypalFeeSchedule {
|
|
|
10006
10406
|
* been fetched.
|
|
10007
10407
|
*/
|
|
10008
10408
|
getFees(args: PaypalGetFeesArgs): Promise<PaypalFeeSchedule>;
|
|
10409
|
+
|
|
10410
|
+
/**
|
|
10411
|
+
* Reads PayPal's published currency-conversion spread — the half of its fee it DOES disclose —
|
|
10412
|
+
* off the same fees page (FEETB26, 4.00% for goodsOrServices/personal/payouts, 3.00% for
|
|
10413
|
+
* "other"), e.g. getCurrencyConversionQuote({ kind: "goodsOrServices" }) -> { kind:
|
|
10414
|
+
* "goodsOrServices", paypalSpread: 0.04, citations: { paypal: { documentId: "FEETB26",
|
|
10415
|
+
* feeDataKey: "4.00%", internalName: "..." } } }. PayPal does NOT publish the wholesale base
|
|
10416
|
+
* rate, so this function returns only the spread; combining it with a base rate from another
|
|
10417
|
+
* provider (e.g. bowmark.providers.oanda.convertCurrency) is the capability tier's job, not a
|
|
10418
|
+
* single provider's. consumer / us only today.
|
|
10419
|
+
*/
|
|
10420
|
+
getCurrencyConversionQuote(args: PaypalGetCurrencyConversionQuoteArgs): Promise<PaypalCurrencyConversionQuote>;
|
|
10009
10421
|
}
|
|
10010
10422
|
}
|
|
10011
10423
|
|
|
@@ -10373,6 +10785,71 @@ interface PizzahutDealsForRender {
|
|
|
10373
10785
|
}
|
|
10374
10786
|
}
|
|
10375
10787
|
|
|
10788
|
+
declare namespace BowmarkProvider_premierbuildings {
|
|
10789
|
+
// ── Premier Portable Buildings — the unit's own declarations, verbatim ──
|
|
10790
|
+
interface PremierbuildingsStyle {
|
|
10791
|
+
key: string;
|
|
10792
|
+
label: string;
|
|
10793
|
+
sidingOptions: string[];
|
|
10794
|
+
sizes: { sizeKey: string; width: number; length: number }[];
|
|
10795
|
+
}
|
|
10796
|
+
interface PremierbuildingsPrice {
|
|
10797
|
+
styleKey: string;
|
|
10798
|
+
model: string;
|
|
10799
|
+
sizeKey: string;
|
|
10800
|
+
width: number;
|
|
10801
|
+
length: number;
|
|
10802
|
+
sidingKey: string;
|
|
10803
|
+
zip: string;
|
|
10804
|
+
region: string;
|
|
10805
|
+
basePrice: number;
|
|
10806
|
+
sidingSurcharge: number;
|
|
10807
|
+
total: number;
|
|
10808
|
+
currency: "USD";
|
|
10809
|
+
}
|
|
10810
|
+
interface PremierbuildingsDealer {
|
|
10811
|
+
key: string;
|
|
10812
|
+
name: string;
|
|
10813
|
+
city: string;
|
|
10814
|
+
state: string;
|
|
10815
|
+
zip: string;
|
|
10816
|
+
phoneNumber: string;
|
|
10817
|
+
dealerURL: string;
|
|
10818
|
+
}
|
|
10819
|
+
|
|
10820
|
+
/**
|
|
10821
|
+
* Reads Premier Portable Buildings' own ShedView 3D configurator pricing catalogue — building
|
|
10822
|
+
* styles, real available sizes, and region-exact siding surcharges — plus its real dealer
|
|
10823
|
+
* directory.
|
|
10824
|
+
*/
|
|
10825
|
+
interface Unit {
|
|
10826
|
+
/**
|
|
10827
|
+
* Lists every real building style Premier's ShedView configurator offers (Lofted Barn,
|
|
10828
|
+
* Utility, Cabin, Garage, ...) with its real siding options and every real buildable size
|
|
10829
|
+
* (width x length), read straight from the configurator's own live catalogue.
|
|
10830
|
+
*/
|
|
10831
|
+
listBuildingStyles(): Promise<PremierbuildingsStyle[]>;
|
|
10832
|
+
|
|
10833
|
+
/**
|
|
10834
|
+
* Prices one real Premier building configuration exactly the way ShedView itself does: the
|
|
10835
|
+
* base price for `styleKey` + `sizeKey` in the pricing region `zip` falls under, plus the
|
|
10836
|
+
* EXACT siding surcharge Premier's own rules add for `sidingKey` at that width and region (0
|
|
10837
|
+
* for the default "urethane-siding"; a real dollar amount, never a guess, for an alternative
|
|
10838
|
+
* like "metal" — the surcharge genuinely varies by both region and building width).
|
|
10839
|
+
* `sidingKey` defaults to "urethane-siding" (Premier's standard siding) when omitted.
|
|
10840
|
+
*/
|
|
10841
|
+
priceBuilding(styleKey: string, sizeKey: string, sidingKey: string | undefined, zip: string): Promise<PremierbuildingsPrice>;
|
|
10842
|
+
|
|
10843
|
+
/**
|
|
10844
|
+
* Looks up Premier's real dealer locations in one US state or Canadian province (accepts
|
|
10845
|
+
* either a full name like "Tennessee" or an abbreviation like "TN") — name, city, phone, and
|
|
10846
|
+
* the dealer's own ShedView URL, straight from Premier's live dealer directory, for handing a
|
|
10847
|
+
* priced configuration off to order.
|
|
10848
|
+
*/
|
|
10849
|
+
findDealers(state: string): Promise<PremierbuildingsDealer[]>;
|
|
10850
|
+
}
|
|
10851
|
+
}
|
|
10852
|
+
|
|
10376
10853
|
declare namespace BowmarkProvider_progressive {
|
|
10377
10854
|
// ── Progressive — the unit's own declarations, verbatim ──
|
|
10378
10855
|
// Progressive's OWN shapes — not a capability contract.
|
|
@@ -11685,6 +12162,55 @@ interface SearsStock {
|
|
|
11685
12162
|
}
|
|
11686
12163
|
}
|
|
11687
12164
|
|
|
12165
|
+
declare namespace BowmarkProvider_seegarsfence {
|
|
12166
|
+
// ── Seegars Fence Company — the unit's own declarations, verbatim ──
|
|
12167
|
+
interface SeegarsBranch {
|
|
12168
|
+
id: number;
|
|
12169
|
+
name: string;
|
|
12170
|
+
address1: string;
|
|
12171
|
+
city: string;
|
|
12172
|
+
state: string;
|
|
12173
|
+
zip: string;
|
|
12174
|
+
salesEmail: string;
|
|
12175
|
+
salesPhone: string;
|
|
12176
|
+
webSite: string;
|
|
12177
|
+
outsideServiceAreaText: string;
|
|
12178
|
+
serviceArea: string;
|
|
12179
|
+
}
|
|
12180
|
+
|
|
12181
|
+
interface SeegarsGeocodedAddress {
|
|
12182
|
+
address1: string;
|
|
12183
|
+
city: string;
|
|
12184
|
+
state: string;
|
|
12185
|
+
zip: string;
|
|
12186
|
+
displayName: string;
|
|
12187
|
+
latitude: number;
|
|
12188
|
+
longitude: number;
|
|
12189
|
+
}
|
|
12190
|
+
|
|
12191
|
+
interface CheckServiceAreaResult {
|
|
12192
|
+
address: SeegarsGeocodedAddress;
|
|
12193
|
+
inServiceArea: boolean;
|
|
12194
|
+
branch: SeegarsBranch;
|
|
12195
|
+
}
|
|
12196
|
+
|
|
12197
|
+
/**
|
|
12198
|
+
* Fence/gate installer (Carolinas). checkServiceArea is live — geocodes an address and reports
|
|
12199
|
+
* whether it's inside Seegars' service area, plus the branch that would handle it.
|
|
12200
|
+
* estimateFencePrice (the actual priced estimate) is a stub — see its notImplemented reason.
|
|
12201
|
+
*/
|
|
12202
|
+
interface Unit {
|
|
12203
|
+
/**
|
|
12204
|
+
* Geocodes a free-text address (`address`, e.g. "301 Fayetteville St, Raleigh, NC 27601")
|
|
12205
|
+
* against Seegars Fence's own address-lookup API, then checks it against the branch's
|
|
12206
|
+
* published service-area polygon — the same check the site's own Fence Price Estimator Tool
|
|
12207
|
+
* performs before it will show any pricing. Returns the normalized address, whether it falls
|
|
12208
|
+
* inside the service area, and the branch (name, phone, email, address) that would handle it.
|
|
12209
|
+
*/
|
|
12210
|
+
checkServiceArea(args: object): Promise<CheckServiceAreaResult>;
|
|
12211
|
+
}
|
|
12212
|
+
}
|
|
12213
|
+
|
|
11688
12214
|
declare namespace BowmarkProvider_selectblinds {
|
|
11689
12215
|
// ── SelectBlinds — the unit's own declarations, verbatim ──
|
|
11690
12216
|
// SelectBlinds' OWN shapes — not a capability contract.
|
|
@@ -12414,6 +12940,60 @@ interface SunHomeSaunasCartResult {
|
|
|
12414
12940
|
}
|
|
12415
12941
|
}
|
|
12416
12942
|
|
|
12943
|
+
declare namespace BowmarkProvider_target {
|
|
12944
|
+
// ── Target — the unit's own declarations, verbatim ──
|
|
12945
|
+
interface targetRow {
|
|
12946
|
+
id: string;
|
|
12947
|
+
}
|
|
12948
|
+
|
|
12949
|
+
interface TargetStoreHoursInterval {
|
|
12950
|
+
begin_time: string;
|
|
12951
|
+
end_date: string;
|
|
12952
|
+
end_time: string;
|
|
12953
|
+
}
|
|
12954
|
+
|
|
12955
|
+
interface TargetStoreHoursDay {
|
|
12956
|
+
is_open: boolean;
|
|
12957
|
+
date: string;
|
|
12958
|
+
day_name: string;
|
|
12959
|
+
hours: TargetStoreHoursInterval[];
|
|
12960
|
+
}
|
|
12961
|
+
|
|
12962
|
+
interface TargetStoreGeoSpec {
|
|
12963
|
+
iso_time_zone_code: string;
|
|
12964
|
+
time_zone_code: string;
|
|
12965
|
+
time_zone_utc_offset_name: string;
|
|
12966
|
+
}
|
|
12967
|
+
|
|
12968
|
+
interface TargetStore {
|
|
12969
|
+
id: string;
|
|
12970
|
+
slug: string;
|
|
12971
|
+
name: string;
|
|
12972
|
+
address: string;
|
|
12973
|
+
phone: string | null;
|
|
12974
|
+
geoSpec: TargetStoreGeoSpec | null;
|
|
12975
|
+
weeklyHours: TargetStoreHoursDay[];
|
|
12976
|
+
}
|
|
12977
|
+
|
|
12978
|
+
interface TargetStoreSearch {
|
|
12979
|
+
query: string;
|
|
12980
|
+
stores: TargetStore[];
|
|
12981
|
+
warnings: string[];
|
|
12982
|
+
}
|
|
12983
|
+
|
|
12984
|
+
/**
|
|
12985
|
+
* Big-box general merchandise — search, product detail, store stock and store lookup on
|
|
12986
|
+
* target.com.
|
|
12987
|
+
*/
|
|
12988
|
+
interface Unit {
|
|
12989
|
+
/**
|
|
12990
|
+
* Searches the store-locator for nearby Targets by ZIP, partial ZIP, city, or street+city, and
|
|
12991
|
+
* returns each store's id, slug, name, address, phone, time-zone and 14-day weekly hours.
|
|
12992
|
+
*/
|
|
12993
|
+
findStore(args: { query: string }): Promise<TargetStoreSearch>;
|
|
12994
|
+
}
|
|
12995
|
+
}
|
|
12996
|
+
|
|
12417
12997
|
declare namespace BowmarkProvider_teladoc {
|
|
12418
12998
|
// ── Teladoc Health — the unit's own declarations, verbatim ──
|
|
12419
12999
|
interface teladocRow {
|
|
@@ -13145,6 +13725,40 @@ interface thezebraAutoQuotes {
|
|
|
13145
13725
|
}
|
|
13146
13726
|
}
|
|
13147
13727
|
|
|
13728
|
+
declare namespace BowmarkProvider_topviewtix {
|
|
13729
|
+
// ── TopView Sightseeing — the unit's own declarations, verbatim ──
|
|
13730
|
+
interface topviewtixPackageDetails {
|
|
13731
|
+
id: number;
|
|
13732
|
+
slug: string;
|
|
13733
|
+
name: string;
|
|
13734
|
+
description: string;
|
|
13735
|
+
url: string;
|
|
13736
|
+
adultsPrice: number | null;
|
|
13737
|
+
kidsPrice: number | null;
|
|
13738
|
+
isAdultOnly: boolean;
|
|
13739
|
+
availableDates: string[];
|
|
13740
|
+
blockedDates: string[];
|
|
13741
|
+
soldOutDates: string[];
|
|
13742
|
+
availableUntil: string | null;
|
|
13743
|
+
}
|
|
13744
|
+
|
|
13745
|
+
/**
|
|
13746
|
+
* TopView's NYC hop-on-hop-off bus, Statue of Liberty cruise and bike/walking tour packages —
|
|
13747
|
+
* getPackageDetails reads one package's live price and its own real-time booking calendar
|
|
13748
|
+
* (available/blocked/sold-out dates) off topviewtix.com/new-york/<slug>.
|
|
13749
|
+
*/
|
|
13750
|
+
interface Unit {
|
|
13751
|
+
/**
|
|
13752
|
+
* Reads one TopView tour package in full — name, description, adult/kid price, and the site's
|
|
13753
|
+
* OWN live booking calendar (which dates are open, blocked, or sold out, and how far out the
|
|
13754
|
+
* calendar reaches). Takes `slug`, the package's own URL slug off
|
|
13755
|
+
* topviewtix.com/new-york/<slug> (e.g. "hop-on-hop-off-pass"). Throws if the slug doesn't
|
|
13756
|
+
* resolve to a real package (a clean 404) rather than returning an empty row.
|
|
13757
|
+
*/
|
|
13758
|
+
getPackageDetails(args: object): Promise<topviewtixPackageDetails>;
|
|
13759
|
+
}
|
|
13760
|
+
}
|
|
13761
|
+
|
|
13148
13762
|
declare namespace BowmarkProvider_trektravel {
|
|
13149
13763
|
// ── Trek Travel — the unit's own declarations, verbatim ──
|
|
13150
13764
|
// Trek Travel's OWN shapes — not a capability contract.
|
|
@@ -13767,15 +14381,6 @@ interface wellfoundCompanyDetail {
|
|
|
13767
14381
|
* experience-requirement text and the hiring startup.
|
|
13768
14382
|
*/
|
|
13769
14383
|
getJob(args: { url: string }): Promise<wellfoundJobDetail>;
|
|
13770
|
-
|
|
13771
|
-
/**
|
|
13772
|
-
* Reads one startup's `/company/<slug>` profile — the longer product description (HTML), the
|
|
13773
|
-
* full market tagging, location tags with display names, the explicitly-set Remote policy,
|
|
13774
|
-
* total raised, the company's own website, every badge verbatim, and the same `companySize`
|
|
13775
|
-
* band `searchCompanies` already decodes — the context a candidate weighs a startup on before
|
|
13776
|
-
* applying to it. Takes the `slug` a `searchCompanies` row already carries.
|
|
13777
|
-
*/
|
|
13778
|
-
getCompany(args: { slug: string }): Promise<wellfoundCompanyDetail>;
|
|
13779
14384
|
}
|
|
13780
14385
|
}
|
|
13781
14386
|
|
|
@@ -13793,6 +14398,95 @@ interface ShopifyVariant {
|
|
|
13793
14398
|
/** The store's own per-variant stock flag. */
|
|
13794
14399
|
available: boolean;
|
|
13795
14400
|
options: string[];
|
|
14401
|
+
/** The same values keyed by the option's own NAME — { Color: "Black", Size: "S" }.
|
|
14402
|
+
* Read THIS to filter by size; options[1] is only the size on a store that
|
|
14403
|
+
* happens to order it second. {} when the two lists cannot be reconciled. */
|
|
14404
|
+
selectedOptions: Record<string, string>;
|
|
14405
|
+
/** The image the STORE linked to this variant. Usually NULL — most storefronts
|
|
14406
|
+
* publish no image-to-variant link at all, and null says so rather than
|
|
14407
|
+
* handing back the first product picture. */
|
|
14408
|
+
image: ProductImage | null;
|
|
14409
|
+
/** Why this price is, or is not, a markdown. */
|
|
14410
|
+
sale: SaleEvidence;
|
|
14411
|
+
}
|
|
14412
|
+
interface ProductImage {
|
|
14413
|
+
/** Absolute HTTPS url, at the largest rendition the CDN serves. */
|
|
14414
|
+
url: string;
|
|
14415
|
+
/** The retailer's own alt text, or null. */
|
|
14416
|
+
altText: string | null;
|
|
14417
|
+
/** The retailer's colour name for this picture. Set when the store links it,
|
|
14418
|
+
* or when the whole product is ONE colourway (which is how both yoga
|
|
14419
|
+
* retailers publish: one colour per product). Null otherwise. */
|
|
14420
|
+
color: string | null;
|
|
14421
|
+
colorId: string | null;
|
|
14422
|
+
/** Variant ids the STORE linked. [] means it published no link — NOT that the
|
|
14423
|
+
* image belongs to every variant. */
|
|
14424
|
+
variantIds: string[];
|
|
14425
|
+
}
|
|
14426
|
+
interface SaleEvidence {
|
|
14427
|
+
/** True only with retailer evidence. NEVER set from a low price or from the
|
|
14428
|
+
* word "sale" in a title. */
|
|
14429
|
+
onSale: boolean;
|
|
14430
|
+
currentPrice: string | null;
|
|
14431
|
+
/** The published "was" price. Strictly greater than currentPrice when
|
|
14432
|
+
* evidenceType is "compare_at_price". Null when nothing published one. */
|
|
14433
|
+
originalPrice: string | null;
|
|
14434
|
+
/** ISO 4217, or null. Null on the REST catalogue door, which publishes no
|
|
14435
|
+
* currency — reported honestly rather than assumed to be USD. */
|
|
14436
|
+
currency: string | null;
|
|
14437
|
+
promotionMessage: string | null;
|
|
14438
|
+
/** How it was decided. "compare_at_price" is a struck-through price;
|
|
14439
|
+
* "retailer_sale_badge" is a published sale tag; "none" is not on sale. */
|
|
14440
|
+
evidenceType: "compare_at_price" | "sale_price" | "retailer_sale_badge" | "published_promotion" | "none";
|
|
14441
|
+
/** The retailer text or field the classification rests on, verbatim. */
|
|
14442
|
+
evidenceText: string | null;
|
|
14443
|
+
}
|
|
14444
|
+
/** The retailer's own labels, read off its published tags, category and options.
|
|
14445
|
+
* NEVER inferred from the title or from an image. Null or [] when unpublished,
|
|
14446
|
+
* which is common and is an honest answer. */
|
|
14447
|
+
interface PublishedProductAttributes {
|
|
14448
|
+
audience: string | null;
|
|
14449
|
+
garmentType: "sports_bra" | "tank" | "crop_top" | "leggings" | "shorts" | "other" | null;
|
|
14450
|
+
categories: string[];
|
|
14451
|
+
collections: string[];
|
|
14452
|
+
fabrics: string[];
|
|
14453
|
+
materials: string[];
|
|
14454
|
+
color: string | null;
|
|
14455
|
+
colorFamily: string | null;
|
|
14456
|
+
pattern: string | null;
|
|
14457
|
+
styleTags: string[];
|
|
14458
|
+
neckline: string | null;
|
|
14459
|
+
strapWidth: string | null;
|
|
14460
|
+
backDesign: string | null;
|
|
14461
|
+
sleeveLength: string | null;
|
|
14462
|
+
rise: string | null;
|
|
14463
|
+
waistband: string | null;
|
|
14464
|
+
inseam: string | null;
|
|
14465
|
+
legShape: string | null;
|
|
14466
|
+
fit: string | null;
|
|
14467
|
+
coverage: string | null;
|
|
14468
|
+
}
|
|
14469
|
+
/** Shared colour, fabric, collection and style family — what makes two garments
|
|
14470
|
+
* PLAUSIBLY coordinate. None of it establishes a set. */
|
|
14471
|
+
interface CoordinationMetadata {
|
|
14472
|
+
collectionNames: string[];
|
|
14473
|
+
fabricNames: string[];
|
|
14474
|
+
colorName: string | null;
|
|
14475
|
+
colorId: string | null;
|
|
14476
|
+
colorFamily: string | null;
|
|
14477
|
+
/** The store's own grouping key for one style across its colourways. Two
|
|
14478
|
+
* products sharing it are the same garment in two colours. */
|
|
14479
|
+
productFamily: string | null;
|
|
14480
|
+
}
|
|
14481
|
+
/** An EXPLICIT retailer-published relationship. Shared colour, fabric,
|
|
14482
|
+
* collection or family is NOT this — that is CoordinationMetadata. Usually [];
|
|
14483
|
+
* the catalogue door carries no set tags on any store measured. */
|
|
14484
|
+
interface RetailerSetEvidence {
|
|
14485
|
+
evidenceType: "official_set" | "shop_the_set" | "complete_the_look" | "matching_piece";
|
|
14486
|
+
evidenceText: string | null;
|
|
14487
|
+
sourceUrl: string | null;
|
|
14488
|
+
setId: string | null;
|
|
14489
|
+
relatedProducts: Array<{ productId: string | null; handle: string | null; title: string | null; url: string | null }>;
|
|
13796
14490
|
}
|
|
13797
14491
|
interface ShopifyProduct {
|
|
13798
14492
|
handle: string;
|
|
@@ -13806,6 +14500,14 @@ interface ShopifyProduct {
|
|
|
13806
14500
|
inStock: boolean;
|
|
13807
14501
|
tags: string[];
|
|
13808
14502
|
descriptionHtml: string | null;
|
|
14503
|
+
/** The same copy with its markup removed. */
|
|
14504
|
+
descriptionText: string | null;
|
|
14505
|
+
currency: string | null;
|
|
14506
|
+
/** Every image the door published, deduplicated, in the store's own order. */
|
|
14507
|
+
images: ProductImage[];
|
|
14508
|
+
attributes: PublishedProductAttributes;
|
|
14509
|
+
coordination: CoordinationMetadata;
|
|
14510
|
+
retailerSetEvidence: RetailerSetEvidence[];
|
|
13809
14511
|
}
|
|
13810
14512
|
interface ShopifyCartLine {
|
|
13811
14513
|
/** Shopify's own line key, which its cart-change endpoints address a line by. */
|
|
@@ -13819,6 +14521,30 @@ interface ShopifyCartLine {
|
|
|
13819
14521
|
lineTotal: string;
|
|
13820
14522
|
url: string;
|
|
13821
14523
|
}
|
|
14524
|
+
/** One collection the store publishes — its own merchandised grouping, and the
|
|
14525
|
+
* ONE place either yoga retailer states a set. Membership in a collection the
|
|
14526
|
+
* retailer NAMED "Matching Sets" is a published fact and is admissible as set
|
|
14527
|
+
* evidence; two products being adjacent inside it is NOT, because a position in
|
|
14528
|
+
* a list is not a statement. */
|
|
14529
|
+
interface ShopifyCollection {
|
|
14530
|
+
handle: string;
|
|
14531
|
+
title: string;
|
|
14532
|
+
url: string;
|
|
14533
|
+
descriptionHtml: string | null;
|
|
14534
|
+
/** True when the retailer's OWN title or handle names this a set, a matching
|
|
14535
|
+
* piece or a look. Never inferred from what is inside it. */
|
|
14536
|
+
setLike: boolean;
|
|
14537
|
+
productCount: number | null;
|
|
14538
|
+
updatedAt: string | null;
|
|
14539
|
+
}
|
|
14540
|
+
interface ShopifyCollectionProducts {
|
|
14541
|
+
handle: string;
|
|
14542
|
+
url: string;
|
|
14543
|
+
/** In the RETAILER's own order. Curated collections are merchandised
|
|
14544
|
+
* top-then-bottom; reading a pairing out of that order is the caller's
|
|
14545
|
+
* inference, never this provider's claim. [] is an ordinary answer. */
|
|
14546
|
+
products: ShopifyProduct[];
|
|
14547
|
+
}
|
|
13822
14548
|
interface ShopifyCart {
|
|
13823
14549
|
/** The store's own cart token — a bearer credential, so treat it like one. */
|
|
13824
14550
|
token: string;
|
|
@@ -13850,6 +14576,20 @@ interface ShopifyCart {
|
|
|
13850
14576
|
*/
|
|
13851
14577
|
getProduct(handle: string): Promise<ShopifyProduct>;
|
|
13852
14578
|
|
|
14579
|
+
/**
|
|
14580
|
+
* Lists the store's own merchandised collections. THIS is where a retailer states a SET: a
|
|
14581
|
+
* collection the store itself named "Matching Sets" or "Activewear Sets" carries setLike:
|
|
14582
|
+
* true, and membership in one is published evidence that two garments are sold together.
|
|
14583
|
+
*/
|
|
14584
|
+
listCollections(opts?: { limit?: number }): Promise<ShopifyCollection[]>;
|
|
14585
|
+
|
|
14586
|
+
/**
|
|
14587
|
+
* Reads one collection's products in the retailer's own merchandised order, as full product
|
|
14588
|
+
* rows. An empty list is an ordinary answer — several named 'look' collections publish no
|
|
14589
|
+
* products through this door.
|
|
14590
|
+
*/
|
|
14591
|
+
getCollection(handle: string, opts?: { limit?: number }): Promise<ShopifyCollectionProducts>;
|
|
14592
|
+
|
|
13853
14593
|
/**
|
|
13854
14594
|
* Puts variants into THIS run's own cart on the store and returns the cart the store reports
|
|
13855
14595
|
* back. A real write: the cart exists on the store from the first call and belongs to this
|
|
@@ -13881,6 +14621,95 @@ interface ShopifyVariant {
|
|
|
13881
14621
|
/** The store's own per-variant stock flag. */
|
|
13882
14622
|
available: boolean;
|
|
13883
14623
|
options: string[];
|
|
14624
|
+
/** The same values keyed by the option's own NAME — { Color: "Black", Size: "S" }.
|
|
14625
|
+
* Read THIS to filter by size; options[1] is only the size on a store that
|
|
14626
|
+
* happens to order it second. {} when the two lists cannot be reconciled. */
|
|
14627
|
+
selectedOptions: Record<string, string>;
|
|
14628
|
+
/** The image the STORE linked to this variant. Usually NULL — most storefronts
|
|
14629
|
+
* publish no image-to-variant link at all, and null says so rather than
|
|
14630
|
+
* handing back the first product picture. */
|
|
14631
|
+
image: ProductImage | null;
|
|
14632
|
+
/** Why this price is, or is not, a markdown. */
|
|
14633
|
+
sale: SaleEvidence;
|
|
14634
|
+
}
|
|
14635
|
+
interface ProductImage {
|
|
14636
|
+
/** Absolute HTTPS url, at the largest rendition the CDN serves. */
|
|
14637
|
+
url: string;
|
|
14638
|
+
/** The retailer's own alt text, or null. */
|
|
14639
|
+
altText: string | null;
|
|
14640
|
+
/** The retailer's colour name for this picture. Set when the store links it,
|
|
14641
|
+
* or when the whole product is ONE colourway (which is how both yoga
|
|
14642
|
+
* retailers publish: one colour per product). Null otherwise. */
|
|
14643
|
+
color: string | null;
|
|
14644
|
+
colorId: string | null;
|
|
14645
|
+
/** Variant ids the STORE linked. [] means it published no link — NOT that the
|
|
14646
|
+
* image belongs to every variant. */
|
|
14647
|
+
variantIds: string[];
|
|
14648
|
+
}
|
|
14649
|
+
interface SaleEvidence {
|
|
14650
|
+
/** True only with retailer evidence. NEVER set from a low price or from the
|
|
14651
|
+
* word "sale" in a title. */
|
|
14652
|
+
onSale: boolean;
|
|
14653
|
+
currentPrice: string | null;
|
|
14654
|
+
/** The published "was" price. Strictly greater than currentPrice when
|
|
14655
|
+
* evidenceType is "compare_at_price". Null when nothing published one. */
|
|
14656
|
+
originalPrice: string | null;
|
|
14657
|
+
/** ISO 4217, or null. Null on the REST catalogue door, which publishes no
|
|
14658
|
+
* currency — reported honestly rather than assumed to be USD. */
|
|
14659
|
+
currency: string | null;
|
|
14660
|
+
promotionMessage: string | null;
|
|
14661
|
+
/** How it was decided. "compare_at_price" is a struck-through price;
|
|
14662
|
+
* "retailer_sale_badge" is a published sale tag; "none" is not on sale. */
|
|
14663
|
+
evidenceType: "compare_at_price" | "sale_price" | "retailer_sale_badge" | "published_promotion" | "none";
|
|
14664
|
+
/** The retailer text or field the classification rests on, verbatim. */
|
|
14665
|
+
evidenceText: string | null;
|
|
14666
|
+
}
|
|
14667
|
+
/** The retailer's own labels, read off its published tags, category and options.
|
|
14668
|
+
* NEVER inferred from the title or from an image. Null or [] when unpublished,
|
|
14669
|
+
* which is common and is an honest answer. */
|
|
14670
|
+
interface PublishedProductAttributes {
|
|
14671
|
+
audience: string | null;
|
|
14672
|
+
garmentType: "sports_bra" | "tank" | "crop_top" | "leggings" | "shorts" | "other" | null;
|
|
14673
|
+
categories: string[];
|
|
14674
|
+
collections: string[];
|
|
14675
|
+
fabrics: string[];
|
|
14676
|
+
materials: string[];
|
|
14677
|
+
color: string | null;
|
|
14678
|
+
colorFamily: string | null;
|
|
14679
|
+
pattern: string | null;
|
|
14680
|
+
styleTags: string[];
|
|
14681
|
+
neckline: string | null;
|
|
14682
|
+
strapWidth: string | null;
|
|
14683
|
+
backDesign: string | null;
|
|
14684
|
+
sleeveLength: string | null;
|
|
14685
|
+
rise: string | null;
|
|
14686
|
+
waistband: string | null;
|
|
14687
|
+
inseam: string | null;
|
|
14688
|
+
legShape: string | null;
|
|
14689
|
+
fit: string | null;
|
|
14690
|
+
coverage: string | null;
|
|
14691
|
+
}
|
|
14692
|
+
/** Shared colour, fabric, collection and style family — what makes two garments
|
|
14693
|
+
* PLAUSIBLY coordinate. None of it establishes a set. */
|
|
14694
|
+
interface CoordinationMetadata {
|
|
14695
|
+
collectionNames: string[];
|
|
14696
|
+
fabricNames: string[];
|
|
14697
|
+
colorName: string | null;
|
|
14698
|
+
colorId: string | null;
|
|
14699
|
+
colorFamily: string | null;
|
|
14700
|
+
/** The store's own grouping key for one style across its colourways. Two
|
|
14701
|
+
* products sharing it are the same garment in two colours. */
|
|
14702
|
+
productFamily: string | null;
|
|
14703
|
+
}
|
|
14704
|
+
/** An EXPLICIT retailer-published relationship. Shared colour, fabric,
|
|
14705
|
+
* collection or family is NOT this — that is CoordinationMetadata. Usually [];
|
|
14706
|
+
* the catalogue door carries no set tags on any store measured. */
|
|
14707
|
+
interface RetailerSetEvidence {
|
|
14708
|
+
evidenceType: "official_set" | "shop_the_set" | "complete_the_look" | "matching_piece";
|
|
14709
|
+
evidenceText: string | null;
|
|
14710
|
+
sourceUrl: string | null;
|
|
14711
|
+
setId: string | null;
|
|
14712
|
+
relatedProducts: Array<{ productId: string | null; handle: string | null; title: string | null; url: string | null }>;
|
|
13884
14713
|
}
|
|
13885
14714
|
interface ShopifyProduct {
|
|
13886
14715
|
handle: string;
|
|
@@ -13894,6 +14723,14 @@ interface ShopifyProduct {
|
|
|
13894
14723
|
inStock: boolean;
|
|
13895
14724
|
tags: string[];
|
|
13896
14725
|
descriptionHtml: string | null;
|
|
14726
|
+
/** The same copy with its markup removed. */
|
|
14727
|
+
descriptionText: string | null;
|
|
14728
|
+
currency: string | null;
|
|
14729
|
+
/** Every image the door published, deduplicated, in the store's own order. */
|
|
14730
|
+
images: ProductImage[];
|
|
14731
|
+
attributes: PublishedProductAttributes;
|
|
14732
|
+
coordination: CoordinationMetadata;
|
|
14733
|
+
retailerSetEvidence: RetailerSetEvidence[];
|
|
13897
14734
|
}
|
|
13898
14735
|
interface ShopifyCartLine {
|
|
13899
14736
|
/** Shopify's own line key, which its cart-change endpoints address a line by. */
|
|
@@ -13907,6 +14744,30 @@ interface ShopifyCartLine {
|
|
|
13907
14744
|
lineTotal: string;
|
|
13908
14745
|
url: string;
|
|
13909
14746
|
}
|
|
14747
|
+
/** One collection the store publishes — its own merchandised grouping, and the
|
|
14748
|
+
* ONE place either yoga retailer states a set. Membership in a collection the
|
|
14749
|
+
* retailer NAMED "Matching Sets" is a published fact and is admissible as set
|
|
14750
|
+
* evidence; two products being adjacent inside it is NOT, because a position in
|
|
14751
|
+
* a list is not a statement. */
|
|
14752
|
+
interface ShopifyCollection {
|
|
14753
|
+
handle: string;
|
|
14754
|
+
title: string;
|
|
14755
|
+
url: string;
|
|
14756
|
+
descriptionHtml: string | null;
|
|
14757
|
+
/** True when the retailer's OWN title or handle names this a set, a matching
|
|
14758
|
+
* piece or a look. Never inferred from what is inside it. */
|
|
14759
|
+
setLike: boolean;
|
|
14760
|
+
productCount: number | null;
|
|
14761
|
+
updatedAt: string | null;
|
|
14762
|
+
}
|
|
14763
|
+
interface ShopifyCollectionProducts {
|
|
14764
|
+
handle: string;
|
|
14765
|
+
url: string;
|
|
14766
|
+
/** In the RETAILER's own order. Curated collections are merchandised
|
|
14767
|
+
* top-then-bottom; reading a pairing out of that order is the caller's
|
|
14768
|
+
* inference, never this provider's claim. [] is an ordinary answer. */
|
|
14769
|
+
products: ShopifyProduct[];
|
|
14770
|
+
}
|
|
13910
14771
|
interface ShopifyCart {
|
|
13911
14772
|
/** The store's own cart token — a bearer credential, so treat it like one. */
|
|
13912
14773
|
token: string;
|
|
@@ -13937,6 +14798,20 @@ interface ShopifyCart {
|
|
|
13937
14798
|
* specific size or colour is purchasable right now.
|
|
13938
14799
|
*/
|
|
13939
14800
|
getProduct(handle: string): Promise<ShopifyProduct>;
|
|
14801
|
+
|
|
14802
|
+
/**
|
|
14803
|
+
* Lists the store's own merchandised collections. THIS is where a retailer states a SET: a
|
|
14804
|
+
* collection the store itself named "Matching Sets" or "Activewear Sets" carries setLike:
|
|
14805
|
+
* true, and membership in one is published evidence that two garments are sold together.
|
|
14806
|
+
*/
|
|
14807
|
+
listCollections(opts?: { limit?: number }): Promise<ShopifyCollection[]>;
|
|
14808
|
+
|
|
14809
|
+
/**
|
|
14810
|
+
* Reads one collection's products in the retailer's own merchandised order, as full product
|
|
14811
|
+
* rows. An empty list is an ordinary answer — several named 'look' collections publish no
|
|
14812
|
+
* products through this door.
|
|
14813
|
+
*/
|
|
14814
|
+
getCollection(handle: string, opts?: { limit?: number }): Promise<ShopifyCollectionProducts>;
|
|
13940
14815
|
}
|
|
13941
14816
|
}
|
|
13942
14817
|
|
|
@@ -13956,6 +14831,7 @@ interface BowmarkProviders {
|
|
|
13956
14831
|
blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
|
|
13957
14832
|
bluehaven: BowmarkProvider_bluehaven.Unit;
|
|
13958
14833
|
bmwusa: BowmarkProvider_bmwusa.Unit;
|
|
14834
|
+
bykoket: BowmarkProvider_bykoket.Unit;
|
|
13959
14835
|
cancer: BowmarkProvider_cancer.Unit;
|
|
13960
14836
|
caraway: BowmarkProvider_caraway.Unit;
|
|
13961
14837
|
cars: BowmarkProvider_cars.Unit;
|
|
@@ -13971,6 +14847,7 @@ interface BowmarkProviders {
|
|
|
13971
14847
|
discounttire: BowmarkProvider_discounttire.Unit;
|
|
13972
14848
|
erieinsurance: BowmarkProvider_erieinsurance.Unit;
|
|
13973
14849
|
extraspace: BowmarkProvider_extraspace.Unit;
|
|
14850
|
+
firstdibs: BowmarkProvider_firstdibs.Unit;
|
|
13974
14851
|
flightradar24: BowmarkProvider_flightradar24.Unit;
|
|
13975
14852
|
ford: BowmarkProvider_ford.Unit;
|
|
13976
14853
|
framebridge: BowmarkProvider_framebridge.Unit;
|
|
@@ -13978,6 +14855,7 @@ interface BowmarkProviders {
|
|
|
13978
14855
|
geico: BowmarkProvider_geico.Unit;
|
|
13979
14856
|
google_flights: BowmarkProvider_google_flights.Unit;
|
|
13980
14857
|
grainger: BowmarkProvider_grainger.Unit;
|
|
14858
|
+
hauslabs: BowmarkProvider_hauslabs.Unit;
|
|
13981
14859
|
healthcare_gov: BowmarkProvider_healthcare_gov.Unit;
|
|
13982
14860
|
hellofresh: BowmarkProvider_hellofresh.Unit;
|
|
13983
14861
|
hellotend: BowmarkProvider_hellotend.Unit;
|
|
@@ -13994,6 +14872,7 @@ interface BowmarkProviders {
|
|
|
13994
14872
|
lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
|
|
13995
14873
|
lufthansa: BowmarkProvider_lufthansa.Unit;
|
|
13996
14874
|
lululemon: BowmarkProvider_lululemon.Unit;
|
|
14875
|
+
maidenhome: BowmarkProvider_maidenhome.Unit;
|
|
13997
14876
|
mailchimp: BowmarkProvider_mailchimp.Unit;
|
|
13998
14877
|
marriott: BowmarkProvider_marriott.Unit;
|
|
13999
14878
|
mcdonalds: BowmarkProvider_mcdonalds.Unit;
|
|
@@ -14011,22 +14890,26 @@ interface BowmarkProviders {
|
|
|
14011
14890
|
paypal: BowmarkProvider_paypal.Unit;
|
|
14012
14891
|
pirateship: BowmarkProvider_pirateship.Unit;
|
|
14013
14892
|
pizzahut: BowmarkProvider_pizzahut.Unit;
|
|
14893
|
+
premierbuildings: BowmarkProvider_premierbuildings.Unit;
|
|
14014
14894
|
progressive: BowmarkProvider_progressive.Unit;
|
|
14015
14895
|
prose: BowmarkProvider_prose.Unit;
|
|
14016
14896
|
reddit: BowmarkProvider_reddit.Unit;
|
|
14017
14897
|
ritani: BowmarkProvider_ritani.Unit;
|
|
14018
14898
|
samsclub: BowmarkProvider_samsclub.Unit;
|
|
14019
14899
|
sears: BowmarkProvider_sears.Unit;
|
|
14900
|
+
seegarsfence: BowmarkProvider_seegarsfence.Unit;
|
|
14020
14901
|
selectblinds: BowmarkProvider_selectblinds.Unit;
|
|
14021
14902
|
semihandmade: BowmarkProvider_semihandmade.Unit;
|
|
14022
14903
|
soundcloud: BowmarkProvider_soundcloud.Unit;
|
|
14023
14904
|
statefarm: BowmarkProvider_statefarm.Unit;
|
|
14024
14905
|
stickergiant: BowmarkProvider_stickergiant.Unit;
|
|
14025
14906
|
sunhomesaunas: BowmarkProvider_sunhomesaunas.Unit;
|
|
14907
|
+
target: BowmarkProvider_target.Unit;
|
|
14026
14908
|
teladoc: BowmarkProvider_teladoc.Unit;
|
|
14027
14909
|
tentree: BowmarkProvider_tentree.Unit;
|
|
14028
14910
|
therabody: BowmarkProvider_therabody.Unit;
|
|
14029
14911
|
thezebra: BowmarkProvider_thezebra.Unit;
|
|
14912
|
+
topviewtix: BowmarkProvider_topviewtix.Unit;
|
|
14030
14913
|
trektravel: BowmarkProvider_trektravel.Unit;
|
|
14031
14914
|
ulrichlifestyle: BowmarkProvider_ulrichlifestyle.Unit;
|
|
14032
14915
|
viewrail: BowmarkProvider_viewrail.Unit;
|