UNPKG

js-mvc-app

Version:

A CLI tool to scaffold complete Node.js MVC projects with TypeScript, just like Laravel

224 lines (212 loc) 7.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getNestJSMain = getNestJSMain; exports.getNestJSAppModule = getNestJSAppModule; exports.getNestJSPackageJson = getNestJSPackageJson; function getNestJSMain(config) { const { language } = config; const fileExt = language === 'typescript' ? 'ts' : 'js'; return `import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { AppModule } from './app.module'; import { AllExceptionsFilter } from './common/filters/all-exceptions.filter'; import { LoggingInterceptor } from './common/interceptors/logging.interceptor'; import { TransformInterceptor } from './common/interceptors/transform.interceptor'; async function bootstrap() { const app = await NestFactory.create(AppModule); // Global prefix app.setGlobalPrefix('api'); // Global pipes app.useGlobalPipes( new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, }), ); // Global filters app.useGlobalFilters(new AllExceptionsFilter()); // Global interceptors app.useGlobalInterceptors( new LoggingInterceptor(), new TransformInterceptor(), ); // CORS app.enableCors({ origin: process.env.CORS_ORIGIN || '*', credentials: true, }); ${config.extras.includes('swagger') ? ` // Swagger documentation const swaggerConfig = new DocumentBuilder() .setTitle('Node MVC API') .setDescription('A comprehensive Node.js MVC API built with NestJS') .setVersion('1.0') .addBearerAuth() .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); SwaggerModule.setup('api/docs', app, document); ` : ''} const port = process.env.PORT || 3000; await app.listen(port); console.log(\`🚀 Application is running on: http://localhost:\${port}\`); ${config.extras.includes('swagger') ? `console.log(\`📖 Swagger docs available at: http://localhost:\${port}/api/docs\`);` : ''} } bootstrap(); `; } function getNestJSAppModule(config) { const { database } = config; let databaseImport = ''; let databaseModule = ''; if (database === 'mongodb') { databaseImport = `import { MongooseModule } from '@nestjs/mongoose';`; databaseModule = `MongooseModule.forRoot(process.env.MONGODB_URI || 'mongodb://localhost:27017/nodeapp'),`; } else { databaseImport = `import { TypeOrmModule } from '@nestjs/typeorm'; import { typeOrmConfig } from './config/database.config';`; databaseModule = `TypeOrmModule.forRootAsync(typeOrmConfig),`; } return `import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { APP_GUARD } from '@nestjs/core'; ${databaseImport} import { AuthModule } from './auth/auth.module'; import { UsersModule } from './users/users.module'; import { HealthModule } from './health/health.module'; ${config.extras.includes('guards') ? `import { JwtAuthGuard } from './auth/guards/jwt-auth.guard';` : ''} @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: '.env', }), ${databaseModule} AuthModule, UsersModule, HealthModule, ], controllers: [], providers: [ ${config.extras.includes('guards') ? ` { provide: APP_GUARD, useClass: JwtAuthGuard, }, ` : ''} ], }) export class AppModule {} `; } function getNestJSPackageJson(projectName, config) { const { language, database, extras } = config; const baseDependencies = { '@nestjs/common': '^10.0.0', '@nestjs/core': '^10.0.0', '@nestjs/platform-express': '^10.0.0', '@nestjs/config': '^3.0.0', '@nestjs/jwt': '^10.0.0', '@nestjs/passport': '^10.0.0', 'passport': '^0.6.0', 'passport-jwt': '^4.0.1', 'passport-local': '^1.0.0', 'bcryptjs': '^2.4.3', 'class-validator': '^0.14.0', 'class-transformer': '^0.5.1', 'reflect-metadata': '^0.1.13', 'rxjs': '^7.8.1' }; const baseDevDependencies = { '@nestjs/cli': '^10.0.0', '@nestjs/schematics': '^10.0.0', '@nestjs/testing': '^10.0.0', 'jest': '^29.5.0', 'supertest': '^6.3.3' }; if (language === 'typescript') { Object.assign(baseDevDependencies, { 'typescript': '^5.1.3', '@types/node': '^20.3.1', '@types/express': '^4.17.17', '@types/bcryptjs': '^2.4.2', '@types/passport-jwt': '^3.0.8', '@types/passport-local': '^1.0.35', '@types/jest': '^29.5.2', '@types/supertest': '^2.0.12', 'ts-jest': '^29.1.0', 'ts-loader': '^9.4.3', 'ts-node': '^10.9.1', 'tsconfig-paths': '^4.2.0' }); } if (database === 'mongodb') { baseDependencies['@nestjs/mongoose'] = '^10.0.0'; baseDependencies['mongoose'] = '^7.3.0'; } else { baseDependencies['@nestjs/typeorm'] = '^10.0.0'; baseDependencies['typeorm'] = '^0.3.17'; switch (database) { case 'mysql': baseDependencies['mysql2'] = '^3.3.3'; break; case 'postgresql': baseDependencies['pg'] = '^8.11.0'; if (language === 'typescript') { baseDevDependencies['@types/pg'] = '^8.10.0'; } break; case 'sqlite': baseDependencies['sqlite3'] = '^5.1.6'; break; } } if (extras.includes('swagger')) { baseDependencies['@nestjs/swagger'] = '^7.0.0'; } if (extras.includes('testing')) { baseDevDependencies['@nestjs/testing'] = '^10.0.0'; } const packageJson = { name: projectName, version: '0.0.1', description: 'A NestJS MVC application', author: '', private: true, license: 'MIT', scripts: { 'build': 'nest build', 'format': 'prettier --write "src/**/*.ts" "test/**/*.ts"', 'start': 'nest start', 'start:dev': 'nest start --watch', 'start:debug': 'nest start --debug --watch', 'start:prod': 'node dist/main', 'lint': 'eslint "{src,apps,libs,test}/**/*.ts" --fix', 'test': 'jest', 'test:watch': 'jest --watch', 'test:cov': 'jest --coverage', 'test:debug': 'node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand', 'test:e2e': 'jest --config ./test/jest-e2e.json' }, dependencies: baseDependencies, devDependencies: baseDevDependencies, jest: { 'moduleFileExtensions': ['js', 'json', 'ts'], 'rootDir': 'src', 'testRegex': '.*\\.spec\\.ts$', 'transform': { '^.+\\.(t|j)s$': 'ts-jest' }, 'collectCoverageFrom': [ '**/*.(t|j)s' ], 'coverageDirectory': '../coverage', 'testEnvironment': 'node' } }; return JSON.stringify(packageJson, null, 2); } //# sourceMappingURL=app.js.map