fix: unmemoize explorer on rebuild (closes #1077)
This commit is contained in:
		@@ -38,8 +38,13 @@ type BuildData = {
 | 
			
		||||
 | 
			
		||||
type FileEvent = "add" | "change" | "delete"
 | 
			
		||||
 | 
			
		||||
function newBuildId() {
 | 
			
		||||
  return new Date().toISOString()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) {
 | 
			
		||||
  const ctx: BuildCtx = {
 | 
			
		||||
    buildId: newBuildId(),
 | 
			
		||||
    argv,
 | 
			
		||||
    cfg,
 | 
			
		||||
    allSlugs: [],
 | 
			
		||||
@@ -167,6 +172,7 @@ async function partialRebuildFromEntrypoint(
 | 
			
		||||
 | 
			
		||||
  const perf = new PerfTimer()
 | 
			
		||||
  console.log(chalk.yellow("Detected change, rebuilding..."))
 | 
			
		||||
  ctx.buildId = newBuildId()
 | 
			
		||||
 | 
			
		||||
  // UPDATE DEP GRAPH
 | 
			
		||||
  const fp = joinSegments(argv.directory, toPosixPath(filepath)) as FilePath
 | 
			
		||||
@@ -363,14 +369,10 @@ async function rebuildFromEntrypoint(
 | 
			
		||||
 | 
			
		||||
  const perf = new PerfTimer()
 | 
			
		||||
  console.log(chalk.yellow("Detected change, rebuilding..."))
 | 
			
		||||
  ctx.buildId = newBuildId()
 | 
			
		||||
 | 
			
		||||
  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 +386,13 @@ async function rebuildFromEntrypoint(
 | 
			
		||||
    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 })
 | 
			
		||||
 
 | 
			
		||||
@@ -44,12 +44,9 @@ export default ((userOpts?: Partial<Options>) => {
 | 
			
		||||
  // memoized
 | 
			
		||||
  let fileTree: FileNode
 | 
			
		||||
  let jsonTree: string
 | 
			
		||||
  let lastBuildId: string = ""
 | 
			
		||||
 | 
			
		||||
  function constructFileTree(allFiles: QuartzPluginData[]) {
 | 
			
		||||
    if (fileTree) {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Construct tree from allFiles
 | 
			
		||||
    fileTree = new FileNode("")
 | 
			
		||||
    allFiles.forEach((file) => fileTree.add(file))
 | 
			
		||||
@@ -76,12 +73,17 @@ export default ((userOpts?: Partial<Options>) => {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const Explorer: QuartzComponent = ({
 | 
			
		||||
    ctx,
 | 
			
		||||
    cfg,
 | 
			
		||||
    allFiles,
 | 
			
		||||
    displayClass,
 | 
			
		||||
    fileData,
 | 
			
		||||
  }: QuartzComponentProps) => {
 | 
			
		||||
    constructFileTree(allFiles)
 | 
			
		||||
    if (ctx.buildId !== lastBuildId) {
 | 
			
		||||
      lastBuildId = ctx.buildId
 | 
			
		||||
      constructFileTree(allFiles)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div class={classNames(displayClass, "explorer")}>
 | 
			
		||||
        <button
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ export interface Argv {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface BuildCtx {
 | 
			
		||||
  buildId: string
 | 
			
		||||
  argv: Argv
 | 
			
		||||
  cfg: QuartzConfig
 | 
			
		||||
  allSlugs: FullSlug[]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user