dependabot[bot]
2024-12-17 367bb0e6ce89219ea94980a7ff127aa474c54b1d
quartz/build.ts
@@ -38,8 +38,13 @@
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(),
    argv,
    cfg,
    allSlugs: [],
@@ -134,9 +139,9 @@
  const buildFromEntry = argv.fastRebuild ? partialRebuildFromEntrypoint : rebuildFromEntrypoint
  watcher
    .on("add", (fp) => buildFromEntry(fp, "add", clientRefresh, buildData))
    .on("change", (fp) => buildFromEntry(fp, "change", clientRefresh, buildData))
    .on("unlink", (fp) => buildFromEntry(fp, "delete", clientRefresh, buildData))
    .on("add", (fp) => buildFromEntry(fp as string, "add", clientRefresh, buildData))
    .on("change", (fp) => buildFromEntry(fp as string, "change", clientRefresh, buildData))
    .on("unlink", (fp) => buildFromEntry(fp as string, "delete", clientRefresh, buildData))
  return async () => {
    await watcher.close()
@@ -157,10 +162,13 @@
    return
  }
  const buildStart = new Date().getTime()
  buildData.lastBuildMs = buildStart
  const buildId = newBuildId()
  ctx.buildId = buildId
  buildData.lastBuildMs = new Date().getTime()
  const release = await mut.acquire()
  if (buildData.lastBuildMs > buildStart) {
  // if there's another build after us, release and let them do it
  if (ctx.buildId !== buildId) {
    release()
    return
  }
@@ -351,26 +359,22 @@
    toRemove.add(filePath)
  }
  const buildStart = new Date().getTime()
  buildData.lastBuildMs = buildStart
  const buildId = newBuildId()
  ctx.buildId = buildId
  buildData.lastBuildMs = new Date().getTime()
  const release = await mut.acquire()
  // there's another build after us, release and let them do it
  if (buildData.lastBuildMs > buildStart) {
  if (ctx.buildId !== buildId) {
    release()
    return
  }
  const perf = new PerfTimer()
  console.log(chalk.yellow("Detected change, rebuilding..."))
  try {
    const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp))
    const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])]
      .filter((fp) => !toRemove.has(fp))
      .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath))
    ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])]
    const parsedContent = await parseMarkdown(ctx, filesToRebuild)
    for (const content of parsedContent) {
      const [_tree, vfile] = content
@@ -384,6 +388,13 @@
    const parsedFiles = [...contentMap.values()]
    const filteredContent = filterContent(ctx, parsedFiles)
    // re-update slugs
    const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])]
      .filter((fp) => !toRemove.has(fp))
      .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath))
    ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])]
    // TODO: we can probably traverse the link graph to figure out what's safe to delete here
    // instead of just deleting everything
    await rimraf(path.join(argv.output, ".*"), { glob: true })
@@ -396,10 +407,10 @@
    }
  }
  release()
  clientRefresh()
  toRebuild.clear()
  toRemove.clear()
  release()
}
export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => {