AAE-37287 provideExtensions provider api for Angular standalone (#11103)

* provideExtensions provider api for Angular standalone

* improved typing
This commit is contained in:
Denys Vuika
2025-08-06 13:38:52 -04:00
committed by GitHub
parent 67b1d67668
commit 5213621023
4 changed files with 61 additions and 6 deletions

View File

@@ -15,8 +15,10 @@
* limitations under the License.
*/
import { EnvironmentProviders, inject, provideAppInitializer, Provider } from '@angular/core';
import { EnvironmentProviders, inject, provideAppInitializer, Provider, Type } from '@angular/core';
import { AppExtensionService } from './services/app-extension.service';
import { ExtensionService } from './services/extension.service';
import { RuleEvaluator } from './config/rule.extensions';
/**
* Provides all necessary entries for the app extensibility
@@ -30,3 +32,56 @@ export function provideAppExtensions(): (Provider | EnvironmentProviders)[] {
})
];
}
/**
* Provides a way to register extension entities in a single API
*
* Example:
* ```typescript
* providers: [
* provideExtensions({
* authGuards: {
* auth1: guard1,
* auth2: guard2
* },
* evaluators: {
* eval1: evaluator1,
* eval2: evaluator2
* },
* components: {
* component: component1
* }
* });
* ]
* ```
* @param params Parameters for the api
* @param params.authGuards Auth guards to register
* @param params.evaluators Rule evaluators to register
* @param params.components Components to register
* @returns list of Angular providers
*/
export function provideExtensions(params: {
authGuards?: Record<string, unknown>;
evaluators?: Record<string, RuleEvaluator>;
components?: Record<string, Type<any>>;
}) {
return [
provideAppInitializer(() => {
const service = inject(ExtensionService);
if (params) {
if (params.authGuards) {
service.setAuthGuards(params.authGuards);
}
if (params.evaluators) {
service.setEvaluators(params.evaluators);
}
if (params.components) {
service.setComponents(params.components);
}
}
return Promise.resolve();
})
];
}

View File

@@ -25,9 +25,9 @@ export interface ExtensionComponent {
@Injectable({ providedIn: 'root' })
export class ComponentRegisterService {
components: { [key: string]: Type<any> } = {};
components: Record<string, Type<any>> = {};
setComponents(values: { [key: string]: Type<any> }) {
setComponents(values: Record<string, Type<any>>) {
if (values) {
this.components = Object.assign({}, this.components, values);
}

View File

@@ -154,7 +154,7 @@ export class ExtensionService {
* Adds one or more new rule evaluators to the existing set.
* @param values The new evaluators to add
*/
setEvaluators(values: { [key: string]: RuleEvaluator }) {
setEvaluators(values: Record<string, RuleEvaluator>) {
this.ruleService.setEvaluators(values);
}
@@ -172,7 +172,7 @@ export class ExtensionService {
* Adds one or more new components to the existing set.
* @param values The new components to add
*/
setComponents(values: { [key: string]: Type<any> }) {
setComponents(values: Record<string, Type<any>>) {
this.componentRegister.setComponents(values);
}

View File

@@ -38,7 +38,7 @@ export class RuleService {
* Adds one or more new rule evaluators to the existing set.
* @param values The new evaluators to add
*/
setEvaluators(values: { [key: string]: RuleEvaluator }) {
setEvaluators(values: Record<string, RuleEvaluator>) {
if (values) {
this.evaluators = Object.assign({}, this.evaluators, values);
}