@scayle/storefront-core 7.22.1

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.
Files changed (268) hide show
  1. package/CHANGELOG.md +480 -0
  2. package/LICENSE +21 -0
  3. package/README.md +29 -0
  4. package/dist/bapi/init.cjs +30 -0
  5. package/dist/bapi/init.d.ts +14 -0
  6. package/dist/bapi/init.mjs +23 -0
  7. package/dist/cache/cache.cjs +1 -0
  8. package/dist/cache/cache.d.ts +8 -0
  9. package/dist/cache/cache.mjs +0 -0
  10. package/dist/cache/cached.cjs +89 -0
  11. package/dist/cache/cached.d.ts +24 -0
  12. package/dist/cache/cached.mjs +92 -0
  13. package/dist/cache/index.cjs +38 -0
  14. package/dist/cache/index.d.ts +3 -0
  15. package/dist/cache/index.mjs +3 -0
  16. package/dist/cache/providers/redis.cjs +94 -0
  17. package/dist/cache/providers/redis.d.ts +28 -0
  18. package/dist/cache/providers/redis.mjs +86 -0
  19. package/dist/cache/providers/unstorage.cjs +54 -0
  20. package/dist/cache/providers/unstorage.d.ts +16 -0
  21. package/dist/cache/providers/unstorage.mjs +49 -0
  22. package/dist/cache/types.cjs +11 -0
  23. package/dist/cache/types.d.ts +6 -0
  24. package/dist/cache/types.mjs +4 -0
  25. package/dist/constants/basket.cjs +13 -0
  26. package/dist/constants/basket.d.ts +8 -0
  27. package/dist/constants/basket.mjs +6 -0
  28. package/dist/constants/cache.cjs +8 -0
  29. package/dist/constants/cache.d.ts +1 -0
  30. package/dist/constants/cache.mjs +1 -0
  31. package/dist/constants/hash.cjs +11 -0
  32. package/dist/constants/hash.d.ts +6 -0
  33. package/dist/constants/hash.mjs +4 -0
  34. package/dist/constants/httpStatus.cjs +636 -0
  35. package/dist/constants/httpStatus.d.ts +632 -0
  36. package/dist/constants/httpStatus.mjs +629 -0
  37. package/dist/constants/index.cjs +93 -0
  38. package/dist/constants/index.d.ts +8 -0
  39. package/dist/constants/index.mjs +8 -0
  40. package/dist/constants/product.cjs +11 -0
  41. package/dist/constants/product.d.ts +6 -0
  42. package/dist/constants/product.mjs +4 -0
  43. package/dist/constants/promotion.cjs +10 -0
  44. package/dist/constants/promotion.d.ts +2 -0
  45. package/dist/constants/promotion.mjs +2 -0
  46. package/dist/constants/sorting.cjs +24 -0
  47. package/dist/constants/sorting.d.ts +20 -0
  48. package/dist/constants/sorting.mjs +17 -0
  49. package/dist/constants/withParameters.cjs +138 -0
  50. package/dist/constants/withParameters.d.ts +30 -0
  51. package/dist/constants/withParameters.mjs +132 -0
  52. package/dist/errors/BAPIError.cjs +16 -0
  53. package/dist/errors/BAPIError.d.ts +6 -0
  54. package/dist/errors/BAPIError.mjs +9 -0
  55. package/dist/errors/baseError.cjs +17 -0
  56. package/dist/errors/baseError.d.ts +5 -0
  57. package/dist/errors/baseError.mjs +10 -0
  58. package/dist/errors/index.cjs +27 -0
  59. package/dist/errors/index.d.ts +2 -0
  60. package/dist/errors/index.mjs +2 -0
  61. package/dist/helpers/advancedAttributeHelpers.cjs +26 -0
  62. package/dist/helpers/advancedAttributeHelpers.d.ts +12 -0
  63. package/dist/helpers/advancedAttributeHelpers.mjs +21 -0
  64. package/dist/helpers/arrayHelpers.cjs +10 -0
  65. package/dist/helpers/arrayHelpers.d.ts +1 -0
  66. package/dist/helpers/arrayHelpers.mjs +3 -0
  67. package/dist/helpers/attributeHelpers.cjs +24 -0
  68. package/dist/helpers/attributeHelpers.d.ts +5 -0
  69. package/dist/helpers/attributeHelpers.mjs +17 -0
  70. package/dist/helpers/autobind.cjs +44 -0
  71. package/dist/helpers/autobind.d.ts +39 -0
  72. package/dist/helpers/autobind.mjs +35 -0
  73. package/dist/helpers/basketHelpers.cjs +12 -0
  74. package/dist/helpers/basketHelpers.d.ts +2 -0
  75. package/dist/helpers/basketHelpers.mjs +5 -0
  76. package/dist/helpers/categoryHelper.cjs +61 -0
  77. package/dist/helpers/categoryHelper.d.ts +7 -0
  78. package/dist/helpers/categoryHelper.mjs +44 -0
  79. package/dist/helpers/filterHelper.cjs +156 -0
  80. package/dist/helpers/filterHelper.d.ts +82 -0
  81. package/dist/helpers/filterHelper.mjs +147 -0
  82. package/dist/helpers/formHelpers.cjs +114 -0
  83. package/dist/helpers/formHelpers.d.ts +48 -0
  84. package/dist/helpers/formHelpers.mjs +106 -0
  85. package/dist/helpers/imageHelpers.cjs +20 -0
  86. package/dist/helpers/imageHelpers.d.ts +4 -0
  87. package/dist/helpers/imageHelpers.mjs +14 -0
  88. package/dist/helpers/index.cjs +192 -0
  89. package/dist/helpers/index.d.ts +17 -0
  90. package/dist/helpers/index.mjs +17 -0
  91. package/dist/helpers/localization.cjs +13 -0
  92. package/dist/helpers/localization.d.ts +7 -0
  93. package/dist/helpers/localization.mjs +6 -0
  94. package/dist/helpers/objectHelpers.cjs +19 -0
  95. package/dist/helpers/objectHelpers.d.ts +1 -0
  96. package/dist/helpers/objectHelpers.mjs +6 -0
  97. package/dist/helpers/orderHelpers.cjs +10 -0
  98. package/dist/helpers/orderHelpers.d.ts +67 -0
  99. package/dist/helpers/orderHelpers.mjs +4 -0
  100. package/dist/helpers/product.fixture.cjs +770 -0
  101. package/dist/helpers/product.fixture.d.ts +415 -0
  102. package/dist/helpers/product.fixture.mjs +838 -0
  103. package/dist/helpers/productDisruptorHelper.cjs +37 -0
  104. package/dist/helpers/productDisruptorHelper.d.ts +10 -0
  105. package/dist/helpers/productDisruptorHelper.mjs +23 -0
  106. package/dist/helpers/productHelpers.cjs +188 -0
  107. package/dist/helpers/productHelpers.d.ts +41 -0
  108. package/dist/helpers/productHelpers.mjs +170 -0
  109. package/dist/helpers/sanitizationHelpers.cjs +15 -0
  110. package/dist/helpers/sanitizationHelpers.d.ts +2 -0
  111. package/dist/helpers/sanitizationHelpers.mjs +6 -0
  112. package/dist/helpers/sortingHelper.cjs +67 -0
  113. package/dist/helpers/sortingHelper.d.ts +69 -0
  114. package/dist/helpers/sortingHelper.mjs +66 -0
  115. package/dist/helpers/stringHelpers.cjs +8 -0
  116. package/dist/helpers/stringHelpers.d.ts +2 -0
  117. package/dist/helpers/stringHelpers.mjs +2 -0
  118. package/dist/index.cjs +85 -0
  119. package/dist/index.d.ts +19 -0
  120. package/dist/index.mjs +8 -0
  121. package/dist/rpc/methods/basket/basket.cjs +183 -0
  122. package/dist/rpc/methods/basket/basket.d.ts +23 -0
  123. package/dist/rpc/methods/basket/basket.mjs +181 -0
  124. package/dist/rpc/methods/brands.cjs +34 -0
  125. package/dist/rpc/methods/brands.d.ts +5 -0
  126. package/dist/rpc/methods/brands.mjs +16 -0
  127. package/dist/rpc/methods/categories.cjs +102 -0
  128. package/dist/rpc/methods/categories.d.ts +21 -0
  129. package/dist/rpc/methods/categories.mjs +64 -0
  130. package/dist/rpc/methods/cbd.cjs +45 -0
  131. package/dist/rpc/methods/cbd.d.ts +4 -0
  132. package/dist/rpc/methods/cbd.mjs +36 -0
  133. package/dist/rpc/methods/checkout/index.cjs +38 -0
  134. package/dist/rpc/methods/checkout/index.d.ts +3 -0
  135. package/dist/rpc/methods/checkout/index.mjs +3 -0
  136. package/dist/rpc/methods/checkout/order.cjs +55 -0
  137. package/dist/rpc/methods/checkout/order.d.ts +4 -0
  138. package/dist/rpc/methods/checkout/order.mjs +43 -0
  139. package/dist/rpc/methods/checkout/shopUser.cjs +126 -0
  140. package/dist/rpc/methods/checkout/shopUser.d.ts +7 -0
  141. package/dist/rpc/methods/checkout/shopUser.mjs +109 -0
  142. package/dist/rpc/methods/checkout/shopUserAddresses.cjs +25 -0
  143. package/dist/rpc/methods/checkout/shopUserAddresses.d.ts +3 -0
  144. package/dist/rpc/methods/checkout/shopUserAddresses.mjs +19 -0
  145. package/dist/rpc/methods/index.cjs +159 -0
  146. package/dist/rpc/methods/index.d.ts +14 -0
  147. package/dist/rpc/methods/index.mjs +14 -0
  148. package/dist/rpc/methods/navigationTrees.cjs +33 -0
  149. package/dist/rpc/methods/navigationTrees.d.ts +5 -0
  150. package/dist/rpc/methods/navigationTrees.mjs +10 -0
  151. package/dist/rpc/methods/products.cjs +261 -0
  152. package/dist/rpc/methods/products.d.ts +13 -0
  153. package/dist/rpc/methods/products.mjs +217 -0
  154. package/dist/rpc/methods/promotion.cjs +53 -0
  155. package/dist/rpc/methods/promotion.d.ts +4 -0
  156. package/dist/rpc/methods/promotion.mjs +38 -0
  157. package/dist/rpc/methods/search.cjs +38 -0
  158. package/dist/rpc/methods/search.d.ts +10 -0
  159. package/dist/rpc/methods/search.mjs +22 -0
  160. package/dist/rpc/methods/session.cjs +274 -0
  161. package/dist/rpc/methods/session.d.ts +20 -0
  162. package/dist/rpc/methods/session.mjs +309 -0
  163. package/dist/rpc/methods/shopConfiguration.cjs +15 -0
  164. package/dist/rpc/methods/shopConfiguration.d.ts +4 -0
  165. package/dist/rpc/methods/shopConfiguration.mjs +6 -0
  166. package/dist/rpc/methods/user.cjs +89 -0
  167. package/dist/rpc/methods/user.d.ts +20 -0
  168. package/dist/rpc/methods/user.mjs +56 -0
  169. package/dist/rpc/methods/variants.cjs +29 -0
  170. package/dist/rpc/methods/variants.d.ts +8 -0
  171. package/dist/rpc/methods/variants.mjs +12 -0
  172. package/dist/rpc/methods/wishlist.cjs +85 -0
  173. package/dist/rpc/methods/wishlist.d.ts +13 -0
  174. package/dist/rpc/methods/wishlist.mjs +61 -0
  175. package/dist/server.cjs +39 -0
  176. package/dist/server.d.ts +5 -0
  177. package/dist/server.mjs +4 -0
  178. package/dist/types/api/auth.cjs +1 -0
  179. package/dist/types/api/auth.d.ts +63 -0
  180. package/dist/types/api/auth.mjs +0 -0
  181. package/dist/types/api/context.cjs +1 -0
  182. package/dist/types/api/context.d.ts +61 -0
  183. package/dist/types/api/context.mjs +0 -0
  184. package/dist/types/api/rpc.cjs +1 -0
  185. package/dist/types/api/rpc.d.ts +4 -0
  186. package/dist/types/api/rpc.mjs +0 -0
  187. package/dist/types/bapi/basket.cjs +1 -0
  188. package/dist/types/bapi/basket.d.ts +25 -0
  189. package/dist/types/bapi/basket.mjs +0 -0
  190. package/dist/types/bapi/brand.cjs +1 -0
  191. package/dist/types/bapi/brand.d.ts +2 -0
  192. package/dist/types/bapi/brand.mjs +0 -0
  193. package/dist/types/bapi/category.cjs +1 -0
  194. package/dist/types/bapi/category.d.ts +6 -0
  195. package/dist/types/bapi/category.mjs +0 -0
  196. package/dist/types/bapi/filter.cjs +1 -0
  197. package/dist/types/bapi/filter.d.ts +49 -0
  198. package/dist/types/bapi/filter.mjs +0 -0
  199. package/dist/types/bapi/navigation.cjs +1 -0
  200. package/dist/types/bapi/navigation.d.ts +10 -0
  201. package/dist/types/bapi/navigation.mjs +0 -0
  202. package/dist/types/bapi/order.cjs +1 -0
  203. package/dist/types/bapi/order.d.ts +554 -0
  204. package/dist/types/bapi/order.mjs +0 -0
  205. package/dist/types/bapi/pagination.cjs +1 -0
  206. package/dist/types/bapi/pagination.d.ts +13 -0
  207. package/dist/types/bapi/pagination.mjs +0 -0
  208. package/dist/types/bapi/product.cjs +1 -0
  209. package/dist/types/bapi/product.d.ts +84 -0
  210. package/dist/types/bapi/product.mjs +0 -0
  211. package/dist/types/bapi/productFilter.cjs +1 -0
  212. package/dist/types/bapi/productFilter.d.ts +7 -0
  213. package/dist/types/bapi/productFilter.mjs +0 -0
  214. package/dist/types/bapi/promotion.cjs +1 -0
  215. package/dist/types/bapi/promotion.d.ts +2 -0
  216. package/dist/types/bapi/promotion.mjs +0 -0
  217. package/dist/types/bapi/redirects.cjs +1 -0
  218. package/dist/types/bapi/redirects.d.ts +1 -0
  219. package/dist/types/bapi/redirects.mjs +0 -0
  220. package/dist/types/bapi/router.cjs +1 -0
  221. package/dist/types/bapi/router.d.ts +1 -0
  222. package/dist/types/bapi/router.mjs +0 -0
  223. package/dist/types/bapi/search.cjs +1 -0
  224. package/dist/types/bapi/search.d.ts +21 -0
  225. package/dist/types/bapi/search.mjs +0 -0
  226. package/dist/types/bapi/sorting.cjs +5 -0
  227. package/dist/types/bapi/sorting.d.ts +10 -0
  228. package/dist/types/bapi/sorting.mjs +1 -0
  229. package/dist/types/bapi/wishlist.cjs +1 -0
  230. package/dist/types/bapi/wishlist.d.ts +9 -0
  231. package/dist/types/bapi/wishlist.mjs +0 -0
  232. package/dist/types/breadcrumb.cjs +1 -0
  233. package/dist/types/breadcrumb.d.ts +4 -0
  234. package/dist/types/breadcrumb.mjs +0 -0
  235. package/dist/types/index.cjs +236 -0
  236. package/dist/types/index.d.ts +22 -0
  237. package/dist/types/index.mjs +21 -0
  238. package/dist/types/promises.cjs +1 -0
  239. package/dist/types/promises.d.ts +2 -0
  240. package/dist/types/promises.mjs +0 -0
  241. package/dist/types/user.cjs +1 -0
  242. package/dist/types/user.d.ts +100 -0
  243. package/dist/types/user.mjs +0 -0
  244. package/dist/utils/compression.cjs +24 -0
  245. package/dist/utils/compression.d.ts +2 -0
  246. package/dist/utils/compression.mjs +16 -0
  247. package/dist/utils/hash.cjs +68 -0
  248. package/dist/utils/hash.d.ts +8 -0
  249. package/dist/utils/hash.mjs +61 -0
  250. package/dist/utils/index.cjs +27 -0
  251. package/dist/utils/index.d.ts +2 -0
  252. package/dist/utils/index.mjs +2 -0
  253. package/dist/utils/keys.cjs +67 -0
  254. package/dist/utils/keys.d.ts +24 -0
  255. package/dist/utils/keys.mjs +56 -0
  256. package/dist/utils/log.cjs +93 -0
  257. package/dist/utils/log.d.ts +43 -0
  258. package/dist/utils/log.mjs +75 -0
  259. package/dist/utils/rpc.cjs +41 -0
  260. package/dist/utils/rpc.d.ts +6 -0
  261. package/dist/utils/rpc.mjs +35 -0
  262. package/dist/utils/timeout.cjs +17 -0
  263. package/dist/utils/timeout.d.ts +2 -0
  264. package/dist/utils/timeout.mjs +9 -0
  265. package/dist/utils/user.cjs +75 -0
  266. package/dist/utils/user.d.ts +14 -0
  267. package/dist/utils/user.mjs +65 -0
  268. package/package.json +97 -0
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isFirstIndexOfRow = exports.hasDisruptorAtRow = exports.getRowByIndex = exports.getDisruptorsForRow = void 0;
7
+ const getRowByIndex = (index, options = {
8
+ columns: 2,
9
+ page: 1,
10
+ perPage: 24
11
+ }) => {
12
+ const {
13
+ columns,
14
+ page,
15
+ perPage
16
+ } = options;
17
+ const adjustedIndex = index + (page - 1) * perPage;
18
+ return Math.floor(adjustedIndex / columns);
19
+ };
20
+ exports.getRowByIndex = getRowByIndex;
21
+ const getDisruptorsForRow = (row, disruptors) => {
22
+ return disruptors.reduce((c, v, _) => {
23
+ if (v.insert_in_row === row.toString()) {
24
+ c.push(v);
25
+ }
26
+ return c;
27
+ }, []);
28
+ };
29
+ exports.getDisruptorsForRow = getDisruptorsForRow;
30
+ const isFirstIndexOfRow = (index, columns) => {
31
+ return index % columns === 0;
32
+ };
33
+ exports.isFirstIndexOfRow = isFirstIndexOfRow;
34
+ const hasDisruptorAtRow = (row, disruptorRows) => {
35
+ return disruptorRows.includes(row.toString());
36
+ };
37
+ exports.hasDisruptorAtRow = hasDisruptorAtRow;
@@ -0,0 +1,10 @@
1
+ export declare const getRowByIndex: (index: number, options?: {
2
+ columns: number;
3
+ page: number;
4
+ perPage: number;
5
+ }) => number;
6
+ export declare const getDisruptorsForRow: (row: number, disruptors: {
7
+ insert_in_row: string;
8
+ }[]) => {}[];
9
+ export declare const isFirstIndexOfRow: (index: number, columns: number) => boolean;
10
+ export declare const hasDisruptorAtRow: (row: number, disruptorRows: string[]) => boolean;
@@ -0,0 +1,23 @@
1
+ export const getRowByIndex = (index, options = {
2
+ columns: 2,
3
+ page: 1,
4
+ perPage: 24
5
+ }) => {
6
+ const { columns, page, perPage } = options;
7
+ const adjustedIndex = index + (page - 1) * perPage;
8
+ return Math.floor(adjustedIndex / columns);
9
+ };
10
+ export const getDisruptorsForRow = (row, disruptors) => {
11
+ return disruptors.reduce((c, v, _) => {
12
+ if (v.insert_in_row === row.toString()) {
13
+ c.push(v);
14
+ }
15
+ return c;
16
+ }, []);
17
+ };
18
+ export const isFirstIndexOfRow = (index, columns) => {
19
+ return index % columns === 0;
20
+ };
21
+ export const hasDisruptorAtRow = (row, disruptorRows) => {
22
+ return disruptorRows.includes(row.toString());
23
+ };
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.slugify = exports.isVariantInStock = exports.isInStock = exports.getVariantCrosssellingValues = exports.getVariantBySize = exports.getVariant = exports.getTotalAppliedReductions = exports.getSizeFromVariant = exports.getSizeFromSpecificVariant = exports.getProductSiblings = exports.getProductPath = exports.getProductColors = exports.getProductAndSiblingsColors = exports.getPrice = exports.getOriginalPrice = exports.getLowestPrice = exports.getLatestCategory = exports.getCategoriesByRoute = exports.getBadgeLabel = exports.getAttribute = exports.getAppliedReductionsByCategory = exports.getAllSizesFromVariants = void 0;
7
+ var _backbone = require("@aboutyou/backbone");
8
+ var _radash = require("radash");
9
+ var _slugify = _interopRequireDefault(require("slugify"));
10
+ var _product = require("../constants/product.cjs");
11
+ var _attributeHelpers = require("./attributeHelpers.cjs");
12
+ var _imageHelpers = require("./imageHelpers.cjs");
13
+ var _arrayHelpers = require("./arrayHelpers.cjs");
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ const slugify = url => {
16
+ return (0, _slugify.default)(url ?? "", {
17
+ lower: true,
18
+ remove: /[*+~.()'"!:@/#?]/g
19
+ });
20
+ };
21
+ exports.slugify = slugify;
22
+ const BadgeLabel = {
23
+ NEW: "new",
24
+ SOLD_OUT: "sold_out",
25
+ ONLINE_EXCLUSIVE: "online_exclusive",
26
+ SUSTAINABLE: "sustainable",
27
+ PREMIUM: "premium",
28
+ DEFAULT: ""
29
+ };
30
+ const getPrice = variant => variant.price;
31
+ exports.getPrice = getPrice;
32
+ const getBadgeLabel = (params = {}) => {
33
+ if (!params) {
34
+ return BadgeLabel.DEFAULT;
35
+ }
36
+ const {
37
+ isNew,
38
+ isSoldOut,
39
+ isOnlineOnly,
40
+ isSustainable,
41
+ isPremium
42
+ } = params;
43
+ if (isNew) {
44
+ return BadgeLabel.NEW;
45
+ } else if (isSoldOut) {
46
+ return BadgeLabel.SOLD_OUT;
47
+ } else if (isOnlineOnly) {
48
+ return BadgeLabel.ONLINE_EXCLUSIVE;
49
+ } else if (isSustainable) {
50
+ return BadgeLabel.SUSTAINABLE;
51
+ } else if (isPremium) {
52
+ return BadgeLabel.PREMIUM;
53
+ } else {
54
+ return BadgeLabel.DEFAULT;
55
+ }
56
+ };
57
+ exports.getBadgeLabel = getBadgeLabel;
58
+ const getOriginalPrice = price => {
59
+ return price.appliedReductions.length > 0 ? price.appliedReductions[0].amount.absoluteWithTax + price.withTax : price.withTax;
60
+ };
61
+ exports.getOriginalPrice = getOriginalPrice;
62
+ const getTotalAppliedReductions = price => {
63
+ const total = {
64
+ absoluteWithTax: 0,
65
+ relative: 0
66
+ };
67
+ if (price) {
68
+ price.appliedReductions.forEach(reduction => {
69
+ total.absoluteWithTax += reduction.amount.absoluteWithTax;
70
+ total.relative += reduction.amount.relative;
71
+ });
72
+ }
73
+ return total;
74
+ };
75
+ exports.getTotalAppliedReductions = getTotalAppliedReductions;
76
+ const getLowestPrice = variants => {
77
+ return variants.reduce((m, x) => m.price.withoutTax < x.price.withoutTax ? m : x).price;
78
+ };
79
+ exports.getLowestPrice = getLowestPrice;
80
+ const getAppliedReductionsByCategory = (price, category) => {
81
+ return price.appliedReductions.filter(reduction => {
82
+ return reduction.category === category;
83
+ });
84
+ };
85
+ exports.getAppliedReductionsByCategory = getAppliedReductionsByCategory;
86
+ const getSizeFromSpecificVariant = (product, variantId) => {
87
+ if (!product.variants) {
88
+ return null;
89
+ }
90
+ const variant = product.variants?.find(item => item.id === variantId);
91
+ return getSizeFromVariant(variant || product.variants[0]);
92
+ };
93
+ exports.getSizeFromSpecificVariant = getSizeFromSpecificVariant;
94
+ const getVariant = (variants, id) => {
95
+ return variants?.find(variant => variant.id === id);
96
+ };
97
+ exports.getVariant = getVariant;
98
+ const getSizeFromVariant = (variant, attributeName = "shopSize") => (0, _backbone.getFirstAttributeValue)(variant.attributes, attributeName);
99
+ exports.getSizeFromVariant = getSizeFromVariant;
100
+ const getAllSizesFromVariants = (variantsAttributes, attributeName = "shopSize") => (0, _radash.unique)(variantsAttributes.map(variant => (0, _backbone.getFirstAttributeValue)(variant.attributes, attributeName)).filter(Boolean), it => it?.id);
101
+ exports.getAllSizesFromVariants = getAllSizesFromVariants;
102
+ const getProductSiblings = (product, colorAttributeName = "colorDetail") => {
103
+ if (!product) {
104
+ return [];
105
+ }
106
+ const items = [product];
107
+ product.siblings?.forEach(item => {
108
+ if (!item.isActive) {
109
+ return;
110
+ }
111
+ items.push(item);
112
+ });
113
+ return items.map(item => ({
114
+ id: item.id,
115
+ image: (0, _imageHelpers.getImageFromList)(item.images, _product.ProductImageType.BUST, "front"),
116
+ colors: (0, _attributeHelpers.getAttributeValueTuples)(item.attributes, colorAttributeName)
117
+ }));
118
+ };
119
+ exports.getProductSiblings = getProductSiblings;
120
+ const getProductColors = (product, colorAttributeName = "colorDetail") => {
121
+ return (0, _attributeHelpers.getAttributeValueTuples)(product.attributes, colorAttributeName).map(color => color.label);
122
+ };
123
+ exports.getProductColors = getProductColors;
124
+ const getVariantBySize = (variants, size, sizeAttributeName = "shopSize") => {
125
+ return variants?.find(variant => (0, _attributeHelpers.getAttributeValue)(variant.attributes, sizeAttributeName) === size.value);
126
+ };
127
+ exports.getVariantBySize = getVariantBySize;
128
+ const isInStock = variant => {
129
+ return variant.stock.quantity > 0 || variant.stock.isSellableWithoutStock === true;
130
+ };
131
+ exports.isInStock = isInStock;
132
+ const isVariantInStock = (variants, size, sizeAttributeName = "shopSize") => {
133
+ const variant = variants?.find(variant2 => getSizeFromVariant(variant2, sizeAttributeName)?.value === size.value);
134
+ if (!variant) {
135
+ return false;
136
+ }
137
+ return isInStock(variant);
138
+ };
139
+ exports.isVariantInStock = isVariantInStock;
140
+ const getAttribute = (product, key) => {
141
+ const values = product.attributes?.[key]?.values;
142
+ return values?.value ?? values?.label;
143
+ };
144
+ exports.getAttribute = getAttribute;
145
+ const getProductPath = product => {
146
+ const name = (0, _attributeHelpers.getAttributeValue)(product.attributes, "name");
147
+ return `/product/${slugify(name)}-${product.id}`;
148
+ };
149
+ exports.getProductPath = getProductPath;
150
+ const getCategoriesByRoute = (product, route) => {
151
+ if (!product) {
152
+ return [];
153
+ }
154
+ const item = product?.categories?.find(categories => {
155
+ return categories.some(entry => entry.categoryUrl === route?.path);
156
+ });
157
+ if (item) {
158
+ return item;
159
+ }
160
+ return product.categories?.[product.categories?.length - 1] || [];
161
+ };
162
+ exports.getCategoriesByRoute = getCategoriesByRoute;
163
+ const getLatestCategory = categories => {
164
+ if (!categories || categories.length === 0) {
165
+ return;
166
+ }
167
+ const categoriesLength = categories.length;
168
+ const latestSubset = categories[categoriesLength - 1];
169
+ return latestSubset[latestSubset.length - 1];
170
+ };
171
+ exports.getLatestCategory = getLatestCategory;
172
+ const getProductAndSiblingsColors = (product, colorAttributeName = "colorDetail") => {
173
+ const productColor = (0, _backbone.getFirstAttributeValue)(product.attributes, colorAttributeName);
174
+ const siblingsColors = product.siblings?.filter(sibling => sibling.isActive && !sibling.isSoldOut).map(sibling => (0, _backbone.getFirstAttributeValue)(sibling.attributes, colorAttributeName));
175
+ return [productColor, ...(siblingsColors || [])].filter(color => !!color);
176
+ };
177
+ exports.getProductAndSiblingsColors = getProductAndSiblingsColors;
178
+ const getVariantCrosssellingValues = variants => {
179
+ if (!variants?.length) {
180
+ return [];
181
+ }
182
+ const crossellings = variants.map(variant => variant.advancedAttributes?.variantCrosssellings).filter(Boolean);
183
+ const uniqueCrossellings = (0, _radash.unique)(crossellings, it => it?.id);
184
+ const values = uniqueCrossellings.map(r => r?.values);
185
+ const fieldSets = (0, _arrayHelpers.flattenDeep)(values).map(r => r?.fieldSet);
186
+ return (0, _arrayHelpers.flattenDeep)(fieldSets).map(r => r?.value).filter(it => !!it);
187
+ };
188
+ exports.getVariantCrosssellingValues = getVariantCrosssellingValues;
@@ -0,0 +1,41 @@
1
+ import { BasketItemPrice } from '@aboutyou/backbone';
2
+ import type { AppliedReduction, BapiPrice as Price, BapiProduct as Product, Value, Variant } from '@aboutyou/backbone/types/BapiProduct';
3
+ import { ProductSibling } from '../types/bapi/product';
4
+ interface Route {
5
+ path?: string;
6
+ }
7
+ export declare const slugify: (url: string | undefined) => string;
8
+ export declare const getPrice: (variant: Variant) => Price;
9
+ type BadgeLabelParamsKeys = 'isNew' | 'isSoldOut' | 'isOnlineOnly' | 'isSustainable' | 'isPremium';
10
+ type BadgeLabelParams = Partial<Record<BadgeLabelParamsKeys, boolean>>;
11
+ export declare const getBadgeLabel: (params?: BadgeLabelParams) => string;
12
+ export declare const getOriginalPrice: (price: Price) => number;
13
+ export declare const getTotalAppliedReductions: (price: {
14
+ appliedReductions: {
15
+ amount: {
16
+ absoluteWithTax: number;
17
+ relative: number;
18
+ };
19
+ }[];
20
+ }) => {
21
+ absoluteWithTax: number;
22
+ relative: number;
23
+ };
24
+ export declare const getLowestPrice: (variants: Variant[]) => Price;
25
+ export declare const getAppliedReductionsByCategory: (price: Price | BasketItemPrice, category: AppliedReduction['category']) => AppliedReduction[];
26
+ export declare const getSizeFromSpecificVariant: (product: Product, variantId?: number) => Value | null | undefined;
27
+ export declare const getVariant: (variants: Variant[], id: number) => Variant | undefined;
28
+ export declare const getSizeFromVariant: (variant: Variant, attributeName?: string) => Value | undefined;
29
+ export declare const getAllSizesFromVariants: (variantsAttributes: Variant[], attributeName?: string) => (Value | undefined)[];
30
+ export declare const getProductSiblings: (product?: Product | null, colorAttributeName?: string) => ProductSibling[];
31
+ export declare const getProductColors: (product: Product, colorAttributeName?: string) => string[];
32
+ export declare const getVariantBySize: (variants: Variant[], size: Value, sizeAttributeName?: string) => Variant | undefined;
33
+ export declare const isInStock: (variant: Variant) => boolean;
34
+ export declare const isVariantInStock: (variants: Variant[], size: Value, sizeAttributeName?: string) => boolean;
35
+ export declare const getAttribute: (product: Product, key: string) => any;
36
+ export declare const getProductPath: (product: Product) => string;
37
+ export declare const getCategoriesByRoute: (product: Product | null, route: Route | null) => import("@aboutyou/backbone").BapiProductCategory[];
38
+ export declare const getLatestCategory: (categories?: Product['categories']) => import("@aboutyou/backbone").BapiProductCategory | undefined;
39
+ export declare const getProductAndSiblingsColors: (product: Product, colorAttributeName?: string) => Value[];
40
+ export declare const getVariantCrosssellingValues: (variants: Variant[] | undefined) => (string | number)[];
41
+ export {};
@@ -0,0 +1,170 @@
1
+ import { getFirstAttributeValue } from "@aboutyou/backbone";
2
+ import { unique } from "radash";
3
+ import baseSlugify from "slugify";
4
+ import { ProductImageType } from "../constants/product.mjs";
5
+ import { getAttributeValue, getAttributeValueTuples } from "./attributeHelpers.mjs";
6
+ import { getImageFromList } from "./imageHelpers.mjs";
7
+ import { flattenDeep } from "./arrayHelpers.mjs";
8
+ export const slugify = (url) => {
9
+ return baseSlugify(url ?? "", {
10
+ lower: true,
11
+ remove: /[*+~.()'"!:@/#?]/g
12
+ });
13
+ };
14
+ const BadgeLabel = {
15
+ NEW: "new",
16
+ SOLD_OUT: "sold_out",
17
+ ONLINE_EXCLUSIVE: "online_exclusive",
18
+ SUSTAINABLE: "sustainable",
19
+ PREMIUM: "premium",
20
+ DEFAULT: ""
21
+ };
22
+ export const getPrice = (variant) => variant.price;
23
+ export const getBadgeLabel = (params = {}) => {
24
+ if (!params) {
25
+ return BadgeLabel.DEFAULT;
26
+ }
27
+ const { isNew, isSoldOut, isOnlineOnly, isSustainable, isPremium } = params;
28
+ if (isNew) {
29
+ return BadgeLabel.NEW;
30
+ } else if (isSoldOut) {
31
+ return BadgeLabel.SOLD_OUT;
32
+ } else if (isOnlineOnly) {
33
+ return BadgeLabel.ONLINE_EXCLUSIVE;
34
+ } else if (isSustainable) {
35
+ return BadgeLabel.SUSTAINABLE;
36
+ } else if (isPremium) {
37
+ return BadgeLabel.PREMIUM;
38
+ } else {
39
+ return BadgeLabel.DEFAULT;
40
+ }
41
+ };
42
+ export const getOriginalPrice = (price) => {
43
+ return price.appliedReductions.length > 0 ? price.appliedReductions[0].amount.absoluteWithTax + price.withTax : price.withTax;
44
+ };
45
+ export const getTotalAppliedReductions = (price) => {
46
+ const total = { absoluteWithTax: 0, relative: 0 };
47
+ if (price) {
48
+ price.appliedReductions.forEach((reduction) => {
49
+ total.absoluteWithTax += reduction.amount.absoluteWithTax;
50
+ total.relative += reduction.amount.relative;
51
+ });
52
+ }
53
+ return total;
54
+ };
55
+ export const getLowestPrice = (variants) => {
56
+ return variants.reduce(
57
+ (m, x) => m.price.withoutTax < x.price.withoutTax ? m : x
58
+ ).price;
59
+ };
60
+ export const getAppliedReductionsByCategory = (price, category) => {
61
+ return price.appliedReductions.filter((reduction) => {
62
+ return reduction.category === category;
63
+ });
64
+ };
65
+ export const getSizeFromSpecificVariant = (product, variantId) => {
66
+ if (!product.variants) {
67
+ return null;
68
+ }
69
+ const variant = product.variants?.find((item) => item.id === variantId);
70
+ return getSizeFromVariant(variant || product.variants[0]);
71
+ };
72
+ export const getVariant = (variants, id) => {
73
+ return variants?.find((variant) => variant.id === id);
74
+ };
75
+ export const getSizeFromVariant = (variant, attributeName = "shopSize") => getFirstAttributeValue(variant.attributes, attributeName);
76
+ export const getAllSizesFromVariants = (variantsAttributes, attributeName = "shopSize") => unique(
77
+ variantsAttributes.map(
78
+ (variant) => getFirstAttributeValue(variant.attributes, attributeName)
79
+ ).filter(Boolean),
80
+ (it) => it?.id
81
+ );
82
+ export const getProductSiblings = (product, colorAttributeName = "colorDetail") => {
83
+ if (!product) {
84
+ return [];
85
+ }
86
+ const items = [product];
87
+ product.siblings?.forEach((item) => {
88
+ if (!item.isActive) {
89
+ return;
90
+ }
91
+ items.push(item);
92
+ });
93
+ return items.map((item) => ({
94
+ id: item.id,
95
+ image: getImageFromList(item.images, ProductImageType.BUST, "front"),
96
+ colors: getAttributeValueTuples(item.attributes, colorAttributeName)
97
+ }));
98
+ };
99
+ export const getProductColors = (product, colorAttributeName = "colorDetail") => {
100
+ return getAttributeValueTuples(product.attributes, colorAttributeName).map(
101
+ (color) => color.label
102
+ );
103
+ };
104
+ export const getVariantBySize = (variants, size, sizeAttributeName = "shopSize") => {
105
+ return variants?.find(
106
+ (variant) => getAttributeValue(variant.attributes, sizeAttributeName) === size.value
107
+ );
108
+ };
109
+ export const isInStock = (variant) => {
110
+ return variant.stock.quantity > 0 || variant.stock.isSellableWithoutStock === true;
111
+ };
112
+ export const isVariantInStock = (variants, size, sizeAttributeName = "shopSize") => {
113
+ const variant = variants?.find(
114
+ (variant2) => getSizeFromVariant(variant2, sizeAttributeName)?.value === size.value
115
+ );
116
+ if (!variant) {
117
+ return false;
118
+ }
119
+ return isInStock(variant);
120
+ };
121
+ export const getAttribute = (product, key) => {
122
+ const values = product.attributes?.[key]?.values;
123
+ return values?.value ?? values?.label;
124
+ };
125
+ export const getProductPath = (product) => {
126
+ const name = getAttributeValue(product.attributes, "name");
127
+ return `/product/${slugify(name)}-${product.id}`;
128
+ };
129
+ export const getCategoriesByRoute = (product, route) => {
130
+ if (!product) {
131
+ return [];
132
+ }
133
+ const item = product?.categories?.find((categories) => {
134
+ return categories.some((entry) => entry.categoryUrl === route?.path);
135
+ });
136
+ if (item) {
137
+ return item;
138
+ }
139
+ return product.categories?.[product.categories?.length - 1] || [];
140
+ };
141
+ export const getLatestCategory = (categories) => {
142
+ if (!categories || categories.length === 0) {
143
+ return;
144
+ }
145
+ const categoriesLength = categories.length;
146
+ const latestSubset = categories[categoriesLength - 1];
147
+ return latestSubset[latestSubset.length - 1];
148
+ };
149
+ export const getProductAndSiblingsColors = (product, colorAttributeName = "colorDetail") => {
150
+ const productColor = getFirstAttributeValue(
151
+ product.attributes,
152
+ colorAttributeName
153
+ );
154
+ const siblingsColors = product.siblings?.filter((sibling) => sibling.isActive && !sibling.isSoldOut).map(
155
+ (sibling) => getFirstAttributeValue(sibling.attributes, colorAttributeName)
156
+ );
157
+ return [productColor, ...siblingsColors || []].filter(
158
+ (color) => !!color
159
+ );
160
+ };
161
+ export const getVariantCrosssellingValues = (variants) => {
162
+ if (!variants?.length) {
163
+ return [];
164
+ }
165
+ const crossellings = variants.map((variant) => variant.advancedAttributes?.variantCrosssellings).filter(Boolean);
166
+ const uniqueCrossellings = unique(crossellings, (it) => it?.id);
167
+ const values = uniqueCrossellings.map((r) => r?.values);
168
+ const fieldSets = flattenDeep(values).map((r) => r?.fieldSet);
169
+ return flattenDeep(fieldSets).map((r) => r?.value).filter((it) => !!it);
170
+ };
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stripShopLocaleFromPath = exports.sanitize = void 0;
7
+ var _isomorphicDompurify = _interopRequireDefault(require("isomorphic-dompurify"));
8
+ var _radash = require("radash");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ const sanitize = payload => {
11
+ return (0, _radash.mapValues)(payload, value => value && _isomorphicDompurify.default.sanitize(value));
12
+ };
13
+ exports.sanitize = sanitize;
14
+ const stripShopLocaleFromPath = (locale, path, splitter = "/") => path.split(splitter).filter(segment => segment.toLowerCase() !== locale.toLowerCase()).join("/");
15
+ exports.stripShopLocaleFromPath = stripShopLocaleFromPath;
@@ -0,0 +1,2 @@
1
+ export declare const sanitize: <T extends Record<string, string | undefined>>(payload: T) => Record<string, any>;
2
+ export declare const stripShopLocaleFromPath: (locale: string, path: string, splitter?: string) => string;
@@ -0,0 +1,6 @@
1
+ import DOMPurify from "isomorphic-dompurify";
2
+ import { mapValues } from "radash";
3
+ export const sanitize = (payload) => {
4
+ return mapValues(payload, (value) => value && DOMPurify.sanitize(value));
5
+ };
6
+ export const stripShopLocaleFromPath = (locale, path, splitter = "/") => path.split(splitter).filter((segment) => segment.toLowerCase() !== locale.toLowerCase()).join("/");
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getSortingValues = exports.getSortByValue = void 0;
7
+ var _backbone = require("@aboutyou/backbone");
8
+ var _radash = require("radash");
9
+ var _sorting = require("../constants/sorting.cjs");
10
+ const SORTING_VALUES = {
11
+ topSeller: {
12
+ by: _backbone.APISortOption.Price,
13
+ direction: _backbone.APISortOrder.Descending,
14
+ name: _sorting.SortName.TOPSELLER,
15
+ query: _sorting.SortQuery.TOPSELLER
16
+ },
17
+ dateNewest: {
18
+ by: _backbone.APISortOption.DateAdded,
19
+ name: _sorting.SortName.DATE_NEWEST,
20
+ query: _sorting.SortQuery.DATE_NEWEST
21
+ },
22
+ priceDesc: {
23
+ by: _backbone.APISortOption.Price,
24
+ direction: _backbone.APISortOrder.Descending,
25
+ name: _sorting.SortName.PRICE_DESC,
26
+ query: _sorting.SortQuery.PRICE_DESC
27
+ },
28
+ priceAsc: {
29
+ by: _backbone.APISortOption.Price,
30
+ direction: _backbone.APISortOrder.Ascending,
31
+ name: _sorting.SortName.PRICE_ASC,
32
+ query: _sorting.SortQuery.PRICE_ASC
33
+ },
34
+ reductionDesc: {
35
+ by: _backbone.APISortOption.Reduction,
36
+ direction: _backbone.APISortOrder.Descending,
37
+ name: _sorting.SortName.REDUCTION_DESC,
38
+ query: _sorting.SortQuery.REDUCTION_DESC
39
+ },
40
+ reductionAsc: {
41
+ by: _backbone.APISortOption.Reduction,
42
+ direction: _backbone.APISortOrder.Ascending,
43
+ name: _sorting.SortName.REDUCTION_ASC,
44
+ query: _sorting.SortQuery.REDUCTION_ASC
45
+ }
46
+ };
47
+ const getSortingValues = (options = ["topSeller", "dateNewest", "priceDesc", "priceAsc", "reductionDesc", "reductionAsc"]) => (0, _radash.pick)(SORTING_VALUES, options);
48
+ exports.getSortingValues = getSortingValues;
49
+ const getSortByValue = (query, defaultSort) => {
50
+ switch (query) {
51
+ case _sorting.SortQuery.PRICE_DESC:
52
+ return SORTING_VALUES.priceDesc;
53
+ case _sorting.SortQuery.PRICE_ASC:
54
+ return SORTING_VALUES.priceAsc;
55
+ case _sorting.SortQuery.REDUCTION_DESC:
56
+ return SORTING_VALUES.reductionDesc;
57
+ case _sorting.SortQuery.REDUCTION_ASC:
58
+ return SORTING_VALUES.reductionAsc;
59
+ case _sorting.SortQuery.TOPSELLER:
60
+ return SORTING_VALUES.topSeller;
61
+ case _sorting.SortQuery.DATE_NEWEST:
62
+ return SORTING_VALUES.dateNewest;
63
+ default:
64
+ return SORTING_VALUES[defaultSort || "dateNewest"];
65
+ }
66
+ };
67
+ exports.getSortByValue = getSortByValue;
@@ -0,0 +1,69 @@
1
+ import { APISortOption, APISortOrder } from '@aboutyou/backbone';
2
+ import type { Query, SortingValueKey } from '../index';
3
+ export declare const getSortingValues: (options?: Array<SortingValueKey>) => Pick<{
4
+ topSeller: {
5
+ by: APISortOption;
6
+ direction: APISortOrder;
7
+ name: "topseller";
8
+ query: "topseller";
9
+ };
10
+ dateNewest: {
11
+ by: APISortOption;
12
+ name: "date_newest";
13
+ query: "date-newest";
14
+ };
15
+ priceDesc: {
16
+ by: APISortOption;
17
+ direction: APISortOrder;
18
+ name: "price_desc";
19
+ query: "price-desc";
20
+ };
21
+ priceAsc: {
22
+ by: APISortOption;
23
+ direction: APISortOrder;
24
+ name: "price_asc";
25
+ query: "price-asc";
26
+ };
27
+ reductionDesc: {
28
+ by: APISortOption;
29
+ direction: APISortOrder;
30
+ name: "reduction_desc";
31
+ query: "reduction-desc";
32
+ };
33
+ reductionAsc: {
34
+ by: APISortOption;
35
+ direction: APISortOrder;
36
+ name: "reduction_asc";
37
+ query: "reduction-asc";
38
+ };
39
+ }, SortingValueKey>;
40
+ export declare const getSortByValue: (query: Query, defaultSort?: SortingValueKey) => {
41
+ by: APISortOption;
42
+ direction: APISortOrder;
43
+ name: "topseller";
44
+ query: "topseller";
45
+ } | {
46
+ by: APISortOption;
47
+ name: "date_newest";
48
+ query: "date-newest";
49
+ } | {
50
+ by: APISortOption;
51
+ direction: APISortOrder;
52
+ name: "price_desc";
53
+ query: "price-desc";
54
+ } | {
55
+ by: APISortOption;
56
+ direction: APISortOrder;
57
+ name: "price_asc";
58
+ query: "price-asc";
59
+ } | {
60
+ by: APISortOption;
61
+ direction: APISortOrder;
62
+ name: "reduction_desc";
63
+ query: "reduction-desc";
64
+ } | {
65
+ by: APISortOption;
66
+ direction: APISortOrder;
67
+ name: "reduction_asc";
68
+ query: "reduction-asc";
69
+ };