From ae2e3b463a91d94caa8bdf62e5c3a3d726b8b4e4 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sun, 23 Jul 2023 11:49:26 -0700 Subject: [PATCH] improve error handling while serving --- content/build.md | 3 ++ content/features/upcoming features.md | 1 - content/index.md | 4 ++- quartz/build.ts | 47 ++++++++++++++++++--------- quartz/log.ts | 6 ++-- quartz/processors/emit.ts | 4 +-- quartz/processors/parse.ts | 15 ++++++--- quartz/trace.ts | 4 ++- 8 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 content/build.md diff --git a/content/build.md b/content/build.md new file mode 100644 index 0000000..2857057 --- /dev/null +++ b/content/build.md @@ -0,0 +1,3 @@ +--- +title: "Building your Quartz" +--- diff --git a/content/features/upcoming features.md b/content/features/upcoming features.md index 6d39bb7..5cb7b97 100644 --- a/content/features/upcoming features.md +++ b/content/features/upcoming features.md @@ -2,7 +2,6 @@ draft: true --- -- typography fixes - parse tags in content - breadcrumbs component - filetree component diff --git a/content/index.md b/content/index.md index 8e012fa..5c32c23 100644 --- a/content/index.md +++ b/content/index.md @@ -16,10 +16,12 @@ npm i 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 diff --git a/quartz/build.ts b/quartz/build.ts index df83f6e..e5bfcaa 100644 --- a/quartz/build.ts +++ b/quartz/build.ts @@ -23,7 +23,7 @@ interface Argv { 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,23 +82,29 @@ export default async function buildQuartz(argv: Argv, version: string) { if (!ignored(fp)) { console.log(chalk.yellow(`Detected change in ${fp}, rebuilding...`)) const fullPath = `${argv.directory}${path.sep}${fp}` as FilePath - if (action === "add" || action === "change") { - const [parsedContent] = await parseMarkdown( - cfg.plugins.transformers, - argv.directory, - [fullPath], - argv.verbose, - ) - contentMap.set(fullPath, parsedContent) - } else if (action === "unlink") { - contentMap.delete(fullPath) + + try { + if (action === "add" || action === "change") { + const [parsedContent] = await parseMarkdown( + cfg.plugins.transformers, + argv.directory, + [fullPath], + argv.verbose, + ) + 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")) } } @@ -133,3 +139,12 @@ export default async function buildQuartz(argv: Argv, version: string) { 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) + } +} diff --git a/quartz/log.ts b/quartz/log.ts index 73e5d7e..773945c 100644 --- a/quartz/log.ts +++ b/quartz/log.ts @@ -17,10 +17,12 @@ export class QuartzLogger { } } - success(text: string) { + end(text?: string) { if (!this.verbose) { this.spinner!.stop(true) } - console.log(text) + if (text) { + console.log(text) + } } } diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts index d056732..6ff9a21 100644 --- a/quartz/processors/emit.ts +++ b/quartz/processors/emit.ts @@ -143,7 +143,7 @@ export async function emitContent( } } catch (err) { 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()}`) } diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts index a068899..55783dc 100644 --- a/quartz/processors/parse.ts +++ b/quartz/processors/parse.ts @@ -107,7 +107,7 @@ export function createFileParser( } } catch (err) { trace(`\nFailed to process \`${fp}\``, err as Error) - process.exit(1) + throw err } } @@ -135,9 +135,14 @@ export async function parseMarkdown( let res: ProcessedContent[] = [] log.start(`Parsing input files using ${concurrency} threads`) if (concurrency === 1) { - const processor = createProcessor(transformers) - const parse = createFileParser(transformers, baseDir, fps, allSlugs, verbose) - res = await parse(processor) + 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 @@ export async function parseMarkdown( 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 } diff --git a/quartz/trace.ts b/quartz/trace.ts index d9d45d2..803fd2f 100644 --- a/quartz/trace.ts +++ b/quartz/trace.ts @@ -5,7 +5,9 @@ export function trace(msg: string, err: Error) { 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}` : ""), )