Skip to content

Commit

Permalink
Merge pull request #4 from francis560/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
francis560 authored Jun 19, 2022
2 parents 8a09e5a + 2090e27 commit 2aa4f71
Show file tree
Hide file tree
Showing 16 changed files with 787 additions and 1,161 deletions.
47 changes: 41 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,44 @@
# ExpressJs cli

<p align="center">
<br>
<img src="./docs/screenshot.png" alt="Express Cli Ultimate" width="720px" height="px"/>
<br>
<br>
<br>
</p>

# Express Cli Ultimate

An easier way to build your project structure in express.

## Requirements
node v16

## Dependencies
* express
* morgan
## Development Setup


### Prerequisites

- Install [Node.js] which includes [Node Package Manager][npm]

### Setting Up a Project

Install the Express cli ultimate globally:

```
npm install -g express-cli-ultimate
```

Create workspace:

```
ecu new
```

Run the application:

```
cd [PROJECT NAME]
npm i
npm run dev
```

**Love Express Cli Ultimate? Give our repo a star :star: :arrow_up:.**
115 changes: 75 additions & 40 deletions app/app.js
Original file line number Diff line number Diff line change
@@ -1,54 +1,89 @@
#!/usr/bin/env node

import inquirer from "inquirer";
import shell from "shelljs";
import gradient from "gradient-string";
import { createSpinner } from "nanospinner";
import createInitFiles from "./templates/javascript/createInitFiles.js";
import { createBasicFiles, createFolderProject } from "./createInitFolders.js";
import { createDbConnection } from "./createdb.js";
import welcome from "./welcome.js";
import finalMessage from "./finalProjectMessages.js";
import "./commands.js";


welcome();
// {
// type: "confirm",
// name: "database",
// message: "Do you want to use a database?"
// }

inquirer.prompt([{
type: "input",
name: "name",
message: "What is the name of your project?",
default: "test-project"
}, {
type: "list",
name: "type",
message: "Select your type of project",
choices: ["javascript"]
}]).then(({ name, type, database }) => {
const generateProject = () => {

const spinner = createSpinner(gradient.rainbow("Creating...")).start();
welcome();

inquirer.prompt([{
type: "input",
name: "name",
message: "What is the name of your project?",
default: "test-project"
}, {
type: "list",
name: "type",
message: "Select your type of project",
choices: ["javascript", "typescript"]
},
{
type: "confirm",
name: "database",
message: "Do you want to use a database?"
}
]).then(({ name, type, database }) => {

try {

shell.config.silent = true;

if (database) {
inquirer.prompt({
type: "list",
name: "database_type",
message: "Select your database type",
choices: ["mongodb", "postgresql"]
}).then(({ database_type }) => {

console.log("\n");

const spinner = createSpinner(gradient.rainbow(`Creating a new Express project in ${process.cwd()} \n`)).start();

createFolderProject(name);

createBasicFiles(name, type);

try {
createDbConnection(database_type, type, name);

spinner.stop();

finalMessage(name, spinner);

});

return;
}

console.log("\n");

createInitFiles.createFolderProject(name);

shell.cd(`${name}`);
shell.exec("npm init --y");
shell.exec("npm i express morgan");

createInitFiles.createAppFile();
createInitFiles.createConfigServerFile();
createInitFiles.createIndexRoutesFile();
createInitFiles.createIndexControllerFile();
const spinner = createSpinner(gradient.rainbow(`Creating a new Express project in ${process.cwd()} \n`)).start();

createFolderProject(name);

createBasicFiles(name, type);

spinner.stop();

finalMessage(name, spinner);

} catch (err) {

console.error(err);

}

spinner.success({text: gradient.rainbow("Project created successfully.")});

} catch (err) {

});

console.error(err);
}

}


});
export default generateProject;
19 changes: 19 additions & 0 deletions app/commands.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env node
import { program } from "commander";
import generateProject from "./app.js";


program.name("express-cli").version("0.2.0").description("An easier way to build your project structure in express.");

program.command("new").description("Generate project").action(() => {
generateProject();
});

// program.option("-r, --router <name>", "Generate router file");

// program.command("g").description("Generate file").action((args) => {
// console.log(args.router);
// });


program.parse(process.argv);
174 changes: 174 additions & 0 deletions app/createInitFolders.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
import path from "path";
import fs from "fs";
import shell from "shelljs";
import gradient from "gradient-string";
import { createSpinner } from "nanospinner";
import { appFileJs, configServerJs, indexControllerJs, indexRoutesJs } from "./templates/javascript/contentJsFiles.js";
import { appFileTs, configServerTs, indexControllerTs, indexRoutesTs, nodemonFile } from "./templates/typescript/contentTsFiles.js";


