@rytass/cms-base-nestjs-module
Version:
Rytass Content Management System NestJS Base Module
130 lines (127 loc) • 4.83 kB
JavaScript
import { Global, Module } from '@nestjs/common';
import { CMSBaseModelsModule } from './models/models.module.js';
import { ArticleBaseService } from './services/article-base.service.js';
import { CategoryBaseService } from './services/category-base.service.js';
import { ResolvedRepoProviders, TARGETS } from './constants/resolved-repo-providers.js';
import { CategoryDataLoader } from './data-loaders/category.dataloader.js';
import { CATEGORY_DATA_LOADER, ARTICLE_SIGNATURE_SERVICE, CMS_BASE_MODULE_OPTIONS } from './typings/cms-base-providers.js';
import { OptionProviders } from './constants/option-providers.js';
import { ArticleSignatureService } from './services/article-signature.service.js';
import { ArticleSignatureDataLoader } from './data-loaders/article-signature.dataloader.js';
function _ts_decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
class CMSBaseModule {
static forRootAsync(options) {
return {
module: CMSBaseModule,
imports: [
...options?.imports ?? [],
CMSBaseModelsModule
],
providers: [
...this.createAsyncProvider(options),
...OptionProviders,
...ResolvedRepoProviders,
CategoryDataLoader,
{
provide: CATEGORY_DATA_LOADER,
useExisting: CategoryDataLoader
},
ArticleSignatureService,
{
provide: ARTICLE_SIGNATURE_SERVICE,
useExisting: ArticleSignatureService
},
ArticleBaseService,
CategoryBaseService,
ArticleSignatureDataLoader
],
exports: [
...TARGETS.map(([, , resolved])=>resolved),
ArticleBaseService,
CategoryBaseService,
ArticleSignatureService,
CategoryDataLoader,
ArticleSignatureDataLoader
]
};
}
static forRoot(options) {
return {
module: CMSBaseModule,
imports: [
CMSBaseModelsModule
],
providers: [
{
provide: CMS_BASE_MODULE_OPTIONS,
useValue: options
},
...OptionProviders,
...ResolvedRepoProviders,
CategoryDataLoader,
{
provide: CATEGORY_DATA_LOADER,
useExisting: CategoryDataLoader
},
ArticleSignatureService,
{
provide: ARTICLE_SIGNATURE_SERVICE,
useExisting: ArticleSignatureService
},
ArticleBaseService,
CategoryBaseService,
ArticleSignatureDataLoader
],
exports: [
...TARGETS.map(([, , resolved])=>resolved),
ArticleBaseService,
CategoryBaseService,
ArticleSignatureService,
CategoryDataLoader,
ArticleSignatureDataLoader
]
};
}
static createAsyncProvider(options) {
if (options.useExisting || options.useFactory) {
return [
this.createAsyncOptionsProvider(options)
];
}
return [
this.createAsyncOptionsProvider(options),
...options.useClass ? [
{
provide: options.useClass,
useClass: options.useClass
}
] : []
];
}
static createAsyncOptionsProvider(options) {
if (options.useFactory) {
return {
provide: CMS_BASE_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || []
};
}
return {
provide: CMS_BASE_MODULE_OPTIONS,
useFactory: async (optionsFactory)=>await optionsFactory.createCMSOptions(),
inject: [
options.useExisting || options.useClass
]
};
}
}
CMSBaseModule = _ts_decorate([
Global(),
Module({})
], CMSBaseModule);
export { CMSBaseModule };