zoneless-utils
Version:
Zoneless Utility Toolkit for Angular using Signals
130 lines (117 loc) • 4.57 kB
JavaScript
import * as i0 from '@angular/core';
import { Pipe, signal, effect, Input, Directive } from '@angular/core';
// zoneless-async.pipe.ts
class ZonelessAsyncPipe {
transform(signal) {
return signal();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ZonelessAsyncPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: ZonelessAsyncPipe, isStandalone: true, name: "zonelessAsync", pure: false });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ZonelessAsyncPipe, decorators: [{
type: Pipe,
args: [{ name: 'zonelessAsync', standalone: true, pure: false }]
}] });
function runWithChangeDetection(cdr, callback) {
callback();
cdr.detectChanges();
}
function markForCheck(cdr) {
cdr.markForCheck();
}
// use-interval.signal.ts
function useIntervalSignal(ms) {
const counter = signal(0, ...(ngDevMode ? [{ debugName: "counter" }] : []));
setInterval(() => counter.update(c => c + 1), ms);
return counter;
}
// projects/zoneless-utils/src/lib/signals/use-timeout.signal.ts
function useTimeoutSignal(ms) {
const done = signal(false, ...(ngDevMode ? [{ debugName: "done" }] : []));
setTimeout(() => done.set(true), ms);
return done;
}
function useAnimationFrameSignal() {
const frame = signal(0, ...(ngDevMode ? [{ debugName: "frame" }] : []));
function update(time) {
frame.set(time);
requestAnimationFrame(update);
}
requestAnimationFrame(update);
return frame;
}
function useIdleSignal(timeoutMs = 30000) {
const isIdle = signal(false, ...(ngDevMode ? [{ debugName: "isIdle" }] : []));
let timer;
const reset = () => {
clearTimeout(timer);
isIdle.set(false);
timer = setTimeout(() => isIdle.set(true), timeoutMs);
};
['mousemove', 'keydown', 'mousedown', 'touchstart'].forEach(event => window.addEventListener(event, reset));
reset();
return isIdle;
}
function useResizeSignal() {
const size = signal({
width: window.innerWidth,
height: window.innerHeight,
}, ...(ngDevMode ? [{ debugName: "size" }] : []));
const update = () => {
size.set({
width: window.innerWidth,
height: window.innerHeight,
});
};
// Attach resize listener once
window.addEventListener('resize', update);
return size;
}
class ZonelessIfDirective {
templateRef;
viewContainer;
hasView = false;
constructor(templateRef, viewContainer) {
this.templateRef = templateRef;
this.viewContainer = viewContainer;
}
set zonelessIf(condition) {
if (typeof condition === 'function') {
effect(() => {
this.updateView(condition());
});
}
else {
this.updateView(condition);
}
}
updateView(value) {
if (value && !this.hasView) {
this.viewContainer.createEmbeddedView(this.templateRef);
this.hasView = true;
}
else if (!value && this.hasView) {
this.viewContainer.clear();
this.hasView = false;
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ZonelessIfDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.1.2", type: ZonelessIfDirective, isStandalone: true, selector: "[zonelessIf]", inputs: { zonelessIf: "zonelessIf" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: ZonelessIfDirective, decorators: [{
type: Directive,
args: [{
selector: '[zonelessIf]',
standalone: true,
}]
}], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }], propDecorators: { zonelessIf: [{
type: Input
}] } });
/*
* Public API Surface of zoneless-utils
*/
/**
* Generated bundle index. Do not edit.
*/
export { ZonelessAsyncPipe, ZonelessIfDirective, markForCheck, runWithChangeDetection, useAnimationFrameSignal, useIdleSignal, useIntervalSignal, useResizeSignal, useTimeoutSignal };
//# sourceMappingURL=zoneless-utils.mjs.map