Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion libs/ngrx-toolkit/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@ export {
provideDevtoolsConfig,
} from './lib/devtools/provide-devtools-config';
export { renameDevtoolsName } from './lib/devtools/rename-devtools-name';
export { trackedEvent } from './lib/devtools/tracked-event';
export { trackedEventGroup } from './lib/devtools/tracked-event-group';
export { patchState, updateState } from './lib/devtools/update-state';
export { withDevToolsStub } from './lib/devtools/with-dev-tools-stub';
export { DevtoolsFeature, withDevtools } from './lib/devtools/with-devtools';
export { withTrackedReducer } from './lib/devtools/with-tracked-reducer';

export {
createEffects,
createReducer,
Expand Down
45 changes: 45 additions & 0 deletions libs/ngrx-toolkit/src/lib/devtools/tracked-event-group.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { EventCreator, eventGroup } from '@ngrx/signals/events';
import { Prettify } from '../shared/prettify';
import { currentActionNames } from './internal/current-action-names';

/* eslint-disable @typescript-eslint/no-explicit-any */
type EventType<
Source extends string,
EventName extends string,
> = `[${Source}] ${EventName}`;

type EventCreatorGroup<
Source extends string,
Events extends Record<string, any>,
> = {
readonly [EventName in keyof Events]: EventName extends string
? EventCreator<EventType<Source, EventName>, Events[EventName]>
: never;
};
export function trackedEventGroup<
Source extends string,
Events extends Record<string, unknown>,
>(config: {
source: Source;
events: Events;
}): Prettify<EventCreatorGroup<Source, Events>> {
const group = eventGroup(config);

return new Proxy<Prettify<EventCreatorGroup<Source, Events>>>(group, {
get(target, prop, receiver) {
const value = Reflect.get(target, prop, receiver);

if (typeof value === 'function') {
const returnFunc = (...args: unknown[]) => {
const type = value.type as string;
currentActionNames.add(type);
return (value as any)(...args);
};
returnFunc.type = value.type;
return returnFunc;
}

return value;
},
});
}
25 changes: 25 additions & 0 deletions libs/ngrx-toolkit/src/lib/devtools/tracked-event.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { EventCreator, event } from '@ngrx/signals/events';
import { currentActionNames } from './internal/current-action-names';

/* eslint-disable @typescript-eslint/no-explicit-any */
export function trackedEvent<Type extends string>(
type: Type,
): EventCreator<Type, void>;

export function trackedEvent<Type extends string, Payload>(
type: Type,
payload: Payload,
): EventCreator<Type, Payload>;
export function trackedEvent(type: string): EventCreator<string, any> {
const originalEvent = event(type);
const proxiedCreator = new Proxy(originalEvent, {
apply(target, thisArg, argArray) {
currentActionNames.add(type);
return Reflect.apply(target, thisArg, argArray);
},
});

(proxiedCreator as any).type = type;

return proxiedCreator;
}
Loading