medusa-product-helper 0.0.16 → 0.0.18
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/.medusa/server/src/admin/index.js +59 -117
- package/.medusa/server/src/admin/index.mjs +59 -117
- package/.medusa/server/src/api/store/product-helper/products/route.js +41 -5
- package/.medusa/server/src/api/store/product-helper/products/validators.js +2 -1
- package/.medusa/server/src/providers/filter-providers/availability-provider.js +53 -67
- package/.medusa/server/src/providers/filter-providers/base-filter-provider.js +1 -19
- package/.medusa/server/src/providers/filter-providers/base-product-provider.js +37 -100
- package/.medusa/server/src/providers/filter-providers/category-provider.js +15 -34
- package/.medusa/server/src/providers/filter-providers/collection-provider.js +15 -32
- package/.medusa/server/src/providers/filter-providers/index.js +13 -49
- package/.medusa/server/src/providers/filter-providers/metadata-provider.js +38 -57
- package/.medusa/server/src/providers/filter-providers/price-range-provider.js +66 -79
- package/.medusa/server/src/providers/filter-providers/promotion-provider.js +106 -169
- package/.medusa/server/src/providers/filter-providers/promotion-window-provider.js +53 -93
- package/.medusa/server/src/providers/filter-providers/rating-provider.js +47 -70
- package/.medusa/server/src/services/dynamic-filter-service.js +455 -744
- package/.medusa/server/src/services/filter-provider-loader.js +91 -139
- package/.medusa/server/src/services/filter-provider-registry.js +8 -107
- package/.medusa/server/src/services/product-filter-service.js +127 -174
- package/.medusa/server/src/shared/product-metadata/utils.js +66 -116
- package/.medusa/server/src/utils/query-builders/product-filters.js +89 -111
- package/.medusa/server/src/utils/query-parser.js +24 -76
- package/.medusa/server/src/workflows/add-to-wishlist.js +12 -26
- package/.medusa/server/src/workflows/get-wishlist.js +53 -51
- package/.medusa/server/src/workflows/remove-from-wishlist.js +3 -8
- package/package.json +1 -1
|
@@ -8,43 +8,31 @@ exports.hasMetadataChanges = hasMetadataChanges;
|
|
|
8
8
|
exports.validateValueForDescriptor = validateValueForDescriptor;
|
|
9
9
|
const types_1 = require("./types");
|
|
10
10
|
const VALID_FIELD_TYPES = new Set(types_1.METADATA_FIELD_TYPES);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
* - Filters out invalid entries.
|
|
14
|
-
* - Deduplicates by key (first occurrence wins).
|
|
15
|
-
* - Trims key and label whitespace.
|
|
16
|
-
*/
|
|
11
|
+
const BOOLEAN_TRUES = new Set(["true", "1", "yes", "y", "on"]);
|
|
12
|
+
const BOOLEAN_FALSES = new Set(["false", "0", "no", "n", "off"]);
|
|
17
13
|
function normalizeMetadataDescriptors(input) {
|
|
18
|
-
if (!Array.isArray(input))
|
|
14
|
+
if (!Array.isArray(input))
|
|
19
15
|
return [];
|
|
20
|
-
}
|
|
21
16
|
const seenKeys = new Set();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
const label = getNormalizedLabel(item.label);
|
|
36
|
-
const filterable = typeof item.filterable === "boolean"
|
|
37
|
-
? item.filterable
|
|
38
|
-
: Boolean(item.filterable);
|
|
39
|
-
normalized.push({
|
|
40
|
-
key,
|
|
41
|
-
type,
|
|
42
|
-
...(label ? { label } : {}),
|
|
43
|
-
...(filterable ? { filterable: true } : {}),
|
|
44
|
-
});
|
|
17
|
+
return input
|
|
18
|
+
.filter((item) => item && typeof item === "object")
|
|
19
|
+
.map(item => {
|
|
20
|
+
const key = normalizeKey(item.key);
|
|
21
|
+
const type = normalizeType(item.type);
|
|
22
|
+
const label = normalizeLabel(item.label);
|
|
23
|
+
const filterable = !!(item.filterable);
|
|
24
|
+
return { key, type, label, filterable };
|
|
25
|
+
})
|
|
26
|
+
.filter(({ key, type }) => key && type && !seenKeys.has(key))
|
|
27
|
+
.map(({ key, type, label, filterable }) => {
|
|
45
28
|
seenKeys.add(key);
|
|
46
|
-
|
|
47
|
-
|
|
29
|
+
return {
|
|
30
|
+
key: key,
|
|
31
|
+
type: type,
|
|
32
|
+
...(label && { label }),
|
|
33
|
+
...(filterable && { filterable: true })
|
|
34
|
+
};
|
|
35
|
+
});
|
|
48
36
|
}
|
|
49
37
|
function getDescriptorMap(descriptors) {
|
|
50
38
|
return descriptors.reduce((acc, descriptor) => {
|
|
@@ -53,11 +41,9 @@ function getDescriptorMap(descriptors) {
|
|
|
53
41
|
}, {});
|
|
54
42
|
}
|
|
55
43
|
function buildInitialFormState(descriptors, metadata) {
|
|
44
|
+
const base = metadata && typeof metadata === "object" ? metadata : {};
|
|
56
45
|
return descriptors.reduce((acc, descriptor) => {
|
|
57
|
-
|
|
58
|
-
? metadata[descriptor.key]
|
|
59
|
-
: undefined;
|
|
60
|
-
acc[descriptor.key] = normalizeFormValue(descriptor, currentValue);
|
|
46
|
+
acc[descriptor.key] = normalizeFormValue(descriptor, base[descriptor.key]);
|
|
61
47
|
return acc;
|
|
62
48
|
}, {});
|
|
63
49
|
}
|
|
@@ -66,13 +52,13 @@ function buildMetadataPayload({ descriptors, values, originalMetadata, }) {
|
|
|
66
52
|
? { ...originalMetadata }
|
|
67
53
|
: {};
|
|
68
54
|
descriptors.forEach((descriptor) => {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
if (typeof coerced === "undefined") {
|
|
55
|
+
const coerced = coerceMetadataValue(descriptor, values[descriptor.key]);
|
|
56
|
+
if (coerced === undefined) {
|
|
72
57
|
delete base[descriptor.key];
|
|
73
|
-
return;
|
|
74
58
|
}
|
|
75
|
-
|
|
59
|
+
else {
|
|
60
|
+
base[descriptor.key] = coerced;
|
|
61
|
+
}
|
|
76
62
|
});
|
|
77
63
|
return base;
|
|
78
64
|
}
|
|
@@ -81,42 +67,32 @@ function hasMetadataChanges({ descriptors, values, originalMetadata, }) {
|
|
|
81
67
|
const prev = originalMetadata && typeof originalMetadata === "object"
|
|
82
68
|
? originalMetadata
|
|
83
69
|
: {};
|
|
84
|
-
return descriptors.some((
|
|
85
|
-
const prevValue = prev[descriptor.key];
|
|
86
|
-
const nextValue = next[descriptor.key];
|
|
87
|
-
return !isDeepEqual(prevValue, nextValue);
|
|
88
|
-
});
|
|
70
|
+
return descriptors.some(({ key }) => !isDeepEqual(prev[key], next[key]));
|
|
89
71
|
}
|
|
90
72
|
function validateValueForDescriptor(descriptor, value) {
|
|
91
73
|
if (descriptor.type === "number") {
|
|
92
|
-
if (value
|
|
74
|
+
if (value == null || value === "")
|
|
93
75
|
return undefined;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if (Number.isNaN(numericValue)) {
|
|
97
|
-
return "Enter a valid number";
|
|
98
|
-
}
|
|
76
|
+
const num = typeof value === "number" ? value : Number(String(value).trim());
|
|
77
|
+
return isNaN(num) ? "Enter a valid number" : undefined;
|
|
99
78
|
}
|
|
100
79
|
if (descriptor.type === "file") {
|
|
101
|
-
if (!value)
|
|
80
|
+
if (!value)
|
|
102
81
|
return undefined;
|
|
103
|
-
}
|
|
104
82
|
try {
|
|
105
|
-
// eslint-disable-next-line no-new
|
|
106
83
|
new URL(String(value).trim());
|
|
84
|
+
return undefined;
|
|
107
85
|
}
|
|
108
|
-
catch
|
|
86
|
+
catch {
|
|
109
87
|
return "Enter a valid URL";
|
|
110
88
|
}
|
|
111
89
|
}
|
|
112
90
|
return undefined;
|
|
113
91
|
}
|
|
114
92
|
function normalizeFormValue(descriptor, currentValue) {
|
|
115
|
-
if (descriptor.type === "bool")
|
|
93
|
+
if (descriptor.type === "bool")
|
|
116
94
|
return Boolean(currentValue);
|
|
117
|
-
|
|
118
|
-
if ((descriptor.type === "number" || descriptor.type === "text") &&
|
|
119
|
-
typeof currentValue === "number") {
|
|
95
|
+
if ((descriptor.type === "number" || descriptor.type === "text") && typeof currentValue === "number") {
|
|
120
96
|
return currentValue.toString();
|
|
121
97
|
}
|
|
122
98
|
if (typeof currentValue === "string" || typeof currentValue === "number") {
|
|
@@ -125,75 +101,49 @@ function normalizeFormValue(descriptor, currentValue) {
|
|
|
125
101
|
return "";
|
|
126
102
|
}
|
|
127
103
|
function coerceMetadataValue(descriptor, value) {
|
|
128
|
-
if (value
|
|
104
|
+
if (value == null || value === "")
|
|
129
105
|
return undefined;
|
|
130
|
-
}
|
|
131
106
|
if (descriptor.type === "bool") {
|
|
132
|
-
if (typeof value === "boolean")
|
|
107
|
+
if (typeof value === "boolean")
|
|
133
108
|
return value;
|
|
134
|
-
|
|
135
|
-
if (typeof value === "number") {
|
|
109
|
+
if (typeof value === "number")
|
|
136
110
|
return value !== 0;
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
if (["false", "0", "no", "n", "off"].includes(normalized)) {
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
111
|
+
const normalized = String(value).trim().toLowerCase();
|
|
112
|
+
if (!normalized)
|
|
113
|
+
return undefined;
|
|
114
|
+
if (BOOLEAN_TRUES.has(normalized))
|
|
115
|
+
return true;
|
|
116
|
+
if (BOOLEAN_FALSES.has(normalized))
|
|
117
|
+
return false;
|
|
150
118
|
return Boolean(value);
|
|
151
119
|
}
|
|
152
120
|
if (descriptor.type === "number") {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
const parsed = Number(String(value).trim());
|
|
157
|
-
return Number.isNaN(parsed) ? undefined : parsed;
|
|
121
|
+
const num = typeof value === "number" ? value : Number(String(value).trim());
|
|
122
|
+
return isNaN(num) ? undefined : num;
|
|
158
123
|
}
|
|
159
124
|
return String(value).trim();
|
|
160
125
|
}
|
|
161
|
-
function
|
|
162
|
-
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
const trimmed = value.trim();
|
|
166
|
-
return trimmed.length ? trimmed : null;
|
|
126
|
+
function normalizeKey(value) {
|
|
127
|
+
return typeof value === "string" ? value.trim() || undefined : undefined;
|
|
167
128
|
}
|
|
168
|
-
function
|
|
169
|
-
if (typeof value !== "string")
|
|
170
|
-
return
|
|
171
|
-
}
|
|
129
|
+
function normalizeType(value) {
|
|
130
|
+
if (typeof value !== "string")
|
|
131
|
+
return undefined;
|
|
172
132
|
const type = value.trim().toLowerCase();
|
|
173
|
-
return VALID_FIELD_TYPES.has(type) ? type :
|
|
133
|
+
return VALID_FIELD_TYPES.has(type) ? type : undefined;
|
|
174
134
|
}
|
|
175
|
-
function
|
|
176
|
-
|
|
177
|
-
return undefined;
|
|
178
|
-
}
|
|
179
|
-
const trimmed = value.trim();
|
|
180
|
-
return trimmed.length ? trimmed : undefined;
|
|
135
|
+
function normalizeLabel(value) {
|
|
136
|
+
return typeof value === "string" ? value.trim() || undefined : undefined;
|
|
181
137
|
}
|
|
182
138
|
function isDeepEqual(a, b) {
|
|
183
|
-
if (a === b)
|
|
139
|
+
if (a === b)
|
|
184
140
|
return true;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (aKeys.length !== bKeys.length) {
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
return aKeys.every((key) => isDeepEqual(a[key], b[key]));
|
|
196
|
-
}
|
|
197
|
-
return false;
|
|
141
|
+
if (!a || !b || typeof a !== "object" || typeof b !== "object")
|
|
142
|
+
return false;
|
|
143
|
+
const aKeys = Object.keys(a);
|
|
144
|
+
const bKeys = Object.keys(b);
|
|
145
|
+
if (aKeys.length !== bKeys.length)
|
|
146
|
+
return false;
|
|
147
|
+
return aKeys.every(key => isDeepEqual(a[key], b[key]));
|
|
198
148
|
}
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2hhcmVkL3Byb2R1Y3QtbWV0YWRhdGEvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSxvRUF5QkM7QUFFRCw0Q0FLQztBQUVELHNEQVVDO0FBRUQsb0RBd0JDO0FBRUQsZ0RBZUM7QUFFRCxnRUF1QkM7QUE5SEQsbUNBS2dCO0FBS2hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQW9CLDRCQUFvQixDQUFDLENBQUE7QUFDMUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBRWhFLFNBQWdCLDRCQUE0QixDQUFDLEtBQWM7SUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtJQUNsQyxPQUFPLEtBQUs7U0FDVCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQW1DLEVBQUUsQ0FDaEQsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FDakM7U0FDQSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDVixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUUsSUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBRSxJQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFFLElBQVksQ0FBQyxLQUFLLENBQUMs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
|
|
@@ -3,107 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.buildProductFilterPlan = buildProductFilterPlan;
|
|
4
4
|
exports.buildBestSellingPlan = buildBestSellingPlan;
|
|
5
5
|
function buildProductFilterPlan({ query, options, }) {
|
|
6
|
-
const baseFilters =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
if (query.collection_id?.length) {
|
|
14
|
-
baseFilters.collection_id = query.collection_id;
|
|
15
|
-
}
|
|
16
|
-
if (query.category_id?.length) {
|
|
17
|
-
baseFilters.categories = {
|
|
18
|
-
id: query.category_id,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
if (query.tags?.length) {
|
|
22
|
-
baseFilters.tags = {
|
|
23
|
-
value: query.tags,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
if (query.sales_channel_id?.length) {
|
|
27
|
-
baseFilters.sales_channels = {
|
|
28
|
-
id: query.sales_channel_id,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
const metadataAllowList = new Set(options.metadata.products.descriptors
|
|
32
|
-
.filter((descriptor) => descriptor.filterable)
|
|
33
|
-
.map((descriptor) => descriptor.key));
|
|
34
|
-
const metadataFilters = metadataAllowList.size === 0
|
|
35
|
-
? {}
|
|
36
|
-
: Object.entries(query.metadata ?? {}).reduce((acc, [key, value]) => {
|
|
37
|
-
if (metadataAllowList.has(key)) {
|
|
38
|
-
acc[key] = value;
|
|
39
|
-
}
|
|
40
|
-
return acc;
|
|
41
|
-
}, {});
|
|
42
|
-
const priceRange = typeof query.price_min !== "undefined" ||
|
|
43
|
-
typeof query.price_max !== "undefined"
|
|
44
|
-
? {
|
|
45
|
-
min: query.price_min,
|
|
46
|
-
max: query.price_max,
|
|
47
|
-
}
|
|
48
|
-
: options.default_price_range.min !== null ||
|
|
49
|
-
options.default_price_range.max !== null
|
|
50
|
-
? {
|
|
51
|
-
min: options.default_price_range.min ?? undefined,
|
|
52
|
-
max: options.default_price_range.max ?? undefined,
|
|
53
|
-
currency_code: options.default_price_range.currency_code,
|
|
54
|
-
}
|
|
55
|
-
: undefined;
|
|
56
|
-
const promotionWindow = {
|
|
57
|
-
startKey: options.promotion_window.start_metadata_key,
|
|
58
|
-
endKey: options.promotion_window.end_metadata_key,
|
|
59
|
-
range: query.promotion_start || query.promotion_end
|
|
60
|
-
? {
|
|
61
|
-
start: query.promotion_start,
|
|
62
|
-
end: query.promotion_end,
|
|
63
|
-
}
|
|
64
|
-
: undefined,
|
|
65
|
-
activeOn: query.promotion_active_on,
|
|
66
|
-
includeOpen: typeof query.include_open_promotions === "boolean"
|
|
67
|
-
? query.include_open_promotions
|
|
68
|
-
: options.promotion_window.treat_open_ended_as_active,
|
|
69
|
-
};
|
|
70
|
-
const availability = {
|
|
71
|
-
statuses: query.availability_status ?? [],
|
|
72
|
-
include_preorder: typeof query.include_preorder === "boolean"
|
|
73
|
-
? query.include_preorder
|
|
74
|
-
: options.availability.include_preorder,
|
|
75
|
-
include_backorder: typeof query.include_backorder === "boolean"
|
|
76
|
-
? query.include_backorder
|
|
77
|
-
: options.availability.include_backorder,
|
|
78
|
-
include_gift_cards: typeof query.include_gift_cards === "boolean"
|
|
79
|
-
? query.include_gift_cards
|
|
80
|
-
: options.availability.include_gift_cards,
|
|
81
|
-
publishable_only: typeof query.publishable_only === "boolean"
|
|
82
|
-
? query.publishable_only
|
|
83
|
-
: options.availability.publishable_only,
|
|
84
|
-
};
|
|
85
|
-
const rating = options.rating.enabled
|
|
86
|
-
? {
|
|
87
|
-
enabled: true,
|
|
88
|
-
min: typeof query.rating_min !== "undefined"
|
|
89
|
-
? query.rating_min
|
|
90
|
-
: options.rating.min,
|
|
91
|
-
max: typeof query.rating_max !== "undefined"
|
|
92
|
-
? query.rating_max
|
|
93
|
-
: options.rating.max,
|
|
94
|
-
require_reviews: typeof query.rating_required === "boolean"
|
|
95
|
-
? query.rating_required
|
|
96
|
-
: options.rating.require_reviews,
|
|
97
|
-
}
|
|
98
|
-
: {
|
|
99
|
-
enabled: false,
|
|
100
|
-
require_reviews: false,
|
|
101
|
-
};
|
|
6
|
+
const baseFilters = buildBaseFilters(query);
|
|
7
|
+
const metadataFilters = buildMetadataFilters(query, options);
|
|
8
|
+
const priceRange = buildPriceRange(query, options);
|
|
9
|
+
const promotionWindow = buildPromotionWindow(query, options);
|
|
10
|
+
const availability = buildAvailability(query, options);
|
|
11
|
+
const rating = buildRating(query, options);
|
|
102
12
|
return {
|
|
103
|
-
pagination: {
|
|
104
|
-
limit: query.limit,
|
|
105
|
-
offset: query.offset,
|
|
106
|
-
},
|
|
13
|
+
pagination: { limit: query.limit, offset: query.offset },
|
|
107
14
|
projection: {
|
|
108
15
|
fields: query.fields,
|
|
109
16
|
expand: query.expand,
|
|
@@ -118,22 +25,93 @@ function buildProductFilterPlan({ query, options, }) {
|
|
|
118
25
|
rating,
|
|
119
26
|
};
|
|
120
27
|
}
|
|
28
|
+
function buildBaseFilters(query) {
|
|
29
|
+
const filters = {};
|
|
30
|
+
if (query.id?.length)
|
|
31
|
+
filters.id = query.id;
|
|
32
|
+
if (query.handle?.length)
|
|
33
|
+
filters.handle = query.handle;
|
|
34
|
+
if (query.collection_id?.length)
|
|
35
|
+
filters.collection_id = query.collection_id;
|
|
36
|
+
if (query.tags?.length)
|
|
37
|
+
filters.tags = { value: query.tags };
|
|
38
|
+
if (query.sales_channel_id?.length)
|
|
39
|
+
filters.sales_channels = { id: query.sales_channel_id };
|
|
40
|
+
if (query.category_id?.length) {
|
|
41
|
+
filters.categories = { id: query.category_id };
|
|
42
|
+
}
|
|
43
|
+
return filters;
|
|
44
|
+
}
|
|
45
|
+
function buildMetadataFilters(query, options) {
|
|
46
|
+
const metadataAllowList = new Set(options.metadata.products.descriptors
|
|
47
|
+
.filter(descriptor => descriptor.filterable)
|
|
48
|
+
.map(descriptor => descriptor.key));
|
|
49
|
+
if (metadataAllowList.size === 0 || !query.metadata)
|
|
50
|
+
return {};
|
|
51
|
+
return Object.entries(query.metadata).reduce((acc, [key, value]) => {
|
|
52
|
+
if (metadataAllowList.has(key))
|
|
53
|
+
acc[key] = value;
|
|
54
|
+
return acc;
|
|
55
|
+
}, {});
|
|
56
|
+
}
|
|
57
|
+
function buildPriceRange(query, options) {
|
|
58
|
+
const hasQueryRange = query.price_min !== undefined || query.price_max !== undefined;
|
|
59
|
+
const hasDefaultRange = options.default_price_range.min !== null || options.default_price_range.max !== null;
|
|
60
|
+
if (hasQueryRange) {
|
|
61
|
+
return {
|
|
62
|
+
min: query.price_min,
|
|
63
|
+
max: query.price_max,
|
|
64
|
+
currency_code: options.default_price_range.currency_code
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (hasDefaultRange) {
|
|
68
|
+
return {
|
|
69
|
+
min: options.default_price_range.min ?? undefined,
|
|
70
|
+
max: options.default_price_range.max ?? undefined,
|
|
71
|
+
currency_code: options.default_price_range.currency_code
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
function buildPromotionWindow(query, options) {
|
|
77
|
+
const hasRange = query.promotion_start || query.promotion_end;
|
|
78
|
+
return {
|
|
79
|
+
startKey: options.promotion_window.start_metadata_key,
|
|
80
|
+
endKey: options.promotion_window.end_metadata_key,
|
|
81
|
+
range: hasRange ? { start: query.promotion_start, end: query.promotion_end } : undefined,
|
|
82
|
+
activeOn: query.promotion_active_on,
|
|
83
|
+
includeOpen: query.include_open_promotions ?? options.promotion_window.treat_open_ended_as_active
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function buildAvailability(query, options) {
|
|
87
|
+
return {
|
|
88
|
+
statuses: query.availability_status ?? [],
|
|
89
|
+
include_preorder: query.include_preorder ?? options.availability.include_preorder,
|
|
90
|
+
include_backorder: query.include_backorder ?? options.availability.include_backorder,
|
|
91
|
+
include_gift_cards: query.include_gift_cards ?? options.availability.include_gift_cards,
|
|
92
|
+
publishable_only: query.publishable_only ?? options.availability.publishable_only
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function buildRating(query, options) {
|
|
96
|
+
if (!options.rating.enabled) {
|
|
97
|
+
return { enabled: false, require_reviews: false };
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
enabled: true,
|
|
101
|
+
min: query.rating_min ?? options.rating.min,
|
|
102
|
+
max: query.rating_max ?? options.rating.max,
|
|
103
|
+
require_reviews: query.rating_required ?? options.rating.require_reviews
|
|
104
|
+
};
|
|
105
|
+
}
|
|
121
106
|
function buildBestSellingPlan(query) {
|
|
107
|
+
const hasTimeframe = query.timeframe_from || query.timeframe_to;
|
|
122
108
|
return {
|
|
123
|
-
pagination: {
|
|
124
|
-
|
|
125
|
-
offset: query.offset,
|
|
126
|
-
},
|
|
127
|
-
timeframe: query.timeframe_from || query.timeframe_to
|
|
128
|
-
? {
|
|
129
|
-
from: query.timeframe_from,
|
|
130
|
-
to: query.timeframe_to,
|
|
131
|
-
}
|
|
132
|
-
: undefined,
|
|
109
|
+
pagination: { limit: query.limit, offset: query.offset },
|
|
110
|
+
timeframe: hasTimeframe ? { from: query.timeframe_from, to: query.timeframe_to } : undefined,
|
|
133
111
|
sales_channel_id: query.sales_channel_id,
|
|
134
112
|
region_id: query.region_id,
|
|
135
113
|
product_id: query.product_id,
|
|
136
114
|
variant_id: query.variant_id,
|
|
137
115
|
};
|
|
138
116
|
}
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1maWx0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3F1ZXJ5LWJ1aWxkZXJzL3Byb2R1Y3QtZmlsdGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXNDQSx3REE2QkM7QUEwR0Qsb0RBV0M7QUFsSkQsU0FBZ0Isc0JBQXNCLENBQUMsRUFDckMsS0FBSyxFQUNMLE9BQU8sR0FJUjtJQUNDLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNDLE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM1RCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2xELE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM1RCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdEQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUUxQyxPQUFPO1FBQ0wsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDeEQsVUFBVSxFQUFFO1lBQ1YsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ1g7UUFDRCxXQUFXO1FBQ1gsZUFBZTtRQUNmLFVBQVU7UUFDVixlQUFlO1FBQ2YsWUFBWTtRQUNaLE1BQU07S0FDUCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBb0M7SUFDNUQsTUFBTSxPQUFPLEdBQTRCLEVBQUUsQ0FBQTtJQUUzQyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTTtRQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQTtJQUMzQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUFFLE9BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtJQUN2RCxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTTtRQUFFLE9BQU8sQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQTtJQUM1RSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTTtRQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzVELElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFLE1BQU07UUFBRSxPQUFPLENBQUMsY0FBYyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBRTNGLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQzNCLEtBQW9DLEVBQ3BDLE9BQTZCO0lBRTdCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQy9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVc7U0FDbEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUMzQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQ3JDLENBQUE7SUFFRCxJQUFJLGlCQUFpQixDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTlELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUEwQixDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQzFGLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7UUFDaEQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDUixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBQW9DLEVBQ3BDLE9BQTZCO0lBRTdCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFBO0lBQ3BGLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFBO0lBRTVHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsT0FBTztZQUNMLEdBQUcsRUFBRSxLQUFLLENBQUMsU0FBUztZQUNwQixHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVM7WUFDcEIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhO1NBQ3pELENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixPQUFPO1lBQ0wsR0FBRyxFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksU0FBUztZQUNqRCxHQUFHLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsSUFBSSxTQUFTO1lBQ2pELGFBQWEsRUFBRSxPQUFPLENBQUMsbUJBQW1CLENBQUMsYUFBYTtTQUN6RCxDQUFBO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUMzQixLQUFvQyxFQUNwQyxPQUE2QjtJQUU3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUE7SUFFN0QsT0FBTztRQUNMLFFBQVEsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCO1FBQ3JELE1BQU0sRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCO1FBQ2pELEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUN4RixRQUFRLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUNuQyxXQUFXLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEI7S0FDbEcsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixLQUFvQyxFQUNwQyxPQUE2QjtJQUU3QixPQUFPO1FBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxFQUFFO1FBQ3pDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGdCQUFnQjtRQUNqRixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxpQkFBaUI7UUFDcEYsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCO1FBQ3ZGLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGdCQUFnQjtLQUNsRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUNsQixLQUFvQyxFQUNwQyxPQUE2QjtJQUU3QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUE7SUFDbkQsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSTtRQUNiLEdBQUcsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRztRQUMzQyxHQUFHLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUc7UUFDM0MsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlO0tBQ3pFLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsS0FBNEI7SUFDL0QsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFBO0lBRS9ELE9BQU87UUFDTCxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUN4RCxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDNUYsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUN4QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtLQUM3QixDQUFBO0FBQ0gsQ0FBQyJ9
|