diff --git a/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.spec.ts b/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.spec.ts index 6aee63f9e29..2aff9dc54e5 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.spec.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.spec.ts @@ -11,6 +11,7 @@ import { ngDebugDependencyInjectionApiIsSupported, ngDebugProfilerApiIsSupported, ngDebugRoutesApiIsSupported, + ngDebugSignalGraphApiIsSupported, } from './ng-debug-api'; import {Framework} from '../component-tree/core-enums'; @@ -113,4 +114,24 @@ describe('ng-debug-api', () => { expect(ngDebugRoutesApiIsSupported()).toBeFalse(); }); }); + + describe('ngDebugSignalGraphIsSupported', () => { + beforeEach(() => mockRoot()); + + it('should support Signal Graph API with getSignalGraph', () => { + (globalThis as any).ng = fakeNgGlobal(Framework.Angular); + (globalThis as any).ng.ɵgetSignalGraph = () => {}; + expect(ngDebugSignalGraphApiIsSupported()).toBeTrue(); + }); + + it('should not support Signal Graph API with no getSignalGraph', () => { + (globalThis as any).ng = fakeNgGlobal(Framework.ACX); + (globalThis as any).ng.ɵgetSignalGraph = 'not implemented'; + expect(ngDebugSignalGraphApiIsSupported()).toBeFalse(); + + (globalThis as any).ng = fakeNgGlobal(Framework.ACX); + (globalThis as any).ng.ɵgetSignalGraph = undefined; + expect(ngDebugSignalGraphApiIsSupported()).toBeFalse(); + }); + }); }); diff --git a/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.ts b/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.ts index 85a38d08ee7..1bcbbad0ff7 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/ng-debug-api.ts @@ -75,3 +75,9 @@ export function ngDebugRoutesApiIsSupported(): boolean { }) ); } + +/** Checks whether Signal Graph API is supported within window.ng */ +export function ngDebugSignalGraphApiIsSupported(): boolean { + const ng = ngDebugClient(); + return ngDebugApiIsSupported(ng, 'ɵgetSignalGraph'); +} diff --git a/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/supported-apis.ts b/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/supported-apis.ts index 131410e3a6f..24ec7cc02e6 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/supported-apis.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/ng-debug-api/supported-apis.ts @@ -11,6 +11,7 @@ import { ngDebugDependencyInjectionApiIsSupported, ngDebugProfilerApiIsSupported, ngDebugRoutesApiIsSupported, + ngDebugSignalGraphApiIsSupported, } from './ng-debug-api'; /** @@ -22,10 +23,12 @@ export function getSupportedApis(): SupportedApis { const profiler = ngDebugProfilerApiIsSupported(); const dependencyInjection = ngDebugDependencyInjectionApiIsSupported(); const routes = ngDebugRoutesApiIsSupported(); + const signals = ngDebugSignalGraphApiIsSupported(); return { profiler, dependencyInjection, routes, + signals, }; } diff --git a/devtools/projects/ng-devtools/src/lib/devtools.component.ts b/devtools/projects/ng-devtools/src/lib/devtools.component.ts index 9e60d6b12ce..a06f0118f7a 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools.component.ts @@ -66,6 +66,7 @@ export class DevToolsComponent implements OnDestroy { profiler: false, dependencyInjection: false, routes: false, + signals: false, }); readonly ivy = signal(undefined); diff --git a/devtools/projects/protocol/src/lib/messages.ts b/devtools/projects/protocol/src/lib/messages.ts index 53f731eb949..ac4b35a90f0 100644 --- a/devtools/projects/protocol/src/lib/messages.ts +++ b/devtools/projects/protocol/src/lib/messages.ts @@ -338,6 +338,7 @@ export interface SupportedApis { profiler: boolean; dependencyInjection: boolean; routes: boolean; + signals: boolean; } export interface Events {