quartz update and quartz sync

This commit is contained in:
Jacky Zhao 2023-07-19 21:59:39 -07:00
parent 0b5fc92b90
commit 177c6d97f6
2 changed files with 100 additions and 22 deletions

View File

@ -10,12 +10,59 @@ import fs from 'fs'
import { intro, isCancel, outro, select, text } from '@clack/prompts' import { intro, isCancel, outro, select, text } from '@clack/prompts'
import { rimraf } from 'rimraf' import { rimraf } from 'rimraf'
import prettyBytes from 'pretty-bytes' import prettyBytes from 'pretty-bytes'
import { spawnSync } from 'child_process'
const UPSTREAM_NAME = 'upstream'
const QUARTZ_SOURCE_BRANCH = 'v4-alpha'
const cwd = process.cwd()
const cacheDir = path.join(cwd, ".quartz-cache")
const cacheFile = "./.quartz-cache/transpiled-build.mjs" const cacheFile = "./.quartz-cache/transpiled-build.mjs"
const fp = "./quartz/build.ts" const fp = "./quartz/build.ts"
const { version } = JSON.parse(readFileSync("./package.json").toString()) const { version } = JSON.parse(readFileSync("./package.json").toString())
const contentCacheFolder = path.join(cacheDir, "content-cache")
export const BuildArgv = { const CommonArgv = {
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'
}
}
const SyncArgv = {
...CommonArgv,
commit: {
boolean: true,
default: true,
describe: 'create a git commit for your unsaved changes'
},
push: {
boolean: true,
default: true,
describe: 'push updates to your Quartz fork'
},
force: {
boolean: true,
alias: ['f'],
default: true,
describe: 'whether to apply the --force flag to git commands'
},
pull: {
boolean: true,
default: true,
describe: 'pull updates from your Quartz fork'
}
}
const BuildArgv = {
...CommonArgv,
output: { output: {
string: true, string: true,
alias: ['o'], alias: ['o'],
@ -32,20 +79,9 @@ export const BuildArgv = {
default: 8080, default: 8080,
describe: 'port to serve Quartz on' 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'
}
} }
function escapePath(fp) { function escapePath(fp) {
return fp return fp
.replace(/\\ /g, " ") // unescape spaces .replace(/\\ /g, " ") // unescape spaces
@ -64,15 +100,24 @@ function exitIfCancel(val) {
} }
} }
async function stashContentFolder(contentFolder) {
await fs.promises.cp(contentFolder, contentCacheFolder, { force: true, recursive: true, verbatimSymlinks: true, preserveTimestamps: true })
await fs.promises.rm(contentFolder, { force: true, recursive: true })
}
async function popContentFolder(contentFolder) {
await fs.promises.cp(contentCacheFolder, contentFolder, { force: true, recursive: true, verbatimSymlinks: true, preserveTimestamps: true })
await fs.promises.rm(contentCacheFolder, { force: true, recursive: true })
}
yargs(hideBin(process.argv)) yargs(hideBin(process.argv))
.scriptName("quartz") .scriptName("quartz")
.version(version) .version(version)
.usage('$0 <cmd> [args]') .usage('$0 <cmd> [args]')
.command('create', 'Initialize Quartz', async (_argv) => { .command('create', 'Initialize Quartz', CommonArgv, async argv => {
console.log() console.log()
intro(chalk.bgGreen.black(` Quartz v${version} `)) intro(chalk.bgGreen.black(` Quartz v${version} `))
const cwd = process.cwd() const contentFolder = path.join(cwd, argv.directory)
const contentFolder = path.join(cwd, "content")
const setupStrategy = exitIfCancel(await select({ const setupStrategy = exitIfCancel(await select({
message: `Choose how to initialize the content in \`${contentFolder}\``, message: `Choose how to initialize the content in \`${contentFolder}\``,
options: [ options: [
@ -150,13 +195,45 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
Hosting your Quartz online (see: https://quartz.jzhao.xyz/setup/hosting) Hosting your Quartz online (see: https://quartz.jzhao.xyz/setup/hosting)
`) `)
}) })
.command('update', 'Get the latest Quartz updates', () => { .command('update', 'Get the latest Quartz updates', CommonArgv, async argv => {
// TODO const contentFolder = path.join(cwd, argv.directory)
console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
console.log('Backing up your content')
await stashContentFolder(contentFolder)
console.log("Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.")
spawnSync('git', ['pull', UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH], { stdio: 'inherit' })
await popContentFolder(contentFolder)
console.log(chalk.green('Done!'))
}) })
.command('push', 'Push your Quartz updates to GitHub', () => { .command('sync', 'Sync your Quartz to and from GitHub.', SyncArgv, async argv => {
// TODO const contentFolder = path.join(cwd, argv.directory)
console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`))
console.log('Backing up your content')
if (argv.commit) {
const currentTimestamp = new Date().toLocaleString('en-US', { dateStyle: "medium", timeStyle: "short" })
spawnSync('git', ['commit', '-am', `Quartz sync: ${currentTimestamp}`], { stdio: 'inherit' })
}
await stashContentFolder(contentFolder)
if (argv.pull) {
console.log("Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.")
spawnSync('git', ['pull', 'origin', QUARTZ_SOURCE_BRANCH], { stdio: 'inherit' })
}
await popContentFolder(contentFolder)
if (argv.push) {
console.log("Pushing your changes")
const args = argv.force ?
['push', '-f', 'origin', QUARTZ_SOURCE_BRANCH] :
['push', 'origin', QUARTZ_SOURCE_BRANCH]
spawnSync('git', args, { stdio: 'inherit' })
}
console.log(chalk.green('Done!'))
}) })
.command('build', 'Build Quartz into a bundle of static HTML files', BuildArgv, async (argv) => { .command('build', 'Build Quartz into a bundle of static HTML files', BuildArgv, async argv => {
const result = await esbuild.build({ const result = await esbuild.build({
entryPoints: [fp], entryPoints: [fp],
outfile: path.join("quartz", cacheFile), outfile: path.join("quartz", cacheFile),
@ -215,7 +292,7 @@ See the [documentation](https://quartz.jzhao.xyz) for how to get started.
if (argv.verbose) { if (argv.verbose) {
const outputFileName = 'quartz/.quartz-cache/transpiled-build.mjs' const outputFileName = 'quartz/.quartz-cache/transpiled-build.mjs'
const meta = result.metafile.outputs[outputFileName] const meta = result.metafile.outputs[outputFileName]
console.log(chalk.gray(`[debug] Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes(meta.bytes)})`)) console.log(`Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes(meta.bytes)})`)
} }
const { default: init } = await import(cacheFile) const { default: init } = await import(cacheFile)

View File

@ -1,5 +1,6 @@
@use "./syntax.scss"; @use "./syntax.scss";
@use "./callouts.scss"; @use "./callouts.scss";
@use "./custom.scss";
@use "./variables.scss" as *; @use "./variables.scss" as *;
html { html {