@propeller-commerce/propeller-v2-vue-ui 0.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +549 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +178 -0
- package/README.md +282 -0
- package/STYLING.md +119 -0
- package/dist/ProductVideos.vue_vue_type_script_setup_true_lang-BSXOpWBD.js +1706 -0
- package/dist/ProductVideos.vue_vue_type_script_setup_true_lang-BSXOpWBD.js.map +1 -0
- package/dist/ProductVideos.vue_vue_type_script_setup_true_lang-cfRT3L_k.cjs +1705 -0
- package/dist/ProductVideos.vue_vue_type_script_setup_true_lang-cfRT3L_k.cjs.map +1 -0
- package/dist/__mocks__/decorators.d.ts +17 -0
- package/dist/__mocks__/fixtures.d.ts +43 -0
- package/dist/__mocks__/mockServices.d.ts +7 -0
- package/dist/components/AccountIconAndMenu.vue.d.ts +152 -0
- package/dist/components/ActionCode.vue.d.ts +29 -0
- package/dist/components/AddToCart.vue.d.ts +122 -0
- package/dist/components/AddToFavorite.vue.d.ts +19 -0
- package/dist/components/AddressCard.vue.d.ts +169 -0
- package/dist/components/AddressSelector.vue.d.ts +30 -0
- package/dist/components/Breadcrumbs.vue.d.ts +69 -0
- package/dist/components/CartBonusItems.vue.d.ts +21 -0
- package/dist/components/CartCarriers.vue.d.ts +24 -0
- package/dist/components/CartIconAndSidebar.vue.d.ts +104 -0
- package/dist/components/CartItem.vue.d.ts +178 -0
- package/dist/components/CartOverview.vue.d.ts +41 -0
- package/dist/components/CartPaymethods.vue.d.ts +23 -0
- package/dist/components/CartSummary.vue.d.ts +58 -0
- package/dist/components/CategoryDescription.vue.d.ts +29 -0
- package/dist/components/CategoryShortDescription.vue.d.ts +18 -0
- package/dist/components/ClusterCard.vue.d.ts +251 -0
- package/dist/components/ClusterConfigurator.vue.d.ts +41 -0
- package/dist/components/ClusterInfo.vue.d.ts +73 -0
- package/dist/components/ClusterJsonLd.vue.d.ts +10 -0
- package/dist/components/ClusterOptions.vue.d.ts +44 -0
- package/dist/components/CompanySwitcher.vue.d.ts +18 -0
- package/dist/components/DeliveryDate.vue.d.ts +27 -0
- package/dist/components/FavoriteListDetails.vue.d.ts +94 -0
- package/dist/components/FavoriteListItem.vue.d.ts +141 -0
- package/dist/components/FavoriteLists.vue.d.ts +73 -0
- package/dist/components/ForgotPassword.vue.d.ts +35 -0
- package/dist/components/GridFilters.vue.d.ts +64 -0
- package/dist/components/GridPagination.vue.d.ts +34 -0
- package/dist/components/GridTitle.vue.d.ts +22 -0
- package/dist/components/GridToolbar.vue.d.ts +117 -0
- package/dist/components/ItemListJsonLd.vue.d.ts +10 -0
- package/dist/components/ItemStock.vue.d.ts +31 -0
- package/dist/components/ItemsOverview.vue.d.ts +40 -0
- package/dist/components/LoginForm.vue.d.ts +139 -0
- package/dist/components/Menu.vue.d.ts +73 -0
- package/dist/components/OrderActions.vue.d.ts +25 -0
- package/dist/components/OrderBonusItems.vue.d.ts +19 -0
- package/dist/components/OrderItemCard.vue.d.ts +47 -0
- package/dist/components/OrderList.vue.d.ts +66 -0
- package/dist/components/OrderShipments.vue.d.ts +11 -0
- package/dist/components/OrderSummary.vue.d.ts +49 -0
- package/dist/components/OrderTotals.vue.d.ts +34 -0
- package/dist/components/PriceToggle.vue.d.ts +24 -0
- package/dist/components/ProductBulkPrices.vue.d.ts +35 -0
- package/dist/components/ProductBundles.vue.d.ts +88 -0
- package/dist/components/ProductCard.vue.d.ts +332 -0
- package/dist/components/ProductDescription.vue.d.ts +30 -0
- package/dist/components/ProductDownloads.vue.d.ts +22 -0
- package/dist/components/ProductGallery.vue.d.ts +25 -0
- package/dist/components/ProductGrid.vue.d.ts +290 -0
- package/dist/components/ProductInfo.vue.d.ts +179 -0
- package/dist/components/ProductJsonLd.vue.d.ts +10 -0
- package/dist/components/ProductPrice.vue.d.ts +42 -0
- package/dist/components/ProductShortDescription.vue.d.ts +18 -0
- package/dist/components/ProductSlider.vue.d.ts +176 -0
- package/dist/components/ProductSpecifications.vue.d.ts +37 -0
- package/dist/components/ProductTabs.vue.d.ts +83 -0
- package/dist/components/ProductVideos.vue.d.ts +22 -0
- package/dist/components/PropellerProvider.vue.d.ts +40 -0
- package/dist/components/PurchaseAuthorizationConfigurator.vue.d.ts +44 -0
- package/dist/components/PurchaseAuthorizationRequests.vue.d.ts +50 -0
- package/dist/components/QuoteActions.vue.d.ts +22 -0
- package/dist/components/RegisterForm.vue.d.ts +87 -0
- package/dist/components/SearchBar.vue.d.ts +71 -0
- package/dist/components/UserDetails.vue.d.ts +44 -0
- package/dist/components/defaults/DefaultProductBadges.vue.d.ts +3 -0
- package/dist/components/defaults/DefaultProductImage.vue.d.ts +3 -0
- package/dist/components/defaults/DefaultProductSurcharges.vue.d.ts +3 -0
- package/dist/composables/shared/usePagination.d.ts +19 -0
- package/dist/composables/shared/useServiceFetch.d.ts +9 -0
- package/dist/composables/shared/useUserIdentity.d.ts +13 -0
- package/dist/composables/shared/utils/cartInit.d.ts +18 -0
- package/dist/composables/shared/utils/fetchActiveCart.d.ts +10 -0
- package/dist/composables/shared/utils/mergeAnonymousCart.d.ts +12 -0
- package/dist/composables/vue/useAddress.d.ts +50 -0
- package/dist/composables/vue/useAuth.d.ts +80 -0
- package/dist/composables/vue/useCart.d.ts +64 -0
- package/dist/composables/vue/useCheckout.d.ts +41 -0
- package/dist/composables/vue/useClusterConfigurator.d.ts +26 -0
- package/dist/composables/vue/useCompany.d.ts +31 -0
- package/dist/composables/vue/useFavorites.d.ts +39 -0
- package/dist/composables/vue/useInfraProps.d.ts +27 -0
- package/dist/composables/vue/useMenu.d.ts +24 -0
- package/dist/composables/vue/useOrders.d.ts +64 -0
- package/dist/composables/vue/useProductBundles.d.ts +37 -0
- package/dist/composables/vue/useProductInfo.d.ts +33 -0
- package/dist/composables/vue/useProductSearch.d.ts +49 -0
- package/dist/composables/vue/useProductSlider.d.ts +31 -0
- package/dist/composables/vue/useProductSpecs.d.ts +24 -0
- package/dist/composables/vue/usePurchaseAuthorization.d.ts +102 -0
- package/dist/composables/vue/useResolvedProps.d.ts +42 -0
- package/dist/composables/vue/useServices.d.ts +13 -0
- package/dist/context/ProductGridContext.d.ts +59 -0
- package/dist/context/PropellerContext.d.ts +51 -0
- package/dist/index-BN8nyGRL.js +518 -0
- package/dist/index-BN8nyGRL.js.map +1 -0
- package/dist/index-CrrZsxTR.cjs +517 -0
- package/dist/index-CrrZsxTR.cjs.map +1 -0
- package/dist/index.cjs +20086 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.js +20088 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +67 -0
- package/dist/pure.cjs +16 -0
- package/dist/pure.cjs.map +1 -0
- package/dist/pure.d.ts +37 -0
- package/dist/pure.js +16 -0
- package/dist/pure.js.map +1 -0
- package/dist/shared.cjs +50 -0
- package/dist/shared.cjs.map +1 -0
- package/dist/shared.d.ts +14 -0
- package/dist/shared.js +50 -0
- package/dist/shared.js.map +1 -0
- package/dist/styles.css +2 -0
- package/package.json +91 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const propellerSdkV2 = require("@propeller-commerce/propeller-sdk-v2");
|
|
3
|
+
var ok = (data) => ({ ok: true, data });
|
|
4
|
+
var err = (error) => ({ ok: false, error });
|
|
5
|
+
async function tryAsync(fn) {
|
|
6
|
+
try {
|
|
7
|
+
return ok(await fn());
|
|
8
|
+
} catch (e) {
|
|
9
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function attributeNameMatches(attr, targetName) {
|
|
13
|
+
const desc = attr.attributeDescription;
|
|
14
|
+
if (!desc) return false;
|
|
15
|
+
if (desc.name === targetName) return true;
|
|
16
|
+
if (desc.descriptions?.some((d) => d.value === targetName)) return true;
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
function getAttributeDisplayName(attr, language) {
|
|
20
|
+
const desc = attr.attributeDescription;
|
|
21
|
+
if (!desc) return "";
|
|
22
|
+
if (language && desc.descriptions?.length) {
|
|
23
|
+
const lang = language.toUpperCase();
|
|
24
|
+
const match = desc.descriptions.find((d) => d.language?.toUpperCase() === lang);
|
|
25
|
+
if (match?.value) return match.value;
|
|
26
|
+
}
|
|
27
|
+
return desc.descriptions?.[0]?.value ?? desc.name ?? "";
|
|
28
|
+
}
|
|
29
|
+
function extractAttributeValues(attr) {
|
|
30
|
+
const values = [];
|
|
31
|
+
const v = attr.value;
|
|
32
|
+
if (!v) return values;
|
|
33
|
+
if (v.colorValue) {
|
|
34
|
+
values.push(v.colorValue);
|
|
35
|
+
} else if (Array.isArray(v.textValues)) {
|
|
36
|
+
const firstNonEmpty = v.textValues.find(
|
|
37
|
+
(entry) => Array.isArray(entry?.values) && entry.values.length > 0
|
|
38
|
+
);
|
|
39
|
+
const list = firstNonEmpty?.values ?? [];
|
|
40
|
+
return list.filter(Boolean);
|
|
41
|
+
} else if (v.textValue) {
|
|
42
|
+
values.push(v.textValue);
|
|
43
|
+
} else if (v.numericValue !== void 0) {
|
|
44
|
+
values.push(String(v.numericValue));
|
|
45
|
+
} else if (v.booleanValue !== void 0) {
|
|
46
|
+
values.push(v.booleanValue ? "Yes" : "No");
|
|
47
|
+
} else if (v.type === propellerSdkV2.AttributeType.COLOR) {
|
|
48
|
+
if (v.value) values.push(v.value);
|
|
49
|
+
} else if (v.type === propellerSdkV2.AttributeType.TEXT) {
|
|
50
|
+
const buckets = v.value?.textValues ?? [];
|
|
51
|
+
const firstNonEmpty = buckets.find(
|
|
52
|
+
(entry) => Array.isArray(entry?.values) && entry.values.length > 0
|
|
53
|
+
);
|
|
54
|
+
const textVals = firstNonEmpty?.values ?? [];
|
|
55
|
+
return textVals.filter(Boolean);
|
|
56
|
+
} else if (v.type === propellerSdkV2.AttributeType.DECIMAL) {
|
|
57
|
+
if (v.value !== void 0) values.push(String(v.value));
|
|
58
|
+
} else if (v.type === propellerSdkV2.AttributeType.INT) {
|
|
59
|
+
if (v.value !== void 0) values.push(String(v.value));
|
|
60
|
+
} else if (v.type === propellerSdkV2.AttributeType.ENUM) {
|
|
61
|
+
if (v.value) values.push(v.value);
|
|
62
|
+
} else if (typeof v === "string") {
|
|
63
|
+
values.push(v);
|
|
64
|
+
} else if (typeof v === "object") {
|
|
65
|
+
if (Array.isArray(v.values)) {
|
|
66
|
+
return v.values.filter((x) => typeof x === "string");
|
|
67
|
+
}
|
|
68
|
+
const strVals = Object.values(v).filter((x) => typeof x === "string");
|
|
69
|
+
return strVals;
|
|
70
|
+
}
|
|
71
|
+
return values.filter(Boolean);
|
|
72
|
+
}
|
|
73
|
+
function collectAttributeValues(products, attributeName) {
|
|
74
|
+
const set = /* @__PURE__ */ new Set();
|
|
75
|
+
for (const product of products) {
|
|
76
|
+
const items = product.attributes?.items;
|
|
77
|
+
if (!Array.isArray(items)) continue;
|
|
78
|
+
for (const attr of items) {
|
|
79
|
+
if (attributeNameMatches(attr, attributeName)) {
|
|
80
|
+
extractAttributeValues(attr).forEach((v) => set.add(v));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return Array.from(set);
|
|
85
|
+
}
|
|
86
|
+
function filterProductsBySelections(products, selections) {
|
|
87
|
+
const entries = Object.entries(selections);
|
|
88
|
+
if (entries.length === 0) return products;
|
|
89
|
+
return products.filter((product) => {
|
|
90
|
+
const items = product.attributes?.items;
|
|
91
|
+
if (!Array.isArray(items)) return false;
|
|
92
|
+
return entries.every(
|
|
93
|
+
([attrName, attrValue]) => items.some(
|
|
94
|
+
(attr) => attributeNameMatches(attr, attrName) && extractAttributeValues(attr).includes(attrValue)
|
|
95
|
+
)
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
var COUNTRIES = [
|
|
100
|
+
{ code: "NL", name: "Netherlands" },
|
|
101
|
+
{ code: "BE", name: "Belgium" },
|
|
102
|
+
{ code: "DE", name: "Germany" },
|
|
103
|
+
{ code: "FR", name: "France" },
|
|
104
|
+
{ code: "UK", name: "United Kingdom" },
|
|
105
|
+
{ code: "US", name: "United States" }
|
|
106
|
+
];
|
|
107
|
+
var COUNTRIES_MAP = COUNTRIES.reduce(
|
|
108
|
+
(acc, c) => {
|
|
109
|
+
acc[c.code] = c.name;
|
|
110
|
+
return acc;
|
|
111
|
+
},
|
|
112
|
+
{}
|
|
113
|
+
);
|
|
114
|
+
function getCountryName(code, list) {
|
|
115
|
+
if (!code) return "";
|
|
116
|
+
const effective = list && list.length > 0 ? list : COUNTRIES;
|
|
117
|
+
const match = effective.find((c) => c.code === code);
|
|
118
|
+
return match?.name ?? code;
|
|
119
|
+
}
|
|
120
|
+
function formatPrice(amount, options = {}) {
|
|
121
|
+
if (amount === null || amount === void 0) return "";
|
|
122
|
+
const { currency = "EUR", locale = "nl-NL", symbol } = options;
|
|
123
|
+
if (symbol !== void 0) {
|
|
124
|
+
const formattedNumber = new Intl.NumberFormat(locale, {
|
|
125
|
+
minimumFractionDigits: 2,
|
|
126
|
+
maximumFractionDigits: 2
|
|
127
|
+
}).format(Number(amount));
|
|
128
|
+
return symbol ? `${symbol} ${formattedNumber}` : formattedNumber;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
return new Intl.NumberFormat(locale, {
|
|
132
|
+
style: "currency",
|
|
133
|
+
currency,
|
|
134
|
+
minimumFractionDigits: 2,
|
|
135
|
+
maximumFractionDigits: 2
|
|
136
|
+
}).format(amount);
|
|
137
|
+
} catch {
|
|
138
|
+
return `€${Number(amount).toFixed(2)}`;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function formatDate(date, options = {}) {
|
|
142
|
+
if (!date) return "";
|
|
143
|
+
const { locale = "nl-NL", dateStyle = "medium" } = options;
|
|
144
|
+
try {
|
|
145
|
+
const d = typeof date === "string" ? new Date(date) : date;
|
|
146
|
+
if (isNaN(d.getTime())) return "";
|
|
147
|
+
return new Intl.DateTimeFormat(locale, { dateStyle }).format(d);
|
|
148
|
+
} catch {
|
|
149
|
+
return String(date);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function formatSurcharge(surcharge, options = {}) {
|
|
153
|
+
if (!surcharge) return "";
|
|
154
|
+
const { quantity = 1, language, currency = "€", locale = "nl-NL" } = options;
|
|
155
|
+
const localized = surcharge.names ?? surcharge.name ?? [];
|
|
156
|
+
const name = localized.find((n) => n.language === language)?.value ?? localized[0]?.value ?? "";
|
|
157
|
+
const value = Number(surcharge.value ?? 0);
|
|
158
|
+
const isPercentage = String(surcharge.type ?? "").toLowerCase() === "percentage";
|
|
159
|
+
if (isPercentage) {
|
|
160
|
+
return `${quantity} x ${value}% (${name})`;
|
|
161
|
+
}
|
|
162
|
+
return `${quantity} x ${formatPrice(value, { symbol: currency, locale })} (${name})`;
|
|
163
|
+
}
|
|
164
|
+
function calcDiscountPercent(original, discounted) {
|
|
165
|
+
if (!original || original === 0) return 0;
|
|
166
|
+
if (discounted === null || discounted === void 0) return 0;
|
|
167
|
+
return Math.round((original - discounted) / original * 100);
|
|
168
|
+
}
|
|
169
|
+
function getStockStatus(quantity) {
|
|
170
|
+
if (quantity <= 0) return { label: "Out of stock", className: "text-destructive bg-destructive/10" };
|
|
171
|
+
if (quantity <= 5) return { label: "Low stock", className: "text-warning bg-warning/10" };
|
|
172
|
+
return { label: "In stock", className: "text-success bg-success/10" };
|
|
173
|
+
}
|
|
174
|
+
function getLabel(labels, key, fallback) {
|
|
175
|
+
return labels?.[key] || fallback;
|
|
176
|
+
}
|
|
177
|
+
function resolveLanguageEntry(items, language, fallback) {
|
|
178
|
+
if (!items || items.length === 0) return void 0;
|
|
179
|
+
const lang = language.toUpperCase();
|
|
180
|
+
return items.find((item) => item.language?.toUpperCase() === lang) ?? items[0];
|
|
181
|
+
}
|
|
182
|
+
function getLanguageString(items, language, fallback = "") {
|
|
183
|
+
if (!items || items.length === 0) return fallback;
|
|
184
|
+
const lang = language.toUpperCase();
|
|
185
|
+
const direct = items.find((item) => item.language?.toUpperCase() === lang);
|
|
186
|
+
if (direct?.value) return direct.value;
|
|
187
|
+
for (const item of items) {
|
|
188
|
+
if (item.value) return item.value;
|
|
189
|
+
}
|
|
190
|
+
return fallback;
|
|
191
|
+
}
|
|
192
|
+
function getLanguageUri(items, language, fallback = "") {
|
|
193
|
+
const entry = resolveLanguageEntry(items, language);
|
|
194
|
+
return entry?.uri ?? fallback;
|
|
195
|
+
}
|
|
196
|
+
function getProductImageUrl(product) {
|
|
197
|
+
return product?.media?.images?.items?.[0]?.imageVariants?.[0]?.url || "";
|
|
198
|
+
}
|
|
199
|
+
function getClusterImageUrl(cluster) {
|
|
200
|
+
return cluster?.defaultProduct?.media?.images?.items?.[0]?.imageVariants?.[0]?.url || "";
|
|
201
|
+
}
|
|
202
|
+
function getProductSku(product) {
|
|
203
|
+
return product?.sku || "";
|
|
204
|
+
}
|
|
205
|
+
function getClusterSku(cluster) {
|
|
206
|
+
return cluster?.sku || cluster?.defaultProduct?.sku || "";
|
|
207
|
+
}
|
|
208
|
+
function getLocalizedValue(items, language, fallback = "") {
|
|
209
|
+
return getLanguageString(items, language || "NL", fallback);
|
|
210
|
+
}
|
|
211
|
+
function stripHtml(html) {
|
|
212
|
+
return html.replace(/<[^>]*>/g, "");
|
|
213
|
+
}
|
|
214
|
+
function shouldTruncate(html, maxLength) {
|
|
215
|
+
if (!maxLength || maxLength <= 0) return false;
|
|
216
|
+
const plain = stripHtml(html);
|
|
217
|
+
return plain.length > maxLength;
|
|
218
|
+
}
|
|
219
|
+
function truncateAt(html, maxLength) {
|
|
220
|
+
if (!maxLength || maxLength <= 0) return html;
|
|
221
|
+
const plain = stripHtml(html);
|
|
222
|
+
if (plain.length <= maxLength) return html;
|
|
223
|
+
const truncated = plain.substring(0, maxLength);
|
|
224
|
+
const lastSpace = truncated.lastIndexOf(" ");
|
|
225
|
+
return (lastSpace > 0 ? truncated.substring(0, lastSpace) : truncated) + "…";
|
|
226
|
+
}
|
|
227
|
+
function isContact(user) {
|
|
228
|
+
return !!user && "contactId" in user;
|
|
229
|
+
}
|
|
230
|
+
function isCustomer(user) {
|
|
231
|
+
return !!user && "customerId" in user && !("contactId" in user);
|
|
232
|
+
}
|
|
233
|
+
function getUserId(user) {
|
|
234
|
+
if (!user) return null;
|
|
235
|
+
if (isContact(user)) return user.contactId ?? null;
|
|
236
|
+
if (isCustomer(user)) return user.customerId ?? null;
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
function getCompany(user) {
|
|
240
|
+
if (!user || !isContact(user)) return null;
|
|
241
|
+
return user.company ?? null;
|
|
242
|
+
}
|
|
243
|
+
function getCompanyId(user) {
|
|
244
|
+
return getCompany(user)?.companyId ?? null;
|
|
245
|
+
}
|
|
246
|
+
function getAddresses(user) {
|
|
247
|
+
if (!user) return [];
|
|
248
|
+
if (isContact(user)) {
|
|
249
|
+
return user.company?.addresses ?? [];
|
|
250
|
+
}
|
|
251
|
+
return user.addresses ?? [];
|
|
252
|
+
}
|
|
253
|
+
function getDefaultInvoiceAddress(user) {
|
|
254
|
+
return getAddresses(user).find(
|
|
255
|
+
(addr) => addr.isDefault === "Y" && addr.type === "invoice"
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
function getDefaultDeliveryAddress(user) {
|
|
259
|
+
return getAddresses(user).find(
|
|
260
|
+
(addr) => addr.isDefault === "Y" && addr.type === "delivery"
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
function isEmbeddable(uri) {
|
|
264
|
+
return uri.includes("youtube.com") || uri.includes("youtu.be") || uri.includes("vimeo.com");
|
|
265
|
+
}
|
|
266
|
+
function normalizeVideoUrl(uri) {
|
|
267
|
+
if (uri.includes("youtube.com/watch")) {
|
|
268
|
+
try {
|
|
269
|
+
const url = new URL(uri);
|
|
270
|
+
const videoId = url.searchParams.get("v") || "";
|
|
271
|
+
return `https://www.youtube.com/embed/${videoId}`;
|
|
272
|
+
} catch {
|
|
273
|
+
return uri;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (uri.includes("youtu.be/")) {
|
|
277
|
+
const videoId = uri.split("youtu.be/")[1]?.split("?")[0] || "";
|
|
278
|
+
return `https://www.youtube.com/embed/${videoId}`;
|
|
279
|
+
}
|
|
280
|
+
if (uri.includes("vimeo.com/")) {
|
|
281
|
+
const videoId = uri.split("vimeo.com/")[1]?.split("?")[0] || "";
|
|
282
|
+
return `https://player.vimeo.com/video/${videoId}`;
|
|
283
|
+
}
|
|
284
|
+
return uri;
|
|
285
|
+
}
|
|
286
|
+
function isContentHidden(portalMode, user) {
|
|
287
|
+
return portalMode === "semi-closed" && !user;
|
|
288
|
+
}
|
|
289
|
+
function safeJsonStringify(value) {
|
|
290
|
+
return JSON.stringify(value).replace(/<\//g, "<\\/");
|
|
291
|
+
}
|
|
292
|
+
function shouldShowOffers(ctx) {
|
|
293
|
+
return !isContentHidden(ctx.portalMode, ctx.user);
|
|
294
|
+
}
|
|
295
|
+
function toAbsolute(siteUrl, pathOrUrl) {
|
|
296
|
+
if (!pathOrUrl) return "";
|
|
297
|
+
if (/^https?:\/\//i.test(pathOrUrl)) return pathOrUrl;
|
|
298
|
+
const base = siteUrl.replace(/\/$/, "");
|
|
299
|
+
const path = pathOrUrl.startsWith("/") ? pathOrUrl : `/${pathOrUrl}`;
|
|
300
|
+
return base + path;
|
|
301
|
+
}
|
|
302
|
+
function formatPriceForJsonLd(amount) {
|
|
303
|
+
if (amount == null || !Number.isFinite(amount)) return void 0;
|
|
304
|
+
return amount.toFixed(2);
|
|
305
|
+
}
|
|
306
|
+
function cleanDescription(value) {
|
|
307
|
+
if (!value) return void 0;
|
|
308
|
+
const text = stripHtml(value).replace(/\s+/g, " ").trim();
|
|
309
|
+
return text.length > 0 ? text : void 0;
|
|
310
|
+
}
|
|
311
|
+
function buildOffers(product, absoluteUrl, ctx) {
|
|
312
|
+
if (!shouldShowOffers(ctx)) return void 0;
|
|
313
|
+
const price = formatPriceForJsonLd(product.price?.net);
|
|
314
|
+
if (price === void 0) return void 0;
|
|
315
|
+
const offer = {
|
|
316
|
+
"@type": "Offer",
|
|
317
|
+
url: absoluteUrl,
|
|
318
|
+
priceCurrency: ctx.currencyCode,
|
|
319
|
+
price,
|
|
320
|
+
itemCondition: "https://schema.org/NewCondition"
|
|
321
|
+
};
|
|
322
|
+
const qty = product.inventory?.totalQuantity;
|
|
323
|
+
if (typeof qty === "number") {
|
|
324
|
+
offer.availability = qty > 0 ? "https://schema.org/InStock" : "https://schema.org/OutOfStock";
|
|
325
|
+
}
|
|
326
|
+
return offer;
|
|
327
|
+
}
|
|
328
|
+
function buildProductJsonLd(product, ctx) {
|
|
329
|
+
if (!product) return null;
|
|
330
|
+
const name = getLanguageString(product.names, ctx.language, "").trim();
|
|
331
|
+
const relativeUrl = ctx.urls.getProductUrl(product, ctx.language);
|
|
332
|
+
const absoluteUrl = toAbsolute(ctx.siteUrl, relativeUrl);
|
|
333
|
+
if (!name && !absoluteUrl) return null;
|
|
334
|
+
const description = cleanDescription(
|
|
335
|
+
getLanguageString(product.descriptions, ctx.language, "") || getLanguageString(product.shortDescriptions, ctx.language, "")
|
|
336
|
+
);
|
|
337
|
+
const imageUrl = getProductImageUrl(product);
|
|
338
|
+
const absoluteImage = imageUrl ? toAbsolute(ctx.siteUrl, imageUrl) : void 0;
|
|
339
|
+
const categoryName = getLanguageString(product.category?.name, ctx.language, "").trim();
|
|
340
|
+
const data = {
|
|
341
|
+
"@context": "https://schema.org/",
|
|
342
|
+
"@type": "Product"
|
|
343
|
+
};
|
|
344
|
+
if (name) data.name = name;
|
|
345
|
+
if (absoluteUrl) data.url = absoluteUrl;
|
|
346
|
+
if (absoluteImage) data.image = absoluteImage;
|
|
347
|
+
if (description) data.description = description;
|
|
348
|
+
if (product.manufacturerCode) data.mpn = product.manufacturerCode;
|
|
349
|
+
if (product.sku) data.sku = product.sku;
|
|
350
|
+
if (product.productId != null) data.productID = String(product.productId);
|
|
351
|
+
if (categoryName) data.category = categoryName;
|
|
352
|
+
if (product.manufacturer) {
|
|
353
|
+
data.brand = { "@type": "Brand", name: product.manufacturer };
|
|
354
|
+
}
|
|
355
|
+
const offers = buildOffers(product, absoluteUrl, ctx);
|
|
356
|
+
if (offers) data.offers = offers;
|
|
357
|
+
return data;
|
|
358
|
+
}
|
|
359
|
+
function buildClusterJsonLd(cluster, ctx) {
|
|
360
|
+
if (!cluster) return null;
|
|
361
|
+
const defaultProduct = cluster.defaultProduct;
|
|
362
|
+
const name = getLanguageString(cluster.names, ctx.language, "").trim();
|
|
363
|
+
const relativeUrl = ctx.urls.getClusterUrl(cluster, ctx.language);
|
|
364
|
+
const absoluteUrl = toAbsolute(ctx.siteUrl, relativeUrl);
|
|
365
|
+
if (!name && !absoluteUrl) return null;
|
|
366
|
+
const description = cleanDescription(
|
|
367
|
+
getLanguageString(cluster.descriptions, ctx.language, "")
|
|
368
|
+
);
|
|
369
|
+
const imageUrl = getClusterImageUrl(cluster);
|
|
370
|
+
const absoluteImage = imageUrl ? toAbsolute(ctx.siteUrl, imageUrl) : void 0;
|
|
371
|
+
const categoryName = getLanguageString(cluster.category?.name, ctx.language, "").trim();
|
|
372
|
+
const data = {
|
|
373
|
+
"@context": "https://schema.org/",
|
|
374
|
+
"@type": "Product"
|
|
375
|
+
};
|
|
376
|
+
if (name) data.name = name;
|
|
377
|
+
if (absoluteUrl) data.url = absoluteUrl;
|
|
378
|
+
if (absoluteImage) data.image = absoluteImage;
|
|
379
|
+
if (description) data.description = description;
|
|
380
|
+
if (defaultProduct?.manufacturerCode) data.mpn = defaultProduct.manufacturerCode;
|
|
381
|
+
const sku = cluster.sku || defaultProduct?.sku;
|
|
382
|
+
if (sku) data.sku = sku;
|
|
383
|
+
if (cluster.clusterId != null) data.productID = String(cluster.clusterId);
|
|
384
|
+
if (categoryName) data.category = categoryName;
|
|
385
|
+
if (defaultProduct?.manufacturer) {
|
|
386
|
+
data.brand = { "@type": "Brand", name: defaultProduct.manufacturer };
|
|
387
|
+
}
|
|
388
|
+
if (defaultProduct) {
|
|
389
|
+
const offers = buildOffers(defaultProduct, absoluteUrl, ctx);
|
|
390
|
+
if (offers) data.offers = offers;
|
|
391
|
+
}
|
|
392
|
+
return data;
|
|
393
|
+
}
|
|
394
|
+
function buildItemListJsonLd(products, ctx) {
|
|
395
|
+
if (!products || products.length === 0) return null;
|
|
396
|
+
const itemListElement = [];
|
|
397
|
+
products.forEach((item, index) => {
|
|
398
|
+
const isCluster = item.class === propellerSdkV2.ProductClass.CLUSTER;
|
|
399
|
+
const productForFields = isCluster ? item.defaultProduct : item;
|
|
400
|
+
if (!productForFields) return;
|
|
401
|
+
const cluster = isCluster ? item : void 0;
|
|
402
|
+
const relativeUrl = cluster ? ctx.urls.getClusterUrl(cluster, ctx.language) : ctx.urls.getProductUrl(item, ctx.language);
|
|
403
|
+
const absoluteUrl = toAbsolute(ctx.siteUrl, relativeUrl);
|
|
404
|
+
const productNode = buildProductJsonLd(productForFields, ctx);
|
|
405
|
+
if (!productNode) return;
|
|
406
|
+
if (absoluteUrl) productNode.url = absoluteUrl;
|
|
407
|
+
if (productNode.offers && typeof productNode.offers === "object") {
|
|
408
|
+
productNode.offers.url = absoluteUrl;
|
|
409
|
+
}
|
|
410
|
+
delete productNode["@context"];
|
|
411
|
+
itemListElement.push({
|
|
412
|
+
"@type": "ListItem",
|
|
413
|
+
position: index + 1,
|
|
414
|
+
item: productNode
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
if (itemListElement.length === 0) return null;
|
|
418
|
+
return {
|
|
419
|
+
"@context": "https://schema.org/",
|
|
420
|
+
"@type": "ItemList",
|
|
421
|
+
numberOfItems: itemListElement.length,
|
|
422
|
+
itemListElement
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
function deriveUserMode(user, shopMode) {
|
|
426
|
+
if (!user) return "anonymous";
|
|
427
|
+
if (shopMode === "b2b") return "b2b";
|
|
428
|
+
if (shopMode === "b2c") return "b2c";
|
|
429
|
+
return isContact(user) ? "b2b" : "b2c";
|
|
430
|
+
}
|
|
431
|
+
var servicesByClient = /* @__PURE__ */ new WeakMap();
|
|
432
|
+
function createServices(client) {
|
|
433
|
+
const cached = servicesByClient.get(client);
|
|
434
|
+
if (cached) return cached;
|
|
435
|
+
const services = {
|
|
436
|
+
product: new propellerSdkV2.ProductService(client),
|
|
437
|
+
cart: new propellerSdkV2.CartService(client),
|
|
438
|
+
user: new propellerSdkV2.UserService(client),
|
|
439
|
+
category: new propellerSdkV2.CategoryService(client),
|
|
440
|
+
order: new propellerSdkV2.OrderService(client),
|
|
441
|
+
payMethod: new propellerSdkV2.PayMethodService(client),
|
|
442
|
+
login: new propellerSdkV2.LoginService(client),
|
|
443
|
+
address: new propellerSdkV2.AddressService(client),
|
|
444
|
+
company: new propellerSdkV2.CompanyService(client),
|
|
445
|
+
crossupsell: new propellerSdkV2.CrossupsellService(client),
|
|
446
|
+
bundle: new propellerSdkV2.BundleService(client),
|
|
447
|
+
favoriteList: new propellerSdkV2.FavoriteListService(client),
|
|
448
|
+
purchaseAuthConfig: new propellerSdkV2.PurchaseAuthorizationConfigService(client),
|
|
449
|
+
cluster: new propellerSdkV2.ClusterService(client),
|
|
450
|
+
orderlist: new propellerSdkV2.OrderlistService(client)
|
|
451
|
+
};
|
|
452
|
+
servicesByClient.set(client, services);
|
|
453
|
+
return services;
|
|
454
|
+
}
|
|
455
|
+
function toPlain(value) {
|
|
456
|
+
return deepPlainInner(value);
|
|
457
|
+
}
|
|
458
|
+
function deepPlainInner(value) {
|
|
459
|
+
if (value === null || value === void 0) return value;
|
|
460
|
+
if (Array.isArray(value)) return value.map(deepPlainInner);
|
|
461
|
+
if (typeof value === "object") {
|
|
462
|
+
const out = {};
|
|
463
|
+
for (const key of Object.keys(value)) {
|
|
464
|
+
const cleanKey = key.startsWith("_") ? key.slice(1) : key;
|
|
465
|
+
out[cleanKey] = deepPlainInner(value[key]);
|
|
466
|
+
}
|
|
467
|
+
return out;
|
|
468
|
+
}
|
|
469
|
+
return value;
|
|
470
|
+
}
|
|
471
|
+
exports.COUNTRIES = COUNTRIES;
|
|
472
|
+
exports.COUNTRIES_MAP = COUNTRIES_MAP;
|
|
473
|
+
exports.attributeNameMatches = attributeNameMatches;
|
|
474
|
+
exports.buildClusterJsonLd = buildClusterJsonLd;
|
|
475
|
+
exports.buildItemListJsonLd = buildItemListJsonLd;
|
|
476
|
+
exports.buildProductJsonLd = buildProductJsonLd;
|
|
477
|
+
exports.calcDiscountPercent = calcDiscountPercent;
|
|
478
|
+
exports.collectAttributeValues = collectAttributeValues;
|
|
479
|
+
exports.createServices = createServices;
|
|
480
|
+
exports.deriveUserMode = deriveUserMode;
|
|
481
|
+
exports.err = err;
|
|
482
|
+
exports.extractAttributeValues = extractAttributeValues;
|
|
483
|
+
exports.filterProductsBySelections = filterProductsBySelections;
|
|
484
|
+
exports.formatDate = formatDate;
|
|
485
|
+
exports.formatPrice = formatPrice;
|
|
486
|
+
exports.formatSurcharge = formatSurcharge;
|
|
487
|
+
exports.getAddresses = getAddresses;
|
|
488
|
+
exports.getAttributeDisplayName = getAttributeDisplayName;
|
|
489
|
+
exports.getClusterImageUrl = getClusterImageUrl;
|
|
490
|
+
exports.getClusterSku = getClusterSku;
|
|
491
|
+
exports.getCompany = getCompany;
|
|
492
|
+
exports.getCompanyId = getCompanyId;
|
|
493
|
+
exports.getCountryName = getCountryName;
|
|
494
|
+
exports.getDefaultDeliveryAddress = getDefaultDeliveryAddress;
|
|
495
|
+
exports.getDefaultInvoiceAddress = getDefaultInvoiceAddress;
|
|
496
|
+
exports.getLabel = getLabel;
|
|
497
|
+
exports.getLanguageString = getLanguageString;
|
|
498
|
+
exports.getLanguageUri = getLanguageUri;
|
|
499
|
+
exports.getLocalizedValue = getLocalizedValue;
|
|
500
|
+
exports.getProductImageUrl = getProductImageUrl;
|
|
501
|
+
exports.getProductSku = getProductSku;
|
|
502
|
+
exports.getStockStatus = getStockStatus;
|
|
503
|
+
exports.getUserId = getUserId;
|
|
504
|
+
exports.isContact = isContact;
|
|
505
|
+
exports.isContentHidden = isContentHidden;
|
|
506
|
+
exports.isCustomer = isCustomer;
|
|
507
|
+
exports.isEmbeddable = isEmbeddable;
|
|
508
|
+
exports.normalizeVideoUrl = normalizeVideoUrl;
|
|
509
|
+
exports.ok = ok;
|
|
510
|
+
exports.resolveLanguageEntry = resolveLanguageEntry;
|
|
511
|
+
exports.safeJsonStringify = safeJsonStringify;
|
|
512
|
+
exports.shouldTruncate = shouldTruncate;
|
|
513
|
+
exports.stripHtml = stripHtml;
|
|
514
|
+
exports.toPlain = toPlain;
|
|
515
|
+
exports.truncateAt = truncateAt;
|
|
516
|
+
exports.tryAsync = tryAsync;
|
|
517
|
+
//# sourceMappingURL=index-CrrZsxTR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CrrZsxTR.cjs","sources":["../node_modules/@propeller-commerce/propeller-v2-core-ui/dist/index.js"],"sourcesContent":["// src/types/result.ts\nvar ok = (data) => ({ ok: true, data });\nvar err = (error) => ({ ok: false, error });\nasync function tryAsync(fn) {\n try {\n return ok(await fn());\n } catch (e) {\n return err(e instanceof Error ? e.message : String(e));\n }\n}\n\n// src/utils/attributeExtractor.ts\nimport { AttributeType } from \"@propeller-commerce/propeller-sdk-v2\";\nfunction attributeNameMatches(attr, targetName) {\n const desc = attr.attributeDescription;\n if (!desc) return false;\n if (desc.name === targetName) return true;\n if (desc.descriptions?.some((d) => d.value === targetName)) return true;\n return false;\n}\nfunction getAttributeDisplayName(attr, language) {\n const desc = attr.attributeDescription;\n if (!desc) return \"\";\n if (language && desc.descriptions?.length) {\n const lang = language.toUpperCase();\n const match = desc.descriptions.find((d) => d.language?.toUpperCase() === lang);\n if (match?.value) return match.value;\n }\n return desc.descriptions?.[0]?.value ?? desc.name ?? \"\";\n}\nfunction extractAttributeValues(attr) {\n const values = [];\n const v = attr.value;\n if (!v) return values;\n if (v.colorValue) {\n values.push(v.colorValue);\n } else if (Array.isArray(v.textValues)) {\n const firstNonEmpty = v.textValues.find(\n (entry) => Array.isArray(entry?.values) && entry.values.length > 0\n );\n const list = firstNonEmpty?.values ?? [];\n return list.filter(Boolean);\n } else if (v.textValue) {\n values.push(v.textValue);\n } else if (v.numericValue !== void 0) {\n values.push(String(v.numericValue));\n } else if (v.booleanValue !== void 0) {\n values.push(v.booleanValue ? \"Yes\" : \"No\");\n } else if (v.type === AttributeType.COLOR) {\n if (v.value) values.push(v.value);\n } else if (v.type === AttributeType.TEXT) {\n const buckets = v.value?.textValues ?? [];\n const firstNonEmpty = buckets.find(\n (entry) => Array.isArray(entry?.values) && entry.values.length > 0\n );\n const textVals = firstNonEmpty?.values ?? [];\n return textVals.filter(Boolean);\n } else if (v.type === AttributeType.DECIMAL) {\n if (v.value !== void 0) values.push(String(v.value));\n } else if (v.type === AttributeType.INT) {\n if (v.value !== void 0) values.push(String(v.value));\n } else if (v.type === AttributeType.ENUM) {\n if (v.value) values.push(v.value);\n } else if (typeof v === \"string\") {\n values.push(v);\n } else if (typeof v === \"object\") {\n if (Array.isArray(v.values)) {\n return v.values.filter((x) => typeof x === \"string\");\n }\n const strVals = Object.values(v).filter((x) => typeof x === \"string\");\n return strVals;\n }\n return values.filter(Boolean);\n}\nfunction collectAttributeValues(products, attributeName) {\n const set = /* @__PURE__ */ new Set();\n for (const product of products) {\n const items = product.attributes?.items;\n if (!Array.isArray(items)) continue;\n for (const attr of items) {\n if (attributeNameMatches(attr, attributeName)) {\n extractAttributeValues(attr).forEach((v) => set.add(v));\n }\n }\n }\n return Array.from(set);\n}\nfunction filterProductsBySelections(products, selections) {\n const entries = Object.entries(selections);\n if (entries.length === 0) return products;\n return products.filter((product) => {\n const items = product.attributes?.items;\n if (!Array.isArray(items)) return false;\n return entries.every(\n ([attrName, attrValue]) => items.some(\n (attr) => attributeNameMatches(attr, attrName) && extractAttributeValues(attr).includes(attrValue)\n )\n );\n });\n}\n\n// src/utils/countries.ts\nvar COUNTRIES = [\n { code: \"NL\", name: \"Netherlands\" },\n { code: \"BE\", name: \"Belgium\" },\n { code: \"DE\", name: \"Germany\" },\n { code: \"FR\", name: \"France\" },\n { code: \"UK\", name: \"United Kingdom\" },\n { code: \"US\", name: \"United States\" }\n];\nvar COUNTRIES_MAP = COUNTRIES.reduce(\n (acc, c) => {\n acc[c.code] = c.name;\n return acc;\n },\n {}\n);\nfunction getCountryName(code, list) {\n if (!code) return \"\";\n const effective = list && list.length > 0 ? list : COUNTRIES;\n const match = effective.find((c) => c.code === code);\n return match?.name ?? code;\n}\n\n// src/utils/formatting.ts\nfunction formatPrice(amount, options = {}) {\n if (amount === null || amount === void 0) return \"\";\n const { currency = \"EUR\", locale = \"nl-NL\", symbol } = options;\n if (symbol !== void 0) {\n const formattedNumber = new Intl.NumberFormat(locale, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(Number(amount));\n return symbol ? `${symbol} ${formattedNumber}` : formattedNumber;\n }\n try {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }).format(amount);\n } catch {\n return `\\u20AC${Number(amount).toFixed(2)}`;\n }\n}\nfunction formatDate(date, options = {}) {\n if (!date) return \"\";\n const { locale = \"nl-NL\", dateStyle = \"medium\" } = options;\n try {\n const d = typeof date === \"string\" ? new Date(date) : date;\n if (isNaN(d.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, { dateStyle }).format(d);\n } catch {\n return String(date);\n }\n}\nfunction formatSurcharge(surcharge, options = {}) {\n if (!surcharge) return \"\";\n const { quantity = 1, language, currency = \"\\u20AC\", locale = \"nl-NL\" } = options;\n const localized = surcharge.names ?? surcharge.name ?? [];\n const name = localized.find((n) => n.language === language)?.value ?? localized[0]?.value ?? \"\";\n const value = Number(surcharge.value ?? 0);\n const isPercentage = String(surcharge.type ?? \"\").toLowerCase() === \"percentage\";\n if (isPercentage) {\n return `${quantity} x ${value}% (${name})`;\n }\n return `${quantity} x ${formatPrice(value, { symbol: currency, locale })} (${name})`;\n}\nfunction calcDiscountPercent(original, discounted) {\n if (!original || original === 0) return 0;\n if (discounted === null || discounted === void 0) return 0;\n return Math.round((original - discounted) / original * 100);\n}\n\n// src/utils/inventoryHelpers.ts\nfunction getStockStatus(quantity) {\n if (quantity <= 0) return { label: \"Out of stock\", className: \"text-destructive bg-destructive/10\" };\n if (quantity <= 5) return { label: \"Low stock\", className: \"text-warning bg-warning/10\" };\n return { label: \"In stock\", className: \"text-success bg-success/10\" };\n}\n\n// src/utils/labelHelpers.ts\nfunction getLabel(labels, key, fallback) {\n return labels?.[key] || fallback;\n}\n\n// src/utils/languageResolver.ts\nfunction resolveLanguageEntry(items, language, fallback) {\n if (!items || items.length === 0) return void 0;\n const lang = language.toUpperCase();\n return items.find((item) => item.language?.toUpperCase() === lang) ?? items[0];\n}\nfunction getLanguageString(items, language, fallback = \"\") {\n if (!items || items.length === 0) return fallback;\n const lang = language.toUpperCase();\n const direct = items.find((item) => item.language?.toUpperCase() === lang);\n if (direct?.value) return direct.value;\n for (const item of items) {\n if (item.value) return item.value;\n }\n return fallback;\n}\nfunction getLanguageUri(items, language, fallback = \"\") {\n const entry = resolveLanguageEntry(items, language);\n return entry?.uri ?? fallback;\n}\n\n// src/utils/productHelpers.ts\nfunction getProductImageUrl(product) {\n return product?.media?.images?.items?.[0]?.imageVariants?.[0]?.url || \"\";\n}\nfunction getClusterImageUrl(cluster) {\n return cluster?.defaultProduct?.media?.images?.items?.[0]?.imageVariants?.[0]?.url || \"\";\n}\nfunction getProductSku(product) {\n return product?.sku || \"\";\n}\nfunction getClusterSku(cluster) {\n return cluster?.sku || cluster?.defaultProduct?.sku || \"\";\n}\nfunction getLocalizedValue(items, language, fallback = \"\") {\n return getLanguageString(items, language || \"NL\", fallback);\n}\n\n// src/utils/truncation.ts\nfunction stripHtml(html) {\n return html.replace(/<[^>]*>/g, \"\");\n}\nfunction shouldTruncate(html, maxLength) {\n if (!maxLength || maxLength <= 0) return false;\n const plain = stripHtml(html);\n return plain.length > maxLength;\n}\nfunction truncateAt(html, maxLength) {\n if (!maxLength || maxLength <= 0) return html;\n const plain = stripHtml(html);\n if (plain.length <= maxLength) return html;\n const truncated = plain.substring(0, maxLength);\n const lastSpace = truncated.lastIndexOf(\" \");\n return (lastSpace > 0 ? truncated.substring(0, lastSpace) : truncated) + \"\\u2026\";\n}\n\n// src/utils/userIdentity.ts\nfunction isContact(user) {\n return !!user && \"contactId\" in user;\n}\nfunction isCustomer(user) {\n return !!user && \"customerId\" in user && !(\"contactId\" in user);\n}\nfunction getUserId(user) {\n if (!user) return null;\n if (isContact(user)) return user.contactId ?? null;\n if (isCustomer(user)) return user.customerId ?? null;\n return null;\n}\nfunction getCompany(user) {\n if (!user || !isContact(user)) return null;\n return user.company ?? null;\n}\nfunction getCompanyId(user) {\n return getCompany(user)?.companyId ?? null;\n}\nfunction getAddresses(user) {\n if (!user) return [];\n if (isContact(user)) {\n return user.company?.addresses ?? [];\n }\n return user.addresses ?? [];\n}\nfunction getDefaultInvoiceAddress(user) {\n return getAddresses(user).find(\n (addr) => addr.isDefault === \"Y\" && addr.type === \"invoice\"\n );\n}\nfunction getDefaultDeliveryAddress(user) {\n return getAddresses(user).find(\n (addr) => addr.isDefault === \"Y\" && addr.type === \"delivery\"\n );\n}\n\n// src/utils/videoTransform.ts\nfunction isEmbeddable(uri) {\n return uri.includes(\"youtube.com\") || uri.includes(\"youtu.be\") || uri.includes(\"vimeo.com\");\n}\nfunction normalizeVideoUrl(uri) {\n if (uri.includes(\"youtube.com/watch\")) {\n try {\n const url = new URL(uri);\n const videoId = url.searchParams.get(\"v\") || \"\";\n return `https://www.youtube.com/embed/${videoId}`;\n } catch {\n return uri;\n }\n }\n if (uri.includes(\"youtu.be/\")) {\n const videoId = uri.split(\"youtu.be/\")[1]?.split(\"?\")[0] || \"\";\n return `https://www.youtube.com/embed/${videoId}`;\n }\n if (uri.includes(\"vimeo.com/\")) {\n const videoId = uri.split(\"vimeo.com/\")[1]?.split(\"?\")[0] || \"\";\n return `https://player.vimeo.com/video/${videoId}`;\n }\n return uri;\n}\n\n// src/utils/visibilityHelpers.ts\nfunction isContentHidden(portalMode, user) {\n return portalMode === \"semi-closed\" && !user;\n}\n\n// src/utils/jsonLd.ts\nimport { ProductClass } from \"@propeller-commerce/propeller-sdk-v2\";\nfunction safeJsonStringify(value) {\n return JSON.stringify(value).replace(/<\\//g, \"<\\\\/\");\n}\nfunction shouldShowOffers(ctx) {\n return !isContentHidden(ctx.portalMode, ctx.user);\n}\nfunction toAbsolute(siteUrl, pathOrUrl) {\n if (!pathOrUrl) return \"\";\n if (/^https?:\\/\\//i.test(pathOrUrl)) return pathOrUrl;\n const base = siteUrl.replace(/\\/$/, \"\");\n const path = pathOrUrl.startsWith(\"/\") ? pathOrUrl : `/${pathOrUrl}`;\n return base + path;\n}\nfunction formatPriceForJsonLd(amount) {\n if (amount == null || !Number.isFinite(amount)) return void 0;\n return amount.toFixed(2);\n}\nfunction cleanDescription(value) {\n if (!value) return void 0;\n const text = stripHtml(value).replace(/\\s+/g, \" \").trim();\n return text.length > 0 ? text : void 0;\n}\nfunction buildOffers(product, absoluteUrl, ctx) {\n if (!shouldShowOffers(ctx)) return void 0;\n const price = formatPriceForJsonLd(product.price?.net);\n if (price === void 0) return void 0;\n const offer = {\n \"@type\": \"Offer\",\n url: absoluteUrl,\n priceCurrency: ctx.currencyCode,\n price,\n itemCondition: \"https://schema.org/NewCondition\"\n };\n const qty = product.inventory?.totalQuantity;\n if (typeof qty === \"number\") {\n offer.availability = qty > 0 ? \"https://schema.org/InStock\" : \"https://schema.org/OutOfStock\";\n }\n return offer;\n}\nfunction buildProductJsonLd(product, ctx) {\n if (!product) return null;\n const name = getLanguageString(product.names, ctx.language, \"\").trim();\n const relativeUrl = ctx.urls.getProductUrl(product, ctx.language);\n const absoluteUrl = toAbsolute(ctx.siteUrl, relativeUrl);\n if (!name && !absoluteUrl) return null;\n const description = cleanDescription(\n getLanguageString(product.descriptions, ctx.language, \"\") || getLanguageString(product.shortDescriptions, ctx.language, \"\")\n );\n const imageUrl = getProductImageUrl(product);\n const absoluteImage = imageUrl ? toAbsolute(ctx.siteUrl, imageUrl) : void 0;\n const categoryName = getLanguageString(product.category?.name, ctx.language, \"\").trim();\n const data = {\n \"@context\": \"https://schema.org/\",\n \"@type\": \"Product\"\n };\n if (name) data.name = name;\n if (absoluteUrl) data.url = absoluteUrl;\n if (absoluteImage) data.image = absoluteImage;\n if (description) data.description = description;\n if (product.manufacturerCode) data.mpn = product.manufacturerCode;\n if (product.sku) data.sku = product.sku;\n if (product.productId != null) data.productID = String(product.productId);\n if (categoryName) data.category = categoryName;\n if (product.manufacturer) {\n data.brand = { \"@type\": \"Brand\", name: product.manufacturer };\n }\n const offers = buildOffers(product, absoluteUrl, ctx);\n if (offers) data.offers = offers;\n return data;\n}\nfunction buildClusterJsonLd(cluster, ctx) {\n if (!cluster) return null;\n const defaultProduct = cluster.defaultProduct;\n const name = getLanguageString(cluster.names, ctx.language, \"\").trim();\n const relativeUrl = ctx.urls.getClusterUrl(cluster, ctx.language);\n const absoluteUrl = toAbsolute(ctx.siteUrl, relativeUrl);\n if (!name && !absoluteUrl) return null;\n const description = cleanDescription(\n getLanguageString(cluster.descriptions, ctx.language, \"\")\n );\n const imageUrl = getClusterImageUrl(cluster);\n const absoluteImage = imageUrl ? toAbsolute(ctx.siteUrl, imageUrl) : void 0;\n const categoryName = getLanguageString(cluster.category?.name, ctx.language, \"\").trim();\n const data = {\n \"@context\": \"https://schema.org/\",\n \"@type\": \"Product\"\n };\n if (name) data.name = name;\n if (absoluteUrl) data.url = absoluteUrl;\n if (absoluteImage) data.image = absoluteImage;\n if (description) data.description = description;\n if (defaultProduct?.manufacturerCode) data.mpn = defaultProduct.manufacturerCode;\n const sku = cluster.sku || defaultProduct?.sku;\n if (sku) data.sku = sku;\n if (cluster.clusterId != null) data.productID = String(cluster.clusterId);\n if (categoryName) data.category = categoryName;\n if (defaultProduct?.manufacturer) {\n data.brand = { \"@type\": \"Brand\", name: defaultProduct.manufacturer };\n }\n if (defaultProduct) {\n const offers = buildOffers(defaultProduct, absoluteUrl, ctx);\n if (offers) data.offers = offers;\n }\n return data;\n}\nfunction buildItemListJsonLd(products, ctx) {\n if (!products || products.length === 0) return null;\n const itemListElement = [];\n products.forEach((item, index) => {\n const isCluster = item.class === ProductClass.CLUSTER;\n const productForFields = isCluster ? item.defaultProduct : item;\n if (!productForFields) return;\n const cluster = isCluster ? item : void 0;\n const relativeUrl = cluster ? ctx.urls.getClusterUrl(cluster, ctx.language) : ctx.urls.getProductUrl(item, ctx.language);\n const absoluteUrl = toAbsolute(ctx.siteUrl, relativeUrl);\n const productNode = buildProductJsonLd(productForFields, ctx);\n if (!productNode) return;\n if (absoluteUrl) productNode.url = absoluteUrl;\n if (productNode.offers && typeof productNode.offers === \"object\") {\n productNode.offers.url = absoluteUrl;\n }\n delete productNode[\"@context\"];\n itemListElement.push({\n \"@type\": \"ListItem\",\n position: index + 1,\n item: productNode\n });\n });\n if (itemListElement.length === 0) return null;\n return {\n \"@context\": \"https://schema.org/\",\n \"@type\": \"ItemList\",\n numberOfItems: itemListElement.length,\n itemListElement\n };\n}\n\n// src/utils/userMode.ts\nfunction deriveUserMode(user, shopMode) {\n if (!user) return \"anonymous\";\n if (shopMode === \"b2b\") return \"b2b\";\n if (shopMode === \"b2c\") return \"b2c\";\n return isContact(user) ? \"b2b\" : \"b2c\";\n}\n\n// src/services/createServices.ts\nimport {\n ProductService,\n CartService,\n UserService,\n CategoryService,\n OrderService,\n PayMethodService,\n LoginService,\n AddressService,\n CompanyService,\n CrossupsellService,\n BundleService,\n FavoriteListService,\n PurchaseAuthorizationConfigService,\n ClusterService,\n OrderlistService\n} from \"@propeller-commerce/propeller-sdk-v2\";\nvar servicesByClient = /* @__PURE__ */ new WeakMap();\nfunction createServices(client) {\n const cached = servicesByClient.get(client);\n if (cached) return cached;\n const services = {\n product: new ProductService(client),\n cart: new CartService(client),\n user: new UserService(client),\n category: new CategoryService(client),\n order: new OrderService(client),\n payMethod: new PayMethodService(client),\n login: new LoginService(client),\n address: new AddressService(client),\n company: new CompanyService(client),\n crossupsell: new CrossupsellService(client),\n bundle: new BundleService(client),\n favoriteList: new FavoriteListService(client),\n purchaseAuthConfig: new PurchaseAuthorizationConfigService(client),\n cluster: new ClusterService(client),\n orderlist: new OrderlistService(client)\n };\n servicesByClient.set(client, services);\n return services;\n}\n\n// src/services/toPlain.ts\nfunction toPlain(value) {\n return deepPlainInner(value);\n}\nfunction deepPlainInner(value) {\n if (value === null || value === void 0) return value;\n if (Array.isArray(value)) return value.map(deepPlainInner);\n if (typeof value === \"object\") {\n const out = {};\n for (const key of Object.keys(value)) {\n const cleanKey = key.startsWith(\"_\") ? key.slice(1) : key;\n out[cleanKey] = deepPlainInner(value[key]);\n }\n return out;\n }\n return value;\n}\nexport {\n COUNTRIES,\n COUNTRIES_MAP,\n attributeNameMatches,\n buildClusterJsonLd,\n buildItemListJsonLd,\n buildProductJsonLd,\n calcDiscountPercent,\n collectAttributeValues,\n createServices,\n deriveUserMode,\n err,\n extractAttributeValues,\n filterProductsBySelections,\n formatDate,\n formatPrice,\n formatSurcharge,\n getAddresses,\n getAttributeDisplayName,\n getClusterImageUrl,\n getClusterSku,\n getCompany,\n getCompanyId,\n getCountryName,\n getDefaultDeliveryAddress,\n getDefaultInvoiceAddress,\n getLabel,\n getLanguageString,\n getLanguageUri,\n getLocalizedValue,\n getProductImageUrl,\n getProductSku,\n getStockStatus,\n getUserId,\n isContact,\n isContentHidden,\n isCustomer,\n isEmbeddable,\n normalizeVideoUrl,\n ok,\n resolveLanguageEntry,\n safeJsonStringify,\n shouldTruncate,\n stripHtml,\n toPlain,\n truncateAt,\n tryAsync\n};\n//# sourceMappingURL=index.js.map"],"names":["AttributeType","ProductClass","ProductService","CartService","UserService","CategoryService","OrderService","PayMethodService","LoginService","AddressService","CompanyService","CrossupsellService","BundleService","FavoriteListService","PurchaseAuthorizationConfigService","ClusterService","OrderlistService"],"mappings":"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","x_google_ignoreList":[0]}
|