UNPKG

nim-nodex-init

Version:

nim-nodex-init is a powerful CLI tool that scaffolds a complete Node.js & Express.js app with your preferred database, ORM, authentication system, and organized folder structure — all in seconds.

78 lines (60 loc) 4.92 kB
import fs from "fs"; import path from "path"; export function writeFilesAndFolders(projectPath, { language, database, orm }) { const ext = language === "TypeScript" ? "ts" : "js"; // Create folders ["config", "routes", "controllers", "models", "public"].forEach((dir) => { fs.mkdirSync(path.join(projectPath, dir), { recursive: true }); }); // .env const env = `PORT=5000\nDB_URI=your_${database.toLowerCase()}_uri_here\nBASE_URL=http://localhost:5000\n\n#JWT secret key\nJWT_SECRET=your_secret_key_here\n\n # Client URL\nCLIENT_URL=http://localhost:3000\n #SMTP\nSMTP_HOST=smtp.gmail.com\nSMTP_PORT=587\nSMTP_USER=your_email\nSMTP_PASSWORD=your_password\n\n`; fs.writeFileSync(path.join(projectPath, ".env"), env); // server.js / server.ts const serverCode = getServerCode(ext); fs.writeFileSync(path.join(projectPath, `server.${ext}`), serverCode); // config/db.js / db.ts const dbCode = getDbCode(database, orm, ext); fs.writeFileSync(path.join(projectPath, `config/db.${ext}`), dbCode); // routes/AuthRoute.js const routeCode = getRouteCode(ext); fs.writeFileSync( path.join(projectPath, `routes/AuthRoute.${ext}`), routeCode ); // controllers/AuthController.js const controllerCode = getControllerCode(ext); fs.writeFileSync( path.join(projectPath, `controllers/AuthController.${ext}`), controllerCode ); // models/User.js (based on db + orm) const modelCode = getUserModelCode(database, orm, ext); fs.writeFileSync(path.join(projectPath, `models/User.${ext}`), modelCode); } function getServerCode(ext) { return `import express from 'express';\nimport dotenv from 'dotenv';\nimport cors from 'cors';\nimport bodyParser from 'body-parser';\nimport connectDB from './config/db.${ext}';\nimport AuthRoute from './routes/AuthRoute.${ext}';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\ndotenv.config();\nconst app = express();\nconnectDB(); \n\napp.use(cors()); \napp.use(bodyParser.json()); \n\napp.use(express.json());\napp.use('/auth', AuthRoute);\napp.use('/public', express.static(path.join(__dirname, 'public')));\n\nconst PORT = process.env.PORT || 5000;\napp.listen(PORT, () => console.log(\`Server running on port \${PORT}\`));\n`; } function getDbCode(database, orm, ext) { if (database === "MongoDB") { return `import dotenv from 'dotenv';\nimport mongoose from 'mongoose';\n\ndotenv.config();\n\nconst connectDB = async () => {\n try {\n await mongoose.connect(process.env.DB_URI);\n console.log('MongoDB connected');\n } catch (error) {\n console.error('MongoDB connection failed:', error);\n process.exit(1);\n }\n};\n\nexport default connectDB;\n`; } if (orm === "Prisma") { return `import dotenv from 'dotenv';\nimport { PrismaClient } from '@prisma/client';\n\ndotenv.config();\n\nconst prisma = new PrismaClient();\n\nconst connectDB = async () => {\n try {\n await prisma.\$connect();\n console.log('${database} connected with Prisma');\n } catch (error) {\n console.error('Prisma connection failed:', error);\n }\n};\n\nexport default connectDB;\n`; } return `import { Sequelize } from 'sequelize';\n\n import dotenv from 'dotenv';\ndotenv.config();\n\n const sequelize = new Sequelize(process.env.DB_URI, {\n dialect: '${database.toLowerCase()}'\n});\n\nconst connectDB = async () => {\n try {\n await sequelize.authenticate();\n console.log('${database} connected with Sequelize');\n } catch (error) {\n console.error('Sequelize connection failed:', error);\n }\n};\n\nexport default connectDB;\n`; } function getRouteCode(ext) { return `import express from 'express';\nimport { login } from '../controllers/AuthController.${ext}';\n\nconst router = express.Router();\n\nrouter.post('/login', login);\n\nexport default router;\n`; } function getControllerCode(ext) { return `export const login = (req, res) => {\n res.send('Login route works!');\n};\n`; } function getUserModelCode(database, orm, ext) { if (database === "MongoDB") { return `import mongoose from 'mongoose';\n\nconst userSchema = new mongoose.Schema({\n name: String,\n email: String,\n password: String\n});\n\nexport default mongoose.model('User', userSchema);\n`; } if (orm === "Prisma") { return `// Define your user model in schema.prisma\n// Then run: npx prisma migrate dev\n\n// model User {\n// id Int @id @default(autoincrement())\n// name String\n// email String @unique\n// password String\n// }`; } return `import { DataTypes } from 'sequelize';\nimport sequelize from '../config/db.${ext}';\n\nconst User = sequelize.define('User', {\n name: { type: DataTypes.STRING },\n email: { type: DataTypes.STRING, unique: true },\n password: { type: DataTypes.STRING }\n});\n\nexport default User;\n`; }