Skip to content

Commit 6b35db8

Browse files
committed
feat: ✨ Introduce loglevel to makeEnvPublic
1 parent 31dc7d3 commit 6b35db8

File tree

4 files changed

+88
-17
lines changed

4 files changed

+88
-17
lines changed

src/helpers/log.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ afterAll(() => {
1616
errorSpy.mockRestore();
1717
});
1818

19+
describe('silent', () => {
20+
it('should not log an event message', () => {
21+
error('foo', { logLevel: 'silent' });
22+
23+
expect(errorSpy).not.toHaveBeenCalled();
24+
});
25+
26+
it('should respect log level', () => {
27+
event('foo', { logLevel: 'warn' });
28+
29+
expect(logSpy).not.toHaveBeenCalled();
30+
});
31+
});
32+
1933
describe('error', () => {
2034
it('should log an error message', () => {
2135
error('foo');

src/helpers/log.ts

+39-10
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
11
import { bold, green, red, white, yellow } from '../lib/picocolors';
22

3+
export type Level = 'error' | 'warn' | 'info';
4+
export type LevelWithSilent = 'silent' | Level;
5+
6+
export interface LogOptions {
7+
/**
8+
* Level of logging
9+
* @default 'event'
10+
*/
11+
logLevel?: LevelWithSilent;
12+
}
13+
314
export const prefixes = {
415
error: red(bold('⨯')),
516
warn: yellow(bold('⚠')),
617
info: white(bold(' ')),
718
event: green(bold('✓')),
8-
} as const;
19+
} as const satisfies Record<Level | string, string>;
20+
21+
export const prefixLevels = {
22+
silent: Infinity,
23+
error: 40,
24+
warn: 30,
25+
info: 20,
26+
event: 10,
27+
} as const satisfies Record<keyof typeof prefixes | 'silent', number>;
928

1029
const suffix = '(next-runtime-env)';
1130

@@ -15,7 +34,17 @@ const LOGGING_METHOD = {
1534
error: 'error',
1635
} as const;
1736

18-
function prefixedLog(prefixType: keyof typeof prefixes, message: string) {
37+
function prefixedLog(
38+
prefixType: keyof typeof prefixes,
39+
message: string,
40+
options?: LogOptions,
41+
) {
42+
const { logLevel = 'event' } = options || {};
43+
44+
if (prefixLevels[prefixType] < prefixLevels[logLevel]) {
45+
return;
46+
}
47+
1948
const consoleMethod: keyof typeof LOGGING_METHOD =
2049
prefixType in LOGGING_METHOD
2150
? LOGGING_METHOD[prefixType as keyof typeof LOGGING_METHOD]
@@ -27,18 +56,18 @@ function prefixedLog(prefixType: keyof typeof prefixes, message: string) {
2756
console[consoleMethod](` ${prefix}`, message, suffix);
2857
}
2958

30-
export function error(message: string) {
31-
prefixedLog('error', message);
59+
export function error(message: string, options?: LogOptions) {
60+
prefixedLog('error', message, options);
3261
}
3362

34-
export function warn(message: string) {
35-
prefixedLog('warn', message);
63+
export function warn(message: string, options?: LogOptions) {
64+
prefixedLog('warn', message, options);
3665
}
3766

38-
export function info(message: string) {
39-
prefixedLog('info', message);
67+
export function info(message: string, options?: LogOptions) {
68+
prefixedLog('info', message, options);
4069
}
4170

42-
export function event(message: string) {
43-
prefixedLog('event', message);
71+
export function event(message: string, options?: LogOptions) {
72+
prefixedLog('event', message, options);
4473
}

src/utils/make-env-public.spec.ts

+16
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,17 @@ describe('makeEnvPublic()', () => {
5656

5757
expect(eventMock).toHaveBeenCalledWith(
5858
`Prefixed environment variable 'FOO'`,
59+
undefined,
5960
);
6061

6162
expect(eventMock).toHaveBeenCalledWith(
6263
`Prefixed environment variable 'BAR'`,
64+
undefined,
6365
);
6466

6567
expect(eventMock).toHaveBeenCalledWith(
6668
`Prefixed environment variable 'BAZ'`,
69+
undefined,
6770
);
6871
});
6972

@@ -72,6 +75,7 @@ describe('makeEnvPublic()', () => {
7275

7376
expect(warnMock).toHaveBeenCalledWith(
7477
`Skipped prefixing environment variable 'FOO'. Variable not in process.env`,
78+
undefined,
7579
);
7680
});
7781

@@ -82,6 +86,18 @@ describe('makeEnvPublic()', () => {
8286

8387
expect(warnMock).toHaveBeenCalledWith(
8488
`Environment variable 'NEXT_PUBLIC_FOO' is already public`,
89+
undefined,
90+
);
91+
});
92+
93+
it('should not log anything when logLevel is set to silent', () => {
94+
process.env.FOO = 'foo';
95+
96+
makeEnvPublic('FOO', { logLevel: 'silent' });
97+
98+
expect(eventMock).toHaveBeenCalledWith(
99+
`Prefixed environment variable 'FOO'`,
100+
{ logLevel: 'silent' },
85101
);
86102
});
87103
});

src/utils/make-env-public.ts

+19-7
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
1-
import { event, warn } from '../helpers/log';
1+
import { event, LogOptions, warn } from '../helpers/log';
22

3-
function prefixKey(key: string) {
3+
export interface MakeEnvPublicOptions extends LogOptions {}
4+
5+
function prefixKey(key: string, options?: MakeEnvPublicOptions) {
46
// Check if key is available in process.env.
57
if (!process.env[key]) {
68
warn(
79
`Skipped prefixing environment variable '${key}'. Variable not in process.env`,
10+
options,
811
);
912

1013
return;
1114
}
1215

1316
// Check if key is already public.
1417
if (/^NEXT_PUBLIC_/i.test(key)) {
15-
warn(`Environment variable '${key}' is already public`);
18+
warn(`Environment variable '${key}' is already public`, options);
1619
}
1720

1821
const prefixedKey = `NEXT_PUBLIC_${key}`;
1922

2023
process.env[prefixedKey] = process.env[key];
2124

2225
// eslint-disable-next-line no-console
23-
event(`Prefixed environment variable '${key}'`);
26+
event(`Prefixed environment variable '${key}'`, options);
2427
}
2528

2629
/**
@@ -34,12 +37,21 @@ function prefixKey(key: string) {
3437
*
3538
* // Make multiple variables public.
3639
* makeEnvPublic(['FOO', 'BAR', 'BAZ']);
40+
*
41+
* // Disable logging.
42+
* makeEnvPublic('FOO', { logLevel: 'silent' });
43+
*
44+
* // Disable logging in production
45+
* makeEnvPublic('FOO', { logLevel: process.env.NODE_ENV === 'production' ? 'silent': 'info' });
3746
* ```
3847
*/
39-
export function makeEnvPublic(key: string | string[]): void {
48+
export function makeEnvPublic(
49+
key: string | string[],
50+
options?: MakeEnvPublicOptions,
51+
): void {
4052
if (typeof key === 'string') {
41-
prefixKey(key);
53+
prefixKey(key, options);
4254
} else {
43-
key.forEach(prefixKey);
55+
key.forEach((value) => prefixKey(value, options));
4456
}
4557
}

0 commit comments

Comments
 (0)