Skip to content

Commit 9841cfc

Browse files
committed
feat: make loglevel types stricter
1 parent fa236b9 commit 9841cfc

File tree

5 files changed

+26
-20
lines changed

5 files changed

+26
-20
lines changed

Diff for: packages/logger/src/Logger.ts

+21-15
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class Logger extends Utility implements ClassThatLogs {
117117

118118
private customConfigService?: ConfigServiceInterface;
119119

120-
private static readonly defaultLogLevel: LogLevel = 'INFO';
120+
private static readonly defaultLogLevel: Uppercase<LogLevel> = 'INFO';
121121

122122
// envVarsService is always initialized in the constructor in setOptions()
123123
private envVarsService!: EnvironmentVariablesService;
@@ -128,7 +128,7 @@ class Logger extends Utility implements ClassThatLogs {
128128

129129
private logIndentation: number = LogJsonIndent.COMPACT;
130130

131-
private logLevel?: LogLevel;
131+
private logLevel?: Uppercase<LogLevel>;
132132

133133
private readonly logLevelThresholds: LogLevelThresholds = {
134134
DEBUG: 8,
@@ -554,12 +554,16 @@ class Logger extends Utility implements ClassThatLogs {
554554

555555
/**
556556
* It returns the log level set for the Logger instance.
557+
*
558+
* Even though logLevel starts as undefined, it will always be set to a value
559+
* during the Logger instance's initialization. So, we can safely use the non-null
560+
* assertion operator here.
557561
*
558562
* @private
559563
* @returns {LogLevel}
560564
*/
561-
private getLogLevel(): LogLevel {
562-
return <LogLevel> this.logLevel;
565+
private getLogLevel(): Uppercase<LogLevel> {
566+
return this.logLevel!;
563567
}
564568

565569
/**
@@ -619,14 +623,14 @@ class Logger extends Utility implements ClassThatLogs {
619623
}
620624

621625
/**
622-
* It returns true if the provided log level is valid.
626+
* It returns true and type guards the log level if a given log level is valid.
623627
*
624628
* @param {LogLevel} logLevel
625629
* @private
626630
* @returns {boolean}
627631
*/
628-
private isValidLogLevel(logLevel?: LogLevel): boolean {
629-
return typeof logLevel === 'string' && logLevel.toUpperCase() in this.logLevelThresholds;
632+
private isValidLogLevel(logLevel?: LogLevel | string): logLevel is LogLevel {
633+
return typeof logLevel === 'string' && logLevel in this.logLevelThresholds;
630634
}
631635

632636
/**
@@ -648,7 +652,8 @@ class Logger extends Utility implements ClassThatLogs {
648652
* It prints a given log with given log level.
649653
*
650654
* @param {LogLevel} logLevel
651-
* @param {LogItem} log
655+
* @param {LogItemMessage} input
656+
* @param {LogItemExtraInput} extraInput
652657
* @private
653658
*/
654659
private processLogItem(logLevel: LogLevel, input: LogItemMessage, extraInput: LogItemExtraInput): void {
@@ -744,19 +749,19 @@ class Logger extends Utility implements ClassThatLogs {
744749
*/
745750
private setLogLevel(logLevel?: LogLevel): void {
746751
if (this.isValidLogLevel(logLevel)) {
747-
this.logLevel = (<LogLevel>logLevel).toUpperCase();
752+
this.logLevel = logLevel?.toUpperCase() as Uppercase<LogLevel>;
748753

749754
return;
750755
}
751756
const customConfigValue = this.getCustomConfigService()?.getLogLevel();
752757
if (this.isValidLogLevel(customConfigValue)) {
753-
this.logLevel = (<LogLevel>customConfigValue).toUpperCase();
758+
this.logLevel = customConfigValue?.toUpperCase() as Uppercase<LogLevel>;
754759

755760
return;
756761
}
757762
const envVarsValue = this.getEnvVarsService().getLogLevel();
758763
if (this.isValidLogLevel(envVarsValue)) {
759-
this.logLevel = (<LogLevel>envVarsValue).toUpperCase();
764+
this.logLevel = envVarsValue?.toUpperCase() as Uppercase<LogLevel>;
760765

761766
return;
762767
}
@@ -845,14 +850,15 @@ class Logger extends Utility implements ClassThatLogs {
845850
/**
846851
* It checks whether the current log item should/can be printed.
847852
*
848-
* @param {string} serviceName
849-
* @param {Environment} environment
850-
* @param {LogAttributes} persistentLogAttributes
853+
* @param {LogLevel} logLevel
851854
* @private
852855
* @returns {boolean}
853856
*/
854857
private shouldPrint(logLevel: LogLevel): boolean {
855-
if (this.logLevelThresholds[logLevel] >= this.logLevelThresholds[this.getLogLevel()]) {
858+
if (
859+
this.logLevelThresholds[logLevel.toUpperCase() as Uppercase<LogLevel>] >=
860+
this.logLevelThresholds[this.getLogLevel()]
861+
) {
856862
return true;
857863
}
858864

Diff for: packages/logger/src/types/Log.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ type LogLevelInfo = 'INFO';
33
type LogLevelWarn = 'WARN';
44
type LogLevelError = 'ERROR';
55

6-
type LogLevel = LogLevelDebug | LogLevelInfo | LogLevelWarn | LogLevelError | string;
6+
type LogLevel = LogLevelDebug | Lowercase<LogLevelDebug> | LogLevelInfo | Lowercase<LogLevelInfo> | LogLevelWarn | Lowercase<LogLevelWarn> | LogLevelError | Lowercase<LogLevelError>;
77

88
type LogLevelThresholds = {
9-
[key in LogLevel]: number;
9+
[key in Uppercase<LogLevel>]: number;
1010
};
1111

1212
type LogAttributeValue = unknown;

Diff for: packages/logger/tests/unit/Logger.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1419,7 +1419,7 @@ describe('Class: Logger', () => {
14191419
};
14201420
const childLoggerWithSampleRateEnabled = parentLogger.createChild(optionsWithSampleRateEnabled);
14211421

1422-
const optionsWithErrorLogLevel = {
1422+
const optionsWithErrorLogLevel: ConstructorOptions = {
14231423
logLevel: 'ERROR',
14241424
};
14251425
const childLoggerWithErrorLogLevel = parentLogger.createChild(optionsWithErrorLogLevel);

Diff for: packages/logger/tests/unit/formatter/PowertoolLogFormatter.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe('Class: PowertoolLogFormatter', () => {
2323

2424
// Prepare
2525
const formatter = new PowertoolLogFormatter();
26-
const unformattedAttributes = {
26+
const unformattedAttributes: UnformattedAttributes = {
2727
sampleRateValue: undefined,
2828
awsRegion: 'eu-west-1',
2929
environment: '',

Diff for: packages/logger/tests/unit/helpers.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ describe('Helper: createLogger function', () => {
5656
test('when no parameters are set, returns a Logger instance with the correct properties', () => {
5757

5858
// Prepare
59-
const loggerOptions = {
59+
const loggerOptions: ConstructorOptions = {
6060
logLevel: 'WARN',
6161
serviceName: 'my-lambda-service',
6262
sampleRateValue: 1,

0 commit comments

Comments
 (0)