| | |
| | | import { options } from "./util/sourcemap" |
| | | import { Mutex } from "async-mutex" |
| | | |
| | | async function buildQuartz(argv: Argv, clientRefresh: () => void) { |
| | | async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) { |
| | | const ctx: BuildCtx = { |
| | | argv, |
| | | cfg, |
| | |
| | | console.log(` Emitters: ${pluginNames("emitters").join(", ")}`) |
| | | } |
| | | |
| | | const release = await mut.acquire() |
| | | perf.addEvent("clean") |
| | | await rimraf(output) |
| | | console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) |
| | |
| | | const filteredContent = filterContent(ctx, parsedFiles) |
| | | await emitContent(ctx, filteredContent) |
| | | console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)) |
| | | release() |
| | | |
| | | if (argv.serve) { |
| | | return startServing(ctx, parsedFiles, clientRefresh) |
| | | return startServing(ctx, mut, parsedFiles, clientRefresh) |
| | | } |
| | | } |
| | | |
| | | // setup watcher for rebuilds |
| | | async function startServing( |
| | | ctx: BuildCtx, |
| | | mut: Mutex, |
| | | initialContent: ProcessedContent[], |
| | | clientRefresh: () => void, |
| | | ) { |
| | |
| | | } |
| | | |
| | | const initialSlugs = ctx.allSlugs |
| | | const buildMutex = new Mutex() |
| | | const timeoutIds: Set<ReturnType<typeof setTimeout>> = new Set() |
| | | const toRebuild: Set<FilePath> = new Set() |
| | | const toRemove: Set<FilePath> = new Set() |
| | |
| | | // debounce rebuilds every 250ms |
| | | timeoutIds.add( |
| | | setTimeout(async () => { |
| | | const release = await buildMutex.acquire() |
| | | const release = await mut.acquire() |
| | | timeoutIds.forEach((id) => clearTimeout(id)) |
| | | timeoutIds.clear() |
| | | |
| | |
| | | .on("add", (fp) => rebuild(fp, "add")) |
| | | .on("change", (fp) => rebuild(fp, "change")) |
| | | .on("unlink", (fp) => rebuild(fp, "delete")) |
| | | |
| | | return async () => { |
| | | timeoutIds.forEach((id) => clearTimeout(id)) |
| | | await watcher.close() |
| | | } |
| | | } |
| | | |
| | | export default async (argv: Argv, clientRefresh: () => void) => { |
| | | export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => { |
| | | try { |
| | | return await buildQuartz(argv, clientRefresh) |
| | | return await buildQuartz(argv, mut, clientRefresh) |
| | | } catch (err) { |
| | | trace("\nExiting Quartz due to a fatal error", err as Error) |
| | | } |