{"version":3,"file":"qualcomm-ui-angular-core-signals.mjs","sources":["../../src/signals/access-signal.ts","../../src/signals/host-binding.ts","../../src/signals/signalify-object.ts","../../src/signals/qualcomm-ui-angular-core-signals.ts"],"sourcesContent":["// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\nimport {isSignal} from \"@angular/core\"\n\nimport type {MaybeSignal} from \"./signals.types\"\n\n/**\n * Accesses the value of a signal if the provided input is a signal; otherwise,\n * returns the input directly.\n *\n * @param {T | Signal<T>} maybeSignal - The input which can either be a signal or a direct value of type T.\n * @return {T} The resolved value of the signal if the input is a signal, or the input value itself if it is not a signal.\n */\nexport function accessSignal<T>(maybeSignal: MaybeSignal<T>): T {\n  if (!maybeSignal) {\n    return maybeSignal as unknown as T\n  }\n  return isSignal(maybeSignal) ? maybeSignal() : maybeSignal\n}\n","// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\nimport {\n  assertInInjectionContext,\n  effect,\n  ElementRef,\n  type HostBinding,\n  inject,\n  Injector,\n  Renderer2,\n  RendererStyleFlags2,\n  runInInjectionContext,\n  type Signal,\n  type WritableSignal,\n} from \"@angular/core\"\n\n/**\n * `assertInjector` extends `assertInInjectionContext` with an optional `Injector`\n * After assertion, `assertInjector` runs the `runner` function with the guaranteed\n * `Injector` whether it is the default `Injector` within the current **Injection\n * Context** or the custom `Injector` that was passed in.\n *\n * @template {() => any} Runner - Runner is a function that can return anything\n * @param {Function} fn - the Function to pass in `assertInInjectionContext`\n * @param {Injector | undefined | null} injector - the optional \"custom\" Injector\n * @param {Runner} runner - the runner fn\n * @returns {ReturnType<Runner>} result - returns the result of the Runner\n *\n * @example\n * ```ts\n * function injectValue(injector?: Injector) {\n *  return assertInjector(injectValue, injector, () => 'value');\n * }\n *\n * injectValue(); // string\n * ```\n */\nexport function assertInjector<Runner extends () => any>(\n  fn: (...args: unknown[]) => any,\n  injector: Injector | undefined | null,\n  runner: Runner,\n): ReturnType<Runner>\n\n/**\n * `assertInjector` extends `assertInInjectionContext` with an optional `Injector`\n * After assertion, `assertInjector` returns a guaranteed `Injector` whether it is\n * the default `Injector` within the current **Injection Context** or the custom\n * `Injector` that was passed in.\n *\n * @param {Function} fn - the Function to pass in `assertInInjectionContext`\n * @param {Injector | undefined | null} injector - the optional \"custom\" Injector\n * @returns Injector\n */\nexport function assertInjector(\n  fn: (...args: any[]) => unknown,\n  injector: Injector | undefined | null,\n): Injector\nexport function assertInjector(\n  fn: (...args: unknown[]) => unknown,\n  injector: Injector | undefined | null,\n  runner?: () => any,\n) {\n  if (!injector) {\n    assertInInjectionContext(fn)\n  }\n  const assertedInjector = injector ?? inject(Injector)\n\n  if (!runner) {\n    return assertedInjector\n  }\n  return runInInjectionContext(assertedInjector, runner)\n}\n\n/**\n * `hostBinding` takes a `hostPropertyName` to attach a data property, a class, a\n * style or an attribute (as `@HostBinding` would) to the host. The update is\n * applied based on the update of the provided signal.\n *\n * @param hostPropertyName - the same property that is bound to a data property, a class, a style or an attribute as `@HostBinding`.\n * @param signal - the signal on which to react to changes to update the host, and the one that will be returned as it is\n * @returns {Signal | WritableSignal}\n *\n * @example\n * ```ts\n * export class MyComponent {\n *  readonly background = hostBinding('style.background', signal('blue'));\n *\n *  constructor() {\n *    setTimeout(() => this.background.set('red'), 3000);\n *  }\n * }\n * ```\n *\n * TODO: verify with SSR\n */\nexport function hostBinding<T, S extends Signal<T> | WritableSignal<T>>(\n  hostPropertyName: Required<HostBinding>[\"hostPropertyName\"],\n  signal: S,\n  injector?: Injector,\n): S {\n  injector = assertInjector(hostBinding, injector)\n\n  runInInjectionContext(injector, () => {\n    const renderer = inject(Renderer2)\n    const element: HTMLElement = inject(ElementRef).nativeElement\n\n    effect(() => {\n      let prevClasses: string[] = []\n      const value = signal()\n      const [binding, property, unit] = hostPropertyName.split(\".\")\n\n      switch (binding) {\n        case \"style\":\n          renderer.setStyle(\n            element,\n            property,\n            `${value as string}${unit ?? \"\"}`,\n            property.startsWith(\"--\")\n              ? RendererStyleFlags2.DashCase\n              : undefined,\n          )\n          break\n        case \"attr\":\n          if (value == null) {\n            renderer.removeAttribute(element, property)\n          } else {\n            renderer.setAttribute(element, property, String(value))\n          }\n          break\n        case \"class\":\n          if (!property) {\n            if (prevClasses.length) {\n              prevClasses.forEach((k) => renderer.removeClass(element, k))\n            }\n            prevClasses =\n              typeof value === \"string\" ? value.split(\" \").filter(Boolean) : []\n            prevClasses.forEach((k) => renderer.addClass(element, k))\n          } else {\n            if (value) {\n              renderer.addClass(element, property)\n            } else {\n              renderer.removeClass(element, property)\n            }\n          }\n          break\n        default:\n          renderer.setProperty(element, binding, value)\n      }\n    })\n  })\n\n  return signal\n}\n","// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n// SPDX-License-Identifier: BSD-3-Clause-Clear\n\nimport {computed, signal, type Signal, untracked} from \"@angular/core\"\n\n/**\n * Converts an object's function properties to computed signals.\n */\nexport function signalifyObject<T extends Record<string, any>>(\n  someObject: T,\n): T {\n  const objectSignal = signal<T>(someObject)\n\n  return new Proxy(objectSignal, {\n    apply() {\n      return objectSignal()\n    },\n    get(target: any, property: any): any {\n      if (target[property]) {\n        return target[property]\n      }\n      const untrackedObject: any = untracked(objectSignal)\n      const maybeFn = untrackedObject[property]\n      if (typeof maybeFn === \"function\") {\n        Object.defineProperty(target, property, {\n          configurable: true,\n          enumerable: true,\n          value: toComputed(objectSignal, maybeFn),\n        })\n        return target[property]\n      }\n      return (target[property] = untrackedObject[property])\n    },\n    getOwnPropertyDescriptor() {\n      return {\n        configurable: true,\n        enumerable: true,\n      }\n    },\n    has(_, prop: string) {\n      return !!untracked(objectSignal)[prop]\n    },\n    ownKeys() {\n      return Reflect.ownKeys(untracked(objectSignal))\n    },\n  })\n}\n\n/**\n * Since we cannot automatically detect the parameters of accessors, we will wrap\n * all accessors in a cached function. This function will wrap a computed value that\n * returns its result based on the given parameters.\n */\nfunction toComputed(signal: Signal<any>, fn: (...args: unknown[]) => unknown) {\n  const hasArgs = fn.length > 0\n  if (!hasArgs) {\n    return computed(() => {\n      void signal()\n      return fn()\n    })\n  }\n\n  const computedCache: Record<string, Signal<unknown>> = {}\n\n  return (...argsArray: any[]) => {\n    const serializedArgs = serializeArgs(...argsArray)\n    if (computedCache.hasOwnProperty(serializedArgs)) {\n      return computedCache[serializedArgs]?.()\n    }\n    const computedSignal = computed(() => {\n      void signal()\n      return fn(...argsArray)\n    })\n\n    computedCache[serializedArgs] = computedSignal\n\n    return computedSignal()\n  }\n}\n\nfunction serializeArgs(...args: any[]) {\n  return JSON.stringify(args)\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}