astro-ghostcms/packages/create-astro-ghostcms/src/index.js

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
*/