heyjarvis
Version:
J.A.R.V.I.S. - Advanced Node.js MVC Framework with ORM, built-in validation, soft delete, and query builder
141 lines (129 loc) • 4.04 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { execSync } = require('child_process');
const chalk = require('chalk');
const { createFolderStructure } = require('../generators/folders');
const { createFiles } = require('../generators/files');
const { installDependencies } = require('../utils/installer');
const createProject = async (projectName, options = {}) => {
const { template = 'basic', database = 'mysql', install = true } = options;
const projectPath = path.resolve(projectName);
// Proje klasörü zaten var mı kontrol et
if (fs.existsSync(projectPath)) {
throw new Error(`Folder ${projectName} already exists`);
}
// Ana proje klasörünü oluştur
fs.mkdirSync(projectPath, { recursive: true });
process.chdir(projectPath);
// Package.json oluştur
await createPackageJson(projectName, template);
// Klasör yapısını oluştur
await createFolderStructure(template);
// Template'e göre dosyaları oluştur
await createFiles(template, database);
// Dependencies yükle
if (install) {
await installDependencies(template, database);
}
console.log(chalk.green(`\n✅ J.A.R.V.I.S. project "${projectName}" created successfully!`));
};
const createPackageJson = (projectName, template) => {
const packageJson = {
name: projectName,
version: "1.0.0",
description: `J.A.R.V.I.S. ${template} project`,
main: "src/app.js",
scripts: {
start: "node src/app.js",
dev: "nodemon src/app.js",
test: "jest --passWithNoTests",
"test:watch": "jest --watch",
lint: "eslint src/",
"lint:fix": "eslint src/ --fix"
},
keywords: ["jarvis", "mvc", "express", "nodejs", "uuid", "api"],
author: "",
license: "MIT",
dependencies: {},
devDependencies: {}
};
fs.writeFileSync('package.json', JSON.stringify(packageJson, null, 2));
console.log(chalk.green('📦 package.json created with enhanced scripts'));
};
// Template seçenekleri
const templates = {
basic: {
description: 'Basic MVC structure with Express, Sequelize and UUID',
dependencies: [
'express',
'sequelize',
'mysql2',
'uuid',
'dotenv',
'express-session',
'cors',
'helmet'
],
devDependencies: ['nodemon', 'eslint']
},
api: {
description: 'REST API with UUID, validation, security and testing',
dependencies: [
'express',
'sequelize',
'mysql2',
'uuid',
'dotenv',
'cors',
'helmet',
'express-rate-limit',
'compression',
'express-validator',
'morgan',
'jsonwebtoken',
'bcryptjs'
],
devDependencies: [
'nodemon',
'jest',
'supertest',
'eslint',
'cross-env'
]
},
full: {
description: 'Full-stack with UUID, authentication, file upload and more',
dependencies: [
'express',
'sequelize',
'mysql2',
'uuid',
'dotenv',
'express-session',
'bcryptjs',
'jsonwebtoken',
'multer',
'ejs',
'cors',
'helmet',
'express-rate-limit',
'compression',
'express-validator',
'morgan',
'nodemailer',
'redis'
],
devDependencies: [
'nodemon',
'jest',
'supertest',
'eslint',
'cross-env',
'faker'
]
}
};
module.exports = {
createProject,
templates
};