const contentBasicFiles = (name, type) => {

fs.appendFile(path.join(process.cwd(), type === "javascript" ? `/${name}/app.js` : `/${name}/app.ts`), type === "javascript" ? appFileJs : appFileTs, (err) => {
if (err) {
console.error(err)
return
}
});

fs.appendFile(path.join(process.cwd(), type === "javascript" ? `/${name}/config/server.js` : `/${name}/config/server.ts`), type === "javascript" ? configServerJs : configServerTs, (err) => {
if (err) {
console.error(err)
return
}
});

fs.appendFile(path.join(process.cwd(), type === "javascript" ? `/${name}/app/routes/index.routes.js` : `/${name}/app/routes/index.routes.ts`), type === "javascript" ? indexRoutesJs : indexRoutesTs, (err) => {
if (err) {
console.error(err)
return
}
});

fs.appendFile(path.join(process.cwd(), type === "javascript" ? `/${name}/app/controllers/index.controller.js` : `/${name}/app/controllers/index.controller.ts`), type === "javascript" ? indexControllerJs : indexControllerTs, (err) => {
if (err) {
console.error(err)
return
}
});

if (type === "typescript") {
fs.appendFile(path.join(process.cwd(), `/${name}/nodemon.json`), nodemonFile, (err) => {
if (err) {
console.error(err)
return
}
});
}
// package json for javascript project
if (type === "javascript") {
fs.appendFile(path.join(process.cwd(), `/${name}/package.json`), `{
"name": "${name}",
"version": "1.0.0",
"description": "",
"type": "module",
"main": "app.js",
"scripts": {
"start": "node app.js",
"build": "npm i",
"dev": "nodemon app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"morgan": "^1.10.0",
"dotenv": "^16.0.1"
},
"devDependencies": {
"nodemon": "^2.0.7"
}
}
`, (err) => {
if (err) {
console.error(err)
return
}
});

}

if (type === "typescript") {
fs.appendFile(path.join(process.cwd(), `/${name}/package.json`), `{
"name": "${name}",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js",
"build": "npx tsc -b",
"dev": "nodemon"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"morgan": "^1.10.0",
"dotenv": "^16.0.1"
},
"devDependencies": {
"nodemon": "^2.0.7",
"ts-node": "^10.7.0",
"typescript": "^4.6.3",
"@types/dotenv": "^8.2.0",
"@types/express": "^4.17.13",
"@types/morgan": "^1.9.3",
"@types/nodemon": "^1.19.1"
}
}
`, (err) => {
if (err) {
console.error(err)
return
}
});

}

}

export const createBasicFiles = (name, type) => {

shell.touch(path.join(process.cwd(), `/${name}/.env`));
shell.touch(path.join(process.cwd(), `/${name}/README.md`));
shell.touch(path.join(process.cwd(), `/${name}/.gitignore`));
shell.touch(path.join(process.cwd(), `/${name}/package.json`));

if (type === "javascript") {
shell.touch(path.join(process.cwd(), `/${name}/app.js`));
shell.touch(path.join(process.cwd(), `/${name}/config/server.js`));
shell.touch(path.join(process.cwd(), `/${name}/app/routes/index.routes.js`));
shell.touch(path.join(process.cwd(), `/${name}/app/controllers/index.controller.js`));
}

if (type === "typescript") {
shell.touch(path.join(process.cwd(), `/${name}/app.ts`));
shell.touch(path.join(process.cwd(), `/${name}/nodemon.json`));
shell.touch(path.join(process.cwd(), `/${name}/config/server.ts`));
shell.touch(path.join(process.cwd(), `/${name}/app/routes/index.routes.ts`));
shell.touch(path.join(process.cwd(), `/${name}/app/controllers/index.controller.ts`));
}


contentBasicFiles(name, type);

}

const createBasicFolders = (name) => {

shell.mkdir('-p', path.join(process.cwd(), `/${name}/app/`));
shell.mkdir('-p', path.join(process.cwd(), `/${name}/config/`));
shell.mkdir('-p', path.join(process.cwd(), `/${name}/app/routes/`));
shell.mkdir('-p', path.join(process.cwd(), `/${name}/app/controllers/`));

}

export const createFolderProject = (name) => {

if (!fs.existsSync(path.join(process.cwd(), `/${name}/`))) {

shell.mkdir('-p', path.join(process.cwd(), `/${name}/`));

createBasicFolders(name);

} else {

createSpinner(gradient.rainbow(`The name ${name} is in use. \n`)).error();

shell.exit(1);

}

}
Loading

0 comments on commit 2aa4f71

Please sign in to comment.