import { getProxy } from './ObservableObject'; import { ObservablePrimitiveClass } from './ObservablePrimitive'; import { __devExtractFunctionsAndComputedsNodes, extractFunctionsAndComputeds } from './globals'; import { isActualPrimitive, isPromise } from './is'; import type { NodeValue, Observable, ObservableObjectOrArray, ObservablePrimitive, ObservableRoot, } from './observableInterfaces'; function createObservable(value?: T | Promise, makePrimitive?: true): ObservablePrimitive; function createObservable( value?: T | Promise, makePrimitive?: boolean, ): ObservablePrimitive | ObservableObjectOrArray { const valueIsPromise = isPromise(value); const root: ObservableRoot = { _: valueIsPromise ? undefined : value, }; const node: NodeValue = { root, }; const prim = makePrimitive || isActualPrimitive(value); const obs = prim ? (new (ObservablePrimitiveClass as any)(node) as ObservablePrimitive) : (getProxy(node) as ObservableObjectOrArray); if (valueIsPromise) { value.catch((error) => { obs.set({ error } as any); }); value.then((value) => { obs.set(value); }); } else if (!prim) { if (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') { __devExtractFunctionsAndComputedsNodes!.clear(); } if (value) { extractFunctionsAndComputeds(value, node); } } return obs; } export function observable(value?: T | Promise): Observable { return createObservable(value) as Observable; } export function observablePrimitive(value?: T | Promise): ObservablePrimitive { return createObservable(value, /*makePrimitive*/ true); }