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),
)
let emittedFiles = 0
for (const emitter of cfg.plugins.emitters) {
// Try to use partialEmit if available, otherwise assume the output is static
const emittedFiles = await Promise.all(
cfg.plugins.emitters.map(async (emitter) => {
const emitFn = emitter.partialEmit ?? emitter.emit
const emitted = await emitFn(ctx, processedFiles, staticResources, changeEvents)
const emitted = emitFn(ctx, processedFiles, staticResources, changeEvents)
if (emitted === null) {
continue
return 0
}
if (Symbol.asyncIterator in emitted) {
let emittedFiles = 0
// Async generator case
for await (const file of emitted) {
emittedFiles++
@ -278,18 +277,19 @@ async function rebuild(changes: ChangeEvent[], clientRefresh: () => void, buildD
console.log(`[emit:${emitter.name}] ${file}`)
}
}
return emittedFiles
} else {
// Array case
emittedFiles += emitted.length
if (ctx.argv.verbose) {
for (const file of emitted) {
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()

View File

@ -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) {
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()}`)
}