import { Module } from '@nestjs/common'; import { UsersModule } from './users/users.module'; import { FilesModule } from './files/files.module'; import { AuthModule } from './auth/auth.module'; import databaseConfig from './database/config/database.config'; import authConfig from './auth/config/auth.config'; import appConfig from './config/app.config'; import mailConfig from './mail/config/mail.config'; import fileConfig from './files/config/file.config'; import facebookConfig from './auth-facebook/config/facebook.config'; import googleConfig from './auth-google/config/google.config'; import twitterConfig from './auth-twitter/config/twitter.config'; import appleConfig from './auth-apple/config/apple.config'; import path from 'path'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AuthAppleModule } from './auth-apple/auth-apple.module'; import { AuthFacebookModule } from './auth-facebook/auth-facebook.module'; import { AuthGoogleModule } from './auth-google/auth-google.module'; import { AuthTwitterModule } from './auth-twitter/auth-twitter.module'; import { I18nModule } from 'nestjs-i18n/dist/i18n.module'; import { HeaderResolver } from 'nestjs-i18n'; import { TypeOrmConfigService } from './database/typeorm-config.service'; import { MailModule } from './mail/mail.module'; import { HomeModule } from './home/home.module'; import { DataSource, DataSourceOptions } from 'typeorm'; import { AllConfigType } from './config/config.type'; import { SessionModule } from './session/session.module'; import { MailerModule } from './mailer/mailer.module'; import { MongooseModule } from '@nestjs/mongoose'; import { MongooseConfigService } from './database/mongoose-config.service'; import { DatabaseConfig } from './database/config/database-config.type'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, load: [ databaseConfig, authConfig, appConfig, mailConfig, fileConfig, facebookConfig, googleConfig, twitterConfig, appleConfig, ], envFilePath: ['.env'], }), (databaseConfig() as DatabaseConfig).isDocumentDatabase ? MongooseModule.forRootAsync({ useClass: MongooseConfigService, }) : TypeOrmModule.forRootAsync({ useClass: TypeOrmConfigService, dataSourceFactory: async (options: DataSourceOptions) => { return new DataSource(options).initialize(); }, }), I18nModule.forRootAsync({ useFactory: (configService: ConfigService) => ({ fallbackLanguage: configService.getOrThrow('app.fallbackLanguage', { infer: true, }), loaderOptions: { path: path.join(__dirname, '/i18n/'), watch: true }, }), resolvers: [ { use: HeaderResolver, useFactory: (configService: ConfigService) => { return [ configService.get('app.headerLanguage', { infer: true, }), ]; }, inject: [ConfigService], }, ], imports: [ConfigModule], inject: [ConfigService], }), UsersModule, FilesModule, AuthModule, AuthFacebookModule, AuthGoogleModule, AuthTwitterModule, AuthAppleModule, SessionModule, MailModule, MailerModule, HomeModule, ], }) export class AppModule {}