Skip to content

Commit eb264be

Browse files
authored
Merge pull request #654 from webstackdev/bugfix/mjml-template-import
Fix MJML import path error in lambda bundle
2 parents 9b7fa38 + 15c093b commit eb264be

7 files changed

Lines changed: 117 additions & 594 deletions

File tree

README.md

Lines changed: 71 additions & 578 deletions
Large diffs are not rendered by default.

src/actions/contact/responder.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { Buffer } from 'node:buffer'
22
import { ActionsFunctionError } from '@actions/utils/errors'
33
import acknowledgementTemplateContent from '@actions/contact/email/acknowledgement.mjml?raw'
44
import messageTemplateContent from '@actions/contact/email/message.mjml?raw'
5-
import { compileEmailTemplate, createEmailTemplate } from '@actions/utils/email/templateCompiler'
5+
import {
6+
compileEmailTemplate,
7+
createImportedEmailTemplate,
8+
} from '@actions/utils/email/templateCompiler'
69
import { escapeHtml, formatFileSize } from './utils'
710
import type { ContactFormData, ContactTimeline, FileAttachment } from '@actions/contact/@types'
811

@@ -61,13 +64,13 @@ const readInputBoolean = (input: Record<string, unknown>, key: string): boolean
6164
return false
6265
}
6366

64-
const contactMessageTemplate = createEmailTemplate(
65-
new URL('./email/message.mjml', import.meta.url),
67+
const contactMessageTemplate = createImportedEmailTemplate(
68+
'src/actions/contact/email/message.mjml',
6669
messageTemplateContent
6770
)
6871

69-
const contactAcknowledgementTemplate = createEmailTemplate(
70-
new URL('./email/acknowledgement.mjml', import.meta.url),
72+
const contactAcknowledgementTemplate = createImportedEmailTemplate(
73+
'src/actions/contact/email/acknowledgement.mjml',
7174
acknowledgementTemplateContent
7275
)
7376

src/actions/gdpr/entities/email.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import { Resend } from 'resend'
22
import verificationTemplateContent from '@actions/gdpr/email/verification.mjml?raw'
33
import { dsarVerificationEmailText } from '@actions/gdpr/email/dsarText'
4-
import { compileEmailTemplate, createEmailTemplate } from '@actions/utils/email/templateCompiler'
4+
import {
5+
compileEmailTemplate,
6+
createImportedEmailTemplate,
7+
} from '@actions/utils/email/templateCompiler'
58
import { getResendApiKey, isProd } from '@actions/utils/environment/environmentActions'
69
import { gdprReplyTo, gdprSender } from '@actions/utils/email/resendSenders'
710
import { getSiteUrl } from '@actions/utils/environment/siteUrlActions'
811
import { ActionsFunctionError } from '@actions/utils/errors/ActionsFunctionError'
912

10-
const verificationTemplate = createEmailTemplate(
11-
new URL('../email/verification.mjml', import.meta.url),
13+
const verificationTemplate = createImportedEmailTemplate(
14+
'src/actions/gdpr/email/verification.mjml',
1215
verificationTemplateContent
1316
)
1417

src/actions/newsletter/email/confirmationHtml.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import confirmationTemplateContent from './confirmation.mjml?raw'
2-
import { compileEmailTemplate, createEmailTemplate } from '@actions/utils/email/templateCompiler'
2+
import { compileEmailTemplate, createImportedEmailTemplate } from '@actions/utils/email/templateCompiler'
33

4-
const confirmationTemplate = createEmailTemplate(
5-
new URL('./confirmation.mjml', import.meta.url),
4+
const confirmationTemplate = createImportedEmailTemplate(
5+
'src/actions/newsletter/email/confirmation.mjml',
66
confirmationTemplateContent
77
)
88

src/actions/newsletter/email/welcomeHtml.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import welcomeTemplateContent from './welcome.mjml?raw'
2-
import { compileEmailTemplate, createEmailTemplate } from '@actions/utils/email/templateCompiler'
2+
import { compileEmailTemplate, createImportedEmailTemplate } from '@actions/utils/email/templateCompiler'
33

4-
const welcomeTemplate = createEmailTemplate(
5-
new URL('./welcome.mjml', import.meta.url),
4+
const welcomeTemplate = createImportedEmailTemplate(
5+
'src/actions/newsletter/email/welcome.mjml',
66
welcomeTemplateContent
77
)
88

src/actions/utils/email/__tests__/templateCompiler.spec.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import contactMessageTemplateContent from '../../../contact/email/message.mjml?r
66
import exampleTemplateContent from '../__fixtures__/example.mjml?raw'
77
import invalidTemplateContent from '../__fixtures__/invalid.mjml?raw'
88
import withCommonDataTemplateContent from '../__fixtures__/with-common-data.mjml?raw'
9-
import { compileEmailTemplate, createEmailTemplate } from '../templateCompiler'
9+
import {
10+
compileEmailTemplate,
11+
createEmailTemplate,
12+
createImportedEmailTemplate,
13+
} from '../templateCompiler'
1014

1115
const exampleTemplate = createEmailTemplate(
1216
new URL('../__fixtures__/example.mjml', import.meta.url),
@@ -28,6 +32,11 @@ const withCommonDataTemplate = createEmailTemplate(
2832
withCommonDataTemplateContent
2933
)
3034

35+
const importedExampleTemplate = createImportedEmailTemplate(
36+
'src/actions/utils/email/__fixtures__/example.mjml',
37+
exampleTemplateContent
38+
)
39+
3140
describe('compileEmailTemplate', () => {
3241
it('compiles the moved contact message template from its imported source', async () => {
3342
const result = await compileEmailTemplate(contactMessageTemplate, {
@@ -90,6 +99,18 @@ describe('compileEmailTemplate', () => {
9099
expect(result.text).toContain('Contact Webstack Builders at support@webstackbuilders.com.')
91100
})
92101

102+
it('compiles imported template content from a stable source path', async () => {
103+
const result = await compileEmailTemplate(importedExampleTemplate, {
104+
htmlMessage: '<strong>Urgent</strong> message body',
105+
items: ['Coffee Beans'],
106+
name: 'Alex',
107+
})
108+
109+
expect(result.html).toContain('Hello, Alex!')
110+
expect(result.html).toContain('Coffee Beans')
111+
expect(result.text).toContain('Urgent message body')
112+
})
113+
93114
it('throws ActionsFunctionError when MJML compilation reports errors', async () => {
94115
await expect(compileEmailTemplate(invalidTemplate)).rejects.toMatchObject({
95116
appCode: 'EMAIL_TEMPLATE_COMPILE_FAILED',

src/actions/utils/email/templateCompiler.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,10 @@ const createPlainText = (html: string): string =>
230230
/**
231231
* Creates a bundle-safe template descriptor from imported MJML source.
232232
*/
233-
export const createImportedEmailTemplate = createEmailTemplate
233+
export const createImportedEmailTemplate = (
234+
sourcePath: string,
235+
content: string
236+
): EmailTemplateSource => createEmailTemplate(sourcePath, content)
234237

235238
/**
236239
* Renders imported MJML source with Nunjucks data and returns HTML plus plain text.

0 commit comments

Comments
 (0)