{"version":3,"file":"proxy.cjs","sources":["../../src/proxy.ts"],"sourcesContent":["import { computed, untracked } from '@angular/core'\nimport type { Signal } from '@angular/core'\n\ntype SignalProxy<\n  TInput extends Record<string | symbol, any>,\n  TMethodsToPassThrough extends keyof TInput,\n  TAttributesToTransformToSignals extends keyof TInput,\n  TMethodsToTrack extends keyof TInput,\n  TMethodsToTransformToSignals extends keyof TInput,\n> = {\n  [K in TMethodsToPassThrough]: TInput[K]\n} & {\n  [K in TAttributesToTransformToSignals]: Signal<TInput[K]>\n} & {\n  [K in TMethodsToTrack]: TInput[K]\n} & {\n  [K in TMethodsToTransformToSignals]: Signal<ReturnType<TInput[K]>>\n}\n\nexport function signalProxy<\n  TInput extends Record<string | symbol, any>,\n  TMethodsToPassThrough extends keyof TInput,\n  TAttributesToTransformToSignals extends keyof TInput,\n  TMethodsToTrack extends keyof TInput,\n  TMethodsToTransformToSignals extends keyof TInput,\n>(\n  inputSignal: Signal<TInput>,\n  methodsToPassThrough: Array<TMethodsToPassThrough>,\n  attributesToTransformToSignals: Array<TAttributesToTransformToSignals>,\n  methodsToTrack: Array<TMethodsToTrack>,\n  methodsToTransformToSignals: Array<TMethodsToTransformToSignals>,\n): SignalProxy<\n  TInput,\n  TMethodsToPassThrough,\n  TAttributesToTransformToSignals,\n  TMethodsToTrack,\n  TMethodsToTransformToSignals\n> {\n  // Type needed to proxy with the apply handler\n  const callableTarget = (() => inputSignal()) as (() => TInput) &\n    Record<PropertyKey, unknown>\n\n  return new Proxy(callableTarget, {\n    apply() {\n      return inputSignal()\n    },\n    get(target, property) {\n      const fieldValue = target[property as keyof typeof callableTarget]\n      if (fieldValue !== undefined) return fieldValue\n\n      // Methods that pass through: call on the instance without tracking the signal read\n      if (methodsToPassThrough.includes(property as TMethodsToPassThrough)) {\n        return (target[property] = (\n          ...args: Parameters<TInput[typeof property]>\n        ) => untracked(inputSignal)[property as keyof TInput](...args))\n      }\n\n      // Zero-arg methods exposed as computed signals\n      if (\n        methodsToTransformToSignals.includes(\n          property as TMethodsToTransformToSignals,\n        )\n      ) {\n        return (target[property] = computed(() =>\n          (inputSignal()[property as keyof TInput] as () => unknown)(),\n        ))\n      }\n\n      // Methods that need to be tracked, track instance changes and call the method\n      if (methodsToTrack.includes(property as TMethodsToTrack)) {\n        return (target[property] = (\n          ...args: Parameters<TInput[typeof property]>\n        ) => inputSignal()[property as keyof TInput](...args))\n      }\n\n      // Other values that are tracked as signals\n      if (\n        attributesToTransformToSignals.includes(\n          property as TAttributesToTransformToSignals,\n        )\n      ) {\n        return (target[property] = computed(\n          () => inputSignal()[property as keyof TInput],\n        ))\n      }\n\n      // All other fields. Any field that is not handled above will fail if the signal includes\n      // input or model signals from a component and this is accessed before initialization.\n      return untracked(inputSignal)[property as keyof TInput]\n    },\n    has(_, property: PropertyKey) {\n      return property in untracked(inputSignal)\n    },\n    ownKeys() {\n      return Reflect.ownKeys(untracked(inputSignal))\n    },\n    getOwnPropertyDescriptor() {\n      return {\n        enumerable: true,\n        configurable: true,\n      }\n    },\n  }) as SignalProxy<\n    TInput,\n    TMethodsToPassThrough,\n    TAttributesToTransformToSignals,\n    TMethodsToTrack,\n    TMethodsToTransformToSignals\n  >\n}\n"],"names":["untracked","computed"],"mappings":";;;AAmBO,SAAS,YAOd,aACA,sBACA,gCACA,gBACA,6BAOA;AAEA,QAAM,kBAAkB,MAAM;AAG9B,SAAO,IAAI,MAAM,gBAAgB;AAAA,IAC/B,QAAQ;AACN,aAAO,YAAA;AAAA,IACT;AAAA,IACA,IAAI,QAAQ,UAAU;AACpB,YAAM,aAAa,OAAO,QAAuC;AACjE,UAAI,eAAe,OAAW,QAAO;AAGrC,UAAI,qBAAqB,SAAS,QAAiC,GAAG;AACpE,eAAQ,OAAO,QAAQ,IAAI,IACtB,SACAA,eAAU,WAAW,EAAE,QAAwB,EAAE,GAAG,IAAI;AAAA,MAC/D;AAGA,UACE,4BAA4B;AAAA,QAC1B;AAAA,MAAA,GAEF;AACA,eAAQ,OAAO,QAAQ,IAAIC,KAAAA;AAAAA,UAAS,MACjC,YAAA,EAAc,QAAwB,EAAA;AAAA,QAAoB;AAAA,MAE/D;AAGA,UAAI,eAAe,SAAS,QAA2B,GAAG;AACxD,eAAQ,OAAO,QAAQ,IAAI,IACtB,SACA,cAAc,QAAwB,EAAE,GAAG,IAAI;AAAA,MACtD;AAGA,UACE,+BAA+B;AAAA,QAC7B;AAAA,MAAA,GAEF;AACA,eAAQ,OAAO,QAAQ,IAAIA,KAAAA;AAAAA,UACzB,MAAM,YAAA,EAAc,QAAwB;AAAA,QAAA;AAAA,MAEhD;AAIA,aAAOD,KAAAA,UAAU,WAAW,EAAE,QAAwB;AAAA,IACxD;AAAA,IACA,IAAI,GAAG,UAAuB;AAC5B,aAAO,YAAYA,KAAAA,UAAU,WAAW;AAAA,IAC1C;AAAA,IACA,UAAU;AACR,aAAO,QAAQ,QAAQA,KAAAA,UAAU,WAAW,CAAC;AAAA,IAC/C;AAAA,IACA,2BAA2B;AACzB,aAAO;AAAA,QACL,YAAY;AAAA,QACZ,cAAc;AAAA,MAAA;AAAA,IAElB;AAAA,EAAA,CACD;AAOH;;"}