mirror of
https://github.com/alrayyes/wiki.git
synced 2025-05-05 08:12:22 +00:00
refactor static and asset emission to be actual emitter plugins
This commit is contained in:
parent
000eb4c3c0
commit
9e83af04a7
18 changed files with 197 additions and 173 deletions
quartz
156
quartz/build.ts
156
quartz/build.ts
|
@ -14,16 +14,14 @@ import { FilePath } from "./path"
|
|||
import chokidar from "chokidar"
|
||||
import { ProcessedContent } from "./plugins/vfile"
|
||||
import WebSocket, { WebSocketServer } from "ws"
|
||||
|
||||
interface Argv {
|
||||
directory: string
|
||||
verbose: boolean
|
||||
output: string
|
||||
serve: boolean
|
||||
port: number
|
||||
}
|
||||
import { Argv, BuildCtx } from "./ctx"
|
||||
|
||||
async function buildQuartz(argv: Argv, version: string) {
|
||||
const ctx: BuildCtx = {
|
||||
argv,
|
||||
cfg,
|
||||
}
|
||||
|
||||
console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
|
||||
const perf = new PerfTimer()
|
||||
const output = argv.output
|
||||
|
@ -38,12 +36,10 @@ async function buildQuartz(argv: Argv, version: string) {
|
|||
console.log(` Emitters: ${pluginNames("emitters").join(", ")}`)
|
||||
}
|
||||
|
||||
// clean
|
||||
perf.addEvent("clean")
|
||||
await rimraf(output)
|
||||
console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`)
|
||||
|
||||
// glob
|
||||
perf.addEvent("glob")
|
||||
const fps = await globby("**/*.md", {
|
||||
cwd: argv.directory,
|
||||
|
@ -55,89 +51,87 @@ async function buildQuartz(argv: Argv, version: string) {
|
|||
)
|
||||
|
||||
const filePaths = fps.map((fp) => `${argv.directory}${path.sep}${fp}` as FilePath)
|
||||
const parsedFiles = await parseMarkdown(
|
||||
cfg.plugins.transformers,
|
||||
argv.directory,
|
||||
filePaths,
|
||||
argv.verbose,
|
||||
)
|
||||
const filteredContent = filterContent(cfg.plugins.filters, parsedFiles, argv.verbose)
|
||||
await emitContent(argv.directory, output, cfg, filteredContent, argv.serve, argv.verbose)
|
||||
const parsedFiles = await parseMarkdown(ctx, filePaths)
|
||||
const filteredContent = filterContent(ctx, parsedFiles)
|
||||
await emitContent(ctx, filteredContent)
|
||||
console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`))
|
||||
|
||||
if (argv.serve) {
|
||||
const wss = new WebSocketServer({ port: 3001 })
|
||||
const connections: WebSocket[] = []
|
||||
wss.on("connection", (ws) => connections.push(ws))
|
||||
await startServing(ctx, parsedFiles)
|
||||
}
|
||||
}
|
||||
|
||||
const ignored = await isGitIgnored()
|
||||
const contentMap = new Map<FilePath, ProcessedContent>()
|
||||
for (const content of parsedFiles) {
|
||||
const [_tree, vfile] = content
|
||||
contentMap.set(vfile.data.filePath!, content)
|
||||
}
|
||||
async function startServing(ctx: BuildCtx, initialContent: ProcessedContent[]) {
|
||||
const { argv } = ctx
|
||||
const wss = new WebSocketServer({ port: 3001 })
|
||||
const connections: WebSocket[] = []
|
||||
wss.on("connection", (ws) => connections.push(ws))
|
||||
|
||||
async function rebuild(fp: string, action: "add" | "change" | "unlink") {
|
||||
perf.addEvent("rebuild")
|
||||
if (!ignored(fp)) {
|
||||
console.log(chalk.yellow(`Detected change in ${fp}, rebuilding...`))
|
||||
const fullPath = `${argv.directory}${path.sep}${fp}` as FilePath
|
||||
const ignored = await isGitIgnored()
|
||||
const contentMap = new Map<FilePath, ProcessedContent>()
|
||||
for (const content of initialContent) {
|
||||
const [_tree, vfile] = content
|
||||
contentMap.set(vfile.data.filePath!, content)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
async function rebuild(fp: string, action: "add" | "change" | "unlink") {
|
||||
const perf = new PerfTimer()
|
||||
if (!ignored(fp)) {
|
||||
console.log(chalk.yellow(`Detected change in ${fp}, rebuilding...`))
|
||||
const fullPath = `${argv.directory}${path.sep}${fp}` as FilePath
|
||||
|
||||
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...`))
|
||||
try {
|
||||
if (action === "add" || action === "change") {
|
||||
const [parsedContent] = await parseMarkdown(ctx, [fullPath])
|
||||
contentMap.set(fullPath, parsedContent)
|
||||
} else if (action === "unlink") {
|
||||
contentMap.delete(fullPath)
|
||||
}
|
||||
|
||||
connections.forEach((conn) => conn.send("rebuild"))
|
||||
await rimraf(argv.output)
|
||||
const parsedFiles = [...contentMap.values()]
|
||||
const filteredContent = filterContent(ctx, parsedFiles)
|
||||
await emitContent(
|
||||
ctx,
|
||||
filteredContent,
|
||||
)
|
||||
console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`))
|
||||
} catch {
|
||||
console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`))
|
||||
}
|
||||
|
||||
connections.forEach((conn) => conn.send("rebuild"))
|
||||
}
|
||||
|
||||
const watcher = chokidar.watch(".", {
|
||||
persistent: true,
|
||||
cwd: argv.directory,
|
||||
ignoreInitial: true,
|
||||
})
|
||||
|
||||
watcher
|
||||
.on("add", (fp) => rebuild(fp, "add"))
|
||||
.on("change", (fp) => rebuild(fp, "change"))
|
||||
.on("unlink", (fp) => rebuild(fp, "unlink"))
|
||||
|
||||
const server = http.createServer(async (req, res) => {
|
||||
await serveHandler(req, res, {
|
||||
public: output,
|
||||
directoryListing: false,
|
||||
})
|
||||
const status = res.statusCode
|
||||
const statusString =
|
||||
status >= 200 && status < 300
|
||||
? chalk.green(`[${status}]`)
|
||||
: status >= 300 && status < 400
|
||||
? chalk.yellow(`[${status}]`)
|
||||
: chalk.red(`[${status}]`)
|
||||
console.log(statusString + chalk.grey(` ${req.url}`))
|
||||
})
|
||||
server.listen(argv.port)
|
||||
console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`))
|
||||
console.log("hint: exit with ctrl+c")
|
||||
}
|
||||
|
||||
const watcher = chokidar.watch(".", {
|
||||
persistent: true,
|
||||
cwd: argv.directory,
|
||||
ignoreInitial: true,
|
||||
})
|
||||
|
||||
watcher
|
||||
.on("add", (fp) => rebuild(fp, "add"))
|
||||
.on("change", (fp) => rebuild(fp, "change"))
|
||||
.on("unlink", (fp) => rebuild(fp, "unlink"))
|
||||
|
||||
const server = http.createServer(async (req, res) => {
|
||||
await serveHandler(req, res, {
|
||||
public: argv.output,
|
||||
directoryListing: false,
|
||||
})
|
||||
const status = res.statusCode
|
||||
const statusString =
|
||||
status >= 200 && status < 300
|
||||
? chalk.green(`[${status}]`)
|
||||
: status >= 300 && status < 400
|
||||
? chalk.yellow(`[${status}]`)
|
||||
: chalk.red(`[${status}]`)
|
||||
console.log(statusString + chalk.grey(` ${req.url}`))
|
||||
})
|
||||
server.listen(argv.port)
|
||||
console.log(chalk.cyan(`Started a Quartz server listening at http://localhost:${argv.port}`))
|
||||
console.log("hint: exit with ctrl+c")
|
||||
}
|
||||
|
||||
export default async (argv: Argv, version: string) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue