Skip to content

Commit 8016e6b

Browse files
committed
Add custom group renderer
1 parent c7cded8 commit 8016e6b

File tree

6 files changed

+58
-16
lines changed

6 files changed

+58
-16
lines changed

src/index.stories.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ export function ExampleComponent(): React.ReactElement {
2828
log(state)
2929
log(anotherState, { styles: { componentCSS: 'color: darkRed;' } })
3030

31+
log(anotherState, {
32+
groupLabelRenderer: (type, name) => `Such a group! ${type} & ${name}`,
33+
})
34+
3135
useEffect(function setStateMount() {
3236
setState('onMount')
3337
setAnotherState('onMount')

src/index.test.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ describe('useLog', () => {
317317
expect(consoleWarn).toHaveBeenCalled()
318318
})
319319

320-
it('renders hook with custom log level', () => {
320+
it('renders log with custom log level', () => {
321321
const consoleWarn = jest
322322
.spyOn(console, 'warn')
323323
.mockImplementation(() => null)
@@ -334,4 +334,14 @@ describe('useLog', () => {
334334
expect(consoleError).not.toHaveBeenCalled()
335335
expect(consoleWarn).toHaveBeenCalled()
336336
})
337+
338+
it('renders log with custom group name', () => {
339+
renderHook(() => {
340+
const { log } = useLog()
341+
log('Test', { groupLabelRenderer: (type, name) => `${type} ${name}` })
342+
})
343+
344+
// first call, first parameter (group label) should be modified
345+
expect(consoleGroup.mock.calls[0][0]).toBe('Mount TestComponent')
346+
})
337347
})

src/index.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export function useLog({
4848
isGroupCollapsed = false,
4949
printer = console as Printer,
5050
logLevel = DEFAULT_LOG_LEVEL,
51+
groupLabelRenderer,
5152
}: UseLogConfig = {}): UseLogReturn {
5253
const componentName = getComponentName()
5354

@@ -69,7 +70,13 @@ export function useLog({
6970
const prevValueRef = useRef<T>()
7071
const printProps: Pick<
7172
_PrintConfig<T>,
72-
'value' | 'styles' | 'componentName' | 'flags' | 'printer' | 'logLevel'
73+
| 'value'
74+
| 'styles'
75+
| 'componentName'
76+
| 'flags'
77+
| 'printer'
78+
| 'logLevel'
79+
| 'groupLabelRenderer'
7380
> = {
7481
value: clonedValue,
7582
styles: {
@@ -84,6 +91,7 @@ export function useLog({
8491
},
8592
printer: props?.printer ?? printer,
8693
logLevel: props?.logLevel ?? logLevel,
94+
groupLabelRenderer: props?.groupLabelRenderer ?? groupLabelRenderer,
8795
}
8896

8997
if (environments.includes(process.env.NODE_ENV ?? 'production')) {

src/types.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export interface Styles {
3434
subValueCSS?: string
3535
}
3636

37-
/** Describes configuration object at component level */
3837
export type UseLogConfig = {
3938
/** Contains styles object with different CSS inline styles used in logging */
4039
styles?: Styles
@@ -49,19 +48,24 @@ export type UseLogConfig = {
4948
isGroupingEnabled?: boolean
5049
/** Render groups collapsed */
5150
isGroupCollapsed?: boolean
51+
/** A function which will be used to render labels for the group */
52+
groupLabelRenderer?: (
53+
/** Current stage of component lifecycle */
54+
type: ComponentLifecycleLabels,
55+
componentName: string,
56+
) => string
5257
}
5358
| {
54-
/** Enable grouping for logs */
59+
/** Disable grouping for logs */
5560
isGroupingEnabled?: false
56-
/** Render groups collapsed */
5761
isGroupCollapsed?: never
62+
groupLabelRenderer?: never
5863
}
5964
)
6065

6166
/** Describes configuration object at call level, can be used to override configuration */
6267
export type LogConfig = UseLogConfig
6368

64-
/** Return value of `useLog` hook */
6569
export interface UseLogReturn {
6670
/** Used for logging per component lifecycle */
6771
log: <T>(value: T, props?: LogConfig) => void
@@ -82,6 +86,10 @@ export interface _PrintConfig<T> {
8286
flags?: _PrintFlags
8387
printer?: Printer | Console
8488
logLevel?: LogLevels
89+
groupLabelRenderer?: (
90+
type: ComponentLifecycleLabels,
91+
componentName: string,
92+
) => string
8593
}
8694

8795
/**
@@ -97,10 +105,6 @@ export type _PrintFlags =
97105
isGrouped?: false
98106
isCollapsed?: never
99107
}
100-
101-
/**
102-
* Label types of component lifecycle stages
103-
*/
104108
export enum ComponentLifecycleLabels {
105109
Mount = 'Mount',
106110
Unmount = 'Unmount',

src/utils.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,19 @@ describe('utils', () => {
178178

179179
expect(consoleLog).toHaveBeenCalledWith(' On Change: Test Value')
180180
})
181+
182+
it('prints with custom group label', () => {
183+
print({
184+
...printProps,
185+
groupLabelRenderer: (type, name) => `${type} ${name}`,
186+
})
187+
188+
expect(consoleGroup).toHaveBeenCalledWith(
189+
'Change SomeComponentName',
190+
undefined,
191+
undefined,
192+
)
193+
})
181194
})
182195

183196
describe('getMessage', () => {

src/utils.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,22 @@ export function print<T>({
103103
styles: { componentCSS, subValueCSS, changeCSS } = {},
104104
printer = {},
105105
logLevel = 'log',
106+
groupLabelRenderer,
106107
}: _PrintConfig<T>): void {
107108
const getCurrentPrinter = (
108109
method: keyof _SupportedConsole,
109110
): _SupportedConsole[keyof _SupportedConsole] => getPrinter(printer, method)
110111

111112
if (flags.isGrouped) {
112113
getCurrentPrinter(flags.isCollapsed ? 'groupCollapsed' : 'group')(
113-
getGroupLabel(
114-
type,
115-
componentName,
116-
Boolean(componentCSS),
117-
Boolean(subValueCSS),
118-
),
114+
groupLabelRenderer
115+
? groupLabelRenderer(type, componentName)
116+
: getGroupLabel(
117+
type,
118+
componentName,
119+
Boolean(componentCSS),
120+
Boolean(subValueCSS),
121+
),
119122
componentCSS,
120123
subValueCSS,
121124
)

0 commit comments

Comments
 (0)