@avine/ng-if-non-nullish
Version:
Nullish coalescing operator as Angular structural directive and more...
1 lines • 6.09 kB
Source Map (JSON)
{"version":3,"file":"avine-ng-if-non-nullish.mjs","sources":["../../../projects/if-non-nullish/src/lib/if-non-nullish.directive.ts","../../../projects/if-non-nullish/src/avine-ng-if-non-nullish.ts"],"sourcesContent":["import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';\n\nimport { IfNonNullishContext, IfNullish } from './if-non-nullish.types';\n\n@Directive({\n standalone: true,\n selector: '[ifNonNullish]',\n})\nexport class IfNonNullishDirective<T = unknown> {\n @Input()\n set ifNonNullish(data: T) {\n this.hasNoData = data === null || data === undefined;\n this.updateView(data);\n }\n\n @Input()\n set ifNonNullishFallback(fallbackTemplate: TemplateRef<unknown> | IfNullish) {\n this.fallbackTemplate = fallbackTemplate ?? null;\n if (this.hasNoData) {\n this.createFallbackView();\n }\n }\n\n private context!: IfNonNullishContext<T>;\n\n private hasNoData = true;\n\n private fallbackTemplate: TemplateRef<unknown> | null = null;\n\n private viewState: 'regular' | 'fallback' | 'clear' = 'clear';\n\n /**\n * Assert the correct type of the expression bound to the `ifNonNullish` input within the template.\n *\n * @see https://angular.io/guide/structural-directives#improving-template-type-checking-for-custom-directives\n */\n static ngTemplateGuard_ifNonNullish<T>(_directive: IfNonNullishDirective<T>, data: T): data is Exclude<T, IfNullish> {\n return true;\n }\n\n /**\n * Asserts the correct type of the context for the template that `IfNonNullish` will render.\n *\n * @see https://angular.io/guide/structural-directives#improving-template-type-checking-for-custom-directives\n */\n static ngTemplateContextGuard<T>(\n _directive: IfNonNullishDirective<T>,\n context: any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ): context is IfNonNullishContext<Exclude<T, IfNullish>> {\n return true;\n }\n\n constructor(\n private viewContainerRef: ViewContainerRef,\n private templateRef: TemplateRef<IfNonNullishContext<T>>,\n ) {}\n\n private updateView(data: T) {\n if (!this.hasNoData) {\n this.switchToRegularView(data);\n } else {\n this.switchToFallbackView();\n }\n }\n\n private switchToRegularView(data: T) {\n this.upsertContext(data);\n if (this.viewState === 'regular') {\n return;\n }\n this.createRegularView();\n }\n\n private switchToFallbackView() {\n if (this.viewState === 'fallback') {\n return;\n }\n this.createFallbackView();\n }\n\n private upsertContext(data: T) {\n if (this.context) {\n this.context.$implicit = this.context.ifNonNullish = data;\n } else {\n this.context = { $implicit: data, ifNonNullish: data };\n }\n }\n\n private createRegularView() {\n this.clearView();\n this.viewContainerRef.createEmbeddedView(this.templateRef, this.context);\n this.viewState = 'regular';\n }\n\n private createFallbackView() {\n this.clearView();\n if (!this.fallbackTemplate) {\n return;\n }\n this.viewContainerRef.createEmbeddedView(this.fallbackTemplate);\n this.viewState = 'fallback';\n }\n\n private clearView() {\n if (this.viewState === 'clear') {\n return;\n }\n this.viewContainerRef.clear();\n this.viewState = 'clear';\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}