{"version":3,"file":"qualcomm-ui-angular-core-virtual.mjs","sources":["../../src/virtual/proxy.ts","../../src/virtual/types.ts","../../src/virtual/virtual.ts","../../src/virtual/qualcomm-ui-angular-core-virtual.ts"],"sourcesContent":["// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\nimport {\n  computed,\n  type Signal,\n  untracked,\n  type WritableSignal,\n} from \"@angular/core\"\nimport type {Virtualizer} from \"@tanstack/virtual-core\"\n\nimport type {AngularVirtualizer} from \"./types\"\n\nexport function proxyVirtualizer<\n  V extends Virtualizer<any, any>,\n  S extends Element | Window = V extends Virtualizer<infer U, any> ? U : never,\n  I extends Element = V extends Virtualizer<any, infer U> ? U : never,\n>(\n  virtualizerSignal: WritableSignal<V>,\n  lazyInit: () => V,\n): AngularVirtualizer<S, I> {\n  return new Proxy(virtualizerSignal, {\n    apply() {\n      return virtualizerSignal()\n    },\n    get(target, property) {\n      const untypedTarget: any = target as NonNullable<unknown>\n      if (untypedTarget[property]) {\n        return untypedTarget[property]\n      }\n      let virtualizer = untracked(virtualizerSignal)\n      if (virtualizer == null) {\n        virtualizer = lazyInit()\n        untracked(() => virtualizerSignal.set(virtualizer))\n      }\n\n      // Create computed signals for each property that represents a reactive value\n      if (\n        typeof property === \"string\" &&\n        [\n          \"getTotalSize\",\n          \"getVirtualItems\",\n          \"isScrolling\",\n          \"options\",\n          \"range\",\n          \"scrollDirection\",\n          \"scrollElement\",\n          \"scrollOffset\",\n          \"scrollRect\",\n          \"measureElementCache\",\n          \"measurementsCache\",\n        ].includes(property)\n      ) {\n        const isFunction =\n          typeof virtualizer[property as keyof V] === \"function\"\n        Object.defineProperty(untypedTarget, property, {\n          configurable: true,\n          enumerable: true,\n          value: isFunction\n            ? computed(() =>\n                (\n                  target()[property as keyof V] as (\n                    ...args: unknown[]\n                  ) => unknown\n                )(),\n              )\n            : computed(() => target()[property as keyof V]),\n        })\n      }\n\n      // Create plain signals for functions that accept arguments and return\n      // reactive values\n      if (\n        typeof property === \"string\" &&\n        [\n          \"getOffsetForAlignment\",\n          \"getOffsetForIndex\",\n          \"getVirtualItemForOffset\",\n          \"indexFromElement\",\n        ].includes(property)\n      ) {\n        const fn = virtualizer[property as keyof V] as (\n          ...args: unknown[]\n        ) => unknown\n        Object.defineProperty(untypedTarget, property, {\n          configurable: true,\n          enumerable: true,\n          value: toComputed(virtualizerSignal, fn),\n        })\n      }\n\n      return untypedTarget[property] || virtualizer[property as keyof V]\n    },\n    getOwnPropertyDescriptor() {\n      return {\n        configurable: true,\n        enumerable: true,\n      }\n    },\n    has(_, property: string) {\n      return !!untracked(virtualizerSignal)[property as keyof V]\n    },\n    ownKeys() {\n      return Reflect.ownKeys(untracked(virtualizerSignal))\n    },\n  }) as unknown as AngularVirtualizer<S, I>\n}\n\nfunction toComputed<V extends Virtualizer<any, any>>(\n  signal: Signal<V>,\n  fn: (...args: unknown[]) => unknown,\n) {\n  const computedCache: Record<string, Signal<unknown>> = {}\n\n  return (...args: Array<any>) => {\n    // Cache computeds by their arguments to avoid re-creating the computed on each\n    // call\n    const serializedArgs = serializeArgs(...args)\n    if (computedCache.hasOwnProperty(serializedArgs)) {\n      return computedCache[serializedArgs]?.()\n    }\n    const computedSignal = computed(() => {\n      void signal()\n      return fn(...args)\n    })\n\n    computedCache[serializedArgs] = computedSignal\n\n    return computedSignal()\n  }\n}\n\nfunction serializeArgs(...args: Array<any>) {\n  return JSON.stringify(args)\n}\n","// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\nimport type {Signal} from \"@angular/core\"\nimport type {Virtualizer} from \"@tanstack/virtual-core\"\n\nexport type AngularVirtualizer<\n  TScrollElement extends Element | Window,\n  TItemElement extends Element,\n> = Omit<\n  Virtualizer<TScrollElement, TItemElement>,\n  | \"getTotalSize\"\n  | \"getVirtualItems\"\n  | \"isScrolling\"\n  | \"options\"\n  | \"range\"\n  | \"scrollDirection\"\n  | \"scrollElement\"\n  | \"scrollOffset\"\n  | \"scrollRect\"\n> & {\n  getTotalSize: Signal<\n    ReturnType<Virtualizer<TScrollElement, TItemElement>[\"getTotalSize\"]>\n  >\n  getVirtualItems: Signal<\n    ReturnType<Virtualizer<TScrollElement, TItemElement>[\"getVirtualItems\"]>\n  >\n  isScrolling: Signal<Virtualizer<TScrollElement, TItemElement>[\"isScrolling\"]>\n  options: Signal<Virtualizer<TScrollElement, TItemElement>[\"options\"]>\n  range: Signal<Virtualizer<TScrollElement, TItemElement>[\"range\"]>\n  scrollDirection: Signal<\n    Virtualizer<TScrollElement, TItemElement>[\"scrollDirection\"]\n  >\n  scrollElement: Signal<\n    Virtualizer<TScrollElement, TItemElement>[\"scrollElement\"]\n  >\n  scrollOffset: Signal<\n    Virtualizer<TScrollElement, TItemElement>[\"scrollOffset\"]\n  >\n  scrollRect: Signal<Virtualizer<TScrollElement, TItemElement>[\"scrollRect\"]>\n}\n","// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\n/**\n * Forked from @tanstack/angular-virtual. TODO: create PR and fix the library.\n * Potential issue: the library intends to support older versions of Angular which\n * emits warnings on newer versions because they are using deprecated features. May\n * need to maintain this fork for a while.\n */\nimport {DOCUMENT} from \"@angular/common\"\nimport {\n  afterNextRender,\n  computed,\n  DestroyRef,\n  effect,\n  type ElementRef,\n  inject,\n  InjectionToken,\n  type Signal,\n  signal,\n  untracked,\n} from \"@angular/core\"\nimport {\n  elementScroll,\n  observeElementOffset,\n  observeElementRect,\n  observeWindowOffset,\n  observeWindowRect,\n  type PartialKeys,\n  Virtualizer,\n  type VirtualizerOptions,\n  windowScroll,\n} from \"@tanstack/virtual-core\"\n\nimport {WINDOW} from \"@qualcomm-ui/angular-core/dom\"\n\nimport {proxyVirtualizer} from \"./proxy\"\nimport type {AngularVirtualizer} from \"./types\"\n\nexport * from \"@tanstack/virtual-core\"\nexport * from \"./types\"\n\nfunction createVirtualizerBase<\n  TScrollElement extends Element | Window,\n  TItemElement extends Element,\n>(\n  options: Signal<VirtualizerOptions<TScrollElement, TItemElement>>,\n): AngularVirtualizer<TScrollElement, TItemElement> {\n  let virtualizer: Virtualizer<TScrollElement, TItemElement>\n  function lazyInit() {\n    virtualizer ??= new Virtualizer(options())\n    return virtualizer\n  }\n\n  const virtualizerSignal = signal(virtualizer!, {equal: () => false})\n\n  // two-way sync options\n  effect(() => {\n    const _options = options()\n    lazyInit()\n    virtualizerSignal.set(virtualizer)\n    virtualizer.setOptions({\n      ..._options,\n      onChange: (instance, sync) => {\n        // update virtualizerSignal so that dependent computeds recompute.\n        virtualizerSignal.set(instance)\n        _options.onChange?.(instance, sync)\n      },\n    })\n    // update virtualizerSignal so that dependent computeds recompute.\n    virtualizerSignal.set(virtualizer)\n  })\n\n  const scrollElement = computed(() => options().getScrollElement())\n  // let the virtualizer know when the scroll element is changed\n  effect(() => {\n    const el = scrollElement()\n    if (el) {\n      untracked(virtualizerSignal)._willUpdate()\n    }\n  })\n\n  let cleanup: () => void | undefined\n  afterNextRender({read: () => (virtualizer ?? lazyInit())._didMount()})\n\n  // @ts-ignore use before assign\n  inject(DestroyRef).onDestroy(() => cleanup?.())\n\n  return proxyVirtualizer(virtualizerSignal, lazyInit)\n}\n\nexport const ANGULAR_VIRTUALIZER_INSTANCE_TOKEN = new InjectionToken<\n  AngularVirtualizer<any, any>\n>(\"VIRTUALIZER_TOKEN\")\n\nexport type AngularVirtualizerOptions<\n  TScrollElement extends Element,\n  TItemElement extends Element,\n> = PartialKeys<\n  Omit<VirtualizerOptions<TScrollElement, TItemElement>, \"getScrollElement\">,\n  \"observeElementRect\" | \"observeElementOffset\" | \"scrollToFn\"\n> & {\n  scrollElement: ElementRef<TScrollElement> | TScrollElement | undefined\n}\n\nexport function injectVirtualizer<\n  TScrollElement extends Element,\n  TItemElement extends Element,\n>(\n  options: () => AngularVirtualizerOptions<TScrollElement, TItemElement>,\n): AngularVirtualizer<TScrollElement, TItemElement> {\n  const resolvedOptions = computed(() => {\n    return {\n      getScrollElement: () => {\n        const elementOrRef = options().scrollElement\n        return (\n          (isElementRef(elementOrRef)\n            ? elementOrRef.nativeElement\n            : elementOrRef) ?? null\n        )\n      },\n      observeElementOffset,\n      observeElementRect,\n      scrollToFn: elementScroll,\n      ...options(),\n    }\n  })\n  return createVirtualizerBase<TScrollElement, TItemElement>(resolvedOptions)\n}\n\nfunction isElementRef<T extends Element>(\n  elementOrRef: ElementRef<T> | T | undefined,\n): elementOrRef is ElementRef<T> {\n  return elementOrRef != null && \"nativeElement\" in elementOrRef\n}\n\nexport function injectWindowVirtualizer<TItemElement extends Element>(\n  options: () => PartialKeys<\n    VirtualizerOptions<Window, TItemElement>,\n    | \"getScrollElement\"\n    | \"observeElementRect\"\n    | \"observeElementOffset\"\n    | \"scrollToFn\"\n  >,\n): AngularVirtualizer<Window, TItemElement> {\n  const document = inject(DOCUMENT)\n  const window = inject(WINDOW)\n  const resolvedOptions = computed(() => {\n    return {\n      getScrollElement: () => (typeof document !== \"undefined\" ? window : null),\n      initialOffset: () =>\n        typeof document !== \"undefined\" ? window.scrollY : 0,\n      observeElementOffset: observeWindowOffset,\n      observeElementRect: observeWindowRect,\n      scrollToFn: windowScroll,\n      ...options(),\n    }\n  })\n  return createVirtualizerBase<Window, TItemElement>(resolvedOptions)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}