@pvh-afl/core 1.2.11 → 1.2.13
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/dist/common/circuit-breaker.d.ts +81 -0
- package/dist/common/circuit-breaker.d.ts.map +1 -0
- package/dist/common/circuit-breaker.js +163 -0
- package/dist/common/circuit-breaker.js.map +1 -0
- package/dist/integrations/commerce/commerce.types.d.ts +1 -0
- package/dist/integrations/commerce/commerce.types.d.ts.map +1 -1
- package/dist/integrations/commerce/shopify-admin.service.d.ts.map +1 -1
- package/dist/integrations/commerce/shopify-admin.service.js +1 -3
- package/dist/integrations/commerce/shopify-admin.service.js.map +1 -1
- package/dist/integrations/commerce/shopify.service.d.ts.map +1 -1
- package/dist/integrations/commerce/shopify.service.js +3 -0
- package/dist/integrations/commerce/shopify.service.js.map +1 -1
- package/dist/integrations/search/search-fallback.service.d.ts +93 -0
- package/dist/integrations/search/search-fallback.service.d.ts.map +1 -0
- package/dist/integrations/search/search-fallback.service.js +339 -0
- package/dist/integrations/search/search-fallback.service.js.map +1 -0
- package/dist/integrations/search/shopify-search.mapper.d.ts +31 -0
- package/dist/integrations/search/shopify-search.mapper.d.ts.map +1 -0
- package/dist/integrations/search/shopify-search.mapper.js +360 -0
- package/dist/integrations/search/shopify-search.mapper.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shopify Search Fallback Mapper
|
|
4
|
+
*
|
|
5
|
+
* Maps Storefront API results into the same unified structures the Wizzy
|
|
6
|
+
* mapper produces, so a fallback response is shape-compatible with a normal
|
|
7
|
+
* one. Fields Wizzy owns and Shopify cannot supply (wizzyId, groupId,
|
|
8
|
+
* swatches, searchedKey) get honest defaults — nothing is invented.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.mapShopifyProduct = mapShopifyProduct;
|
|
12
|
+
exports.mapShopifySearchResponse = mapShopifySearchResponse;
|
|
13
|
+
exports.mapShopifyAutocompleteResponse = mapShopifyAutocompleteResponse;
|
|
14
|
+
const search_types_1 = require("./search.types");
|
|
15
|
+
/**
|
|
16
|
+
* Wizzy's facet vocabulary. The app builds its filter UI from these keys and
|
|
17
|
+
* echoes them back on /products/filter, so the fallback must use them too —
|
|
18
|
+
* Shopify's own ids (`filter.v.price`, `filter.v.availability`) would be
|
|
19
|
+
* unrecognised by the client.
|
|
20
|
+
*/
|
|
21
|
+
const FACET = {
|
|
22
|
+
price: 'sellingPrice',
|
|
23
|
+
genders: 'genders',
|
|
24
|
+
sizes: 'sizes',
|
|
25
|
+
colour: 'product_Basic Colour',
|
|
26
|
+
productType: 'product_product_type',
|
|
27
|
+
};
|
|
28
|
+
/** Presentation metadata copied from live Wizzy responses. */
|
|
29
|
+
const FACET_META = {
|
|
30
|
+
[FACET.price]: { label: 'Price', order: 3, position: 'left' },
|
|
31
|
+
[FACET.genders]: { label: 'Gender', order: 4, position: 'left' },
|
|
32
|
+
[FACET.sizes]: { label: 'Sizes', order: 6, position: 'left' },
|
|
33
|
+
[FACET.colour]: { label: 'Basic Colour', order: 10, position: 'top', parentkey: 'attributes' },
|
|
34
|
+
[FACET.productType]: { label: 'Product Type', order: 11, position: 'top', parentkey: 'attributes' },
|
|
35
|
+
};
|
|
36
|
+
/** Option names vary per store; Tommy uses "Brand Colour" and "Size". */
|
|
37
|
+
const COLOUR_OPTION_PATTERN = /colou?r/i;
|
|
38
|
+
const SIZE_OPTION_PATTERN = /^size$/i;
|
|
39
|
+
const GENDER_TAGS = [
|
|
40
|
+
[/^men$/i, 'Men'],
|
|
41
|
+
[/^women$/i, 'Women'],
|
|
42
|
+
[/^boys$/i, 'Boys'],
|
|
43
|
+
[/^girls$/i, 'Girls'],
|
|
44
|
+
[/^kids$/i, 'Kids'],
|
|
45
|
+
];
|
|
46
|
+
/** Numeric tail of a Shopify gid, to fill Wizzy's numeric variationId. */
|
|
47
|
+
function numericId(gid) {
|
|
48
|
+
const match = /(\d+)\s*$/.exec(gid ?? '');
|
|
49
|
+
return match ? Number(match[1]) : undefined;
|
|
50
|
+
}
|
|
51
|
+
/** Distinct values of a named option across a product's variants. */
|
|
52
|
+
function variantOptionValues(product, pattern) {
|
|
53
|
+
const out = new Map();
|
|
54
|
+
for (const edge of product.variants?.edges ?? []) {
|
|
55
|
+
for (const option of edge.node.selectedOptions ?? []) {
|
|
56
|
+
if (!pattern.test(option.name) || !option.value)
|
|
57
|
+
continue;
|
|
58
|
+
const existing = out.get(option.value);
|
|
59
|
+
if (existing) {
|
|
60
|
+
existing.inStock = existing.inStock || edge.node.availableForSale;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
out.set(option.value, {
|
|
64
|
+
value: option.value,
|
|
65
|
+
inStock: edge.node.availableForSale,
|
|
66
|
+
variationId: numericId(edge.node.id),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return [...out.values()];
|
|
72
|
+
}
|
|
73
|
+
function deriveGender(tags) {
|
|
74
|
+
for (const tag of tags ?? []) {
|
|
75
|
+
for (const [pattern, gender] of GENDER_TAGS) {
|
|
76
|
+
if (pattern.test(tag.trim()))
|
|
77
|
+
return gender;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
function toMoney(money, currencyCode) {
|
|
83
|
+
return {
|
|
84
|
+
amount: money?.amount ?? '0.00',
|
|
85
|
+
currencyCode: money?.currencyCode ?? currencyCode,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function toImage(image, config, fallbackAltText) {
|
|
89
|
+
if (!image?.url)
|
|
90
|
+
return null;
|
|
91
|
+
return {
|
|
92
|
+
url: image.url,
|
|
93
|
+
// Shopify leaves altText null; Wizzy sends the product name, so mirror that.
|
|
94
|
+
altText: image.altText ?? fallbackAltText ?? null,
|
|
95
|
+
width: image.width ?? config.defaultImageWidth,
|
|
96
|
+
height: image.height ?? config.defaultImageHeight,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function toVariant(variant, config, altText) {
|
|
100
|
+
return {
|
|
101
|
+
id: variant.id,
|
|
102
|
+
title: variant.title,
|
|
103
|
+
availableForSale: variant.availableForSale,
|
|
104
|
+
// Not requested by the fallback query (costs query budget, unused by the grid).
|
|
105
|
+
quantityAvailable: null,
|
|
106
|
+
price: toMoney(variant.price, config.currencyCode),
|
|
107
|
+
compareAtPrice: variant.compareAtPrice
|
|
108
|
+
? toMoney(variant.compareAtPrice, config.currencyCode)
|
|
109
|
+
: null,
|
|
110
|
+
selectedOptions: variant.selectedOptions ?? [],
|
|
111
|
+
image: toImage(variant.image, config, altText),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Map one Shopify product to a SearchProduct.
|
|
116
|
+
*
|
|
117
|
+
* Prices come from priceRange/compareAtPrice; discount is derived rather than
|
|
118
|
+
* reported, since Shopify has no discount field of its own.
|
|
119
|
+
*/
|
|
120
|
+
function mapShopifyProduct(product, config = search_types_1.DEFAULT_MAPPER_CONFIG) {
|
|
121
|
+
const variants = (product.variants?.edges ?? []).map((edge) => toVariant(edge.node, config, product.title));
|
|
122
|
+
const images = (product.images?.edges ?? [])
|
|
123
|
+
.map((edge) => toImage(edge.node, config, product.title))
|
|
124
|
+
.filter((image) => image !== null);
|
|
125
|
+
const sellingPrice = Number(product.priceRange?.minVariantPrice?.amount ?? 0);
|
|
126
|
+
const firstCompareAt = (product.variants?.edges ?? [])
|
|
127
|
+
.map((edge) => Number(edge.node.compareAtPrice?.amount ?? 0))
|
|
128
|
+
.find((amount) => amount > sellingPrice);
|
|
129
|
+
const originalPrice = firstCompareAt ?? sellingPrice;
|
|
130
|
+
const discount = Math.max(0, originalPrice - sellingPrice);
|
|
131
|
+
const colourValues = variantOptionValues(product, COLOUR_OPTION_PATTERN);
|
|
132
|
+
const sizeValues = variantOptionValues(product, SIZE_OPTION_PATTERN);
|
|
133
|
+
const inStock = variants.some((variant) => variant.availableForSale);
|
|
134
|
+
const colors = colourValues.map((c) => ({
|
|
135
|
+
variationId: c.variationId,
|
|
136
|
+
value: c.value,
|
|
137
|
+
inStock: c.inStock,
|
|
138
|
+
}));
|
|
139
|
+
// Wizzy's size options carry a text swatch the card renders.
|
|
140
|
+
const sizes = sizeValues.map((sz) => ({
|
|
141
|
+
variationId: sz.variationId,
|
|
142
|
+
value: sz.value,
|
|
143
|
+
swatch: { type: 'text', value: sz.value },
|
|
144
|
+
inStock: sz.inStock,
|
|
145
|
+
}));
|
|
146
|
+
const productNumericId = numericId(product.id);
|
|
147
|
+
// Wizzy exposes colour/size/type/sku on `attributes`, keyed by attribute id.
|
|
148
|
+
// The app reads those keys, so the fallback fills the same ones.
|
|
149
|
+
const attributes = [];
|
|
150
|
+
const pushAttribute = (id, name, values) => {
|
|
151
|
+
if (values.length > 0)
|
|
152
|
+
attributes.push({ id, name, values });
|
|
153
|
+
};
|
|
154
|
+
pushAttribute('product_Basic Colour', 'Basic Colour', colourValues.map((c) => ({ variationId: c.variationId, inStock: c.inStock, value: [c.value] })));
|
|
155
|
+
pushAttribute('product_Size', 'Size', sizeValues.map((sz) => ({ variationId: sz.variationId, inStock: sz.inStock, value: [sz.value] })));
|
|
156
|
+
pushAttribute('product_product_type', 'Product Type', product.productType ? [{ variationId: productNumericId, inStock, value: [product.productType] }] : []);
|
|
157
|
+
pushAttribute('product_vendor', 'Vendor', product.vendor ? [{ variationId: productNumericId, inStock, value: [product.vendor] }] : []);
|
|
158
|
+
pushAttribute('product_handle', 'Handle', product.handle ? [{ variationId: productNumericId, inStock, value: [product.handle] }] : []);
|
|
159
|
+
pushAttribute('product_tags', 'Tags', (product.tags ?? []).length > 0
|
|
160
|
+
? [{ variationId: productNumericId, inStock, value: [(product.tags ?? []).join(' , ')] }]
|
|
161
|
+
: []);
|
|
162
|
+
const skus = (product.variants?.edges ?? [])
|
|
163
|
+
.map((edge) => edge.node.barcode)
|
|
164
|
+
.filter((barcode) => Boolean(barcode));
|
|
165
|
+
pushAttribute('product_sku', 'Sku', skus.length > 0 ? [{ variationId: productNumericId, inStock, value: skus }] : []);
|
|
166
|
+
// Colour swatches drive the colour dots on the product card.
|
|
167
|
+
const swatches = colourValues.length > 0
|
|
168
|
+
? {
|
|
169
|
+
'product_Basic Colour': {
|
|
170
|
+
order: 1,
|
|
171
|
+
key: 'product_Basic Colour',
|
|
172
|
+
values: colourValues.map((c) => ({
|
|
173
|
+
variationId: c.variationId,
|
|
174
|
+
inStock: c.inStock,
|
|
175
|
+
value: [c.value],
|
|
176
|
+
})),
|
|
177
|
+
},
|
|
178
|
+
}
|
|
179
|
+
: null;
|
|
180
|
+
return {
|
|
181
|
+
// X fields — same as the Wizzy path
|
|
182
|
+
id: product.id,
|
|
183
|
+
handle: product.handle,
|
|
184
|
+
title: product.title,
|
|
185
|
+
description: product.description ?? '',
|
|
186
|
+
descriptionHtml: product.descriptionHtml ?? '',
|
|
187
|
+
vendor: product.vendor ?? '',
|
|
188
|
+
productType: product.productType ?? '',
|
|
189
|
+
tags: product.tags ?? [],
|
|
190
|
+
featuredImage: toImage(product.featuredImage, config, product.title) ?? images[0] ?? null,
|
|
191
|
+
images,
|
|
192
|
+
options: (product.options ?? []).map((option) => ({
|
|
193
|
+
id: option.id,
|
|
194
|
+
name: option.name,
|
|
195
|
+
values: option.values ?? [],
|
|
196
|
+
})),
|
|
197
|
+
variants,
|
|
198
|
+
priceRange: {
|
|
199
|
+
minVariantPrice: toMoney(product.priceRange?.minVariantPrice ?? null, config.currencyCode),
|
|
200
|
+
maxVariantPrice: toMoney(product.priceRange?.maxVariantPrice ?? null, config.currencyCode),
|
|
201
|
+
},
|
|
202
|
+
// Y fields — Wizzy-specific. Derived where Shopify allows, defaulted otherwise.
|
|
203
|
+
wizzyId: productNumericId ?? 0,
|
|
204
|
+
groupId: productNumericId ?? 0,
|
|
205
|
+
gender: deriveGender(product.tags ?? []),
|
|
206
|
+
hoverImage: images[1]?.url ?? null,
|
|
207
|
+
discount,
|
|
208
|
+
discountPercentage: originalPrice > 0 ? Math.round((discount / originalPrice) * 100) : 0,
|
|
209
|
+
sellingPrice,
|
|
210
|
+
finalPrice: sellingPrice,
|
|
211
|
+
originalPrice,
|
|
212
|
+
categories: [],
|
|
213
|
+
colors,
|
|
214
|
+
sizes,
|
|
215
|
+
skus,
|
|
216
|
+
avgRatings: 0,
|
|
217
|
+
totalReviews: 0,
|
|
218
|
+
attributes: attributes,
|
|
219
|
+
inStock,
|
|
220
|
+
wizzyUrl: `/products/${product.handle}`,
|
|
221
|
+
swatches: swatches,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Build the facets in Wizzy's vocabulary.
|
|
226
|
+
*
|
|
227
|
+
* Shopify's storefront filters come from the Search & Discovery app and, on
|
|
228
|
+
* this store, expose only availability and price — nothing that maps to
|
|
229
|
+
* `sizes`, `product_Basic Colour`, `product_product_type` or `genders`. So the
|
|
230
|
+
* price range is taken from Shopify's own filter (authoritative over the whole
|
|
231
|
+
* result set) and the list facets are derived from the returned products.
|
|
232
|
+
*
|
|
233
|
+
* Consequence to be aware of: derived facet counts describe the products in
|
|
234
|
+
* this response, not the whole result set. Keys, labels, types and placement
|
|
235
|
+
* match Wizzy exactly, so the client needs no change.
|
|
236
|
+
*
|
|
237
|
+
* `filter.v.availability` is dropped — Wizzy has no equivalent facet.
|
|
238
|
+
*/
|
|
239
|
+
function buildFacets(products, shopifyFilters, requestedKeys) {
|
|
240
|
+
const facets = [];
|
|
241
|
+
const wanted = (key) => !requestedKeys || requestedKeys.length === 0 || requestedKeys.includes(key);
|
|
242
|
+
const meta = (key) => FACET_META[key];
|
|
243
|
+
const listFacet = (key, items) => {
|
|
244
|
+
if (items.length === 0)
|
|
245
|
+
return;
|
|
246
|
+
const m = meta(key);
|
|
247
|
+
facets.push({
|
|
248
|
+
key,
|
|
249
|
+
label: m.label,
|
|
250
|
+
type: 'list',
|
|
251
|
+
data: items.sort((a, b) => b.count - a.count),
|
|
252
|
+
order: m.order,
|
|
253
|
+
position: m.position,
|
|
254
|
+
...(m.parentkey ? { parentkey: m.parentkey } : {}),
|
|
255
|
+
});
|
|
256
|
+
};
|
|
257
|
+
/** Count distinct values across products, preserving Wizzy's item shape. */
|
|
258
|
+
const tally = (pick, withSwatch = false) => {
|
|
259
|
+
const counts = new Map();
|
|
260
|
+
for (const product of products) {
|
|
261
|
+
for (const value of new Set(pick(product))) {
|
|
262
|
+
counts.set(value, (counts.get(value) ?? 0) + 1);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return [...counts.entries()].map(([value, count]) => ({
|
|
266
|
+
key: value,
|
|
267
|
+
label: value,
|
|
268
|
+
count,
|
|
269
|
+
...(withSwatch ? { data: { swatch: { type: 'text', value }, value } } : {}),
|
|
270
|
+
}));
|
|
271
|
+
};
|
|
272
|
+
// Price: bounds from Shopify's filter, average from the returned products.
|
|
273
|
+
if (wanted(FACET.price)) {
|
|
274
|
+
const priceFilter = (shopifyFilters ?? []).find((f) => f.type === 'PRICE_RANGE');
|
|
275
|
+
let min = 0;
|
|
276
|
+
let max = 0;
|
|
277
|
+
if (priceFilter) {
|
|
278
|
+
try {
|
|
279
|
+
const parsed = JSON.parse(priceFilter.values?.[0]?.input ?? '{}');
|
|
280
|
+
min = parsed.price?.min ?? 0;
|
|
281
|
+
max = parsed.price?.max ?? 0;
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// Fall through to the product-derived bounds below.
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const prices = products.map((p) => p.sellingPrice).filter((n) => n > 0);
|
|
288
|
+
if (max === 0 && prices.length > 0) {
|
|
289
|
+
min = Math.min(...prices);
|
|
290
|
+
max = Math.max(...prices);
|
|
291
|
+
}
|
|
292
|
+
const avg = prices.length > 0
|
|
293
|
+
? Math.round(prices.reduce((sum, n) => sum + n, 0) / prices.length)
|
|
294
|
+
: 0;
|
|
295
|
+
if (max > 0) {
|
|
296
|
+
const m = meta(FACET.price);
|
|
297
|
+
facets.push({
|
|
298
|
+
key: FACET.price,
|
|
299
|
+
label: m.label,
|
|
300
|
+
type: 'range',
|
|
301
|
+
data: { min, max, avg },
|
|
302
|
+
order: m.order,
|
|
303
|
+
position: m.position,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (wanted(FACET.genders)) {
|
|
308
|
+
listFacet(FACET.genders, tally((p) => (p.gender ? [p.gender] : [])));
|
|
309
|
+
}
|
|
310
|
+
if (wanted(FACET.sizes)) {
|
|
311
|
+
listFacet(FACET.sizes, tally((p) => p.sizes.map((sz) => sz.value), true));
|
|
312
|
+
}
|
|
313
|
+
if (wanted(FACET.colour)) {
|
|
314
|
+
listFacet(FACET.colour, tally((p) => p.colors.map((c) => c.value)));
|
|
315
|
+
}
|
|
316
|
+
if (wanted(FACET.productType)) {
|
|
317
|
+
listFacet(FACET.productType, tally((p) => (p.productType ? [p.productType] : [])));
|
|
318
|
+
}
|
|
319
|
+
return facets.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Build a SearchProductsResponse from Shopify results.
|
|
323
|
+
*
|
|
324
|
+
* `searchedKey` is deliberately absent — only Wizzy mints one.
|
|
325
|
+
*/
|
|
326
|
+
function mapShopifySearchResponse(products, totalCount, filters, page, productsPerPage, config = search_types_1.DEFAULT_MAPPER_CONFIG, requestedFacetKeys) {
|
|
327
|
+
const mapped = products.map((product) => mapShopifyProduct(product, config));
|
|
328
|
+
return {
|
|
329
|
+
products: mapped,
|
|
330
|
+
total: totalCount,
|
|
331
|
+
pages: productsPerPage > 0 ? Math.max(1, Math.ceil(totalCount / productsPerPage)) : 1,
|
|
332
|
+
currentPage: page,
|
|
333
|
+
productsPerPage,
|
|
334
|
+
hasExactMatch: mapped.length > 0,
|
|
335
|
+
facets: buildFacets(mapped, filters, requestedFacetKeys),
|
|
336
|
+
source: 'shopify',
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Build an AutocompleteResponse from predictiveSearch results.
|
|
341
|
+
*
|
|
342
|
+
* `brands` stays empty — predictiveSearch has no brand suggestions — and
|
|
343
|
+
* `valueHighlighted` mirrors `value`, since Shopify returns no markup.
|
|
344
|
+
*/
|
|
345
|
+
function mapShopifyAutocompleteResponse(result, config = search_types_1.DEFAULT_MAPPER_CONFIG) {
|
|
346
|
+
const toSuggestion = (value, type) => ({ value, valueHighlighted: value, type });
|
|
347
|
+
const queries = result.queries.map((value) => toSuggestion(value, 'query'));
|
|
348
|
+
const categories = result.collections.map((c) => toSuggestion(c.title, 'category'));
|
|
349
|
+
const pages = result.pages.map((p) => toSuggestion(p.title, 'page'));
|
|
350
|
+
return {
|
|
351
|
+
suggestions: [...queries, ...categories, ...pages],
|
|
352
|
+
categories,
|
|
353
|
+
brands: [],
|
|
354
|
+
queries,
|
|
355
|
+
pages,
|
|
356
|
+
products: result.products.map((product) => mapShopifyProduct(product, config)),
|
|
357
|
+
source: 'shopify',
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=shopify-search.mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shopify-search.mapper.js","sourceRoot":"","sources":["../../../src/integrations/search/shopify-search.mapper.ts"],"names":[],"mappings":"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"}
|