From b207520022e51b2ff32661f88f0eebaec67b0c80 Mon Sep 17 00:00:00 2001 From: mb-realpage <92600961+mb-realpage@users.noreply.github.com> Date: Fri, 22 Nov 2024 21:12:48 -0700 Subject: [PATCH 1/2] Add literal type for `logger.level` string values By default, `logger.level` is set to "info," type: `string`, even though types/index.d.ts specifies that `level` should be type: `number`. This is confusing. Worse, setting `logger.level` in TypeScript will not allow a string to be used. A specific number must be provided, even though a string works because `lookupLevel` converts the given string to the correct number. So setting `logger.level` must be done in one of two unsatisfactory ways: * By using double assertion to lie to TypeScript, i.e., using a string with `as unknown as number`. This defeats the purpose of types. * By providing the exact index of the log level desired, which requires reading Handlebars' logger implementation to see that: * `debug` = 0 * `info` = 1 * `warn` = 2 * `error` = 3 Note that these numbers are not available in the keys that are defined in the types (`DEBUG`, `INFO`, `WARN`, and `ERROR`), since they are not actually defined in the logger itself. --- types/index.d.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/types/index.d.ts b/types/index.d.ts index 8ad9a241..c7484b66 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -250,14 +250,20 @@ declare namespace hbs { type Utils = typeof Handlebars.Utils; } +type LoggerLevel = + 'debug'| + 'info'| + 'warn'| + 'error'; + interface Logger { DEBUG: number; INFO: number; WARN: number; ERROR: number; - level: number; + level: number | LoggerLevel; - methodMap: { [level: number]: string }; + methodMap: { [level: number]: LoggerLevel }; log(level: number, obj: string): void; } From f0443c15afa1113909e7c1aea74e62759f1b3e5e Mon Sep 17 00:00:00 2001 From: mb-realpage <92600961+mb-realpage@users.noreply.github.com> Date: Fri, 22 Nov 2024 21:22:33 -0700 Subject: [PATCH 2/2] Add log level constants to `logger` The types for `DEBUG`, `INFO`, `WARN`, and `ERROR` are present in the types `logger`, but not in the code. If they're in the types they should be in the code as well. --- lib/handlebars/logger.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/handlebars/logger.js b/lib/handlebars/logger.js index bc411b25..aa7c04e9 100644 --- a/lib/handlebars/logger.js +++ b/lib/handlebars/logger.js @@ -36,4 +36,8 @@ let logger = { } }; +logger.methodMap.forEach(function (levelName, levelNumber) { + logger[levelName.toUpperCase()] = levelNumber; +}); + export default logger;