All files / log / debug.ts

100.00% Branches 3/3
100.00% Lines 10/10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 
 
 
x19
 
x19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
x19
x19
x19
 
 
x36
x54
x54
x59
x36
























































































































// Copyright 2018-2025 the Deno authors. MIT license.
// This module is browser compatible.

import { getLogger } from "./get_logger.ts";
import type { GenericFunction } from "./logger.ts";
import "./setup.ts";

/**
 * Log at the debug level.
 *
 * This function is a pass-through to the default logger's `debug` method. By
 * default, this function is a no-op. To enable debug logging, set call
 * {@linkcode https://jsr.io/@std/log/doc/setup/~/setup | setup} and set the
 * default level to `DEBUG`.
 *
 * @template T The type of the message to log.
 * @param msg The message to log.
 * @param args Arguments to be formatted into the message.
 * @returns The message that was logged.
 *
 * @example Usage without setup
 * ```ts
 * import { debug } from "@std/log/debug";
 * import { assertEquals } from "@std/assert/equals";
 *
 * assertEquals(debug("This is a debug message."), "This is a debug message.");
 * // Prints: ""
 *
 * assertEquals(debug(() => "This is a debug message."), undefined);
 * // Prints: ""
 * ```
 *
 * @example Usage with setup
 * ```ts
 * import { ConsoleHandler, debug, setup } from "@std/log";
 * import { assertEquals } from "@std/assert/equals";
 *
 * setup({
 *   handlers: {
 *     default: new ConsoleHandler("DEBUG"),
 *   },
 *   loggers: {
 *     default: {
 *       level: "DEBUG",
 *       handlers: ["default"],
 *     },
 *   },
 * });
 *
 * assertEquals(debug("This is a debug message."), "This is a debug message.");
 *
 * assertEquals(
 *   debug(() => "This is a debug message."),
 *   "This is a debug message.",
 * );
 * ```
 */
export function debug<T>(msg: () => T, ...args: unknown[]): T | undefined;
/**
 * Log at the debug level.
 *
 * This function is a pass-through to the default logger's `debug` method. By
 * default, this function is a no-op. To enable debug logging, set call
 * {@linkcode https://jsr.io/@std/log/doc/setup/~/setup | setup} and set the
 * default level to `DEBUG`.
 *
 * @template T The type of the message to log.
 * @param msg The message to log.
 * @param args Arguments to be formatted into the message.
 * @returns The message that was logged.
 *
 * @example Usage without setup
 * ```ts
 * import { debug } from "@std/log/debug";
 * import { assertEquals } from "@std/assert/equals";
 *
 * assertEquals(debug("This is a debug message."), "This is a debug message.");
 * // Prints: ""
 *
 * assertEquals(debug(() => "This is a debug message."), undefined);
 * // Prints: ""
 * ```
 *
 * @example Usage with setup
 * ```ts
 * import { ConsoleHandler, debug, setup } from "@std/log";
 * import { assertEquals } from "@std/assert/equals";
 *
 * setup({
 *   handlers: {
 *     default: new ConsoleHandler("DEBUG"),
 *   },
 *   loggers: {
 *     default: {
 *       level: "DEBUG",
 *       handlers: ["default"],
 *     },
 *   },
 * });
 *
 * assertEquals(debug("This is a debug message."), "This is a debug message.");
 *
 * assertEquals(
 *   debug(() => "This is a debug message."),
 *   "This is a debug message.",
 * );
 * ```
 */
export function debug<T>(
  msg: T extends GenericFunction ? never : T,
  ...args: unknown[]
): T;
export function debug<T>(
  msg: (T extends GenericFunction ? never : T) | (() => T),
  ...args: unknown[]
): T | undefined {
  // Assist TS compiler with pass-through generic type
  if (msg instanceof Function) {
    return getLogger("default").debug(msg, ...args);
  }
  return getLogger("default").debug(msg, ...args);
}