| | |
| | | #!/usr/bin/env node |
| | | 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 { sassPlugin } from 'esbuild-sass-plugin' |
| | | |
| | | const cacheFile = "./.quartz-cache/transpiled-build.mjs" |
| | | const fp = "./quartz/build.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' |
| | | } |
| | | } |
| | | #!/usr/bin/env -S node --no-deprecation |
| | | import yargs from "yargs" |
| | | import { hideBin } from "yargs/helpers" |
| | | import { |
| | | handleBuild, |
| | | handleCreate, |
| | | handleUpdate, |
| | | handleRestore, |
| | | handleSync, |
| | | } from "./cli/handlers.js" |
| | | import { CommonArgv, BuildArgv, CreateArgv, SyncArgv } from "./cli/args.js" |
| | | import { version } from "./cli/constants.js" |
| | | |
| | | 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) => { |
| | | await esbuild.build({ |
| | | entryPoints: [fp], |
| | | outfile: path.join("quartz", cacheFile), |
| | | bundle: true, |
| | | keepNames: true, |
| | | platform: "node", |
| | | format: "esm", |
| | | jsx: "automatic", |
| | | jsxImportSource: "preact", |
| | | packages: "external", |
| | | 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') |
| | | // remove default exports that we manually inserted |
| | | text = text.replace('export default', '') |
| | | text = text.replace('export', '') |
| | | |
| | | const sourcefile = path.relative(path.resolve('.'), args.path) |
| | | const resolveDir = path.dirname(sourcefile) |
| | | const transpiled = await esbuild.build({ |
| | | stdin: { |
| | | contents: text, |
| | | loader: 'ts', |
| | | resolveDir, |
| | | sourcefile, |
| | | }, |
| | | 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 { default: init } = await import(cacheFile) |
| | | init(argv, version) |
| | | .usage("$0 <cmd> [args]") |
| | | .command("create", "Initialize Quartz", CreateArgv, async (argv) => { |
| | | await handleCreate(argv) |
| | | }) |
| | | .command("update", "Get the latest Quartz updates", CommonArgv, async (argv) => { |
| | | await handleUpdate(argv) |
| | | }) |
| | | .command( |
| | | "restore", |
| | | "Try to restore your content folder from the cache", |
| | | CommonArgv, |
| | | async (argv) => { |
| | | await handleRestore(argv) |
| | | }, |
| | | ) |
| | | .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => { |
| | | await handleSync(argv) |
| | | }) |
| | | .command("build", "Build Quartz into a bundle of static HTML files", BuildArgv, async (argv) => { |
| | | await handleBuild(argv) |
| | | }) |
| | | .showHelpOnFail(false) |
| | | .help() |
| | | .strict() |
| | | .demandCommand() |
| | | .argv |
| | | .demandCommand().argv |