Sfoglia il codice sorgente

feat(email-plugin): Add support for asynchronous email generators (#3976)

Twilight 4 settimane fa
parent
commit
3ae219b5ab

+ 6 - 1
packages/email-plugin/src/email-processor.ts

@@ -64,7 +64,12 @@ export class EmailProcessor {
                     templateVars: data.templateVars,
                 },
             );
-            const generated = this.generator.generate(data.from, data.subject, bodySource, data.templateVars);
+            const generated = await this.generator.generate(
+                data.from,
+                data.subject,
+                bodySource,
+                data.templateVars,
+            );
             emailDetails = {
                 ...generated,
                 recipient: data.recipient,

+ 3 - 1
packages/email-plugin/src/generator/email-generator.ts

@@ -2,6 +2,8 @@ import { InjectableStrategy, VendureEvent } from '@vendure/core';
 
 import { EmailDetails, EmailPluginOptions } from '../types';
 
+type EmailGeneratorResult = Pick<EmailDetails, 'from' | 'subject' | 'body'>;
+
 /**
  * @description
  * An EmailGenerator generates the subject and body details of an email.
@@ -28,5 +30,5 @@ export interface EmailGenerator<T extends string = any, E extends VendureEvent =
         subject: string,
         body: string,
         templateVars: { [key: string]: any },
-    ): Pick<EmailDetails, 'from' | 'subject' | 'body'>;
+    ): EmailGeneratorResult | Promise<EmailGeneratorResult>;
 }

+ 3 - 3
packages/email-plugin/src/generator/handlebars-mjml-generator.ts

@@ -32,9 +32,9 @@ export class HandlebarsMjmlGenerator implements EmailGenerator {
         // This is needed because some Vendure entities use getters on the entity
         // prototype (e.g. Order.total) which may need to be interpolated.
         const templateOptions: RuntimeOptions = { allowProtoPropertiesByDefault: true };
-        const fromResult = compiledFrom(templateVars, { allowProtoPropertiesByDefault: true });
-        const subjectResult = compiledSubject(templateVars, { allowProtoPropertiesByDefault: true });
-        const mjml = compiledTemplate(templateVars, { allowProtoPropertiesByDefault: true });
+        const fromResult = compiledFrom(templateVars, templateOptions);
+        const subjectResult = compiledSubject(templateVars, templateOptions);
+        const mjml = compiledTemplate(templateVars, templateOptions);
         const body = mjml2html(mjml).html;
         return { from: fromResult, subject: subjectResult, body };
     }