cl-generate
Version:
A cross-platform CLI tool to generate NestJS clean architecture modules
149 lines (131 loc) • 4.27 kB
JavaScript
#!/usr/bin/env node
const fs = require("fs").promises;
const path = require("path");
const { promisify } = require("util");
const exec = promisify(require("child_process").exec);
const {
COLORS,
DOMAIN_DIR,
INFRASTRUCTURE_DIR,
} = require("../constants/index");
const createFile = require("../shares/createFile");
const createDir = require("../shares/createDir");
const { withLoading } = require("../shares/loadingSpinner");
// [Content remains unchanged until module.exports]
const EnvConfigModuleContent = `
import { Module } from '@nestjs/common';
import { EnvironmentConfigService } from './environment-config.service';
import { ConfigService } from '@nestjs/config';
@Module({
providers: [EnvironmentConfigService, ConfigService],
exports: [EnvironmentConfigService],
})
export class EnvironmentConfigModule {}\n
`;
const EnvConfigServiceContent = `
import { Injectable } from '@nestjs/common';
import { DatabaseConfigInterface } from '@domain/config/databaseConfig.interface';
import { ConfigService } from '@nestjs/config';
import * as dotenv from 'dotenv';
dotenv.config();
@Injectable()
export class EnvironmentConfigService implements DatabaseConfigInterface {
constructor(private readonly configService: ConfigService) {}
getDBHost(): string {
return this.configService.get<string>('DATABASE_HOST') ?? '';
}
getDBName(): string {
return this.configService.get<string>('DATABASE_DB') ?? '';
}
getDBPort(): number {
return this.configService.get<number>('DATABASE_PORT') ?? 5432;
}
getDBUser(): string {
return this.configService.get<string>('DATABASE_USER') ?? '';
}
getDBPass(): string {
return this.configService.get<string>('DATABASE_PASSWORD') ?? '';
}
}
`;
const TypeOrmModuleContent = `
import { Module } from '@nestjs/common';
import { EnvironmentConfigService } from '../environment-config/environment-config.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { EnvironmentConfigModule } from '../environment-config/environment-config.module';
import * as dotenv from 'dotenv';
dotenv.config();
export const getTypeOrmModuleOptions = (
config: EnvironmentConfigService,
): any => ({
type: 'postgres',
host: config.getDBHost(),
port: config.getDBPort(),
username: config.getDBUser(),
password: config.getDBPass(),
database: config.getDBName(),
entities: [],
synchronize: true,
});
@Module({
imports: [
TypeOrmModule.forRootAsync({
imports: [EnvironmentConfigModule],
inject: [EnvironmentConfigService],
useFactory: getTypeOrmModuleOptions,
}),
],
})
export class TypeOrmConfigModule {}
`;
module.exports = async function setupPostgres(packageManager = "npm") {
try {
const configSubDirs = ["environment-config", "typeorm"];
await withLoading("Creating configuration files", async () => {
await createFile(
path.join(DOMAIN_DIR, "config", "databaseConfig.interface.ts"),
`
/* eslint-disable prettier/prettier */
export interface DatabaseConfigInterface {
getDBHost(): string;
getDBName(): string;
getDBPort(): number;
getDBUser(): string;
getDBPass(): string;
}
`
);
for (const dir of configSubDirs) {
await createDir(path.join(INFRASTRUCTURE_DIR, "config", dir));
}
const files = {
"config/environment-config/environment-config.module.ts":
EnvConfigModuleContent,
"config/environment-config/environment-config.service.ts":
EnvConfigServiceContent,
"config/typeorm/typeorm.module.ts": TypeOrmModuleContent,
};
for (const [filePath, content] of Object.entries(files)) {
await createFile(path.join(INFRASTRUCTURE_DIR, filePath), content);
}
});
await withLoading("Installing dependencies", async () => {
await exec(
`${packageManager} ${
packageManager === "yarn" ? "add" : "install"
} @nestjs/typeorm typeorm pg --save`,
{
stdio: "inherit",
}
);
});
console.log(
`${COLORS.GREEN}✓ Postgres setup completed successfully${COLORS.NC}`
);
} catch (error) {
console.log(
`${COLORS.YELLOW}⚠ Can not setup postgres: ${error.message}${COLORS.NC}`
);
throw error;
}
};