{"version":3,"file":"fivexlabs-ng-terminus.mjs","sources":["../../src/lib/operators/take-until-destroyed.ts","../../src/lib/services/subscription-manager.service.ts","../../src/lib/utils/subscription-utils.ts","../../src/lib/services/subscription-debugger.service.ts","../../src/lib/operators/http-operators.ts","../../src/lib/operators/forms-operators.ts","../../src/lib/ng-terminus.module.ts","../../src/lib/operators/take-until-route.ts","../../src/lib/operators/visibility-operators.ts","../../src/lib/testing/subscription-testing.ts","../../src/lib/utils/memory-optimization.ts","../../src/public-api.ts","../../src/fivexlabs-ng-terminus.ts"],"sourcesContent":["import { DestroyRef, inject } from '@angular/core';\nimport { Observable, takeUntil, Subject } from 'rxjs';\n\n/**\n * An RxJS operator that automatically completes the source observable\n * when the associated Angular component, directive, or service is destroyed.\n * \n * This operator prevents memory leaks by tying the observable lifecycle\n * to Angular's component lifecycle through DestroyRef.\n * \n * @param destroyRef Optional DestroyRef instance. If not provided, \n *                   it will be automatically injected using Angular's inject() function.\n * @returns An operator function that can be used in a pipe() chain\n * \n * @example\n * ```typescript\n * // Basic usage with automatic DestroyRef injection\n * constructor(private dataService: DataService) {\n *   this.dataService.getData()\n *     .pipe(takeUntilDestroyed())\n *     .subscribe(data => console.log(data));\n * }\n * \n * // Usage with explicit DestroyRef\n * constructor(private dataService: DataService) {\n *   const destroyRef = inject(DestroyRef);\n *   this.dataService.getData()\n *     .pipe(takeUntilDestroyed(destroyRef))\n *     .subscribe(data => console.log(data));\n * }\n * ```\n */\nexport function takeUntilDestroyed<T>(destroyRef?: DestroyRef) {\n  return (source: Observable<T>): Observable<T> => {\n    const destroy$ = new Subject<void>();\n    \n    // Use provided DestroyRef or inject it automatically\n    const ref = destroyRef ?? inject(DestroyRef);\n    \n    // Register cleanup callback\n    ref.onDestroy(() => {\n      destroy$.next();\n      destroy$.complete();\n    });\n    \n    return source.pipe(takeUntil(destroy$));\n  };\n}\n\n/**\n * A simplified version of takeUntilDestroyed that always uses automatic injection.\n * This provides the cleanest API for most use cases.\n * \n * @returns An operator function that can be used in a pipe() chain\n * \n * @example\n * ```typescript\n * constructor(private dataService: DataService) {\n *   this.dataService.getData()\n *     .pipe(untilDestroyed())\n *     .subscribe(data => console.log(data));\n * }\n * ```\n */\nexport function untilDestroyed<T>() {\n  return takeUntilDestroyed<T>();\n}\n\n/**\n * Type alias for the takeUntilDestroyed operator function\n */\nexport type TakeUntilDestroyed = typeof takeUntilDestroyed; ","import { Injectable, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\n/**\n * A service that manages multiple RxJS subscriptions and automatically\n * unsubscribes from all of them when the associated component is destroyed.\n * \n * This service implements Angular's OnDestroy interface and should be\n * provided at the component level to ensure proper cleanup.\n * \n * @example\n * ```typescript\n * @Component({\n *   selector: 'app-my-component',\n *   providers: [SubscriptionManager] // Provide at component level\n * })\n * export class MyComponent implements OnInit {\n *   constructor(\n *     private dataService: DataService,\n *     private subManager: SubscriptionManager\n *   ) {}\n * \n *   ngOnInit() {\n *     // Add subscriptions to the manager\n *     this.subManager.add(\n *       this.dataService.getStream1().subscribe(data => console.log(data)),\n *       this.dataService.getStream2().subscribe(data => console.log(data))\n *     );\n *   }\n *   // No ngOnDestroy needed - the service handles cleanup automatically\n * }\n * ```\n */\n@Injectable()\nexport class SubscriptionManager implements OnDestroy {\n  private subscriptions: Set<Subscription> = new Set();\n  private isDestroyed = false;\n\n  /**\n   * Add one or more subscriptions to be managed by this service.\n   * All added subscriptions will be automatically unsubscribed when\n   * the component is destroyed.\n   * \n   * @param subscriptions The subscriptions to add\n   * @returns The SubscriptionManager instance for method chaining\n   * \n   * @example\n   * ```typescript\n   * // Add single subscription\n   * this.subManager.add(observable$.subscribe());\n   * \n   * // Add multiple subscriptions\n   * this.subManager.add(\n   *   observable1$.subscribe(),\n   *   observable2$.subscribe()\n   * );\n   * \n   * // Method chaining\n   * this.subManager\n   *   .add(observable1$.subscribe())\n   *   .add(observable2$.subscribe());\n   * ```\n   */\n  add(...subscriptions: Subscription[]): SubscriptionManager {\n    if (this.isDestroyed) {\n      console.warn('SubscriptionManager: Attempting to add subscriptions after destroy. Subscriptions will be immediately unsubscribed.');\n      subscriptions.forEach(sub => sub.unsubscribe());\n      return this;\n    }\n\n    subscriptions.forEach(subscription => {\n      if (subscription && !subscription.closed) {\n        this.subscriptions.add(subscription);\n      }\n    });\n\n    return this;\n  }\n\n  /**\n   * Remove a specific subscription from management.\n   * The subscription will not be unsubscribed automatically.\n   * \n   * @param subscription The subscription to remove\n   * @returns The SubscriptionManager instance for method chaining\n   */\n  remove(subscription: Subscription): SubscriptionManager {\n    this.subscriptions.delete(subscription);\n    return this;\n  }\n\n  /**\n   * Manually unsubscribe from all managed subscriptions.\n   * This is automatically called during ngOnDestroy.\n   */\n  unsubscribeAll(): void {\n    this.subscriptions.forEach(subscription => {\n      if (subscription && !subscription.closed) {\n        subscription.unsubscribe();\n      }\n    });\n    this.subscriptions.clear();\n  }\n\n  /**\n   * Get the current number of active subscriptions being managed.\n   * \n   * @returns The number of active subscriptions\n   */\n  get activeCount(): number {\n    // Filter out closed subscriptions\n    const activeSubscriptions = Array.from(this.subscriptions).filter(\n      sub => !sub.closed\n    );\n    \n    // Clean up closed subscriptions from the set\n    if (activeSubscriptions.length !== this.subscriptions.size) {\n      this.subscriptions.clear();\n      activeSubscriptions.forEach(sub => this.subscriptions.add(sub));\n    }\n    \n    return activeSubscriptions.length;\n  }\n\n  /**\n   * Check if the manager has any active subscriptions.\n   * \n   * @returns True if there are active subscriptions, false otherwise\n   */\n  get hasActiveSubscriptions(): boolean {\n    return this.activeCount > 0;\n  }\n\n  /**\n   * Angular lifecycle hook that automatically unsubscribes from all\n   * managed subscriptions when the component is destroyed.\n   */\n  ngOnDestroy(): void {\n    this.isDestroyed = true;\n    this.unsubscribeAll();\n  }\n} ","import { Observable, Subscription, isObservable } from 'rxjs';\nimport { takeUntilDestroyed } from '../operators/take-until-destroyed';\nimport { DestroyRef } from '@angular/core';\n\n/**\n * Type guard to check if a value is a Subscription\n */\nexport function isSubscription(value: any): value is Subscription {\n  return value && typeof value.unsubscribe === 'function';\n}\n\n/**\n * Type guard to check if a value is an Observable\n */\nexport function isObservableValue<T>(value: any): value is Observable<T> {\n  return isObservable(value);\n}\n\n/**\n * Utility function to safely unsubscribe from a subscription\n * without throwing errors if the subscription is null, undefined, or already closed.\n * \n * @param subscription The subscription to unsubscribe from\n * @returns True if unsubscription was successful, false otherwise\n * \n * @example\n * ```typescript\n * let sub: Subscription | undefined;\n * // ... later\n * safeUnsubscribe(sub); // Won't throw if sub is undefined\n * ```\n */\nexport function safeUnsubscribe(subscription: Subscription | null | undefined): boolean {\n  if (subscription && !subscription.closed) {\n    try {\n      subscription.unsubscribe();\n      return true;\n    } catch (error) {\n      console.warn('Error during unsubscription:', error);\n      return false;\n    }\n  }\n  return false;\n}\n\n/**\n * Utility function to create an observable that automatically unsubscribes\n * when the component is destroyed. This is a functional approach alternative\n * to using the operator in a pipe.\n * \n * @param source$ The source observable\n * @param destroyRef Optional DestroyRef instance\n * @returns A new observable that will complete on component destruction\n * \n * @example\n * ```typescript\n * const managedObservable$ = createManagedObservable(\n *   this.dataService.getData(),\n *   inject(DestroyRef)\n * );\n * \n * managedObservable$.subscribe(data => console.log(data));\n * ```\n */\nexport function createManagedObservable<T>(\n  source$: Observable<T>,\n  destroyRef?: DestroyRef\n): Observable<T> {\n  return source$.pipe(takeUntilDestroyed(destroyRef));\n}\n\n/**\n * Utility function to handle multiple observables with automatic cleanup.\n * Returns an array of managed observables.\n * \n * @param observables Array of source observables\n * @param destroyRef Optional DestroyRef instance\n * @returns Array of managed observables\n * \n * @example\n * ```typescript\n * const [data1$, data2$, data3$] = manageManyObservables([\n *   this.service.getData1(),\n *   this.service.getData2(),\n *   this.service.getData3()\n * ]);\n * ```\n */\nexport function manageManyObservables<T extends readonly Observable<any>[]>(\n  observables: T,\n  destroyRef?: DestroyRef\n): { [K in keyof T]: T[K] } {\n  return observables.map(obs => createManagedObservable(obs, destroyRef)) as any;\n}\n\n/**\n * Configuration options for subscription debugging\n */\nexport interface SubscriptionDebugOptions {\n  /** Enable console logging for subscription lifecycle events */\n  enableLogging?: boolean;\n  /** Custom prefix for log messages */\n  logPrefix?: string;\n  /** Enable stack trace capture for subscription creation */\n  captureStackTrace?: boolean;\n}\n\n/**\n * Utility class for debugging subscription lifecycle in development\n */\nexport class SubscriptionDebugger {\n  private static defaultOptions: SubscriptionDebugOptions = {\n    enableLogging: false,\n    logPrefix: '[ng-terminus]',\n    captureStackTrace: false\n  };\n\n  private static options = { ...SubscriptionDebugger.defaultOptions };\n\n  /**\n   * Configure global debugging options\n   */\n  static configure(options: Partial<SubscriptionDebugOptions>): void {\n    SubscriptionDebugger.options = {\n      ...SubscriptionDebugger.defaultOptions,\n      ...options\n    };\n  }\n\n  /**\n   * Log subscription creation\n   */\n  static logSubscription(context: string, subscription?: Subscription): void {\n    if (!SubscriptionDebugger.options.enableLogging) return;\n\n    const prefix = SubscriptionDebugger.options.logPrefix;\n    console.log(`${prefix} Subscription created in ${context}`, {\n      subscription,\n      timestamp: new Date().toISOString(),\n      ...(SubscriptionDebugger.options.captureStackTrace && {\n        stack: new Error().stack\n      })\n    });\n  }\n\n  /**\n   * Log subscription cleanup\n   */\n  static logCleanup(context: string, count: number): void {\n    if (!SubscriptionDebugger.options.enableLogging) return;\n\n    const prefix = SubscriptionDebugger.options.logPrefix;\n    console.log(`${prefix} Cleaned up ${count} subscription(s) in ${context}`, {\n      timestamp: new Date().toISOString()\n    });\n  }\n}\n\n/**\n * Types for better TypeScript support\n */\n\n/** A function that returns an observable */\nexport type ObservableFactory<T> = () => Observable<T>;\n\n/** A function that handles subscription cleanup */\nexport type CleanupFunction = () => void;\n\n/** Configuration for subscription management */\nexport interface SubscriptionConfig {\n  /** Automatically log subscription lifecycle events */\n  debug?: boolean;\n  /** Custom cleanup functions to run on destroy */\n  cleanupFunctions?: CleanupFunction[];\n} ","import { Injectable, DestroyRef, inject } from '@angular/core';\nimport { Observable, Subscription, Subject } from 'rxjs';\nimport { tap, finalize, share } from 'rxjs/operators';\n\nexport interface SubscriptionDebugInfo {\n  id: string;\n  componentName?: string;\n  operatorName?: string;\n  createdAt: Date;\n  stackTrace?: string;\n  isActive: boolean;\n  emissionCount: number;\n  errorCount: number;\n  lastEmission?: Date;\n  lastError?: Date;\n  memoryUsage?: number;\n  duration?: number;\n}\n\nexport interface PerformanceMetrics {\n  totalSubscriptions: number;\n  activeSubscriptions: number;\n  totalEmissions: number;\n  totalErrors: number;\n  averageLifetime: number;\n  memoryUsage: number;\n  leaksDetected: number;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class SubscriptionDebuggerService {\n  private subscriptions = new Map<string, SubscriptionDebugInfo>();\n  private debugCounter = 0;\n  private isEnabled = false;\n  private performanceObserver?: PerformanceObserver;\n  private memoryInterval?: NodeJS.Timeout;\n\n  constructor() {\n    this.setupPerformanceMonitoring();\n    this.setupMemoryMonitoring();\n  }\n\n  /**\n   * Enable debugging mode\n   */\n  enable(): void {\n    this.isEnabled = true;\n    console.log('🔍 SubscriptionDebugger enabled');\n  }\n\n  /**\n   * Disable debugging mode\n   */\n  disable(): void {\n    this.isEnabled = false;\n    console.log('🔍 SubscriptionDebugger disabled');\n  }\n\n  /**\n   * Create a debuggable subscription with detailed tracking\n   */\n  debugSubscription<T>(\n    source: Observable<T>,\n    options: {\n      name?: string;\n      componentName?: string;\n      captureStackTrace?: boolean;\n      logEmissions?: boolean;\n      logErrors?: boolean;\n    } = {}\n  ): Observable<T> {\n    if (!this.isEnabled) {\n      return source;\n    }\n\n    const id = `debug_${++this.debugCounter}`;\n    const info: SubscriptionDebugInfo = {\n      id,\n      componentName: options.componentName,\n      operatorName: options.name || 'Unknown',\n      createdAt: new Date(),\n      isActive: true,\n      emissionCount: 0,\n      errorCount: 0,\n      stackTrace: options.captureStackTrace ? this.captureStackTrace() : undefined\n    };\n\n    this.subscriptions.set(id, info);\n\n    return source.pipe(\n      tap({\n        next: (value) => {\n          info.emissionCount++;\n          info.lastEmission = new Date();\n          \n          if (options.logEmissions) {\n            console.log(`📦 [${id}] ${info.operatorName}:`, value);\n          }\n        },\n        error: (error) => {\n          info.errorCount++;\n          info.lastError = new Date();\n          \n          if (options.logErrors) {\n            console.error(`❌ [${id}] ${info.operatorName} Error:`, error);\n          }\n        },\n        complete: () => {\n          if (options.logEmissions) {\n            console.log(`✅ [${id}] ${info.operatorName} completed`);\n          }\n        }\n      }),\n      finalize(() => {\n        info.isActive = false;\n        info.duration = Date.now() - info.createdAt.getTime();\n        \n        // Clean up after some time to prevent memory leaks\n        setTimeout(() => {\n          this.subscriptions.delete(id);\n        }, 60000); // Keep debug info for 1 minute after completion\n      }),\n      share()\n    );\n  }\n\n  /**\n   * Get detailed information about a specific subscription\n   */\n  getSubscriptionInfo(id: string): SubscriptionDebugInfo | undefined {\n    return this.subscriptions.get(id);\n  }\n\n  /**\n   * Get all active subscriptions\n   */\n  getActiveSubscriptions(): SubscriptionDebugInfo[] {\n    return Array.from(this.subscriptions.values()).filter(info => info.isActive);\n  }\n\n  /**\n   * Get all subscriptions (active and completed)\n   */\n  getAllSubscriptions(): SubscriptionDebugInfo[] {\n    return Array.from(this.subscriptions.values());\n  }\n\n  /**\n   * Get performance metrics\n   */\n  getPerformanceMetrics(): PerformanceMetrics {\n    const all = this.getAllSubscriptions();\n    const active = this.getActiveSubscriptions();\n    \n    return {\n      totalSubscriptions: all.length,\n      activeSubscriptions: active.length,\n      totalEmissions: all.reduce((sum, info) => sum + info.emissionCount, 0),\n      totalErrors: all.reduce((sum, info) => sum + info.errorCount, 0),\n      averageLifetime: this.calculateAverageLifetime(all),\n      memoryUsage: this.getCurrentMemoryUsage(),\n      leaksDetected: this.detectPotentialLeaks()\n    };\n  }\n\n  /**\n   * Log current subscription status\n   */\n  logStatus(): void {\n    if (!this.isEnabled) {\n      console.log('🔍 SubscriptionDebugger is disabled');\n      return;\n    }\n\n    const metrics = this.getPerformanceMetrics();\n    const active = this.getActiveSubscriptions();\n\n    console.group('🔍 Subscription Debugger Status');\n    console.log('📊 Metrics:', metrics);\n    \n    if (active.length > 0) {\n      console.group('🔴 Active Subscriptions:');\n      active.forEach(info => {\n        console.log(`[${info.id}] ${info.operatorName} (${info.componentName || 'Unknown'})`, {\n          emissions: info.emissionCount,\n          errors: info.errorCount,\n          age: Date.now() - info.createdAt.getTime(),\n          stackTrace: info.stackTrace\n        });\n      });\n      console.groupEnd();\n    }\n\n    if (metrics.leaksDetected > 0) {\n      console.warn(`⚠️ Potential memory leaks detected: ${metrics.leaksDetected}`);\n    }\n\n    console.groupEnd();\n  }\n\n  /**\n   * Detect potential memory leaks\n   */\n  detectPotentialLeaks(): number {\n    const active = this.getActiveSubscriptions();\n    const now = Date.now();\n    \n    return active.filter(info => {\n      const age = now - info.createdAt.getTime();\n      // Consider subscriptions older than 5 minutes with no recent activity as potential leaks\n      return age > 300000 && (!info.lastEmission || (now - info.lastEmission.getTime()) > 60000);\n    }).length;\n  }\n\n  /**\n   * Clear all debug information\n   */\n  clear(): void {\n    this.subscriptions.clear();\n    console.log('🧹 Subscription debug information cleared');\n  }\n\n  /**\n   * Export debug information as JSON\n   */\n  exportDebugInfo(): string {\n    const data = {\n      timestamp: new Date().toISOString(),\n      metrics: this.getPerformanceMetrics(),\n      subscriptions: this.getAllSubscriptions()\n    };\n    \n    return JSON.stringify(data, null, 2);\n  }\n\n  private captureStackTrace(): string {\n    const error = new Error();\n    return error.stack || 'Stack trace not available';\n  }\n\n  private calculateAverageLifetime(subscriptions: SubscriptionDebugInfo[]): number {\n    const completed = subscriptions.filter(info => !info.isActive && info.duration);\n    if (completed.length === 0) return 0;\n    \n    const total = completed.reduce((sum, info) => sum + (info.duration || 0), 0);\n    return total / completed.length;\n  }\n\n  private getCurrentMemoryUsage(): number {\n    if (typeof performance !== 'undefined' && 'memory' in performance) {\n      return (performance as any).memory.usedJSHeapSize;\n    }\n    return 0;\n  }\n\n  private setupPerformanceMonitoring(): void {\n    if (typeof PerformanceObserver !== 'undefined') {\n      this.performanceObserver = new PerformanceObserver((list) => {\n        const entries = list.getEntries();\n        // Process performance entries if needed\n      });\n      \n      try {\n        this.performanceObserver.observe({ entryTypes: ['measure', 'navigation'] });\n      } catch (error) {\n        console.warn('Performance monitoring not available:', error);\n      }\n    }\n  }\n\n  private setupMemoryMonitoring(): void {\n    if (this.isEnabled && typeof performance !== 'undefined' && 'memory' in performance) {\n      this.memoryInterval = setInterval(() => {\n        const memory = (performance as any).memory;\n        if (memory.usedJSHeapSize > memory.jsHeapSizeLimit * 0.9) {\n          console.warn('⚠️ High memory usage detected:', {\n            used: memory.usedJSHeapSize,\n            limit: memory.jsHeapSizeLimit,\n            percentage: (memory.usedJSHeapSize / memory.jsHeapSizeLimit) * 100\n          });\n        }\n      }, 30000); // Check every 30 seconds\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.performanceObserver) {\n      this.performanceObserver.disconnect();\n    }\n    \n    if (this.memoryInterval) {\n      clearInterval(this.memoryInterval);\n    }\n  }\n} ","import { inject, DestroyRef } from '@angular/core';\nimport { HttpClient, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { Observable, Subject, throwError } from 'rxjs';\nimport { takeUntil, catchError, tap, finalize, retry, delay } from 'rxjs/operators';\n\n/**\n * Service to manage HTTP request cancellation\n */\nexport class HttpRequestManager {\n  private pendingRequests = new Map<string, Subject<void>>();\n  private requestCounter = 0;\n\n  /**\n   * Create a cancellable HTTP request\n   */\n  createCancellableRequest<T>(\n    requestFn: () => Observable<T>,\n    requestId?: string\n  ): { request$: Observable<T>; cancel: () => void } {\n    const id = requestId || `req_${++this.requestCounter}`;\n    const cancelSubject = new Subject<void>();\n    \n    this.pendingRequests.set(id, cancelSubject);\n\n    const request$ = requestFn().pipe(\n      takeUntil(cancelSubject),\n      catchError((error) => {\n        if (error.name === 'AbortError') {\n          console.log(`Request ${id} was cancelled`);\n          return throwError(() => new Error('Request cancelled'));\n        }\n        return throwError(() => error);\n      }),\n      finalize(() => {\n        this.pendingRequests.delete(id);\n      })\n    );\n\n    const cancel = () => {\n      cancelSubject.next();\n      cancelSubject.complete();\n      this.pendingRequests.delete(id);\n    };\n\n    return { request$, cancel };\n  }\n\n  /**\n   * Cancel a specific request by ID\n   */\n  cancelRequest(requestId: string): void {\n    const cancelSubject = this.pendingRequests.get(requestId);\n    if (cancelSubject) {\n      cancelSubject.next();\n      cancelSubject.complete();\n      this.pendingRequests.delete(requestId);\n    }\n  }\n\n  /**\n   * Cancel all pending requests\n   */\n  cancelAllRequests(): void {\n    this.pendingRequests.forEach((cancelSubject) => {\n      cancelSubject.next();\n      cancelSubject.complete();\n    });\n    this.pendingRequests.clear();\n  }\n\n  /**\n   * Get the number of pending requests\n   */\n  getPendingRequestCount(): number {\n    return this.pendingRequests.size;\n  }\n\n  /**\n   * Get all pending request IDs\n   */\n  getPendingRequestIds(): string[] {\n    return Array.from(this.pendingRequests.keys());\n  }\n}\n\n/**\n * RxJS operator that cancels HTTP requests when component is destroyed\n */\nexport function cancelOnDestroy() {\n  return function <T>(source: Observable<T>): Observable<T> {\n    const destroyRef = inject(DestroyRef, { optional: true });\n    \n    if (!destroyRef) {\n      console.warn('cancelOnDestroy: DestroyRef not available, operator will have no effect');\n      return source;\n    }\n\n    const destroy$ = new Subject<void>();\n    destroyRef.onDestroy(() => {\n      destroy$.next();\n      destroy$.complete();\n    });\n\n    return source.pipe(takeUntil(destroy$));\n  };\n}\n\n/**\n * RxJS operator that cancels previous HTTP requests when a new one is made\n */\nexport function cancelPrevious() {\n  let currentRequest$: Subject<void> | null = null;\n\n  return function <T>(source: Observable<T>): Observable<T> {\n    // Cancel previous request\n    if (currentRequest$) {\n      currentRequest$.next();\n      currentRequest$.complete();\n    }\n\n    // Create new cancellation subject\n    currentRequest$ = new Subject<void>();\n    const cancelSubject = currentRequest$;\n\n    return source.pipe(\n      takeUntil(cancelSubject),\n      finalize(() => {\n        if (currentRequest$ === cancelSubject) {\n          currentRequest$ = null;\n        }\n      })\n    );\n  };\n}\n\n/**\n * RxJS operator that adds retry logic with exponential backoff for HTTP requests\n */\nexport function retryWithBackoff(\n  maxRetries: number = 3,\n  initialDelay: number = 1000,\n  maxDelay: number = 30000\n) {\n  return function <T>(source: Observable<T>): Observable<T> {\n    return source.pipe(\n      catchError((error, caught) => {\n        if (maxRetries <= 0) {\n          return throwError(() => error);\n        }\n\n        const delayTime = Math.min(initialDelay * Math.pow(2, 3 - maxRetries), maxDelay);\n        \n        return new Observable<T>(subscriber => {\n          const timeoutId = setTimeout(() => {\n            const retriedObservable = caught.pipe(\n              retryWithBackoff(maxRetries - 1, initialDelay, maxDelay)\n            ) as Observable<T>;\n            retriedObservable.subscribe(subscriber);\n          }, delayTime);\n\n          return () => clearTimeout(timeoutId);\n        });\n      })\n    );\n  };\n}\n\n/**\n * RxJS operator that logs HTTP request lifecycle events\n */\nexport function logHttpRequests(requestName?: string) {\n  return function <T>(source: Observable<T>): Observable<T> {\n    const name = requestName || 'HTTP Request';\n    \n    return source.pipe(\n      tap({\n        subscribe: () => console.log(`🚀 ${name}: Started`),\n        next: (value) => console.log(`📦 ${name}: Received data`, value),\n        error: (error) => console.error(`❌ ${name}: Error`, error),\n        complete: () => console.log(`✅ ${name}: Completed`)\n      })\n    );\n  };\n} ","import { inject, DestroyRef, Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\n\n/**\n * RxJS operator that automatically unsubscribes from form value changes when component is destroyed\n */\nexport function takeUntilFormDestroyed() {\n  return function <T>(source: Observable<T>): Observable<T> {\n    const destroyRef = inject(DestroyRef, { optional: true });\n    \n    if (!destroyRef) {\n      console.warn('takeUntilFormDestroyed: DestroyRef not available, operator will have no effect');\n      return source;\n    }\n\n    const destroy$ = new Subject<void>();\n    destroyRef.onDestroy(() => {\n      destroy$.next();\n      destroy$.complete();\n    });\n\n    return source.pipe(takeUntil(destroy$));\n  };\n}\n\n/**\n * RxJS operator that emits only when form is valid\n */\nexport function takeWhileFormValid<T>(isValid: () => boolean) {\n  return function (source: Observable<T>): Observable<T> {\n    return source.pipe(\n      filter(() => isValid())\n    );\n  };\n}\n\n/**\n * Injectable service for managing form subscriptions\n */\n@Injectable()\nexport class FormSubscriptionManager {\n  private subscriptions = new Map<string, Subject<void>>();\n\n  /**\n   * Create a managed subscription with automatic cleanup\n   */\n  manage<T>(source: Observable<T>, name: string): Observable<T> {\n    const destroy$ = new Subject<void>();\n    this.subscriptions.set(name, destroy$);\n    \n    return source.pipe(takeUntil(destroy$));\n  }\n\n  /**\n   * Unsubscribe from a specific managed subscription\n   */\n  unsubscribe(name: string): void {\n    const destroy$ = this.subscriptions.get(name);\n    if (destroy$) {\n      destroy$.next();\n      destroy$.complete();\n      this.subscriptions.delete(name);\n    }\n  }\n\n  /**\n   * Unsubscribe from all managed subscriptions\n   */\n  unsubscribeAll(): void {\n    this.subscriptions.forEach(destroy$ => {\n      destroy$.next();\n      destroy$.complete();\n    });\n    this.subscriptions.clear();\n  }\n\n  /**\n   * Get count of active subscriptions\n   */\n  getActiveCount(): number {\n    return this.subscriptions.size;\n  }\n} ","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { SubscriptionManager } from './services/subscription-manager.service';\nimport { SubscriptionDebuggerService } from './services/subscription-debugger.service';\nimport { HttpRequestManager } from './operators/http-operators';\nimport { FormSubscriptionManager } from './operators/forms-operators';\nimport { MemoryOptimizer } from './utils/memory-optimization';\n\n/**\n * Configuration options for NgTerminus\n */\nexport interface NgTerminusConfig {\n  enableDebugger?: boolean;\n  enableMemoryOptimization?: boolean;\n  debugMode?: boolean;\n}\n\n/**\n * The main Angular module for ng-terminus library.\n * \n * This module can be imported into your Angular application to provide\n * all ng-terminus services and enable comprehensive subscription management.\n * \n * @example\n * ```typescript\n * import { NgModule } from '@angular/core';\n * import { NgTerminusModule } from '@fivexlabs/ng-terminus';\n * \n * @NgModule({\n *   imports: [NgTerminusModule.forRoot({ enableDebugger: true })],\n *   // ...\n * })\n * export class AppModule { }\n * ```\n */\n@NgModule({\n  providers: [\n    SubscriptionManager,\n    SubscriptionDebuggerService,\n    HttpRequestManager,\n    FormSubscriptionManager\n  ]\n})\nexport class NgTerminusModule {\n  /**\n   * Use this method to configure the module for the root application.\n   * \n   * @param config Configuration options for ng-terminus\n   * @returns The configured module with providers\n   * \n   * @example\n   * ```typescript\n   * @NgModule({\n   *   imports: [NgTerminusModule.forRoot({\n   *     enableDebugger: true,\n   *     enableMemoryOptimization: true,\n   *     debugMode: environment.production === false\n   *   })],\n   *   // ...\n   * })\n   * export class AppModule { }\n   * ```\n   */\n  static forRoot(config: NgTerminusConfig = {}): ModuleWithProviders<NgTerminusModule> {\n    return {\n      ngModule: NgTerminusModule,\n      providers: [\n        SubscriptionManager,\n        SubscriptionDebuggerService,\n        HttpRequestManager,\n        FormSubscriptionManager,\n        {\n          provide: 'NG_TERMINUS_CONFIG',\n          useValue: config\n        }\n      ]\n    };\n  }\n\n  /**\n   * Use this method to configure the module for feature modules.\n   * This ensures proper service scoping in lazy-loaded modules.\n   * \n   * @param config Optional configuration for feature modules\n   * @returns The configured module\n   * \n   * @example\n   * ```typescript\n   * @NgModule({\n   *   imports: [NgTerminusModule.forFeature()],\n   *   // ...\n   * })\n   * export class FeatureModule { }\n   * ```\n   */\n  static forFeature(config: Partial<NgTerminusConfig> = {}): ModuleWithProviders<NgTerminusModule> {\n    return {\n      ngModule: NgTerminusModule,\n      providers: [\n        // Feature modules get their own instances of these services\n        SubscriptionManager,\n        HttpRequestManager,\n        FormSubscriptionManager\n      ]\n    };\n  }\n\n  constructor() {\n    // Initialize services if configuration is provided\n    // This would typically be done in an APP_INITIALIZER\n    console.log('🎯 NgTerminus module initialized');\n  }\n} ","import { inject } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { Observable, EMPTY } from 'rxjs';\nimport { takeUntil, filter, switchMap } from 'rxjs/operators';\n\n/**\n * RxJS operator that automatically unsubscribes when navigating away from the current route.\n * This is useful for subscriptions that should only remain active while on a specific route.\n * \n * @param targetRoute Optional specific route to monitor. If not provided, monitors any route change.\n * @returns MonoTypeOperatorFunction that unsubscribes on route change\n * \n * @example\n * ```typescript\n * // Unsubscribe on any route change\n * this.dataService.getData()\n *   .pipe(takeUntilRoute())\n *   .subscribe(data => console.log(data));\n * \n * // Unsubscribe only when leaving specific route\n * this.dataService.getData()\n *   .pipe(takeUntilRoute('/dashboard'))\n *   .subscribe(data => console.log(data));\n * ```\n */\nexport function takeUntilRoute(targetRoute?: string) {\n  return function <T>(source: Observable<T>): Observable<T> {\n    const router = inject(Router, { optional: true });\n    \n    if (!router) {\n      console.warn('takeUntilRoute: Router not available, operator will have no effect');\n      return source;\n    }\n\n    const routeChange$ = router.events.pipe(\n      filter(event => event instanceof NavigationEnd),\n      filter((event: NavigationEnd) => {\n        if (!targetRoute) {\n          return true; // Unsubscribe on any route change\n        }\n        // Unsubscribe when leaving the target route\n        return !event.urlAfterRedirects.startsWith(targetRoute);\n      })\n    );\n\n    return source.pipe(takeUntil(routeChange$));\n  };\n}\n\n/**\n * RxJS operator that keeps subscription active only while on a specific route.\n * When navigating away, it unsubscribes and returns EMPTY.\n * When navigating back, it resubscribes.\n * \n * @param routePattern The route pattern to match (supports wildcards)\n * @returns OperatorFunction that manages subscription based on route presence\n * \n * @example\n * ```typescript\n * this.dataService.getLiveData()\n *   .pipe(takeWhileOnRoute('/dashboard/**'))\n *   .subscribe(data => console.log('Dashboard data:', data));\n * ```\n */\nexport function takeWhileOnRoute<T>(routePattern: string) {\n  return function (source: Observable<T>): Observable<T> {\n    const router = inject(Router, { optional: true });\n    \n    if (!router) {\n      console.warn('takeWhileOnRoute: Router not available, operator will have no effect');\n      return source;\n    }\n\n    return router.events.pipe(\n      filter(event => event instanceof NavigationEnd),\n      switchMap((event: NavigationEnd) => {\n        const currentUrl = event.urlAfterRedirects;\n        const matches = matchesRoutePattern(currentUrl, routePattern);\n        return matches ? source : EMPTY;\n      })\n    );\n  };\n}\n\n/**\n * Utility function to check if a URL matches a route pattern.\n * Supports wildcards (* and **).\n */\nfunction matchesRoutePattern(url: string, pattern: string): boolean {\n  // Convert pattern to regex\n  const regexPattern = pattern\n    .replace(/\\*\\*/g, '.*')  // ** matches anything including /\n    .replace(/\\*/g, '[^/]*') // * matches anything except /\n    .replace(/\\//g, '\\\\/');  // Escape forward slashes\n  \n  const regex = new RegExp(`^${regexPattern}$`);\n  return regex.test(url);\n} ","import { inject, DestroyRef, DOCUMENT } from '@angular/core';\nimport { Observable, fromEvent, merge, EMPTY } from 'rxjs';\nimport { switchMap, takeUntil, startWith, map, distinctUntilChanged, share } from 'rxjs/operators';\n\n/**\n * RxJS operator that pauses subscription when page becomes hidden\n * and resumes when page becomes visible again.\n * \n * @param emitOnResume Whether to emit the last value when resuming (default: true)\n * @returns OperatorFunction that manages subscription based on page visibility\n * \n * @example\n * ```typescript\n * this.dataService.getLiveData()\n *   .pipe(takeWhileVisible())\n *   .subscribe(data => console.log('Received while visible:', data));\n * ```\n */\nexport function takeWhileVisible<T>(emitOnResume: boolean = true) {\n  return function (source: Observable<T>): Observable<T> {\n    const document = inject(DOCUMENT, { optional: true });\n    \n    if (!document) {\n      console.warn('takeWhileVisible: Document not available, operator will have no effect');\n      return source;\n    }\n\n    const visibility$ = merge(\n      fromEvent(document, 'visibilitychange'),\n      fromEvent(document, 'blur'),\n      fromEvent(document, 'focus')\n    ).pipe(\n      startWith(null),\n      map(() => !document.hidden),\n      distinctUntilChanged(),\n      share()\n    );\n\n    return visibility$.pipe(\n      switchMap(isVisible => {\n        if (isVisible) {\n          return source;\n        } else {\n          return EMPTY;\n        }\n      })\n    );\n  };\n}\n\n/**\n * RxJS operator that unsubscribes when page becomes hidden\n * and doesn't automatically resubscribe when visible again.\n * \n * @returns MonoTypeOperatorFunction that unsubscribes on page hide\n * \n * @example\n * ```typescript\n * this.dataService.getData()\n *   .pipe(takeUntilHidden())\n *   .subscribe(data => console.log('Data received:', data));\n * ```\n */\nexport function takeUntilHidden<T>() {\n  return function (source: Observable<T>): Observable<T> {\n    const document = inject(DOCUMENT, { optional: true });\n    \n    if (!document) {\n      console.warn('takeUntilHidden: Document not available, operator will have no effect');\n      return source;\n    }\n\n    const hidden$ = merge(\n      fromEvent(document, 'visibilitychange'),\n      fromEvent(document, 'blur')\n    ).pipe(\n      map(() => document.hidden),\n      distinctUntilChanged(),\n      switchMap(isHidden => isHidden ? [true] : EMPTY)\n    );\n\n    return source.pipe(takeUntil(hidden$));\n  };\n}\n\n/**\n * RxJS operator that emits only when page is visible\n * and buffers emissions while hidden.\n * \n * @param bufferSize Maximum number of emissions to buffer (default: 10)\n * @returns OperatorFunction that buffers emissions while page is hidden\n * \n * @example\n * ```typescript\n * this.dataService.getNotifications()\n *   .pipe(bufferWhileHidden(5))\n *   .subscribe(notifications => {\n *     // Receive up to 5 buffered notifications when page becomes visible\n *     console.log('Notifications:', notifications);\n *   });\n * ```\n */\nexport function bufferWhileHidden<T>(bufferSize: number = 10) {\n  return function (source: Observable<T>): Observable<T[]> {\n    const document = inject(DOCUMENT, { optional: true });\n    \n    if (!document) {\n      console.warn('bufferWhileHidden: Document not available, operator will have no effect');\n      return source.pipe(map(value => [value]));\n    }\n\n    const visibility$ = merge(\n      fromEvent(document, 'visibilitychange'),\n      fromEvent(document, 'focus'),\n      fromEvent(document, 'blur')\n    ).pipe(\n      startWith(null),\n      map(() => !document.hidden),\n      distinctUntilChanged(),\n      share()\n    );\n\n    let buffer: T[] = [];\n\n    return source.pipe(\n      switchMap(value => {\n        return visibility$.pipe(\n          map(isVisible => {\n            if (isVisible) {\n              // Page is visible, emit buffered values plus current value\n              buffer.push(value);\n              const result = buffer.slice(-bufferSize);\n              buffer = [];\n              return result;\n            } else {\n              // Page is hidden, add to buffer\n              buffer.push(value);\n              if (buffer.length > bufferSize) {\n                buffer = buffer.slice(-bufferSize);\n              }\n              return [];\n            }\n          })\n        );\n      }),\n      switchMap(values => values.length > 0 ? [values] : EMPTY)\n    );\n  };\n}\n\n/**\n * RxJS operator that throttles emissions when page is not visible\n * and resumes normal emission rate when visible.\n * \n * @param hiddenThrottleMs Throttle time in milliseconds when hidden (default: 30000)\n * @returns MonoTypeOperatorFunction that throttles based on visibility\n * \n * @example\n * ```typescript\n * this.dataService.getHeartbeat()\n *   .pipe(throttleWhileHidden(60000)) // Throttle to 1 minute when hidden\n *   .subscribe(heartbeat => console.log('Heartbeat:', heartbeat));\n * ```\n */\nexport function throttleWhileHidden<T>(hiddenThrottleMs: number = 30000) {\n  return function (source: Observable<T>): Observable<T> {\n    const document = inject(DOCUMENT, { optional: true });\n    \n    if (!document) {\n      console.warn('throttleWhileHidden: Document not available, operator will have no effect');\n      return source;\n    }\n\n    const visibility$ = merge(\n      fromEvent(document, 'visibilitychange'),\n      fromEvent(document, 'focus'),\n      fromEvent(document, 'blur')\n    ).pipe(\n      startWith(null),\n      map(() => !document.hidden),\n      distinctUntilChanged(),\n      share()\n    );\n\n    let lastEmission = 0;\n\n    return source.pipe(\n      switchMap(value => {\n        return visibility$.pipe(\n          map(isVisible => {\n            const now = Date.now();\n            \n            if (isVisible) {\n              // Always emit when visible\n              lastEmission = now;\n              return value;\n            } else {\n              // Throttle when hidden\n              if (now - lastEmission >= hiddenThrottleMs) {\n                lastEmission = now;\n                return value;\n              }\n              return null;\n            }\n          })\n        );\n      }),\n      switchMap(value => value !== null ? [value] : EMPTY)\n    );\n  };\n} ","import { Observable, Subject, Subscription, throwError, EMPTY } from 'rxjs';\nimport { delay, take, tap } from 'rxjs/operators';\n\n/**\n * Mock subscription manager for testing\n */\nexport class MockSubscriptionManager {\n  private subscriptions = new Map<string, Subscription>();\n  private subscriptionCount = 0;\n\n  add(subscription: Subscription, name?: string): string {\n    const id = name || `mock_${++this.subscriptionCount}`;\n    this.subscriptions.set(id, subscription);\n    return id;\n  }\n\n  remove(id: string): boolean {\n    const subscription = this.subscriptions.get(id);\n    if (subscription) {\n      subscription.unsubscribe();\n      this.subscriptions.delete(id);\n      return true;\n    }\n    return false;\n  }\n\n  removeAll(): void {\n    this.subscriptions.forEach(sub => sub.unsubscribe());\n    this.subscriptions.clear();\n  }\n\n  getActiveCount(): number {\n    return Array.from(this.subscriptions.values())\n      .filter(sub => !sub.closed).length;\n  }\n\n  getAllCount(): number {\n    return this.subscriptions.size;\n  }\n\n  isActive(id: string): boolean {\n    const subscription = this.subscriptions.get(id);\n    return subscription ? !subscription.closed : false;\n  }\n}\n\n/**\n * Test observable that can be controlled for testing subscription behavior\n */\nexport class TestObservable<T> extends Observable<T> {\n  private subject = new Subject<T>();\n  private isCompleted = false;\n  private hasErrored = false;\n\n  constructor() {\n    super(subscriber => {\n      const subscription = this.subject.subscribe(subscriber);\n      return () => subscription.unsubscribe();\n    });\n  }\n\n  /**\n   * Emit a value to all subscribers\n   */\n  emit(value: T): void {\n    if (!this.isCompleted && !this.hasErrored) {\n      this.subject.next(value);\n    }\n  }\n\n  /**\n   * Emit multiple values with optional delays\n   */\n  emitSequence(values: T[], delayMs: number = 0): Promise<void> {\n    return new Promise((resolve) => {\n      let index = 0;\n      const emitNext = () => {\n        if (index < values.length && !this.isCompleted && !this.hasErrored) {\n          this.emit(values[index++]);\n          if (index < values.length) {\n            setTimeout(emitNext, delayMs);\n          } else {\n            resolve();\n          }\n        } else {\n          resolve();\n        }\n      };\n      emitNext();\n    });\n  }\n\n  /**\n   * Complete the observable\n   */\n  complete(): void {\n    if (!this.isCompleted && !this.hasErrored) {\n      this.isCompleted = true;\n      this.subject.complete();\n    }\n  }\n\n  /**\n   * Emit an error\n   */\n  error(error: any): void {\n    if (!this.isCompleted && !this.hasErrored) {\n      this.hasErrored = true;\n      this.subject.error(error);\n    }\n  }\n\n  /**\n   * Get the current state\n   */\n  getState(): { completed: boolean; errored: boolean } {\n    return {\n      completed: this.isCompleted,\n      errored: this.hasErrored\n    };\n  }\n}\n\n/**\n * Subscription testing utilities\n */\nexport class SubscriptionTester {\n  private subscriptions: Subscription[] = [];\n  private emissionCounts = new Map<string, number>();\n  private errorCounts = new Map<string, number>();\n  private completionCounts = new Map<string, number>();\n\n  /**\n   * Subscribe to an observable with tracking\n   */\n  subscribe<T>(\n    observable: Observable<T>,\n    name: string,\n    options: {\n      onNext?: (value: T) => void;\n      onError?: (error: any) => void;\n      onComplete?: () => void;\n    } = {}\n  ): Subscription {\n    const subscription = observable\n      .pipe(\n        tap({\n          next: (value) => {\n            this.incrementCount(this.emissionCounts, name);\n            options.onNext?.(value);\n          },\n          error: (error) => {\n            this.incrementCount(this.errorCounts, name);\n            options.onError?.(error);\n          },\n          complete: () => {\n            this.incrementCount(this.completionCounts, name);\n            options.onComplete?.();\n          }\n        })\n      )\n      .subscribe();\n\n    this.subscriptions.push(subscription);\n    return subscription;\n  }\n\n  /**\n   * Get emission count for a named subscription\n   */\n  getEmissionCount(name: string): number {\n    return this.emissionCounts.get(name) || 0;\n  }\n\n  /**\n   * Get error count for a named subscription\n   */\n  getErrorCount(name: string): number {\n    return this.errorCounts.get(name) || 0;\n  }\n\n  /**\n   * Get completion count for a named subscription\n   */\n  getCompletionCount(name: string): number {\n    return this.completionCounts.get(name) || 0;\n  }\n\n  /**\n   * Get total active subscriptions\n   */\n  getActiveSubscriptionCount(): number {\n    return this.subscriptions.filter(sub => !sub.closed).length;\n  }\n\n  /**\n   * Unsubscribe from all tracked subscriptions\n   */\n  unsubscribeAll(): void {\n    this.subscriptions.forEach(sub => sub.unsubscribe());\n    this.subscriptions = [];\n  }\n\n  /**\n   * Reset all counters\n   */\n  reset(): void {\n    this.unsubscribeAll();\n    this.emissionCounts.clear();\n    this.errorCounts.clear();\n    this.completionCounts.clear();\n  }\n\n  /**\n   * Wait for a specific number of emissions\n   */\n  waitForEmissions(name: string, count: number, timeoutMs: number = 5000): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const startTime = Date.now();\n      const checkEmissions = () => {\n        if (this.getEmissionCount(name) >= count) {\n          resolve();\n        } else if (Date.now() - startTime > timeoutMs) {\n          reject(new Error(`Timeout waiting for ${count} emissions from ${name}. Got ${this.getEmissionCount(name)}`));\n        } else {\n          setTimeout(checkEmissions, 10);\n        }\n      };\n      checkEmissions();\n    });\n  }\n\n  /**\n   * Wait for completion\n   */\n  waitForCompletion(name: string, timeoutMs: number = 5000): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const startTime = Date.now();\n      const checkCompletion = () => {\n        if (this.getCompletionCount(name) > 0) {\n          resolve();\n        } else if (Date.now() - startTime > timeoutMs) {\n          reject(new Error(`Timeout waiting for completion of ${name}`));\n        } else {\n          setTimeout(checkCompletion, 10);\n        }\n      };\n      checkCompletion();\n    });\n  }\n\n  private incrementCount(map: Map<string, number>, key: string): void {\n    map.set(key, (map.get(key) || 0) + 1);\n  }\n}\n\n/**\n * Memory leak detector for testing\n */\nexport class MemoryLeakDetector {\n  private initialMemory?: number;\n  private subscriptions: Subscription[] = [];\n\n  /**\n   * Start monitoring memory usage\n   */\n  startMonitoring(): void {\n    if (typeof performance !== 'undefined' && 'memory' in performance) {\n      this.initialMemory = (performance as any).memory.usedJSHeapSize;\n    }\n  }\n\n  /**\n   * Add subscription to monitor\n   */\n  track(subscription: Subscription): void {\n    this.subscriptions.push(subscription);\n  }\n\n  /**\n   * Check for memory leaks\n   */\n  checkForLeaks(): {\n    hasLeaks: boolean;\n    memoryIncrease: number;\n    activeSubscriptions: number;\n    totalSubscriptions: number;\n  } {\n    const currentMemory = typeof performance !== 'undefined' && 'memory' in performance\n      ? (performance as any).memory.usedJSHeapSize\n      : 0;\n\n    const memoryIncrease = this.initialMemory\n      ? currentMemory - this.initialMemory\n      : 0;\n\n    const activeSubscriptions = this.subscriptions.filter(sub => !sub.closed).length;\n\n    return {\n      hasLeaks: activeSubscriptions > 0 || memoryIncrease > 1000000, // 1MB threshold\n      memoryIncrease,\n      activeSubscriptions,\n      totalSubscriptions: this.subscriptions.length\n    };\n  }\n\n  /**\n   * Clean up all tracked subscriptions\n   */\n  cleanup(): void {\n    this.subscriptions.forEach(sub => {\n      if (!sub.closed) {\n        sub.unsubscribe();\n      }\n    });\n    this.subscriptions = [];\n  }\n}\n\n/**\n * Helper functions for creating test scenarios\n */\nexport const TestScenarios = {\n  /**\n   * Create an observable that emits values at intervals\n   */\n  createIntervalObservable(intervalMs: number, maxValues: number = 10): Observable<number> {\n    return new Observable(subscriber => {\n      let count = 0;\n      const interval = setInterval(() => {\n        if (count < maxValues) {\n          subscriber.next(count++);\n        } else {\n          subscriber.complete();\n          clearInterval(interval);\n        }\n      }, intervalMs);\n\n      return () => clearInterval(interval);\n    });\n  },\n\n  /**\n   * Create an observable that errors after a delay\n   */\n  createErrorObservable(delayMs: number, error: any = new Error('Test error')): Observable<never> {\n    return new Observable(subscriber => {\n      const timeout = setTimeout(() => {\n        subscriber.error(error);\n      }, delayMs);\n\n      return () => clearTimeout(timeout);\n    });\n  },\n\n  /**\n   * Create an observable that never completes or errors\n   */\n  createInfiniteObservable(): Observable<number> {\n    return new Observable(subscriber => {\n      let count = 0;\n      const interval = setInterval(() => {\n        subscriber.next(count++);\n      }, 100);\n\n      return () => clearInterval(interval);\n    });\n  },\n\n  /**\n   * Create an observable that completes immediately\n   */\n  createImmediateCompletionObservable(): Observable<never> {\n    return EMPTY;\n  },\n\n  /**\n   * Create an observable that emits once then completes\n   */\n  createSingleValueObservable<T>(value: T, delayMs: number = 0): Observable<T> {\n    return new Observable(subscriber => {\n      const timeout = setTimeout(() => {\n        subscriber.next(value);\n        subscriber.complete();\n      }, delayMs);\n\n      return () => clearTimeout(timeout);\n    });\n  }\n}; ","import { Observable, Subject, Subscription, BehaviorSubject, ReplaySubject } from 'rxjs';\nimport { share, shareReplay, finalize, tap, distinctUntilChanged } from 'rxjs/operators';\n\n/**\n * Memory usage statistics\n */\nexport interface MemoryStats {\n  totalObservables: number;\n  activeSubscriptions: number;\n  sharedObservables: number;\n  memoryUsage: number;\n  potentialLeaks: number;\n}\n\n/**\n * Observable metadata for memory tracking\n */\ninterface ObservableMetadata {\n  id: string;\n  createdAt: Date;\n  subscriptionCount: number;\n  isShared: boolean;\n  lastActivity: Date;\n  memoryEstimate: number;\n}\n\n/**\n * Memory optimizer for RxJS observables\n */\nexport class MemoryOptimizer {\n  private static instance: MemoryOptimizer;\n  private observables = new Map<string, ObservableMetadata>();\n  private sharedObservables = new Map<string, Observable<any>>();\n  private idCounter = 0;\n  private isEnabled = false;\n\n  static getInstance(): MemoryOptimizer {\n    if (!MemoryOptimizer.instance) {\n      MemoryOptimizer.instance = new MemoryOptimizer();\n    }\n    return MemoryOptimizer.instance;\n  }\n\n  /**\n   * Enable memory optimization tracking\n   */\n  enable(): void {\n    this.isEnabled = true;\n    console.log('🧠 Memory optimizer enabled');\n  }\n\n  /**\n   * Disable memory optimization tracking\n   */\n  disable(): void {\n    this.isEnabled = false;\n    console.log('🧠 Memory optimizer disabled');\n  }\n\n  /**\n   * Create a memory-optimized observable with automatic sharing\n   */\n  optimize<T>(source: Observable<T>, options: {\n    share?: boolean;\n    shareReplay?: number;\n    name?: string;\n  } = {}): Observable<T> {\n    if (!this.isEnabled) {\n      return source;\n    }\n\n    const id = `opt_${++this.idCounter}`;\n    const metadata: ObservableMetadata = {\n      id,\n      createdAt: new Date(),\n      subscriptionCount: 0,\n      isShared: options.share || options.shareReplay !== undefined,\n      lastActivity: new Date(),\n      memoryEstimate: this.estimateMemoryUsage(source)\n    };\n\n    this.observables.set(id, metadata);\n\n    let optimized = source.pipe(\n      tap(() => {\n        metadata.lastActivity = new Date();\n      }),\n      finalize(() => {\n        this.observables.delete(id);\n      })\n    );\n\n    if (options.shareReplay !== undefined) {\n      optimized = optimized.pipe(shareReplay(options.shareReplay));\n      this.sharedObservables.set(id, optimized);\n    } else if (options.share) {\n      optimized = optimized.pipe(share());\n      this.sharedObservables.set(id, optimized);\n    }\n\n    return optimized;\n  }\n\n  /**\n   * Create a shared observable that automatically cleans up when no subscribers\n   */\n  shareWithCleanup<T>(source: Observable<T>, cleanupDelayMs: number = 5000): Observable<T> {\n    let refCount = 0;\n    let sharedObservable: Observable<T> | null = null;\n    let cleanupTimeout: NodeJS.Timeout | null = null;\n\n    return new Observable<T>(subscriber => {\n      refCount++;\n\n      if (cleanupTimeout) {\n        clearTimeout(cleanupTimeout);\n        cleanupTimeout = null;\n      }\n\n      if (!sharedObservable) {\n        sharedObservable = source.pipe(shareReplay(1));\n      }\n\n      const subscription = sharedObservable.subscribe(subscriber);\n\n      return () => {\n        subscription.unsubscribe();\n        refCount--;\n\n        if (refCount === 0) {\n          cleanupTimeout = setTimeout(() => {\n            sharedObservable = null;\n          }, cleanupDelayMs);\n        }\n      };\n    });\n  }\n\n  /**\n   * Create a memory-efficient BehaviorSubject\n   */\n  createEfficientBehaviorSubject<T>(initialValue: T, maxHistorySize: number = 1): BehaviorSubject<T> {\n    const subject = new BehaviorSubject<T>(initialValue);\n    \n    // Override the next method to limit memory usage\n    const originalNext = subject.next.bind(subject);\n    subject.next = (value: T) => {\n      originalNext(value);\n      // Cleanup old values if needed (simplified implementation)\n    };\n\n    return subject;\n  }\n\n  /**\n   * Create a memory-efficient ReplaySubject\n   */\n  createEfficientReplaySubject<T>(bufferSize: number = 1, windowTime?: number): ReplaySubject<T> {\n    // Limit buffer size to prevent memory issues\n    const safeBufferSize = Math.min(bufferSize, 100);\n    const safeWindowTime = windowTime && windowTime > 0 ? Math.min(windowTime, 300000) : windowTime; // Max 5 minutes\n    \n    return new ReplaySubject<T>(safeBufferSize, safeWindowTime);\n  }\n\n  /**\n   * Get memory usage statistics\n   */\n  getMemoryStats(): MemoryStats {\n    const now = Date.now();\n    const staleThreshold = 300000; // 5 minutes\n\n    const potentialLeaks = Array.from(this.observables.values()).filter(meta => {\n      const timeSinceActivity = now - meta.lastActivity.getTime();\n      return timeSinceActivity > staleThreshold && meta.subscriptionCount > 0;\n    }).length;\n\n    return {\n      totalObservables: this.observables.size,\n      activeSubscriptions: Array.from(this.observables.values())\n        .reduce((sum, meta) => sum + meta.subscriptionCount, 0),\n      sharedObservables: this.sharedObservables.size,\n      memoryUsage: this.getCurrentMemoryUsage(),\n      potentialLeaks\n    };\n  }\n\n  /**\n   * Clean up stale observables\n   */\n  cleanup(maxAge: number = 600000): number { // 10 minutes\n    const now = Date.now();\n    let cleaned = 0;\n\n    this.observables.forEach((metadata, id) => {\n      const age = now - metadata.createdAt.getTime();\n      const timeSinceActivity = now - metadata.lastActivity.getTime();\n      \n      if (age > maxAge && timeSinceActivity > maxAge) {\n        this.observables.delete(id);\n        this.sharedObservables.delete(id);\n        cleaned++;\n      }\n    });\n\n    console.log(`🧹 Cleaned up ${cleaned} stale observables`);\n    return cleaned;\n  }\n\n  /**\n   * Force garbage collection (if available)\n   */\n  forceGarbageCollection(): void {\n    if (typeof global !== 'undefined' && global.gc) {\n      global.gc();\n      console.log('🗑️ Forced garbage collection');\n    } else {\n      console.warn('⚠️ Garbage collection not available');\n    }\n  }\n\n  private estimateMemoryUsage(observable: Observable<any>): number {\n    // Simplified memory estimation - in reality this would be much more complex\n    return 1024; // 1KB base estimate\n  }\n\n  private getCurrentMemoryUsage(): number {\n    if (typeof performance !== 'undefined' && 'memory' in performance) {\n      return (performance as any).memory.usedJSHeapSize;\n    }\n    return 0;\n  }\n}\n\n/**\n * RxJS operator for memory optimization\n */\nexport function optimizeMemory<T>(options: {\n  share?: boolean;\n  shareReplay?: number;\n  name?: string;\n} = {}) {\n  return function (source: Observable<T>): Observable<T> {\n    return MemoryOptimizer.getInstance().optimize(source, options);\n  };\n}\n\n/**\n * RxJS operator that automatically shares observables with cleanup\n */\nexport function shareWithAutoCleanup<T>(cleanupDelayMs: number = 5000) {\n  return function (source: Observable<T>): Observable<T> {\n    return MemoryOptimizer.getInstance().shareWithCleanup(source, cleanupDelayMs);\n  };\n}\n\n/**\n * RxJS operator that limits emission frequency to reduce memory pressure\n */\nexport function limitEmissionRate<T>(maxEmissionsPerSecond: number = 10) {\n  return function (source: Observable<T>): Observable<T> {\n    let lastEmission = 0;\n    const minInterval = 1000 / maxEmissionsPerSecond;\n\n    return source.pipe(\n      distinctUntilChanged(),\n      tap(() => {\n        const now = Date.now();\n        if (now - lastEmission < minInterval) {\n          // Could implement buffering here if needed\n        }\n        lastEmission = now;\n      })\n    );\n  };\n}\n\n/**\n * Utility functions for memory management\n */\nexport const MemoryUtils = {\n  /**\n   * Get current memory usage (if available)\n   */\n  getCurrentMemoryUsage(): { used: number; total: number; limit: number } | null {\n    if (typeof performance !== 'undefined' && 'memory' in performance) {\n      const memory = (performance as any).memory;\n      return {\n        used: memory.usedJSHeapSize,\n        total: memory.totalJSHeapSize,\n        limit: memory.jsHeapSizeLimit\n      };\n    }\n    return null;\n  },\n\n  /**\n   * Check if memory usage is high\n   */\n  isMemoryUsageHigh(): boolean {\n    const memory = this.getCurrentMemoryUsage();\n    if (!memory) return false;\n    \n    return memory.used / memory.limit > 0.8; // 80% threshold\n  },\n\n  /**\n   * Log memory statistics\n   */\n  logMemoryStats(): void {\n    const memory = this.getCurrentMemoryUsage();\n    const optimizer = MemoryOptimizer.getInstance();\n    const stats = optimizer.getMemoryStats();\n\n    console.group('🧠 Memory Statistics');\n    \n    if (memory) {\n      console.log('Browser Memory:', {\n        used: `${(memory.used / 1024 / 1024).toFixed(2)} MB`,\n        total: `${(memory.total / 1024 / 1024).toFixed(2)} MB`,\n        limit: `${(memory.limit / 1024 / 1024).toFixed(2)} MB`,\n        usage: `${((memory.used / memory.limit) * 100).toFixed(1)}%`\n      });\n    }\n\n    console.log('Observable Statistics:', stats);\n    \n    if (stats.potentialLeaks > 0) {\n      console.warn(`⚠️ ${stats.potentialLeaks} potential memory leaks detected`);\n    }\n\n    console.groupEnd();\n  }\n}; ","/*\n * Public API Surface of ng-terminus\n */\n\n// Core operators and services\nexport * from './lib/operators/take-until-destroyed';\nexport * from './lib/services/subscription-manager.service';\nexport * from './lib/utils/subscription-utils';\nexport * from './lib/ng-terminus.module';\n\n// Route-based subscription management\nexport * from './lib/operators/take-until-route';\n\n// HTTP request management\nexport * from './lib/operators/http-operators';\n\n// Visibility-based subscriptions\nexport * from './lib/operators/visibility-operators';\n\n// Enhanced debugging\nexport * from './lib/services/subscription-debugger.service';\n\n// Testing utilities\nexport * from './lib/testing/subscription-testing';\n\n// Forms integration\nexport * from './lib/operators/forms-operators';\n\n// Memory optimization\nexport * from './lib/utils/memory-optimization'; ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["takeUntil"],"mappings":"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"}