@amadeus-it-group/ngrx-devtool 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -0
- package/index.js +52 -0
- package/ngrx-devtool/fesm2022/amadeus-it-group-ngrx-devtool.mjs +1354 -0
- package/ngrx-devtool/fesm2022/amadeus-it-group-ngrx-devtool.mjs.map +1 -0
- package/ngrx-devtool/types/amadeus-it-group-ngrx-devtool.d.ts +468 -0
- package/ngrx-devtool-ui/3rdpartylicenses.txt +556 -0
- package/ngrx-devtool-ui/browser/amadeus.png +0 -0
- package/ngrx-devtool-ui/browser/index.html +17 -0
- package/ngrx-devtool-ui/browser/main-EDJFMLO7.js +249 -0
- package/ngrx-devtool-ui/browser/polyfills-DOYHMSTV.js +2 -0
- package/ngrx-devtool-ui/browser/styles-MZWFNK5Y.css +1 -0
- package/ngrx-devtool-ui/prerendered-routes.json +3 -0
- package/package.json +19 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amadeus-it-group-ngrx-devtool.mjs","sources":["../../../projects/ngrx-devtool/src/lib/core/effect-tracker.service.ts","../../../projects/ngrx-devtool/src/lib/core/websocket.service.ts","../../../projects/ngrx-devtool/src/lib/core/actions-interceptor.service.ts","../../../projects/ngrx-devtool/src/lib/core/devtools-effect-sources.ts","../../../projects/ngrx-devtool/src/lib/core/index.ts","../../../projects/ngrx-devtool/src/lib/performance/performance-tracker.service.ts","../../../projects/ngrx-devtool/src/types/state.model.ts","../../../projects/ngrx-devtool/src/lib/performance/performance-analyzer.service.ts","../../../projects/ngrx-devtool/src/lib/performance/render-impact-estimator.ts","../../../projects/ngrx-devtool/src/lib/selectors/selector-tracker.service.ts","../../../projects/ngrx-devtool/src/lib/selectors/track-selector.ts","../../../projects/ngrx-devtool/src/lib/store/meta-reducer.ts","../../../projects/ngrx-devtool/src/lib/store/provide-devtool.ts","../../../projects/ngrx-devtool/src/public-api.ts","../../../projects/ngrx-devtool/src/amadeus-it-group-ngrx-devtool.ts"],"sourcesContent":["import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { Action } from '@ngrx/store';\nimport { EffectSources } from '@ngrx/effects';\nimport { ReplaySubject, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { EffectEvent, TrackedAction, TrackedEffect } from './core.models';\nimport { DevToolsEffectSources } from './devtools-effect-sources';\n\nconst REPLAY_BUFFER_SIZE = 100;\nconst TIMELINE_MAX_SIZE = 1000;\nconst TIMELINE_TRIM_SIZE = 500;\nconst EFFECT_TIMELINE_MAX_SIZE = 500;\nconst CORRELATION_TIMEOUT_MS = 30000;\n@Injectable({ providedIn: 'root' })\nexport class EffectTrackerService implements OnDestroy {\n private readonly effectSources = inject(EffectSources, { optional: true });\n private readonly destroy$ = new Subject<void>();\n\n private actionTimeline: TrackedAction[] = [];\n private effectTimeline: TrackedEffect[] = [];\n private readonly effectActionPatterns = new Set<string>();\n private readonly pendingCorrelations = new Map<string, { action: Action; timestamp: number }>();\n private correlationCounter = 0;\n private lastTriggerAction: Action | null = null;\n\n readonly effectEvents$ = new ReplaySubject<EffectEvent>(REPLAY_BUFFER_SIZE);\n\n constructor() {\n this.subscribeToEffectEvents();\n }\n\n private subscribeToEffectEvents(): void {\n const devToolsSources = this.effectSources as DevToolsEffectSources | null;\n\n if (devToolsSources?.effectEvents$) {\n\n devToolsSources.effectEvents$.pipe(\n takeUntil(this.destroy$)\n ).subscribe((event: EffectEvent) => {\n this.handleEffectEvent(event);\n this.effectEvents$.next(event);\n });\n }\n }\n\n private handleEffectEvent(event: EffectEvent): void {\n switch (event.lifecycle) {\n case 'emitted':\n if (event.action) {\n const trackedEffect: TrackedEffect = {\n effectName: event.effectName,\n sourceName: event.sourceName,\n propertyName: event.propertyName,\n triggerAction: this.lastTriggerAction?.type,\n resultAction: event.action.type,\n startTime: event.timestamp - (event.duration ?? 0),\n endTime: event.timestamp,\n duration: event.duration,\n status: 'completed',\n };\n this.effectTimeline.push(trackedEffect);\n this.effectActionPatterns.add(event.action.type);\n }\n break;\n\n case 'error': {\n const erroredEffect: TrackedEffect = {\n effectName: event.effectName,\n sourceName: event.sourceName,\n propertyName: event.propertyName,\n triggerAction: this.lastTriggerAction?.type,\n startTime: event.timestamp - (event.duration ?? 0),\n endTime: event.timestamp,\n duration: event.duration,\n status: 'error',\n error: event.error,\n };\n this.effectTimeline.push(erroredEffect);\n break;\n }\n }\n\n if (this.effectTimeline.length > EFFECT_TIMELINE_MAX_SIZE) {\n this.effectTimeline = this.effectTimeline.slice(-EFFECT_TIMELINE_MAX_SIZE / 2);\n }\n }\n\n isEffectAction(actionType: string): boolean {\n return this.effectActionPatterns.has(actionType);\n }\n\n trackAction(action: Action): TrackedAction {\n const isEffect = this.isEffectAction(action.type);\n\n if (!isEffect) {\n this.lastTriggerAction = action;\n }\n\n const correlationId = isEffect\n ? this.findCorrelation()\n : this.createCorrelation(action);\n\n const effectName = this.findEffectNameForAction(action.type);\n\n const tracked: TrackedAction = {\n action: action.type,\n payload: action,\n timestamp: Date.now(),\n source: isEffect ? 'effect' : 'user',\n correlationId,\n effectName,\n };\n\n this.actionTimeline.push(tracked);\n\n if (this.actionTimeline.length > TIMELINE_MAX_SIZE) {\n this.actionTimeline = this.actionTimeline.slice(-TIMELINE_TRIM_SIZE);\n }\n\n return tracked;\n }\n\n getTimeline(): readonly TrackedAction[] {\n return [...this.actionTimeline];\n }\n\n clearTimeline(): void {\n this.actionTimeline = [];\n this.pendingCorrelations.clear();\n }\n\n private createCorrelation(action: Action): string {\n const correlationId = `corr_${++this.correlationCounter}_${Date.now()}`;\n this.pendingCorrelations.set(correlationId, {\n action,\n timestamp: Date.now(),\n });\n\n setTimeout(() => {\n this.pendingCorrelations.delete(correlationId);\n }, CORRELATION_TIMEOUT_MS);\n\n return correlationId;\n }\n\n private findCorrelation(): string | undefined {\n const entries = Array.from(this.pendingCorrelations.entries());\n return entries.length > 0 ? entries[entries.length - 1][0] : undefined;\n }\n\n private findEffectNameForAction(actionType: string): string | undefined {\n for (let i = this.effectTimeline.length - 1; i >= Math.max(0, this.effectTimeline.length - 10); i--) {\n const effect = this.effectTimeline[i];\n if (effect.resultAction === actionType) {\n return effect.effectName;\n }\n }\n\n return undefined;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.effectEvents$.complete();\n }\n}\n","import { inject, Injectable, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport interface WebSocketMessage {\n readonly type: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class WebSocketService implements OnDestroy {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private socket: WebSocket | null = null;\n private messageBuffer: string[] = [];\n private wsUrl: string | null = null;\n private initialized = false;\n\n private readonly connectionState$ = new BehaviorSubject<boolean>(false);\n private readonly incomingMessages$ = new BehaviorSubject<WebSocketMessage | null>(null);\n\n get isConnected(): boolean {\n return this.connectionState$.getValue();\n }\n\n get connected$(): Observable<boolean> {\n return this.connectionState$.asObservable();\n }\n\n get messages$(): Observable<WebSocketMessage | null> {\n return this.incomingMessages$.asObservable();\n }\n\n initialize(wsUrl = 'ws://localhost:4000'): void {\n if (this.initialized) {\n // If already initialized with same URL, skip\n if (this.wsUrl === wsUrl) {\n return;\n }\n // If different URL, close existing and reinitialize\n this.close();\n }\n\n this.initialized = true;\n this.wsUrl = wsUrl;\n this.setupWebSocket(wsUrl);\n }\n\n send<T extends WebSocketMessage>(message: T): void {\n const payload = JSON.stringify(message);\n\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(payload);\n } else if (this.isBrowser) {\n this.messageBuffer.push(payload);\n }\n }\n\n sendRaw(payload: string): void {\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(payload);\n } else if (this.isBrowser) {\n this.messageBuffer.push(payload);\n }\n }\n\n ngOnDestroy(): void {\n this.close();\n this.connectionState$.complete();\n this.incomingMessages$.complete();\n }\n\n private close(): void {\n this.socket?.close();\n this.socket = null;\n this.connectionState$.next(false);\n this.initialized = false;\n this.wsUrl = null;\n }\n\n private setupWebSocket(wsUrl: string): void {\n if (!this.isBrowser) {\n return;\n }\n\n this.socket = new WebSocket(wsUrl);\n\n this.socket.onopen = () => {\n this.connectionState$.next(true);\n this.flushBuffer();\n };\n\n this.socket.onclose = () => {\n this.connectionState$.next(false);\n };\n\n this.socket.onerror = (error) => {\n console.warn('[NgRx DevTool] WebSocket error:', error);\n };\n\n this.socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as WebSocketMessage;\n this.incomingMessages$.next(message);\n } catch {\n // Ignore non-JSON messages\n }\n };\n }\n\n private flushBuffer(): void {\n while (this.messageBuffer.length > 0 && this.isConnected) {\n const message = this.messageBuffer.shift();\n if (message && this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(message);\n }\n }\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { Actions } from '@ngrx/effects';\nimport { Action } from '@ngrx/store';\nimport { filter, Subject, takeUntil, tap } from 'rxjs';\n\nimport { DevToolMessage, EffectEvent, TrackedAction } from './core.models';\nimport { EffectTrackerService } from './effect-tracker.service';\nimport { WebSocketService, WebSocketMessage } from './websocket.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ActionsInterceptorService implements OnDestroy {\n private readonly actions$ = inject(Actions);\n private readonly effectTracker = inject(EffectTrackerService);\n private readonly webSocketService = inject(WebSocketService);\n\n private readonly destroy$ = new Subject<void>();\n private initialized = false;\n\n initialize(wsUrl = 'ws://localhost:4000'): void {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n this.webSocketService.initialize(wsUrl);\n this.setupMessageListener();\n this.setupActionInterception();\n this.setupEffectEventForwarding();\n }\n\n getTimeline(): readonly TrackedAction[] {\n return this.effectTracker.getTimeline();\n }\n\n clearTimeline(): void {\n this.effectTracker.clearTimeline();\n this.sendMessage({\n type: 'TIMELINE_CLEARED',\n timestamp: new Date().toISOString(),\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private setupMessageListener(): void {\n this.webSocketService.messages$.pipe(\n takeUntil(this.destroy$),\n filter((message): message is WebSocketMessage => message !== null),\n tap((message) => {\n if (message['type'] === 'CLEAR_REQUEST') {\n this.effectTracker.clearTimeline();\n }\n })\n ).subscribe();\n }\n\n private setupActionInterception(): void {\n this.actions$.pipe(\n takeUntil(this.destroy$),\n tap((action: Action) => {\n const tracked = this.effectTracker.trackAction(action);\n\n const message: DevToolMessage = {\n type: 'ACTION_TRACKED',\n action: action.type,\n payload: this.sanitizePayload(action),\n isEffectResult: tracked.source === 'effect',\n effectName: tracked.effectName,\n correlationId: tracked.correlationId,\n timestamp: new Date().toISOString(),\n };\n\n this.sendMessage(message);\n })\n ).subscribe();\n }\n\n private setupEffectEventForwarding(): void {\n this.effectTracker.effectEvents$.pipe(\n takeUntil(this.destroy$),\n tap((event: EffectEvent) => {\n const message: DevToolMessage = {\n type: 'EFFECT_EVENT',\n action: event.action?.type,\n effectName: event.effectName,\n effectEvent: {\n name: event.effectName,\n lifecycle: event.lifecycle,\n duration: event.duration,\n executionId: event.executionId,\n dispatch: event.dispatch,\n },\n timestamp: new Date().toISOString(),\n };\n\n this.sendMessage(message);\n })\n ).subscribe({\n error: (err) => console.error('[NgRx DevTool] Effect event forwarding error:', err)\n });\n }\n\n private sendMessage(message: DevToolMessage): void {\n this.webSocketService.send(message);\n }\n\n private sanitizePayload(action: Action): unknown {\n try {\n JSON.stringify(action);\n return action;\n } catch {\n return { type: action.type, _note: 'Non-serializable payload' };\n }\n }\n}\n","import { ErrorHandler, inject, Injectable, OnDestroy } from '@angular/core';\nimport { Action } from '@ngrx/store';\nimport { EffectSources, EFFECTS_ERROR_HANDLER } from '@ngrx/effects';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { EffectEvent, EffectMetadataInfo } from './core.models';\n\n\n/** NgRx internal metadata key for createEffect() */\nconst CREATE_EFFECT_METADATA_KEY = '__@ngrx/effects_create__';\n\nconst REPLAY_BUFFER_SIZE = 100;\n\n\ninterface EffectConfig {\n readonly dispatch?: boolean;\n readonly functional?: boolean;\n readonly useEffectsErrorHandler?: boolean;\n}\n\ninterface EffectSourceInstance {\n ngrxOnIdentifyEffects?(): string;\n constructor: { name?: string };\n [key: string]: unknown;\n}\n\ntype EffectObservable = Observable<Action> & {\n [CREATE_EFFECT_METADATA_KEY]?: EffectConfig;\n};\n\n@Injectable()\nexport class DevToolsEffectSources extends EffectSources implements OnDestroy {\n readonly effectEvents$ = new ReplaySubject<EffectEvent>(REPLAY_BUFFER_SIZE);\n\n private readonly registeredEffects = new Map<string, readonly EffectMetadataInfo[]>();\n private executionCounter = 0;\n\n constructor() {\n super(inject(ErrorHandler), inject(EFFECTS_ERROR_HANDLER));\n }\n\n override addEffects(effectSourceInstance: EffectSourceInstance): void {\n const sourceName = this.resolveSourceName(effectSourceInstance);\n\n if (sourceName) {\n const metadata = this.extractEffectMetadata(effectSourceInstance);\n\n if (metadata.length > 0) {\n this.registeredEffects.set(sourceName, metadata);\n this.instrumentEffects(effectSourceInstance, sourceName, metadata);\n }\n }\n\n super.addEffects(effectSourceInstance);\n }\n\n getRegisteredEffects(): ReadonlyMap<string, readonly EffectMetadataInfo[]> {\n return this.registeredEffects;\n }\n\n ngOnDestroy(): void {\n this.effectEvents$.complete();\n }\n\n private instrumentEffects(\n instance: EffectSourceInstance,\n sourceName: string,\n metadata: readonly EffectMetadataInfo[]\n ): void {\n for (const { propertyName, dispatch } of metadata) {\n const original = instance[propertyName];\n if (!original) continue;\n\n const effectName = `${sourceName}.${propertyName}`;\n\n if (typeof original === 'function') {\n const factory = original as () => EffectObservable;\n const wrapped = () => this.wrapEffectObservable(factory(), effectName, dispatch);\n this.copyEffectMetadata(factory, wrapped);\n instance[propertyName] = wrapped;\n } else if (this.isObservable(original)) {\n const wrapped = this.wrapEffectObservable(original, effectName, dispatch);\n this.copyEffectMetadata(original as EffectObservable, wrapped);\n instance[propertyName] = wrapped;\n }\n }\n }\n\n private wrapEffectObservable(\n source$: Observable<Action>,\n effectName: string,\n dispatch: boolean\n ): Observable<Action> {\n const [sourceName, propertyName] = this.parseEffectName(effectName);\n\n return new Observable(subscriber => {\n let lastEmitTime = Date.now();\n\n const subscription = source$.pipe(\n tap({\n next: (value: Action) => {\n const now = Date.now();\n this.emitEvent({\n effectName,\n sourceName,\n propertyName,\n lifecycle: dispatch ? 'emitted' : 'executed',\n action: dispatch ? value : undefined,\n timestamp: now,\n duration: now - lastEmitTime,\n executionId: this.generateExecutionId(effectName),\n dispatch,\n });\n lastEmitTime = now;\n },\n error: (err: unknown) => {\n const now = Date.now();\n this.emitEvent({\n effectName,\n sourceName,\n propertyName,\n lifecycle: 'error',\n error: err,\n timestamp: now,\n duration: now - lastEmitTime,\n executionId: this.generateExecutionId(effectName),\n });\n },\n })\n ).subscribe(subscriber);\n\n return () => subscription.unsubscribe();\n });\n }\n\n private copyEffectMetadata(\n original: EffectObservable | (() => EffectObservable),\n wrapped: EffectObservable | (() => EffectObservable)\n ): void {\n const originalRecord = original as unknown as Record<string, unknown>;\n const metadata = originalRecord[CREATE_EFFECT_METADATA_KEY];\n if (metadata) {\n Object.defineProperty(wrapped, CREATE_EFFECT_METADATA_KEY, {\n value: metadata,\n configurable: true,\n });\n }\n }\n\n private extractEffectMetadata(instance: EffectSourceInstance): EffectMetadataInfo[] {\n const metadata: EffectMetadataInfo[] = [];\n\n for (const propertyName of Object.getOwnPropertyNames(instance)) {\n try {\n const property = instance[propertyName] as EffectObservable | undefined;\n const config = property?.[CREATE_EFFECT_METADATA_KEY];\n\n if (config) {\n metadata.push({\n propertyName,\n dispatch: config.dispatch !== false,\n functional: config.functional === true,\n useEffectsErrorHandler: config.useEffectsErrorHandler !== false,\n });\n }\n } catch {\n // Ignore reflection errors for non-effect properties\n }\n }\n\n return metadata;\n }\n\n private resolveSourceName(instance: EffectSourceInstance): string | null {\n if (!instance) return null;\n\n if (typeof instance.ngrxOnIdentifyEffects === 'function') {\n const id = instance.ngrxOnIdentifyEffects();\n if (id) return id;\n }\n\n const constructorName = instance.constructor?.name;\n if (this.isValidClassName(constructorName)) {\n return constructorName;\n }\n\n const proto = Object.getPrototypeOf(instance) as EffectSourceInstance | null;\n const protoName = proto?.constructor?.name;\n if (this.isValidClassName(protoName)) {\n return protoName;\n }\n\n const effectProps = Object.getOwnPropertyNames(instance)\n .filter(p => p.endsWith('$') || p.startsWith('load') || p.startsWith('fetch'));\n\n if (effectProps.length > 0) {\n return `Effects(${effectProps.slice(0, 2).join(', ')}...)`;\n }\n\n return constructorName ?? 'UnknownEffect';\n }\n\n private isValidClassName(name: string | undefined): name is string {\n return Boolean(name && name.length > 1 && name !== 'Object' && name !== 'Function');\n }\n\n private isObservable(value: unknown): value is Observable<Action> {\n return Boolean(value && typeof (value as Observable<Action>).subscribe === 'function');\n }\n\n private parseEffectName(effectName: string): [string, string] {\n const [sourceName, propertyName = 'unknown'] = effectName.split('.');\n return [sourceName, propertyName];\n }\n\n private generateExecutionId(effectName: string): string {\n return `${effectName}_${++this.executionCounter}`;\n }\n\n private emitEvent(event: EffectEvent): void {\n this.effectEvents$.next(event);\n }\n}\n","// Models\nexport * from './core.models';\n\n// Services\nexport * from './actions-interceptor.service';\nexport * from './effect-tracker.service';\nexport * from './devtools-effect-sources';\nexport * from './websocket.service';\n","import { Injectable, inject, PLATFORM_ID, Injector, afterNextRender } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { PerformanceWarning, PerformanceThresholds, ActionTypeStats, PerformanceWarningType } from '../../types/state.model';\n\nexport interface RenderPerformanceEntry {\n readonly actionType: string;\n readonly timestamp: number;\n readonly renderTime: number;\n}\n\nexport interface RenderPerformanceStats {\n readonly avgRenderTime: number;\n readonly maxRenderTime: number;\n readonly slowestAction: string | null;\n readonly totalActions: number;\n}\n\nexport interface AggregatedPerformanceStats {\n readonly totalActions: number;\n readonly avgReducerTime: number;\n readonly maxReducerTime: number;\n readonly slowestAction: string | null;\n readonly currentStateSize: number;\n readonly actionsPerSecond: number;\n readonly performanceScore: number;\n readonly actionTypeStats: Map<string, ActionTypeStats>;\n}\n\nexport interface WarningsSummary {\n readonly type: PerformanceWarningType;\n readonly count: number;\n readonly severity: 'low' | 'medium' | 'high';\n}\n\nconst ENTRIES_MAX_SIZE = 1000;\nconst ENTRIES_TRIM_SIZE = 500;\n\nconst DEFAULT_THRESHOLDS: PerformanceThresholds = {\n maxReducerTime: 16,\n maxStateSize: 5 * 1024 * 1024,\n maxStateChangeSize: 1024 * 1024,\n maxActionsPerSecond: 60,\n maxPayloadSize: 100 * 1024,\n};\n\n@Injectable({ providedIn: 'root' })\nexport class PerformanceTrackerService {\n private entries: RenderPerformanceEntry[] = [];\n private warnings: PerformanceWarning[] = [];\n private readonly platformId = inject(PLATFORM_ID);\n private readonly injector = inject(Injector);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private thresholds = DEFAULT_THRESHOLDS;\n private firstActionTime: number | null = null;\n\n measureRenderTime<State>(\n actionType: string,\n reducer: () => State,\n callback: (renderTime: number) => void\n ): State {\n const startTime = performance.now();\n const nextState = reducer();\n\n if (!this.isBrowser) {\n callback(0);\n return nextState;\n }\n\n afterNextRender(() => {\n const renderTime = parseFloat((performance.now() - startTime).toFixed(2));\n\n const entry: RenderPerformanceEntry = {\n actionType,\n timestamp: Date.now(),\n renderTime,\n };\n\n this.entries.push(entry);\n\n if (this.firstActionTime === null) {\n this.firstActionTime = entry.timestamp;\n }\n\n if (this.entries.length > ENTRIES_MAX_SIZE) {\n this.entries = this.entries.slice(-ENTRIES_TRIM_SIZE);\n }\n\n callback(renderTime);\n }, { injector: this.injector });\n\n return nextState;\n }\n\n getEntries(): readonly RenderPerformanceEntry[] {\n return [...this.entries];\n }\n\n getStats(): RenderPerformanceStats {\n if (this.entries.length === 0) {\n return {\n avgRenderTime: 0,\n maxRenderTime: 0,\n slowestAction: null,\n totalActions: 0,\n };\n }\n\n const renderTimes = this.entries.map(e => e.renderTime);\n const avgRenderTime = renderTimes.reduce((a, b) => a + b, 0) / renderTimes.length;\n const maxRenderTime = Math.max(...renderTimes);\n\n const slowestEntry = this.entries.reduce((prev, curr) =>\n curr.renderTime > prev.renderTime ? curr : prev\n );\n\n return {\n avgRenderTime,\n maxRenderTime,\n slowestAction: slowestEntry.actionType,\n totalActions: this.entries.length,\n };\n }\n\n getAggregatedStats(): AggregatedPerformanceStats {\n const stats = this.getStats();\n const actionTypeStats = this.getActionTypeStats();\n const elapsedTime = this.firstActionTime\n ? (Date.now() - this.firstActionTime) / 1000\n : 1;\n\n return {\n totalActions: stats.totalActions,\n avgReducerTime: stats.avgRenderTime,\n maxReducerTime: stats.maxRenderTime,\n slowestAction: stats.slowestAction,\n currentStateSize: 0,\n actionsPerSecond: stats.totalActions / Math.max(elapsedTime, 1),\n performanceScore: this.calculatePerformanceScore(stats),\n actionTypeStats,\n };\n }\n\n getThresholds(): PerformanceThresholds {\n return this.thresholds;\n }\n\n setThresholds(thresholds: Partial<PerformanceThresholds>): void {\n this.thresholds = { ...this.thresholds, ...thresholds };\n }\n\n getWarningsSummary(): WarningsSummary[] {\n const summaryMap = new Map<PerformanceWarningType, WarningsSummary>();\n\n for (const warning of this.warnings) {\n const existing = summaryMap.get(warning.type);\n if (existing) {\n summaryMap.set(warning.type, {\n ...existing,\n count: existing.count + 1,\n severity: this.maxSeverity(existing.severity, warning.severity),\n });\n } else {\n summaryMap.set(warning.type, {\n type: warning.type,\n count: 1,\n severity: warning.severity,\n });\n }\n }\n\n return Array.from(summaryMap.values());\n }\n\n getSlowestRenders(limit = 10): readonly RenderPerformanceEntry[] {\n return [...this.entries]\n .sort((a, b) => b.renderTime - a.renderTime)\n .slice(0, limit);\n }\n\n clear(): void {\n this.entries = [];\n this.warnings = [];\n this.firstActionTime = null;\n }\n\n private getActionTypeStats(): Map<string, ActionTypeStats> {\n const statsMap = new Map<string, ActionTypeStats>();\n\n for (const entry of this.entries) {\n const existing = statsMap.get(entry.actionType);\n if (existing) {\n existing.count++;\n existing.totalTime += entry.renderTime;\n existing.avgTime = existing.totalTime / existing.count;\n existing.maxTime = Math.max(existing.maxTime, entry.renderTime);\n existing.lastExecuted = entry.timestamp;\n } else {\n statsMap.set(entry.actionType, {\n count: 1,\n totalTime: entry.renderTime,\n avgTime: entry.renderTime,\n maxTime: entry.renderTime,\n lastExecuted: entry.timestamp,\n });\n }\n }\n\n return statsMap;\n }\n\n private calculatePerformanceScore(stats: RenderPerformanceStats): number {\n let score = 100;\n\n if (stats.avgRenderTime > this.thresholds.maxReducerTime) {\n score -= Math.min(30, (stats.avgRenderTime - this.thresholds.maxReducerTime) * 2);\n }\n\n if (stats.maxRenderTime > this.thresholds.maxReducerTime * 2) {\n score -= Math.min(20, (stats.maxRenderTime - this.thresholds.maxReducerTime * 2) / 2);\n }\n\n return Math.max(0, Math.round(score));\n }\n\n private maxSeverity(\n a: 'low' | 'medium' | 'high',\n b: 'low' | 'medium' | 'high'\n ): 'low' | 'medium' | 'high' {\n const order = { low: 0, medium: 1, high: 2 };\n return order[a] >= order[b] ? a : b;\n }\n}\n","export interface ActionDispatchedPayload {\n readonly actionType: string;\n readonly previousState: Record<string, unknown>;\n readonly action: Record<string, unknown>;\n readonly nextState: Record<string, unknown>;\n}\n\nexport interface PerformanceMetrics {\n readonly reducerExecutionTime: number;\n readonly stateSize: number;\n readonly stateSizeChange: number;\n readonly memoryUsage?: MemoryInfo;\n readonly actionPayloadSize: number;\n}\n\nexport interface MemoryInfo {\n readonly usedJSHeapSize: number;\n readonly totalJSHeapSize: number;\n readonly jsHeapSizeLimit: number;\n}\n\n\nexport interface PerformanceWarning {\n readonly type: PerformanceWarningType;\n readonly message: string;\n readonly severity: 'low' | 'medium' | 'high';\n readonly suggestion?: string;\n}\n\nexport enum PerformanceWarningType {\n SLOW_REDUCER = 'SLOW_REDUCER',\n LARGE_STATE = 'LARGE_STATE',\n LARGE_STATE_CHANGE = 'LARGE_STATE_CHANGE',\n FREQUENT_ACTIONS = 'FREQUENT_ACTIONS',\n LARGE_PAYLOAD = 'LARGE_PAYLOAD',\n MEMORY_PRESSURE = 'MEMORY_PRESSURE',\n HIGH_RENDER_IMPACT = 'HIGH_RENDER_IMPACT',\n}\n\nexport interface PerformanceThresholds {\n readonly maxReducerTime: number;\n readonly maxStateSize: number;\n readonly maxStateChangeSize: number;\n readonly maxActionsPerSecond: number;\n readonly maxPayloadSize: number;\n}\n\nexport interface ActionTypeStats {\n count: number;\n totalTime: number;\n avgTime: number;\n maxTime: number;\n lastExecuted: number;\n}\n\nexport interface ActionPerformanceEntry {\n readonly actionType: string;\n readonly timestamp: number;\n readonly metrics: PerformanceMetrics;\n readonly warnings: readonly PerformanceWarning[];\n}\n\nexport interface RenderImpactData {\n readonly score: number;\n readonly level: 'low' | 'medium' | 'high' | 'critical';\n readonly estimatedComponentsAffected: number;\n readonly factors: readonly RenderImpactFactorData[];\n readonly recommendations: readonly string[];\n}\n\nexport interface RenderImpactFactorData {\n readonly name: string;\n readonly description: string;\n readonly impact: number;\n readonly details?: string;\n}\n\nexport interface SelectorMetricsData {\n readonly name: string;\n readonly invocationCount: number;\n readonly recomputationCount: number;\n readonly totalComputationTime: number;\n readonly avgComputationTime: number;\n maxComputationTime: number;\n cacheHitRate: number;\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n PerformanceTrackerService,\n AggregatedPerformanceStats,\n} from './performance-tracker.service';\nimport { PerformanceWarningType, ActionTypeStats } from '../../types/state.model';\n\nexport interface PerformanceRecommendation {\n readonly category: 'reducer' | 'state' | 'actions' | 'memory' | 'general';\n readonly title: string;\n readonly description: string;\n readonly impact: 'low' | 'medium' | 'high';\n readonly codeExample?: string;\n readonly learnMoreUrl?: string;\n}\n\nexport interface PerformanceReport {\n readonly timestamp: string;\n readonly overallScore: number;\n readonly scoreGrade: 'A' | 'B' | 'C' | 'D' | 'F';\n readonly stats: AggregatedPerformanceStats;\n readonly recommendations: readonly PerformanceRecommendation[];\n readonly hotspots: readonly HotspotInfo[];\n readonly trends: PerformanceTrends;\n}\n\nexport interface HotspotInfo {\n readonly actionType: string;\n readonly issue: string;\n readonly avgTime: number;\n readonly callCount: number;\n readonly totalTime: number;\n readonly percentOfTotal: number;\n}\n\nexport interface PerformanceTrends {\n readonly reducerTimesTrend: 'improving' | 'stable' | 'degrading';\n readonly stateSizeTrend: 'stable' | 'growing' | 'shrinking';\n readonly actionFrequencyTrend: 'stable' | 'increasing' | 'decreasing';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class PerformanceAnalyzerService {\n private previousStats: AggregatedPerformanceStats | null = null;\n private readonly performanceTracker = inject(PerformanceTrackerService);\n\n generateReport(): PerformanceReport {\n const stats = this.performanceTracker.getAggregatedStats();\n const recommendations = this.generateRecommendations(stats);\n const hotspots = this.identifyHotspots(stats);\n const trends = this.analyzeTrends(stats);\n\n const report: PerformanceReport = {\n timestamp: new Date().toISOString(),\n overallScore: stats.performanceScore,\n scoreGrade: this.getScoreGrade(stats.performanceScore),\n stats,\n recommendations,\n hotspots,\n trends,\n };\n\n this.previousStats = stats;\n\n return report;\n }\n\n getQuickSummary(): {\n score: number;\n grade: string;\n mainIssue: string | null;\n actionCount: number;\n avgReducerTime: number;\n } {\n const stats = this.performanceTracker.getAggregatedStats();\n const warnings = this.performanceTracker.getWarningsSummary();\n\n let mainIssue: string | null = null;\n const highSeverityWarning = warnings.find(w => w.severity === 'high');\n if (highSeverityWarning) {\n mainIssue = this.getWarningDescription(highSeverityWarning.type);\n }\n\n return {\n score: stats.performanceScore,\n grade: this.getScoreGrade(stats.performanceScore),\n mainIssue,\n actionCount: stats.totalActions,\n avgReducerTime: stats.avgReducerTime,\n };\n }\n\n analyzeActionType(actionType: string): {\n stats: ActionTypeStats | undefined;\n isProblematic: boolean;\n issues: string[];\n suggestions: string[];\n } {\n const stats = this.performanceTracker.getAggregatedStats();\n const actionStats = stats.actionTypeStats.get(actionType);\n const thresholds = this.performanceTracker.getThresholds();\n\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n if (!actionStats) {\n return { stats: undefined, isProblematic: false, issues, suggestions };\n }\n\n if (actionStats.avgTime > thresholds.maxReducerTime) {\n issues.push(`Average execution time (${actionStats.avgTime.toFixed(2)}ms) exceeds threshold`);\n suggestions.push('Consider optimizing the reducer logic for this action');\n }\n\n const totalActions = stats.totalActions;\n const percentOfTotal = (actionStats.count / totalActions) * 100;\n if (percentOfTotal > 30 && actionStats.count > 10) {\n issues.push(`This action represents ${percentOfTotal.toFixed(1)}% of all actions`);\n suggestions.push('Consider debouncing or batching this action if dispatched frequently');\n }\n\n if (actionStats.maxTime > actionStats.avgTime * 3 && actionStats.maxTime > thresholds.maxReducerTime) {\n issues.push(`Occasional spikes in execution time (max: ${actionStats.maxTime.toFixed(2)}ms)`);\n suggestions.push('Investigate what causes performance spikes - possibly large payload or complex state updates');\n }\n\n return {\n stats: actionStats,\n isProblematic: issues.length > 0,\n issues,\n suggestions,\n };\n }\n\n private generateRecommendations(stats: AggregatedPerformanceStats): PerformanceRecommendation[] {\n const recommendations: PerformanceRecommendation[] = [];\n const thresholds = this.performanceTracker.getThresholds();\n const warnings = this.performanceTracker.getWarningsSummary();\n\n if (stats.avgReducerTime > thresholds.maxReducerTime) {\n recommendations.push({\n category: 'reducer',\n title: 'Optimize Reducer Performance',\n description: `Your reducers are taking an average of ${stats.avgReducerTime.toFixed(2)}ms to execute. For smooth 60fps animations, reducers should complete in under ${thresholds.maxReducerTime}ms.`,\n impact: stats.avgReducerTime > thresholds.maxReducerTime * 2 ? 'high' : 'medium',\n codeExample: `import { createReducer, on } from '@ngrx/store';\nimport { produce } from 'immer';\n\non(someAction, (state, { items }) => ({\n ...state,\n items\n}))`,\n learnMoreUrl: 'https://ngrx.io/guide/store/reducers#reducer-functions',\n });\n }\n\n if (stats.currentStateSize > thresholds.maxStateSize * 0.5) {\n recommendations.push({\n category: 'state',\n title: 'Consider State Normalization',\n description: `Your state size is ${this.formatBytes(stats.currentStateSize)}. Large states can slow down serialization and increase memory usage.`,\n impact: stats.currentStateSize > thresholds.maxStateSize ? 'high' : 'medium',\n codeExample: `{ users: [{ id: 1, posts: [{ id: 1, ... }] }] }\n\n{\n users: { ids: [1], entities: { 1: { id: 1 } } },\n posts: { ids: [1], entities: { 1: { id: 1, userId: 1 } } }\n}`,\n learnMoreUrl: 'https://ngrx.io/guide/entity',\n });\n }\n\n if (stats.actionsPerSecond > thresholds.maxActionsPerSecond * 0.5) {\n recommendations.push({\n category: 'actions',\n title: 'Reduce Action Dispatch Frequency',\n description: `You're dispatching ${stats.actionsPerSecond.toFixed(1)} actions per second. High frequency can cause performance issues.`,\n impact: stats.actionsPerSecond > thresholds.maxActionsPerSecond ? 'high' : 'medium',\n codeExample: `import { debounceTime } from 'rxjs/operators';\n\nsearchInput$.pipe(\n debounceTime(300)\n).subscribe(term => {\n this.store.dispatch(searchAction({ term }));\n});\n\nthis.store.dispatch(batchUpdateAction({ items: allItems }));`,\n });\n }\n\n if (stats.slowestAction && stats.maxReducerTime > thresholds.maxReducerTime * 2) {\n recommendations.push({\n category: 'reducer',\n title: `Optimize \"${stats.slowestAction}\"`,\n description: `This action has the highest execution time (${stats.maxReducerTime.toFixed(2)}ms). Focus optimization efforts here for maximum impact. Profile this specific action to identify bottlenecks.`,\n impact: 'high',\n });\n }\n\n const memoryWarnings = warnings.filter(w => w.type === PerformanceWarningType.MEMORY_PRESSURE);\n if (memoryWarnings.length > 0) {\n recommendations.push({\n category: 'memory',\n title: 'Address Memory Pressure',\n description: 'Your application is using a significant portion of available memory. This can lead to garbage collection pauses.',\n impact: 'high',\n codeExample: `ngOnDestroy() {\n this.store.dispatch(clearTemporaryData());\n}\n\nthis.store.dispatch(loadPage({ page: 1, pageSize: 50 }));`,\n });\n }\n\n if (stats.performanceScore >= 80 && recommendations.length === 0) {\n recommendations.push({\n category: 'general',\n title: 'Performance is Good! 🎉',\n description: 'Your NgRx store is performing well. Continue following best practices.',\n impact: 'low',\n });\n }\n\n return recommendations;\n }\n\n private identifyHotspots(stats: AggregatedPerformanceStats): HotspotInfo[] {\n const hotspots: HotspotInfo[] = [];\n const totalTime = Array.from(stats.actionTypeStats.values())\n .reduce((sum, s) => sum + s.totalTime, 0);\n\n stats.actionTypeStats.forEach((actionStats, actionType) => {\n const percentOfTotal = (actionStats.totalTime / totalTime) * 100;\n const thresholds = this.performanceTracker.getThresholds();\n\n let issue = '';\n if (actionStats.avgTime > thresholds.maxReducerTime) {\n issue = 'Slow reducer execution';\n } else if (percentOfTotal > 20 && actionStats.count > 5) {\n issue = 'High time consumption';\n } else if (actionStats.maxTime > actionStats.avgTime * 5) {\n issue = 'Inconsistent performance';\n }\n\n if (issue) {\n hotspots.push({\n actionType,\n issue,\n avgTime: actionStats.avgTime,\n callCount: actionStats.count,\n totalTime: actionStats.totalTime,\n percentOfTotal,\n });\n }\n });\n\n return hotspots.sort((a, b) => b.totalTime - a.totalTime).slice(0, 5);\n }\n\n private analyzeTrends(currentStats: AggregatedPerformanceStats): PerformanceTrends {\n if (!this.previousStats) {\n return {\n reducerTimesTrend: 'stable',\n stateSizeTrend: 'stable',\n actionFrequencyTrend: 'stable',\n };\n }\n\n const prev = this.previousStats;\n\n let reducerTimesTrend: 'improving' | 'stable' | 'degrading' = 'stable';\n const timeDiff = currentStats.avgReducerTime - prev.avgReducerTime;\n if (timeDiff > 2) reducerTimesTrend = 'degrading';\n else if (timeDiff < -2) reducerTimesTrend = 'improving';\n\n let stateSizeTrend: 'stable' | 'growing' | 'shrinking' = 'stable';\n const sizeDiff = currentStats.currentStateSize - prev.currentStateSize;\n const sizeChangePercent = Math.abs(sizeDiff) / (prev.currentStateSize || 1) * 100;\n if (sizeChangePercent > 10) {\n stateSizeTrend = sizeDiff > 0 ? 'growing' : 'shrinking';\n }\n\n let actionFrequencyTrend: 'stable' | 'increasing' | 'decreasing' = 'stable';\n const freqDiff = currentStats.actionsPerSecond - prev.actionsPerSecond;\n if (freqDiff > 5) actionFrequencyTrend = 'increasing';\n else if (freqDiff < -5) actionFrequencyTrend = 'decreasing';\n\n return {\n reducerTimesTrend,\n stateSizeTrend,\n actionFrequencyTrend,\n };\n }\n\n private getScoreGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (score >= 90) return 'A';\n if (score >= 80) return 'B';\n if (score >= 70) return 'C';\n if (score >= 60) return 'D';\n return 'F';\n }\n\n private getWarningDescription(type: PerformanceWarningType): string {\n const descriptions: Record<string, string> = {\n SLOW_REDUCER: 'Slow reducer execution',\n LARGE_STATE: 'Large state size',\n LARGE_STATE_CHANGE: 'Large state changes',\n FREQUENT_ACTIONS: 'High action frequency',\n LARGE_PAYLOAD: 'Large action payloads',\n MEMORY_PRESSURE: 'Memory pressure',\n };\n return descriptions[type] || type;\n }\n\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n }\n}\n","export interface RenderImpactEstimate {\n readonly score: number;\n readonly level: 'low' | 'medium' | 'high' | 'critical';\n readonly estimatedComponentsAffected: number;\n readonly factors: readonly RenderImpactFactor[];\n readonly recommendations: readonly string[];\n}\n\nexport interface RenderImpactFactor {\n readonly name: string;\n readonly description: string;\n readonly impact: number;\n readonly details?: string;\n}\n\nexport interface StateChangeAnalysis {\n rootPropertiesChanged: number;\n totalPropertiesChanged: number;\n arrayChanges: ArrayChangeInfo[];\n largeObjectChanges: LargeObjectChange[];\n maxChangeDepth: number;\n}\n\nexport interface ArrayChangeInfo {\n readonly path: string;\n readonly previousLength: number;\n readonly newLength: number;\n readonly itemsAdded: number;\n readonly itemsRemoved: number;\n}\n\nexport interface LargeObjectChange {\n readonly path: string;\n readonly size: number;\n readonly changeType: 'added' | 'modified' | 'replaced';\n}\n\nexport function estimateRenderImpact(\n prevState: unknown,\n nextState: unknown\n): RenderImpactEstimate {\n const analysis = analyzeStateChange(prevState, nextState);\n const factors: RenderImpactFactor[] = [];\n let totalScore = 0;\n\n if (analysis.rootPropertiesChanged > 0) {\n const impact = Math.min(analysis.rootPropertiesChanged * 15, 40);\n totalScore += impact;\n factors.push({\n name: 'Root State Changes',\n description: `${analysis.rootPropertiesChanged} top-level state slice(s) changed`,\n impact,\n details: 'Each root change can trigger re-renders in components selecting that slice',\n });\n }\n\n if (analysis.arrayChanges.length > 0) {\n const largestArrayChange = Math.max(...analysis.arrayChanges.map(a => Math.abs(a.newLength - a.previousLength)));\n const impact = Math.min(largestArrayChange * 2 + analysis.arrayChanges.length * 5, 50);\n totalScore += impact;\n factors.push({\n name: 'Array Mutations',\n description: `${analysis.arrayChanges.length} array(s) changed`,\n impact,\n details: analysis.arrayChanges.map(a =>\n `${a.path}: ${a.previousLength} → ${a.newLength} items`\n ).join(', '),\n });\n }\n\n if (analysis.largeObjectChanges.length > 0) {\n const totalSize = analysis.largeObjectChanges.reduce((sum, o) => sum + o.size, 0);\n const impact = Math.min(totalSize / 10000 * 20, 30);\n totalScore += impact;\n factors.push({\n name: 'Large Object Changes',\n description: `${analysis.largeObjectChanges.length} large object(s) changed (${formatBytes(totalSize)})`,\n impact,\n details: 'Large objects can cause expensive diffing and template updates',\n });\n }\n\n if (analysis.maxChangeDepth > 3) {\n const impact = Math.min((analysis.maxChangeDepth - 3) * 5, 15);\n totalScore += impact;\n factors.push({\n name: 'Deep State Changes',\n description: `Changes at depth ${analysis.maxChangeDepth}`,\n impact,\n details: 'Deeply nested changes may indicate non-normalized state',\n });\n }\n\n if (analysis.totalPropertiesChanged > 10) {\n const impact = Math.min(analysis.totalPropertiesChanged / 5, 20);\n totalScore += impact;\n factors.push({\n name: 'Property Change Volume',\n description: `${analysis.totalPropertiesChanged} total properties changed`,\n impact,\n });\n }\n\n totalScore = Math.min(Math.round(totalScore), 100);\n\n let level: 'low' | 'medium' | 'high' | 'critical';\n if (totalScore < 25) level = 'low';\n else if (totalScore < 50) level = 'medium';\n else if (totalScore < 75) level = 'high';\n else level = 'critical';\n\n const estimatedComponentsAffected = Math.ceil(\n analysis.rootPropertiesChanged * 2 +\n analysis.arrayChanges.length * 3 +\n analysis.largeObjectChanges.length\n );\n\n const recommendations = generateRecommendations(analysis, factors);\n\n return {\n score: totalScore,\n level,\n estimatedComponentsAffected,\n factors,\n recommendations,\n };\n}\n\nfunction analyzeStateChange(prevState: unknown, nextState: unknown): StateChangeAnalysis {\n const analysis: StateChangeAnalysis = {\n rootPropertiesChanged: 0,\n totalPropertiesChanged: 0,\n arrayChanges: [],\n largeObjectChanges: [],\n maxChangeDepth: 0,\n };\n\n if (!prevState || !nextState || typeof prevState !== 'object' || typeof nextState !== 'object') {\n return analysis;\n }\n\n const prevObj = prevState as Record<string, unknown>;\n const nextObj = nextState as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);\n\n for (const key of allKeys) {\n if (prevObj[key] !== nextObj[key]) {\n analysis.rootPropertiesChanged++;\n analyzeDeep(prevObj[key], nextObj[key], key, 1, analysis);\n }\n }\n\n return analysis;\n}\n\nfunction analyzeDeep(\n prev: unknown,\n next: unknown,\n path: string,\n depth: number,\n analysis: StateChangeAnalysis\n): void {\n analysis.maxChangeDepth = Math.max(analysis.maxChangeDepth, depth);\n analysis.totalPropertiesChanged++;\n\n if (Array.isArray(prev) || Array.isArray(next)) {\n const prevArr = Array.isArray(prev) ? prev : [];\n const nextArr = Array.isArray(next) ? next : [];\n\n if (prevArr.length !== nextArr.length || prev !== next) {\n analysis.arrayChanges.push({\n path,\n previousLength: prevArr.length,\n newLength: nextArr.length,\n itemsAdded: Math.max(0, nextArr.length - prevArr.length),\n itemsRemoved: Math.max(0, prevArr.length - nextArr.length),\n });\n }\n return;\n }\n\n if (typeof next === 'object' && next !== null) {\n const size = estimateSize(next);\n if (size > 5000) {\n analysis.largeObjectChanges.push({\n path,\n size,\n changeType: prev === undefined || prev === null ? 'added' : 'modified',\n });\n }\n\n if (depth < 10) {\n const prevObj = (prev && typeof prev === 'object' ? prev : {}) as Record<string, unknown>;\n const nextObj = next as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(prevObj), ...Object.keys(nextObj)]);\n\n for (const key of allKeys) {\n if (prevObj[key] !== nextObj[key]) {\n analyzeDeep(prevObj[key], nextObj[key], `${path}.${key}`, depth + 1, analysis);\n }\n }\n }\n }\n}\n\nfunction estimateSize(obj: unknown): number {\n try {\n return JSON.stringify(obj).length;\n } catch {\n return 0;\n }\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction generateRecommendations(\n analysis: StateChangeAnalysis,\n factors: readonly RenderImpactFactor[]\n): string[] {\n const recommendations: string[] = [];\n\n const largeArrayChanges = analysis.arrayChanges.filter(a => a.newLength > 100);\n if (largeArrayChanges.length > 0) {\n recommendations.push(\n 'Consider using trackBy in *ngFor for large arrays to reduce DOM updates'\n );\n recommendations.push(\n 'Use virtual scrolling (cdk-virtual-scroll-viewport) for lists with 100+ items'\n );\n }\n\n if (analysis.largeObjectChanges.length > 0) {\n recommendations.push(\n 'Break down large state objects into smaller, normalized entities'\n );\n recommendations.push(\n 'Use OnPush change detection strategy in components displaying this data'\n );\n }\n\n if (analysis.maxChangeDepth > 4) {\n recommendations.push(\n 'Normalize deeply nested state using @ngrx/entity for better performance'\n );\n }\n\n if (analysis.rootPropertiesChanged > 2) {\n recommendations.push(\n 'Consider batching related state updates into a single action'\n );\n }\n\n const totalImpact = factors.reduce((sum, f) => sum + f.impact, 0);\n if (totalImpact > 50) {\n recommendations.push(\n 'Use memoized selectors to prevent unnecessary recomputations'\n );\n recommendations.push(\n 'Consider using component-level state for frequently changing UI state'\n );\n }\n\n return recommendations;\n}\n","import { Injectable } from '@angular/core';\n\nexport interface SelectorMetrics {\n readonly name: string;\n invocationCount: number;\n recomputationCount: number;\n totalComputationTime: number;\n avgComputationTime: number;\n maxComputationTime: number;\n lastComputationTime: number;\n cacheHitRate: number;\n lastInvoked: number;\n triggeringActions: string[];\n}\n\nexport interface SelectorInvocation {\n readonly selectorName: string;\n readonly timestamp: number;\n readonly computationTime: number;\n readonly wasRecomputed: boolean;\n readonly inputChanged: boolean;\n readonly triggeringAction?: string;\n}\n\nexport interface EndToEndTiming {\n readonly actionType: string;\n readonly actionDispatchTime: number;\n readonly reducerCompleteTime: number;\n readonly selectorsCompleteTime: number;\n readonly totalTime: number;\n readonly reducerTime: number;\n readonly selectorTime: number;\n readonly affectedSelectors: readonly string[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SelectorTrackerService {\n private readonly selectorMetrics = new Map<string, SelectorMetrics>();\n private recentInvocations: SelectorInvocation[] = [];\n private pendingAction: { type: string; dispatchTime: number; reducerCompleteTime?: number; reducerTime?: number } | null = null;\n private endToEndTimings: EndToEndTiming[] = [];\n\n markActionDispatch(actionType: string): void {\n this.pendingAction = {\n type: actionType,\n dispatchTime: performance.now(),\n };\n }\n\n markReducerComplete(reducerTime: number): void {\n if (this.pendingAction) {\n this.pendingAction.reducerCompleteTime = performance.now();\n this.pendingAction.reducerTime = reducerTime;\n }\n }\n\n recordSelectorInvocation(\n selectorName: string,\n computationTime: number,\n wasRecomputed: boolean,\n inputChanged: boolean\n ): void {\n const invocation: SelectorInvocation = {\n selectorName,\n timestamp: Date.now(),\n computationTime,\n wasRecomputed,\n inputChanged,\n triggeringAction: this.pendingAction?.type,\n };\n\n this.recentInvocations.push(invocation);\n\n const existing = this.selectorMetrics.get(selectorName);\n if (existing) {\n existing.invocationCount++;\n if (wasRecomputed) {\n existing.recomputationCount++;\n existing.totalComputationTime += computationTime;\n existing.avgComputationTime = existing.totalComputationTime / existing.recomputationCount;\n existing.maxComputationTime = Math.max(existing.maxComputationTime, computationTime);\n existing.lastComputationTime = computationTime;\n }\n existing.cacheHitRate = ((existing.invocationCount - existing.recomputationCount) / existing.invocationCount) * 100;\n existing.lastInvoked = Date.now();\n if (this.pendingAction?.type && !existing.triggeringActions.includes(this.pendingAction.type)) {\n existing.triggeringActions.push(this.pendingAction.type);\n if (existing.triggeringActions.length > 10) {\n existing.triggeringActions.shift();\n }\n }\n } else {\n this.selectorMetrics.set(selectorName, {\n name: selectorName,\n invocationCount: 1,\n recomputationCount: wasRecomputed ? 1 : 0,\n totalComputationTime: wasRecomputed ? computationTime : 0,\n avgComputationTime: wasRecomputed ? computationTime : 0,\n maxComputationTime: wasRecomputed ? computationTime : 0,\n lastComputationTime: wasRecomputed ? computationTime : 0,\n cacheHitRate: wasRecomputed ? 0 : 100,\n lastInvoked: Date.now(),\n triggeringActions: this.pendingAction?.type ? [this.pendingAction.type] : [],\n });\n }\n\n if (this.recentInvocations.length > 500) {\n this.recentInvocations = this.recentInvocations.slice(-250);\n }\n }\n\n markSelectorsComplete(): EndToEndTiming | null {\n if (!this.pendingAction) return null;\n\n const now = performance.now();\n\n const affectedSelectors = this.recentInvocations\n .filter(inv => inv.triggeringAction === this.pendingAction?.type)\n .map(inv => inv.selectorName)\n .filter((name, index, arr) => arr.indexOf(name) === index);\n\n const timing: EndToEndTiming = {\n actionType: this.pendingAction.type,\n actionDispatchTime: this.pendingAction.dispatchTime,\n reducerCompleteTime: this.pendingAction.reducerCompleteTime ?? now,\n selectorsCompleteTime: now,\n totalTime: now - this.pendingAction.dispatchTime,\n reducerTime: this.pendingAction.reducerTime ?? 0,\n selectorTime: now - (this.pendingAction.reducerCompleteTime ?? this.pendingAction.dispatchTime),\n affectedSelectors,\n };\n\n this.endToEndTimings.push(timing);\n if (this.endToEndTimings.length > 100) {\n this.endToEndTimings = this.endToEndTimings.slice(-50);\n }\n\n this.pendingAction = null;\n return timing;\n }\n\n getAllMetrics(): ReadonlyMap<string, SelectorMetrics> {\n return new Map(this.selectorMetrics);\n }\n\n getMetrics(selectorName: string): SelectorMetrics | undefined {\n return this.selectorMetrics.get(selectorName);\n }\n\n getSlowestSelectors(limit = 10): readonly SelectorMetrics[] {\n return Array.from(this.selectorMetrics.values())\n .sort((a, b) => b.totalComputationTime - a.totalComputationTime)\n .slice(0, limit);\n }\n\n getInefficientSelectors(cacheHitThreshold = 50): readonly SelectorMetrics[] {\n return Array.from(this.selectorMetrics.values())\n .filter(m => m.cacheHitRate < cacheHitThreshold && m.invocationCount > 5)\n .sort((a, b) => a.cacheHitRate - b.cacheHitRate);\n }\n\n getEndToEndTimings(): readonly EndToEndTiming[] {\n return [...this.endToEndTimings];\n }\n\n getAverageEndToEndTime(): number {\n if (this.endToEndTimings.length === 0) return 0;\n const total = this.endToEndTimings.reduce((sum, t) => sum + t.totalTime, 0);\n return total / this.endToEndTimings.length;\n }\n\n clear(): void {\n this.selectorMetrics.clear();\n this.recentInvocations = [];\n this.endToEndTimings = [];\n this.pendingAction = null;\n }\n}\n","import { MemoizedSelector, createSelector, Selector } from '@ngrx/store';\nimport { SelectorTrackerService } from './selector-tracker.service';\n\nlet globalSelectorTracker: SelectorTrackerService | null = null;\n\nexport function setSelectorTracker(tracker: SelectorTrackerService): void {\n globalSelectorTracker = tracker;\n}\n\nexport function trackSelector<State, Result>(\n name: string,\n selector: MemoizedSelector<State, Result>\n): MemoizedSelector<State, Result> {\n let lastResult: Result | undefined;\n let lastInput: State | undefined;\n\n const trackedSelector = ((state: State) => {\n const startTime = performance.now();\n const result = selector(state);\n const endTime = performance.now();\n\n const computationTime = endTime - startTime;\n const wasRecomputed = result !== lastResult;\n const inputChanged = state !== lastInput;\n\n lastResult = result;\n lastInput = state;\n\n if (globalSelectorTracker) {\n globalSelectorTracker.recordSelectorInvocation(\n name,\n computationTime,\n wasRecomputed,\n inputChanged\n );\n }\n\n return result;\n }) as MemoizedSelector<State, Result>;\n\n (trackedSelector as unknown as { release: typeof selector.release }).release = selector.release;\n (trackedSelector as unknown as { projector: typeof selector.projector }).projector = selector.projector;\n (trackedSelector as unknown as { setResult: typeof selector.setResult }).setResult = selector.setResult;\n (trackedSelector as unknown as { clearResult: typeof selector.clearResult }).clearResult = selector.clearResult;\n\n return trackedSelector;\n}\n\nexport function createTrackedSelector<State, S1, Result>(\n name: string,\n s1: Selector<State, S1>,\n projector: (s1: S1) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n projector: (s1: S1, s2: S2) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, S3, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n s3: Selector<State, S3>,\n projector: (s1: S1, s2: S2, s3: S3) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector<State, S1, S2, S3, S4, Result>(\n name: string,\n s1: Selector<State, S1>,\n s2: Selector<State, S2>,\n s3: Selector<State, S3>,\n s4: Selector<State, S4>,\n projector: (s1: S1, s2: S2, s3: S3, s4: S4) => Result\n): MemoizedSelector<State, Result>;\n\nexport function createTrackedSelector(\n name: string,\n ...args: unknown[]\n): MemoizedSelector<unknown, unknown> {\n const selector = (createSelector as (...args: unknown[]) => MemoizedSelector<unknown, unknown>)(...args);\n return trackSelector(name, selector);\n}\n\nexport function TrackedSelector(name: string) {\n return function (target: Record<string, unknown>, propertyKey: string): void {\n const originalSelector = target[propertyKey] as MemoizedSelector<unknown, unknown>;\n if (originalSelector) {\n target[propertyKey] = trackSelector(name, originalSelector);\n }\n };\n}\n","import { ActionReducer, Action } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { PerformanceTrackerService } from '../performance/performance-tracker.service';\nimport { WebSocketService } from '../core/websocket.service';\n\nexport interface RenderPerformanceData {\n readonly renderTime: number;\n}\n\nexport interface StateChangeMessage {\n type: 'STATE_CHANGE';\n action: Action;\n prevState: unknown;\n nextState: unknown;\n timestamp: string;\n renderPerformance?: RenderPerformanceData;\n}\n\nexport interface DevToolMetaReducerConfig {\n readonly wsUrl?: string;\n readonly enablePerformanceTracking?: boolean;\n}\n\nexport function createDevToolMetaReducer(\n wsUrlOrConfig: string | DevToolMetaReducerConfig = 'ws://localhost:4000'\n) {\n const config: DevToolMetaReducerConfig = typeof wsUrlOrConfig === 'string'\n ? { wsUrl: wsUrlOrConfig }\n : wsUrlOrConfig;\n\n const wsUrl = config.wsUrl ?? 'ws://localhost:4000';\n const enablePerf = config.enablePerformanceTracking ?? true;\n\n return function devToolMetaReducer<State>(\n reducer: ActionReducer<State>\n ): ActionReducer<State> {\n const performanceTracker = inject(PerformanceTrackerService);\n const webSocketService = inject(WebSocketService);\n\n // Initialize WebSocket connection (no-op if already initialized)\n webSocketService.initialize(wsUrl);\n\n return function (state, action) {\n const prevState = state;\n const timestamp = new Date().toISOString();\n\n let nextState: State;\n\n if (enablePerf) {\n nextState = performanceTracker.measureRenderTime(\n action.type,\n () => reducer(state, action),\n (renderTime) => {\n const message: StateChangeMessage = {\n type: 'STATE_CHANGE',\n action,\n prevState,\n nextState,\n timestamp,\n renderPerformance: { renderTime }\n };\n\n webSocketService.send(message);\n }\n );\n } else {\n nextState = reducer(state, action);\n\n const message: StateChangeMessage = {\n type: 'STATE_CHANGE',\n action,\n prevState,\n nextState,\n timestamp,\n };\n\n webSocketService.send(message);\n }\n\n return nextState;\n };\n };\n}\n\nexport function loggerMetaReducer<State>(\n reducer: ActionReducer<State>\n): ActionReducer<State> {\n return createDevToolMetaReducer('ws://localhost:4000')(reducer);\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { EffectSources } from '@ngrx/effects';\nimport { ActionsInterceptorService } from '../core/actions-interceptor.service';\nimport { DevToolsEffectSources } from '../core/devtools-effect-sources';\n\nexport interface DevToolConfig {\n readonly wsUrl?: string;\n readonly trackEffects?: boolean;\n}\n\nexport function provideNgrxDevTool(config: DevToolConfig = {}): Provider[] {\n const providers: Provider[] = [\n {\n provide: APP_INITIALIZER,\n useFactory: (interceptor: ActionsInterceptorService) => () => {\n interceptor.initialize(config.wsUrl ?? 'ws://localhost:4000');\n },\n deps: [ActionsInterceptorService],\n multi: true,\n },\n ];\n\n if (config.trackEffects !== false) {\n providers.push({\n provide: EffectSources,\n useClass: DevToolsEffectSources,\n });\n }\n\n return providers;\n}\n\nexport function provideEffectTracking(): Provider {\n return {\n provide: EffectSources,\n useClass: DevToolsEffectSources,\n };\n}\n","/*\n * Public API Surface of ngrx-devtool\n */\n\nexport * from './lib/core';\nexport * from './lib/performance';\nexport * from './lib/selectors';\nexport * from './lib/store';\nexport * from './types/state.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["REPLAY_BUFFER_SIZE","takeUntil","tap"],"mappings":"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"}
|