UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

60 lines (53 loc) 1.9 kB
import { inject, InjectionToken, isSignal, signal, effect } from '@angular/core'; import { tuiSetSignal } from '@taiga-ui/cdk/utils/miscellaneous'; function tuiProvideOptions(provide, options, fallback) { return { provide, useFactory: () => ({ ...(inject(provide, { optional: true, skipSelf: true }) || fallback), ...(inject(options, { optional: true }) || (typeof options === 'function' ? options() : options)), }), }; } function tuiCreateOptions(defaults) { const token = new InjectionToken(ngDevMode ? 'Options token' : '', { factory: () => defaults, }); return [token, (options) => tuiProvideOptions(token, options, defaults)]; } // TODO: Consider {} as default options instead function tuiDirectiveBinding(token, key, initial, options = { self: true }) { const result = isSignal(initial) ? initial : signal(initial); const directive = inject(token, options); const output = directive?.[`${key.toString()}Change`]; if (!directive) { return result; } // TODO: Figure out why effects are executed all the time and not just when result changes (check with Angular 18) let previous; effect(() => { const value = result(); if (previous === value) { return; } if (isSignal(directive[key])) { tuiSetSignal(directive[key], value); } else { directive[key] = value; } directive.ngOnChanges?.({}); output?.emit?.(value); previous = value; }); return result; } function tuiProvide(provide, useExisting, multi = false) { return { provide, useExisting, multi }; } /** * Generated bundle index. Do not edit. */ export { tuiCreateOptions, tuiDirectiveBinding, tuiProvide, tuiProvideOptions }; //# sourceMappingURL=taiga-ui-cdk-utils-di.mjs.map