@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
JavaScript
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