create-palladium
Version:
A modern CLI tool to create Vite + React + TypeScript projects with various configurations
88 lines (87 loc) β’ 3.49 kB
JavaScript
import inquirer from "inquirer";
import { validateProjectName, sanitizeProjectName } from "../utils/validation.js";
import { logger } from "../utils/logger.js";
export const runPrompt = async () => {
logger.title("π Palladium Project Generator");
const answers = await inquirer.prompt([
{
type: "input",
name: "projectName",
message: "νλ‘μ νΈ μ΄λ¦μ μ
λ ₯νμΈμ:",
default: "my-app",
validate: (input) => {
const validation = validateProjectName(input);
if (!validation.isValid) {
return validation.errors.join('\n');
}
return true;
},
filter: (input) => sanitizeProjectName(input)
},
{
type: "confirm",
name: "useRouter",
message: "React Router DOMμ μ€μΉνμκ² μ΅λκΉ?",
default: true,
},
{
type: "confirm",
name: "useReactQuery",
message: "React Query (TanStack Query)λ₯Ό μ€μΉνμκ² μ΅λκΉ?",
default: true,
},
{
type: "list",
name: "stateLibrary",
message: "μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ ννμΈμ:",
choices: [
{ name: "Zustand (κ°λ²Όμ΄ μν κ΄λ¦¬)", value: "zustand" },
{ name: "Redux Toolkit (κ°λ ₯ν μν κ΄λ¦¬)", value: "redux" },
{ name: "μ¬μ©νμ§ μμ", value: "none" }
],
default: "zustand"
},
{
type: "list",
name: "cssFramework",
message: "CSS νλ μμν¬λ₯Ό μ ννμΈμ:",
choices: [
{ name: "Tailwind CSS (μ νΈλ¦¬ν° νΌμ€νΈ)", value: "Tailwind CSS" },
{ name: "Styled Components (CSS-in-JS)", value: "Styled Components" },
{ name: "μ¬μ©νμ§ μμ", value: "none" }
],
default: "Tailwind CSS"
},
{
type: "checkbox",
name: "utils",
message: "μΆκ° μ νΈλ¦¬ν°λ₯Ό μ ννμΈμ:",
choices: [
{ name: "clsx (μ‘°κ±΄λΆ ν΄λμ€λͺ
)", value: "clsx" },
{ name: "ESLint + Prettier (μ½λ νμ§)", value: "eslint + prettier" }
],
default: ["clsx", "eslint + prettier"]
},
{
type: "confirm",
name: "runDev",
message: "νλ‘μ νΈ μμ± ν κ°λ° μλ²λ₯Ό λ°λ‘ μ€ννμκ² μ΅λκΉ?",
default: false,
},
]);
// νμ
λ³ν
const typedAnswers = {
...answers,
stateLibrary: answers.stateLibrary,
cssFramework: answers.cssFramework
};
// μ ν μ¬ν μμ½ νμ
logger.info("μ νν μ΅μ
:");
logger.step(`νλ‘μ νΈ μ΄λ¦: ${typedAnswers.projectName}`);
logger.step(`React Router: ${typedAnswers.useRouter ? 'β' : 'β'}`);
logger.step(`React Query: ${typedAnswers.useReactQuery ? 'β' : 'β'}`);
logger.step(`μν κ΄λ¦¬: ${typedAnswers.stateLibrary === 'none' ? 'μ¬μ© μ ν¨' : typedAnswers.stateLibrary}`);
logger.step(`CSS νλ μμν¬: ${typedAnswers.cssFramework === 'none' ? 'μ¬μ© μ ν¨' : typedAnswers.cssFramework}`);
logger.step(`μ νΈλ¦¬ν°: ${typedAnswers.utils.join(', ')}`);
return typedAnswers;
};