#! /usr/bin/env node const inquirer = require("inquirer"); const fs = require("fs"); // SOURCE CODE: https://github.com/vKxni/noobject const CURR_DIR = process.cwd(); const CHOICES = fs.readdirSync(`${__dirname}/templates`); // Questions asked to the User const QUESTIONS = [ { name: "project-choice", type: "list", message: "What project template would you like to generate?", choices: CHOICES, }, { name: "project-name", type: "input", message: "Project name:", validate: (input) => { if (/^([A-Za-z\-\_\d])+$/.test(input)) return true; else return "Project name may only include letters, numbers, underscores and hashes."; }, }, ]; // Send a prompt to choose a template inquirer.prompt(QUESTIONS).then((answers) => { const projectChoice = answers["project-choice"]; const projectName = answers["project-name"]; const templatePath = `${__dirname}/templates/${projectChoice}`; // Create the folder with the project name choosed by the user fs.mkdirSync(`${CURR_DIR}/${projectName}`); createDirectoryContents(templatePath, projectName); console.log(`✅ Successfully created ${projectName}`); }); const createDirectoryContents = (templatePath, newProjectPath) => { const filesToCreate = fs.readdirSync(templatePath); filesToCreate.forEach((file) => { const origFilePath = `${templatePath}/${file}`; const stats = fs.statSync(origFilePath); if (stats.isFile()) { const contents = fs.readFileSync(origFilePath, "utf8"); if (file === ".npmignore") file = ".gitignore"; const writePath = `${CURR_DIR}/${newProjectPath}/${file}`; fs.writeFileSync(writePath, contents, "utf8"); console.log(`⚠️ Created ${writePath}`); } else if (stats.isDirectory()) { fs.mkdirSync(`${CURR_DIR}/${newProjectPath}/${file}`); createDirectoryContents( `${templatePath}/${file}`, `${newProjectPath}/${file}` ); } }); };