{"version":3,"file":"observers.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/cdk/observers/observe-content.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NumberInput, coerceElement, coerceNumberProperty} from '../coercion';\nimport {\n  AfterContentInit,\n  Directive,\n  ElementRef,\n  EventEmitter,\n  Service,\n  Input,\n  NgModule,\n  NgZone,\n  OnDestroy,\n  Output,\n  booleanAttribute,\n  inject,\n} from '@angular/core';\nimport {Observable, Observer, Subject, Subscription} from 'rxjs';\nimport {debounceTime, filter, map} from 'rxjs/operators';\n\n// Angular may add, remove, or edit comment nodes during change detection. We don't care about\n// these changes because they don't affect the user-preceived content, and worse it can cause\n// infinite change detection cycles where the change detection updates a comment, triggering the\n// MutationObserver, triggering another change detection and kicking the cycle off again.\nfunction shouldIgnoreRecord(record: MutationRecord) {\n  // Ignore changes to comment text.\n  if (record.type === 'characterData' && record.target instanceof Comment) {\n    return true;\n  }\n  // Ignore addition / removal of comments.\n  if (record.type === 'childList') {\n    for (let i = 0; i < record.addedNodes.length; i++) {\n      if (!(record.addedNodes[i] instanceof Comment)) {\n        return false;\n      }\n    }\n    for (let i = 0; i < record.removedNodes.length; i++) {\n      if (!(record.removedNodes[i] instanceof Comment)) {\n        return false;\n      }\n    }\n    return true;\n  }\n  // Observe everything else.\n  return false;\n}\n\n/**\n * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.\n * @docs-private\n */\n@Service()\nexport class MutationObserverFactory {\n  create(callback: MutationCallback): MutationObserver | null {\n    return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);\n  }\n}\n\n/** An injectable service that allows watching elements for changes to their content. */\n@Service()\nexport class ContentObserver implements OnDestroy {\n  private _mutationObserverFactory = inject(MutationObserverFactory);\n\n  /** Keeps track of the existing MutationObservers so they can be reused. */\n  private _observedElements = new Map<\n    Element,\n    {\n      observer: MutationObserver | null;\n      readonly stream: Subject<MutationRecord[]>;\n      count: number;\n    }\n  >();\n\n  private _ngZone = inject(NgZone);\n\n  ngOnDestroy() {\n    this._observedElements.forEach((_, element) => this._cleanupObserver(element));\n  }\n\n  /**\n   * Observe content changes on an element.\n   * @param element The element to observe for content changes.\n   */\n  observe(element: Element): Observable<MutationRecord[]>;\n\n  /**\n   * Observe content changes on an element.\n   * @param element The element to observe for content changes.\n   */\n  observe(element: ElementRef<Element>): Observable<MutationRecord[]>;\n\n  observe(elementOrRef: Element | ElementRef<Element>): Observable<MutationRecord[]> {\n    const element = coerceElement(elementOrRef);\n\n    return new Observable((observer: Observer<MutationRecord[]>) => {\n      const stream = this._observeElement(element);\n      const subscription = stream\n        .pipe(\n          map(records => records.filter(record => !shouldIgnoreRecord(record))),\n          filter(records => !!records.length),\n        )\n        .subscribe(records => {\n          this._ngZone.run(() => {\n            observer.next(records);\n          });\n        });\n\n      return () => {\n        subscription.unsubscribe();\n        this._unobserveElement(element);\n      };\n    });\n  }\n\n  /**\n   * Observes the given element by using the existing MutationObserver if available, or creating a\n   * new one if not.\n   */\n  private _observeElement(element: Element): Subject<MutationRecord[]> {\n    return this._ngZone.runOutsideAngular(() => {\n      if (!this._observedElements.has(element)) {\n        const stream = new Subject<MutationRecord[]>();\n        const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));\n        if (observer) {\n          observer.observe(element, {\n            characterData: true,\n            childList: true,\n            subtree: true,\n          });\n        }\n        this._observedElements.set(element, {observer, stream, count: 1});\n      } else {\n        this._observedElements.get(element)!.count++;\n      }\n      return this._observedElements.get(element)!.stream;\n    });\n  }\n\n  /**\n   * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is\n   * observing this element.\n   */\n  private _unobserveElement(element: Element) {\n    if (this._observedElements.has(element)) {\n      this._observedElements.get(element)!.count--;\n      if (!this._observedElements.get(element)!.count) {\n        this._cleanupObserver(element);\n      }\n    }\n  }\n\n  /** Clean up the underlying MutationObserver for the specified element. */\n  private _cleanupObserver(element: Element) {\n    if (this._observedElements.has(element)) {\n      const {observer, stream} = this._observedElements.get(element)!;\n      if (observer) {\n        observer.disconnect();\n      }\n      stream.complete();\n      this._observedElements.delete(element);\n    }\n  }\n}\n\n/**\n * Directive that triggers a callback whenever the content of\n * its associated element has changed.\n */\n@Directive({\n  selector: '[cdkObserveContent]',\n  exportAs: 'cdkObserveContent',\n})\nexport class CdkObserveContent implements AfterContentInit, OnDestroy {\n  private _contentObserver = inject(ContentObserver);\n  private _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  /** Event emitted for each change in the element's content. */\n  @Output('cdkObserveContent') readonly event = new EventEmitter<MutationRecord[]>();\n\n  /**\n   * Whether observing content is disabled. This option can be used\n   * to disconnect the underlying MutationObserver until it is needed.\n   */\n  @Input({alias: 'cdkObserveContentDisabled', transform: booleanAttribute})\n  get disabled(): boolean {\n    return this._disabled;\n  }\n  set disabled(value: boolean) {\n    this._disabled = value;\n    this._disabled ? this._unsubscribe() : this._subscribe();\n  }\n  private _disabled = false;\n\n  /** Debounce interval for emitting the changes. */\n  @Input()\n  get debounce(): number {\n    return this._debounce!;\n  }\n  set debounce(value: NumberInput) {\n    this._debounce = coerceNumberProperty(value);\n    this._subscribe();\n  }\n  private _debounce: number | undefined;\n\n  private _currentSubscription: Subscription | null = null;\n\n  ngAfterContentInit() {\n    if (!this._currentSubscription && !this.disabled) {\n      this._subscribe();\n    }\n  }\n\n  ngOnDestroy() {\n    this._unsubscribe();\n  }\n\n  private _subscribe() {\n    this._unsubscribe();\n    const stream = this._contentObserver.observe(this._elementRef);\n\n    this._currentSubscription = (\n      this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream\n    ).subscribe(this.event);\n  }\n\n  private _unsubscribe() {\n    this._currentSubscription?.unsubscribe();\n  }\n}\n\n@NgModule({\n  imports: [CdkObserveContent],\n  exports: [CdkObserveContent],\n  providers: [MutationObserverFactory],\n})\nexport class ObserversModule {}\n"],"names":[],"mappings":";;;;;;AA8BA,SAAS,kBAAkB,CAAC,MAAsB,EAAA;EAEhD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,IAAI,MAAM,CAAC,MAAM,YAAY,OAAO,EAAE;AACvE,IAAA,OAAO,IAAI;AACb,EAAA;AAEA,EAAA,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;AAC/B,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACjD,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,EAAE;AAC9C,QAAA,OAAO,KAAK;AACd,MAAA;AACF,IAAA;AACA,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACnD,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,EAAE;AAChD,QAAA,OAAO,KAAK;AACd,MAAA;AACF,IAAA;AACA,IAAA,OAAO,IAAI;AACb,EAAA;AAEA,EAAA,OAAO,KAAK;AACd;MAOa,uBAAuB,CAAA;EAClC,MAAM,CAAC,QAA0B,EAAA;IAC/B,OAAO,OAAO,gBAAgB,KAAK,WAAW,GAAG,IAAI,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC;AACxF,EAAA;;;;;UAHW,uBAAuB;AAAA,IAAA,IAAA,EAAA,EAAA;AAAA,IAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA;AAAA,GAAA,CAAA;;;;;UAAvB;AAAuB,GAAA,CAAA;;;;;;QAAvB,uBAAuB;AAAA,EAAA,UAAA,EAAA,CAAA;UADnC;;;MASY,eAAe,CAAA;AAClB,EAAA,wBAAwB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAG1D,EAAA,iBAAiB,GAAG,IAAI,GAAG,EAOhC;AAEK,EAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;AAEhC,EAAA,WAAW,GAAA;AACT,IAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAChF,EAAA;EAcA,OAAO,CAAC,YAA2C,EAAA;AACjD,IAAA,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC;AAE3C,IAAA,OAAO,IAAI,UAAU,CAAE,QAAoC,IAAI;AAC7D,MAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;AAC5C,MAAA,MAAM,YAAY,GAAG,MAAA,CAClB,IAAI,CACH,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EACrE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA,CAEpC,SAAS,CAAC,OAAO,IAAG;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAK;AACpB,UAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AACxB,QAAA,CAAC,CAAC;AACJ,MAAA,CAAC,CAAC;AAEJ,MAAA,OAAO,MAAK;QACV,YAAY,CAAC,WAAW,EAAE;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;MACjC,CAAC;AACH,IAAA,CAAC,CAAC;AACJ,EAAA;EAMQ,eAAe,CAAC,OAAgB,EAAA;AACtC,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,MAAK;MACzC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,OAAO,EAAoB;AAC9C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC1F,QAAA,IAAI,QAAQ,EAAE;AACZ,UAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;AACxB,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE;AACV,WAAA,CAAC;AACJ,QAAA;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE;UAAC,QAAQ;UAAE,MAAM;AAAE,UAAA,KAAK,EAAE;AAAC,SAAC,CAAC;AACnE,MAAA,CAAA,MAAO;QACL,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,KAAK,EAAE;AAC9C,MAAA;MACA,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,MAAM;AACpD,IAAA,CAAC,CAAC;AACJ,EAAA;EAMQ,iBAAiB,CAAC,OAAgB,EAAA;IACxC,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;MACvC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,KAAK,EAAE;MAC5C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,KAAK,EAAE;AAC/C,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAChC,MAAA;AACF,IAAA;AACF,EAAA;EAGQ,gBAAgB,CAAC,OAAgB,EAAA;IACvC,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;MACvC,MAAM;QAAC,QAAQ;AAAE,QAAA;OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAE;AAC/D,MAAA,IAAI,QAAQ,EAAE;QACZ,QAAQ,CAAC,UAAU,EAAE;AACvB,MAAA;MACA,MAAM,CAAC,QAAQ,EAAE;AACjB,MAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC;AACxC,IAAA;AACF,EAAA;;;;;UArGW,eAAe;AAAA,IAAA,IAAA,EAAA,EAAA;AAAA,IAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA;AAAA,GAAA,CAAA;;;;;UAAf;AAAe,GAAA,CAAA;;;;;;QAAf,eAAe;AAAA,EAAA,UAAA,EAAA,CAAA;UAD3B;;;MAiHY,iBAAiB,CAAA;AACpB,EAAA,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAC;AAC1C,EAAA,WAAW,GAAG,MAAM,CAA0B,UAAU,CAAC;AAG3B,EAAA,KAAK,GAAG,IAAI,YAAY,EAAoB;AAMlF,EAAA,IACI,QAAQ,GAAA;IACV,OAAO,IAAI,CAAC,SAAS;AACvB,EAAA;EACA,IAAI,QAAQ,CAAC,KAAc,EAAA;IACzB,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,IAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAC1D,EAAA;AACQ,EAAA,SAAS,GAAG,KAAK;AAGzB,EAAA,IACI,QAAQ,GAAA;IACV,OAAO,IAAI,CAAC,SAAU;AACxB,EAAA;EACA,IAAI,QAAQ,CAAC,KAAkB,EAAA;AAC7B,IAAA,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE;AACnB,EAAA;EACQ,SAAS;AAET,EAAA,oBAAoB,GAAwB,IAAI;AAExD,EAAA,kBAAkB,GAAA;IAChB,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;MAChD,IAAI,CAAC,UAAU,EAAE;AACnB,IAAA;AACF,EAAA;AAEA,EAAA,WAAW,GAAA;IACT,IAAI,CAAC,YAAY,EAAE;AACrB,EAAA;AAEQ,EAAA,UAAU,GAAA;IAChB,IAAI,CAAC,YAAY,EAAE;IACnB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAE9D,IAAI,CAAC,oBAAoB,GAAG,CAC1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,EACjE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,EAAA;AAEQ,EAAA,YAAY,GAAA;AAClB,IAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE;AAC1C,EAAA;;;;;UAvDW,iBAAiB;AAAA,IAAA,IAAA,EAAA,EAAA;AAAA,IAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA;AAAA,GAAA,CAAA;AAAjB,EAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA;AAAA,IAAA,UAAA,EAAA,QAAA;AAAA,IAAA,OAAA,EAAA,QAAA;AAAA,IAAA,IAAA,EAAA,iBAAiB;;;;0DAW2B,gBAAgB,CAAA;AAAA,MAAA,QAAA,EAAA;KAAA;AAAA,IAAA,OAAA,EAAA;AAAA,MAAA,KAAA,EAAA;KAAA;IAAA,QAAA,EAAA,CAAA,mBAAA,CAAA;AAAA,IAAA,QAAA,EAAA;AAAA,GAAA,CAAA;;;;;;QAX5D,iBAAiB;AAAA,EAAA,UAAA,EAAA,CAAA;UAJ7B,SAAS;AAAC,IAAA,IAAA,EAAA,CAAA;AACT,MAAA,QAAQ,EAAE,qBAAqB;AAC/B,MAAA,QAAQ,EAAE;KACX;;;;YAME,MAAM;aAAC,mBAAmB;;;YAM1B,KAAK;AAAC,MAAA,IAAA,EAAA,CAAA;AAAC,QAAA,KAAK,EAAE,2BAA2B;AAAE,QAAA,SAAS,EAAE;OAAiB;;;YAWvE;;;;MAyCU,eAAe,CAAA;;;;;UAAf,eAAe;AAAA,IAAA,IAAA,EAAA,EAAA;AAAA,IAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA;AAAA,GAAA,CAAA;;;;;UAAf,eAAe;IAAA,OAAA,EAAA,CA/Df,iBAAiB,CAAA;IAAA,OAAA,EAAA,CAAjB,iBAAiB;AAAA,GAAA,CAAA;;;;;UA+DjB,eAAe;IAAA,SAAA,EAFf,CAAC,uBAAuB;AAAC,GAAA,CAAA;;;;;;QAEzB,eAAe;AAAA,EAAA,UAAA,EAAA,CAAA;UAL3B,QAAQ;AAAC,IAAA,IAAA,EAAA,CAAA;MACR,OAAO,EAAE,CAAC,iBAAiB,CAAC;MAC5B,OAAO,EAAE,CAAC,iBAAiB,CAAC;MAC5B,SAAS,EAAE,CAAC,uBAAuB;KACpC;;;;;;"}