From 4bdc17d4a11f0ba517c6d9124d296458332c536b Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Sat, 03 Jun 2023 19:07:19 +0000
Subject: [PATCH] inline scripts

---
 quartz/bootstrap.mjs |  108 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 107 insertions(+), 1 deletions(-)

diff --git a/quartz/bootstrap.mjs b/quartz/bootstrap.mjs
index 0f66ea2..16a0c69 100755
--- a/quartz/bootstrap.mjs
+++ b/quartz/bootstrap.mjs
@@ -1,2 +1,108 @@
 #!/usr/bin/env node
-console.log('hello world')
+import { promises, readFileSync } from 'fs'
+import yargs from 'yargs'
+import path from 'path'
+import { hideBin } from 'yargs/helpers'
+import esbuild from 'esbuild'
+import chalk from 'chalk'
+import requireFromString from 'require-from-string'
+import { sassPlugin } from 'esbuild-sass-plugin'
+
+const fp = "./quartz.config.ts"
+const { version } = JSON.parse(readFileSync("./package.json").toString())
+
+export const BuildArgv = {
+  output: {
+    string: true,
+    alias: ['o'],
+    default: 'public',
+    describe: 'output folder for files'
+  },
+  clean: {
+    boolean: true,
+    default: false,
+    describe: 'clean the output folder before building'
+  },
+  serve: {
+    boolean: true,
+    default: false,
+    describe: 'run a local server to preview your Quartz'
+  },
+  port: {
+    number: true,
+    default: 8080,
+    describe: 'port to serve Quartz on'
+  },
+  directory: {
+    string: true,
+    alias: ['d'],
+    default: 'content',
+    describe: 'directory to look for content files'
+  },
+  verbose: {
+    boolean: true,
+    alias: ['v'],
+    default: false,
+    describe: 'print out extra logging information'
+  }
+}
+
+yargs(hideBin(process.argv))
+  .scriptName("quartz")
+  .version(version)
+  .usage('$0 <cmd> [args]')
+  .command('build', 'Build Quartz into a bundle of static HTML files', BuildArgv, async (argv) => {
+    const out = await esbuild.build({
+      entryPoints: [fp],
+      write: false,
+      bundle: true,
+      keepNames: true,
+      platform: "node",
+      format: "cjs",
+      jsx: "automatic",
+      jsxImportSource: "preact",
+      external: ["@napi-rs/simple-git", "shiki"],
+      plugins: [
+        sassPlugin({
+          type: 'css-text'
+        }),
+        {
+          name: 'inline-script-loader',
+          setup(build) {
+            build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => {
+              let text = await promises.readFile(args.path, 'utf8')
+              const transpiled = await esbuild.build({
+                stdin: {
+                  contents: text,
+                  sourcefile: path.relative(path.resolve('.'), args.path),
+                },
+                write: false,
+                bundle: true,
+                platform: "browser",
+                format: "esm",
+              })
+              const rawMod = transpiled.outputFiles[0].text
+              return {
+                contents: rawMod,
+                loader: 'text',
+              }
+            })
+          }
+        }
+      ]
+    }).catch(err => {
+      console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`)
+      console.log(`Reason: ${chalk.grey(err)}`)
+      console.log("hint: make sure all the required dependencies are installed (run `npm install`)")
+      process.exit(1)
+    })
+
+    const mod = out.outputFiles[0].text
+    const init = requireFromString(mod, fp).default
+    init(argv, version)
+  })
+  .showHelpOnFail(false)
+  .help()
+  .strict()
+  .demandCommand()
+  .argv

--
Gitblit v1.10.0