@codee-sh/medusa-plugin-notification-emails 1.0.1 → 1.0.2
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.
|
@@ -67,13 +67,14 @@ class MpnBuilderService extends (0, utils_1.MedusaService)({
|
|
|
67
67
|
let renderer = templateValue;
|
|
68
68
|
try {
|
|
69
69
|
const templateModule = await import(templateValue);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
renderer = template?.default || templateModule;
|
|
70
|
+
renderer =
|
|
71
|
+
templateModule?.default || templateModule;
|
|
73
72
|
if (!renderer) {
|
|
74
73
|
this.logger_.warn(`Template module from "${templateValue}" does not export a default function or expected named export`);
|
|
75
74
|
return;
|
|
76
75
|
}
|
|
76
|
+
renderer =
|
|
77
|
+
this.normalizeExternalRenderer(renderer, templateService);
|
|
77
78
|
}
|
|
78
79
|
catch (error) {
|
|
79
80
|
this.logger_.warn(`Failed to load template from "${templateValue}": ${error?.message || "Unknown error"}`);
|
|
@@ -87,6 +88,27 @@ class MpnBuilderService extends (0, utils_1.MedusaService)({
|
|
|
87
88
|
}
|
|
88
89
|
}));
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Normalize external template modules to match system template shape.
|
|
93
|
+
* Ensures getConfig() exists and base template renderers are included.
|
|
94
|
+
*/
|
|
95
|
+
normalizeExternalRenderer(renderer, templateService) {
|
|
96
|
+
if (!renderer) {
|
|
97
|
+
return renderer;
|
|
98
|
+
}
|
|
99
|
+
const templateBlocks = renderer.templateBlocks;
|
|
100
|
+
const translations = renderer.translations;
|
|
101
|
+
const baseTemplateConfig = templateService
|
|
102
|
+
?.baseTemplateConfig;
|
|
103
|
+
return {
|
|
104
|
+
...(baseTemplateConfig || {}),
|
|
105
|
+
...renderer,
|
|
106
|
+
getConfig: () => ({
|
|
107
|
+
blocks: templateBlocks || [],
|
|
108
|
+
translations: translations || {},
|
|
109
|
+
}),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
90
112
|
/**
|
|
91
113
|
* Get template types
|
|
92
114
|
*
|
|
@@ -164,4 +186,4 @@ class MpnBuilderService extends (0, utils_1.MedusaService)({
|
|
|
164
186
|
}
|
|
165
187
|
}
|
|
166
188
|
exports.default = MpnBuilderService;
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL21wbi1idWlsZGVyL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFHa0M7QUFDbEMscUNBR2lCO0FBS2pCLG9GQUE4RTtBQUU5RSxvRkFBOEU7QUFDOUUsaURBQXdFO0FBTXhFLE1BQU0saUJBQWtCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQzVDLGtCQUFrQixFQUFsQiwyQkFBa0I7SUFDbEIsdUJBQXVCLEVBQXZCLGdDQUF1QjtDQUN4QixDQUFDO0lBS0EsWUFDRSxFQUFFLE1BQU0sRUFBd0IsRUFDaEMsT0FBdUI7UUFFdkIsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUE7UUFOYixzQkFBaUIsR0FBNEUsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQVE1RyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQTtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFFN0IsK0JBQStCO1FBQy9CLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFBO1FBRWpDLCtEQUErRDtRQUMvRCxrRUFBa0U7UUFDbEUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ2hCLDJDQUEyQyxLQUFLLEVBQUUsT0FBTyxJQUFJLGVBQWUsRUFBRSxDQUMvRSxDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDBCQUEwQjtRQUNoQyxNQUFNLHVCQUF1QixHQUEwQjtZQUNyRCxJQUFJLDZDQUFvQixFQUFFO1lBQzFCLElBQUksNkNBQW9CLEVBQUU7U0FDM0IsQ0FBQTtRQUVELHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFF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
|
|
@@ -35,6 +35,10 @@ exports.slackServiceStep = (0, workflows_sdk_1.createStep)(exports.slackServiceS
|
|
|
35
35
|
const isExternalTemplateId = templateId?.startsWith(types_1.TEMPLATE_TYPES.EXTERNAL_TEMPLATE);
|
|
36
36
|
const isRegistryTemplate = isSystemTemplateId || isExternalTemplateId;
|
|
37
37
|
let blocks = [];
|
|
38
|
+
console.log('templateId', templateId);
|
|
39
|
+
console.log('isSystemTemplateId', isSystemTemplateId);
|
|
40
|
+
console.log('isExternalTemplateId', isExternalTemplateId);
|
|
41
|
+
console.log('isRegistryTemplate', isRegistryTemplate);
|
|
38
42
|
// If it's not a registry template, get the blocks from the database
|
|
39
43
|
if (!isRegistryTemplate) {
|
|
40
44
|
const { result: templateData } = await (0, get_template_1.getTemplateWorkflow)(container).run({
|
|
@@ -64,4 +68,4 @@ exports.slackServiceStep = (0, workflows_sdk_1.createStep)(exports.slackServiceS
|
|
|
64
68
|
blocks: renderedBlocks,
|
|
65
69
|
});
|
|
66
70
|
});
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvbXBuLWJ1aWxkZXItc2VydmljZXMvc3RlcHMvc2xhY2stc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFHMEM7QUFDMUMsaUVBQW9FO0FBQ3BFLDBDQUEwQztBQUMxQyw4REFBbUU7QUFFdEQsUUFBQSxrQkFBa0IsR0FBRyxnQ0FBZ0MsQ0FBQTtBQUVsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLElBQUEsMEJBQVUsRUFDeEMsMEJBQWtCLEVBQ2xCLEtBQUssRUFDSCxLQUFVLEVBQ1YsRUFBRSxTQUFTLEVBQUUsRUFDZSxFQUFFO0lBQzlCLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FDekMsWUFBWSxDQUNOLENBQUE7SUFFUixNQUFNLG9CQUFvQixHQUN4QixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDbEMsT0FBTyxDQUNSLEVBQUUsZUFBZSxDQUFBO0lBRXBCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUE7SUFDcEMsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLEVBQUUsVUFBVSxDQUFDLHNCQUFjLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDakYsTUFBTSxvQkFBb0IsR0FBRyxVQUFVLEVBQUUsVUFBVSxDQUFDLHNCQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUNyRixNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixJQUFJLG9CQUFvQixDQUFBO0lBRXJFLElBQUksTUFBTSxHQUFVLEVBQUUsQ0FBQTtJQUV0QixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzFELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUd0RCxvRUFBb0U7SUFDcEUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLElBQUEsa0NBQW1CLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3hFLEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsVUFBVTtnQkFDdkIsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ3JCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxVQUFVLEdBQUcsSUFBQSxpQkFBUyxFQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFaEUsTUFBTSxHQUFHLG9CQUFvQixFQUFFLDJCQUEyQixDQUN4RCxVQUFVLENBQ1gsQ0FBQTtJQUNILENBQUM7SUFFRCw4RkFBOEY7SUFDOUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FDOUIsTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7UUFDaEMsWUFBWSxFQUFFLGtCQUFrQjtZQUM5QixDQUFDLENBQUMsVUFBVTtZQUNaLENBQUMsQ0FBQyxlQUFlO1FBQ25CLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtRQUNoQixPQUFPLEVBQUU7WUFDUCxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzVCLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDMUIsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWTtZQUN4QyxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVU7U0FDckM7S0FDRixDQUFDLENBQUE7SUFFSixPQUFPLElBQUksNEJBQVksQ0FBQztRQUN0QixNQUFNLEVBQUUsY0FBYztLQUN2QixDQUFDLENBQUE7QUFDSixDQUFDLENBQ0YsQ0FBQSJ9
|