improve error handling while serving
This commit is contained in:
		
							parent
							
								
									fd7c33c537
								
							
						
					
					
						commit
						ae2e3b463a
					
				
					 8 changed files with 56 additions and 28 deletions
				
			
		
							
								
								
									
										3
									
								
								content/build.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								content/build.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
---
 | 
			
		||||
title: "Building your Quartz"
 | 
			
		||||
---
 | 
			
		||||
| 
						 | 
				
			
			@ -2,7 +2,6 @@
 | 
			
		|||
draft: true
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
- typography fixes
 | 
			
		||||
- parse tags in content
 | 
			
		||||
- breadcrumbs component
 | 
			
		||||
- filetree component
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()}`)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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}` : ""),
 | 
			
		||||
  )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue