vsf-utilities
Version:
Utilities functions shared between vsf projects
83 lines • 3.48 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const productChecksum_1 = __importDefault(require("./productChecksum"));
const getProductOptions_1 = __importDefault(require("./getProductOptions"));
// 'id' check
const getServerItemId = (product) => product.server_item_id || product.item_id;
const isServerIdsEquals = (product1, product2) => {
const product1ItemId = getServerItemId(product1);
const product2ItemId = getServerItemId(product2);
const areItemIdsDefined = product1ItemId !== undefined && product2ItemId !== undefined;
return areItemIdsDefined && product1ItemId === product2ItemId;
};
// 'checksum' check
const getChecksum = (product) => {
if (product.checksum) {
return product.checksum;
}
return productChecksum_1.default(product);
};
const isChecksumEquals = (product1, product2) => getChecksum(product1) === getChecksum(product2);
// 'sku' check
const isSkuEqual = (product1, product2) => String(product1.sku) === String(product2.sku);
/**
* Returns product equality check function
* @param checkName - determines what type of check we want to do
*/
const getCheckFn = (checkName) => {
switch (checkName) {
case 'id': {
return isServerIdsEquals;
}
case 'checksum': {
return isChecksumEquals;
}
case 'sku': {
return isSkuEqual;
}
default: {
return isSkuEqual;
}
}
};
/**
* It passes all types of checks and returns the first passed. The order of checks matters!
*/
const makeCheck = (product1, product2, checks) => {
for (const checkName of checks) {
const fn = getCheckFn(checkName);
if (fn(product1, product2)) {
return true;
}
}
return false;
};
const productsEquals = (product1, product2) => {
if (!product1 || !product2) {
return false;
}
const check = makeCheck.bind(null, product1, product2);
if (getProductOptions_1.default(product1, 'bundle_options').length || getProductOptions_1.default(product2, 'bundle_options').length) {
// bundle options skus are merged into one sku so we can't rely on 'sku'
// by default we want to check server_item_id ('id'), we can also use 'checksum'
return check(['id', 'checksum']);
}
if (getProductOptions_1.default(product1, 'custom_options').length || getProductOptions_1.default(product2, 'custom_options').length) {
// in admin panel we can add different sku for specific custom option so we can't rely on 'sku'
// by default we want to check server_item_id ('id'), we can also use 'checksum'
return check(['id', 'checksum']);
}
if (getProductOptions_1.default(product1, 'configurable_item_options').length || getProductOptions_1.default(product2, 'configurable_item_options').length) {
// 'sku' should be uniq for configurable products
// we can't check 'id' because it is the same when user edit product in microcart, so it can give wrong result
return check(['sku']);
}
// by default we want to check if server_item_id is equal and check sku as fallback
// this is for 'simple' and 'group' products
return check(['id', 'sku']);
};
exports.default = productsEquals;
//# sourceMappingURL=productsEquals.js.map