diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index ab796a4..9faf628 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,7 +1,7 @@ { - "name": "startease", - "version": "1.0.0", - "lockfileVersion": 2, + "name": "startease-cli", + "version": "1.0.12", + "lockfileVersion": 3, "requires": true, "packages": { "node_modules/@kwsites/file-exists": { diff --git a/package-lock.json b/package-lock.json index d2be065..8aad231 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "startease", - "version": "1.0.0", + "name": "startease-cli", + "version": "1.0.12", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "startease", - "version": "1.0.0", + "name": "startease-cli", + "version": "1.0.12", "license": "ISC", "dependencies": { "chalk": "^5.3.0", @@ -17,6 +17,9 @@ "inquirer": "^8.2.6", "ora": "^7.0.1", "simple-git": "^3.19.1" + }, + "bin": { + "startease-cli": "cli.js" } }, "node_modules/@kwsites/file-exists": { diff --git a/src/utils/create-backend-project.js b/src/utils/create-backend-project.js index 580d0f4..d1f1f7c 100644 --- a/src/utils/create-backend-project.js +++ b/src/utils/create-backend-project.js @@ -8,10 +8,11 @@ import { } from './filemanager.js'; import { AppModuleContent } from '../../templates/backend/nestjs/base/app-module.js'; import path from 'path'; -import {MongodbDatabaseConfig, MongodbSchema} from '../../templates/backend/nestjs/base/databases.js'; +import {MongodbDatabaseConfig, MongodbSchema, TypeOrmDatabaseModule, TypeOrmAbstractDocument, TypeOrmEntity} from '../../templates/backend/nestjs/base/databases.js'; import { NEST_MONGOOSE_PACKAGE, - NestjsPackageJsonTemplate + NestjsPackageJsonTemplate, + NEST_TYPEORM_PACKAGE } from '../../templates/backend/nestjs/base/nestjs-package-json.js'; import { ENVIRONMENT_TEMPLATE } from '../../templates/backend/nestjs/base/environment.js'; import { EXPRESSJS_SERVER_TEMPLATE } from '../../templates/backend/expressjs/base/server.js'; @@ -22,6 +23,7 @@ import { import { ExpressJsPackageJsonTemplate } from '../../templates/backend/expressjs/base/package-json.js'; import { ExpressJsEnvironmentTemplate } from '../../templates/backend/expressjs/base/config.js'; import ora from 'ora'; +import { Postgres_Database_Server } from '../../templates/backend/nestjs/base/docker.js'; /** * loader @@ -67,6 +69,9 @@ export async function createBackendProject( // update app module file content writeToFile(`${destinationPath}/src/app.module.ts`, AppModuleContent); + // Create a folder for configs + createFolder(`${destinationPath}/src/common/configs`); + // add environment file writeToFile( `${destinationPath}/src/common/configs/environment.ts`, @@ -117,6 +122,42 @@ export async function createBackendProject( break; } break; + case 'postgres': + switch(orm) { + case 'typeorm': + // Create the databse module itself + createAndUpdateFile( + `${destinationPath}/src/module/v1/database/database.module.ts`, + TypeOrmDatabaseModule + ); + // Create an abstract entity provider for the database + createAndUpdateFile(`${destinationPath}/src/module/v1/database/abstract.entity.ts`, TypeOrmAbstractDocument); + + // create schema folder + createAndUpdateFile(`${destinationPath}/src/module/v1/user/entities/user.entity.ts`, TypeOrmEntity); + + // Create a docker-compose file to spin up database server + createAndUpdateFile(`${destinationPath}/docker-compose.yml`,Postgres_Database_Server); + + // add mongoose dependencies + packageJson.dependencies = { + ...packageJson.dependencies, + ...NEST_TYPEORM_PACKAGE.dependencies + }; + + // update environment + environmentInterface += `\nDB: { + HOST: string;\nPORT: number;\nUSER: string;\nPASSWORD: string;\nDATABASE: string\n}`; + environmentContent += `\n DB: { + HOST: process.env.DB_HOST, USER: process.env.DB_USER, DATABASE: process.env.DB_NAME, PASSWORD: process.env.DB_PASSWORD, PORT: process.env.DB_PORT}`; + + // update app module + appModules += 'DatabaseModule'; + appModuleImports += + 'import { DatabaseModule } from "./module/v1/database/database.module";'; + break; + + } } } diff --git a/src/utils/prompts.js b/src/utils/prompts.js index bb088f5..d12e96e 100644 --- a/src/utils/prompts.js +++ b/src/utils/prompts.js @@ -57,7 +57,7 @@ export async function promptDatabase() { type: 'list', name: 'database', message: 'select a database', - choices: ['MongoDB'] + choices: ['MongoDB', 'Postgres'] } ]); @@ -84,7 +84,7 @@ export async function promptOrm(database) { if (database === 'mongodb') { ormChoices = ['Mongoose']; } else { - ormChoices = ['Typeorm']; + ormChoices = ['Typeorm', 'Prisma']; } const ans = await inquirer.prompt([ diff --git a/templates/backend/nestjs/base/databases.js b/templates/backend/nestjs/base/databases.js index dc6e90a..c538739 100644 --- a/templates/backend/nestjs/base/databases.js +++ b/templates/backend/nestjs/base/databases.js @@ -38,4 +38,56 @@ import { ENVIRONMENT } from 'src/common/configs/environment'; imports: [MongooseModule.forRoot(ENVIRONMENT.DB.URL)], }) export class DatabaseModule {} +`; + +export const TypeOrmDatabaseModule = ` +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ENVIRONMENT } from 'src/common/configs/environment'; + +// At your terminal run: docker-compose up to start your database server +@Module({ + imports: [ + TypeOrmModule.forRoot({ + type: 'postgres', + host: ENVIRONMENT.DB.HOST || 'localhost', + port: 5435, + database: ENVIRONMENT.DB.DATABASE || 'startease', + username: ENVIRONMENT.DB.USER || 'root', + password: ENVIRONMENT.DB.PASSWORD || '123', + autoLoadEntities: true, + entities: [__dirname + '/../**/*.entity.{js,ts}'], + synchronize: true, // when production set to false + }) + ] +}) + +export class DatabaseModule {} +`; + +export const TypeOrmAbstractDocument = ` +import { PrimaryGeneratedColumn } from 'typeorm'; + +export class AbstractEntity { + @PrimaryGeneratedColumn() + id: number; + + constructor(entity: Partial) { + Object.assign(this, entity); + } +} +`; +export const TypeOrmEntity = ` +import { Entity, Column } from 'typeorm'; +import { AbstractEntity } from '../../database/abstract.entity'; + +@Entity() +export class User extends AbstractEntity { + + @Column('text') + email: string; + + @Column('text') + password: string; +} `; \ No newline at end of file diff --git a/templates/backend/nestjs/base/docker.js b/templates/backend/nestjs/base/docker.js new file mode 100644 index 0000000..0b81914 --- /dev/null +++ b/templates/backend/nestjs/base/docker.js @@ -0,0 +1,15 @@ +export const Postgres_Database_Server = `version: '0.0.1' +services: + startease-db: + image: postgres:15 + ports: + - 5435:5432 + environment: + POSTGRES_USER: root + POSTGRES_PASSWORD: 123 + POSTGRES_DB: startease + networks: + - typeorm-pro +networks: + typeorm-pro: +`; \ No newline at end of file diff --git a/templates/backend/nestjs/base/nestjs-package-json.js b/templates/backend/nestjs/base/nestjs-package-json.js index c100853..857d4c8 100644 --- a/templates/backend/nestjs/base/nestjs-package-json.js +++ b/templates/backend/nestjs/base/nestjs-package-json.js @@ -74,4 +74,12 @@ export const NEST_MONGOOSE_PACKAGE = { "@nestjs/mongoose": "^10.0.1", "mongoose": "^7.5.2", } +} + +export const NEST_TYPEORM_PACKAGE = { + "dependencies": { + "typeorm": "^0.3.17", + "@nestjs/typeorm": "^10.0.0", + "pg": "^8.11.3", + } } \ No newline at end of file