@medusajs/utils
Version:
Medusa utilities functions shared by Medusa core and Modules
118 lines • 3.98 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessageAggregator = void 0;
const build_event_messages_1 = require("./build-event-messages");
class MessageAggregator {
constructor() {
this.messages = [];
}
count() {
return this.messages.length;
}
save(msg) {
const messages = Array.isArray(msg) ? msg : [msg];
if (messages.length === 0) {
return;
}
this.messages.push(...messages);
}
saveRawMessageData(messageData, { options, sharedContext, } = {}) {
const messages = Array.isArray(messageData) ? messageData : [messageData];
const composedMessages = messages.map((message) => {
return (0, build_event_messages_1.composeMessage)(message.eventName, {
data: message.data,
source: message.source,
object: message.object,
action: message.action,
options,
context: message.context ?? sharedContext,
});
});
this.save(composedMessages);
}
getMessages(format = {}) {
const { groupBy, sortBy } = format ?? {};
if (sortBy) {
this.messages.sort((a, b) => this.compareMessages(a, b, sortBy));
}
let messages = {
default: [...this.messages],
};
if (groupBy) {
messages = this.messages.reduce((acc, msg) => {
const key = groupBy
.map((field) => this.getValueFromPath(msg, field))
.join("-");
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(msg);
return acc;
}, {});
}
if (format.internal) {
Object.values(messages).forEach((group) => {
group.forEach((msg) => {
msg.options = msg.options ?? {};
msg.options.internal = format.internal;
});
});
}
return messages;
}
clearMessages() {
// Ensure no references are left over in case something rely on messages
this.messages.length = 0;
}
getValueFromPath(obj, path) {
const keys = path.split(".");
return keys.reduce((acc, key) => {
if (acc === undefined)
return undefined;
return acc[key];
}, obj);
}
compareMessages(a, b, sortBy) {
for (const key of Object.keys(sortBy)) {
const orderCriteria = sortBy[key];
const valueA = this.getValueFromPath(a, key);
const valueB = this.getValueFromPath(b, key);
// User defined order
if (Array.isArray(orderCriteria)) {
const indexA = orderCriteria.indexOf(valueA);
const indexB = orderCriteria.indexOf(valueB);
if (indexA === indexB) {
continue;
}
else if (indexA === -1) {
return 1;
}
else if (indexB === -1) {
return -1;
}
else {
return indexA - indexB;
}
}
else {
// Ascending or descending order
let orderMultiplier = 1;
if (orderCriteria === "desc" || orderCriteria === -1) {
orderMultiplier = -1;
}
if (valueA === valueB) {
continue;
}
else if (valueA < valueB) {
return -1 * orderMultiplier;
}
else {
return 1 * orderMultiplier;
}
}
}
return 0;
}
}
exports.MessageAggregator = MessageAggregator;
//# sourceMappingURL=message-aggregator.js.map
;