improve error handling while serving

This commit is contained in:
Jacky Zhao 2023-07-23 11:49:26 -07:00
parent 36c479231d
commit cc8903ca87
8 changed files with 56 additions and 28 deletions

3
content/build.md Normal file
View File

@ -0,0 +1,3 @@
---
title: "Building your Quartz"
---

View File

@ -2,7 +2,6 @@
draft: true draft: true
--- ---
- typography fixes
- parse tags in content - parse tags in content
- breadcrumbs component - breadcrumbs component
- filetree component - filetree component

View File

@ -16,10 +16,12 @@ npm i
npx quartz create 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. 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 ## 🔧 Features
- [[full-text search|Full-text search]], [[graph view]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box - [[full-text search|Full-text search]], [[graph view]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and many more right out of the box

View File

@ -23,7 +23,7 @@ interface Argv {
port: number 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`)) console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
const perf = new PerfTimer() const perf = new PerfTimer()
const output = argv.output const output = argv.output
@ -82,23 +82,29 @@ export default async function buildQuartz(argv: Argv, version: string) {
if (!ignored(fp)) { if (!ignored(fp)) {
console.log(chalk.yellow(`Detected change in ${fp}, rebuilding...`)) console.log(chalk.yellow(`Detected change in ${fp}, rebuilding...`))
const fullPath = `${argv.directory}${path.sep}${fp}` as FilePath const fullPath = `${argv.directory}${path.sep}${fp}` as FilePath
if (action === "add" || action === "change") {
const [parsedContent] = await parseMarkdown( try {
cfg.plugins.transformers, if (action === "add" || action === "change") {
argv.directory, const [parsedContent] = await parseMarkdown(
[fullPath], cfg.plugins.transformers,
argv.verbose, argv.directory,
) [fullPath],
contentMap.set(fullPath, parsedContent) argv.verbose,
} else if (action === "unlink") { )
contentMap.delete(fullPath) contentMap.set(fullPath, parsedContent)
} else if (action === "unlink") {
contentMap.delete(fullPath)
}
await rimraf(output)
const parsedFiles = [...contentMap.values()]
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...`))
} }
await rimraf(output)
const parsedFiles = [...contentMap.values()]
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")}`))
connections.forEach((conn) => conn.send("rebuild")) connections.forEach((conn) => conn.send("rebuild"))
} }
} }
@ -133,3 +139,12 @@ export default async function buildQuartz(argv: Argv, version: string) {
console.log("hint: exit with ctrl+c") 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)
}
}

View File

@ -17,10 +17,12 @@ export class QuartzLogger {
} }
} }
success(text: string) { end(text?: string) {
if (!this.verbose) { if (!this.verbose) {
this.spinner!.stop(true) this.spinner!.stop(true)
} }
console.log(text) if (text) {
console.log(text)
}
} }
} }

View File

@ -143,7 +143,7 @@ export async function emitContent(
} }
} catch (err) { } catch (err) {
trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error) trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error)
process.exit(1) throw err
} }
} }
@ -173,5 +173,5 @@ export async function emitContent(
} }
} }
log.success(`Emitted ${emittedFiles} files to \`${output}\` in ${perf.timeSince()}`) log.end(`Emitted ${emittedFiles} files to \`${output}\` in ${perf.timeSince()}`)
} }

View File

@ -107,7 +107,7 @@ export function createFileParser(
} }
} catch (err) { } catch (err) {
trace(`\nFailed to process \`${fp}\``, err as Error) trace(`\nFailed to process \`${fp}\``, err as Error)
process.exit(1) throw err
} }
} }
@ -135,9 +135,14 @@ export async function parseMarkdown(
let res: ProcessedContent[] = [] let res: ProcessedContent[] = []
log.start(`Parsing input files using ${concurrency} threads`) log.start(`Parsing input files using ${concurrency} threads`)
if (concurrency === 1) { if (concurrency === 1) {
const processor = createProcessor(transformers) try {
const parse = createFileParser(transformers, baseDir, fps, allSlugs, verbose) const processor = createProcessor(transformers)
res = await parse(processor) const parse = createFileParser(transformers, baseDir, fps, allSlugs, verbose)
res = await parse(processor)
} catch (error) {
log.end()
throw error
}
} else { } else {
await transpileWorkerScript() await transpileWorkerScript()
const pool = workerpool.pool("./quartz/bootstrap-worker.mjs", { const pool = workerpool.pool("./quartz/bootstrap-worker.mjs", {
@ -156,6 +161,6 @@ export async function parseMarkdown(
await pool.terminate() 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 return res
} }

View File

@ -5,7 +5,9 @@ export function trace(msg: string, err: Error) {
const stack = err.stack const stack = err.stack
console.log() console.log()
console.log( console.log(
chalk.bgRed.white.bold(" ERROR ") + "\n" +
chalk.bgRed.black.bold(" ERROR ") +
"\n" +
chalk.red(` ${msg}`) + chalk.red(` ${msg}`) +
(err.message.length > 0 ? `: ${err.message}` : ""), (err.message.length > 0 ? `: ${err.message}` : ""),
) )