diff --git a/quartz/build.ts b/quartz/build.ts index f3adfe250..d16fce8bf 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -261,35 +261,35 @@ async function rebuild(changes: ChangeEvent[], clientRefresh: () => void, buildD .map((file) => file.content), ) - let emittedFiles = 0 - for (const emitter of cfg.plugins.emitters) { - // Try to use partialEmit if available, otherwise assume the output is static - const emitFn = emitter.partialEmit ?? emitter.emit - const emitted = await emitFn(ctx, processedFiles, staticResources, changeEvents) - if (emitted === null) { - continue - } - - 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}`) - } + const emittedFiles = await Promise.all( + cfg.plugins.emitters.map(async (emitter) => { + const emitFn = emitter.partialEmit ?? emitter.emit + const emitted = emitFn(ctx, processedFiles, staticResources, changeEvents) + if (emitted === null) { + return 0 } - } else { - // Array case - emittedFiles += emitted.length - if (ctx.argv.verbose) { - for (const file of emitted) { - console.log(`[emit:${emitter.name}] ${file}`) + if (Symbol.asyncIterator in emitted) { + let emittedFiles = 0 + // Async generator case + for await (const file of emitted) { + emittedFiles++ + if (ctx.argv.verbose) { + console.log(`[emit:${emitter.name}] ${file}`) + } } + return emittedFiles + } else { + // Array case + return await Promise.all( + (await emitted).map((file) => { + console.log(`[emit:${emitter.name}] ${file}`) + }), + ).then((files) => files.length) } - } - } - - console.log(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince("rebuild")}`) + }), + ) + const sumFiles = emittedFiles.reduce((a, b) => a + b) + console.log(`Emitted ${sumFiles} files to \`${argv.output}\` in ${perf.timeSince("rebuild")}`) console.log(styleText("green", `Done rebuilding in ${perf.timeSince()}`)) changes.splice(0, numChangesInBuild) clientRefresh() diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index 78702959c..ad6748530 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -13,14 +13,14 @@ export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { log.start(`Emitting files`) - let emittedFiles = 0 const staticResources = getStaticResourcesFromPlugins(ctx) - await Promise.all( + const emittedFiles = await Promise.all( cfg.plugins.emitters.map(async (emitter) => { try { - const emitted = await emitter.emit(ctx, content, staticResources) + const emitted = emitter.emit(ctx, content, staticResources) if (Symbol.asyncIterator in emitted) { // Async generator case + let emittedFiles = 0 for await (const file of emitted) { emittedFiles++ if (ctx.argv.verbose) { @@ -29,22 +29,27 @@ export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { log.updateText(`${emitter.name} -> ${styleText("gray", file)}`) } } + return emittedFiles } else { // Array case - emittedFiles += emitted.length - for (const file of emitted) { - if (ctx.argv.verbose) { - console.log(`[emit:${emitter.name}] ${file}`) - } else { - log.updateText(`${emitter.name} -> ${styleText("gray", file)}`) - } - } + return ( + await Promise.all( + (await emitted).map((file) => { + if (ctx.argv.verbose) { + console.log(`[emit:${emitter.name}] ${file}`) + } else { + log.updateText(`${emitter.name} -> ${styleText("gray", file)}`) + } + }), + ) + ).length } } catch (err) { trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error) + return 0 } }), ) - - log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`) + const sumFiles = emittedFiles.reduce((a, b) => a + b) + log.end(`Emitted ${sumFiles} files to \`${argv.output}\` in ${perf.timeSince()}`) }