Jacky Zhao
2023-07-23 ae2e3b463a91d94caa8bdf62e5c3a3d726b8b4e4
improve error handling while serving
1 files added
7 files modified
46 ■■■■ changed files
content/build.md 3 ●●●●● patch | view | raw | blame | history
content/features/upcoming features.md 1 ●●●● patch | view | raw | blame | history
content/index.md 4 ●●● patch | view | raw | blame | history
quartz/build.ts 17 ●●●●● patch | view | raw | blame | history
quartz/log.ts 4 ●●● patch | view | raw | blame | history
quartz/processors/emit.ts 4 ●●●● patch | view | raw | blame | history
quartz/processors/parse.ts 9 ●●●● patch | view | raw | blame | history
quartz/trace.ts 4 ●●● patch | view | raw | blame | history
content/build.md
New file
@@ -0,0 +1,3 @@
---
title: "Building your Quartz"
---
content/features/upcoming features.md
@@ -2,7 +2,6 @@
draft: true
---
- typography fixes
- parse tags in content
- breadcrumbs component
- filetree component
content/index.md
@@ -16,10 +16,12 @@
npx quartz create
```
This will guide you through initializing your Quartz with content and previewing it locally.
This will guide you through initializing your Quartz with content.
When you're ready, you can edit `quartz.config.ts` to customize and configure Quartz more. Read the [[configuration]] page for more information on what each field in the configuration does.
Then, when you're ready, see how to [[build]] and [[hosting|host]] Quartz.
## ðŸ”§ Features
- [[full-text search|Full-text search]], [[graph view]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box
quartz/build.ts
@@ -23,7 +23,7 @@
  port: number
}
export default async function buildQuartz(argv: Argv, version: string) {
async function buildQuartz(argv: Argv, version: string) {
  console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
  const perf = new PerfTimer()
  const output = argv.output
@@ -82,6 +82,8 @@
      if (!ignored(fp)) {
        console.log(chalk.yellow(`Detected change in ${fp}, rebuilding...`))
        const fullPath = `${argv.directory}${path.sep}${fp}` as FilePath
        try {
        if (action === "add" || action === "change") {
          const [parsedContent] = await parseMarkdown(
            cfg.plugins.transformers,
@@ -99,6 +101,10 @@
        const filteredContent = filterContent(cfg.plugins.filters, parsedFiles, argv.verbose)
        await emitContent(argv.directory, output, cfg, filteredContent, argv.serve, argv.verbose)
        console.log(chalk.green(`Done rebuilding in ${perf.timeSince("rebuild")}`))
        } catch {
          console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`))
        }
        connections.forEach((conn) => conn.send("rebuild"))
      }
    }
@@ -133,3 +139,12 @@
    console.log("hint: exit with ctrl+c")
  }
}
export default async (argv: Argv, version: string) => {
  try {
    await buildQuartz(argv, version)
  } catch {
    console.log(chalk.red("\nExiting Quartz due to a fatal error"))
    process.exit(1)
  }
}
quartz/log.ts
@@ -17,10 +17,12 @@
    }
  }
  success(text: string) {
  end(text?: string) {
    if (!this.verbose) {
      this.spinner!.stop(true)
    }
    if (text) {
    console.log(text)
  }
}
}
quartz/processors/emit.ts
@@ -143,7 +143,7 @@
      }
    } catch (err) {
      trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
      process.exit(1)
      throw err
    }
  }
@@ -173,5 +173,5 @@
    }
  }
  log.success(`Emitted ${emittedFiles} files to \`${output}\` in ${perf.timeSince()}`)
  log.end(`Emitted ${emittedFiles} files to \`${output}\` in ${perf.timeSince()}`)
}
quartz/processors/parse.ts
@@ -107,7 +107,7 @@
        }
      } catch (err) {
        trace(`\nFailed to process \`${fp}\``, err as Error)
        process.exit(1)
        throw err
      }
    }
@@ -135,9 +135,14 @@
  let res: ProcessedContent[] = []
  log.start(`Parsing input files using ${concurrency} threads`)
  if (concurrency === 1) {
    try {
    const processor = createProcessor(transformers)
    const parse = createFileParser(transformers, baseDir, fps, allSlugs, verbose)
    res = await parse(processor)
    } catch (error) {
      log.end()
      throw error
    }
  } else {
    await transpileWorkerScript()
    const pool = workerpool.pool("./quartz/bootstrap-worker.mjs", {
@@ -156,6 +161,6 @@
    await pool.terminate()
  }
  log.success(`Parsed ${res.length} Markdown files in ${perf.timeSince()}`)
  log.end(`Parsed ${res.length} Markdown files in ${perf.timeSince()}`)
  return res
}
quartz/trace.ts
@@ -5,7 +5,9 @@
  const stack = err.stack
  console.log()
  console.log(
    chalk.bgRed.white.bold(" ERROR ") +
    "\n" +
      chalk.bgRed.black.bold(" ERROR ") +
      "\n" +
      chalk.red(` ${msg}`) +
      (err.message.length > 0 ? `: ${err.message}` : ""),
  )