Jacky Zhao
2025-03-13 d9159e0ac9bfc22e584c78bc8aa04ecd82c14eea
quartz/build.ts
@@ -19,6 +19,7 @@
import { Mutex } from "async-mutex"
import DepGraph from "./depgraph"
import { getStaticResourcesFromPlugins } from "./plugins"
import { randomIdNonSecure } from "./util/random"
type Dependencies = Record<string, DepGraph<FilePath> | null>
@@ -38,13 +39,9 @@
type FileEvent = "add" | "change" | "delete"
function newBuildId() {
  return Math.random().toString(36).substring(2, 8)
}
async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) {
  const ctx: BuildCtx = {
    buildId: newBuildId(),
    buildId: randomIdNonSecure(),
    argv,
    cfg,
    allSlugs: [],
@@ -162,7 +159,7 @@
    return
  }
  const buildId = newBuildId()
  const buildId = randomIdNonSecure()
  ctx.buildId = buildId
  buildData.lastBuildMs = new Date().getTime()
  const release = await mut.acquire()
@@ -253,15 +250,25 @@
        ([_node, vfile]) => !toRemove.has(vfile.data.filePath!),
      )
      const emittedFps = await emitter.emit(ctx, files, staticResources)
      if (ctx.argv.verbose) {
        for (const file of emittedFps) {
          console.log(`[emit:${emitter.name}] ${file}`)
      const emitted = await emitter.emit(ctx, files, 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 {
        // Array case
        emittedFiles += emitted.length
        if (ctx.argv.verbose) {
          for (const file of emitted) {
            console.log(`[emit:${emitter.name}] ${file}`)
          }
        }
      }
      emittedFiles += emittedFps.length
      continue
    }
@@ -283,15 +290,24 @@
        .filter((file) => !toRemove.has(file))
        .map((file) => contentMap.get(file)!)
      const emittedFps = await emitter.emit(ctx, upstreamContent, staticResources)
      if (ctx.argv.verbose) {
        for (const file of emittedFps) {
          console.log(`[emit:${emitter.name}] ${file}`)
      const emitted = await emitter.emit(ctx, upstreamContent, 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 {
        // Array case
        emittedFiles += emitted.length
        if (ctx.argv.verbose) {
          for (const file of emitted) {
            console.log(`[emit:${emitter.name}] ${file}`)
          }
        }
      }
      emittedFiles += emittedFps.length
    }
  }
@@ -359,7 +375,7 @@
    toRemove.add(filePath)
  }
  const buildId = newBuildId()
  const buildId = randomIdNonSecure()
  ctx.buildId = buildId
  buildData.lastBuildMs = new Date().getTime()
  const release = await mut.acquire()