* checkpoint * incremental all the things * properly splice changes array * smol doc update * update docs * make fancy logger dumb in ci
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { PerfTimer } from "../util/perf"
 | 
						|
import { getStaticResourcesFromPlugins } from "../plugins"
 | 
						|
import { ProcessedContent } from "../plugins/vfile"
 | 
						|
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
 | 
						|
  const perf = new PerfTimer()
 | 
						|
  const log = new QuartzLogger(ctx.argv.verbose)
 | 
						|
 | 
						|
  log.start(`Emitting files`)
 | 
						|
 | 
						|
  let emittedFiles = 0
 | 
						|
  const staticResources = getStaticResourcesFromPlugins(ctx)
 | 
						|
  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(`${emitter.name} -> ${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(`${emitter.name} -> ${chalk.gray(file)}`)
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      } catch (err) {
 | 
						|
        trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
 | 
						|
      }
 | 
						|
    }),
 | 
						|
  )
 | 
						|
 | 
						|
  log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`)
 | 
						|
}
 |