dscaffold
Version:
A TypeScript framework for scaffolding modular Discord bot projects with dynamic command and event loading
149 lines • 5.69 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createProject = createProject;
const inquirer_1 = __importDefault(require("inquirer"));
const path_1 = __importDefault(require("path"));
const utils_1 = require("../utils");
const ProjectGenerator_1 = require("../generators/ProjectGenerator");
async function createProject(projectName, options) {
try {
const spinner = utils_1.Logger.spinner('Setting up your Discord bot project...');
// Get project name if not provided
if (!projectName) {
const nameAnswer = await inquirer_1.default.prompt([
{
type: 'input',
name: 'name',
message: 'What is your project name?',
default: 'my-discord-bot',
validate: (input) => {
if (!(0, utils_1.validateProjectName)(input)) {
return 'Please enter a valid project name (alphanumeric, hyphens, and underscores only)';
}
return true;
},
},
]);
projectName = nameAnswer.name;
}
if (!projectName || !(0, utils_1.validateProjectName)(projectName)) {
utils_1.Logger.error('Invalid project name. Use only alphanumeric characters, hyphens, and underscores.');
return;
}
// Interactive prompts for project configuration
const config = await getProjectConfig(projectName, options);
spinner.start();
// Generate the project
const generator = new ProjectGenerator_1.ProjectGenerator(config);
const projectPath = path_1.default.join((0, utils_1.getCurrentWorkingDir)(), projectName);
await generator.generate(projectPath);
spinner.stop();
utils_1.Logger.success(`Discord bot project "${projectName}" created successfully!`);
utils_1.Logger.info('Next steps:');
console.log(` cd ${projectName}`);
console.log(' npm install');
console.log(' npm run dev');
}
catch (error) {
utils_1.Logger.error(`Failed to create project: ${error instanceof Error ? error.message : 'Unknown error'}`);
process.exit(1);
}
}
async function getProjectConfig(projectName, options) {
const answers = await inquirer_1.default.prompt([
{
type: 'list',
name: 'language',
message: 'Choose your preferred language:',
choices: [
{ name: 'TypeScript (Recommended)', value: 'typescript' },
{ name: 'JavaScript', value: 'javascript' },
],
default: options?.language || 'typescript',
},
{
type: 'list',
name: 'template',
message: 'Choose a template:',
choices: [
{ name: 'Basic - Essential bot setup', value: 'basic' },
{ name: 'Advanced - Full-featured with database and logging', value: 'advanced' },
],
default: options?.template || 'basic',
},
{
type: 'input',
name: 'prefix',
message: 'Bot command prefix:',
default: '!',
validate: (input) => input.length > 0 || 'Prefix cannot be empty',
},
{
type: 'checkbox',
name: 'intents',
message: 'Select Discord bot intents:',
choices: [
{ name: 'Guilds', value: 'Guilds', checked: true },
{ name: 'Guild Messages', value: 'GuildMessages', checked: true },
{ name: 'Message Content', value: 'MessageContent', checked: true },
{ name: 'Guild Members', value: 'GuildMembers' },
{ name: 'Guild Voice States', value: 'GuildVoiceStates' },
{ name: 'Guild Presences', value: 'GuildPresences' },
],
},
{
type: 'confirm',
name: 'database',
message: 'Include database integration?',
default: false,
when: (answers) => answers.template === 'advanced',
},
{
type: 'confirm',
name: 'logging',
message: 'Include advanced logging?',
default: true,
when: (answers) => answers.template === 'advanced',
},
{
type: 'confirm',
name: 'eslint',
message: 'Include ESLint for code linting?',
default: true,
},
{
type: 'confirm',
name: 'prettier',
message: 'Include Prettier for code formatting?',
default: true,
},
{
type: 'confirm',
name: 'docker',
message: 'Include Docker configuration?',
default: false,
when: (answers) => answers.template === 'advanced',
},
]);
return {
name: projectName,
language: answers.language,
template: answers.template,
features: {
database: answers.database || false,
logging: answers.logging || false,
eslint: answers.eslint,
prettier: answers.prettier,
docker: answers.docker || false,
},
botSettings: {
token: '',
prefix: answers.prefix,
intents: answers.intents,
},
};
}
//# sourceMappingURL=create.js.map