From 4a9e07fc73004d507ceee50a5370b62089c846ea Mon Sep 17 00:00:00 2001 From: Sinan997 Date: Mon, 6 May 2024 16:29:51 +0300 Subject: [PATCH] add provider function for modules --- .../apps/dev-app/src/app/app.module.ts | 32 ++++--- .../packages/core/src/lib/core.module.ts | 94 +++++++++++++++++-- .../packages/oauth/src/lib/oauth.module.ts | 54 ++++++++++- .../lib/setting-management-config.module.ts | 13 ++- .../src/lib/theme-shared.module.ts | 63 ++++++++++++- 5 files changed, 232 insertions(+), 24 deletions(-) diff --git a/npm/ng-packs/apps/dev-app/src/app/app.module.ts b/npm/ng-packs/apps/dev-app/src/app/app.module.ts index 9aa422623f..ec35d06bdf 100644 --- a/npm/ng-packs/apps/dev-app/src/app/app.module.ts +++ b/npm/ng-packs/apps/dev-app/src/app/app.module.ts @@ -1,13 +1,17 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CoreModule } from '@abp/ng.core'; +import { CoreModule, provideCoreModule } from '@abp/ng.core'; import { registerLocale } from '@abp/ng.core/locale'; -import { InternetConnectionStatusComponent, ThemeSharedModule } from '@abp/ng.theme.shared'; +import { + InternetConnectionStatusComponent, + ThemeSharedModule, + provideThemeShared, +} from '@abp/ng.theme.shared'; import { ThemeLeptonXModule } from '@abp/ng.theme.lepton-x'; import { SideMenuLayoutModule } from '@abp/ng.theme.lepton-x/layouts'; -import { AbpOAuthModule } from '@abp/ng.oauth'; -import { SettingManagementConfigModule } from '@abp/ng.setting-management/config'; +import { provideAbpOAuth } from '@abp/ng.oauth'; +import { provideSettingManagementConfig } from '@abp/ng.setting-management/config'; import { provideAccountConfig } from '@abp/ng.account/config'; import { provideIdentityConfig } from '@abp/ng.identity/config'; import { provideTenantManagementConfig } from '@abp/ng.tenant-management/config'; @@ -23,15 +27,8 @@ import { APP_ROUTE_PROVIDER } from './route.provider'; BrowserModule, BrowserAnimationsModule, AppRoutingModule, - CoreModule.forRoot({ - environment, - registerLocaleFn: registerLocale(), - sendNullsAsQueryParam: false, - skipGetAppConfiguration: false, - }), - AbpOAuthModule.forRoot(), - ThemeSharedModule.forRoot(), - SettingManagementConfigModule.forRoot(), + CoreModule, + ThemeSharedModule, ThemeLeptonXModule.forRoot(), SideMenuLayoutModule.forRoot(), AccountLayoutModule.forRoot(), @@ -39,6 +36,15 @@ import { APP_ROUTE_PROVIDER } from './route.provider'; ], providers: [ APP_ROUTE_PROVIDER, + provideCoreModule({ + environment, + registerLocaleFn: registerLocale(), + sendNullsAsQueryParam: false, + skipGetAppConfiguration: false, + }), + provideAbpOAuth(), + provideThemeShared(), + provideSettingManagementConfig(), provideAccountConfig(), provideIdentityConfig(), provideTenantManagementConfig(), diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index eb475074ce..4c3de0f955 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -1,6 +1,12 @@ import { CommonModule } from '@angular/common'; import { HttpClientModule, HttpClientXsrfModule } from '@angular/common/http'; -import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; +import { + APP_INITIALIZER, + Injector, + ModuleWithProviders, + NgModule, + makeEnvironmentProviders, +} from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule, TitleStrategy } from '@angular/router'; import { AbstractNgModelComponent } from './abstracts/ng-model.component'; @@ -40,12 +46,11 @@ import { DefaultQueueManager } from './utils/queue'; import { IncludeLocalizationResourcesProvider } from './providers/include-localization-resources.provider'; import { SORT_COMPARE_FUNC, compareFuncFactory } from './tokens/compare-func.token'; import { AuthErrorFilterService } from './abstracts'; -import { DYNAMIC_LAYOUTS_TOKEN } from "./tokens/dynamic-layout.token"; -import { DEFAULT_DYNAMIC_LAYOUTS } from "./constants"; +import { DYNAMIC_LAYOUTS_TOKEN } from './tokens/dynamic-layout.token'; +import { DEFAULT_DYNAMIC_LAYOUTS } from './constants'; import { AbpTitleStrategy } from './services/title-strategy.service'; import { LocalStorageListenerService } from './services/local-storage-listener.service'; - const standaloneDirectives = [ AutofocusDirective, InputEventDebounceDirective, @@ -201,12 +206,12 @@ export class CoreModule { IncludeLocalizationResourcesProvider, { provide: DYNAMIC_LAYOUTS_TOKEN, - useValue: options.dynamicLayouts || DEFAULT_DYNAMIC_LAYOUTS + useValue: options.dynamicLayouts || DEFAULT_DYNAMIC_LAYOUTS, }, { provide: TitleStrategy, - useExisting: AbpTitleStrategy - } + useExisting: AbpTitleStrategy, + }, ], }; } @@ -225,3 +230,78 @@ export class CoreModule { }; } } + +export function provideCoreModule(options = {} as ABP.Root) { + return makeEnvironmentProviders([ + LocaleProvider, + CookieLanguageProvider, + { + provide: 'CORE_OPTIONS', + useValue: options, + }, + { + provide: CORE_OPTIONS, + useFactory: coreOptionsFactory, + deps: ['CORE_OPTIONS'], + }, + { + provide: APP_INITIALIZER, + multi: true, + deps: [Injector], + useFactory: getInitialData, + }, + { + provide: APP_INITIALIZER, + multi: true, + deps: [Injector], + useFactory: localeInitializer, + }, + { + provide: APP_INITIALIZER, + multi: true, + deps: [LocalizationService], + useFactory: noop, + }, + { + provide: APP_INITIALIZER, + multi: true, + deps: [LocalStorageListenerService], + useFactory: noop, + }, + { + provide: APP_INITIALIZER, + multi: true, + deps: [RoutesHandler], + useFactory: noop, + }, + { provide: TENANT_KEY, useValue: options.tenantKey || '__tenant' }, + { + provide: LOCALIZATIONS, + multi: true, + useValue: localizationContributor(options.localizations), + deps: [LocalizationService], + }, + { + provide: SORT_COMPARE_FUNC, + useFactory: compareFuncFactory, + }, + { + provide: QUEUE_MANAGER, + useClass: DefaultQueueManager, + }, + { + provide: OTHERS_GROUP, + useValue: options.othersGroup || 'AbpUi::OthersGroup', + }, + AuthErrorFilterService, + IncludeLocalizationResourcesProvider, + { + provide: DYNAMIC_LAYOUTS_TOKEN, + useValue: options.dynamicLayouts || DEFAULT_DYNAMIC_LAYOUTS, + }, + { + provide: TitleStrategy, + useExisting: AbpTitleStrategy, + }, + ]); +} diff --git a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts index 2adac2a23a..ccf968e0dd 100644 --- a/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts +++ b/npm/ng-packs/packages/oauth/src/lib/oauth.module.ts @@ -1,4 +1,10 @@ -import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angular/core'; +import { + APP_INITIALIZER, + ModuleWithProviders, + NgModule, + Provider, + makeEnvironmentProviders, +} from '@angular/core'; import { CommonModule } from '@angular/common'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; @@ -71,3 +77,49 @@ export class AbpOAuthModule { }; } } + +export function provideAbpOAuth() { + const providers = [ + { + provide: AuthService, + useClass: AbpOAuthService, + }, + { + provide: AuthGuard, + useClass: AbpOAuthGuard, + }, + { + provide: authGuard, + useValue: abpOAuthGuard, + }, + { + provide: ApiInterceptor, + useClass: OAuthApiInterceptor, + }, + { + provide: PIPE_TO_LOGIN_FN_KEY, + useValue: pipeToLogin, + }, + { + provide: CHECK_AUTHENTICATION_STATE_FN_KEY, + useValue: checkAccessToken, + }, + { + provide: HTTP_INTERCEPTORS, + useExisting: ApiInterceptor, + multi: true, + }, + NavigateToManageProfileProvider, + { + provide: APP_INITIALIZER, + multi: true, + deps: [OAuthConfigurationHandler], + useFactory: noop, + }, + OAuthModule.forRoot().providers as Provider[], + { provide: OAuthStorage, useClass: AbpLocalStorageService }, + { provide: AuthErrorFilterService, useExisting: OAuthErrorFilterService }, + ]; + + return makeEnvironmentProviders(providers); +} diff --git a/npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts b/npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts index 60f567c31a..4463f11d06 100644 --- a/npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts +++ b/npm/ng-packs/packages/setting-management/config/src/lib/setting-management-config.module.ts @@ -1,5 +1,5 @@ import { ThemeSharedModule } from '@abp/ng.theme.shared'; -import { ModuleWithProviders, NgModule } from '@angular/core'; +import { ModuleWithProviders, NgModule, makeEnvironmentProviders } from '@angular/core'; import { CoreModule } from '@abp/ng.core'; import { NgxValidateCoreModule } from '@ngx-validate/core'; import { SETTING_MANAGEMENT_FEATURES_PROVIDERS } from './providers/features.token'; @@ -9,7 +9,7 @@ import { SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS } from './providers/setting-ta import { EmailSettingGroupComponent } from './components/email-setting-group/email-setting-group.component'; @NgModule({ - imports: [CoreModule,ThemeSharedModule,NgxValidateCoreModule], + imports: [CoreModule, ThemeSharedModule, NgxValidateCoreModule], declarations: [EmailSettingGroupComponent], exports: [EmailSettingGroupComponent], }) @@ -26,3 +26,12 @@ export class SettingManagementConfigModule { }; } } + +export function provideSettingManagementConfig() { + return makeEnvironmentProviders([ + SETTING_MANAGEMENT_ROUTE_PROVIDERS, + SETTING_MANAGEMENT_SETTING_TAB_PROVIDERS, + SETTING_MANAGEMENT_FEATURES_PROVIDERS, + SETTING_MANAGEMENT_VISIBLE_PROVIDERS, + ]); +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 4b092642c1..5f870be562 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -1,6 +1,11 @@ import { CoreModule, noop } from '@abp/ng.core'; import { DatePipe } from '@angular/common'; -import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; +import { + APP_INITIALIZER, + ModuleWithProviders, + NgModule, + makeEnvironmentProviders, +} from '@angular/core'; import { NgbDateParserFormatter, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; import { defaultMapErrorsFn, @@ -150,3 +155,59 @@ export class ThemeSharedModule { }; } } + +export function provideThemeShared( + { httpErrorConfig, validation = {}, confirmationIcons = {} } = {} as RootParams, +) { + const providers = [ + { + provide: APP_INITIALIZER, + multi: true, + deps: [ErrorHandler], + useFactory: noop, + }, + THEME_SHARED_ROUTE_PROVIDERS, + { + provide: APP_INITIALIZER, + multi: true, + deps: [THEME_SHARED_APPEND_CONTENT], + useFactory: noop, + }, + { provide: HTTP_ERROR_CONFIG, useValue: httpErrorConfig }, + { provide: NgbDateParserFormatter, useClass: DateParserFormatter }, + NG_BOOTSTRAP_CONFIG_PROVIDERS, + { + provide: VALIDATION_BLUEPRINTS, + useValue: { + ...DEFAULT_VALIDATION_BLUEPRINTS, + ...(validation.blueprints || {}), + }, + }, + { + provide: VALIDATION_MAP_ERRORS_FN, + useValue: validation.mapErrorsFn || defaultMapErrorsFn, + }, + { + provide: VALIDATION_VALIDATE_ON_SUBMIT, + useValue: validation.validateOnSubmit, + }, + DocumentDirHandlerService, + { + provide: APP_INITIALIZER, + useFactory: noop, + multi: true, + deps: [DocumentDirHandlerService], + }, + { + provide: CONFIRMATION_ICONS, + useValue: { + ...DEFAULT_CONFIRMATION_ICONS, + ...(confirmationIcons || {}), + }, + }, + tenantNotFoundProvider, + DEFAULT_HANDLERS_PROVIDERS, + ]; + + return makeEnvironmentProviders(providers); +}