From 34dbddbd61c64379a9af7c2f031723861b109e6a Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Sat, 19 Aug 2023 18:04:17 -0700 Subject: [PATCH] impl baseDir option for quartz build --serve for local testing --- package-lock.json | 4 ++-- quartz/bootstrap-cli.mjs | 30 +++++++++++++++++++++++--- quartz/plugins/emitters/folderPage.tsx | 9 +++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4245d618..7c6c23b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jackyzha0/quartz", - "version": "4.0.7", + "version": "4.0.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jackyzha0/quartz", - "version": "4.0.7", + "version": "4.0.8", "license": "MIT", "dependencies": { "@clack/prompts": "^0.6.3", diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs index 643733f9..2c829558 100755 --- a/quartz/bootstrap-cli.mjs +++ b/quartz/bootstrap-cli.mjs @@ -76,6 +76,7 @@ const BuildArgv = { }, baseDir: { string: true, + default: "", describe: "base path to serve your local server on", }, port: { @@ -424,8 +425,26 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. wss.on("connection", (ws) => connections.push(ws)) const clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) + if (argv.baseDir !== "" && !argv.baseDir.startsWith("/")) { + argv.baseDir = "/" + argv.baseDir + } + await build(clientRefresh) const server = http.createServer(async (req, res) => { + if (argv.baseDir && !req.url?.startsWith(argv.baseDir)) { + console.log( + chalk.red( + `[404] ${req.url} (warning: link outside of site, this is likely a Quartz bug)`, + ), + ) + res.writeHead(404) + res.end() + return + } + + // strip baseDir prefix + req.url = req.url?.slice(argv.baseDir.length) + const serve = async () => { await serveHandler(req, res, { public: argv.output, @@ -434,14 +453,15 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. const status = res.statusCode const statusString = status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`) - console.log(statusString + chalk.grey(` ${req.url}`)) + console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`)) } const redirect = (newFp) => { + newFp = argv.baseDir + newFp res.writeHead(302, { Location: newFp, }) - console.log(chalk.yellow("[302]") + chalk.grey(` ${req.url} -> ${newFp}`)) + console.log(chalk.yellow("[302]") + chalk.grey(` ${argv.baseDir}${req.url} -> ${newFp}`)) res.end() } @@ -487,7 +507,11 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started. return serve() }) server.listen(argv.port) - console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`)) + console.log( + chalk.cyan( + `Started a Quartz server listening at http://localhost:${argv.port}${argv.baseDir}`, + ), + ) console.log("hint: exit with ctrl+c") chokidar .watch(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"], { diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx index 11b0ace2..8d62f7bb 100644 --- a/quartz/plugins/emitters/folderPage.tsx +++ b/quartz/plugins/emitters/folderPage.tsx @@ -6,7 +6,14 @@ import { pageResources, renderPage } from "../../components/renderPage" import { ProcessedContent, defaultProcessedContent } from "../vfile" import { FullPageLayout } from "../../cfg" import path from "path" -import { FilePath, FullSlug, SimpleSlug, _stripSlashes, joinSegments, simplifySlug } from "../../util/path" +import { + FilePath, + FullSlug, + SimpleSlug, + _stripSlashes, + joinSegments, + simplifySlug, +} from "../../util/path" import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" import { FolderContent } from "../../components"