@medusajs/core-flows
Version:
Set of workflow definitions for Medusa
121 lines • 5.68 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.normalizeV1Products = void 0;
const utils_1 = require("@medusajs/framework/utils");
const basicFieldsToOmit = [
// Fields with slightly different naming
"Product MID Code",
"Product HS Code",
"Variant MID Code",
"Variant HS Code",
"Variant EAN",
"Variant UPC",
"Variant SKU",
// Fields no longer present in v2
"Variant Inventory Quantity",
"Product Profile Name",
"Product Profile Type",
// Fields that are remapped
"Product Collection Handle",
"Product Collection Title",
"Product Type",
"Product Tags",
];
// This is primarily to have backwards compatibility with v1 exports
// Although it also makes v2 import template more dynamic
// it's better to not expose eg. "Product MID Code" as an available public API so we can remove this code at some point.
const normalizeV1Products = (rawProducts, supportingData) => {
const productTypesMap = new Map(supportingData.productTypes.map((pt) => [pt.value, pt.id]));
const productCollectionsMap = new Map(supportingData.productCollections.map((pc) => [pc.handle, pc.id]));
const salesChannelsMap = new Map(supportingData.salesChannels.map((sc) => [sc.name, sc.id]));
const shippingProfilesIds = new Set(supportingData.shippingProfiles.map((sp) => sp.id));
return rawProducts.map((product) => {
let finalRes = {
...product,
"Product Mid Code": product["Product MID Code"] ?? product["Product Mid Code"],
"Product Hs Code": product["Product HS Code"] ?? product["Product Hs Code"],
"Variant MID Code": product["Variant MID Code"] ?? product["Variant Mid Code"],
"Variant Hs Code": product["Variant HS Code"] ?? product["Variant Hs Code"],
"Variant Ean": product["Variant EAN"] ?? product["Variant Ean"],
"Variant Upc": product["Variant UPC"] ?? product["Variant Upc"],
"Variant Sku": product["Variant SKU"] ?? product["Variant Sku"],
};
basicFieldsToOmit.forEach((field) => {
delete finalRes[field];
});
// You can either pass "Product Tags" or "Product Tag <IDX>", but not both
const tags = product["Product Tags"]?.toString()?.split(",");
if (tags) {
finalRes = {
...finalRes,
...tags.reduce((agg, tag, i) => {
agg[`Product Tag ${i + 1}`] = tag;
return agg;
}, {}),
};
}
const productTypeValue = product["Product Type"];
if (productTypeValue) {
if (!productTypesMap.has(productTypeValue)) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Product type with value '${productTypeValue}' does not exist`);
}
finalRes["Product Type Id"] = productTypesMap.get(productTypeValue);
}
const productCollectionHandle = product["Product Collection Handle"];
if (productCollectionHandle) {
if (!productCollectionsMap.has(productCollectionHandle)) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Product collection with handle '${productCollectionHandle}' does not exist`);
}
finalRes["Product Collection Id"] = productCollectionsMap.get(productCollectionHandle);
}
// We have to iterate over all fields for the ones that are index-based
Object.entries(finalRes).forEach(([key, value]) => {
if (key.startsWith("Price")) {
delete finalRes[key];
if (value) {
finalRes[`Variant ${key}`] = value;
}
}
if (key.startsWith("Option")) {
delete finalRes[key];
if (value) {
finalRes[`Variant ${key}`] = value;
}
}
if (key.startsWith("Image")) {
delete finalRes[key];
if (value) {
finalRes[`Product Image ${key.split(" ")[1]}`] = value;
}
}
if (key.startsWith("Sales Channel")) {
delete finalRes[key];
if (key.endsWith("Id") && value) {
if (!salesChannelsMap.has(value)) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Sales channel with name '${value}' does not exist`);
}
finalRes[`Product Sales Channel ${key.split(" ")[2]}`] =
salesChannelsMap.get(value);
}
}
if (key.startsWith("Shipping Profile Id")) {
if (!value) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Shipping Profile Id is required when importing products");
}
if (!shippingProfilesIds.has(value)) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Shipping profile: '${value}' does not exist`);
}
}
if (key.startsWith("Product Category") &&
(key.endsWith("Handle") ||
key.endsWith("Name") ||
key.endsWith("Description"))) {
delete finalRes[key];
}
// Note: Product categories from v1 are not imported to v2
});
return finalRes;
});
};
exports.normalizeV1Products = normalizeV1Products;
//# sourceMappingURL=normalize-v1-import.js.map
;