create-node-spark
Version:
CLI tool to scaffold a Node.js backend
120 lines • 4.29 kB
JavaScript
import { exec } from "child_process";
import { promisify } from "util";
import { logInfo, logSuccess, logError, logInstalling } from "../utils/logger.js";
import { getInstallCommand } from "../utils/packageManager.js";
const execPromise = promisify(exec);
export async function installDependencies(args) {
const deps = {
production: [],
development: []
};
const isTS = args.language === "TypeScript";
// Base framework dependencies
if (args.framework === "Express") {
deps.production.push("express", "dotenv");
if (isTS) {
deps.development.push("@types/express", "typescript", "tsx", "@types/node");
}
else {
deps.development.push("nodemon");
}
}
else if (args.framework === "Fastify") {
deps.production.push("fastify", "dotenv");
if (isTS) {
deps.development.push("@types/node", "typescript", "tsx");
}
else {
deps.development.push("nodemon");
}
}
else {
// Raw Node.js still needs dotenv for .env support
deps.production.push("dotenv");
if (isTS) {
deps.development.push("typescript", "tsx", "@types/node");
}
else {
deps.development.push("nodemon");
}
}
// Database dependencies
if (args.database === "MongoDB") {
deps.production.push("mongoose");
if (isTS) {
deps.development.push("@types/mongoose");
}
}
else if (args.database === "MySQL") {
deps.production.push("knex", "mysql2");
if (isTS) {
deps.development.push("@types/mysql2");
}
}
else if (args.database === "PostgreSQL") {
deps.production.push("@prisma/client");
deps.development.push("prisma");
if (isTS) {
// Prisma generates its own types, no additional type packages needed
}
}
// Feature dependencies
if (args.features.includes("eslint")) {
if (isTS) {
deps.development.push("@eslint/js", "typescript-eslint", "eslint", "eslint-plugin-n", "eslint-plugin-promise", "prettier");
}
else {
deps.development.push("@eslint/js", "eslint", "eslint-plugin-n", "eslint-plugin-promise", "prettier");
}
}
if (args.features.includes("multer")) {
deps.production.push("multer");
if (isTS) {
deps.development.push("@types/multer");
}
}
// Install all dependencies at once
try {
// Install production dependencies
if (deps.production.length > 0) {
const prodPackages = deps.production.join(" ");
const prodCmd = getInstallCommand(args.packageManager, prodPackages, false);
logInstalling(`Production dependencies (${deps.production.length} packages)`);
logInfo(`Installing: ${deps.production.join(", ")}`);
await execPromise(prodCmd);
logSuccess(`Production dependencies installed successfully!`, false);
}
// Install development dependencies
if (deps.development.length > 0) {
const devPackages = deps.development.join(" ");
const devCmd = getInstallCommand(args.packageManager, devPackages, true);
logInstalling(`Development dependencies (${deps.development.length} packages)`);
logInfo(`Installing: ${deps.development.join(", ")}`);
await execPromise(devCmd);
logSuccess(`Development dependencies installed successfully!`, false);
}
logSuccess(`🎉 All dependencies installed in 2 batches instead of ${getTotalInstallCount(args)} separate installs!`);
}
catch (err) {
logError(`Failed to install dependencies: ${err.message}`);
throw err;
}
}
function getTotalInstallCount(args) {
let count = 0;
// Base framework + language
count += 2; // Express/dotenv + TypeScript/nodemon
// Database
if (args.database !== "none") {
count += 1;
}
// Features
if (args.features.includes("eslint")) {
count += 1;
}
if (args.features.includes("multer")) {
count += 1;
}
return count;
}
//# sourceMappingURL=instalingDependecies.js.map