133 lines
3.8 KiB
JavaScript
133 lines
3.8 KiB
JavaScript
import path from "node:path";
|
|
import arg from "arg";
|
|
import fse from "fs-extra";
|
|
import * as p from "@clack/prompts";
|
|
import c from 'picocolors';
|
|
import { exitPrompt, getModulePaths, isPackageManager } from "./utils/index.js";
|
|
import { createProject } from "./scripts/createProject.js";
|
|
|
|
|
|
export async function main() {
|
|
const exit = () => process.exit(0);
|
|
process.on("SIGINT", exit);
|
|
process.on("SIGTERM", exit);
|
|
|
|
console.clear();
|
|
|
|
const argv = process.argv.slice(2).filter((arg) => arg !== "--");
|
|
|
|
const flags = arg(
|
|
{
|
|
"--help": Boolean,
|
|
"--install": Boolean,
|
|
"--git": Boolean,
|
|
"--dry": Boolean,
|
|
"--pkg-manager": String,
|
|
"-h": "--help",
|
|
"-i": "--install",
|
|
"-g": "--git",
|
|
"-p": "--pkg-manager",
|
|
},
|
|
{ argv, permissive: true }
|
|
);
|
|
const {
|
|
"--help": help,
|
|
"--install": installDeps,
|
|
"--git": initGitRepo,
|
|
"--dry": dryRun,
|
|
"--pkg-manager": pkgManager,
|
|
} = flags;
|
|
|
|
// 0. Show help text and bail
|
|
if (help) {
|
|
console.log(getHelp());
|
|
return;
|
|
}
|
|
|
|
// Get Package Version for Intro
|
|
const { pathname } = getModulePaths(import.meta.url);
|
|
const iJSON = path.resolve(pathname, "..", "..", 'package.json');
|
|
const pJSON = await fse.readJson(iJSON);
|
|
const pkgVer = pJSON.version;
|
|
|
|
// 1. Say hello!
|
|
p.intro(c.bgMagenta(c.black(` ${c.bold("Astro-GhostCMS Create Utility - By MatthiesenXYZ")} ${c.underline(c.bold(c.blue(`( v${pkgVer} )`)))} ${c.italic(dryRun ? "[Dry Run] ":" ")}`)))
|
|
|
|
const gettingStarted = `${c.white(c.bold('Want to Initiate a git repo at the same time as deploying your project?'))} \n - ${c.white(`Use ${c.yellow('--git')} at the end of the command`)} \n ${c.white(c.bold(`Using a package manager other than ${c.cyan(c.bold('pnpm'))}?`))} \n - ${c.white(`Use ${c.yellow('--pkg-manager npm')} or ${c.yellow('--pkg-manager yarn')}.`)}`
|
|
|
|
p.note(gettingStarted)
|
|
|
|
// 2. Get template to set up
|
|
let [template, ...args] = flags._;
|
|
if (template && !isValidTemplate(template)) {
|
|
p.log.warning(c.red(`"${template}" isn't a valid template`));
|
|
template = null;
|
|
}
|
|
if (!template) {
|
|
const answer = await p.select({
|
|
message: `${c.cyan('Which template would you like to use?')}`,
|
|
options: [
|
|
{ value: "basic",
|
|
label: `${c.magenta('Basic')} - ${c.cyan(c.italic('Integration w/ Default Theme'))}`
|
|
},
|
|
{ value: "catppuccin",
|
|
label: `${c.magenta('Catppuccin-TW')} - ${c.cyan(c.italic('Integration w/ Catppuccin TailwindCSS theme'))}`
|
|
},
|
|
{ value: "starterkit",
|
|
label: `${c.magenta('Starter Kit')} - ${c.cyan(c.italic('Integration in API-Only Mode with customizable theme'))}`
|
|
}
|
|
],
|
|
initialValue: "basic",
|
|
});
|
|
if (p.isCancel(answer)) exitPrompt();
|
|
template = answer;
|
|
}
|
|
|
|
// 2. Construct context to pass to template functions
|
|
/** @type {Context} */
|
|
const ctx = {
|
|
dryRun,
|
|
installDeps,
|
|
initGitRepo,
|
|
template: template,
|
|
pkgManager: isPackageManager(pkgManager) ? pkgManager : null,
|
|
args,
|
|
};
|
|
|
|
// 3. Call template functions
|
|
switch (template) {
|
|
case "basic":
|
|
await createProject(ctx).catch(console.error);
|
|
break;
|
|
case "starterkit":
|
|
await createProject(ctx).catch(console.error);
|
|
break;
|
|
case "catppuccin":
|
|
await createProject(ctx).catch(console.error);
|
|
break;
|
|
default:
|
|
throw new Error(c.red(`Unknown template: ${template}`));
|
|
}
|
|
|
|
// 4. Huzzah!
|
|
p.outro(c.reset(`Problems? ${c.underline(c.cyan('https://github.com/MatthiesenXYZ/astro-ghostcms/issues'))}`));
|
|
}
|
|
|
|
function getHelp() {
|
|
return `${c.yellow('Need Help? Check the Docs!')} ${c.underline(c.cyan('https://astro-ghostcms.xyz/docs'))}`;
|
|
}
|
|
|
|
/**
|
|
* @param {string|null|undefined} template
|
|
* @returns {template is Template}
|
|
*/
|
|
function isValidTemplate(template) {
|
|
return ["basic","starterkit"].includes(template);
|
|
}
|
|
|
|
/**
|
|
* @typedef {import("../types.js").Template} Template
|
|
* @typedef {import("../types.js").PackageManager} PackageManager
|
|
* @typedef {import("../types.js").Context} Context
|
|
*/
|