diff --git a/libs/ngrx-toolkit/src/index.ts b/libs/ngrx-toolkit/src/index.ts index 8fb050c..dea06d8 100644 --- a/libs/ngrx-toolkit/src/index.ts +++ b/libs/ngrx-toolkit/src/index.ts @@ -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, diff --git a/libs/ngrx-toolkit/src/lib/devtools/tracked-event-group.ts b/libs/ngrx-toolkit/src/lib/devtools/tracked-event-group.ts new file mode 100644 index 0000000..26cb52d --- /dev/null +++ b/libs/ngrx-toolkit/src/lib/devtools/tracked-event-group.ts @@ -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, +> = { + readonly [EventName in keyof Events]: EventName extends string + ? EventCreator, Events[EventName]> + : never; +}; +export function trackedEventGroup< + Source extends string, + Events extends Record, +>(config: { + source: Source; + events: Events; +}): Prettify> { + const group = eventGroup(config); + + return new Proxy>>(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; + }, + }); +} diff --git a/libs/ngrx-toolkit/src/lib/devtools/tracked-event.ts b/libs/ngrx-toolkit/src/lib/devtools/tracked-event.ts new file mode 100644 index 0000000..0d090ec --- /dev/null +++ b/libs/ngrx-toolkit/src/lib/devtools/tracked-event.ts @@ -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: Type, +): EventCreator; + +export function trackedEvent( + type: Type, + payload: Payload, +): EventCreator; +export function trackedEvent(type: string): EventCreator { + 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; +}