{"version":3,"file":"signal-mkOAYXy1.cjs","sources":["../lib/common/extract-value.ts","../lib/core/signal/signal.ts"],"sourcesContent":["export function extractValue(keyOrSelectors: (string | number | symbol | ((o: any) => any))[], obj: any): any {\n    let extractedValue = obj;\n    for (const keyOrSelector of keyOrSelectors) {\n\n        if (typeof keyOrSelector === 'function') {\n            extractedValue = keyOrSelector(extractedValue);\n                \n        } else if (typeof keyOrSelector === 'string' || typeof keyOrSelector === 'number' || typeof keyOrSelector === 'symbol') {\n            const key = keyOrSelector;\n            if (extractedValue && typeof extractedValue === 'object' && key in extractedValue) {\n                extractedValue = extractedValue[key];\n            } else {\n                return undefined;\n            }\n        }\n    }\n    return extractedValue;\n}","import { Signal, CoreSignalCapabilities, EnhancedSignalCapabilities, StaleSignalCapabilities, Listener, RememberPreviousValueSignalCapabilities, SignalOptions, CreateSignalFn, Selector } from \"./signal.types\";\nimport { extractValue } from \"@/common/extract-value\";\n\nlet signalCounter = 0\n\n/** @internal @ignore */\ntype BuildSignalResult<T> \n    = CoreSignalCapabilities<T> \n    & EnhancedSignalCapabilities<T>\n    & RememberPreviousValueSignalCapabilities<T> \n    & StaleSignalCapabilities;\n\n/** @internal @ignore */\ntype NonCallableSignal<T> = Pick<Signal<T>\n, 'id'\n| 'link'\n| 'derive'\n| 'select'\n| 'listeners'\n| 'subscribe'\n| 'linkedSubscriptions'\n| 'disconnect'\n| 'updateOptions'\n| 'emit'\n| 'value'\n| 'previousValue'\n| 'setValue'\n| 'enterStaleMode'\n| 'exitStaleMode'\n>;\n\n/** @internal @ignore */\nfunction buildSignal<T>(value: T, options?: SignalOptions<T>): BuildSignalResult<T> {\n    const usedOptions = {\n        id: options?.id || String(signalCounter),\n        compare: options?.compare || defaultCompare,\n        rememberPrevValue: options?.rememberPrevValue || true,\n        emitOnExitStaleMode: options?.emitOnExitStaleMode || false,\n        emitOnValueNotChanged: options?.emitOnValueNotChanged || false,\n    };\n    let _listeners: Listener<T>[] = [];\n    let _staleMode = false;\n    let _prevValue: T | undefined;\n    \n    const _linkedSubscriptions: (() => void)[] = [];\n\n    const nonCallableSignal: NonCallableSignal<T> = {\n        id: usedOptions.id,\n        get listeners() { return _listeners; },\n        get linkedSubscriptions() { return _linkedSubscriptions; },\n        get previousValue() { return _prevValue; },\n        get value() { return value; },\n        set value(newValue: T) {\n            if(usedOptions?.rememberPrevValue) {\n                _prevValue = value;\n            }\n            value = newValue;\n            self.emit(newValue);\n        },\n        updateOptions(newOptions: Partial<Omit<SignalOptions<T>, 'id'>>) {\n            if('id' in newOptions) delete newOptions['id'];\n            Object.assign(usedOptions, newOptions);\n        },\n        emit(value: T) {\n            if (!_staleMode) {\n                const shouldEmit = usedOptions.emitOnValueNotChanged || !usedOptions.compare(self.previousValue, value);\n                if (shouldEmit) {\n                    _listeners.forEach(listener => listener(value));\n                }\n            }\n        },\n        enterStaleMode() { _staleMode = true; },\n        exitStaleMode() { \n            if (!_staleMode) return;\n            _staleMode = false; \n            if (usedOptions?.emitOnExitStaleMode) {\n                self.emit(value);\n            }\n        },\n        setValue(newValue: ((value: T) => T) | T) {\n            self.value = (typeof newValue === 'function') ? \n                (newValue as (value: T) => T)(self.value) :\n                newValue;\n        },\n        subscribe(listener: Listener<T>, subscribeOptions) {\n            const usedSubscribeOptions = {\n                emitOnSubscribe: subscribeOptions?.emitOnSubscribe || false,\n                compare: subscribeOptions?.compare || defaultCompare,\n                ignoreCompare: subscribeOptions?.ignoreCompare || false,\n            };\n            if (usedSubscribeOptions?.emitOnSubscribe) {\n                listener(self.value);\n            }\n\n            const usedListener = usedSubscribeOptions.ignoreCompare ? listener : (value: T) => {\n                const invokeListener \n                    = usedOptions.emitOnValueNotChanged \n                    || !usedSubscribeOptions.compare(self.previousValue, value);\n                if (invokeListener) {\n                    listener(value);\n                }\n            };\n\n            _listeners.push(usedListener);\n            return () => { _listeners = _listeners.filter(l => l !== usedListener); };\n        },\n        disconnect() {\n            _listeners = [];\n            self.linkedSubscriptions.forEach(unsubscribe => unsubscribe());\n            self.linkedSubscriptions.length = 0;\n        },\n        link<L = T>(signal: Signal<L>, pipe?: (value: L) => T) {\n            const unsubscribe = signal.subscribe((value) => {\n                self.value = pipe ? pipe(value) : value as unknown as T;\n            });\n            self.linkedSubscriptions.push(unsubscribe);\n            return unsubscribe;\n        },\n        derive<L = T> (pipe: (value: T) => L, options?: SignalOptions<L>): Signal<L> {\n            return derive(self, createSignal, pipe, options);\n        },\n        /**\n         * Select a property from the current signal using the key of the property.\n         * Using `derive` internally. \n         * @param keysAndSelectors The keys or selectors to select the property\n         * @returns A signal containing the selected property \n         */\n        select(...keysAndSelectors: (keyof any | Selector<any, any>)[]): Signal<any> {\n            return self.derive(_value => extractValue(keysAndSelectors, _value));\n        }\n    };\n    const self = nonCallableSignal\n    return nonCallableSignal;\n}\n\n\n/**\n * Create a signal\n * @param {T} value  The initial value of the signal\n * @param {SignalOptions} options Options for the signal\n * @returns {Signal<T>} A signal\n * @example\n * const counter = signal(0);\n * counter.subscribe(value => console.log(value));\n * counter.setValue(1);\n * counter.setValue((prevValue) => prevValue + 1);\n * // console logs:\n * // > 0\n * // > 1\n * // > 2\n * @example\n * const counter = signal(0, { id: 'counter' });\n * console.log(counter.id);\n * // > 'counter'\n * @example\n * const counter = signal(0, { rememberPrevValue: true });\n * console.log(counter.previousValue);\n * counter.setValue(1);\n * console.log(counter.previousValue);\n * // console logs:\n * // > undefined\n * // > 0\n */\nfunction signal<T>(value: T, options?: SignalOptions<T>): Signal<T> {\n\n    const nonCallableSignal = buildSignal(value, options);\n\n    const callableSignal = function (this: Signal<T>) {\n        return nonCallableSignal.value;\n    };\n    Object.defineProperty(callableSignal, 'value', {\n        get() {\n            return nonCallableSignal.value;\n        },\n        set(newValue: T) {\n            nonCallableSignal.value = newValue;\n        }\n    });\n    Object.defineProperty(callableSignal, 'previousValue', {\n        get() {\n            return nonCallableSignal.previousValue;\n        }\n    });\n    Object.defineProperty(callableSignal, 'listeners', {\n        get() {\n            return nonCallableSignal.listeners;\n        }\n    });\n    Object.defineProperty(callableSignal, 'linkedSubscriptions', {\n        get() {\n            return nonCallableSignal.linkedSubscriptions;\n        }\n    });\n    Object.defineProperty(callableSignal, 'id', {\n        get() {\n            return nonCallableSignal.id;\n        }\n    });\n    callableSignal.subscribe = nonCallableSignal.subscribe;\n    callableSignal.disconnect = nonCallableSignal.disconnect;\n    callableSignal.link = nonCallableSignal.link;\n    callableSignal.derive = nonCallableSignal.derive;\n    callableSignal.select = nonCallableSignal.select;\n    callableSignal.setValue = nonCallableSignal.setValue.bind(nonCallableSignal);\n    callableSignal.emit = nonCallableSignal.emit;\n    callableSignal.updateOptions = nonCallableSignal.updateOptions;\n    callableSignal.enterStaleMode = nonCallableSignal.enterStaleMode;\n    callableSignal.exitStaleMode = nonCallableSignal.exitStaleMode;\n    signalCounter++;\n    return callableSignal as Signal<T>;\n}\n\n/**\n * Create a signal and a function to set the value of the signal\n * @param {T} value  The initial value of the signal\n * @param {SignalOptions} options Options for the signal \n * @returns {[Signal<T>, Signal<T>['setValue']]} A tuple containing the signal and a function to set the value of the signal\n */\nconst createSignal: CreateSignalFn = <T>(value: T, options?: SignalOptions<T>): [Signal<T>, Signal<T>[\"setValue\"]] => {\n    const callableSignal = signal(value, options);\n    return [callableSignal as Signal<T>, callableSignal.setValue];\n}\n\nexport { createSignal, signal, buildSignal };\n\n\n\n\n/** @internal */\nfunction derive<T,L = T>(\n    self: NonCallableSignal<T>,\n    createSignalFn: CreateSignalFn,\n    pipe: (value: T) => L, \n    options?: SignalOptions<L>\n): Signal<L> {\n    const pipedValue =  pipe(self.value);\n    const [derivedSignal, setDerivedSignal] = createSignalFn(pipedValue, options);\n    self.subscribe((value) => {\n        const _pipedValue = pipe(value);\n        setDerivedSignal(_pipedValue);\n    });\n    return derivedSignal;\n}\n\n\n\nconst defaultCompare: NonNullable<SignalOptions['compare']> = <T>(prev: T | undefined, next: T) => prev === next;"],"names":["extractValue","keyOrSelectors","obj","extractedValue","keyOrSelector","key","signalCounter","buildSignal","value","options","usedOptions","defaultCompare","_listeners","_staleMode","_prevValue","_linkedSubscriptions","nonCallableSignal","newValue","self","newOptions","listener","subscribeOptions","usedSubscribeOptions","usedListener","l","unsubscribe","signal","pipe","derive","createSignal","keysAndSelectors","_value","callableSignal","createSignalFn","pipedValue","derivedSignal","setDerivedSignal","_pipedValue","prev","next"],"mappings":"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"}