{"version":3,"file":"ngx-mutation.mjs","sources":["../../../projects/ngx-mutation/src/lib/mutation.directive.ts","../../../projects/ngx-mutation/src/public-api.ts","../../../projects/ngx-mutation/src/ngx-mutation.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport {\n  Directive,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  InjectionToken,\n  Input,\n  NgZone,\n  OnDestroy,\n  OnInit,\n  Output,\n} from '@angular/core';\nimport { debounceTime, Observable, ReplaySubject, share, Subscription, } from 'rxjs';\n\nexport interface NgxMutationOptions {\n  config: MutationObserverInit;\n  debounce: number;\n  emitInZone: boolean;\n  emitInitialResult: boolean;\n}\n\nexport const defaultMutationOptions: NgxMutationOptions = {\n  config: {\n    attributes: true,\n    characterData: true,\n    childList: true,\n  },\n  debounce: 0,\n  emitInZone: true,\n  emitInitialResult: false,\n};\n\nexport const NGX_MUTATION_OPTIONS = new InjectionToken<NgxMutationOptions>('NgxMutationOptions', {\n  factory: () => defaultMutationOptions,\n});\n\nexport function provideNgxMutationOptions(options: Partial<NgxMutationOptions> = {}) {\n  return { provide: NGX_MUTATION_OPTIONS, useValue: { ...defaultMutationOptions, ...options } };\n}\n\nexport interface NgxMutationResult {\n  readonly mutations: ReadonlyArray<MutationRecord>;\n}\n\n@Directive({\n  selector: '[ngxMutation]',\n  standalone: true\n})\nexport class NgxMutation implements OnInit, OnDestroy {\n  @Input() ngxMutationOptions: Partial<NgxMutationOptions> = {};\n  @Output() ngxMutation = new EventEmitter<NgxMutationResult>();\n  private observer: MutationObserver | null = null;\n\n  constructor(\n    private readonly host: ElementRef<HTMLElement>,\n    private readonly zone: NgZone,\n    @Inject(DOCUMENT) private readonly document: Document,\n    @Inject(NGX_MUTATION_OPTIONS) private readonly mutationOptions: NgxMutationOptions\n  ) { }\n\n  private sub?: Subscription;\n\n  ngOnInit() {\n    const mergedOptions = { ...this.mutationOptions, ...this.ngxMutationOptions };\n    this.sub = createMutationStream(mergedOptions, this.host.nativeElement, this.document, this.zone).subscribe(\n      this.ngxMutation\n    );\n  }\n  ngOnDestroy() {\n    this.sub?.unsubscribe();\n  }\n\n\n}\n\n// return MutationResult observable\nfunction createMutationStream(\n  { config, debounce, emitInZone, emitInitialResult }: NgxMutationOptions,\n  nativeElement: HTMLElement,\n  document: Document,\n  zone: NgZone\n) {\n  const window = document.defaultView;\n  const isSupport = !!window?.MutationObserver;\n\n  let observer: MutationObserver;\n\n  const torndown$ = new ReplaySubject<void>();\n\n  return new Observable<NgxMutationResult>((subscriber) => {\n    if (!isSupport) {\n      subscriber.error(\n        '[ngx-mutation] your browser does not support MutationObserver. Please consider using a polyfill'\n      );\n      return;\n    }\n\n    if (emitInitialResult) {\n      const [result] = calculateResult(nativeElement, window, []);\n      subscriber.next(result);\n    }\n\n    zone.runOutsideAngular(() => {\n      const callback = (entries: MutationRecord[]) => {\n        const [result, size] = calculateResult(nativeElement, window, entries);\n\n        if (emitInZone) zone.run(() => void subscriber.next(result));\n        else subscriber.next(result);\n\n\n      };\n\n\n      observer = new MutationObserver(callback);\n\n      observer.observe(nativeElement, config);\n\n    });\n\n    return () => {\n      if (observer) {\n        observer.disconnect();\n      }\n      torndown$.next();\n      torndown$.complete();\n    };\n  }).pipe(debounceTime(debounce ?? 0), share({ connector: () => new ReplaySubject(1) }));\n}\n\nfunction calculateResult(\n  nativeElement: HTMLElement,\n  window: Window,\n  entries: MutationRecord[]\n): [NgxMutationResult, Omit<DOMRect, 'toJSON'>] {\n  const { left, top, width, height, bottom, right, x, y } = nativeElement.getBoundingClientRect();\n  const size = { left, top, width, height, bottom, right, x, y };\n  Object.freeze(size);\n  return [{ mutations: entries, ...size }, size];\n}","/*\n * Public API Surface of ngx-mutation\n */\n\nexport * from './lib/mutation.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}