{"version":3,"file":"taiga-ui-polymorpheus.mjs","sources":["../../../projects/ng-polymorpheus/src/tokens/context.ts","../../../projects/ng-polymorpheus/src/classes/component.ts","../../../projects/ng-polymorpheus/src/classes/context.ts","../../../projects/ng-polymorpheus/src/utils/is-primitive.ts","../../../projects/ng-polymorpheus/src/directives/template.ts","../../../projects/ng-polymorpheus/src/directives/outlet.ts","../../../projects/ng-polymorpheus/src/index.ts","../../../projects/ng-polymorpheus/src/taiga-ui-polymorpheus.ts"],"sourcesContent":["/// <reference types=\"@taiga-ui/tsconfig/ng-dev-mode\" />\nimport {inject, InjectionToken, type InjectOptions, type Provider} from '@angular/core';\n\n/**\n * Use this token to access context within your components when\n * instantiating them through {@link PolymorpheusOutlet}\n */\nexport const POLYMORPHEUS_CONTEXT = new InjectionToken<Record<any, any>>(\n    ngDevMode ? 'POLYMORPHEUS_CONTEXT' : '',\n);\n\nexport function provideContext<T = Record<any, any>>(useValue: T): Provider {\n    return {\n        provide: POLYMORPHEUS_CONTEXT,\n        useValue,\n    };\n}\n\nexport function injectContext<T>(options?: InjectOptions & {optional?: false}): T;\nexport function injectContext<T>(options?: InjectOptions & {optional: true}): T | null;\nexport function injectContext<T>(options: InjectOptions = {}): T | null {\n    return inject(POLYMORPHEUS_CONTEXT, options);\n}\n","import {Injector, type Type} from '@angular/core';\n\nimport {provideContext} from '../tokens/context';\n\n/**\n * Wrapper class for a component that will be used as content for {@link PolymorpheusOutlet}\n *\n * @param component — an Angular component to be dynamically created\n * @param injector — optional {@link Injector} for lazy loaded module case\n */\nexport class PolymorpheusComponent<T> {\n    constructor(\n        public readonly component: Type<T>,\n        private readonly i?: Injector,\n    ) {}\n\n    public createInjector<C>(injector: Injector, useValue?: C): Injector {\n        return Injector.create({\n            parent: this.i || injector,\n            providers: useValue ? [provideContext(useValue)] : [],\n        });\n    }\n}\n","export class PolymorpheusContext<T> {\n    constructor(public readonly $implicit: T) {}\n\n    public get polymorpheusOutlet(): T {\n        return this.$implicit;\n    }\n}\n","export function isPrimitive(value: unknown): boolean {\n    return Object(value) !== value;\n}\n","/* eslint-disable @angular-eslint/prefer-inject */\nimport {ChangeDetectorRef, Directive, inject, TemplateRef} from '@angular/core';\n\n/**\n * ng-template wrapper directive also stores {@link ChangeDetectorRef} to properly handle change detection.\n */\n@Directive({\n    selector: 'ng-template[polymorpheus]',\n    inputs: ['polymorpheus'],\n    exportAs: 'polymorpheus',\n})\nexport class PolymorpheusTemplate<C = any> {\n    public polymorpheus: C | '' = '';\n\n    constructor(\n        public readonly template: TemplateRef<C> = inject(TemplateRef<C>, {self: true}),\n        private readonly cdr: ChangeDetectorRef = inject(ChangeDetectorRef),\n    ) {}\n\n    public static ngTemplateContextGuard<T>(\n        _dir: PolymorpheusTemplate<T>,\n        _ctx: any,\n    ): _ctx is T extends '' ? any : T {\n        return true;\n    }\n\n    public check(): void {\n        this.cdr.markForCheck();\n    }\n}\n","/* eslint-disable @angular-eslint/no-conflicting-lifecycle */\nimport {\n    ChangeDetectorRef,\n    type ComponentRef,\n    Directive,\n    type DoCheck,\n    inject,\n    INJECTOR,\n    type OnChanges,\n    reflectComponentType,\n    type SimpleChanges,\n    TemplateRef,\n    ViewContainerRef,\n} from '@angular/core';\n\nimport {PolymorpheusComponent} from '../classes/component';\nimport {PolymorpheusContext} from '../classes/context';\nimport {type PolymorpheusContent} from '../types/content';\nimport {type PolymorpheusPrimitive} from '../types/primitive';\nimport {isPrimitive} from '../utils/is-primitive';\nimport {PolymorpheusTemplate} from './template';\n\n@Directive({\n    selector: '[polymorpheusOutlet]',\n    inputs: ['content: polymorpheusOutlet', 'context: polymorpheusOutletContext'],\n})\nexport class PolymorpheusOutlet<C> implements OnChanges, DoCheck {\n    private readonly vcr = inject(ViewContainerRef);\n    private readonly i = inject(INJECTOR);\n    private readonly t: TemplateRef<PolymorpheusContext<PolymorpheusPrimitive>> =\n        inject(TemplateRef);\n\n    private c?: ComponentRef<unknown>;\n\n    public content: PolymorpheusContent<C> = '';\n    public context?: C;\n\n    public static ngTemplateContextGuard<T>(\n        _dir: PolymorpheusOutlet<T>,\n        _ctx: any,\n    ): _ctx is PolymorpheusContext<T extends PolymorpheusPrimitive ? T : never> {\n        return true;\n    }\n\n    public ngOnChanges({content}: SimpleChanges): void {\n        const context = this.getContext();\n\n        this.update();\n        this.c?.injector.get(ChangeDetectorRef).markForCheck();\n\n        if (!content) {\n            return;\n        }\n\n        this.vcr.clear();\n\n        const proxy =\n            context &&\n            (new Proxy(ensureContext(context) as object, {\n                get: (_, key) =>\n                    ensureContext(this.getContext())?.[\n                        key as keyof (C | PolymorpheusContext<any>)\n                    ],\n            }) as unknown as C);\n\n        if (isComponent(this.content)) {\n            this.process(this.content, proxy);\n            this.update();\n        } else if (\n            (context instanceof PolymorpheusContext && context.$implicit) != null\n        ) {\n            this.vcr.createEmbeddedView(this.template, proxy, {injector: this.i});\n        }\n    }\n\n    public ngDoCheck(): void {\n        if (isDirective(this.content)) {\n            this.content.check();\n        }\n    }\n\n    private get template(): TemplateRef<unknown> {\n        if (isDirective(this.content)) {\n            return this.content.template;\n        }\n\n        return this.content instanceof TemplateRef ? this.content : this.t;\n    }\n\n    private getContext(): C | PolymorpheusContext<any> | undefined {\n        if (isTemplate(this.content) || isComponent(this.content)) {\n            return this.context;\n        }\n\n        return new PolymorpheusContext(\n            typeof this.content === 'function'\n                ? this.content(this.context ?? ({} as any))\n                : this.content,\n        );\n    }\n\n    private process(content: PolymorpheusComponent<unknown>, proxy?: C): void {\n        const injector = content.createInjector(this.i, proxy);\n\n        this.c = this.vcr.createComponent(content.component, {injector});\n    }\n\n    private update(): void {\n        const {context, content} = this;\n\n        if (!context || typeof context !== 'object' || !isComponent(content)) {\n            return;\n        }\n\n        const {inputs = []} = reflectComponentType(content.component) || {};\n\n        for (const {templateName} of inputs) {\n            if (templateName in context) {\n                this.c?.setInput(templateName, context[templateName as keyof C]);\n            }\n        }\n    }\n}\n\nfunction isDirective<C>(\n    content: PolymorpheusContent<C>,\n): content is PolymorpheusTemplate<C> {\n    return content instanceof PolymorpheusTemplate;\n}\n\nfunction isComponent<C>(\n    content: PolymorpheusContent<C>,\n): content is PolymorpheusComponent<any> {\n    return content instanceof PolymorpheusComponent;\n}\n\nfunction isTemplate<C>(\n    content: PolymorpheusContent<C>,\n): content is PolymorpheusTemplate<C> | TemplateRef<C> {\n    return isDirective(content) || content instanceof TemplateRef;\n}\n\nfunction ensureContext<C>(\n    context: C | PolymorpheusContext<any> | undefined,\n): C | PolymorpheusContext<any> | undefined {\n    if (context && isPrimitive(context)) {\n        return new PolymorpheusContext(context);\n    }\n\n    return context;\n}\n","/**\n * Public API Surface of ng-polymorpheus\n */\nexport * from './classes/component';\nexport * from './directives/outlet';\nexport * from './directives/template';\nexport * from './tokens/context';\nexport type * from './types/content';\nexport type * from './types/handler';\nexport type * from './types/primitive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}