made entire array emitter process async

This commit is contained in:
松浦 知也 Matsuura Tomoya 2025-11-05 11:36:11 -05:00
parent ef25f903ca
commit 59b836bd79
2 changed files with 44 additions and 39 deletions

View File

@ -261,16 +261,15 @@ async function rebuild(changes: ChangeEvent[], clientRefresh: () => void, buildD
.map((file) => file.content), .map((file) => file.content),
) )
let emittedFiles = 0 const emittedFiles = await Promise.all(
for (const emitter of cfg.plugins.emitters) { cfg.plugins.emitters.map(async (emitter) => {
// Try to use partialEmit if available, otherwise assume the output is static
const emitFn = emitter.partialEmit ?? emitter.emit const emitFn = emitter.partialEmit ?? emitter.emit
const emitted = await emitFn(ctx, processedFiles, staticResources, changeEvents) const emitted = emitFn(ctx, processedFiles, staticResources, changeEvents)
if (emitted === null) { if (emitted === null) {
continue return 0
} }
if (Symbol.asyncIterator in emitted) { if (Symbol.asyncIterator in emitted) {
let emittedFiles = 0
// Async generator case // Async generator case
for await (const file of emitted) { for await (const file of emitted) {
emittedFiles++ emittedFiles++
@ -278,18 +277,19 @@ async function rebuild(changes: ChangeEvent[], clientRefresh: () => void, buildD
console.log(`[emit:${emitter.name}] ${file}`) console.log(`[emit:${emitter.name}] ${file}`)
} }
} }
return emittedFiles
} else { } else {
// Array case // Array case
emittedFiles += emitted.length return await Promise.all(
if (ctx.argv.verbose) { (await emitted).map((file) => {
for (const file of emitted) {
console.log(`[emit:${emitter.name}] ${file}`) console.log(`[emit:${emitter.name}] ${file}`)
}),
).then((files) => files.length)
} }
} }),
} )
} const sumFiles = emittedFiles.reduce((a, b) => a + b)
console.log(`Emitted ${sumFiles} files to \`${argv.output}\` in ${perf.timeSince("rebuild")}`)
console.log(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince("rebuild")}`)
console.log(styleText("green", `Done rebuilding in ${perf.timeSince()}`)) console.log(styleText("green", `Done rebuilding in ${perf.timeSince()}`))
changes.splice(0, numChangesInBuild) changes.splice(0, numChangesInBuild)
clientRefresh() clientRefresh()

View File

@ -13,14 +13,14 @@ export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) {
log.start(`Emitting files`) log.start(`Emitting files`)
let emittedFiles = 0
const staticResources = getStaticResourcesFromPlugins(ctx) const staticResources = getStaticResourcesFromPlugins(ctx)
await Promise.all( const emittedFiles = await Promise.all(
cfg.plugins.emitters.map(async (emitter) => { cfg.plugins.emitters.map(async (emitter) => {
try { try {
const emitted = await emitter.emit(ctx, content, staticResources) const emitted = emitter.emit(ctx, content, staticResources)
if (Symbol.asyncIterator in emitted) { if (Symbol.asyncIterator in emitted) {
// Async generator case // Async generator case
let emittedFiles = 0
for await (const file of emitted) { for await (const file of emitted) {
emittedFiles++ emittedFiles++
if (ctx.argv.verbose) { if (ctx.argv.verbose) {
@ -29,22 +29,27 @@ export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) {
log.updateText(`${emitter.name} -> ${styleText("gray", file)}`) log.updateText(`${emitter.name} -> ${styleText("gray", file)}`)
} }
} }
return emittedFiles
} else { } else {
// Array case // Array case
emittedFiles += emitted.length return (
for (const file of emitted) { await Promise.all(
(await emitted).map((file) => {
if (ctx.argv.verbose) { if (ctx.argv.verbose) {
console.log(`[emit:${emitter.name}] ${file}`) console.log(`[emit:${emitter.name}] ${file}`)
} else { } else {
log.updateText(`${emitter.name} -> ${styleText("gray", file)}`) log.updateText(`${emitter.name} -> ${styleText("gray", file)}`)
} }
} }),
)
).length
} }
} catch (err) { } catch (err) {
trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error) trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
return 0
} }
}), }),
) )
const sumFiles = emittedFiles.reduce((a, b) => a + b)
log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`) log.end(`Emitted ${sumFiles} files to \`${argv.output}\` in ${perf.timeSince()}`)
} }