{"version":3,"file":"ng-lazyload-image.mjs","sources":["../../src/util/util.ts","../../src/types.ts","../../src/util/css.util.ts","../../src/shared-hooks/hooks.ts","../../src/intersection-observer-hooks/hooks.ts","../../src/lazyload-image.ts","../../src/token.ts","../../src/lazyload-image.directive.ts","../../src/lazyload-image.module.ts","../../src/scroll-hooks/rect.ts","../../src/scroll-hooks/hooks.ts","../../ng-lazyload-image.ts"],"sourcesContent":["export function getNavigator(): Navigator | undefined {\n  return typeof window !== 'undefined' ? window.navigator : undefined;\n}\n\nexport function isChildOfPicture(element: HTMLImageElement | HTMLDivElement): boolean {\n  return Boolean(element.parentElement && element.parentElement.nodeName.toLowerCase() === 'picture');\n}\n\nexport function isImageElement(element: HTMLImageElement | HTMLDivElement): element is HTMLImageElement {\n  return element.nodeName.toLowerCase() === 'img';\n}\n\nexport function setImage(element: HTMLImageElement | HTMLDivElement, imagePath: string, useSrcset?: boolean) {\n  if (isImageElement(element)) {\n    if (useSrcset && 'srcset' in element) {\n      element.srcset = imagePath;\n    } else {\n      element.src = imagePath;\n    }\n  } else {\n    element.style.backgroundImage = `url('${imagePath}')`;\n  }\n  return element;\n}\n\nfunction setSources(attrName: string) {\n  return (image: HTMLImageElement) => {\n    const sources = image.parentElement!.getElementsByTagName('source');\n    for (let i = 0; i < sources.length; i++) {\n      const attrValue = sources[i].getAttribute(attrName);\n      if (attrValue) {\n        // Check if `srcset` is supported by the current browser\n        if ('srcset' in sources[i]) {\n          sources[i].srcset = attrValue;\n        } else {\n          sources[i].src = attrValue;\n        }\n      }\n    }\n  };\n}\n\nconst setSourcesToDefault = setSources('defaultImage');\nexport const setSourcesToLazy = setSources('lazyLoad');\nconst setSourcesToError = setSources('errorImage');\n\nfunction setImageAndSources(setSourcesFn: (image: HTMLImageElement) => void) {\n  return (element: HTMLImageElement | HTMLDivElement, imagePath?: string, useSrcset?: boolean) => {\n    if (isImageElement(element) && isChildOfPicture(element)) {\n      setSourcesFn(element);\n    }\n    if (imagePath) {\n      setImage(element, imagePath, useSrcset);\n    }\n  };\n}\n\nexport const setImageAndSourcesToDefault = setImageAndSources(setSourcesToDefault);\nexport const setImageAndSourcesToLazy = setImageAndSources(setSourcesToLazy);\nexport const setImageAndSourcesToError = setImageAndSources(setSourcesToError);\n","import { EventEmitter } from '@angular/core';\nimport { Observable, ObservableInput } from 'rxjs';\nimport { getNavigator } from './util/util';\n\nexport type StateChange = {\n  reason: 'setup' | 'observer-emit' | 'start-loading' | 'mount-image' | 'loading-failed' | 'loading-succeeded' | 'finally';\n  data?: unknown;\n};\n\nexport type Attributes<T = any> = {\n  /**\n   * A reference to the element\n   */\n  element: HTMLImageElement | HTMLDivElement;\n  /**\n   * A URI path to the image to be lazyloaded\n   */\n  imagePath: string;\n  /**\n   * A URI path to the default image\n   */\n  defaultImagePath?: string;\n  /**\n   * A URI path to the error image\n   */\n  errorImagePath?: string;\n  /**\n   * If true, use a `srcset` for the image\n   */\n  useSrcset?: boolean;\n  /**\n   * Number of pixels to use as offset in all directions\n   */\n  offset: number;\n  /**\n   * A reference to the scroll container, if not window\n   */\n  scrollContainer?: HTMLElement;\n  /**\n   * A custom customObservable.\n   */\n  customObservable?: Observable<T>;\n  /**\n   * If true, try to decode the image before put it to the DOM\n   */\n  decode?: boolean;\n  /**\n   * If true, try to decode the image before put it to the DOM\n   */\n  onStateChange: EventEmitter<StateChange>;\n  /**\n   * A uniq id for the image\n   */\n  id: string;\n};\n\nexport abstract class Hooks<E = unknown> {\n  navigator?: Navigator = getNavigator();\n  protected platformId!: Object;\n\n  setPlatformId(platformId: Object) {\n    this.platformId = platformId;\n  }\n\n  abstract getObservable(attributes: Attributes): Observable<E>;\n  abstract isVisible(event: E, attributes: Attributes): boolean;\n  abstract loadImage(attributes: Attributes): ObservableInput<string>;\n  abstract setLoadedImage(imagePath: string, attributes: Attributes): void;\n  abstract setErrorImage(error: Error, attributes: Attributes): void;\n  abstract setup(attributes: Attributes): void;\n  abstract finally(attributes: Attributes): void;\n  abstract isBot(attributes?: Attributes): boolean;\n  abstract isDisabled(): boolean;\n  abstract skipLazyLoading(attributes: Attributes): boolean;\n  onDestroy(attributes: Attributes): void {}\n  onAttributeChange(newAttributes: Attributes): void {}\n}\n","export const cssClassNames = {\n  loaded: 'ng-lazyloaded',\n  loading: 'ng-lazyloading',\n  failed: 'ng-failed-lazyloaded',\n};\n\nexport function removeCssClassName(element: HTMLImageElement | HTMLDivElement, cssClassName: string) {\n  element.className = element.className.replace(cssClassName, '');\n}\n\nexport function addCssClassName(element: HTMLImageElement | HTMLDivElement, cssClassName: string) {\n  if (!element.className.includes(cssClassName)) {\n    element.className += ` ${cssClassName}`;\n  }\n}\n\nexport function hasCssClassName(element: HTMLImageElement | HTMLDivElement, cssClassName: string) {\n  return element.className && element.className.includes(cssClassName);\n}\n","import { isPlatformServer } from '@angular/common';\nimport { ObservableInput } from 'rxjs';\nimport { Attributes, Hooks } from '../types';\nimport { addCssClassName, cssClassNames, hasCssClassName, removeCssClassName } from '../util/css.util';\nimport { isChildOfPicture, isImageElement, setImage, setImageAndSourcesToDefault, setImageAndSourcesToError, setImageAndSourcesToLazy, setSourcesToLazy } from '../util/util';\n\nexport abstract class SharedHooks<E> extends Hooks<E> {\n  setup(attributes: Attributes): void {\n    setImageAndSourcesToDefault(attributes.element, attributes.defaultImagePath, attributes.useSrcset);\n    if (attributes.imagePath) {\n      addCssClassName(attributes.element, cssClassNames.loading);\n    }\n\n    if (hasCssClassName(attributes.element, cssClassNames.loaded)) {\n      removeCssClassName(attributes.element, cssClassNames.loaded);\n    }\n  }\n\n  finally(attributes: Attributes): void {\n    addCssClassName(attributes.element, cssClassNames.loaded);\n    removeCssClassName(attributes.element, cssClassNames.loading);\n  }\n\n  loadImage(attributes: Attributes): ObservableInput<string> {\n    if (this.skipLazyLoading(attributes)) {\n      // Set the image right away for bots for better SEO\n      return [attributes.imagePath];\n    }\n    const { element, useSrcset, imagePath, decode } = attributes;\n    let img: HTMLImageElement;\n    if (isImageElement(element) && isChildOfPicture(element)) {\n      const parentClone = element.parentNode!.cloneNode(true) as HTMLPictureElement;\n      img = parentClone.getElementsByTagName('img')[0];\n      setSourcesToLazy(img);\n      setImage(img, imagePath, useSrcset);\n    } else {\n      img = new Image();\n      if (isImageElement(element) && element.referrerPolicy) {\n        img.referrerPolicy = element.referrerPolicy;\n      }\n      if (isImageElement(element) && element.sizes) {\n        img.sizes = element.sizes;\n      }\n      if (useSrcset && 'srcset' in img) {\n        img.srcset = imagePath;\n      } else {\n        img.src = imagePath;\n      }\n    }\n\n    if (decode && img.decode) {\n      return img.decode().then(() => imagePath);\n    }\n\n    return new Promise<string>((resolve, reject) => {\n      img.onload = () => resolve(imagePath);\n      img.onerror = () => reject(null);\n    });\n  }\n\n  setErrorImage(error: Error, attributes: Attributes): void {\n    const { element, useSrcset, errorImagePath } = attributes;\n    setImageAndSourcesToError(element, errorImagePath, useSrcset);\n    addCssClassName(element, cssClassNames.failed);\n  }\n\n  setLoadedImage(imagePath: string, attributes: Attributes): void {\n    const { element, useSrcset } = attributes;\n    setImageAndSourcesToLazy(element, imagePath, useSrcset);\n  }\n\n  isDisabled(): boolean {\n    // Disable if SSR and the user isn't a bot\n    return isPlatformServer(this.platformId) && !this.isBot();\n  }\n\n  skipLazyLoading(attributes: Attributes): boolean {\n    return this.isBot(attributes);\n  }\n\n  isBot(attributes?: Attributes): boolean {\n    if (this.navigator?.userAgent) {\n      return /googlebot|bingbot|yandex|baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\\ link\\ preview|showyoubot|outbrain|pinterest\\/0\\.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|duckduckbot|prerender/i.test(\n        this.navigator.userAgent\n      );\n    }\n    return false;\n  }\n}\n","import { Observable, of, Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { SharedHooks } from '../shared-hooks/hooks';\nimport { Attributes } from '../types';\n\nexport class IntersectionObserverHooks extends SharedHooks<{ isIntersecting: boolean }> {\n  private readonly observers = new WeakMap<Element | {}, IntersectionObserver>();\n  private readonly intersectionSubject = new Subject<IntersectionObserverEntry>();\n  private readonly uniqKey = {};\n\n  getObservable(attributes: Attributes<{ isIntersecting: boolean }>): Observable<{ isIntersecting: boolean }> {\n    if (this.skipLazyLoading(attributes)) {\n      return of({ isIntersecting: true });\n    }\n    if (attributes.customObservable) {\n      return attributes.customObservable;\n    }\n    const scrollContainerKey = attributes.scrollContainer || this.uniqKey;\n    const options: ObserverOptions = {\n      root: attributes.scrollContainer || null,\n    };\n    if (attributes.offset) {\n      options.rootMargin = `${attributes.offset}px`;\n    }\n\n    let observer = this.observers.get(scrollContainerKey);\n\n    if (!observer) {\n      observer = new IntersectionObserver((entrys) => this.loadingCallback(entrys), options);\n      this.observers.set(scrollContainerKey, observer);\n    }\n\n    observer.observe(attributes.element);\n\n    return Observable.create((obs: Subject<IntersectionObserverEntry>) => {\n      const subscription = this.intersectionSubject.pipe(filter((entry) => entry.target === attributes.element)).subscribe(obs);\n      return () => {\n        subscription.unsubscribe();\n        observer!.unobserve(attributes.element);\n      };\n    });\n  }\n\n  isVisible(event: { isIntersecting: boolean }): boolean {\n    return event.isIntersecting;\n  }\n\n  private loadingCallback(entrys: IntersectionObserverEntry[]) {\n    entrys.forEach((entry) => this.intersectionSubject.next(entry));\n  }\n}\n\ninterface ObserverOptions {\n  root: Element | null;\n  rootMargin?: string;\n}\n","import { Observable, of } from 'rxjs';\nimport { catchError, filter, map, mergeMap, take, tap } from 'rxjs/operators';\nimport { Attributes, Hooks } from './types';\n\nexport function lazyLoadImage<E>(hooks: Hooks<E>, attributes: Attributes) {\n  return (evntObservable: Observable<E>): Observable<boolean> => {\n    return evntObservable.pipe(\n      tap((data) => attributes.onStateChange.emit({ reason: 'observer-emit', data })),\n      filter((event) => hooks.isVisible(event, attributes)),\n      take(1),\n      tap(() => attributes.onStateChange.emit({ reason: 'start-loading' })),\n      mergeMap(() => hooks.loadImage(attributes)),\n      tap(() => attributes.onStateChange.emit({ reason: 'mount-image' })),\n      tap((imagePath) => hooks.setLoadedImage(imagePath, attributes)),\n      tap(() => attributes.onStateChange.emit({ reason: 'loading-succeeded' })),\n      map(() => true),\n      catchError((error) => {\n        attributes.onStateChange.emit({ reason: 'loading-failed', data: error });\n        hooks.setErrorImage(error, attributes);\n        return of(false);\n      }),\n      tap(() => {\n        attributes.onStateChange.emit({ reason: 'finally' });\n        hooks.finally(attributes);\n      })\n    ) as Observable<boolean>;\n  };\n}\n","import { InjectionToken } from '@angular/core';\nimport { Hooks } from './types';\n\nexport const LAZYLOAD_IMAGE_HOOKS = new InjectionToken<Hooks>('LazyLoadImageHooks');\n","import { AfterContentInit, Directive, ElementRef, EventEmitter, Inject, Input, NgZone, OnChanges, OnDestroy, Output, PLATFORM_ID } from '@angular/core';\nimport { never, Observable, ReplaySubject, Subscription } from 'rxjs';\nimport { switchMap, take, tap } from 'rxjs/operators';\nimport { lazyLoadImage } from './lazyload-image';\nimport { LAZYLOAD_IMAGE_HOOKS } from './token';\nimport { Attributes, Hooks, StateChange } from './types';\n\n@Directive({\n  selector: '[lazyLoad]',\n})\nexport class LazyLoadImageDirective implements OnChanges, AfterContentInit, OnDestroy {\n  @Input('lazyLoad') lazyImage!: string; // The image to be lazy loaded\n  @Input() defaultImage?: string; // The image to be displayed before lazyImage is loaded\n  @Input() errorImage?: string; // The image to be displayed if lazyImage load fails\n  @Input() scrollTarget?: any; // Scroll container that contains the image and emits scoll events\n  @Input() customObservable?: Observable<any>; // Pass your own event emitter\n  @Input() offset?: number; // The number of px a image should be loaded before it is in view port\n  @Input() useSrcset?: boolean; // Whether srcset attribute should be used instead of src\n  @Input() decode?: boolean; // Decode the image before appending to the DOM\n  @Input() debug?: boolean; // Will print some debug info when `true`\n  @Output() onStateChange: EventEmitter<StateChange> = new EventEmitter(); // Emits an event on every state change\n  private propertyChanges$: ReplaySubject<Attributes>;\n  private elementRef: ElementRef;\n  private ngZone: NgZone;\n  private loadSubscription?: Subscription;\n  private debugSubscription?: Subscription;\n  private hooks: Hooks;\n  private uid: string;\n\n  constructor(el: ElementRef, ngZone: NgZone, @Inject(PLATFORM_ID) platformId: Object, @Inject(LAZYLOAD_IMAGE_HOOKS) hooks: Hooks) {\n    this.elementRef = el;\n    this.ngZone = ngZone;\n    this.propertyChanges$ = new ReplaySubject();\n    this.hooks = hooks;\n    this.hooks.setPlatformId(platformId);\n    this.uid = Math.random().toString(36).substr(2, 9);\n  }\n\n  ngOnChanges() {\n    if (this.debug === true && !this.debugSubscription) {\n      this.debugSubscription = this.onStateChange.subscribe((e: StateChange) => console.log(e));\n    }\n\n    this.propertyChanges$.next({\n      element: this.elementRef.nativeElement,\n      imagePath: this.lazyImage,\n      defaultImagePath: this.defaultImage,\n      errorImagePath: this.errorImage,\n      useSrcset: this.useSrcset,\n      offset: this.offset ? this.offset | 0 : 0,\n      scrollContainer: this.scrollTarget,\n      customObservable: this.customObservable,\n      decode: this.decode,\n      onStateChange: this.onStateChange,\n      id: this.uid,\n    });\n  }\n\n  ngAfterContentInit() {\n    if (this.hooks.isDisabled()) {\n      return null;\n    }\n\n    this.ngZone.runOutsideAngular(() => {\n      this.loadSubscription = this.propertyChanges$\n        .pipe(\n          tap((attributes) => this.hooks.onAttributeChange(attributes)),\n          tap((attributes) => attributes.onStateChange.emit({ reason: 'setup' })),\n          tap((attributes) => this.hooks.setup(attributes)),\n          switchMap((attributes) => {\n            if (!attributes.imagePath) {\n              return never();\n            }\n            return this.hooks.getObservable(attributes).pipe(lazyLoadImage(this.hooks, attributes));\n          })\n        )\n        .subscribe({\n          next: () => null,\n        });\n    });\n  }\n\n  ngOnDestroy() {\n    this.propertyChanges$\n      .pipe(take(1))\n      .subscribe({ next: (attributes) => this.hooks.onDestroy(attributes) })\n      .unsubscribe();\n    this.loadSubscription?.unsubscribe();\n    this.debugSubscription?.unsubscribe();\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { LazyLoadImageDirective } from './lazyload-image.directive';\nimport { IntersectionObserverHooks } from './intersection-observer-hooks/hooks';\nimport { LAZYLOAD_IMAGE_HOOKS } from './token';\n\n@NgModule({\n  declarations: [LazyLoadImageDirective],\n  exports: [LazyLoadImageDirective],\n  providers: [{ provide: LAZYLOAD_IMAGE_HOOKS, useClass: IntersectionObserverHooks }],\n})\nexport class LazyLoadImageModule {}\n","export class Rect {\n  static empty: Rect = new Rect(0, 0, 0, 0);\n\n  left: number;\n  top: number;\n  right: number;\n  bottom: number;\n\n  constructor(left: number, top: number, right: number, bottom: number) {\n    this.left = left;\n    this.top = top;\n    this.right = right;\n    this.bottom = bottom;\n  }\n\n  static fromElement(element: HTMLElement): Rect {\n    const { left, top, right, bottom } = element.getBoundingClientRect();\n\n    if (left === 0 && top === 0 && right === 0 && bottom === 0) {\n      return Rect.empty;\n    } else {\n      return new Rect(left, top, right, bottom);\n    }\n  }\n\n  static fromWindow(_window: Window): Rect {\n    return new Rect(0, 0, _window.innerWidth, _window.innerHeight);\n  }\n\n  inflate(inflateBy: number) {\n    this.left -= inflateBy;\n    this.top -= inflateBy;\n    this.right += inflateBy;\n    this.bottom += inflateBy;\n  }\n\n  intersectsWith(rect: Rect): boolean {\n    return rect.left < this.right && this.left < rect.right && rect.top < this.bottom && this.top < rect.bottom;\n  }\n\n  getIntersectionWith(rect: Rect): Rect {\n    const left = Math.max(this.left, rect.left);\n    const top = Math.max(this.top, rect.top);\n    const right = Math.min(this.right, rect.right);\n    const bottom = Math.min(this.bottom, rect.bottom);\n\n    if (right >= left && bottom >= top) {\n      return new Rect(left, top, right, bottom);\n    } else {\n      return Rect.empty;\n    }\n  }\n}\n","import { empty, Observable, of, Subject } from 'rxjs';\nimport { sampleTime, share, startWith } from 'rxjs/operators';\nimport { SharedHooks } from '../shared-hooks/hooks';\nimport { Attributes } from '../types';\nimport { Rect } from './rect';\n\nexport class ScrollHooks extends SharedHooks<Event | string> {\n  protected getWindow = () => window;\n  private readonly scrollListeners = new WeakMap<any, Observable<any>>();\n\n  getObservable(attributes: Attributes<Event | string>): Observable<Event | string> {\n    if (this.skipLazyLoading(attributes)) {\n      return of('load');\n    } else if (attributes.customObservable) {\n      return attributes.customObservable.pipe(startWith(''));\n    } else if (attributes.scrollContainer) {\n      return this.getScrollListener(attributes.scrollContainer);\n    }\n    return this.getScrollListener(this.getWindow());\n  }\n\n  isVisible(event: Event | string, attributes: Attributes): boolean {\n    const elementBounds = Rect.fromElement(attributes.element);\n    if (elementBounds === Rect.empty) {\n      return false;\n    }\n    const windowBounds = Rect.fromWindow(this.getWindow());\n    elementBounds.inflate(attributes.offset);\n\n    if (attributes.scrollContainer) {\n      const scrollContainerBounds = Rect.fromElement(attributes.scrollContainer);\n      const intersection = scrollContainerBounds.getIntersectionWith(windowBounds);\n      return elementBounds.intersectsWith(intersection);\n    } else {\n      return elementBounds.intersectsWith(windowBounds);\n    }\n  }\n\n  sampleObservable<T>(obs: Observable<T>, scheduler?: any): Observable<T | ''> {\n    return obs.pipe(sampleTime(100, scheduler), share(), startWith('')) as Observable<T | ''>;\n  }\n\n  // Only create one scroll listener per target and share the observable.\n  // Typical, there will only be one observable per application\n  getScrollListener = (scrollTarget?: HTMLElement | Window): Observable<Event | ''> => {\n    if (!scrollTarget || typeof scrollTarget.addEventListener !== 'function') {\n      console.warn('`addEventListener` on ' + scrollTarget + ' (scrollTarget) is not a function. Skipping this target');\n      return empty();\n    }\n    const scrollListener = this.scrollListeners.get(scrollTarget);\n    if (scrollListener) {\n      return scrollListener;\n    }\n\n    const srollEvent: Observable<Event> = Observable.create((observer: Subject<Event>) => {\n      const eventName = 'scroll';\n      const handler = (event: Event) => observer.next(event);\n      const options = { passive: true, capture: false };\n      scrollTarget.addEventListener(eventName, handler, options);\n      return () => scrollTarget.removeEventListener(eventName, handler, options);\n    });\n\n    const listener = this.sampleObservable(srollEvent);\n    this.scrollListeners.set(scrollTarget, listener);\n    return listener;\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}