From 91235ea1f52c7fe3499a705d33d664aad50d7c22 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:57:09 -0700 Subject: [PATCH] make create-test interactive To be more intuitive --- create-test-boilerplate.js | 134 ++++++++++++++++++++++--------------- 1 file changed, 81 insertions(+), 53 deletions(-) diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index d9cdbd4e7cf..e5c74ebf97a 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -1,6 +1,7 @@ -import fs from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'url'; +import fs from "fs"; +import inquirer from "inquirer"; +import path from "path"; +import { fileURLToPath } from "url"; /** * This script creates a test boilerplate file for a move or ability. @@ -14,59 +15,70 @@ import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -// Get the arguments from the command line -const args = process.argv.slice(2); -const type = args[0]; // "move" or "ability" -let fileName = args[1]; // The file name +const choices = { + type: ["Move", "Ability", "Item", "Exit"], +}; -if (!type || !fileName) { - console.error('Please provide a type ("move", "ability", or "item") and a file name.'); - process.exit(1); -} +async function runInteractive() { + const typeAnswer = await inquirer.prompt([ + { + type: "list", + name: "selectedOption", + message: "What test type would you like to create:", + choices: choices.type, + }, + ]); -// Convert fileName from kebab-case or camelCase to snake_case -fileName = fileName - .replace(/-+/g, '_') // Convert kebab-case (dashes) to underscores - .replace(/([a-z])([A-Z])/g, '$1_$2') // Convert camelCase to snake_case - .toLowerCase(); // Ensure all lowercase + switch (typeAnswer.selectedOption) { + case "Exit": + console.log("Exiting..."); + return process.exit(); + default: + if (!choices.type.includes(typeAnswer.selectedOption)) { + console.error('Please provide a valid type ("move", "ability", or "item")!'); + } // else proceed + } + const fileNameAnswer = await inquirer.prompt([ + { + type: "input", + name: "userInput", + message: `Please provide a file name for the ${typeAnswer.selectedOption}:`, + }, + ]); -// Format the description for the test case -const formattedName = fileName - .replace(/_/g, ' ') - .replace(/\b\w/g, char => char.toUpperCase()); + if (!fileNameAnswer.userInput || fileNameAnswer.userInput.trim().length === 0) { + console.error("Please provide a valid file name!"); + return process.exit(); + } -// Determine the directory based on the type -let dir; -let description; -if (type === 'move') { - dir = path.join(__dirname, 'src', 'test', 'moves'); - description = `Moves - ${formattedName}`; -} else if (type === 'ability') { - dir = path.join(__dirname, 'src', 'test', 'abilities'); - description = `Abilities - ${formattedName}`; -} else if (type === "item") { - dir = path.join(__dirname, 'src', 'test', 'items'); - description = `Items - ${formattedName}`; -} else { - console.error('Invalid type. Please use "move", "ability", or "item".'); - process.exit(1); -} + const type = typeAnswer.selectedOption.toLowerCase(); + // Convert fileName from kebab-case or camelCase to snake_case + const fileName = fileNameAnswer.userInput + .replace(/-+/g, "_") // Convert kebab-case (dashes) to underscores + .replace(/([a-z])([A-Z])/g, "$1_$2") // Convert camelCase to snake_case + .toLowerCase(); // Ensure all lowercase + // Format the description for the test case -// Ensure the directory exists -if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); -} + const formattedName = fileName.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); + // Determine the directory based on the type + let dir; + let description; + if (type === "move") { + dir = path.join(__dirname, "src", "test", "moves"); + description = `Moves - ${formattedName}`; + } else if (type === "ability") { + dir = path.join(__dirname, "src", "test", "abilities"); + description = `Abilities - ${formattedName}`; + } else if (type === "item") { + dir = path.join(__dirname, "src", "test", "items"); + description = `Items - ${formattedName}`; + } else { + console.error('Invalid type. Please use "move", "ability", or "item".'); + process.exit(1); + } -// Create the file with the given name -const filePath = path.join(dir, `${fileName}.test.ts`); - -if (fs.existsSync(filePath)) { - console.error(`File "${fileName}.test.ts" already exists.`); - process.exit(1); -} - -// Define the content template -const content = `import { Abilities } from "#enums/abilities"; + // Define the content template + const content = `import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; @@ -104,7 +116,23 @@ describe("${description}", () => { }); `; -// Write the template content to the file -fs.writeFileSync(filePath, content, 'utf8'); + // Ensure the directory exists + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } -console.log(`File created at: ${filePath}`); + // Create the file with the given name + const filePath = path.join(dir, `${fileName}.test.ts`); + + if (fs.existsSync(filePath)) { + console.error(`File "${fileName}.test.ts" already exists.`); + process.exit(1); + } + + // Write the template content to the file + fs.writeFileSync(filePath, content, "utf8"); + + console.log(`File created at: ${filePath}`); +} + +runInteractive();