From 982bf4f9e4c3073175c587b3dbf9259b5c616533 Mon Sep 17 00:00:00 2001 From: Cosmin Popovici Date: Tue, 9 Jun 2026 14:00:13 +0300 Subject: [PATCH 1/3] fix(build): include plaintext output in files list --- src/render/buildTemplate.ts | 1 + src/tests/build.test.ts | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/render/buildTemplate.ts b/src/render/buildTemplate.ts index 0e11791a..8a2c40fc 100644 --- a/src/render/buildTemplate.ts +++ b/src/render/buildTemplate.ts @@ -133,6 +133,7 @@ export async function buildTemplate( mkdirSync(dirname(ptOutputPath), { recursive: true }) writeFileSync(ptOutputPath, plaintext) + files.push(ptOutputPath) } } finally { _setCurrentTemplate(undefined) diff --git a/src/tests/build.test.ts b/src/tests/build.test.ts index 9ef6ab69..4c02d349 100644 --- a/src/tests/build.test.ts +++ b/src/tests/build.test.ts @@ -444,7 +444,7 @@ describe('build', () => { const result = await build({ plaintext: true }) - expect(result.files).toHaveLength(1) + expect(result.files).toHaveLength(2) const txtPath = result.files[0].replace(/\.html$/, '.txt') expect(existsSync(txtPath)).toBe(true) @@ -466,7 +466,7 @@ describe('build', () => { const result = await build({ plaintext: { destination: customPath } }) - expect(result.files).toHaveLength(1) + expect(result.files).toHaveLength(2) expect(existsSync(join(customPath, 'test.txt'))).toBe(true) }) @@ -530,6 +530,23 @@ describe('build', () => { expect(txt).not.toContain('
') }) + it('includes plaintext files in result.files and the afterBuild payload', async () => { + writeSfc(tempDir, 'emails/test.vue', ` + + `) + + let afterBuildFiles: string[] = [] + const result = await build({ + plaintext: true, + afterBuild({ files }) { afterBuildFiles = files }, + }) + + expect(result.files.some(f => f.endsWith('.txt'))).toBe(true) + expect(afterBuildFiles.some(f => f.endsWith('.txt'))).toBe(true) + }) + it('usePlaintext() with custom extension', async () => { writeSfc(tempDir, 'emails/test.vue', ` + + `) + + writeSfc(tempDir, 'emails/b.vue', ` + + + `) + + writeFileSync(join(tempDir, 'maizzle.config.js'), ` + export default { + custom: { val: 'base' }, + beforeRender({ template, config }) { + if (template.path.name === 'a') config.custom.val = 'AAA' + } + } + `) + + const result = await build() + const aHtml = readFileSync(result.files.find(f => f.includes('a.html'))!, 'utf-8') + const bHtml = readFileSync(result.files.find(f => f.includes('b.html'))!, 'utf-8') + + // 'a' sees its own nested mutation + expect(aHtml).toContain('AAA') + // 'b' must NOT inherit 'a's nested mutation (deep per-template clone) + expect(bHtml).not.toContain('AAA') + expect(bHtml).toContain('base') + }) + it('fires afterRender event and uses modified HTML', async () => { writeSfc(tempDir, 'emails/test.vue', `