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
JavaScript
"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