diff --git a/packages/cli/lib/interactiveClient.ts b/packages/cli/lib/interactiveClient.ts new file mode 100644 index 0000000..f6946fa --- /dev/null +++ b/packages/cli/lib/interactiveClient.ts @@ -0,0 +1,102 @@ +import fs, { createWriteStream, mkdir, readdir, readdirSync } from "fs"; +import { copySync, removeSync } from "fs-extra"; +import * as inquirer from "inquirer"; +import getPackageManager from "../lib/getPackageManager"; +import install from "../lib/installDependencies"; +import * as logger from "../utils/logger"; +import constants from "../utils/constants"; +import getConstant from "../utils/constants"; +import stream from "got"; +import unzip from "unzip-stream"; +import validateClient from "../lib/validateClient"; + +export default function main(shouldInstall: boolean) { + const welcomeASCII = getConstant("welcomeMessage"); + console.log(welcomeASCII); + + inquirer + .prompt([ + { + type: "input", + name: "location", + message: "Where should the project be initialized?", + }, + { + type: "list", + name: "flavor", + message: "Which flavor?", + choices: ["TypeScript", "JavaScript"], + filter(val) { + return val.toLowerCase(); + }, + }, + ]) + .then((answers) => { + validateClient(); + mkdir(answers.location, (e) => { + if (e && e.code != "EEXIST") { + logger.error("Failed to create project directory."); + process.exit(1); + } + + if (e) { + if (e.code == "EEXIST") { + readdir(answers.location, (_, files) => { + if (files.length) { + logger.error("Directory not empty."); + process.exit(1); + } + }); + } + } + }); + + let packageManager = getPackageManager(); + + const start = async (TEMPLATE_DOWNLOAD_URL: string) => { + const download = stream(TEMPLATE_DOWNLOAD_URL, { isStream: true }).pipe( + createWriteStream(`${answers.location}/create-guilded-bot_ts.zip`) + ); + download.on("finish", () => { + fs.createReadStream(`${answers.location}/create-guilded-bot_ts.zip`) + .pipe(unzip.Extract({ path: `${answers.location}` })) + .on("finish", () => { + removeSync(`${answers.location}/create-guilded-bot_ts.zip`); + logger.success("🚀 Let's get started."); + }); + }); + }; + + if (answers.flavor == "typescript") { + const TEMPLATE_DOWNLOAD_URL = + "https://files.devcomp.xyz/r/create-guilded-bot_ts.zip"; + + start(TEMPLATE_DOWNLOAD_URL).then(() => { + if (shouldInstall) { + install( + packageManager as "npm" | "pnpm" | "yarn" | null, + answers.location + ); + } else if (!shouldInstall) { + logger.custom(packageManager, "Skipping installation step.") + } + }); + } + + if (answers.flavor == "javascript") { + const TEMPLATE_DOWNLOAD_URL = + "https://files.devcomp.xyz/r/create-guilded-bot_js.zip"; + + start(TEMPLATE_DOWNLOAD_URL).then(() => { + if (shouldInstall) { + install( + packageManager as "npm" | "pnpm" | "yarn" | null, + answers.location + ); + } else if (!shouldInstall) { + logger.custom(packageManager, "Skipping installation step.") + } + }); + } + }); +} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 7333817..4dbfa39 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,94 +1,44 @@ #!/usr/bin/env node -import fs, { createWriteStream, mkdir, readdir, readdirSync } from "fs"; -import { copySync, removeSync } from "fs-extra"; -import * as inquirer from "inquirer"; -import getPackageManager from "../lib/getPackageManager"; -import install from "../lib/installDependencies"; +import getConstant from "../utils/constants"; +import interactiveClient from "../lib/interactiveClient"; import * as logger from "../utils/logger"; -import constants from "../lib/constants"; -import getConstant from "../lib/constants"; -import stream from "got"; -import unzip from "unzip-stream"; -import validateClient from "../lib/validateClient"; +import * as globals from "../utils/globals" + +const args = process.argv.filter((_, i: number) => { + return i > 1; +}); const weclomeASCII = getConstant("welcomeMessage"); -console.log(weclomeASCII); +const helpMenu = getConstant("helpMenu"); -inquirer - .prompt([ - { - type: "input", - name: "location", - message: "Where should the project be initialized?", - }, - { - type: "list", - name: "flavor", - message: "Which flavor?", - choices: ["TypeScript", "JavaScript"], - filter(val) { - return val.toLowerCase(); - }, - }, - ]) - .then((answers) => { - validateClient(); - mkdir(answers.location, (e) => { - if (e && e.code != "EEXIST") { - logger.error("Failed to create project directory."); - process.exit(1); - } - if (e) { - if (e.code == "EEXIST") { - readdir(answers.location, (_, files) => { - if (files.length) { - logger.error("Directory not empty."); - process.exit(1); - } - }); - } - } - }); +if (args.length > 0) { + switch (args[0]) { + case "-h": + case "--help": + case "help": + console.log(weclomeASCII); + console.log(helpMenu); + break; + case "-i": + case "--interactive": + interactiveClient(true); + break; + case "--no-install": + case "-n": + globals.setGlobal("shouldInstall", false) + interactiveClient(false) + break; + default: + console.log(weclomeASCII); + process.stdout.write(" "); + logger.error("Unknown command."); + console.log(helpMenu); + break; + } +} - let packageManager = getPackageManager(); - - const start = async (TEMPLATE_DOWNLOAD_URL: string) => { - const download = stream(TEMPLATE_DOWNLOAD_URL, { isStream: true }).pipe( - createWriteStream(`${answers.location}/create-guilded-bot_ts.zip`) - ); - download.on("finish", () => { - fs.createReadStream(`${answers.location}/create-guilded-bot_ts.zip`) - .pipe(unzip.Extract({ path: `${answers.location}` })) - .on("finish", () => { - removeSync(`${answers.location}/create-guilded-bot_ts.zip`); - logger.success("🚀 Let's get started."); - }); - }); - }; - - if (answers.flavor == "typescript") { - const TEMPLATE_DOWNLOAD_URL = - "https://files.devcomp.xyz/r/create-guilded-bot_ts.zip"; - - start(TEMPLATE_DOWNLOAD_URL).then(() => { - install( - packageManager as "npm" | "pnpm" | "yarn" | null, - answers.location - ); - }); - } - - if (answers.flavor == "javascript") { - const TEMPLATE_DOWNLOAD_URL = - "https://files.devcomp.xyz/r/create-guilded-bot_js.zip"; - - start(TEMPLATE_DOWNLOAD_URL).then(() => { - install( - packageManager as "npm" | "pnpm" | "yarn" | null, - answers.location - ); - }); - } - }); +if (args.length == 0) { + interactiveClient(true); +} diff --git a/packages/cli/lib/constants.ts b/packages/cli/utils/constants.ts similarity index 85% rename from packages/cli/lib/constants.ts rename to packages/cli/utils/constants.ts index 8aa9eb4..0368498 100644 --- a/packages/cli/lib/constants.ts +++ b/packages/cli/utils/constants.ts @@ -20,6 +20,18 @@ export const c = { welcomeMessage: gradient.rainbow.multiline( " _ _ _ _ _ _ _ \n | | (_) | | | | | | | | | \n ___ _ __ ___ __ _| |_ ___ ______ __ _ _ _ _| | __| | ___ __| |______| |__ ___ | |_ \n / __| '__/ _ \\/ _` | __/ _ \\______/ _` | | | | | |/ _` |/ _ \\/ _` |______| '_ \\ / _ \\| __|\n | (__| | | __/ (_| | || __/ | (_| | |_| | | | (_| | __/ (_| | | |_) | (_) | |_ \n \\___|_| \\___|\\__,_|\\__\\___| \\__, |\\__,_|_|_|\\__,_|\\___|\\__,_| |_.__/ \\___/ \\__|\n __/ | \n |___/ \n\n" ), + helpMenu: ` + Usage: create-guilded-bot [command] [flags] + create-guilded-bot [ -h | --help | -v | --version ] + + Generate a project: + new [directory] Creates a new project in a specified directory. + + Options: + --no-install, -n Does not install dependencies for the generated project. + --interactive, -i Run the interactive CLI interface + + `, } as const; const hyphen = kleur.yellow(c.word_HyphenAscii); diff --git a/packages/cli/utils/globals.ts b/packages/cli/utils/globals.ts new file mode 100644 index 0000000..7caa874 --- /dev/null +++ b/packages/cli/utils/globals.ts @@ -0,0 +1,13 @@ +export let globalsStore = { meta: { created: new Date().getDate() + new Date().getTime() } } +export function setGlobal(global: string, value: any): void { + globalsStore[global] = value +} + +export function getGlobal(global: string): any { + return globalsStore[global] +} + + +export function getGlobals(): {} { + return globalsStore +} \ No newline at end of file