improve error handling while serving
This commit is contained in:
		
							
								
								
									
										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
 | 
					draft: true
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- typography fixes
 | 
					 | 
				
			||||||
- parse tags in content
 | 
					- parse tags in content
 | 
				
			||||||
- breadcrumbs component
 | 
					- breadcrumbs component
 | 
				
			||||||
- filetree component
 | 
					- filetree component
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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()}`)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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}` : ""),
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user