import { ReadonlySignal, Signal } from "@preact-signals/unified-signals"; import { CollectionTypes } from "./collectionHandlers"; import { type RawSymbol, type ShallowReactiveMarker, toDeepReactive, } from "./reactivity"; import { isSignal } from "./utils"; type BaseTypes = string | number | boolean; export type UnwrapSignal = T extends DeepSignal ? UnwrapSignalSimple : T extends Signal ? V : T extends ReadonlySignal ? V : UnwrapSignalSimple; export type UnwrapSignalSimple = T extends | Function | CollectionTypes | BaseTypes | Signal // | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] | { [RawSymbol]?: true } ? T : T extends ReadonlyArray ? { [K in keyof T]: UnwrapSignalSimple } : T extends object & { [ShallowReactiveMarker]?: never } ? { [P in keyof T]: P extends symbol ? T[P] : UnwrapSignal; } : T; export class DeepSignal extends Signal { constructor(value: T) { super(toDeepReactive(value)); } set value(value: T) { super.value = toDeepReactive(value); } get value() { return super.value; } } export interface DeepSignal extends Signal { __not_exist_deepSignal: true; } export type WrapDeepSignal = T extends Signal ? T : DeepSignal>; /** * * Takes an inner value and returns a reactive and mutable signal, with deepReactive inside of it. * * @param value - The object to wrap in the deepSignal. */ export const deepSignal = /** #__PURE__ */ (value: T): WrapDeepSignal => { if (isSignal(value)) { return value as WrapDeepSignal; } return new DeepSignal(value) as WrapDeepSignal; };