From d9159e0ac9bfc22e584c78bc8aa04ecd82c14eea Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Thu, 13 Mar 2025 17:27:46 +0000
Subject: [PATCH] feat: make og images an emitter to properly await image generation (#1826)

---
 quartz/processors/emit.ts |   41 +++++++++++++++++++++++++++++------------
 1 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts
index c68e0ed..0d3f8d7 100644
--- a/quartz/processors/emit.ts
+++ b/quartz/processors/emit.ts
@@ -4,6 +4,7 @@
 import { QuartzLogger } from "../util/log"
 import { trace } from "../util/trace"
 import { BuildCtx } from "../util/ctx"
+import chalk from "chalk"
 
 export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) {
   const { argv, cfg } = ctx
@@ -14,20 +15,36 @@
 
   let emittedFiles = 0
   const staticResources = getStaticResourcesFromPlugins(ctx)
-  for (const emitter of cfg.plugins.emitters) {
-    try {
-      const emitted = await emitter.emit(ctx, content, staticResources)
-      emittedFiles += emitted.length
-
-      if (ctx.argv.verbose) {
-        for (const file of emitted) {
-          console.log(`[emit:${emitter.name}] ${file}`)
+  await Promise.all(
+    cfg.plugins.emitters.map(async (emitter) => {
+      try {
+        const emitted = await emitter.emit(ctx, content, staticResources)
+        if (Symbol.asyncIterator in emitted) {
+          // Async generator case
+          for await (const file of emitted) {
+            emittedFiles++
+            if (ctx.argv.verbose) {
+              console.log(`[emit:${emitter.name}] ${file}`)
+            } else {
+              log.updateText(`Emitting output files: ${chalk.gray(file)}`)
+            }
+          }
+        } else {
+          // Array case
+          emittedFiles += emitted.length
+          for (const file of emitted) {
+            if (ctx.argv.verbose) {
+              console.log(`[emit:${emitter.name}] ${file}`)
+            } else {
+              log.updateText(`Emitting output files: ${chalk.gray(file)}`)
+            }
+          }
         }
+      } catch (err) {
+        trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
       }
-    } catch (err) {
-      trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
-    }
-  }
+    }),
+  )
 
   log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`)
 }

--
Gitblit v1.10.0