{"version":3,"file":"o3r-analytics.mjs","sources":["../../src/services/event-track/event-track-configuration.ts","../../src/services/event-track/event-track-helpers.ts","../../src/services/event-track/event-track-service.ts","../../src/directives/track-events/base-track-events.ts","../../src/directives/track-events/track-click/track-click-directive.ts","../../src/directives/track-events/track-events-directive.ts","../../src/directives/track-events/track-focus/track-focus-directive.ts","../../src/stores/event-track/event-track.actions.ts","../../src/stores/event-track/event-track.reducer.ts","../../src/stores/event-track/event-track.state.ts","../../src/stores/event-track/event-track-module.ts","../../src/stores/event-track/event-track.selectors.ts","../../src/stores/event-track/event-track.sync.ts","../../src/o3r-analytics.ts"],"sourcesContent":["import {\n  InjectionToken,\n} from '@angular/core';\n\n/** Controls the activation of mesurements and ui events tracking */\nexport interface TrackActive {\n  /** Boolean to activate/deactivate the ui event tracking */\n  uiTracking: boolean;\n  /** Boolean to activate/deactivate performace measurements */\n  perfTracking: boolean;\n}\n\n/** Track events service configuration object */\nexport interface EventTrackConfiguration {\n  /** Defines how many values will be kept in performance metrics stream */\n  perfBufferSize: number;\n  /** Defines how many values will be kept in ui events stream */\n  uiEventsBufferSize: number;\n  /** If true, it will use the browser API to get the value of the FP for the first time; */\n  useBrowserApiForFirstFP: boolean;\n  /** Controls the activation of mesurements and ui events tracking */\n  activate: TrackActive;\n  /**\n   * Request ID header from call (default: {@link defaultEventTrackConfiguration.requestIdHeader})\n   * @default 'ama-request-id'\n   */\n  requestIdHeader: string;\n  /**\n   * Trace header from call  (default: {@link defaultEventTrackConfiguration.traceHeader})\n   * @default 'traceparent'\n   */\n  traceHeader: string;\n}\n\n/** Default configuration of tracking service */\nexport const defaultEventTrackConfiguration = {\n  perfBufferSize: 10,\n  uiEventsBufferSize: 20,\n  useBrowserApiForFirstFP: false,\n  requestIdHeader: 'ama-request-id',\n  traceHeader: 'traceparent',\n  activate: {\n    uiTracking: true,\n    perfTracking: true\n  }\n} as const satisfies EventTrackConfiguration;\n\n/** Tracking service configuration token used to override the default configuration */\nexport const EVENT_TRACK_SERVICE_CONFIGURATION = new InjectionToken<Partial<EventTrackConfiguration>>('EVENT TRACK');\n","/**\n * Check if input is of type {@link PerformanceNavigationTiming}\n * @param entry PerformanceEntry\n * @returns type indicator if {@link entry} meets the condition of {@link PerformanceNavigationTiming}\n */\nexport function isPerformanceNavigationEntry(entry: PerformanceEntry | undefined): entry is PerformanceNavigationTiming {\n  return entry?.entryType === 'navigation';\n}\n","/* eslint-disable @typescript-eslint/naming-convention -- naming convention for DOM, FP, and FMP imposed by Lighthouse */\nimport {\n  decodeTraceparentHeader,\n  type Mark,\n} from '@ama-sdk/core';\nimport {\n  inject,\n  Injectable,\n  NgZone,\n} from '@angular/core';\nimport {\n  NavigationEnd,\n  Router,\n} from '@angular/router';\nimport {\n  BehaviorSubject,\n  combineLatest,\n  fromEvent,\n  Observable,\n  of,\n  ReplaySubject,\n  switchMap,\n} from 'rxjs';\nimport {\n  delay,\n  filter,\n  skip,\n  skipWhile,\n  take,\n  takeWhile,\n  withLatestFrom,\n} from 'rxjs/operators';\nimport {\n  CustomEventMarks,\n  CustomEventPayload,\n  EventTiming,\n  FirstLoadDataPayload,\n  PerfEventPayload,\n  ServerCallMetric,\n  UiEventPayload,\n} from '../../contracts';\nimport {\n  defaultEventTrackConfiguration,\n  EVENT_TRACK_SERVICE_CONFIGURATION,\n} from './event-track-configuration';\nimport {\n  isPerformanceNavigationEntry,\n} from './event-track-helpers';\n\n/** The initial value of the performance measurements */\nexport const performanceMarksInitialState: Readonly<PerfEventPayload> = {\n  page: '',\n  perceived: {},\n  serverCalls: [],\n  customMarks: []\n} as const;\n\n/**\n * Service to expose the tracked events as streams. Also provide a way to activate/deactivate the tracking\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class EventTrackService {\n  private readonly uiEventTrack: ReplaySubject<UiEventPayload>;\n\n  private readonly customEventTrack: ReplaySubject<CustomEventPayload>;\n\n  private readonly perfEventTrack: ReplaySubject<PerfEventPayload>;\n\n  private readonly uiTrackingActivated: BehaviorSubject<boolean>;\n\n  private readonly perfTrackingActivated: BehaviorSubject<boolean>;\n\n  private firstPaint?: Promise<EventTiming>;\n\n  /** UI captured events as stream */\n  public uiEventTrack$: Observable<UiEventPayload>;\n\n  /** Custom captured events as stream */\n  public customEventTrack$: Observable<CustomEventPayload>;\n\n  /** Performance captured events as stream */\n  public perfEventTrack$: Observable<PerfEventPayload>;\n\n  /** Stream of booleans for the ui tracking mode active/inactive */\n  public uiTrackingActive$: Observable<boolean>;\n\n  /** Stream of booleans for the performance tracking mode active/inactive */\n  public perfTrackingActive$: Observable<boolean>;\n\n  /** True if the perf tracking is activated; false otherwise */\n  private isPerfTrackingActive!: boolean;\n\n  /** Boolean to indicate the first load of the application */\n  private isFirstLoad = true;\n\n  private _performancePayload: PerfEventPayload = performanceMarksInitialState;\n  /** Performance payload object */\n  private get performancePayload() {\n    return this._performancePayload;\n  }\n\n  /** Performance payload object */\n  private set performancePayload(value: PerfEventPayload) {\n    if (this.isPerfTrackingActive) {\n      this._performancePayload = { ...value, page: this.router.url }; // Saves the current page url\n      this.perfEventTrack.next(this._performancePayload);\n    }\n  }\n\n  private readonly requestIdHeader: string;\n  private readonly traceHeader: string;\n\n  private readonly router = inject(Router);\n  private readonly zone = inject(NgZone);\n  private readonly config = inject(EVENT_TRACK_SERVICE_CONFIGURATION, { optional: true });\n\n  constructor() {\n    const eventConfiguration = { ...defaultEventTrackConfiguration, ...this.config };\n    this.requestIdHeader = eventConfiguration.requestIdHeader;\n    this.traceHeader = eventConfiguration.traceHeader;\n    this.uiTrackingActivated = new BehaviorSubject<boolean>(eventConfiguration.activate.uiTracking);\n    this.uiTrackingActive$ = this.uiTrackingActivated.asObservable();\n    this.uiEventTrack = new ReplaySubject<UiEventPayload>(eventConfiguration.uiEventsBufferSize);\n    this.uiEventTrack$ = this.uiEventTrack.asObservable();\n\n    // Custom events\n    this.customEventTrack = new ReplaySubject<CustomEventPayload>();\n    this.customEventTrack$ = this.customEventTrack.asObservable();\n\n    this.perfTrackingActivated = new BehaviorSubject<boolean>(eventConfiguration.activate.perfTracking);\n    this.perfTrackingActive$ = this.perfTrackingActivated.asObservable();\n    this.perfEventTrack = new ReplaySubject<PerfEventPayload>(eventConfiguration.perfBufferSize);\n    this.perfEventTrack$ = this.perfEventTrack.asObservable();\n\n    this.perfTrackingActive$.subscribe((activated) => this.isPerfTrackingActive = activated);\n\n    const routerNavigationEnd$ = this.router.events.pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd));\n    const trackingNavigationEnd$ = routerNavigationEnd$.pipe(withLatestFrom(this.perfTrackingActive$));\n\n    // Handles first load navigation\n    combineLatest(\n      trackingNavigationEnd$.pipe(\n        take(1),\n        filter(() => typeof window.performance.timing !== 'undefined'),\n        takeWhile(([_event, active]) => active)\n      ),\n      of(window.performance).pipe(\n        switchMap((windowPerformance) => {\n          const latestPerformanceEntry = windowPerformance.getEntriesByType?.('navigation').at(-1);\n          const wasLoadEventTriggered = isPerformanceNavigationEntry(latestPerformanceEntry) && latestPerformanceEntry.duration > 0;\n          if (wasLoadEventTriggered) {\n            return of(true);\n          }\n\n          return fromEvent(window, 'load').pipe(delay(0));\n        })\n      )\n    ).subscribe(async () => {\n      if (eventConfiguration.useBrowserApiForFirstFP) {\n        const browserEntries = window.performance.getEntriesByType && window.performance.getEntriesByType('paint');\n        const browserFP = browserEntries && browserEntries.find((entry) => entry.name === 'first-paint');\n        if (browserFP) {\n          const endTime = Math.round(browserFP.startTime);\n          this.addFPToPerfPayload({ startTime: 0, endTime });\n        }\n      } else if (this.firstPaint) { // If there is a registered firstPaint value emit it\n        this.addFPToPerfPayload(await this.firstPaint);\n        this.firstPaint = undefined;\n      }\n      this.markFirstLoad();\n    });\n\n    // Handles later navigation\n    trackingNavigationEnd$.pipe(\n      skip(1),\n      skipWhile(([_event, active]) => !active)\n    ).subscribe(async () => {\n      this.isFirstLoad = false;\n      this.resetPerfMarks();\n      if (this.firstPaint) { // If there is a registered firstPaint value emit it\n        this.addFPToPerfPayload(await this.firstPaint);\n        this.firstPaint = undefined;\n      }\n    });\n  }\n\n  /**\n   * Create metrics object for the first load of the application\n   */\n  private createFirstLoadData(): FirstLoadDataPayload {\n    const navigation = window.performance.timing;\n    return {\n      connection: Math.round(navigation.connectEnd - navigation.navigationStart),\n      request: Math.round(navigation.responseStart - navigation.connectEnd),\n      response: Math.round(navigation.responseEnd - navigation.responseStart),\n      DOM: Math.round(navigation.loadEventEnd - navigation.responseEnd),\n      total: Math.round(navigation.loadEventEnd - navigation.navigationStart)\n    };\n  }\n\n  /**\n   * Populate performance payload with FP object\n   * @param FP\n   */\n  private addFPToPerfPayload(FP: EventTiming) {\n    const perfFirstPaint = {\n      ...this.performancePayload,\n      perceived: {\n        ...this.performancePayload.perceived,\n        FP\n      }\n    };\n    this.performancePayload = perfFirstPaint;\n  }\n\n  /**\n   * Reset all metrics to initial state; Add the pageName on top of it\n   */\n  public resetPerfMarks() {\n    this.performancePayload = { ...performanceMarksInitialState };\n  }\n\n  /**\n   * Mark the first load metrics using the navigation API.\n   * This has to be called only once in a single page application, being meaningful only for the first load\n   * This mark is populated by default in this service when the NavigationEnd event of the router emits for the first time\n   */\n  public markFirstLoad() {\n    const firstLoad = this.createFirstLoadData();\n    this.performancePayload = { ...this.performancePayload, firstLoad };\n  }\n\n  /**\n   * Mark the first paint value\n   * Store the first paint timing value to be emitted at Navigation End\n   * @param emit If true, sets the FP to the current page. Otherwise, wait for next NavigationEnd event to happen\n   */\n  public async markFP(emit = false) {\n    this.firstPaint = this.getTiming();\n    if (emit) {\n      this.addFPToPerfPayload(await this.firstPaint);\n      this.firstPaint = undefined;\n    }\n  }\n\n  /**\n   * Mark the first meaningful paint value.\n   * @param markOnlyFirstLoad If false, marks the FMP for subsequent loads else only for the first load of the application\n   */\n  public async markFMP(markOnlyFirstLoad = true) {\n    if (!markOnlyFirstLoad || (markOnlyFirstLoad && this.isFirstLoad)) {\n      const timing = await this.getTiming();\n      const perfFirstMeaningfulPaint = {\n        ...this.performancePayload,\n        perceived: {\n          ...this.performancePayload.perceived,\n          FMP: timing\n        }\n      };\n      this.performancePayload = perfFirstMeaningfulPaint;\n    }\n  }\n\n  /**\n   * Add data ready perceived event\n   * This probe marks the time when the page considers it has all the data to become interactive\n   */\n  public async markDataReady() {\n    const timing = await this.getTiming();\n    const perfDataReady = {\n      ...this.performancePayload,\n      perceived: {\n        ...this.performancePayload.perceived,\n        dataReady: timing\n      }\n    };\n    this.performancePayload = perfDataReady;\n  }\n\n  /**\n   * Add a custom event and its measurements\n   * @param label The event name\n   */\n  public async addCustomMark(label: string) {\n    const timing = await this.getTiming();\n    const customMark = { label, timing } as const satisfies CustomEventMarks;\n    const perf = { ...this.performancePayload, customMarks: this.performancePayload.customMarks.concat(customMark) };\n    this.performancePayload = perf;\n  }\n\n  /**\n   * Add a server call object in the list of server calls metrics\n   * @param serverCall The object to add in the server calls metrics\n   */\n  public addServerCallMark(serverCall: ServerCallMetric) {\n    const perf = { ...this.performancePayload, serverCalls: this.performancePayload.serverCalls.concat(serverCall) };\n    this.performancePayload = perf;\n  }\n\n  /**\n   * Add a SDK server call mark, in the list of server calls metrics.\n   * In order to have requestId for the API calls, your server has to expose 'ama-request-id' via Access-Control-Expose-Headers\n   * @param serverMark The mark object\n   */\n  public async addSDKServerCallMark(serverMark: Mark) {\n    let serverCallMetric: ServerCallMetric = {\n      url: serverMark.url,\n      httpMethod: serverMark.requestOptions.method,\n      httpStatus: serverMark.response && serverMark.response.status,\n      timing: { startTime: serverMark.startTime, endTime: serverMark.endTime },\n      error: serverMark.error\n    };\n    if (serverMark.response) {\n      const clonedResponse = serverMark.response.clone();\n      const traceHeader = clonedResponse.headers.get(this.traceHeader);\n      const requestId = serverMark.openTelemetryTrace?.traceId\n        || (traceHeader && decodeTraceparentHeader(traceHeader)?.traceId)\n        || clonedResponse.headers.get(this.requestIdHeader)\n        || undefined;\n      const blob = await clonedResponse.blob();\n      serverCallMetric = {\n        ...serverCallMetric,\n        responseSize: blob.size,\n        requestId\n      };\n    }\n    this.addServerCallMark(serverCallMetric);\n  }\n\n  /**\n   * Add a custom event and mark the start time, and returns the element index\n   * @param label Event name\n   * @returns the element index if tracking is active. Otherwise, -1\n   */\n  public startCustomMark(label: string) {\n    if (!this.isPerfTrackingActive) {\n      return -1;\n    }\n    const startTime = Math.round(window.performance.now());\n    const customMark = { label, timing: { startTime } } as const satisfies CustomEventMarks;\n    const perf = { ...this.performancePayload, customMarks: this.performancePayload.customMarks.concat(customMark) };\n    this.performancePayload = perf;\n    return this.performancePayload.customMarks.length - 1;\n  }\n\n  /**\n   * End the event mark given in parameter;\n   * Returns false if the custom event is not found in the list of custom marks; true otherwise\n   * @param eventIndex Index of the custom event to be marked as ended\n   */\n  public endCustomMark(eventIndex: number) {\n    if (!this.isPerfTrackingActive) {\n      return false;\n    }\n    let updated = false;\n    const perf = {\n      ...this.performancePayload,\n      customMarks: this.performancePayload.customMarks.map((eventObj, index) => {\n        if (index !== eventIndex) {\n          return eventObj;\n        }\n        updated = true;\n        const endTime = Math.round(window.performance.now());\n        return { label: eventObj.label, timing: { ...eventObj.timing, endTime } };\n      })\n    };\n    this.performancePayload = perf;\n    return updated;\n  }\n\n  /**\n   * The goal of this method is to compute a time range duration between the moment you call the function (lower bound timestamp)\n   * and the end of the composite rendering (upper bound measurement - a time mark that occurs after the real composite)\n   * For the first load of the application, the start time is considered as the start of navigation to ensure a cumulative measure.\n   * It is using the 'NgZone' service to runOutsideAngular to prevent any change detection to occur, nor angular error handling, speeding up the measurement.\n   * Example {@link markFMP} is called in {@link ngAfterViewInit}, the end time will be computed once the render pipeline stage completed the changes triggered by the javascript\n   */\n  public getTiming(): Promise<EventTiming> {\n    const startTime = this.isFirstLoad ? 0 : Math.round(window.performance.now());\n    return new Promise((resolve) => {\n      this.zone.runOutsideAngular(() => {\n        setTimeout(() => {\n          const endTime = Math.round(window.performance.now());\n          resolve({ startTime, endTime });\n        }, 0);\n      });\n    });\n  }\n\n  /**\n   * Add an event to the stream of captured UI events\n   * @param uiEvent emitted event object\n   */\n  public addUiEvent(uiEvent: UiEventPayload) {\n    this.uiEventTrack.next(uiEvent);\n  }\n\n  /**\n   * Add an event to the stream of captured custom events\n   * @param customEvent emitted event object\n   */\n  public addCustomEvent(customEvent: CustomEventPayload) {\n    this.customEventTrack.next(customEvent);\n  }\n\n  /**\n   * Activate/deactivate the tracking mode for UI events\n   * @param activate activation/deactivation boolean\n   */\n  public toggleUiTracking(activate: boolean) {\n    this.uiTrackingActivated.next(activate);\n  }\n\n  /**\n   * Activate/deactivate the tracking mode for performance measurements\n   * @param activate activation/deactivation boolean\n   */\n  public togglePerfTracking(activate: boolean) {\n    this.perfTrackingActivated.next(activate);\n  }\n}\n","import {\n  Directive,\n  ElementRef,\n  inject,\n  Renderer2,\n} from '@angular/core';\nimport {\n  takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n  AnalyticsEvent,\n  ConstructorAnalyticsEvent,\n  ConstructorAnalyticsEventParameters,\n  EventContext,\n  TrackEventName,\n} from '../../contracts';\nimport {\n  EventTrackService,\n} from '../../services/event-track';\n\n@Directive()\nexport abstract class BaseTrackEvents {\n  private readonly el = inject(ElementRef);\n  private readonly trackEventsService = inject(EventTrackService);\n  private readonly renderer = inject(Renderer2);\n\n  /**\n   * Custom object to be stored when the click event is captured\n   */\n  public abstract trackEventContext?: EventContext;\n\n  /**\n   * Class to create the EventContext\n   */\n  public abstract trackEventContextConstructor?: ConstructorAnalyticsEvent<AnalyticsEvent>;\n\n  /**\n   * Parameter that should be given to the\n   */\n  public abstract trackEventContextConstructorParameters?: ConstructorAnalyticsEventParameters;\n\n  /**\n   * Store the functions returned by the angular renderer when an event listener is built\n   * The functions can be called to destroy the associated listeners\n   */\n  protected unlistenFns: (() => void)[] = [];\n\n  /** Array of track events objects */\n  protected trackingEvents: TrackEventName[] = [];\n\n  /** Flag for the tracking mode */\n  protected isTrackingActive = false;\n\n  constructor() {\n    this.trackEventsService.uiTrackingActive$.pipe(takeUntilDestroyed()).subscribe((isActive) => {\n      this.isTrackingActive = isActive;\n      if (isActive) {\n        this.listen();\n      } else {\n        this.unlisten();\n      }\n    });\n  }\n\n  /**\n   * Create the listener for the given event\n   * @param event name\n   */\n  protected nativeListen(event: TrackEventName) {\n    // Renderer is used because it is manipulating the DOM and when the element is destroyed the event listener is destroyed too.\n    // Usage of an observable from event was not possible because the ngOnDestroy with the unsubscribe was called before the ui event was handled\n    return this.renderer.listen(this.el.nativeElement, event, (nativeEvent) => {\n      if (this.trackEventContextConstructor) {\n        this.trackEventsService.addUiEvent({ nativeEvent, context: new this.trackEventContextConstructor(this.trackEventContextConstructorParameters) });\n      } else if (this.trackEventContext) {\n        this.trackEventsService.addUiEvent({ nativeEvent, context: this.trackEventContext });\n      }\n    });\n  }\n\n  /** Create the events listeners */\n  public listen() {\n    this.unlisten();\n    this.unlistenFns = this.trackingEvents.map((event) => this.nativeListen(event));\n  }\n\n  /** Remove the created events listeners */\n  public unlisten() {\n    this.unlistenFns.forEach((fn) => fn());\n    this.unlistenFns = [];\n  }\n\n  /**\n   * Keep the events to be listen and create the listener event for the given event name\n   * @param event name\n   */\n  public trackEvent(event: TrackEventName) {\n    this.trackingEvents.push(event);\n    if (this.isTrackingActive) {\n      this.unlistenFns.push(this.nativeListen(event));\n    }\n  }\n}\n","import {\n  Directive,\n  Input,\n  OnInit,\n} from '@angular/core';\nimport {\n  AnalyticsEvent,\n  ConstructorAnalyticsEvent,\n  ConstructorAnalyticsEventParameters,\n  EventContext,\n} from '../../../contracts/index';\nimport {\n  BaseTrackEvents,\n} from '../base-track-events';\n\n/**\n * Directive to capture the 'click' event on the reference element.\n * The captured event will be exposed via EventTrackService\n * @example\n * ```html\n * <my-component\n *    (click)=\"doSomething()\"\n *    trackClick\n *    [trackEventContext]=\"{context: 'click on the component with tag: my-component'}\">\n * </my-component>\n * ```\n */\n@Directive({\n  selector: '[trackClick]'\n})\nexport class TrackClickDirective extends BaseTrackEvents implements OnInit {\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContext?: EventContext;\n\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContextConstructor?: ConstructorAnalyticsEvent<AnalyticsEvent>;\n\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContextConstructorParameters?: ConstructorAnalyticsEventParameters;\n\n  public ngOnInit() {\n    this.trackEvent('click');\n    this.trackEvent('contextmenu');\n    this.trackEvent('auxclick');\n  }\n}\n","import {\n  Directive,\n  Input,\n  OnChanges,\n  SimpleChanges,\n} from '@angular/core';\nimport {\n  AnalyticsEvent,\n  ConstructorAnalyticsEvent,\n  ConstructorAnalyticsEventParameters,\n  EventContext,\n  TrackEventName,\n} from '../../contracts';\nimport {\n  BaseTrackEvents,\n} from './base-track-events';\n\n/**\n * Directive to capture the events given as input, on the reference element.\n * The captured event will be exposed via EventTrackService\n * @example\n * ```html\n * <my-component\n *    (click)=\"doSomething()\"\n *    [trackEvents]=\"['mouseenter', 'mouseleave']\"\n *    [trackEventContext]=\"{context: 'click on the component with tag: my-component'}\">\n * </my-component>\n * ```\n */\n@Directive({\n  selector: '[trackEvents]'\n})\nexport class TrackEventsDirective extends BaseTrackEvents implements OnChanges {\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContext?: EventContext;\n\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContextConstructor?: ConstructorAnalyticsEvent<AnalyticsEvent>;\n\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContextConstructorParameters?: ConstructorAnalyticsEventParameters;\n\n  /** The list of events to listen */\n  @Input('trackEvents') public trackEventNames: TrackEventName[] = [];\n\n  public ngOnChanges(changes: SimpleChanges) {\n    if ('trackEventNames' in changes) {\n      this.trackingEvents = [];\n      this.unlisten();\n      this.trackEventNames.forEach((eventName) => this.trackEvent(eventName));\n    }\n  }\n}\n","import {\n  Directive,\n  Input,\n  OnInit,\n} from '@angular/core';\nimport {\n  AnalyticsEvent,\n  ConstructorAnalyticsEvent,\n  ConstructorAnalyticsEventParameters,\n  EventContext,\n} from '../../../contracts/index';\nimport {\n  BaseTrackEvents,\n} from '../base-track-events';\n\n/**\n * Directive to capture the 'focus' event on the reference element.\n * The captured event will be exposed via EventTrackService\n * @example\n * ```html\n * <my-component\n *    trackFocus\n *    [trackEventContext]=\"{context: 'focus on the component with tag: my-component'}\">\n * </my-component>\n * ```\n */\n@Directive({\n  selector: '[trackFocus]'\n})\nexport class TrackFocusDirective extends BaseTrackEvents implements OnInit {\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContext?: EventContext;\n\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContextConstructor?: ConstructorAnalyticsEvent<AnalyticsEvent>;\n\n  /**\n   * @inheritdoc\n   */\n  @Input() public trackEventContextConstructorParameters?: ConstructorAnalyticsEventParameters;\n\n  public ngOnInit() {\n    this.trackEvent('focus');\n  }\n}\n","import {\n  createAction,\n  props,\n} from '@ngrx/store';\nimport {\n  EventTrackState,\n  RegisterHeroComponentPayload,\n} from './event-track.state';\n\n/** StateActions */\nconst ACTION_SET = '[EventTrack] set';\nconst ACTION_UPDATE = '[EventTrack] update';\nconst ACTION_REGISTER_HERO_COMPONENT = '[EventTrack] register hero component';\nconst ACTION_SET_HERO_COMPONENT_TTI = '[EventTrack] set hero component TTI';\nconst ACTION_RESET = '[EventTrack] reset';\n\n/**\n * The payload for setting TTI for a hero component\n */\nexport interface SetHeroComponentTTIPayload {\n  /**\n   * The identifier of the hero component\n   */\n  id: string;\n\n  /**\n   * The TTI measure for the hero component\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention -- naming convention imposed by Lighthouse\n  TTI: number;\n\n  /**\n   * List of API endpoints used in the Hero component and it's subcomponents\n   * These are the API's invoked when the TTI is measured\n   */\n  involvedApiEndpoints?: string[];\n}\n\n/**\n * Clear the current store object and replace it with the new one\n */\nexport const setEventTrack = createAction(ACTION_SET, props<{ model: EventTrackState }>());\n\n/**\n * Change a part or the whole object in the store.\n */\nexport const updateEventTrack = createAction(ACTION_UPDATE, props<Partial<{ model: EventTrackState }>>());\n\n/**\n * Clear the whole state, return to the initial one\n */\nexport const resetEventTrack = createAction(ACTION_RESET);\n\n/**\n * Register hero component in the store\n */\nexport const registerHeroComponent = createAction(ACTION_REGISTER_HERO_COMPONENT, props<{ model: RegisterHeroComponentPayload }>());\n\n/**\n * Set the TTI measure for a hero component in the store\n */\nexport const setHeroComponentTTI = createAction(ACTION_SET_HERO_COMPONENT_TTI, props<{ model: SetHeroComponentTTIPayload }>());\n","import {\n  ActionCreator,\n  createReducer,\n  on,\n  ReducerTypes,\n} from '@ngrx/store';\nimport * as actions from './event-track.actions';\nimport {\n  EventTrackState,\n  HeroComponent,\n} from './event-track.state';\n\n/** The initial value of the Hero component */\nexport const heroComponentInitialState: HeroComponent = { id: '', TTI: 0, involvedApiEndpoints: [] };\n\n/**\n * eventTrack initial state\n */\nexport const eventTrackInitialState: EventTrackState = {\n  heroComponent: heroComponentInitialState,\n  isTTIComputed: false\n};\n\n/**\n * Return all the involved API endpoints present in the component including its child & subchild\n * Iterate recursively till the component with no children\n * @param component\n * @returns string[]\n */\nfunction getComponentInvolvedEndPoints(component: HeroComponent): string[] {\n  return Array.from(\n    (component.children || []).reduce((accum, value) => {\n      getComponentInvolvedEndPoints(value).forEach((item) => accum.add(item));\n      return accum;\n    }, new Set<string>(component.involvedApiEndpoints))\n  );\n}\n\n/**\n * Get all the involved API endpoints of the heroComponent with maximum TTI value\n * If the parent contains max TTI, then all its child & subchild end points are used\n * otherwise only component with max TTI end points are used\n * @param component\n * @param maxTTI\n * @returns string[]\n */\nfunction getInvolvedAPIEndpoints(component: HeroComponent, maxTTI: number): string[] {\n  if (component.componentTTI === maxTTI) {\n    return getComponentInvolvedEndPoints(component);\n  }\n  return Array.from(\n    (component.children || []).reduce((accum, value) => {\n      getInvolvedAPIEndpoints(value, maxTTI).forEach((endpoint) => accum.add(endpoint));\n      return accum;\n    }, new Set<string>())\n  );\n}\n\n/**\n * Recursively iterate the page hierarchy\n * and set the TTI for the specified component\n * and compute the TTI for the corresponding parent\n * @param component the parent component/page\n * @param id the identifier of the component/page\n * @param value the TTI value\n * @param endpoints API URLs of the component\n * @returns HeroComponent\n */\nfunction computeTTI(component: HeroComponent, id: string, value: number, endpoints: string[] = []): HeroComponent {\n  const computedComponent = { ...component };\n  if (computedComponent.id === id) {\n    computedComponent.TTI = value;\n    computedComponent.hasBeenLogged = true;\n    computedComponent.involvedApiEndpoints = endpoints;\n    computedComponent.componentTTI = value;\n  } else if (computedComponent.children) {\n    computedComponent.children = computedComponent.children.map((child) => computeTTI(child, id, value, endpoints));\n  }\n  // Compute the TTI of the current component comparing the child TTI measures\n  if (computedComponent.children && computedComponent.children.length > 0) {\n    const maxChildTTI = Math.max(...computedComponent.children.map((child: HeroComponent) => child.TTI));\n    computedComponent.TTI = Math.max(maxChildTTI, computedComponent.TTI);\n  }\n  return computedComponent;\n}\n\n/**\n * Check if the TTI for the page is computed\n * @param component the parent component/page\n * @returns boolean\n */\nfunction isTTIComputed(component: HeroComponent): boolean {\n  if (component.measureSelf && !component.hasBeenLogged) {\n    return false;\n  }\n  return component.children && component.children.length > 0 ? component.children.every((child) => isTTIComputed(child)) : component.TTI > 0;\n}\n\n/**\n * List of basic actions for EventTrack\n */\nexport const eventTrackReducerFeatures: ReducerTypes<EventTrackState, ActionCreator[]>[] = [\n  on(actions.setEventTrack, (_state, payload) => ({ ...payload.model })),\n\n  on(actions.updateEventTrack, (state, payload) => ({ ...state, ...payload.model })),\n\n  on(actions.resetEventTrack, () => eventTrackInitialState),\n\n  on(actions.registerHeroComponent, (state, payload) => ({ ...state, heroComponent: { ...payload.model, TTI: 0 } })),\n\n  on(actions.setHeroComponentTTI, (state, payload) => {\n    const updatedHeroComponent = computeTTI(state.heroComponent, payload.model.id, payload.model.TTI, payload.model.involvedApiEndpoints);\n    const isComputed = isTTIComputed(updatedHeroComponent);\n    if (isComputed) {\n      updatedHeroComponent.involvedApiEndpoints = getInvolvedAPIEndpoints(updatedHeroComponent, updatedHeroComponent.TTI) || [];\n    }\n    return { ...state, heroComponent: updatedHeroComponent, isTTIComputed: isComputed };\n  })\n];\n\n/**\n * EventTrack Store default reducer\n */\nexport const eventTrackReducer = createReducer(\n  eventTrackInitialState,\n  ...eventTrackReducerFeatures\n);\n","/**\n * The interface for Hero component, which determines the Time To Interactive (TTI) for a page\n * It follows a Tree data structure, with the root node as the Page and the hero components as\n * its children. Each child can have its own hero components. The TTI for the page\n * would be computed using a bottom-up approach starting from the children at the bottom (leaf nodes).\n */\nexport interface HeroComponent extends RegisterHeroComponentPayload {\n  /** The Time To Interactive(TTI) measure for the component */\n  // eslint-disable-next-line @typescript-eslint/naming-convention -- naming convention imposed by Lighthouse\n  TTI: number;\n\n  /**\n   * Boolean to indicate if the TTI for the component\n   * has been explicitly measured and logged\n   */\n  hasBeenLogged?: boolean;\n\n  /**\n   * List of API endpoints used in the Hero component and it's subcomponents\n   * These are the API's invoked when the TTI is measured\n   */\n  involvedApiEndpoints?: string[];\n\n  /**\n   * Actual TTI measure of the component,\n   * doesn't change upon it's children Max TTI value\n   */\n  componentTTI?: number;\n}\n\n/** The interface for the register hero component payload, which is used to register a hero component and its children */\nexport interface RegisterHeroComponentPayload {\n  /** The identifier of the hero component */\n  id: string;\n  /**\n   * Boolean to indicate if the TTI computation should take into account\n   * the TTI of the component itself in addition to that of its child components\n   */\n  measureSelf?: boolean;\n  /** The identifiers of the children hero components */\n  children?: HeroComponent[];\n}\n\n/**\n * EventTrack store state\n */\nexport interface EventTrackState {\n  /** The hero component for computing TTI */\n  heroComponent: HeroComponent;\n\n  /**\n   * Boolean to indicate the completion of TTI computation\n   * TTI for a hero component is considered to be computed\n   * only when the TTI of all its children have been computed\n   * eg: for a component A having B and C as children, this value\n   * is set only when TTI for all A, B and C have been set\n   */\n  isTTIComputed: boolean;\n}\n\n/**\n * Name of the EventTrack Store\n */\nexport const EVENT_TRACK_STORE_NAME = 'eventTrack';\n\n/**\n * EventTrack Store Interface\n */\nexport interface EventTrackStore {\n  /** EventTrack state */\n  [EVENT_TRACK_STORE_NAME]: EventTrackState;\n}\n","import {\n  InjectionToken,\n  ModuleWithProviders,\n  NgModule,\n} from '@angular/core';\nimport {\n  Action,\n  ActionReducer,\n  StoreModule,\n} from '@ngrx/store';\nimport {\n  eventTrackReducer,\n} from './event-track.reducer';\nimport {\n  EVENT_TRACK_STORE_NAME,\n  EventTrackState,\n} from './event-track.state';\n\n/** Token of the EventTrack reducer */\nexport const EVENT_TRACK_REDUCER_TOKEN = new InjectionToken<ActionReducer<EventTrackState, Action>>('Feature EventTrack Reducer');\n\n/** Provide default reducer for EventTrack store */\nexport function getDefaultEventTrackReducer() {\n  return eventTrackReducer;\n}\n\n@NgModule({\n  imports: [\n    StoreModule.forFeature(EVENT_TRACK_STORE_NAME, EVENT_TRACK_REDUCER_TOKEN)\n  ],\n  providers: [\n    { provide: EVENT_TRACK_REDUCER_TOKEN, useFactory: getDefaultEventTrackReducer }\n  ]\n})\nexport class EventTrackStoreModule {\n  public static forRoot<T extends EventTrackState>(reducerFactory: () => ActionReducer<T, Action>): ModuleWithProviders<EventTrackStoreModule> {\n    return {\n      ngModule: EventTrackStoreModule,\n      providers: [\n        { provide: EVENT_TRACK_REDUCER_TOKEN, useFactory: reducerFactory }\n      ]\n    };\n  }\n}\n","import {\n  createFeatureSelector,\n  createSelector,\n} from '@ngrx/store';\nimport {\n  EVENT_TRACK_STORE_NAME,\n  EventTrackState,\n} from './event-track.state';\n\n/** Select EventTrack State */\nexport const selectEventTrackState = createFeatureSelector<EventTrackState>(EVENT_TRACK_STORE_NAME);\n\n/** Select hero component status */\nexport const selectHeroComponentStatus = createSelector(selectEventTrackState, (state): number | undefined => (state.isTTIComputed ? state.heroComponent.TTI : undefined));\n","import type {\n  Serializer,\n} from '@o3r/core';\nimport {\n  eventTrackInitialState,\n} from './event-track.reducer';\nimport {\n  EventTrackState,\n} from './event-track.state';\n\nexport const eventTrackStorageSync: Readonly<Serializer<EventTrackState>> = {\n  deserialize: (rawObject: any) => {\n    return rawObject ? rawObject as EventTrackState : eventTrackInitialState;\n  }\n} as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["actions.setEventTrack","actions.updateEventTrack","actions.resetEventTrack","actions.registerHeroComponent","actions.setHeroComponentTTI"],"mappings":"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"}