From 4d1a63709379455c3d73601ac62334fb72f2621b Mon Sep 17 00:00:00 2001 From: vplasencia Date: Tue, 4 Apr 2023 09:06:03 +0200 Subject: [PATCH] feat(cli): add inquirer to select a template when creating a project --- packages/cli/src/index.ts | 19 +++++++++++++++---- packages/cli/src/inquirerPrompts.ts | 13 ++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index d03d5f17..24af5c67 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -9,7 +9,7 @@ import { dirname } from "path" import { fileURLToPath } from "url" import checkLatestVersion from "./checkLatestVersion.js" import getGroupIds from "./getGroupIds.js" -import { getGroupId, getProjectName, getSupportedNetwork } from "./inquirerPrompts.js" +import { getGroupId, getProjectName, getSupportedNetwork, getSupportedTemplate } from "./inquirerPrompts.js" import Spinner from "./spinner.js" const packagePath = `${dirname(fileURLToPath(import.meta.url))}/..` @@ -17,6 +17,8 @@ const { description, version } = JSON.parse(readFileSync(`${packagePath}/package const supportedNetworks = ["sepolia", "goerli", "mumbai", "optimism-goerli", "arbitrum", "arbitrum-goerli"] +const supportedTemplates = ["hardhat", "hardhat-nextjs-semaphoreethers", "hardhat-nextjs-semaphoresubgraph"] + program .name("semaphore") .description(description) @@ -35,13 +37,22 @@ program .command("create") .description("Create a Semaphore project with a supported template.") .argument("[project-directory]", "Directory of the project.") - // .option("-t, --template ", "Supported Semaphore template.", "hardhat") + .option("-t, --template ", "Supported Semaphore template.") .allowExcessArguments(false) - .action(async (projectDirectory) => { + .action(async (projectDirectory, { template }) => { if (!projectDirectory) { projectDirectory = await getProjectName() } + if (!template) { + template = await getSupportedTemplate(supportedTemplates) + } + + if (!supportedTemplates.includes(template)) { + console.info(`\n ${logSymbols.error}`, `error: the template '${template}' is not supported\n`) + return + } + const currentDirectory = process.cwd() const spinner = new Spinner(`Creating your project in ${chalk.green(`./${projectDirectory}`)}`) @@ -55,7 +66,7 @@ program await checkLatestVersion(version) await pacote.extract( - `@semaphore-protocol/cli-template-hardhat@${version}`, + `@semaphore-protocol/cli-template-${template}@${version}`, `${currentDirectory}/${projectDirectory}` ) diff --git a/packages/cli/src/inquirerPrompts.ts b/packages/cli/src/inquirerPrompts.ts index 86df7c78..e42cf403 100644 --- a/packages/cli/src/inquirerPrompts.ts +++ b/packages/cli/src/inquirerPrompts.ts @@ -10,11 +10,22 @@ export async function getProjectName() { return projectName } +export async function getSupportedTemplate(supportedTemplates: string[]) { + const { selectedTemplate } = await inquirer.prompt({ + name: "selectedTemplate", + type: "list", + message: "Select one of the supported templates:", + default: supportedTemplates[0], + choices: supportedTemplates + }) + return selectedTemplate +} + export async function getSupportedNetwork(supportedNetworks: string[]) { const { selectedNetwork } = await inquirer.prompt({ name: "selectedNetwork", type: "list", - message: "Select one of our supported networks:", + message: "Select one of the supported networks:", default: supportedNetworks[0], choices: supportedNetworks })