@faststore/api 1.10.34 → 1.11.3
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 +9 -0
- package/dist/api.cjs.development.js +53 -16
- package/dist/api.cjs.development.js.map +1 -1
- package/dist/api.cjs.production.min.js +1 -1
- package/dist/api.cjs.production.min.js.map +1 -1
- package/dist/api.esm.js +53 -16
- package/dist/api.esm.js.map +1 -1
- package/package.json +2 -2
- package/src/platforms/vtex/resolvers/validateCart.ts +97 -40
package/dist/api.esm.js
CHANGED
|
@@ -929,7 +929,7 @@ const isAttachment = value => value.valueReference === VALUE_REFERENCES.attachme
|
|
|
929
929
|
const getId = item => {
|
|
930
930
|
var _item$itemOffered$add;
|
|
931
931
|
|
|
932
|
-
return [item.itemOffered.sku, item.seller.identifier, item.price, (_item$itemOffered$add = item.itemOffered.additionalProperty) == null ? void 0 : _item$itemOffered$add.filter(isAttachment).map(getPropertyId).join('-')].filter(Boolean).join('::');
|
|
932
|
+
return [item.itemOffered.sku, item.seller.identifier, item.price < 0.01 ? 'Gift' : undefined, (_item$itemOffered$add = item.itemOffered.additionalProperty) == null ? void 0 : _item$itemOffered$add.filter(isAttachment).map(getPropertyId).join('-')].filter(Boolean).join('::');
|
|
933
933
|
};
|
|
934
934
|
|
|
935
935
|
const orderFormItemToOffer = (item, index) => ({
|
|
@@ -967,7 +967,12 @@ const groupById = offers => offers.reduce((acc, item) => {
|
|
|
967
967
|
var _acc$get;
|
|
968
968
|
|
|
969
969
|
const id = getId(item);
|
|
970
|
-
|
|
970
|
+
|
|
971
|
+
if (!acc.has(id)) {
|
|
972
|
+
acc.set(id, []);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
(_acc$get = acc.get(id)) == null ? void 0 : _acc$get.push(item);
|
|
971
976
|
return acc;
|
|
972
977
|
}, new Map());
|
|
973
978
|
|
|
@@ -986,6 +991,30 @@ const equals = (storeOrder, orderForm) => {
|
|
|
986
991
|
return isSameOrder && orderItemsAreSync;
|
|
987
992
|
};
|
|
988
993
|
|
|
994
|
+
const joinItems = form => {
|
|
995
|
+
const itemsById = form.items.reduce((acc, item) => {
|
|
996
|
+
const id = getId(orderFormItemToOffer(item));
|
|
997
|
+
|
|
998
|
+
if (!acc[id]) {
|
|
999
|
+
acc[id] = [];
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
acc[id].push(item);
|
|
1003
|
+
return acc;
|
|
1004
|
+
}, {});
|
|
1005
|
+
return { ...form,
|
|
1006
|
+
items: Object.values(itemsById).map(items => {
|
|
1007
|
+
const [item] = items;
|
|
1008
|
+
const quantity = items.reduce((acc, i) => acc + i.quantity, 0);
|
|
1009
|
+
const totalPrice = items.reduce((acc, i) => acc + i.quantity * i.sellingPrice, 0);
|
|
1010
|
+
return { ...item,
|
|
1011
|
+
quantity,
|
|
1012
|
+
sellingPrice: totalPrice / quantity
|
|
1013
|
+
};
|
|
1014
|
+
})
|
|
1015
|
+
};
|
|
1016
|
+
};
|
|
1017
|
+
|
|
989
1018
|
const orderFormToCart = async (form, skuLoader) => {
|
|
990
1019
|
return {
|
|
991
1020
|
order: {
|
|
@@ -1088,7 +1117,7 @@ const validateCart = async (_, {
|
|
|
1088
1117
|
const isStale = isOrderFormStale(orderForm);
|
|
1089
1118
|
|
|
1090
1119
|
if (isStale === true && orderNumber) {
|
|
1091
|
-
const newOrderForm = await setOrderFormEtag(orderForm, commerce);
|
|
1120
|
+
const newOrderForm = await setOrderFormEtag(orderForm, commerce).then(joinItems);
|
|
1092
1121
|
return orderFormToCart(newOrderForm, skuLoader);
|
|
1093
1122
|
}
|
|
1094
1123
|
} // Step2: Process items from both browser and checkout so they have the same shape
|
|
@@ -1096,33 +1125,41 @@ const validateCart = async (_, {
|
|
|
1096
1125
|
|
|
1097
1126
|
const browserItemsById = groupById(acceptedOffer);
|
|
1098
1127
|
const originItemsById = groupById(orderForm.items.map(orderFormItemToOffer));
|
|
1099
|
-
const
|
|
1128
|
+
const originItems = Array.from(originItemsById.entries()); // items on the VTEX platform backend
|
|
1100
1129
|
|
|
1101
|
-
const
|
|
1130
|
+
const browserItems = Array.from(browserItemsById.entries()); // items on the user's browser
|
|
1102
1131
|
// Step3: Compute delta changes
|
|
1103
1132
|
|
|
1104
1133
|
const {
|
|
1105
1134
|
itemsToAdd,
|
|
1106
1135
|
itemsToUpdate
|
|
1107
|
-
} = browserItems.reduce((acc,
|
|
1108
|
-
const maybeOriginItem = originItemsById.get(
|
|
1136
|
+
} = browserItems.reduce((acc, [id, items]) => {
|
|
1137
|
+
const maybeOriginItem = originItemsById.get(id); // Adding new items to cart
|
|
1109
1138
|
|
|
1110
1139
|
if (!maybeOriginItem) {
|
|
1111
|
-
acc.itemsToAdd.push(item);
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
});
|
|
1116
|
-
}
|
|
1140
|
+
items.forEach(item => acc.itemsToAdd.push(item));
|
|
1141
|
+
return acc;
|
|
1142
|
+
} // Update existing items
|
|
1143
|
+
|
|
1117
1144
|
|
|
1145
|
+
const [head, ...tail] = maybeOriginItem;
|
|
1146
|
+
const totalQuantity = items.reduce((acc, curr) => acc + curr.quantity, 0); // set total quantity to first item
|
|
1147
|
+
|
|
1148
|
+
acc.itemsToUpdate.push({ ...head,
|
|
1149
|
+
quantity: totalQuantity
|
|
1150
|
+
}); // Remove all the rest
|
|
1151
|
+
|
|
1152
|
+
tail.forEach(item => acc.itemsToUpdate.push({ ...item,
|
|
1153
|
+
quantity: 0
|
|
1154
|
+
}));
|
|
1118
1155
|
return acc;
|
|
1119
1156
|
}, {
|
|
1120
1157
|
itemsToAdd: [],
|
|
1121
1158
|
itemsToUpdate: []
|
|
1122
1159
|
});
|
|
1123
|
-
const itemsToDelete = originItems.filter(
|
|
1160
|
+
const itemsToDelete = originItems.filter(([id]) => !browserItemsById.has(id)).flatMap(([, items]) => items.map(item => ({ ...item,
|
|
1124
1161
|
quantity: 0
|
|
1125
|
-
}));
|
|
1162
|
+
})));
|
|
1126
1163
|
const changes = [...itemsToAdd, ...itemsToUpdate, ...itemsToDelete].map(offerToOrderItemInput);
|
|
1127
1164
|
|
|
1128
1165
|
if (changes.length === 0) {
|
|
@@ -1135,7 +1172,7 @@ const validateCart = async (_, {
|
|
|
1135
1172
|
id: orderForm.orderFormId,
|
|
1136
1173
|
orderItems: changes
|
|
1137
1174
|
}) // update orderForm etag so we know last time we touched this orderForm
|
|
1138
|
-
.then(form => enableOrderFormSync ? setOrderFormEtag(form, commerce) : form); // Step5: If no changes detected before/after updating orderForm, the order is validated
|
|
1175
|
+
.then(form => enableOrderFormSync ? setOrderFormEtag(form, commerce) : form).then(joinItems); // Step5: If no changes detected before/after updating orderForm, the order is validated
|
|
1139
1176
|
|
|
1140
1177
|
if (equals(order, updatedOrderForm)) {
|
|
1141
1178
|
return null;
|