@microsoft/teams.common 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  <a href="https://www.npmjs.com/package/@microsoft/teams.common" target="_blank">
14
14
  <img src="https://img.shields.io/npm/dw/@microsoft/teams.common" />
15
15
  </a>
16
- <a href="https://microsoft.github.io/teams-ai" target="_blank">
16
+ <a href="https://microsoft.github.io/teams-sdk" target="_blank">
17
17
  <img src="https://img.shields.io/badge/📖 docs-open-blue" />
18
18
  </a>
19
19
  </p>
@@ -21,7 +21,7 @@
21
21
  Common modules used to provide utility functionality to the other packages while
22
22
  minimizing external dependencies.
23
23
 
24
- <a href="https://microsoft.github.io/teams-ai" target="_blank">
24
+ <a href="https://microsoft.github.io/teams-sdk" target="_blank">
25
25
  <img src="https://img.shields.io/badge/📖 Getting Started-blue?style=for-the-badge" />
26
26
  </a>
27
27
 
@@ -1,6 +1,7 @@
1
- import { ILogger, LogLevel, ILoggerOptions } from './logger.mjs';
1
+ import { ILogger, ILoggerOptions, LogLevel } from './logger.mjs';
2
2
 
3
3
  declare class ConsoleLogger implements ILogger {
4
+ readonly loggerOptions: ILoggerOptions;
4
5
  protected readonly name: string;
5
6
  protected readonly level: LogLevel;
6
7
  private readonly _enabled;
@@ -11,8 +12,9 @@ declare class ConsoleLogger implements ILogger {
11
12
  warn(...msg: any[]): void;
12
13
  info(...msg: any[]): void;
13
14
  debug(...msg: any[]): void;
15
+ trace(...msg: any[]): void;
14
16
  log(level: LogLevel, ...msg: any[]): void;
15
- child(name: string): ConsoleLogger;
17
+ child(name: string, overrideOptions?: ILoggerOptions): ConsoleLogger;
16
18
  }
17
19
 
18
20
  export { ConsoleLogger };
@@ -1,6 +1,7 @@
1
- import { ILogger, LogLevel, ILoggerOptions } from './logger.js';
1
+ import { ILogger, ILoggerOptions, LogLevel } from './logger.js';
2
2
 
3
3
  declare class ConsoleLogger implements ILogger {
4
+ readonly loggerOptions: ILoggerOptions;
4
5
  protected readonly name: string;
5
6
  protected readonly level: LogLevel;
6
7
  private readonly _enabled;
@@ -11,8 +12,9 @@ declare class ConsoleLogger implements ILogger {
11
12
  warn(...msg: any[]): void;
12
13
  info(...msg: any[]): void;
13
14
  debug(...msg: any[]): void;
15
+ trace(...msg: any[]): void;
14
16
  log(level: LogLevel, ...msg: any[]): void;
15
- child(name: string): ConsoleLogger;
17
+ child(name: string, overrideOptions?: ILoggerOptions): ConsoleLogger;
16
18
  }
17
19
 
18
20
  export { ConsoleLogger };
@@ -3,6 +3,7 @@
3
3
  var ansi = require('./ansi');
4
4
 
5
5
  class ConsoleLogger {
6
+ loggerOptions;
6
7
  name;
7
8
  level;
8
9
  _enabled;
@@ -10,13 +11,15 @@ class ConsoleLogger {
10
11
  error: 100,
11
12
  warn: 200,
12
13
  info: 300,
13
- debug: 400
14
+ debug: 400,
15
+ trace: 500
14
16
  };
15
17
  _colors = {
16
18
  error: ansi.ANSI.ForegroundRed,
17
19
  warn: ansi.ANSI.ForegroundYellow,
18
20
  info: ansi.ANSI.ForegroundCyan,
19
- debug: ansi.ANSI.ForegroundMagenta
21
+ debug: ansi.ANSI.ForegroundMagenta,
22
+ trace: ansi.ANSI.BackgroundBlue
20
23
  };
21
24
  constructor(name, options) {
22
25
  this.name = name;
@@ -24,6 +27,10 @@ class ConsoleLogger {
24
27
  const logNamePattern = env?.LOG || options?.pattern || "*";
25
28
  this._enabled = parseMagicExpr(logNamePattern).test(name);
26
29
  this.level = parseLogLevel(env?.LOG_LEVEL) || options?.level || "info";
30
+ this.loggerOptions = options ?? {
31
+ level: this.level,
32
+ pattern: logNamePattern
33
+ };
27
34
  }
28
35
  error(...msg) {
29
36
  this.log("error", ...msg);
@@ -37,6 +44,9 @@ class ConsoleLogger {
37
44
  debug(...msg) {
38
45
  this.log("debug", ...msg);
39
46
  }
47
+ trace(...msg) {
48
+ this.log("trace", ...msg);
49
+ }
40
50
  log(level, ...msg) {
41
51
  if (!this._enabled) {
42
52
  return;
@@ -56,13 +66,48 @@ class ConsoleLogger {
56
66
  }
57
67
  }
58
68
  }
59
- child(name) {
69
+ child(name, overrideOptions) {
70
+ const mergedPattern = mergePatterns(
71
+ this.loggerOptions.pattern,
72
+ overrideOptions?.pattern
73
+ );
60
74
  return new ConsoleLogger(`${this.name}/${name}`, {
61
- level: this.level
75
+ ...this.loggerOptions,
76
+ ...overrideOptions,
77
+ pattern: mergedPattern
62
78
  });
63
79
  }
64
80
  }
81
+ function parsePatternString(pattern) {
82
+ const patterns = pattern.split(",").map((p) => p.trim());
83
+ const inclusions = [];
84
+ const exclusions = [];
85
+ for (const p of patterns) {
86
+ if (p.startsWith("-")) {
87
+ exclusions.push(p.substring(1));
88
+ } else {
89
+ inclusions.push(p);
90
+ }
91
+ }
92
+ return { inclusions, exclusions };
93
+ }
65
94
  function parseMagicExpr(pattern) {
95
+ const { inclusions: inclusionPatterns, exclusions: exclusionPatterns } = parsePatternString(pattern);
96
+ const inclusions = inclusionPatterns.map((p) => patternToRegex(p));
97
+ const exclusions = exclusionPatterns.map((p) => patternToRegex(p));
98
+ if (inclusions.length === 0 && exclusions.length > 0) {
99
+ inclusions.push(/.*/);
100
+ }
101
+ return {
102
+ test: (name) => {
103
+ const matchesInclusion = inclusions.some((regex) => regex.test(name));
104
+ if (!matchesInclusion) return false;
105
+ const matchesExclusion = exclusions.some((regex) => regex.test(name));
106
+ return !matchesExclusion;
107
+ }
108
+ };
109
+ }
110
+ function patternToRegex(pattern) {
66
111
  let res = "";
67
112
  const parts = pattern.split("*");
68
113
  for (let i = 0; i < parts.length; i++) {
@@ -73,6 +118,29 @@ function parseMagicExpr(pattern) {
73
118
  }
74
119
  return new RegExp(res);
75
120
  }
121
+ function mergePatterns(parentPattern, childPattern) {
122
+ if (!parentPattern && !childPattern) {
123
+ return "*";
124
+ }
125
+ if (!parentPattern) {
126
+ return childPattern;
127
+ }
128
+ if (!childPattern) {
129
+ return parentPattern;
130
+ }
131
+ const parent = parsePatternString(parentPattern);
132
+ const child = parsePatternString(childPattern);
133
+ let allInclusions = [.../* @__PURE__ */ new Set([...parent.inclusions, ...child.inclusions])];
134
+ if (allInclusions.length === 0) {
135
+ allInclusions = ["*"];
136
+ }
137
+ const optimizedInclusions = allInclusions.includes("*") ? ["*"] : allInclusions;
138
+ const allExclusions = [.../* @__PURE__ */ new Set([...parent.exclusions, ...child.exclusions])];
139
+ const inclusionStrings = optimizedInclusions;
140
+ const exclusionStrings = allExclusions.map((e) => "-" + e);
141
+ const allPatterns = [...inclusionStrings, ...exclusionStrings];
142
+ return allPatterns.join(",");
143
+ }
76
144
  function parseLogLevel(level) {
77
145
  const value = level?.toLowerCase();
78
146
  switch (value) {
@@ -80,6 +148,7 @@ function parseLogLevel(level) {
80
148
  case "warn":
81
149
  case "info":
82
150
  case "debug":
151
+ case "trace":
83
152
  return value;
84
153
  default:
85
154
  return void 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logging/console.ts"],"names":["ANSI"],"mappings":"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","file":"console.js","sourcesContent":["import { ANSI } from './ansi';\nimport { ILogger, ILoggerOptions, LogLevel } from './logger';\n\nexport class ConsoleLogger implements ILogger {\n protected readonly name: string;\n protected readonly level: LogLevel;\n\n private readonly _enabled: boolean;\n private readonly _levels = {\n error: 100,\n warn: 200,\n info: 300,\n debug: 400,\n };\n\n private readonly _colors = {\n error: ANSI.ForegroundRed,\n warn: ANSI.ForegroundYellow,\n info: ANSI.ForegroundCyan,\n debug: ANSI.ForegroundMagenta,\n };\n\n constructor(name: string, options?: ILoggerOptions) {\n this.name = name;\n\n const env = typeof process === 'undefined' ? undefined : process.env;\n const logNamePattern = env?.LOG || options?.pattern || '*';\n this._enabled = parseMagicExpr(logNamePattern).test(name);\n this.level = parseLogLevel(env?.LOG_LEVEL) || options?.level || 'info';\n }\n\n error(...msg: any[]) {\n this.log('error', ...msg);\n }\n\n warn(...msg: any[]) {\n this.log('warn', ...msg);\n }\n\n info(...msg: any[]) {\n this.log('info', ...msg);\n }\n\n debug(...msg: any[]) {\n this.log('debug', ...msg);\n }\n\n log(level: LogLevel, ...msg: any[]) {\n if (!this._enabled) {\n return;\n }\n\n if (this._levels[level] > this._levels[this.level]) {\n return;\n }\n\n const prefix = [this._colors[level], ANSI.Bold, `[${level.toUpperCase()}]`];\n const name = [this.name, ANSI.ForegroundReset, ANSI.BoldReset];\n\n for (const m of msg) {\n let text = new String(m);\n\n if (typeof m === 'object') {\n text = JSON.stringify(m, null, 2);\n }\n\n for (const line of text.split('\\n')) {\n console[level](prefix.join(''), name.join(''), line);\n }\n }\n }\n\n child(name: string) {\n return new ConsoleLogger(`${this.name}/${name}`, {\n level: this.level,\n });\n }\n}\n\nfunction parseMagicExpr(pattern: string) {\n let res = '';\n const parts = pattern.split('*');\n\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) {\n res += '.*';\n }\n\n res += parts[i];\n }\n\n return new RegExp(res);\n}\n\nfunction parseLogLevel(level?: string): LogLevel | undefined {\n const value = level?.toLowerCase();\n switch (value) {\n case 'error':\n case 'warn':\n case 'info':\n case 'debug':\n return value;\n default:\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/logging/console.ts"],"names":["ANSI"],"mappings":"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","file":"console.js","sourcesContent":["import { ANSI } from './ansi';\nimport { ILogger, ILoggerOptions, LogLevel } from './logger';\n\nexport class ConsoleLogger implements ILogger {\n readonly loggerOptions: ILoggerOptions;\n\n protected readonly name: string;\n protected readonly level: LogLevel;\n\n private readonly _enabled: boolean;\n private readonly _levels = {\n error: 100,\n warn: 200,\n info: 300,\n debug: 400,\n trace: 500,\n };\n\n private readonly _colors = {\n error: ANSI.ForegroundRed,\n warn: ANSI.ForegroundYellow,\n info: ANSI.ForegroundCyan,\n debug: ANSI.ForegroundMagenta,\n trace: ANSI.BackgroundBlue\n };\n\n constructor(name: string, options?: ILoggerOptions) {\n this.name = name;\n\n const env = typeof process === 'undefined' ? undefined : process.env;\n const logNamePattern = env?.LOG || options?.pattern || '*';\n this._enabled = parseMagicExpr(logNamePattern).test(name);\n this.level = parseLogLevel(env?.LOG_LEVEL) || options?.level || 'info';\n this.loggerOptions = options ?? {\n level: this.level,\n pattern: logNamePattern,\n };\n }\n\n error(...msg: any[]) {\n this.log('error', ...msg);\n }\n\n warn(...msg: any[]) {\n this.log('warn', ...msg);\n }\n\n info(...msg: any[]) {\n this.log('info', ...msg);\n }\n\n debug(...msg: any[]) {\n this.log('debug', ...msg);\n }\n\n trace(...msg: any[]) {\n this.log('trace', ...msg);\n }\n\n log(level: LogLevel, ...msg: any[]) {\n if (!this._enabled) {\n return;\n }\n\n if (this._levels[level] > this._levels[this.level]) {\n return;\n }\n\n const prefix = [this._colors[level], ANSI.Bold, `[${level.toUpperCase()}]`];\n const name = [this.name, ANSI.ForegroundReset, ANSI.BoldReset];\n\n for (const m of msg) {\n let text = new String(m);\n\n if (typeof m === 'object') {\n text = JSON.stringify(m, null, 2);\n }\n\n for (const line of text.split('\\n')) {\n console[level](prefix.join(''), name.join(''), line);\n }\n }\n }\n\n child(name: string, overrideOptions?: ILoggerOptions) {\n const mergedPattern = mergePatterns(\n this.loggerOptions.pattern,\n overrideOptions?.pattern\n );\n\n return new ConsoleLogger(`${this.name}/${name}`, {\n ...this.loggerOptions,\n ...overrideOptions,\n pattern: mergedPattern\n });\n }\n}\n\nfunction parsePatternString(pattern: string): { inclusions: string[]; exclusions: string[] } {\n const patterns = pattern.split(',').map(p => p.trim());\n const inclusions: string[] = [];\n const exclusions: string[] = [];\n\n for (const p of patterns) {\n if (p.startsWith('-')) {\n exclusions.push(p.substring(1));\n } else {\n inclusions.push(p);\n }\n }\n\n return { inclusions, exclusions };\n}\n\nfunction parseMagicExpr(pattern: string) {\n const { inclusions: inclusionPatterns, exclusions: exclusionPatterns } = parsePatternString(pattern);\n\n const inclusions: RegExp[] = inclusionPatterns.map(p => patternToRegex(p));\n const exclusions: RegExp[] = exclusionPatterns.map(p => patternToRegex(p));\n\n // If only exclusions specified, implicitly include everything\n if (inclusions.length === 0 && exclusions.length > 0) {\n inclusions.push(/.*/);\n }\n\n return {\n test: (name: string) => {\n // Check if name matches any inclusion pattern\n const matchesInclusion = inclusions.some(regex => regex.test(name));\n if (!matchesInclusion) return false;\n\n // Check if name matches any exclusion pattern\n const matchesExclusion = exclusions.some(regex => regex.test(name));\n\n // Must match inclusion AND not match any exclusion\n return !matchesExclusion;\n }\n };\n}\n\nfunction patternToRegex(pattern: string): RegExp {\n let res = '';\n const parts = pattern.split('*');\n\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) {\n res += '.*';\n }\n\n res += parts[i];\n }\n\n return new RegExp(res);\n}\n\nfunction mergePatterns(parentPattern?: string, childPattern?: string): string {\n if (!parentPattern && !childPattern) {\n return '*';\n }\n\n if (!parentPattern) {\n return childPattern!;\n }\n\n if (!childPattern) {\n return parentPattern;\n }\n\n const parent = parsePatternString(parentPattern);\n const child = parsePatternString(childPattern);\n\n // Combine and deduplicate inclusions\n let allInclusions = [...new Set([...parent.inclusions, ...child.inclusions])];\n\n // If only exclusions specified, implicitly include everything\n if (allInclusions.length === 0) {\n allInclusions = ['*'];\n }\n\n // Optimize: If '*' exists, it matches everything, so remove other inclusions\n const optimizedInclusions = allInclusions.includes('*') ? ['*'] : allInclusions;\n\n // Combine and deduplicate exclusions\n const allExclusions = [...new Set([...parent.exclusions, ...child.exclusions])];\n\n // Build merged pattern: combine inclusions and exclusions\n const inclusionStrings = optimizedInclusions;\n const exclusionStrings = allExclusions.map(e => '-' + e);\n const allPatterns = [...inclusionStrings, ...exclusionStrings];\n\n return allPatterns.join(',');\n}\n\nfunction parseLogLevel(level?: string): LogLevel | undefined {\n const value = level?.toLowerCase();\n switch (value) {\n case 'error':\n case 'warn':\n case 'info':\n case 'debug':\n case 'trace':\n return value;\n default:\n return undefined;\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { ANSI } from './ansi';
2
2
 
3
3
  class ConsoleLogger {
4
+ loggerOptions;
4
5
  name;
5
6
  level;
6
7
  _enabled;
@@ -8,13 +9,15 @@ class ConsoleLogger {
8
9
  error: 100,
9
10
  warn: 200,
10
11
  info: 300,
11
- debug: 400
12
+ debug: 400,
13
+ trace: 500
12
14
  };
13
15
  _colors = {
14
16
  error: ANSI.ForegroundRed,
15
17
  warn: ANSI.ForegroundYellow,
16
18
  info: ANSI.ForegroundCyan,
17
- debug: ANSI.ForegroundMagenta
19
+ debug: ANSI.ForegroundMagenta,
20
+ trace: ANSI.BackgroundBlue
18
21
  };
19
22
  constructor(name, options) {
20
23
  this.name = name;
@@ -22,6 +25,10 @@ class ConsoleLogger {
22
25
  const logNamePattern = env?.LOG || options?.pattern || "*";
23
26
  this._enabled = parseMagicExpr(logNamePattern).test(name);
24
27
  this.level = parseLogLevel(env?.LOG_LEVEL) || options?.level || "info";
28
+ this.loggerOptions = options ?? {
29
+ level: this.level,
30
+ pattern: logNamePattern
31
+ };
25
32
  }
26
33
  error(...msg) {
27
34
  this.log("error", ...msg);
@@ -35,6 +42,9 @@ class ConsoleLogger {
35
42
  debug(...msg) {
36
43
  this.log("debug", ...msg);
37
44
  }
45
+ trace(...msg) {
46
+ this.log("trace", ...msg);
47
+ }
38
48
  log(level, ...msg) {
39
49
  if (!this._enabled) {
40
50
  return;
@@ -54,13 +64,48 @@ class ConsoleLogger {
54
64
  }
55
65
  }
56
66
  }
57
- child(name) {
67
+ child(name, overrideOptions) {
68
+ const mergedPattern = mergePatterns(
69
+ this.loggerOptions.pattern,
70
+ overrideOptions?.pattern
71
+ );
58
72
  return new ConsoleLogger(`${this.name}/${name}`, {
59
- level: this.level
73
+ ...this.loggerOptions,
74
+ ...overrideOptions,
75
+ pattern: mergedPattern
60
76
  });
61
77
  }
62
78
  }
79
+ function parsePatternString(pattern) {
80
+ const patterns = pattern.split(",").map((p) => p.trim());
81
+ const inclusions = [];
82
+ const exclusions = [];
83
+ for (const p of patterns) {
84
+ if (p.startsWith("-")) {
85
+ exclusions.push(p.substring(1));
86
+ } else {
87
+ inclusions.push(p);
88
+ }
89
+ }
90
+ return { inclusions, exclusions };
91
+ }
63
92
  function parseMagicExpr(pattern) {
93
+ const { inclusions: inclusionPatterns, exclusions: exclusionPatterns } = parsePatternString(pattern);
94
+ const inclusions = inclusionPatterns.map((p) => patternToRegex(p));
95
+ const exclusions = exclusionPatterns.map((p) => patternToRegex(p));
96
+ if (inclusions.length === 0 && exclusions.length > 0) {
97
+ inclusions.push(/.*/);
98
+ }
99
+ return {
100
+ test: (name) => {
101
+ const matchesInclusion = inclusions.some((regex) => regex.test(name));
102
+ if (!matchesInclusion) return false;
103
+ const matchesExclusion = exclusions.some((regex) => regex.test(name));
104
+ return !matchesExclusion;
105
+ }
106
+ };
107
+ }
108
+ function patternToRegex(pattern) {
64
109
  let res = "";
65
110
  const parts = pattern.split("*");
66
111
  for (let i = 0; i < parts.length; i++) {
@@ -71,6 +116,29 @@ function parseMagicExpr(pattern) {
71
116
  }
72
117
  return new RegExp(res);
73
118
  }
119
+ function mergePatterns(parentPattern, childPattern) {
120
+ if (!parentPattern && !childPattern) {
121
+ return "*";
122
+ }
123
+ if (!parentPattern) {
124
+ return childPattern;
125
+ }
126
+ if (!childPattern) {
127
+ return parentPattern;
128
+ }
129
+ const parent = parsePatternString(parentPattern);
130
+ const child = parsePatternString(childPattern);
131
+ let allInclusions = [.../* @__PURE__ */ new Set([...parent.inclusions, ...child.inclusions])];
132
+ if (allInclusions.length === 0) {
133
+ allInclusions = ["*"];
134
+ }
135
+ const optimizedInclusions = allInclusions.includes("*") ? ["*"] : allInclusions;
136
+ const allExclusions = [.../* @__PURE__ */ new Set([...parent.exclusions, ...child.exclusions])];
137
+ const inclusionStrings = optimizedInclusions;
138
+ const exclusionStrings = allExclusions.map((e) => "-" + e);
139
+ const allPatterns = [...inclusionStrings, ...exclusionStrings];
140
+ return allPatterns.join(",");
141
+ }
74
142
  function parseLogLevel(level) {
75
143
  const value = level?.toLowerCase();
76
144
  switch (value) {
@@ -78,6 +146,7 @@ function parseLogLevel(level) {
78
146
  case "warn":
79
147
  case "info":
80
148
  case "debug":
149
+ case "trace":
81
150
  return value;
82
151
  default:
83
152
  return void 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/logging/console.ts"],"names":[],"mappings":"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","file":"console.mjs","sourcesContent":["import { ANSI } from './ansi';\nimport { ILogger, ILoggerOptions, LogLevel } from './logger';\n\nexport class ConsoleLogger implements ILogger {\n protected readonly name: string;\n protected readonly level: LogLevel;\n\n private readonly _enabled: boolean;\n private readonly _levels = {\n error: 100,\n warn: 200,\n info: 300,\n debug: 400,\n };\n\n private readonly _colors = {\n error: ANSI.ForegroundRed,\n warn: ANSI.ForegroundYellow,\n info: ANSI.ForegroundCyan,\n debug: ANSI.ForegroundMagenta,\n };\n\n constructor(name: string, options?: ILoggerOptions) {\n this.name = name;\n\n const env = typeof process === 'undefined' ? undefined : process.env;\n const logNamePattern = env?.LOG || options?.pattern || '*';\n this._enabled = parseMagicExpr(logNamePattern).test(name);\n this.level = parseLogLevel(env?.LOG_LEVEL) || options?.level || 'info';\n }\n\n error(...msg: any[]) {\n this.log('error', ...msg);\n }\n\n warn(...msg: any[]) {\n this.log('warn', ...msg);\n }\n\n info(...msg: any[]) {\n this.log('info', ...msg);\n }\n\n debug(...msg: any[]) {\n this.log('debug', ...msg);\n }\n\n log(level: LogLevel, ...msg: any[]) {\n if (!this._enabled) {\n return;\n }\n\n if (this._levels[level] > this._levels[this.level]) {\n return;\n }\n\n const prefix = [this._colors[level], ANSI.Bold, `[${level.toUpperCase()}]`];\n const name = [this.name, ANSI.ForegroundReset, ANSI.BoldReset];\n\n for (const m of msg) {\n let text = new String(m);\n\n if (typeof m === 'object') {\n text = JSON.stringify(m, null, 2);\n }\n\n for (const line of text.split('\\n')) {\n console[level](prefix.join(''), name.join(''), line);\n }\n }\n }\n\n child(name: string) {\n return new ConsoleLogger(`${this.name}/${name}`, {\n level: this.level,\n });\n }\n}\n\nfunction parseMagicExpr(pattern: string) {\n let res = '';\n const parts = pattern.split('*');\n\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) {\n res += '.*';\n }\n\n res += parts[i];\n }\n\n return new RegExp(res);\n}\n\nfunction parseLogLevel(level?: string): LogLevel | undefined {\n const value = level?.toLowerCase();\n switch (value) {\n case 'error':\n case 'warn':\n case 'info':\n case 'debug':\n return value;\n default:\n return undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/logging/console.ts"],"names":[],"mappings":"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","file":"console.mjs","sourcesContent":["import { ANSI } from './ansi';\nimport { ILogger, ILoggerOptions, LogLevel } from './logger';\n\nexport class ConsoleLogger implements ILogger {\n readonly loggerOptions: ILoggerOptions;\n\n protected readonly name: string;\n protected readonly level: LogLevel;\n\n private readonly _enabled: boolean;\n private readonly _levels = {\n error: 100,\n warn: 200,\n info: 300,\n debug: 400,\n trace: 500,\n };\n\n private readonly _colors = {\n error: ANSI.ForegroundRed,\n warn: ANSI.ForegroundYellow,\n info: ANSI.ForegroundCyan,\n debug: ANSI.ForegroundMagenta,\n trace: ANSI.BackgroundBlue\n };\n\n constructor(name: string, options?: ILoggerOptions) {\n this.name = name;\n\n const env = typeof process === 'undefined' ? undefined : process.env;\n const logNamePattern = env?.LOG || options?.pattern || '*';\n this._enabled = parseMagicExpr(logNamePattern).test(name);\n this.level = parseLogLevel(env?.LOG_LEVEL) || options?.level || 'info';\n this.loggerOptions = options ?? {\n level: this.level,\n pattern: logNamePattern,\n };\n }\n\n error(...msg: any[]) {\n this.log('error', ...msg);\n }\n\n warn(...msg: any[]) {\n this.log('warn', ...msg);\n }\n\n info(...msg: any[]) {\n this.log('info', ...msg);\n }\n\n debug(...msg: any[]) {\n this.log('debug', ...msg);\n }\n\n trace(...msg: any[]) {\n this.log('trace', ...msg);\n }\n\n log(level: LogLevel, ...msg: any[]) {\n if (!this._enabled) {\n return;\n }\n\n if (this._levels[level] > this._levels[this.level]) {\n return;\n }\n\n const prefix = [this._colors[level], ANSI.Bold, `[${level.toUpperCase()}]`];\n const name = [this.name, ANSI.ForegroundReset, ANSI.BoldReset];\n\n for (const m of msg) {\n let text = new String(m);\n\n if (typeof m === 'object') {\n text = JSON.stringify(m, null, 2);\n }\n\n for (const line of text.split('\\n')) {\n console[level](prefix.join(''), name.join(''), line);\n }\n }\n }\n\n child(name: string, overrideOptions?: ILoggerOptions) {\n const mergedPattern = mergePatterns(\n this.loggerOptions.pattern,\n overrideOptions?.pattern\n );\n\n return new ConsoleLogger(`${this.name}/${name}`, {\n ...this.loggerOptions,\n ...overrideOptions,\n pattern: mergedPattern\n });\n }\n}\n\nfunction parsePatternString(pattern: string): { inclusions: string[]; exclusions: string[] } {\n const patterns = pattern.split(',').map(p => p.trim());\n const inclusions: string[] = [];\n const exclusions: string[] = [];\n\n for (const p of patterns) {\n if (p.startsWith('-')) {\n exclusions.push(p.substring(1));\n } else {\n inclusions.push(p);\n }\n }\n\n return { inclusions, exclusions };\n}\n\nfunction parseMagicExpr(pattern: string) {\n const { inclusions: inclusionPatterns, exclusions: exclusionPatterns } = parsePatternString(pattern);\n\n const inclusions: RegExp[] = inclusionPatterns.map(p => patternToRegex(p));\n const exclusions: RegExp[] = exclusionPatterns.map(p => patternToRegex(p));\n\n // If only exclusions specified, implicitly include everything\n if (inclusions.length === 0 && exclusions.length > 0) {\n inclusions.push(/.*/);\n }\n\n return {\n test: (name: string) => {\n // Check if name matches any inclusion pattern\n const matchesInclusion = inclusions.some(regex => regex.test(name));\n if (!matchesInclusion) return false;\n\n // Check if name matches any exclusion pattern\n const matchesExclusion = exclusions.some(regex => regex.test(name));\n\n // Must match inclusion AND not match any exclusion\n return !matchesExclusion;\n }\n };\n}\n\nfunction patternToRegex(pattern: string): RegExp {\n let res = '';\n const parts = pattern.split('*');\n\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) {\n res += '.*';\n }\n\n res += parts[i];\n }\n\n return new RegExp(res);\n}\n\nfunction mergePatterns(parentPattern?: string, childPattern?: string): string {\n if (!parentPattern && !childPattern) {\n return '*';\n }\n\n if (!parentPattern) {\n return childPattern!;\n }\n\n if (!childPattern) {\n return parentPattern;\n }\n\n const parent = parsePatternString(parentPattern);\n const child = parsePatternString(childPattern);\n\n // Combine and deduplicate inclusions\n let allInclusions = [...new Set([...parent.inclusions, ...child.inclusions])];\n\n // If only exclusions specified, implicitly include everything\n if (allInclusions.length === 0) {\n allInclusions = ['*'];\n }\n\n // Optimize: If '*' exists, it matches everything, so remove other inclusions\n const optimizedInclusions = allInclusions.includes('*') ? ['*'] : allInclusions;\n\n // Combine and deduplicate exclusions\n const allExclusions = [...new Set([...parent.exclusions, ...child.exclusions])];\n\n // Build merged pattern: combine inclusions and exclusions\n const inclusionStrings = optimizedInclusions;\n const exclusionStrings = allExclusions.map(e => '-' + e);\n const allPatterns = [...inclusionStrings, ...exclusionStrings];\n\n return allPatterns.join(',');\n}\n\nfunction parseLogLevel(level?: string): LogLevel | undefined {\n const value = level?.toLowerCase();\n switch (value) {\n case 'error':\n case 'warn':\n case 'info':\n case 'debug':\n case 'trace':\n return value;\n default:\n return undefined;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- type LogLevel = 'error' | 'warn' | 'info' | 'debug';
1
+ type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
2
2
  interface ILoggerOptions {
3
3
  /**
4
4
  * Minimum severity level to log. When provided, log entries with lower severity are ignored.
@@ -11,6 +11,10 @@ interface ILoggerOptions {
11
11
  readonly pattern?: string;
12
12
  }
13
13
  interface ILogger {
14
+ /**
15
+ * Active logger options for this logger
16
+ */
17
+ loggerOptions?: ILoggerOptions;
14
18
  /**
15
19
  * Output debug message
16
20
  * @param msg any data to log
@@ -31,6 +35,11 @@ interface ILogger {
31
35
  * @param msg any data to log
32
36
  */
33
37
  error(...msg: any[]): void;
38
+ /**
39
+ * Output trace messages (with stack trace)
40
+ * @param msg any data to log
41
+ */
42
+ trace(...msg: any[]): void;
34
43
  /**
35
44
  * Output log message
36
45
  * @param msg any data to log
@@ -39,7 +48,7 @@ interface ILogger {
39
48
  /**
40
49
  * Create a child logger instance
41
50
  */
42
- child(name: string): ILogger;
51
+ child(name: string, overrides?: ILoggerOptions): ILogger;
43
52
  }
44
53
 
45
54
  export type { ILogger, ILoggerOptions, LogLevel };
@@ -1,4 +1,4 @@
1
- type LogLevel = 'error' | 'warn' | 'info' | 'debug';
1
+ type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
2
2
  interface ILoggerOptions {
3
3
  /**
4
4
  * Minimum severity level to log. When provided, log entries with lower severity are ignored.
@@ -11,6 +11,10 @@ interface ILoggerOptions {
11
11
  readonly pattern?: string;
12
12
  }
13
13
  interface ILogger {
14
+ /**
15
+ * Active logger options for this logger
16
+ */
17
+ loggerOptions?: ILoggerOptions;
14
18
  /**
15
19
  * Output debug message
16
20
  * @param msg any data to log
@@ -31,6 +35,11 @@ interface ILogger {
31
35
  * @param msg any data to log
32
36
  */
33
37
  error(...msg: any[]): void;
38
+ /**
39
+ * Output trace messages (with stack trace)
40
+ * @param msg any data to log
41
+ */
42
+ trace(...msg: any[]): void;
34
43
  /**
35
44
  * Output log message
36
45
  * @param msg any data to log
@@ -39,7 +48,7 @@ interface ILogger {
39
48
  /**
40
49
  * Create a child logger instance
41
50
  */
42
- child(name: string): ILogger;
51
+ child(name: string, overrides?: ILoggerOptions): ILogger;
43
52
  }
44
53
 
45
54
  export type { ILogger, ILoggerOptions, LogLevel };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/teams.common",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "license": "MIT",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -77,10 +77,10 @@
77
77
  "test": "npx jest"
78
78
  },
79
79
  "dependencies": {
80
- "axios": "^1.8.2"
80
+ "axios": "^1.12.0"
81
81
  },
82
82
  "devDependencies": {
83
- "@microsoft/teams.config": "2.0.1",
83
+ "@microsoft/teams.config": "2.0.3",
84
84
  "@types/jest": "^29.5.12",
85
85
  "jest": "^29.7.0",
86
86
  "rimraf": "^6.0.1",