+3
-2
| export { DomEntity, ElementClassDescriptor, ElementDescriptor, DOMContent, DomHelper, StyleAccessor, JelEntity } from "./internal/types"; | ||
| import { $ } from "./internal/element"; | ||
| import { DomEntity } from "./internal/types"; | ||
| export { createEntity } from "./internal/util"; | ||
| export { createEventSource, interval, timeout, SubjectEmitter, toEventEmitter } from "./internal/emitter"; | ||
| export { createEventSource, interval, timeout, SubjectEmitter, toEventEmitter, type EventEmitter, combineEmitters } from "./internal/emitter"; | ||
| export { $ }; | ||
| export declare const $body: import(".").DomEntity<HTMLElement>; | ||
| export declare const $body: DomEntity<HTMLElement>; |
+2
-2
| import { $ } from "./internal/element"; | ||
| export { createEntity } from "./internal/util"; | ||
| export { createEventSource, interval, timeout, SubjectEmitter, toEventEmitter } from "./internal/emitter"; | ||
| export { createEventSource, interval, timeout, SubjectEmitter, toEventEmitter, combineEmitters } from "./internal/emitter"; | ||
| export { $ }; | ||
| export const $body = $(document.body); | ||
| export const $body = "document" in globalThis ? $(document.body) : undefined; |
@@ -124,2 +124,5 @@ import { EmitterLike } from "./types"; | ||
| or<U>(...emitters: EmitterLike<U>[]): EventEmitter<T | U>; | ||
| memo(): Memo<T | undefined>; | ||
| memo(initial: T): Memo<T>; | ||
| memo<U>(initial: U): Memo<T | U>; | ||
| } | ||
@@ -161,6 +164,2 @@ /** | ||
| }; | ||
| export declare function createListenable<T>(sourceListen?: () => UnsubscribeFunc | undefined): { | ||
| listen: (fn: (v: T) => void) => UnsubscribeFunc; | ||
| emit: (value: T) => void; | ||
| }; | ||
| export declare function interval(ms: number | { | ||
@@ -172,2 +171,9 @@ asMilliseconds: number; | ||
| }): EventEmitter<void>; | ||
| declare class Memo<T> { | ||
| private _value; | ||
| private unsubscribeFunc; | ||
| get value(): T; | ||
| constructor(source: EmitterLike<T>, initial: T); | ||
| dispose(): void; | ||
| } | ||
| export declare class SubjectEmitter<T> extends EventEmitter<T> { | ||
@@ -198,2 +204,11 @@ private emit; | ||
| export declare function toEventEmitter<T, E extends string>(source: EventSource<T, E>, eventName: E): EventEmitter<T>; | ||
| type Dictionary<T> = Record<string | symbol, T>; | ||
| type ExtractEmitterValue<T> = T extends EmitterLike<infer U> ? U : never; | ||
| type CombinedRecord<T extends Dictionary<EmitterLike<any>>> = { | ||
| readonly [K in keyof T]: ExtractEmitterValue<T[K]>; | ||
| }; | ||
| export declare function combineEmitters<U extends Dictionary<EmitterLike<any>>>(emitters: U): EventEmitter<CombinedRecord<U>>; | ||
| export declare function combineEmitters<U extends EmitterLike<any>[]>(emitters: [...U]): EventEmitter<{ | ||
| [K in keyof U]: ExtractEmitterValue<U[K]>; | ||
| }>; | ||
| export {}; |
+56
-1
@@ -317,2 +317,5 @@ import { isReactiveSource } from "./util"; | ||
| } | ||
| memo(initial) { | ||
| return new Memo(this, initial); | ||
| } | ||
| } | ||
@@ -359,3 +362,3 @@ /** | ||
| } | ||
| export function createListenable(sourceListen) { | ||
| function createListenable(sourceListen) { | ||
| const handlers = []; | ||
@@ -406,2 +409,18 @@ let onRemoveLast; | ||
| } | ||
| class Memo { | ||
| get value() { | ||
| return this._value; | ||
| } | ||
| constructor(source, initial) { | ||
| this._value = initial; | ||
| const emitter = toEventEmitter(source); | ||
| this.unsubscribeFunc = emitter.listen(v => this._value = v); | ||
| } | ||
| dispose() { | ||
| this.unsubscribeFunc(); | ||
| this.unsubscribeFunc = () => { | ||
| throw new Error("Memo object already disposed"); | ||
| }; | ||
| } | ||
| } | ||
| export class SubjectEmitter extends EventEmitter { | ||
@@ -462,1 +481,37 @@ constructor(initial) { | ||
| } | ||
| function combineArray(emitters) { | ||
| let values = Array.from({ length: emitters.length }); | ||
| const { emit, listen } = createListenable(() => { | ||
| const unsubFuncs = emitters.map((emitter, idx) => { | ||
| return emitter.listen(v => { | ||
| values[idx] = { value: v }; | ||
| if (values.every(v => v !== undefined)) | ||
| emit(values.map(vc => vc.value)); | ||
| }); | ||
| }); | ||
| return () => unsubFuncs.forEach(f => f()); | ||
| }); | ||
| return new EventEmitter(listen); | ||
| } | ||
| function combineRecord(emitters) { | ||
| const keys = Object.keys(emitters); | ||
| let values = {}; | ||
| const { emit, listen } = createListenable(() => { | ||
| const unsubFuncs = keys.map(key => { | ||
| return emitters[key].listen(v => { | ||
| values[key] = { value: v }; | ||
| if (keys.every(k => values[k] !== undefined)) { | ||
| const record = Object.fromEntries(Object.entries(values).map(([k, vc]) => [k, vc.value])); | ||
| emit(record); | ||
| } | ||
| }); | ||
| }); | ||
| return () => unsubFuncs.forEach(f => f()); | ||
| }); | ||
| return new EventEmitter(listen); | ||
| } | ||
| export function combineEmitters(emitters) { | ||
| if (Array.isArray(emitters)) | ||
| return combineArray(emitters.map(toEventEmitter)); | ||
| return combineRecord(Object.fromEntries(Object.entries(emitters).map(([k, e]) => [k, toEventEmitter(e)]))); | ||
| } |
+1
-1
| { | ||
| "name": "@xtia/jel", | ||
| "version": "0.7.2", | ||
| "version": "0.8.0", | ||
| "repository": { | ||
@@ -5,0 +5,0 @@ "url": "https://github.com/tiadrop/jel-ts", |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
55885
4.95%1391
5.38%