ng-dynamic-component
Version:
> Dynamic components with full life-cycle support for inputs and outputs
1 lines • 67.3 kB
Source Map (JSON)
{"version":3,"file":"ng-dynamic-component.mjs","sources":["../../../projects/ng-dynamic-component/src/lib/component-injector/token.ts","../../../projects/ng-dynamic-component/src/lib/component-io/classic-component-io.ts","../../../projects/ng-dynamic-component/src/lib/component-io/component-io.ts","../../../projects/ng-dynamic-component/src/lib/io/event-argument.ts","../../../projects/ng-dynamic-component/src/lib/io/event-context.ts","../../../projects/ng-dynamic-component/src/lib/io/io.service.ts","../../../projects/ng-dynamic-component/src/lib/io/io-factory.service.ts","../../../projects/ng-dynamic-component/src/lib/component-outlet/component-outlet-io.directive.ts","../../../projects/ng-dynamic-component/src/lib/component-outlet/component-outlet-injector.directive.ts","../../../projects/ng-dynamic-component/src/lib/component-outlet/component-outlet-injector.module.ts","../../../projects/ng-dynamic-component/src/lib/dynamic-attributes/dynamic-attributes.directive.ts","../../../projects/ng-dynamic-component/src/lib/dynamic-attributes/dynamic-attributes.module.ts","../../../projects/ng-dynamic-component/src/lib/util.ts","../../../projects/ng-dynamic-component/src/lib/reflect/reflect.service.ts","../../../projects/ng-dynamic-component/src/lib/dynamic-directives/dynamic-directives.directive.ts","../../../projects/ng-dynamic-component/src/lib/dynamic-directives/dynamic-directives.module.ts","../../../projects/ng-dynamic-component/src/lib/dynamic-io/dynamic-io.directive.ts","../../../projects/ng-dynamic-component/src/lib/dynamic-io/dynamic-io.module.ts","../../../projects/ng-dynamic-component/src/lib/dynamic.component.ts","../../../projects/ng-dynamic-component/src/lib/dynamic.module.ts","../../../projects/ng-dynamic-component/src/public-api.ts","../../../projects/ng-dynamic-component/src/ng-dynamic-component.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { DynamicComponentInjector } from './component-injector';\n\n/**\n * @public\n */\nexport const DynamicComponentInjectorToken =\n new InjectionToken<DynamicComponentInjector>('DynamicComponentInjector');\n","import { isObservable, Observable } from 'rxjs';\nimport { ComponentInputKey, ComponentIO } from './component-io';\nimport { ComponentRef, Injectable } from '@angular/core';\n\n/** @internal */\n@Injectable()\nexport class ClassicComponentIO implements ComponentIO {\n setInput<T, K extends ComponentInputKey<T>>(\n componentRef: ComponentRef<T>,\n name: K,\n value: T[K],\n ): void {\n componentRef.setInput(name, value);\n }\n\n getOutput<T, K extends ComponentInputKey<T>>(\n componentRef: ComponentRef<T>,\n name: K,\n ): Observable<unknown> {\n const output = componentRef.instance[name];\n\n if (!isObservable(output)) {\n throw new Error(`Component ${name} is not an output!`);\n }\n\n return output;\n }\n}\n","import { ComponentRef, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { ClassicComponentIO } from './classic-component-io';\n\n/** @public */\n@Injectable({ providedIn: 'root', useClass: ClassicComponentIO })\nexport abstract class ComponentIO {\n abstract setInput<T, K extends ComponentInputKey<T>>(\n componentRef: ComponentRef<T>,\n name: K,\n value: T[K],\n ): void;\n abstract getOutput<T, K extends ComponentInputKey<T>>(\n componentRef: ComponentRef<T>,\n name: K,\n ): Observable<unknown>;\n}\n\n/** @public */\nexport type ComponentInputKey<T> = keyof T & string;\n","import { InjectionToken } from '@angular/core';\n\n/**\n * @public\n */\nexport function defaultEventArgumentFactory() {\n return '$event';\n}\n\n/**\n * @public\n */\nexport const IoEventArgumentToken = new InjectionToken<string>(\n 'EventArgument',\n {\n providedIn: 'root',\n factory: defaultEventArgumentFactory,\n },\n);\n\n/**\n * @public\n * @deprecated Since v10.4.0 - Use {@link IoEventArgumentToken} instead!\n */\nexport const EventArgumentToken = IoEventArgumentToken;\n","import { InjectionToken, StaticProvider } from '@angular/core';\n\n/**\n * A token that holds custom context of the output handlers\n *\n * @public\n */\nexport const IoEventContextToken = new InjectionToken<unknown>(\n 'IoEventContext',\n);\n\n/**\n * A token that holds provider for custom context of the output handlers\n * which should be provided using {@link IoEventContextToken} token\n *\n * @public\n */\nexport const IoEventContextProviderToken = new InjectionToken<StaticProvider>(\n 'IoEventContextProvider',\n);\n","import {\n ChangeDetectorRef,\n ComponentFactory,\n ComponentFactoryResolver,\n ComponentRef,\n Inject,\n Injectable,\n Injector,\n KeyValueChangeRecord,\n KeyValueChanges,\n KeyValueDiffers,\n OnDestroy,\n Optional,\n StaticProvider,\n Type,\n} from '@angular/core';\nimport { merge, Subject } from 'rxjs';\nimport { takeUntil, tap } from 'rxjs/operators';\n\nimport {\n DynamicComponentInjector,\n DynamicComponentInjectorToken,\n} from '../component-injector';\nimport { ComponentIO } from '../component-io';\nimport { IoEventArgumentToken } from './event-argument';\nimport {\n IoEventContextProviderToken,\n IoEventContextToken,\n} from './event-context';\nimport { EventHandler, InputsType, OutputsType, OutputWithArgs } from './types';\n\ninterface IOMapInfo {\n propName: string;\n templateName: string;\n}\n\ntype IOMappingList = IOMapInfo[];\n\ntype KeyValueChangesAny = KeyValueChanges<string, unknown>;\n\ninterface OutputsTypeProcessed extends OutputsType {\n [k: string]: EventHandler;\n}\n\ninterface AnyComponent extends Record<string, unknown> {}\n\n/**\n * @public\n */\n@Injectable({ providedIn: 'root' })\nexport class IoServiceOptions {\n trackOutputChanges = false;\n}\n\n/**\n * @public\n */\n@Injectable()\nexport class IoService implements OnDestroy {\n private lastComponentInst: unknown;\n private lastChangedInputs = new Set<string>();\n private inputsDiffer = this.differs.find({}).create();\n // TODO: Replace ComponentFactory once new API is created\n // @see https://github.com/angular/angular/issues/44926\n // eslint-disable-next-line deprecation/deprecation\n private compFactory?: ComponentFactory<AnyComponent>;\n private outputsShouldDisconnect$ = new Subject<void>();\n private outputsEventContext: unknown;\n\n private inputs: InputsType = {};\n private outputs: OutputsType = {};\n\n private get compRef() {\n return this.compInjector.componentRef as ComponentRef<AnyComponent> | null;\n }\n\n private get componentInst() {\n return this.compRef?.instance;\n }\n\n constructor(\n private readonly injector: Injector,\n private readonly differs: KeyValueDiffers,\n // TODO: Replace ComponentFactoryResolver once new API is created\n // @see https://github.com/angular/angular/issues/44926\n // eslint-disable-next-line deprecation/deprecation\n private readonly cfr: ComponentFactoryResolver,\n private readonly options: IoServiceOptions,\n @Inject(DynamicComponentInjectorToken)\n private readonly compInjector: DynamicComponentInjector,\n @Inject(IoEventArgumentToken)\n private readonly eventArgument: string,\n private readonly cdr: ChangeDetectorRef,\n @Inject(IoEventContextProviderToken)\n @Optional()\n private readonly eventContextProvider: StaticProvider,\n private readonly componentIO: ComponentIO,\n ) {\n if (this.options.trackOutputChanges) {\n const outputsDiffer = this.differs.find({}).create();\n this.outputsChanged = (outputs) => !!outputsDiffer.diff(outputs);\n }\n }\n\n ngOnDestroy(): void {\n this.disconnectOutputs();\n }\n\n /**\n * Call update whenever inputs/outputs may or did change.\n *\n * It will detect both new and mutated changes.\n */\n update(inputs?: InputsType | null, outputs?: OutputsType | null): void {\n if (!this.compRef) {\n this.disconnectOutputs();\n return;\n }\n\n const changes = this.updateIO(inputs, outputs);\n\n const compChanged = this.isComponentInstChanged();\n\n const inputsChanges = this.getInputsChanges(compChanged);\n const outputsChanged = this.outputsChanged(this.outputs);\n\n if (inputsChanges) {\n this.updateChangedInputs(inputsChanges);\n }\n\n if (compChanged || inputsChanges) {\n this.updateInputs(compChanged || !this.lastChangedInputs.size);\n }\n\n if (compChanged || outputsChanged || changes.outputsChanged) {\n this.bindOutputs();\n }\n }\n\n private outputsChanged(outputs: OutputsType) {\n return false;\n }\n\n private isComponentInstChanged(): boolean {\n if (this.lastComponentInst !== this.componentInst) {\n this.lastComponentInst = this.componentInst;\n return true;\n } else {\n return false;\n }\n }\n\n private updateIO(inputs?: InputsType | null, outputs?: OutputsType | null) {\n if (!inputs) {\n inputs = {};\n }\n if (!outputs) {\n outputs = {};\n }\n\n const inputsChanged = this.inputs !== inputs;\n const outputsChanged = this.outputs !== outputs;\n\n this.inputs = inputs;\n this.outputs = outputs;\n\n return { inputsChanged, outputsChanged };\n }\n\n private updateInputs(isFirstChange = false) {\n if (isFirstChange) {\n this.updateCompFactory();\n }\n\n const compRef = this.compRef;\n const inputs = this.inputs;\n\n if (!inputs || !compRef) {\n return;\n }\n\n const ifInputChanged = this.lastChangedInputs.size\n ? (name: string) => this.lastChangedInputs.has(name)\n : () => true;\n\n const componentIO = this.componentIO;\n\n for (const name of Object.keys(inputs)) {\n if (ifInputChanged(name)) {\n componentIO.setInput(compRef, name, inputs[name]);\n }\n }\n }\n\n private bindOutputs() {\n this.disconnectOutputs();\n\n const compRef = this.compRef;\n const outputs = this.outputs;\n\n if (!outputs || !compRef) {\n return;\n }\n\n const resolvedOutputs = this.resolveOutputs(outputs);\n const componentIO = this.componentIO;\n\n merge(\n ...Object.keys(resolvedOutputs).map((name) =>\n componentIO\n .getOutput(compRef, name)\n .pipe(tap((event) => resolvedOutputs[name](event))),\n ),\n )\n .pipe(takeUntil(this.outputsShouldDisconnect$))\n .subscribe(() => this.cdr.markForCheck());\n }\n\n private disconnectOutputs() {\n this.outputsShouldDisconnect$.next();\n }\n\n private getInputsChanges(isCompChanged: boolean) {\n if (isCompChanged) {\n this.inputsDiffer.diff({});\n }\n\n return this.inputsDiffer.diff(this.inputs);\n }\n\n private updateChangedInputs(differ: KeyValueChangesAny) {\n this.lastChangedInputs.clear();\n\n const addRecordKeyToSet = (record: KeyValueChangeRecord<string, unknown>) =>\n this.lastChangedInputs.add(record.key);\n\n differ.forEachAddedItem(addRecordKeyToSet);\n differ.forEachChangedItem(addRecordKeyToSet);\n differ.forEachRemovedItem(addRecordKeyToSet);\n }\n\n // TODO: Replace ComponentFactory once new API is created\n // @see https://github.com/angular/angular/issues/44926\n // eslint-disable-next-line deprecation/deprecation\n private resolveCompFactory() {\n if (!this.compRef) {\n return;\n }\n\n try {\n try {\n return this.cfr.resolveComponentFactory(this.compRef.componentType);\n } catch (e) {\n // Fallback if componentType does not exist (happens on NgComponentOutlet)\n return this.cfr.resolveComponentFactory(\n (this.compRef.instance as any).constructor as Type<AnyComponent>,\n );\n }\n } catch (e) {\n // Factory not available - bailout\n return;\n }\n }\n\n private updateCompFactory() {\n this.compFactory = this.resolveCompFactory();\n }\n\n private resolveOutputs(outputs: OutputsType) {\n this.updateOutputsEventContext();\n\n const processedOutputs = this.processOutputs(outputs);\n\n if (!this.compFactory) {\n return processedOutputs;\n }\n\n return this.remapIO(processedOutputs, this.compFactory.outputs);\n }\n\n private updateOutputsEventContext() {\n if (this.eventContextProvider) {\n // Resolve custom context from local provider\n const eventContextInjector = Injector.create({\n name: 'EventContext',\n parent: this.injector,\n providers: [this.eventContextProvider],\n });\n\n this.outputsEventContext = eventContextInjector.get(IoEventContextToken);\n } else {\n // Try to get global context\n this.outputsEventContext = this.injector.get(IoEventContextToken, null);\n }\n }\n\n private processOutputs(outputs: OutputsType) {\n const processedOutputs: OutputsTypeProcessed = {};\n\n Object.keys(outputs).forEach((key) => {\n const outputExpr = outputs[key]!;\n let outputHandler: EventHandler<unknown>;\n\n if (typeof outputExpr === 'function') {\n outputHandler = outputExpr;\n } else {\n outputHandler = outputExpr && this.processOutputArgs(outputExpr);\n }\n\n if (this.outputsEventContext && outputHandler) {\n outputHandler = outputHandler.bind(this.outputsEventContext);\n }\n\n processedOutputs[key] = outputHandler;\n });\n\n return processedOutputs;\n }\n\n private processOutputArgs(output: OutputWithArgs): EventHandler {\n const eventArgument = this.eventArgument;\n const args = 'args' in output ? output.args || [] : [eventArgument];\n const eventIdx = args.indexOf(eventArgument);\n const handler = output.handler;\n\n // When there is no event argument - use just arguments\n if (eventIdx === -1) {\n return function (this: unknown) {\n return handler.apply(this, args);\n };\n }\n\n return function (this: unknown, event) {\n const argsWithEvent = [...args];\n argsWithEvent[eventIdx] = event;\n\n return handler.apply(this, argsWithEvent);\n };\n }\n\n private remapIO<T extends Record<string, unknown>>(\n io: T,\n mapping: IOMappingList,\n ) {\n const newIO: Record<string, unknown> = {};\n\n Object.keys(io).forEach((key) => {\n const newKey = this.findPropByTplInMapping(key, mapping) || key;\n newIO[newKey] = io[key];\n });\n\n return newIO as T;\n }\n\n private findPropByTplInMapping(tplName: string, mapping: IOMappingList) {\n for (const map of mapping) {\n if (map.templateName === tplName) {\n return map.propName;\n }\n }\n return null;\n }\n}\n","import { Injectable, Injector, StaticProvider } from '@angular/core';\n\nimport {\n DynamicComponentInjector,\n DynamicComponentInjectorToken,\n} from '../component-injector';\nimport { IoService, IoServiceOptions } from './io.service';\n\n/**\n * @public\n */\nexport interface IoFactoryServiceOptions {\n injector?: Injector;\n}\n\n/**\n * @public\n */\n@Injectable({ providedIn: 'root' })\nexport class IoFactoryService {\n constructor(private injector: Injector) {}\n\n create(\n componentInjector: DynamicComponentInjector,\n ioOptions?: IoServiceOptions & IoFactoryServiceOptions,\n ) {\n const providers: StaticProvider[] = [\n { provide: IoService, useClass: IoService },\n { provide: DynamicComponentInjectorToken, useValue: componentInjector },\n ];\n\n if (ioOptions) {\n providers.push({ provide: IoServiceOptions, useValue: ioOptions });\n }\n\n const ioInjector = Injector.create({\n name: 'IoInjector',\n parent: ioOptions?.injector ?? this.injector,\n providers,\n });\n\n return ioInjector.get(IoService);\n }\n}\n","import { Directive, DoCheck, Input } from '@angular/core';\n\nimport { InputsType, IoService, OutputsType } from '../io';\n\n/**\n * @public\n */\n@Directive({\n selector:\n // eslint-disable-next-line @angular-eslint/directive-selector\n '[ngComponentOutletNdcDynamicInputs],[ngComponentOutletNdcDynamicOutputs]',\n exportAs: 'ndcDynamicIo',\n standalone: true,\n providers: [IoService],\n})\nexport class ComponentOutletIoDirective implements DoCheck {\n @Input()\n ngComponentOutletNdcDynamicInputs?: InputsType | null;\n @Input()\n ngComponentOutletNdcDynamicOutputs?: OutputsType | null;\n\n constructor(private ioService: IoService) {}\n\n ngDoCheck() {\n this.ioService.update(\n this.ngComponentOutletNdcDynamicInputs,\n this.ngComponentOutletNdcDynamicOutputs,\n );\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ComponentRef, Directive, Host } from '@angular/core';\n\nimport {\n DynamicComponentInjector,\n DynamicComponentInjectorToken,\n} from '../component-injector';\n\n/**\n * @public\n */\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[ngComponentOutlet]',\n exportAs: 'ndcComponentOutletInjector',\n standalone: true,\n providers: [\n {\n provide: DynamicComponentInjectorToken,\n useExisting: ComponentOutletInjectorDirective,\n },\n ],\n})\nexport class ComponentOutletInjectorDirective\n implements DynamicComponentInjector\n{\n get componentRef(): ComponentRef<unknown> {\n // NOTE: Accessing private APIs of Angular\n return (this.componentOutlet as any)._componentRef;\n }\n\n constructor(@Host() private componentOutlet: NgComponentOutlet) {}\n}\n","import { NgModule } from '@angular/core';\n\nimport { ComponentOutletInjectorDirective } from './component-outlet-injector.directive';\nimport { ComponentOutletIoDirective } from './component-outlet-io.directive';\n\n/**\n * @public\n */\n@NgModule({\n imports: [ComponentOutletInjectorDirective, ComponentOutletIoDirective],\n exports: [ComponentOutletInjectorDirective, ComponentOutletIoDirective],\n})\nexport class ComponentOutletInjectorModule {}\n","import {\n Directive,\n DoCheck,\n Inject,\n Input,\n KeyValueChanges,\n KeyValueDiffers,\n Optional,\n Renderer2,\n Type,\n} from '@angular/core';\n\nimport {\n DynamicComponentInjector,\n DynamicComponentInjectorToken,\n} from '../component-injector';\n\n/**\n * @public\n */\nexport interface AttributesMap {\n [key: string]: string;\n}\n\ninterface AttributeActions {\n set: AttributesMap;\n remove: string[];\n}\n\n/**\n * @public\n */\n@Directive({\n selector: '[ndcDynamicAttributes],[ngComponentOutletNdcDynamicAttributes]',\n exportAs: 'ndcDynamicAttributes',\n standalone: true,\n})\nexport class DynamicAttributesDirective implements DoCheck {\n @Input()\n ndcDynamicAttributes?: AttributesMap | null;\n @Input()\n ngComponentOutletNdcDynamicAttributes?: AttributesMap | null;\n\n private attrsDiffer = this.differs.find({}).create<string, string>();\n private lastCompType?: Type<unknown>;\n private lastAttrActions?: AttributeActions;\n\n private get _attributes() {\n return (\n this.ndcDynamicAttributes ||\n this.ngComponentOutletNdcDynamicAttributes ||\n {}\n );\n }\n\n private get nativeElement() {\n return this.componentInjector?.componentRef?.location.nativeElement;\n }\n\n private get compType() {\n return this.componentInjector?.componentRef?.componentType;\n }\n\n private get isCompChanged() {\n if (this.lastCompType !== this.compType) {\n this.lastCompType = this.compType;\n return true;\n }\n return false;\n }\n\n constructor(\n private renderer: Renderer2,\n private differs: KeyValueDiffers,\n @Inject(DynamicComponentInjectorToken)\n @Optional()\n private componentInjector?: DynamicComponentInjector,\n ) {}\n\n ngDoCheck(): void {\n const isCompChanged = this.isCompChanged;\n const changes = this.attrsDiffer.diff(this._attributes);\n\n if (changes) {\n this.lastAttrActions = this.changesToAttrActions(changes);\n }\n\n if (changes || (isCompChanged && this.lastAttrActions)) {\n this.updateAttributes(this.lastAttrActions);\n }\n }\n\n setAttribute(name: string, value: string, namespace?: string) {\n if (this.nativeElement) {\n this.renderer.setAttribute(this.nativeElement, name, value, namespace);\n }\n }\n\n removeAttribute(name: string, namespace?: string) {\n if (this.nativeElement) {\n this.renderer.removeAttribute(this.nativeElement, name, namespace);\n }\n }\n\n private updateAttributes(actions?: AttributeActions) {\n if (!this.compType || !actions) {\n return;\n }\n\n Object.keys(actions.set).forEach((key) =>\n this.setAttribute(key, actions.set[key]),\n );\n\n actions.remove.forEach((key) => this.removeAttribute(key));\n }\n\n private changesToAttrActions(\n changes: KeyValueChanges<string, string>,\n ): AttributeActions {\n const attrActions: AttributeActions = {\n set: {},\n remove: [],\n };\n\n changes.forEachAddedItem((r) => (attrActions.set[r.key] = r.currentValue!));\n changes.forEachChangedItem(\n (r) => (attrActions.set[r.key] = r.currentValue!),\n );\n changes.forEachRemovedItem((r) => attrActions.remove.push(r.key));\n\n return attrActions;\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { ComponentOutletInjectorModule } from '../component-outlet';\nimport { DynamicAttributesDirective } from './dynamic-attributes.directive';\n\n/**\n * @public\n */\n@NgModule({\n imports: [DynamicAttributesDirective],\n exports: [DynamicAttributesDirective, ComponentOutletInjectorModule],\n})\nexport class DynamicAttributesModule {}\n","import { OnDestroy, Type } from '@angular/core';\n\n/**\n * Extract type arguments from Angular Directive/Component\n *\n * @internal\n */\nexport function extractNgParamTypes(\n type: Type<unknown>,\n): unknown[] | undefined {\n // NOTE: Accessing private APIs of Angular\n return (type as any)?.ctorParameters?.()?.map((param: any) => param.type);\n}\n\n/**\n * @internal\n */\nexport function isOnDestroy(obj: unknown): obj is OnDestroy {\n return !!obj && typeof (obj as OnDestroy).ngOnDestroy === 'function';\n}\n","import { Inject, Injectable, InjectionToken, Type } from '@angular/core';\n\n/**\n * Reflect API subsystem required for lib to work\n *\n * @public\n */\nexport interface ReflectApi {\n getMetadata(type: string, obj: unknown): unknown[];\n}\n\n/**\n * @public\n */\nexport const ReflectRef = new InjectionToken<ReflectApi>('ReflectRef', {\n providedIn: 'root',\n factory: () => window.Reflect as any,\n});\n\n/**\n * @public\n */\n@Injectable({ providedIn: 'root' })\nexport class ReflectService {\n constructor(@Inject(ReflectRef) private reflect: ReflectApi) {}\n\n getCtorParamTypes(ctor: Type<unknown>): unknown[] {\n return this.reflect.getMetadata('design:paramtypes', ctor);\n }\n}\n","import {\n ChangeDetectorRef,\n ComponentRef,\n Directive,\n DoCheck,\n ElementRef,\n EventEmitter,\n Inject,\n Injector,\n Input,\n IterableChanges,\n IterableDiffers,\n OnDestroy,\n Optional,\n Output,\n Type,\n ViewRef,\n} from '@angular/core';\n\nimport {\n DynamicComponentInjector,\n DynamicComponentInjectorToken,\n} from '../component-injector';\nimport { InputsType, IoFactoryService, IoService, OutputsType } from '../io';\nimport { extractNgParamTypes, isOnDestroy } from '../util';\nimport { ReflectService } from '../reflect';\n\n/**\n * @public\n */\nexport interface DynamicDirectiveDef<T> {\n type: Type<T>;\n inputs?: InputsType;\n outputs?: OutputsType;\n}\n\n/**\n * @public\n */\nexport function dynamicDirectiveDef<T>(\n type: Type<T>,\n inputs?: InputsType,\n outputs?: OutputsType,\n): DynamicDirectiveDef<T> {\n return { type, inputs, outputs };\n}\n\n/**\n * @public\n */\nexport interface DirectiveRef<T> {\n instance: T;\n type: Type<T>;\n injector: Injector;\n hostComponent: unknown;\n hostView: ViewRef;\n location: ElementRef;\n changeDetectorRef: ChangeDetectorRef;\n // eslint-disable-next-line @typescript-eslint/ban-types\n onDestroy: (callback: Function) => void;\n}\n\n/**\n * @public\n * @experimental Dynamic directives is an experimental API that may not work as expected.\n *\n * NOTE: There is a known issue with OnChanges hook not beign triggered on dynamic directives\n * since this part of functionality has been removed from the core as Angular now\n * supports this out of the box for dynamic components.\n */\n@Directive({\n selector: '[ndcDynamicDirectives],[ngComponentOutletNdcDynamicDirectives]',\n standalone: true,\n providers: [IoFactoryService],\n})\nexport class DynamicDirectivesDirective implements OnDestroy, DoCheck {\n @Input()\n ndcDynamicDirectives?: DynamicDirectiveDef<unknown>[] | null;\n @Input()\n ngComponentOutletNdcDynamicDirectives?: DynamicDirectiveDef<unknown>[] | null;\n\n @Output()\n ndcDynamicDirectivesCreated = new EventEmitter<DirectiveRef<unknown>[]>();\n\n private lastCompInstance: unknown;\n\n private get directives() {\n return (\n this.ndcDynamicDirectives || this.ngComponentOutletNdcDynamicDirectives\n );\n }\n\n private get componentRef() {\n return this.componentInjector?.componentRef;\n }\n\n private get compInstance() {\n return this.componentRef && this.componentRef.instance;\n }\n\n private get isCompChanged() {\n if (this.lastCompInstance !== this.compInstance) {\n this.lastCompInstance = this.compInstance;\n return true;\n }\n return false;\n }\n\n private get hostInjector() {\n return this.componentRef?.injector;\n }\n\n private dirRef = new Map<Type<unknown>, DirectiveRef<unknown>>();\n private dirIo = new Map<Type<unknown>, IoService>();\n private dirsDiffer = this.iterableDiffers\n .find([])\n .create<DynamicDirectiveDef<unknown>>((_, def) => def.type);\n\n constructor(\n private injector: Injector,\n private iterableDiffers: IterableDiffers,\n private ioFactoryService: IoFactoryService,\n private reflectService: ReflectService,\n @Inject(DynamicComponentInjectorToken)\n @Optional()\n private componentInjector?: DynamicComponentInjector,\n ) {}\n\n ngDoCheck(): void {\n if (this.maybeDestroyDirectives()) {\n return;\n }\n\n const dirsChanges = this.dirsDiffer.diff(this.directives);\n\n if (!dirsChanges) {\n return this.updateDirectives();\n }\n\n this.processDirChanges(dirsChanges);\n }\n\n ngOnDestroy(): void {\n this.destroyAllDirectives();\n }\n\n private maybeDestroyDirectives() {\n if (this.isCompChanged || !this.componentRef) {\n this.dirsDiffer.diff([]);\n this.destroyAllDirectives();\n }\n\n return !this.componentRef;\n }\n\n private processDirChanges(\n changes: IterableChanges<DynamicDirectiveDef<unknown>>,\n ) {\n changes.forEachRemovedItem(({ item }) => this.destroyDirective(item));\n\n const createdDirs: DirectiveRef<unknown>[] = [];\n changes.forEachAddedItem(({ item }) => {\n const dirRef = this.initDirective(item);\n\n if (dirRef) {\n createdDirs.push(dirRef);\n }\n });\n\n if (createdDirs.length) {\n this.ndcDynamicDirectivesCreated.emit(createdDirs);\n }\n }\n\n private updateDirectives() {\n this.directives?.forEach((dir) => this.updateDirective(dir));\n }\n\n private updateDirective(dirDef: DynamicDirectiveDef<unknown>) {\n const io = this.dirIo.get(dirDef.type);\n io?.update(dirDef.inputs, dirDef.outputs);\n }\n\n private initDirective(\n dirDef: DynamicDirectiveDef<unknown>,\n ): DirectiveRef<unknown> | undefined {\n if (this.dirRef.has(dirDef.type)) {\n return;\n }\n\n const instance = this.createDirective(dirDef.type);\n const directiveRef: DirectiveRef<unknown> = {\n instance,\n type: dirDef.type,\n injector: this.hostInjector!,\n hostComponent: this.componentRef!.instance,\n hostView: this.componentRef!.hostView,\n location: this.componentRef!.location,\n changeDetectorRef: this.componentRef!.changeDetectorRef,\n onDestroy: this.componentRef!.onDestroy,\n };\n\n this.initDirIO(directiveRef, dirDef);\n this.callInitHooks(instance);\n\n this.dirRef.set(directiveRef.type, directiveRef);\n\n return directiveRef;\n }\n\n private destroyAllDirectives() {\n this.dirRef.forEach((dir) => this.destroyDirRef(dir));\n this.dirRef.clear();\n this.dirIo.clear();\n }\n\n private destroyDirective(dirDef: DynamicDirectiveDef<unknown>) {\n const dirRef = this.dirRef.get(dirDef.type);\n if (dirRef) {\n this.destroyDirRef(dirRef);\n }\n this.dirRef.delete(dirDef.type);\n this.dirIo.delete(dirDef.type);\n }\n\n private initDirIO(\n dirRef: DirectiveRef<any>,\n dirDef: DynamicDirectiveDef<any>,\n ) {\n const io = this.ioFactoryService.create(\n { componentRef: this.dirToCompDef(dirRef) },\n { trackOutputChanges: true, injector: this.injector },\n );\n io.update(dirDef.inputs, dirDef.outputs);\n this.dirIo.set(dirRef.type, io);\n }\n\n private dirToCompDef(dirRef: DirectiveRef<unknown>): ComponentRef<unknown> {\n return {\n changeDetectorRef: this.componentRef!.changeDetectorRef,\n hostView: this.componentRef!.hostView,\n location: this.componentRef!.location,\n destroy: this.componentRef!.destroy,\n onDestroy: this.componentRef!.onDestroy,\n injector: this.componentRef!.injector,\n instance: dirRef.instance,\n componentType: dirRef.type,\n setInput: (name, value) => ((dirRef.instance as any)[name] = value),\n };\n }\n\n private destroyDirRef(dirRef: DirectiveRef<unknown>) {\n this.dirIo.get(dirRef.type)?.ngOnDestroy();\n\n if (isOnDestroy(dirRef.instance)) {\n dirRef.instance.ngOnDestroy();\n }\n }\n\n private createDirective<T>(dirType: Type<T>): T {\n const directiveInjector = Injector.create({\n providers: [\n {\n provide: dirType,\n useClass: dirType,\n deps: this.resolveDirParamTypes(dirType),\n },\n { provide: ElementRef, useValue: this.componentRef!.location },\n ],\n parent: this.hostInjector,\n name: `DynamicDirectiveInjector:${dirType.name}@${\n this.componentRef!.componentType.name\n }`,\n });\n\n return directiveInjector.get(dirType);\n }\n\n private resolveDirParamTypes(dirType: Type<unknown>): unknown[] {\n return (\n // First try Angular Compiler's metadata\n extractNgParamTypes(dirType) ??\n // Then fallback to Reflect API\n this.reflectService.getCtorParamTypes(dirType) ??\n // Bailout\n []\n );\n }\n\n private callInitHooks(obj: unknown) {\n this.callHook(obj, 'ngOnInit');\n this.callHook(obj, 'ngDoCheck');\n this.callHook(obj, 'ngAfterContentInit');\n this.callHook(obj, 'ngAfterContentChecked');\n this.callHook(obj, 'ngAfterViewInit');\n this.callHook(obj, 'ngAfterViewChecked');\n }\n\n private callHook(obj: any, hook: string, args: unknown[] = []) {\n if (obj[hook]) {\n obj[hook](...args);\n }\n }\n}\n","import { NgModule } from '@angular/core';\n\nimport { ComponentOutletInjectorModule } from '../component-outlet';\nimport { DynamicDirectivesDirective } from './dynamic-directives.directive';\n\n/**\n * @public\n */\n@NgModule({\n imports: [DynamicDirectivesDirective],\n exports: [DynamicDirectivesDirective, ComponentOutletInjectorModule],\n})\nexport class DynamicDirectivesModule {}\n","import { Directive, DoCheck, Input } from '@angular/core';\n\nimport { InputsType, IoService, OutputsType } from '../io';\n\n/**\n * @public\n */\n@Directive({\n selector: '[ndcDynamicInputs],[ndcDynamicOutputs]',\n exportAs: 'ndcDynamicIo',\n standalone: true,\n providers: [IoService],\n})\nexport class DynamicIoDirective implements DoCheck {\n @Input()\n ndcDynamicInputs?: InputsType | null;\n @Input()\n ndcDynamicOutputs?: OutputsType | null;\n\n constructor(private ioService: IoService) {}\n\n ngDoCheck() {\n this.ioService.update(this.ndcDynamicInputs, this.ndcDynamicOutputs);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ComponentOutletInjectorModule } from '../component-outlet';\nimport { DynamicIoDirective } from './dynamic-io.directive';\n\n/**\n * @public\n */\n@NgModule({\n imports: [DynamicIoDirective],\n exports: [DynamicIoDirective, ComponentOutletInjectorModule],\n})\nexport class DynamicIoModule {}\n","import {\n Component,\n ComponentRef,\n EnvironmentInjector,\n EventEmitter,\n Injector,\n Input,\n NgModuleRef,\n OnChanges,\n Output,\n SimpleChanges,\n StaticProvider,\n Type,\n ViewContainerRef,\n} from '@angular/core';\nimport {\n DynamicComponentInjector,\n DynamicComponentInjectorToken,\n} from './component-injector';\n\n/**\n * @public\n */\n@Component({\n selector: 'ndc-dynamic',\n standalone: true,\n template: '',\n providers: [\n { provide: DynamicComponentInjectorToken, useExisting: DynamicComponent },\n ],\n})\nexport class DynamicComponent<C = unknown>\n implements OnChanges, DynamicComponentInjector\n{\n private static UpdateOnInputs: (keyof DynamicComponent)[] = [\n 'ndcDynamicComponent',\n 'ndcDynamicInjector',\n 'ndcDynamicProviders',\n 'ndcDynamicContent',\n 'ndcDynamicNgModuleRef',\n 'ndcDynamicEnvironmentInjector',\n ];\n\n @Input()\n ndcDynamicComponent?: Type<C> | null;\n @Input()\n ndcDynamicInjector?: Injector | null;\n @Input()\n ndcDynamicProviders?: StaticProvider[] | null;\n @Input()\n ndcDynamicContent?: Node[][];\n @Input()\n ndcDynamicNgModuleRef?: NgModuleRef<unknown>;\n @Input()\n ndcDynamicEnvironmentInjector?: EnvironmentInjector | NgModuleRef<unknown>;\n\n @Output()\n ndcDynamicCreated = new EventEmitter<ComponentRef<C>>();\n\n componentRef: ComponentRef<C> | null = null;\n\n constructor(private vcr: ViewContainerRef) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (\n DynamicComponent.UpdateOnInputs.some((input) =>\n changes.hasOwnProperty(input),\n )\n ) {\n this.createDynamicComponent();\n }\n }\n\n createDynamicComponent() {\n this.vcr.clear();\n this.componentRef = null;\n\n if (this.ndcDynamicComponent) {\n this.componentRef = this.vcr.createComponent(this.ndcDynamicComponent, {\n index: 0,\n injector: this._resolveInjector(),\n projectableNodes: this.ndcDynamicContent,\n ngModuleRef: this.ndcDynamicNgModuleRef,\n environmentInjector: this.ndcDynamicEnvironmentInjector,\n });\n this.ndcDynamicCreated.emit(this.componentRef);\n }\n }\n\n private _resolveInjector(): Injector {\n let injector = this.ndcDynamicInjector || this.vcr.injector;\n\n if (this.ndcDynamicProviders) {\n injector = Injector.create({\n providers: this.ndcDynamicProviders,\n parent: injector,\n });\n }\n\n return injector;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { DynamicIoModule } from './dynamic-io';\nimport { DynamicComponent } from './dynamic.component';\n\n/**\n * @public\n */\n@NgModule({\n imports: [DynamicIoModule, DynamicComponent],\n exports: [DynamicIoModule, DynamicComponent],\n})\nexport class DynamicModule {}\n","/*\n * Public API Surface of ng-dynamic-component\n */\n\nexport * from './lib/component-injector';\nexport * from './lib/component-io';\nexport * from './lib/component-outlet';\nexport * from './lib/dynamic-attributes';\nexport * from './lib/dynamic-directives';\nexport * from './lib/dynamic-io';\nexport * from './lib/dynamic.component';\nexport * from './lib/dynamic.module';\nexport * from './lib/io';\nexport * from './lib/reflect';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ComponentIO","i1.IoService"],"mappings":"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