cleanup: Move rebuild function outside startServing function (#715)
				
					
				
			* Move rebuild function outside `startServing` * Move toRebuild and toRemove inside rebuild func * Revert "Move toRebuild and toRemove inside rebuild func" This reverts commit 8c4dbb13c7a670ff8af806e8bfd1ca1aa216073b. * Rename func to rebuildFromEntrypoint
This commit is contained in:
		@@ -3,13 +3,13 @@ sourceMapSupport.install(options)
 | 
			
		||||
import path from "path"
 | 
			
		||||
import { PerfTimer } from "./util/perf"
 | 
			
		||||
import { rimraf } from "rimraf"
 | 
			
		||||
import { isGitIgnored } from "globby"
 | 
			
		||||
import { GlobbyFilterFunction, isGitIgnored } from "globby"
 | 
			
		||||
import chalk from "chalk"
 | 
			
		||||
import { parseMarkdown } from "./processors/parse"
 | 
			
		||||
import { filterContent } from "./processors/filter"
 | 
			
		||||
import { emitContent } from "./processors/emit"
 | 
			
		||||
import cfg from "../quartz.config"
 | 
			
		||||
import { FilePath, joinSegments, slugifyFilePath } from "./util/path"
 | 
			
		||||
import { FilePath, FullSlug, joinSegments, slugifyFilePath } from "./util/path"
 | 
			
		||||
import chokidar from "chokidar"
 | 
			
		||||
import { ProcessedContent } from "./plugins/vfile"
 | 
			
		||||
import { Argv, BuildCtx } from "./util/ctx"
 | 
			
		||||
@@ -18,6 +18,19 @@ import { trace } from "./util/trace"
 | 
			
		||||
import { options } from "./util/sourcemap"
 | 
			
		||||
import { Mutex } from "async-mutex"
 | 
			
		||||
 | 
			
		||||
type BuildData = {
 | 
			
		||||
  ctx: BuildCtx
 | 
			
		||||
  ignored: GlobbyFilterFunction
 | 
			
		||||
  mut: Mutex
 | 
			
		||||
  initialSlugs: FullSlug[]
 | 
			
		||||
  // TODO merge contentMap and trackedAssets
 | 
			
		||||
  contentMap: Map<FilePath, ProcessedContent>
 | 
			
		||||
  trackedAssets: Set<FilePath>
 | 
			
		||||
  toRebuild: Set<FilePath>
 | 
			
		||||
  toRemove: Set<FilePath>
 | 
			
		||||
  lastBuildMs: number
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) {
 | 
			
		||||
  const ctx: BuildCtx = {
 | 
			
		||||
    argv,
 | 
			
		||||
@@ -73,19 +86,60 @@ async function startServing(
 | 
			
		||||
) {
 | 
			
		||||
  const { argv } = ctx
 | 
			
		||||
 | 
			
		||||
  const ignored = await isGitIgnored()
 | 
			
		||||
  const contentMap = new Map<FilePath, ProcessedContent>()
 | 
			
		||||
  for (const content of initialContent) {
 | 
			
		||||
    const [_tree, vfile] = content
 | 
			
		||||
    contentMap.set(vfile.data.filePath!, content)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const initialSlugs = ctx.allSlugs
 | 
			
		||||
  let lastBuildMs = 0
 | 
			
		||||
  const toRebuild: Set<FilePath> = new Set()
 | 
			
		||||
  const toRemove: Set<FilePath> = new Set()
 | 
			
		||||
  const trackedAssets: Set<FilePath> = new Set()
 | 
			
		||||
  async function rebuild(fp: string, action: "add" | "change" | "delete") {
 | 
			
		||||
  const buildData: BuildData = {
 | 
			
		||||
    ctx,
 | 
			
		||||
    mut,
 | 
			
		||||
    contentMap,
 | 
			
		||||
    ignored: await isGitIgnored(),
 | 
			
		||||
    initialSlugs: ctx.allSlugs,
 | 
			
		||||
    toRebuild: new Set<FilePath>(),
 | 
			
		||||
    toRemove: new Set<FilePath>(),
 | 
			
		||||
    trackedAssets: new Set<FilePath>(),
 | 
			
		||||
    lastBuildMs: 0,
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const watcher = chokidar.watch(".", {
 | 
			
		||||
    persistent: true,
 | 
			
		||||
    cwd: argv.directory,
 | 
			
		||||
    ignoreInitial: true,
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  watcher
 | 
			
		||||
    .on("add", (fp) => rebuildFromEntrypoint(fp, "add", clientRefresh, buildData))
 | 
			
		||||
    .on("change", (fp) => rebuildFromEntrypoint(fp, "change", clientRefresh, buildData))
 | 
			
		||||
    .on("unlink", (fp) => rebuildFromEntrypoint(fp, "delete", clientRefresh, buildData))
 | 
			
		||||
 | 
			
		||||
  return async () => {
 | 
			
		||||
    await watcher.close()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function rebuildFromEntrypoint(
 | 
			
		||||
  fp: string,
 | 
			
		||||
  action: "add" | "change" | "delete",
 | 
			
		||||
  clientRefresh: () => void,
 | 
			
		||||
  buildData: BuildData, // note: this function mutates buildData
 | 
			
		||||
) {
 | 
			
		||||
  const {
 | 
			
		||||
    ctx,
 | 
			
		||||
    ignored,
 | 
			
		||||
    mut,
 | 
			
		||||
    initialSlugs,
 | 
			
		||||
    contentMap,
 | 
			
		||||
    toRebuild,
 | 
			
		||||
    toRemove,
 | 
			
		||||
    trackedAssets,
 | 
			
		||||
    lastBuildMs,
 | 
			
		||||
  } = buildData
 | 
			
		||||
 | 
			
		||||
  const { argv } = ctx
 | 
			
		||||
 | 
			
		||||
  // don't do anything for gitignored files
 | 
			
		||||
  if (ignored(fp)) {
 | 
			
		||||
    return
 | 
			
		||||
@@ -113,7 +167,7 @@ async function startServing(
 | 
			
		||||
  // debounce rebuilds every 250ms
 | 
			
		||||
 | 
			
		||||
  const buildStart = new Date().getTime()
 | 
			
		||||
    lastBuildMs = buildStart
 | 
			
		||||
  buildData.lastBuildMs = buildStart
 | 
			
		||||
  const release = await mut.acquire()
 | 
			
		||||
  if (lastBuildMs > buildStart) {
 | 
			
		||||
    release()
 | 
			
		||||
@@ -159,22 +213,6 @@ async function startServing(
 | 
			
		||||
  clientRefresh()
 | 
			
		||||
  toRebuild.clear()
 | 
			
		||||
  toRemove.clear()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const watcher = chokidar.watch(".", {
 | 
			
		||||
    persistent: true,
 | 
			
		||||
    cwd: argv.directory,
 | 
			
		||||
    ignoreInitial: true,
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  watcher
 | 
			
		||||
    .on("add", (fp) => rebuild(fp, "add"))
 | 
			
		||||
    .on("change", (fp) => rebuild(fp, "change"))
 | 
			
		||||
    .on("unlink", (fp) => rebuild(fp, "delete"))
 | 
			
		||||
 | 
			
		||||
  return async () => {
 | 
			
		||||
    await watcher.close()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user