@tanstack/angular-virtual
Version:
Headless UI for virtualizing scrollable elements in Angular
1 lines • 4.89 kB
Source Map (JSON)
{"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;;"}