@decohere/scribe 0.0.1-dev.4 → 0.0.1-dev.40

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.
@@ -0,0 +1,25 @@
1
+ import type { LoggerAdapter } from "./logger.adapter.js";
2
+ import type { Logger } from "./logger.type.js";
3
+ import { type ScribeOptions } from "./types.js";
4
+ type LoggerFactoryOptions<T extends string = never, CustomOnly extends true | false = false> = {
5
+ options?: ScribeOptions<T, CustomOnly>;
6
+ adapter: LoggerAdapter;
7
+ };
8
+ export declare class scribe {
9
+ private loggerProvider;
10
+ private static instance;
11
+ static logger<T extends string = never, CustomOnly extends true | false = false>(name?: string, customLevels?: {
12
+ [level in T]: number;
13
+ }): Logger<T, CustomOnly>;
14
+ static configure<T extends string = never, CustomOnly extends true | false = false>(configOptions: LoggerFactoryOptions<T, CustomOnly>): (name?: string) => Logger<T, CustomOnly>;
15
+ static get extend(): scribe;
16
+ static flush(cb?: () => void): void;
17
+ constructor();
18
+ configure<T extends string = never, CustomOnly extends true | false = false>(configOptions: LoggerFactoryOptions<T, CustomOnly>): (name?: string) => Logger<T, CustomOnly>;
19
+ getLogger<T extends string = never, CustomOnly extends true | false = false>(name?: string, customLevels?: {
20
+ [level in T]: number;
21
+ }): Logger<T, CustomOnly>;
22
+ private supportsLevels;
23
+ private mergeDefaults;
24
+ }
25
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { DefaultLevels } from "./types.js";
2
+ export interface BaseLogger {
3
+ get currentLevel(): string;
4
+ get logLevels(): Record<string, number>;
5
+ }
6
+ export type LogFn = (msg: string | number | object, ...args: unknown[]) => void;
7
+ export type Logger<CustomLevels extends string = never, CustomOnly extends true | false = undefined> = {
8
+ [K in DefaultLevels as CustomOnly extends false ? K : never]: LogFn;
9
+ } & {
10
+ [Property in CustomLevels]: LogFn;
11
+ } & {
12
+ isLevelEnabled(level: string): boolean;
13
+ } & BaseLogger;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ declare const LOG_LEVELS: readonly ["fatal", "error", "warn", "info", "debug", "trace"];
2
+ export type LogLevel = typeof LOG_LEVELS;
3
+ export type DefaultLevels = LogLevel[number];
4
+ export declare const LogLevels: {
5
+ fatal: number;
6
+ error: number;
7
+ warn: number;
8
+ info: number;
9
+ debug: number;
10
+ trace: number;
11
+ };
12
+ export declare const DefaultLogLevel: DefaultLevels;
13
+ export type RedactionOptions = {
14
+ paths: string[];
15
+ };
16
+ export declare const DefaultRedactions: RedactionOptions;
17
+ export interface ScribeOptions<T extends string = never, CustomOnly extends true | false = undefined> {
18
+ logLevel?: DefaultLevels | string;
19
+ customLevels?: {
20
+ [level in T]: number;
21
+ };
22
+ customOnly?: CustomOnly;
23
+ redactions?: RedactionOptions;
24
+ }
25
+ export type LogAdapterOptions = Record<string, never>;
26
+ export {};
@@ -1,64 +0,0 @@
1
- import { LogAdapter } from "./logger.adapter.js";
2
- import { DefaultLogLevel, LogLevels } from "./types.js";
3
- export class ConsoleAdapter extends LogAdapter {
4
- configuredLevels;
5
- configuredLogLevel = DefaultLogLevel;
6
- configuredLogLevelValue = LogLevels.info;
7
- constructor(_options = {}){
8
- super();
9
- }
10
- configure(scribeOptions) {
11
- // Get merged log levels (default + custom) using parent class method
12
- this.configuredLevels = this.getLogLevels(scribeOptions);
13
- const logLevelStr = scribeOptions.logLevel ?? DefaultLogLevel;
14
- this.configuredLogLevel = logLevelStr;
15
- this.configuredLogLevelValue = this.configuredLevels[logLevelStr] ?? LogLevels.info;
16
- }
17
- getLogger(name) {
18
- const loggerName = name || "default";
19
- return this.createConsoleLogger(loggerName);
20
- }
21
- createConsoleLogger(name) {
22
- // Use the levels configured during the configure() call
23
- const allLevels = this.configuredLevels;
24
- const currentLevel = this.configuredLogLevel;
25
- const threshold = this.configuredLogLevelValue;
26
- const baseLogger = {
27
- get currentLevel () {
28
- return currentLevel;
29
- },
30
- get logLevels () {
31
- return allLevels;
32
- }
33
- };
34
- const logFunction = (level)=>(msg, ...args)=>{
35
- const timestamp = new Date().toISOString();
36
- let message;
37
- if (typeof msg === "object") {
38
- message = JSON.stringify(msg);
39
- } else {
40
- message = String(msg);
41
- }
42
- const logLine = `[${timestamp}] ${level.toUpperCase()} [${name}]: ${message}`;
43
- if (args.length > 0) {
44
- console.log(logLine, ...args);
45
- } else {
46
- console.log(logLine);
47
- }
48
- };
49
- const noop = ()=>{};
50
- // Start with base logger and isLevelEnabled method
51
- const logger = Object.assign(baseLogger, {
52
- isLevelEnabled: (level)=>(allLevels[level] ?? 0) >= threshold
53
- });
54
- // Dynamically add all log level methods (default + custom)
55
- // Levels below the configured threshold are patched to noop
56
- for (const [levelName, levelValue] of Object.entries(allLevels)){
57
- // biome-ignore lint/suspicious/noExplicitAny: Dynamic logger level creation requires any
58
- logger[levelName] = levelValue >= threshold ? logFunction(levelName) : noop;
59
- }
60
- return logger;
61
- }
62
- }
63
-
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2NvbnNvbGUuYWRhcHRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dBZGFwdGVyIH0gZnJvbSBcIi4vbG9nZ2VyLmFkYXB0ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUxvZ2dlciwgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7XG5cdERlZmF1bHRMb2dMZXZlbCxcblx0dHlwZSBMb2dBZGFwdGVyT3B0aW9ucyxcblx0TG9nTGV2ZWxzLFxuXHR0eXBlIFNjcmliZU9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIENvbnNvbGVBZGFwdGVyT3B0aW9ucyA9IHt9ICYgTG9nQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBDb25zb2xlQWRhcHRlciBleHRlbmRzIExvZ0FkYXB0ZXIge1xuXHRwcml2YXRlIGNvbmZpZ3VyZWRMZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cdHByaXZhdGUgY29uZmlndXJlZExvZ0xldmVsOiBzdHJpbmcgPSBEZWZhdWx0TG9nTGV2ZWw7XG5cdHByaXZhdGUgY29uZmlndXJlZExvZ0xldmVsVmFsdWU6IG51bWJlciA9IExvZ0xldmVscy5pbmZvO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihfb3B0aW9uczogQ29uc29sZUFkYXB0ZXJPcHRpb25zID0ge30pIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0cHVibGljIGNvbmZpZ3VyZTxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0c2NyaWJlT3B0aW9uczogU2NyaWJlT3B0aW9uczxULCBDdXN0b21Pbmx5Pixcblx0KSB7XG5cdFx0Ly8gR2V0IG1lcmdlZCBsb2cgbGV2ZWxzIChkZWZhdWx0ICsgY3VzdG9tKSB1c2luZyBwYXJlbnQgY2xhc3MgbWV0aG9kXG5cdFx0dGhpcy5jb25maWd1cmVkTGV2ZWxzID0gdGhpcy5nZXRMb2dMZXZlbHMoc2NyaWJlT3B0aW9ucyk7XG5cdFx0Y29uc3QgbG9nTGV2ZWxTdHIgPSBzY3JpYmVPcHRpb25zLmxvZ0xldmVsID8/IERlZmF1bHRMb2dMZXZlbDtcblx0XHR0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbCA9IGxvZ0xldmVsU3RyO1xuXHRcdHRoaXMuY29uZmlndXJlZExvZ0xldmVsVmFsdWUgPSB0aGlzLmNvbmZpZ3VyZWRMZXZlbHNbbG9nTGV2ZWxTdHJdID8/IExvZ0xldmVscy5pbmZvO1xuXHR9XG5cblx0cHVibGljIGdldExvZ2dlcjxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0bmFtZT86IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHRjb25zdCBsb2dnZXJOYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb25zb2xlTG9nZ2VyPFQsIEN1c3RvbU9ubHk+KGxvZ2dlck5hbWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb25zb2xlTG9nZ2VyPFxuXHRcdFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcblx0XHRDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2UsXG5cdD4obmFtZTogc3RyaW5nKTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHQvLyBVc2UgdGhlIGxldmVscyBjb25maWd1cmVkIGR1cmluZyB0aGUgY29uZmlndXJlKCkgY2FsbFxuXHRcdGNvbnN0IGFsbExldmVscyA9IHRoaXMuY29uZmlndXJlZExldmVscztcblx0XHRjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbDtcblx0XHRjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlO1xuXG5cdFx0Y29uc3QgYmFzZUxvZ2dlcjogQmFzZUxvZ2dlciA9IHtcblx0XHRcdGdldCBjdXJyZW50TGV2ZWwoKSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50TGV2ZWw7XG5cdFx0XHR9LFxuXHRcdFx0Z2V0IGxvZ0xldmVscygpIHtcblx0XHRcdFx0cmV0dXJuIGFsbExldmVscztcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxvZ0Z1bmN0aW9uID1cblx0XHRcdChsZXZlbDogc3RyaW5nKSA9PlxuXHRcdFx0KG1zZzogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0Y29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXHRcdFx0XHRsZXQgbWVzc2FnZTogc3RyaW5nO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgbXNnID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IFN0cmluZyhtc2cpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgbG9nTGluZSA9IGBbJHt0aW1lc3RhbXB9XSAke2xldmVsLnRvVXBwZXJDYXNlKCl9IFske25hbWV9XTogJHttZXNzYWdlfWA7XG5cblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGxvZ0xpbmUsIC4uLmFyZ3MpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGxvZ0xpbmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Y29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5cdFx0Ly8gU3RhcnQgd2l0aCBiYXNlIGxvZ2dlciBhbmQgaXNMZXZlbEVuYWJsZWQgbWV0aG9kXG5cdFx0Y29uc3QgbG9nZ2VyID0gT2JqZWN0LmFzc2lnbihiYXNlTG9nZ2VyLCB7XG5cdFx0XHRpc0xldmVsRW5hYmxlZDogKGxldmVsOiBzdHJpbmcpID0+IChhbGxMZXZlbHNbbGV2ZWxdID8/IDApID49IHRocmVzaG9sZCxcblx0XHR9KTtcblxuXHRcdC8vIER5bmFtaWNhbGx5IGFkZCBhbGwgbG9nIGxldmVsIG1ldGhvZHMgKGRlZmF1bHQgKyBjdXN0b20pXG5cdFx0Ly8gTGV2ZWxzIGJlbG93IHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBhcmUgcGF0Y2hlZCB0byBub29wXG5cdFx0Zm9yIChjb25zdCBbbGV2ZWxOYW1lLCBsZXZlbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhbGxMZXZlbHMpKSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IER5bmFtaWMgbG9nZ2VyIGxldmVsIGNyZWF0aW9uIHJlcXVpcmVzIGFueVxuXHRcdFx0KGxvZ2dlciBhcyBhbnkpW2xldmVsTmFtZV0gPSBsZXZlbFZhbHVlID49IHRocmVzaG9sZCA/IGxvZ0Z1bmN0aW9uKGxldmVsTmFtZSkgOiBub29wO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2dnZXIgYXMgTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTG9nQWRhcHRlciIsIkRlZmF1bHRMb2dMZXZlbCIsIkxvZ0xldmVscyIsIkNvbnNvbGVBZGFwdGVyIiwiY29uZmlndXJlZExldmVscyIsImNvbmZpZ3VyZWRMb2dMZXZlbCIsImNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlIiwiaW5mbyIsIl9vcHRpb25zIiwiY29uZmlndXJlIiwic2NyaWJlT3B0aW9ucyIsImdldExvZ0xldmVscyIsImxvZ0xldmVsU3RyIiwibG9nTGV2ZWwiLCJnZXRMb2dnZXIiLCJuYW1lIiwibG9nZ2VyTmFtZSIsImNyZWF0ZUNvbnNvbGVMb2dnZXIiLCJhbGxMZXZlbHMiLCJjdXJyZW50TGV2ZWwiLCJ0aHJlc2hvbGQiLCJiYXNlTG9nZ2VyIiwibG9nTGV2ZWxzIiwibG9nRnVuY3Rpb24iLCJsZXZlbCIsIm1zZyIsImFyZ3MiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJtZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsIlN0cmluZyIsImxvZ0xpbmUiLCJ0b1VwcGVyQ2FzZSIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJub29wIiwibG9nZ2VyIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNMZXZlbEVuYWJsZWQiLCJsZXZlbE5hbWUiLCJsZXZlbFZhbHVlIiwiZW50cmllcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLHNCQUFzQjtBQUVqRCxTQUNDQyxlQUFlLEVBRWZDLFNBQVMsUUFFSCxhQUFhO0FBSXBCLE9BQU8sTUFBTUMsdUJBQXVCSDtJQUMzQkksaUJBQXlDO0lBQ3pDQyxxQkFBNkJKLGdCQUFnQjtJQUM3Q0ssMEJBQWtDSixVQUFVSyxJQUFJLENBQUM7SUFFekQsWUFBbUJDLFdBQWtDLENBQUMsQ0FBQyxDQUFFO1FBQ3hELEtBQUs7SUFDTjtJQUVPQyxVQUNOQyxhQUEyQyxFQUMxQztRQUNELHFFQUFxRTtRQUNyRSxJQUFJLENBQUNOLGdCQUFnQixHQUFHLElBQUksQ0FBQ08sWUFBWSxDQUFDRDtRQUMxQyxNQUFNRSxjQUFjRixjQUFjRyxRQUFRLElBQUlaO1FBQzlDLElBQUksQ0FBQ0ksa0JBQWtCLEdBQUdPO1FBQzFCLElBQUksQ0FBQ04sdUJBQXVCLEdBQUcsSUFBSSxDQUFDRixnQkFBZ0IsQ0FBQ1EsWUFBWSxJQUFJVixVQUFVSyxJQUFJO0lBQ3BGO0lBRU9PLFVBQ05DLElBQWEsRUFDVztRQUN4QixNQUFNQyxhQUFhRCxRQUFRO1FBQzNCLE9BQU8sSUFBSSxDQUFDRSxtQkFBbUIsQ0FBZ0JEO0lBQ2hEO0lBRVFDLG9CQUdORixJQUFZLEVBQXlCO1FBQ3RDLHdEQUF3RDtRQUN4RCxNQUFNRyxZQUFZLElBQUksQ0FBQ2QsZ0JBQWdCO1FBQ3ZDLE1BQU1lLGVBQWUsSUFBSSxDQUFDZCxrQkFBa0I7UUFDNUMsTUFBTWUsWUFBWSxJQUFJLENBQUNkLHVCQUF1QjtRQUU5QyxNQUFNZSxhQUF5QjtZQUM5QixJQUFJRixnQkFBZTtnQkFDbEIsT0FBT0E7WUFDUjtZQUNBLElBQUlHLGFBQVk7Z0JBQ2YsT0FBT0o7WUFDUjtRQUNEO1FBRUEsTUFBTUssY0FDTCxDQUFDQyxRQUNELENBQUNDLEtBQStCLEdBQUdDO2dCQUNsQyxNQUFNQyxZQUFZLElBQUlDLE9BQU9DLFdBQVc7Z0JBQ3hDLElBQUlDO2dCQUVKLElBQUksT0FBT0wsUUFBUSxVQUFVO29CQUM1QkssVUFBVUMsS0FBS0MsU0FBUyxDQUFDUDtnQkFDMUIsT0FBTztvQkFDTkssVUFBVUcsT0FBT1I7Z0JBQ2xCO2dCQUVBLE1BQU1TLFVBQVUsQ0FBQyxDQUFDLEVBQUVQLFVBQVUsRUFBRSxFQUFFSCxNQUFNVyxXQUFXLEdBQUcsRUFBRSxFQUFFcEIsS0FBSyxHQUFHLEVBQUVlLFNBQVM7Z0JBRTdFLElBQUlKLEtBQUtVLE1BQU0sR0FBRyxHQUFHO29CQUNwQkMsUUFBUUMsR0FBRyxDQUFDSixZQUFZUjtnQkFDekIsT0FBTztvQkFDTlcsUUFBUUMsR0FBRyxDQUFDSjtnQkFDYjtZQUNEO1FBRUQsTUFBTUssT0FBTyxLQUFPO1FBRXBCLG1EQUFtRDtRQUNuRCxNQUFNQyxTQUFTQyxPQUFPQyxNQUFNLENBQUNyQixZQUFZO1lBQ3hDc0IsZ0JBQWdCLENBQUNuQixRQUFrQixBQUFDTixDQUFBQSxTQUFTLENBQUNNLE1BQU0sSUFBSSxDQUFBLEtBQU1KO1FBQy9EO1FBRUEsMkRBQTJEO1FBQzNELDREQUE0RDtRQUM1RCxLQUFLLE1BQU0sQ0FBQ3dCLFdBQVdDLFdBQVcsSUFBSUosT0FBT0ssT0FBTyxDQUFDNUIsV0FBWTtZQUNoRSx5RkFBeUY7WUFDeEZzQixNQUFjLENBQUNJLFVBQVUsR0FBR0MsY0FBY3pCLFlBQVlHLFlBQVlxQixhQUFhTDtRQUNqRjtRQUVBLE9BQU9DO0lBQ1I7QUFDRCJ9
@@ -1,24 +0,0 @@
1
- import { LogLevels } from "./types.js";
2
- export class LogAdapter {
3
- flush(cb) {
4
- cb?.();
5
- }
6
- // biome-ignore lint/suspicious/noExplicitAny: Generic utility method needs flexible typing
7
- getLogLevels(options) {
8
- const { customOnly, customLevels } = options;
9
- if (customOnly) {
10
- return customLevels;
11
- }
12
- const levels = this.getUniqueLevels(LogLevels, customLevels);
13
- return Object.fromEntries(levels);
14
- }
15
- getUniqueLevels(defaultLevels, customLevels) {
16
- const defaultEntries = Object.entries(defaultLevels ?? {});
17
- const customEntries = Object.entries(customLevels ?? {});
18
- const defaultNotInCustom = defaultEntries.filter(([dk])=>customEntries.findIndex(([ck])=>ck === dk) === -1);
19
- const unique = defaultNotInCustom.concat(customEntries);
20
- return unique;
21
- }
22
- }
23
-
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci5hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7IExvZ0xldmVscywgdHlwZSBTY3JpYmVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJBZGFwdGVyIHtcblx0Y29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXHRnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHRmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9nQWRhcHRlciBpbXBsZW1lbnRzIExvZ2dlckFkYXB0ZXIge1xuXHRwdWJsaWMgYWJzdHJhY3QgY29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXG5cdHB1YmxpYyBmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjYj8uKCk7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEdlbmVyaWMgdXRpbGl0eSBtZXRob2QgbmVlZHMgZmxleGlibGUgdHlwaW5nXG5cdHByb3RlY3RlZCBnZXRMb2dMZXZlbHMob3B0aW9uczogU2NyaWJlT3B0aW9uczxhbnksIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcblx0XHRjb25zdCB7IGN1c3RvbU9ubHksIGN1c3RvbUxldmVscyB9ID0gb3B0aW9ucztcblx0XHRpZiAoY3VzdG9tT25seSkge1xuXHRcdFx0cmV0dXJuIGN1c3RvbUxldmVscztcblx0XHR9XG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5nZXRVbmlxdWVMZXZlbHMoTG9nTGV2ZWxzLCBjdXN0b21MZXZlbHMpO1xuXHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMobGV2ZWxzKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRVbmlxdWVMZXZlbHMoXG5cdFx0ZGVmYXVsdExldmVsczogUmVjb3JkPHN0cmluZywgbnVtYmVyPixcblx0XHRjdXN0b21MZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG5cdCkge1xuXHRcdGNvbnN0IGRlZmF1bHRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGVmYXVsdExldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgY3VzdG9tRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGN1c3RvbUxldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgZGVmYXVsdE5vdEluQ3VzdG9tID0gZGVmYXVsdEVudHJpZXMuZmlsdGVyKFxuXHRcdFx0KFtka10pID0+IGN1c3RvbUVudHJpZXMuZmluZEluZGV4KChbY2tdKSA9PiBjayA9PT0gZGspID09PSAtMSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdW5pcXVlID0gZGVmYXVsdE5vdEluQ3VzdG9tLmNvbmNhdChjdXN0b21FbnRyaWVzKTtcblx0XHRyZXR1cm4gdW5pcXVlO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTG9nTGV2ZWxzIiwiTG9nQWRhcHRlciIsImZsdXNoIiwiY2IiLCJnZXRMb2dMZXZlbHMiLCJvcHRpb25zIiwiY3VzdG9tT25seSIsImN1c3RvbUxldmVscyIsImxldmVscyIsImdldFVuaXF1ZUxldmVscyIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZGVmYXVsdExldmVscyIsImRlZmF1bHRFbnRyaWVzIiwiZW50cmllcyIsImN1c3RvbUVudHJpZXMiLCJkZWZhdWx0Tm90SW5DdXN0b20iLCJmaWx0ZXIiLCJkayIsImZpbmRJbmRleCIsImNrIiwidW5pcXVlIiwiY29uY2F0Il0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxTQUFTLFFBQTRCLGFBQWE7QUFZM0QsT0FBTyxNQUFlQztJQVNkQyxNQUFNQyxFQUFlLEVBQVE7UUFDbkNBO0lBQ0Q7SUFFQSwyRkFBMkY7SUFDakZDLGFBQWFDLE9BQWdDLEVBQTBCO1FBQ2hGLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxZQUFZLEVBQUUsR0FBR0Y7UUFDckMsSUFBSUMsWUFBWTtZQUNmLE9BQU9DO1FBQ1I7UUFDQSxNQUFNQyxTQUFTLElBQUksQ0FBQ0MsZUFBZSxDQUFDVCxXQUFXTztRQUMvQyxPQUFPRyxPQUFPQyxXQUFXLENBQUNIO0lBQzNCO0lBRVVDLGdCQUNURyxhQUFxQyxFQUNyQ0wsWUFBb0MsRUFDbkM7UUFDRCxNQUFNTSxpQkFBaUJILE9BQU9JLE9BQU8sQ0FBQ0YsaUJBQWlCLENBQUM7UUFDeEQsTUFBTUcsZ0JBQWdCTCxPQUFPSSxPQUFPLENBQUNQLGdCQUFnQixDQUFDO1FBQ3RELE1BQU1TLHFCQUFxQkgsZUFBZUksTUFBTSxDQUMvQyxDQUFDLENBQUNDLEdBQUcsR0FBS0gsY0FBY0ksU0FBUyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxHQUFLQSxPQUFPRixRQUFRLENBQUM7UUFHN0QsTUFBTUcsU0FBU0wsbUJBQW1CTSxNQUFNLENBQUNQO1FBQ3pDLE9BQU9NO0lBQ1I7QUFDRCJ9
@@ -1,69 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { ConsoleAdapter } from "../src/console.adapter.js";
3
- import { scribe } from "../src/logger.factory.js";
4
- describe("Console Adapter Custom Levels", ()=>{
5
- it("should support custom log levels", ()=>{
6
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
7
- const customLevels = {
8
- custom: 100,
9
- debug2: 25
10
- };
11
- // Use trace level so all custom levels (including debug2: 25) are enabled
12
- const loggerFactory = scribe.configure({
13
- adapter: new ConsoleAdapter(),
14
- options: {
15
- logLevel: "trace",
16
- customLevels
17
- }
18
- });
19
- const logger = loggerFactory("test");
20
- // Test custom level methods exist and work
21
- expect(typeof logger.custom).toBe("function");
22
- expect(typeof logger.debug2).toBe("function");
23
- logger.custom("Custom level message");
24
- logger.debug2("Debug2 level message");
25
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("CUSTOM [test]: Custom level message"));
26
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("DEBUG2 [test]: Debug2 level message"));
27
- spy.mockRestore();
28
- });
29
- it("should include custom levels in logLevels property", ()=>{
30
- const customLevels = {
31
- custom: 100,
32
- special: 15
33
- };
34
- const logger = scribe.logger("test", customLevels);
35
- const logLevels = logger.logLevels;
36
- // Should include default levels
37
- expect(logLevels.fatal).toBe(60);
38
- expect(logLevels.error).toBe(50);
39
- expect(logLevels.info).toBe(30);
40
- // Should include custom levels
41
- expect(logLevels.custom).toBe(100);
42
- expect(logLevels.special).toBe(15);
43
- });
44
- it("should work without custom levels (backwards compatibility)", ()=>{
45
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
46
- const logger = scribe.logger("test");
47
- logger.info("Regular message");
48
- logger.error("Error message");
49
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO [test]: Regular message"));
50
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR [test]: Error message"));
51
- spy.mockRestore();
52
- });
53
- it("should override default levels with custom levels", ()=>{
54
- const customLevels = {
55
- info: 999,
56
- newLevel: 50
57
- };
58
- const logger = scribe.logger("test", customLevels);
59
- const logLevels = logger.logLevels;
60
- // Custom level should override default
61
- expect(logLevels.info).toBe(999);
62
- expect(logLevels.newLevel).toBe(50);
63
- // Other defaults should remain
64
- expect(logLevels.fatal).toBe(60);
65
- expect(logLevels.error).toBe(50);
66
- });
67
- });
68
-
69
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvY29uc29sZS5hZGFwdGVyLmN1c3RvbS1sZXZlbHMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgeyBDb25zb2xlQWRhcHRlciB9IGZyb20gXCIuLi9zcmMvY29uc29sZS5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiLi4vc3JjL2xvZ2dlci5mYWN0b3J5LmpzXCI7XG5cbmRlc2NyaWJlKFwiQ29uc29sZSBBZGFwdGVyIEN1c3RvbSBMZXZlbHNcIiwgKCkgPT4ge1xuXHRpdChcInNob3VsZCBzdXBwb3J0IGN1c3RvbSBsb2cgbGV2ZWxzXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgY3VzdG9tTGV2ZWxzID0ge1xuXHRcdFx0Y3VzdG9tOiAxMDAsXG5cdFx0XHRkZWJ1ZzI6IDI1LFxuXHRcdH07XG5cblx0XHQvLyBVc2UgdHJhY2UgbGV2ZWwgc28gYWxsIGN1c3RvbSBsZXZlbHMgKGluY2x1ZGluZyBkZWJ1ZzI6IDI1KSBhcmUgZW5hYmxlZFxuXHRcdGNvbnN0IGxvZ2dlckZhY3RvcnkgPSBzY3JpYmUuY29uZmlndXJlKHtcblx0XHRcdGFkYXB0ZXI6IG5ldyBDb25zb2xlQWRhcHRlcigpLFxuXHRcdFx0b3B0aW9uczogeyBsb2dMZXZlbDogXCJ0cmFjZVwiLCBjdXN0b21MZXZlbHMgfSxcblx0XHR9KTtcblx0XHRjb25zdCBsb2dnZXIgPSBsb2dnZXJGYWN0b3J5KFwidGVzdFwiKTtcblxuXHRcdC8vIFRlc3QgY3VzdG9tIGxldmVsIG1ldGhvZHMgZXhpc3QgYW5kIHdvcmtcblx0XHRleHBlY3QodHlwZW9mIGxvZ2dlci5jdXN0b20pLnRvQmUoXCJmdW5jdGlvblwiKTtcblx0XHRleHBlY3QodHlwZW9mIGxvZ2dlci5kZWJ1ZzIpLnRvQmUoXCJmdW5jdGlvblwiKTtcblxuXHRcdGxvZ2dlci5jdXN0b20oXCJDdXN0b20gbGV2ZWwgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuZGVidWcyKFwiRGVidWcyIGxldmVsIG1lc3NhZ2VcIik7XG5cblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcblx0XHRcdGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiQ1VTVE9NIFt0ZXN0XTogQ3VzdG9tIGxldmVsIG1lc3NhZ2VcIiksXG5cdFx0KTtcblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcblx0XHRcdGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiREVCVUcyIFt0ZXN0XTogRGVidWcyIGxldmVsIG1lc3NhZ2VcIiksXG5cdFx0KTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcblxuXHRpdChcInNob3VsZCBpbmNsdWRlIGN1c3RvbSBsZXZlbHMgaW4gbG9nTGV2ZWxzIHByb3BlcnR5XCIsICgpID0+IHtcblx0XHRjb25zdCBjdXN0b21MZXZlbHMgPSB7XG5cdFx0XHRjdXN0b206IDEwMCxcblx0XHRcdHNwZWNpYWw6IDE1LFxuXHRcdH07XG5cblx0XHRjb25zdCBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFwidGVzdFwiLCBjdXN0b21MZXZlbHMpO1xuXG5cdFx0Y29uc3QgbG9nTGV2ZWxzID0gbG9nZ2VyLmxvZ0xldmVscztcblxuXHRcdC8vIFNob3VsZCBpbmNsdWRlIGRlZmF1bHQgbGV2ZWxzXG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5mYXRhbCkudG9CZSg2MCk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5lcnJvcikudG9CZSg1MCk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5pbmZvKS50b0JlKDMwKTtcblxuXHRcdC8vIFNob3VsZCBpbmNsdWRlIGN1c3RvbSBsZXZlbHNcblx0XHRleHBlY3QobG9nTGV2ZWxzLmN1c3RvbSkudG9CZSgxMDApO1xuXHRcdGV4cGVjdChsb2dMZXZlbHMuc3BlY2lhbCkudG9CZSgxNSk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHdvcmsgd2l0aG91dCBjdXN0b20gbGV2ZWxzIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IHNweSA9IHZpLnNweU9uKGNvbnNvbGUsIFwibG9nXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG5cblx0XHRjb25zdCBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFwidGVzdFwiKTtcblxuXHRcdGxvZ2dlci5pbmZvKFwiUmVndWxhciBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci5lcnJvcihcIkVycm9yIG1lc3NhZ2VcIik7XG5cblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIklORk8gW3Rlc3RdOiBSZWd1bGFyIG1lc3NhZ2VcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiRVJST1IgW3Rlc3RdOiBFcnJvciBtZXNzYWdlXCIpKTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcblxuXHRpdChcInNob3VsZCBvdmVycmlkZSBkZWZhdWx0IGxldmVscyB3aXRoIGN1c3RvbSBsZXZlbHNcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IGN1c3RvbUxldmVscyA9IHtcblx0XHRcdGluZm86IDk5OSwgLy8gT3ZlcnJpZGUgZGVmYXVsdCBpbmZvIGxldmVsXG5cdFx0XHRuZXdMZXZlbDogNTAsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxvZ2dlciA9IHNjcmliZS5sb2dnZXIoXCJ0ZXN0XCIsIGN1c3RvbUxldmVscyk7XG5cblx0XHRjb25zdCBsb2dMZXZlbHMgPSBsb2dnZXIubG9nTGV2ZWxzO1xuXG5cdFx0Ly8gQ3VzdG9tIGxldmVsIHNob3VsZCBvdmVycmlkZSBkZWZhdWx0XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5pbmZvKS50b0JlKDk5OSk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5uZXdMZXZlbCkudG9CZSg1MCk7XG5cblx0XHQvLyBPdGhlciBkZWZhdWx0cyBzaG91bGQgcmVtYWluXG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5mYXRhbCkudG9CZSg2MCk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5lcnJvcikudG9CZSg1MCk7XG5cdH0pO1xufSk7XG4iXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwiQ29uc29sZUFkYXB0ZXIiLCJzY3JpYmUiLCJzcHkiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJjdXN0b21MZXZlbHMiLCJjdXN0b20iLCJkZWJ1ZzIiLCJsb2dnZXJGYWN0b3J5IiwiY29uZmlndXJlIiwiYWRhcHRlciIsIm9wdGlvbnMiLCJsb2dMZXZlbCIsImxvZ2dlciIsInRvQmUiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInN0cmluZ0NvbnRhaW5pbmciLCJtb2NrUmVzdG9yZSIsInNwZWNpYWwiLCJsb2dMZXZlbHMiLCJmYXRhbCIsImVycm9yIiwiaW5mbyIsIm5ld0xldmVsIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUNsRCxTQUFTQyxjQUFjLFFBQVEsNEJBQTRCO0FBQzNELFNBQVNDLE1BQU0sUUFBUSwyQkFBMkI7QUFFbERMLFNBQVMsaUNBQWlDO0lBQ3pDRSxHQUFHLG9DQUFvQztRQUN0QyxNQUFNSSxNQUFNSCxHQUFHSSxLQUFLLENBQUNDLFNBQVMsT0FBT0Msa0JBQWtCLENBQUMsS0FBTztRQUUvRCxNQUFNQyxlQUFlO1lBQ3BCQyxRQUFRO1lBQ1JDLFFBQVE7UUFDVDtRQUVBLDBFQUEwRTtRQUMxRSxNQUFNQyxnQkFBZ0JSLE9BQU9TLFNBQVMsQ0FBQztZQUN0Q0MsU0FBUyxJQUFJWDtZQUNiWSxTQUFTO2dCQUFFQyxVQUFVO2dCQUFTUDtZQUFhO1FBQzVDO1FBQ0EsTUFBTVEsU0FBU0wsY0FBYztRQUU3QiwyQ0FBMkM7UUFDM0NaLE9BQU8sT0FBT2lCLE9BQU9QLE1BQU0sRUFBRVEsSUFBSSxDQUFDO1FBQ2xDbEIsT0FBTyxPQUFPaUIsT0FBT04sTUFBTSxFQUFFTyxJQUFJLENBQUM7UUFFbENELE9BQU9QLE1BQU0sQ0FBQztRQUNkTyxPQUFPTixNQUFNLENBQUM7UUFFZFgsT0FBT0ssS0FBS2Msb0JBQW9CLENBQy9CbkIsT0FBT29CLGdCQUFnQixDQUFDO1FBRXpCcEIsT0FBT0ssS0FBS2Msb0JBQW9CLENBQy9CbkIsT0FBT29CLGdCQUFnQixDQUFDO1FBR3pCZixJQUFJZ0IsV0FBVztJQUNoQjtJQUVBcEIsR0FBRyxzREFBc0Q7UUFDeEQsTUFBTVEsZUFBZTtZQUNwQkMsUUFBUTtZQUNSWSxTQUFTO1FBQ1Y7UUFFQSxNQUFNTCxTQUFTYixPQUFPYSxNQUFNLENBQUMsUUFBUVI7UUFFckMsTUFBTWMsWUFBWU4sT0FBT00sU0FBUztRQUVsQyxnQ0FBZ0M7UUFDaEN2QixPQUFPdUIsVUFBVUMsS0FBSyxFQUFFTixJQUFJLENBQUM7UUFDN0JsQixPQUFPdUIsVUFBVUUsS0FBSyxFQUFFUCxJQUFJLENBQUM7UUFDN0JsQixPQUFPdUIsVUFBVUcsSUFBSSxFQUFFUixJQUFJLENBQUM7UUFFNUIsK0JBQStCO1FBQy9CbEIsT0FBT3VCLFVBQVViLE1BQU0sRUFBRVEsSUFBSSxDQUFDO1FBQzlCbEIsT0FBT3VCLFVBQVVELE9BQU8sRUFBRUosSUFBSSxDQUFDO0lBQ2hDO0lBRUFqQixHQUFHLCtEQUErRDtRQUNqRSxNQUFNSSxNQUFNSCxHQUFHSSxLQUFLLENBQUNDLFNBQVMsT0FBT0Msa0JBQWtCLENBQUMsS0FBTztRQUUvRCxNQUFNUyxTQUFTYixPQUFPYSxNQUFNLENBQUM7UUFFN0JBLE9BQU9TLElBQUksQ0FBQztRQUNaVCxPQUFPUSxLQUFLLENBQUM7UUFFYnpCLE9BQU9LLEtBQUtjLG9CQUFvQixDQUFDbkIsT0FBT29CLGdCQUFnQixDQUFDO1FBQ3pEcEIsT0FBT0ssS0FBS2Msb0JBQW9CLENBQUNuQixPQUFPb0IsZ0JBQWdCLENBQUM7UUFFekRmLElBQUlnQixXQUFXO0lBQ2hCO0lBRUFwQixHQUFHLHFEQUFxRDtRQUN2RCxNQUFNUSxlQUFlO1lBQ3BCaUIsTUFBTTtZQUNOQyxVQUFVO1FBQ1g7UUFFQSxNQUFNVixTQUFTYixPQUFPYSxNQUFNLENBQUMsUUFBUVI7UUFFckMsTUFBTWMsWUFBWU4sT0FBT00sU0FBUztRQUVsQyx1Q0FBdUM7UUFDdkN2QixPQUFPdUIsVUFBVUcsSUFBSSxFQUFFUixJQUFJLENBQUM7UUFDNUJsQixPQUFPdUIsVUFBVUksUUFBUSxFQUFFVCxJQUFJLENBQUM7UUFFaEMsK0JBQStCO1FBQy9CbEIsT0FBT3VCLFVBQVVDLEtBQUssRUFBRU4sSUFBSSxDQUFDO1FBQzdCbEIsT0FBT3VCLFVBQVVFLEtBQUssRUFBRVAsSUFBSSxDQUFDO0lBQzlCO0FBQ0QifQ==
@@ -1,74 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { ConsoleAdapter } from "../src/console.adapter.js";
3
- import { scribe } from "../src/logger.factory.js";
4
- describe("Console Adapter", ()=>{
5
- it("should work without configuration", ()=>{
6
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
7
- const logger = scribe.logger("test");
8
- logger.info("Hello world");
9
- expect(spy).toHaveBeenCalledWith(expect.stringMatching(/\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z\] INFO \[test\]: Hello world/));
10
- spy.mockRestore();
11
- });
12
- it("should support all log levels when configured at trace", ()=>{
13
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
14
- const loggerFactory = scribe.configure({
15
- adapter: new ConsoleAdapter(),
16
- options: {
17
- logLevel: "trace"
18
- }
19
- });
20
- const logger = loggerFactory("test");
21
- logger.fatal("Fatal message");
22
- logger.error("Error message");
23
- logger.warn("Warning message");
24
- logger.info("Info message");
25
- logger.debug("Debug message");
26
- logger.trace("Trace message");
27
- expect(spy).toHaveBeenCalledTimes(6);
28
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("FATAL"));
29
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR"));
30
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("WARN"));
31
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO"));
32
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
33
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("TRACE"));
34
- spy.mockRestore();
35
- });
36
- it("should filter logs below the configured level", ()=>{
37
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
38
- const loggerFactory = scribe.configure({
39
- adapter: new ConsoleAdapter(),
40
- options: {
41
- logLevel: "warn"
42
- }
43
- });
44
- const logger = loggerFactory("test");
45
- logger.fatal("Fatal message");
46
- logger.error("Error message");
47
- logger.warn("Warning message");
48
- logger.info("Info message");
49
- logger.debug("Debug message");
50
- logger.trace("Trace message");
51
- // Only fatal (60), error (50), warn (40) are >= warn threshold (40)
52
- expect(spy).toHaveBeenCalledTimes(3);
53
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("FATAL"));
54
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR"));
55
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("WARN"));
56
- spy.mockRestore();
57
- });
58
- it("should have logger properties", ()=>{
59
- const loggerFactory = scribe.configure({
60
- adapter: new ConsoleAdapter(),
61
- options: {
62
- logLevel: "info"
63
- }
64
- });
65
- const logger = loggerFactory("test");
66
- expect(logger.currentLevel).toBe("info");
67
- expect(logger.logLevels).toBeDefined();
68
- expect(logger.isLevelEnabled("info")).toBe(true);
69
- expect(logger.isLevelEnabled("debug")).toBe(false);
70
- expect(logger.isLevelEnabled("warn")).toBe(true);
71
- });
72
- });
73
-
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvY29uc29sZS5hZGFwdGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuaW1wb3J0IHsgQ29uc29sZUFkYXB0ZXIgfSBmcm9tIFwiLi4vc3JjL2NvbnNvbGUuYWRhcHRlci5qc1wiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIi4uL3NyYy9sb2dnZXIuZmFjdG9yeS5qc1wiO1xuXG5kZXNjcmliZShcIkNvbnNvbGUgQWRhcHRlclwiLCAoKSA9PiB7XG5cdGl0KFwic2hvdWxkIHdvcmsgd2l0aG91dCBjb25maWd1cmF0aW9uXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcInRlc3RcIik7XG5cdFx0bG9nZ2VyLmluZm8oXCJIZWxsbyB3b3JsZFwiKTtcblxuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuXHRcdFx0ZXhwZWN0LnN0cmluZ01hdGNoaW5nKFxuXHRcdFx0XHQvXFxbXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aXFxdIElORk8gXFxbdGVzdFxcXTogSGVsbG8gd29ybGQvLFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHN1cHBvcnQgYWxsIGxvZyBsZXZlbHMgd2hlbiBjb25maWd1cmVkIGF0IHRyYWNlXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgbG9nZ2VyRmFjdG9yeSA9IHNjcmliZS5jb25maWd1cmUoe1xuXHRcdFx0YWRhcHRlcjogbmV3IENvbnNvbGVBZGFwdGVyKCksXG5cdFx0XHRvcHRpb25zOiB7IGxvZ0xldmVsOiBcInRyYWNlXCIgfSxcblx0XHR9KTtcblx0XHRjb25zdCBsb2dnZXIgPSBsb2dnZXJGYWN0b3J5KFwidGVzdFwiKTtcblxuXHRcdGxvZ2dlci5mYXRhbChcIkZhdGFsIG1lc3NhZ2VcIik7XG5cdFx0bG9nZ2VyLmVycm9yKFwiRXJyb3IgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIud2FybihcIldhcm5pbmcgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuaW5mbyhcIkluZm8gbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuZGVidWcoXCJEZWJ1ZyBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci50cmFjZShcIlRyYWNlIG1lc3NhZ2VcIik7XG5cblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoNik7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJGQVRBTFwiKSk7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJFUlJPUlwiKSk7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJXQVJOXCIpKTtcblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIklORk9cIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiREVCVUdcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiVFJBQ0VcIikpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIGZpbHRlciBsb2dzIGJlbG93IHRoZSBjb25maWd1cmVkIGxldmVsXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgbG9nZ2VyRmFjdG9yeSA9IHNjcmliZS5jb25maWd1cmUoe1xuXHRcdFx0YWRhcHRlcjogbmV3IENvbnNvbGVBZGFwdGVyKCksXG5cdFx0XHRvcHRpb25zOiB7IGxvZ0xldmVsOiBcIndhcm5cIiB9LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZhY3RvcnkoXCJ0ZXN0XCIpO1xuXG5cdFx0bG9nZ2VyLmZhdGFsKFwiRmF0YWwgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuZXJyb3IoXCJFcnJvciBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci53YXJuKFwiV2FybmluZyBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci5pbmZvKFwiSW5mbyBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci5kZWJ1ZyhcIkRlYnVnIG1lc3NhZ2VcIik7XG5cdFx0bG9nZ2VyLnRyYWNlKFwiVHJhY2UgbWVzc2FnZVwiKTtcblxuXHRcdC8vIE9ubHkgZmF0YWwgKDYwKSwgZXJyb3IgKDUwKSwgd2FybiAoNDApIGFyZSA+PSB3YXJuIHRocmVzaG9sZCAoNDApXG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDMpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiRkFUQUxcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiRVJST1JcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiV0FSTlwiKSk7XG5cblx0XHRzcHkubW9ja1Jlc3RvcmUoKTtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgaGF2ZSBsb2dnZXIgcHJvcGVydGllc1wiLCAoKSA9PiB7XG5cdFx0Y29uc3QgbG9nZ2VyRmFjdG9yeSA9IHNjcmliZS5jb25maWd1cmUoe1xuXHRcdFx0YWRhcHRlcjogbmV3IENvbnNvbGVBZGFwdGVyKCksXG5cdFx0XHRvcHRpb25zOiB7IGxvZ0xldmVsOiBcImluZm9cIiB9LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZhY3RvcnkoXCJ0ZXN0XCIpO1xuXG5cdFx0ZXhwZWN0KGxvZ2dlci5jdXJyZW50TGV2ZWwpLnRvQmUoXCJpbmZvXCIpO1xuXHRcdGV4cGVjdChsb2dnZXIubG9nTGV2ZWxzKS50b0JlRGVmaW5lZCgpO1xuXHRcdGV4cGVjdChsb2dnZXIuaXNMZXZlbEVuYWJsZWQoXCJpbmZvXCIpKS50b0JlKHRydWUpO1xuXHRcdGV4cGVjdChsb2dnZXIuaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKSkudG9CZShmYWxzZSk7XG5cdFx0ZXhwZWN0KGxvZ2dlci5pc0xldmVsRW5hYmxlZChcIndhcm5cIikpLnRvQmUodHJ1ZSk7XG5cdH0pO1xufSk7XG4iXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwiQ29uc29sZUFkYXB0ZXIiLCJzY3JpYmUiLCJzcHkiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJsb2dnZXIiLCJpbmZvIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJzdHJpbmdNYXRjaGluZyIsIm1vY2tSZXN0b3JlIiwibG9nZ2VyRmFjdG9yeSIsImNvbmZpZ3VyZSIsImFkYXB0ZXIiLCJvcHRpb25zIiwibG9nTGV2ZWwiLCJmYXRhbCIsImVycm9yIiwid2FybiIsImRlYnVnIiwidHJhY2UiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJzdHJpbmdDb250YWluaW5nIiwiY3VycmVudExldmVsIiwidG9CZSIsImxvZ0xldmVscyIsInRvQmVEZWZpbmVkIiwiaXNMZXZlbEVuYWJsZWQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsUUFBUSxTQUFTO0FBQ2xELFNBQVNDLGNBQWMsUUFBUSw0QkFBNEI7QUFDM0QsU0FBU0MsTUFBTSxRQUFRLDJCQUEyQjtBQUVsREwsU0FBUyxtQkFBbUI7SUFDM0JFLEdBQUcscUNBQXFDO1FBQ3ZDLE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1DLFNBQVNMLE9BQU9LLE1BQU0sQ0FBQztRQUM3QkEsT0FBT0MsSUFBSSxDQUFDO1FBRVpWLE9BQU9LLEtBQUtNLG9CQUFvQixDQUMvQlgsT0FBT1ksY0FBYyxDQUNwQjtRQUlGUCxJQUFJUSxXQUFXO0lBQ2hCO0lBRUFaLEdBQUcsMERBQTBEO1FBQzVELE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1NLGdCQUFnQlYsT0FBT1csU0FBUyxDQUFDO1lBQ3RDQyxTQUFTLElBQUliO1lBQ2JjLFNBQVM7Z0JBQUVDLFVBQVU7WUFBUTtRQUM5QjtRQUNBLE1BQU1ULFNBQVNLLGNBQWM7UUFFN0JMLE9BQU9VLEtBQUssQ0FBQztRQUNiVixPQUFPVyxLQUFLLENBQUM7UUFDYlgsT0FBT1ksSUFBSSxDQUFDO1FBQ1paLE9BQU9DLElBQUksQ0FBQztRQUNaRCxPQUFPYSxLQUFLLENBQUM7UUFDYmIsT0FBT2MsS0FBSyxDQUFDO1FBRWJ2QixPQUFPSyxLQUFLbUIscUJBQXFCLENBQUM7UUFDbEN4QixPQUFPSyxLQUFLTSxvQkFBb0IsQ0FBQ1gsT0FBT3lCLGdCQUFnQixDQUFDO1FBQ3pEekIsT0FBT0ssS0FBS00sb0JBQW9CLENBQUNYLE9BQU95QixnQkFBZ0IsQ0FBQztRQUN6RHpCLE9BQU9LLEtBQUtNLG9CQUFvQixDQUFDWCxPQUFPeUIsZ0JBQWdCLENBQUM7UUFDekR6QixPQUFPSyxLQUFLTSxvQkFBb0IsQ0FBQ1gsT0FBT3lCLGdCQUFnQixDQUFDO1FBQ3pEekIsT0FBT0ssS0FBS00sb0JBQW9CLENBQUNYLE9BQU95QixnQkFBZ0IsQ0FBQztRQUN6RHpCLE9BQU9LLEtBQUtNLG9CQUFvQixDQUFDWCxPQUFPeUIsZ0JBQWdCLENBQUM7UUFFekRwQixJQUFJUSxXQUFXO0lBQ2hCO0lBRUFaLEdBQUcsaURBQWlEO1FBQ25ELE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1NLGdCQUFnQlYsT0FBT1csU0FBUyxDQUFDO1lBQ3RDQyxTQUFTLElBQUliO1lBQ2JjLFNBQVM7Z0JBQUVDLFVBQVU7WUFBTztRQUM3QjtRQUNBLE1BQU1ULFNBQVNLLGNBQWM7UUFFN0JMLE9BQU9VLEtBQUssQ0FBQztRQUNiVixPQUFPVyxLQUFLLENBQUM7UUFDYlgsT0FBT1ksSUFBSSxDQUFDO1FBQ1paLE9BQU9DLElBQUksQ0FBQztRQUNaRCxPQUFPYSxLQUFLLENBQUM7UUFDYmIsT0FBT2MsS0FBSyxDQUFDO1FBRWIsb0VBQW9FO1FBQ3BFdkIsT0FBT0ssS0FBS21CLHFCQUFxQixDQUFDO1FBQ2xDeEIsT0FBT0ssS0FBS00sb0JBQW9CLENBQUNYLE9BQU95QixnQkFBZ0IsQ0FBQztRQUN6RHpCLE9BQU9LLEtBQUtNLG9CQUFvQixDQUFDWCxPQUFPeUIsZ0JBQWdCLENBQUM7UUFDekR6QixPQUFPSyxLQUFLTSxvQkFBb0IsQ0FBQ1gsT0FBT3lCLGdCQUFnQixDQUFDO1FBRXpEcEIsSUFBSVEsV0FBVztJQUNoQjtJQUVBWixHQUFHLGlDQUFpQztRQUNuQyxNQUFNYSxnQkFBZ0JWLE9BQU9XLFNBQVMsQ0FBQztZQUN0Q0MsU0FBUyxJQUFJYjtZQUNiYyxTQUFTO2dCQUFFQyxVQUFVO1lBQU87UUFDN0I7UUFDQSxNQUFNVCxTQUFTSyxjQUFjO1FBRTdCZCxPQUFPUyxPQUFPaUIsWUFBWSxFQUFFQyxJQUFJLENBQUM7UUFDakMzQixPQUFPUyxPQUFPbUIsU0FBUyxFQUFFQyxXQUFXO1FBQ3BDN0IsT0FBT1MsT0FBT3FCLGNBQWMsQ0FBQyxTQUFTSCxJQUFJLENBQUM7UUFDM0MzQixPQUFPUyxPQUFPcUIsY0FBYyxDQUFDLFVBQVVILElBQUksQ0FBQztRQUM1QzNCLE9BQU9TLE9BQU9xQixjQUFjLENBQUMsU0FBU0gsSUFBSSxDQUFDO0lBQzVDO0FBQ0QifQ==
package/tests/env.spec.js DELETED
@@ -1,187 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- import { ConsoleAdapter } from "../src/console.adapter.js";
3
- import { getLogLevelFromArgv, getLogLevelFromEnv, isValidLogLevel, resolveLogLevel } from "../src/env.js";
4
- import { scribe } from "../src/logger.factory.js";
5
- describe("getLogLevelFromArgv", ()=>{
6
- it("reads long-form flag with separate value", ()=>{
7
- expect(getLogLevelFromArgv([
8
- "node",
9
- "cli.js",
10
- "--log-level",
11
- "trace"
12
- ])).toBe("trace");
13
- });
14
- it("reads short-form flag with separate value", ()=>{
15
- expect(getLogLevelFromArgv([
16
- "node",
17
- "cli.js",
18
- "-l",
19
- "debug"
20
- ])).toBe("debug");
21
- });
22
- it("reads equals-form flag", ()=>{
23
- expect(getLogLevelFromArgv([
24
- "node",
25
- "cli.js",
26
- "--log-level=warn"
27
- ])).toBe("warn");
28
- });
29
- it("returns undefined when flag is absent", ()=>{
30
- expect(getLogLevelFromArgv([
31
- "node",
32
- "cli.js",
33
- "build"
34
- ])).toBeUndefined();
35
- });
36
- });
37
- describe("getLogLevelFromEnv", ()=>{
38
- beforeEach(()=>{
39
- vi.stubEnv("LOG_LEVEL", undefined);
40
- vi.stubEnv("SCRIBE_LOG_LEVEL", undefined);
41
- vi.stubEnv("LOGGING_LEVEL", undefined);
42
- });
43
- afterEach(()=>{
44
- vi.unstubAllEnvs();
45
- });
46
- it("returns null when no env vars are set", ()=>{
47
- expect(getLogLevelFromEnv()).toBeNull();
48
- });
49
- it("reads LOG_LEVEL", ()=>{
50
- vi.stubEnv("LOG_LEVEL", "debug");
51
- expect(getLogLevelFromEnv()).toBe("debug");
52
- });
53
- it("reads SCRIBE_LOG_LEVEL", ()=>{
54
- vi.stubEnv("SCRIBE_LOG_LEVEL", "warn");
55
- expect(getLogLevelFromEnv()).toBe("warn");
56
- });
57
- it("reads LOGGING_LEVEL", ()=>{
58
- vi.stubEnv("LOGGING_LEVEL", "error");
59
- expect(getLogLevelFromEnv()).toBe("error");
60
- });
61
- it("LOG_LEVEL takes precedence over SCRIBE_LOG_LEVEL", ()=>{
62
- vi.stubEnv("LOG_LEVEL", "fatal");
63
- vi.stubEnv("SCRIBE_LOG_LEVEL", "trace");
64
- expect(getLogLevelFromEnv()).toBe("fatal");
65
- });
66
- it("SCRIBE_LOG_LEVEL takes precedence over LOGGING_LEVEL", ()=>{
67
- vi.stubEnv("SCRIBE_LOG_LEVEL", "debug");
68
- vi.stubEnv("LOGGING_LEVEL", "error");
69
- expect(getLogLevelFromEnv()).toBe("debug");
70
- });
71
- it("normalises to lowercase", ()=>{
72
- vi.stubEnv("LOG_LEVEL", "DEBUG");
73
- expect(getLogLevelFromEnv()).toBe("debug");
74
- });
75
- it("trims whitespace", ()=>{
76
- vi.stubEnv("LOG_LEVEL", " info ");
77
- expect(getLogLevelFromEnv()).toBe("info");
78
- });
79
- it("treats empty string as not set and falls through to next var", ()=>{
80
- vi.stubEnv("LOG_LEVEL", "");
81
- vi.stubEnv("SCRIBE_LOG_LEVEL", "warn");
82
- expect(getLogLevelFromEnv()).toBe("warn");
83
- });
84
- it("returns null when all vars are empty", ()=>{
85
- vi.stubEnv("LOG_LEVEL", "");
86
- vi.stubEnv("SCRIBE_LOG_LEVEL", "");
87
- vi.stubEnv("LOGGING_LEVEL", "");
88
- expect(getLogLevelFromEnv()).toBeNull();
89
- });
90
- });
91
- describe("isValidLogLevel", ()=>{
92
- it.each([
93
- "fatal",
94
- "error",
95
- "warn",
96
- "info",
97
- "debug",
98
- "trace"
99
- ])("returns true for valid level '%s'", (level)=>{
100
- expect(isValidLogLevel(level)).toBe(true);
101
- });
102
- it("returns false for unknown level", ()=>{
103
- expect(isValidLogLevel("verbose")).toBe(false);
104
- });
105
- it("returns false for empty string", ()=>{
106
- expect(isValidLogLevel("")).toBe(false);
107
- });
108
- });
109
- describe("resolveLogLevel", ()=>{
110
- beforeEach(()=>{
111
- vi.stubEnv("LOG_LEVEL", undefined);
112
- vi.stubEnv("SCRIBE_LOG_LEVEL", undefined);
113
- vi.stubEnv("LOGGING_LEVEL", undefined);
114
- });
115
- afterEach(()=>{
116
- vi.unstubAllEnvs();
117
- });
118
- it("uses explicit log level when valid", ()=>{
119
- expect(resolveLogLevel("debug")).toBe("debug");
120
- });
121
- it("uses env log level when explicit is missing", ()=>{
122
- vi.stubEnv("LOG_LEVEL", "warn");
123
- expect(resolveLogLevel()).toBe("warn");
124
- });
125
- it("returns null when explicit and env are invalid using simple form", ()=>{
126
- vi.stubEnv("LOG_LEVEL", "verbose");
127
- expect(resolveLogLevel("nope")).toBeNull();
128
- });
129
- it("falls back to default when explicit and env are invalid using object form", ()=>{
130
- expect(resolveLogLevel({
131
- explicitLogLevel: "verbose",
132
- envLogLevel: "nope",
133
- defaultLogLevel: "info"
134
- })).toBe("info");
135
- });
136
- });
137
- describe("scribe logger factory — env var log level", ()=>{
138
- beforeEach(()=>{
139
- vi.stubEnv("LOG_LEVEL", undefined);
140
- vi.stubEnv("SCRIBE_LOG_LEVEL", undefined);
141
- vi.stubEnv("LOGGING_LEVEL", undefined);
142
- });
143
- afterEach(()=>{
144
- vi.unstubAllEnvs();
145
- });
146
- it("falls back to 'info' when no env var and no explicit logLevel", ()=>{
147
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
148
- const loggerFn = scribe.configure({
149
- adapter: new ConsoleAdapter()
150
- });
151
- const logger = loggerFn("env-test");
152
- logger.debug("should not appear");
153
- expect(spy).not.toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
154
- logger.info("should appear");
155
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO"));
156
- spy.mockRestore();
157
- });
158
- it("uses SCRIBE_LOG_LEVEL env var when no explicit logLevel", ()=>{
159
- vi.stubEnv("SCRIBE_LOG_LEVEL", "debug");
160
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
161
- const loggerFn = scribe.configure({
162
- adapter: new ConsoleAdapter()
163
- });
164
- const logger = loggerFn("env-debug-test");
165
- logger.debug("should appear via env var");
166
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
167
- spy.mockRestore();
168
- });
169
- it("explicit logLevel overrides env var", ()=>{
170
- vi.stubEnv("SCRIBE_LOG_LEVEL", "debug");
171
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
172
- const loggerFn = scribe.configure({
173
- adapter: new ConsoleAdapter(),
174
- options: {
175
- logLevel: "error"
176
- }
177
- });
178
- const logger = loggerFn("explicit-override-test");
179
- logger.debug("should NOT appear");
180
- expect(spy).not.toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
181
- logger.error("should appear");
182
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR"));
183
- spy.mockRestore();
184
- });
185
- });
186
-
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvZW52LnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWZ0ZXJFYWNoLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgeyBDb25zb2xlQWRhcHRlciB9IGZyb20gXCIuLi9zcmMvY29uc29sZS5hZGFwdGVyLmpzXCI7XG5pbXBvcnQge1xuXHRnZXRMb2dMZXZlbEZyb21Bcmd2LFxuXHRnZXRMb2dMZXZlbEZyb21FbnYsXG5cdGlzVmFsaWRMb2dMZXZlbCxcblx0cmVzb2x2ZUxvZ0xldmVsLFxufSBmcm9tIFwiLi4vc3JjL2Vudi5qc1wiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIi4uL3NyYy9sb2dnZXIuZmFjdG9yeS5qc1wiO1xuXG5kZXNjcmliZShcImdldExvZ0xldmVsRnJvbUFyZ3ZcIiwgKCkgPT4ge1xuXHRpdChcInJlYWRzIGxvbmctZm9ybSBmbGFnIHdpdGggc2VwYXJhdGUgdmFsdWVcIiwgKCkgPT4ge1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21Bcmd2KFtcIm5vZGVcIiwgXCJjbGkuanNcIiwgXCItLWxvZy1sZXZlbFwiLCBcInRyYWNlXCJdKSkudG9CZShcInRyYWNlXCIpO1xuXHR9KTtcblxuXHRpdChcInJlYWRzIHNob3J0LWZvcm0gZmxhZyB3aXRoIHNlcGFyYXRlIHZhbHVlXCIsICgpID0+IHtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tQXJndihbXCJub2RlXCIsIFwiY2xpLmpzXCIsIFwiLWxcIiwgXCJkZWJ1Z1wiXSkpLnRvQmUoXCJkZWJ1Z1wiKTtcblx0fSk7XG5cblx0aXQoXCJyZWFkcyBlcXVhbHMtZm9ybSBmbGFnXCIsICgpID0+IHtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tQXJndihbXCJub2RlXCIsIFwiY2xpLmpzXCIsIFwiLS1sb2ctbGV2ZWw9d2FyblwiXSkpLnRvQmUoXCJ3YXJuXCIpO1xuXHR9KTtcblxuXHRpdChcInJldHVybnMgdW5kZWZpbmVkIHdoZW4gZmxhZyBpcyBhYnNlbnRcIiwgKCkgPT4ge1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21Bcmd2KFtcIm5vZGVcIiwgXCJjbGkuanNcIiwgXCJidWlsZFwiXSkpLnRvQmVVbmRlZmluZWQoKTtcblx0fSk7XG59KTtcblxuZGVzY3JpYmUoXCJnZXRMb2dMZXZlbEZyb21FbnZcIiwgKCkgPT4ge1xuXHRiZWZvcmVFYWNoKCgpID0+IHtcblx0XHR2aS5zdHViRW52KFwiTE9HX0xFVkVMXCIsIHVuZGVmaW5lZCk7XG5cdFx0dmkuc3R1YkVudihcIlNDUklCRV9MT0dfTEVWRUxcIiwgdW5kZWZpbmVkKTtcblx0XHR2aS5zdHViRW52KFwiTE9HR0lOR19MRVZFTFwiLCB1bmRlZmluZWQpO1xuXHR9KTtcblxuXHRhZnRlckVhY2goKCkgPT4ge1xuXHRcdHZpLnVuc3R1YkFsbEVudnMoKTtcblx0fSk7XG5cblx0aXQoXCJyZXR1cm5zIG51bGwgd2hlbiBubyBlbnYgdmFycyBhcmUgc2V0XCIsICgpID0+IHtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmVOdWxsKCk7XG5cdH0pO1xuXG5cdGl0KFwicmVhZHMgTE9HX0xFVkVMXCIsICgpID0+IHtcblx0XHR2aS5zdHViRW52KFwiTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0ZXhwZWN0KGdldExvZ0xldmVsRnJvbUVudigpKS50b0JlKFwiZGVidWdcIik7XG5cdH0pO1xuXG5cdGl0KFwicmVhZHMgU0NSSUJFX0xPR19MRVZFTFwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIlNDUklCRV9MT0dfTEVWRUxcIiwgXCJ3YXJuXCIpO1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21FbnYoKSkudG9CZShcIndhcm5cIik7XG5cdH0pO1xuXG5cdGl0KFwicmVhZHMgTE9HR0lOR19MRVZFTFwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgXCJlcnJvclwiKTtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmUoXCJlcnJvclwiKTtcblx0fSk7XG5cblx0aXQoXCJMT0dfTEVWRUwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFNDUklCRV9MT0dfTEVWRUxcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJMT0dfTEVWRUxcIiwgXCJmYXRhbFwiKTtcblx0XHR2aS5zdHViRW52KFwiU0NSSUJFX0xPR19MRVZFTFwiLCBcInRyYWNlXCIpO1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21FbnYoKSkudG9CZShcImZhdGFsXCIpO1xuXHR9KTtcblxuXHRpdChcIlNDUklCRV9MT0dfTEVWRUwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIExPR0dJTkdfTEVWRUxcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgXCJlcnJvclwiKTtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmUoXCJkZWJ1Z1wiKTtcblx0fSk7XG5cblx0aXQoXCJub3JtYWxpc2VzIHRvIGxvd2VyY2FzZVwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCBcIkRFQlVHXCIpO1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21FbnYoKSkudG9CZShcImRlYnVnXCIpO1xuXHR9KTtcblxuXHRpdChcInRyaW1zIHdoaXRlc3BhY2VcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJMT0dfTEVWRUxcIiwgXCIgIGluZm8gIFwiKTtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmUoXCJpbmZvXCIpO1xuXHR9KTtcblxuXHRpdChcInRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgbm90IHNldCBhbmQgZmFsbHMgdGhyb3VnaCB0byBuZXh0IHZhclwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCBcIlwiKTtcblx0XHR2aS5zdHViRW52KFwiU0NSSUJFX0xPR19MRVZFTFwiLCBcIndhcm5cIik7XG5cdFx0ZXhwZWN0KGdldExvZ0xldmVsRnJvbUVudigpKS50b0JlKFwid2FyblwiKTtcblx0fSk7XG5cblx0aXQoXCJyZXR1cm5zIG51bGwgd2hlbiBhbGwgdmFycyBhcmUgZW1wdHlcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJMT0dfTEVWRUxcIiwgXCJcIik7XG5cdFx0dmkuc3R1YkVudihcIlNDUklCRV9MT0dfTEVWRUxcIiwgXCJcIik7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgXCJcIik7XG5cdFx0ZXhwZWN0KGdldExvZ0xldmVsRnJvbUVudigpKS50b0JlTnVsbCgpO1xuXHR9KTtcbn0pO1xuXG5kZXNjcmliZShcImlzVmFsaWRMb2dMZXZlbFwiLCAoKSA9PiB7XG5cdGl0LmVhY2goW1xuXHRcdFwiZmF0YWxcIixcblx0XHRcImVycm9yXCIsXG5cdFx0XCJ3YXJuXCIsXG5cdFx0XCJpbmZvXCIsXG5cdFx0XCJkZWJ1Z1wiLFxuXHRcdFwidHJhY2VcIixcblx0XSkoXCJyZXR1cm5zIHRydWUgZm9yIHZhbGlkIGxldmVsICclcydcIiwgKGxldmVsKSA9PiB7XG5cdFx0ZXhwZWN0KGlzVmFsaWRMb2dMZXZlbChsZXZlbCkpLnRvQmUodHJ1ZSk7XG5cdH0pO1xuXG5cdGl0KFwicmV0dXJucyBmYWxzZSBmb3IgdW5rbm93biBsZXZlbFwiLCAoKSA9PiB7XG5cdFx0ZXhwZWN0KGlzVmFsaWRMb2dMZXZlbChcInZlcmJvc2VcIikpLnRvQmUoZmFsc2UpO1xuXHR9KTtcblxuXHRpdChcInJldHVybnMgZmFsc2UgZm9yIGVtcHR5IHN0cmluZ1wiLCAoKSA9PiB7XG5cdFx0ZXhwZWN0KGlzVmFsaWRMb2dMZXZlbChcIlwiKSkudG9CZShmYWxzZSk7XG5cdH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicmVzb2x2ZUxvZ0xldmVsXCIsICgpID0+IHtcblx0YmVmb3JlRWFjaCgoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCB1bmRlZmluZWQpO1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIHVuZGVmaW5lZCk7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgdW5kZWZpbmVkKTtcblx0fSk7XG5cblx0YWZ0ZXJFYWNoKCgpID0+IHtcblx0XHR2aS51bnN0dWJBbGxFbnZzKCk7XG5cdH0pO1xuXG5cdGl0KFwidXNlcyBleHBsaWNpdCBsb2cgbGV2ZWwgd2hlbiB2YWxpZFwiLCAoKSA9PiB7XG5cdFx0ZXhwZWN0KHJlc29sdmVMb2dMZXZlbChcImRlYnVnXCIpKS50b0JlKFwiZGVidWdcIik7XG5cdH0pO1xuXG5cdGl0KFwidXNlcyBlbnYgbG9nIGxldmVsIHdoZW4gZXhwbGljaXQgaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCBcIndhcm5cIik7XG5cdFx0ZXhwZWN0KHJlc29sdmVMb2dMZXZlbCgpKS50b0JlKFwid2FyblwiKTtcblx0fSk7XG5cblx0aXQoXCJyZXR1cm5zIG51bGwgd2hlbiBleHBsaWNpdCBhbmQgZW52IGFyZSBpbnZhbGlkIHVzaW5nIHNpbXBsZSBmb3JtXCIsICgpID0+IHtcblx0XHR2aS5zdHViRW52KFwiTE9HX0xFVkVMXCIsIFwidmVyYm9zZVwiKTtcblx0XHRleHBlY3QocmVzb2x2ZUxvZ0xldmVsKFwibm9wZVwiKSkudG9CZU51bGwoKTtcblx0fSk7XG5cblx0aXQoXCJmYWxscyBiYWNrIHRvIGRlZmF1bHQgd2hlbiBleHBsaWNpdCBhbmQgZW52IGFyZSBpbnZhbGlkIHVzaW5nIG9iamVjdCBmb3JtXCIsICgpID0+IHtcblx0XHRleHBlY3QoXG5cdFx0XHRyZXNvbHZlTG9nTGV2ZWwoe1xuXHRcdFx0XHRleHBsaWNpdExvZ0xldmVsOiBcInZlcmJvc2VcIixcblx0XHRcdFx0ZW52TG9nTGV2ZWw6IFwibm9wZVwiLFxuXHRcdFx0XHRkZWZhdWx0TG9nTGV2ZWw6IFwiaW5mb1wiLFxuXHRcdFx0fSksXG5cdFx0KS50b0JlKFwiaW5mb1wiKTtcblx0fSk7XG59KTtcblxuZGVzY3JpYmUoXCJzY3JpYmUgbG9nZ2VyIGZhY3Rvcnkg4oCUIGVudiB2YXIgbG9nIGxldmVsXCIsICgpID0+IHtcblx0YmVmb3JlRWFjaCgoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCB1bmRlZmluZWQpO1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIHVuZGVmaW5lZCk7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgdW5kZWZpbmVkKTtcblx0fSk7XG5cblx0YWZ0ZXJFYWNoKCgpID0+IHtcblx0XHR2aS51bnN0dWJBbGxFbnZzKCk7XG5cdH0pO1xuXG5cdGl0KFwiZmFsbHMgYmFjayB0byAnaW5mbycgd2hlbiBubyBlbnYgdmFyIGFuZCBubyBleHBsaWNpdCBsb2dMZXZlbFwiLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7IGFkYXB0ZXI6IG5ldyBDb25zb2xlQWRhcHRlcigpIH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiZW52LXRlc3RcIik7XG5cblx0XHRsb2dnZXIuZGVidWcoXCJzaG91bGQgbm90IGFwcGVhclwiKTtcblx0XHRleHBlY3Qoc3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJERUJVR1wiKSk7XG5cblx0XHRsb2dnZXIuaW5mbyhcInNob3VsZCBhcHBlYXJcIik7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJJTkZPXCIpKTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcblxuXHRpdChcInVzZXMgU0NSSUJFX0xPR19MRVZFTCBlbnYgdmFyIHdoZW4gbm8gZXhwbGljaXQgbG9nTGV2ZWxcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7IGFkYXB0ZXI6IG5ldyBDb25zb2xlQWRhcHRlcigpIH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiZW52LWRlYnVnLXRlc3RcIik7XG5cblx0XHRsb2dnZXIuZGVidWcoXCJzaG91bGQgYXBwZWFyIHZpYSBlbnYgdmFyXCIpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiREVCVUdcIikpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwiZXhwbGljaXQgbG9nTGV2ZWwgb3ZlcnJpZGVzIGVudiB2YXJcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7XG5cdFx0XHRhZGFwdGVyOiBuZXcgQ29uc29sZUFkYXB0ZXIoKSxcblx0XHRcdG9wdGlvbnM6IHsgbG9nTGV2ZWw6IFwiZXJyb3JcIiB9LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiZXhwbGljaXQtb3ZlcnJpZGUtdGVzdFwiKTtcblxuXHRcdGxvZ2dlci5kZWJ1ZyhcInNob3VsZCBOT1QgYXBwZWFyXCIpO1xuXHRcdGV4cGVjdChzcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIkRFQlVHXCIpKTtcblxuXHRcdGxvZ2dlci5lcnJvcihcInNob3VsZCBhcHBlYXJcIik7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJFUlJPUlwiKSk7XG5cblx0XHRzcHkubW9ja1Jlc3RvcmUoKTtcblx0fSk7XG59KTtcbiJdLCJuYW1lcyI6WyJhZnRlckVhY2giLCJiZWZvcmVFYWNoIiwiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwiQ29uc29sZUFkYXB0ZXIiLCJnZXRMb2dMZXZlbEZyb21Bcmd2IiwiZ2V0TG9nTGV2ZWxGcm9tRW52IiwiaXNWYWxpZExvZ0xldmVsIiwicmVzb2x2ZUxvZ0xldmVsIiwic2NyaWJlIiwidG9CZSIsInRvQmVVbmRlZmluZWQiLCJzdHViRW52IiwidW5kZWZpbmVkIiwidW5zdHViQWxsRW52cyIsInRvQmVOdWxsIiwiZWFjaCIsImxldmVsIiwiZXhwbGljaXRMb2dMZXZlbCIsImVudkxvZ0xldmVsIiwiZGVmYXVsdExvZ0xldmVsIiwic3B5Iiwic3B5T24iLCJjb25zb2xlIiwibW9ja0ltcGxlbWVudGF0aW9uIiwibG9nZ2VyRm4iLCJjb25maWd1cmUiLCJhZGFwdGVyIiwibG9nZ2VyIiwiZGVidWciLCJub3QiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInN0cmluZ0NvbnRhaW5pbmciLCJpbmZvIiwibW9ja1Jlc3RvcmUiLCJvcHRpb25zIiwibG9nTGV2ZWwiLCJlcnJvciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxFQUFFLEVB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
@@ -1,36 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- import { ConsoleAdapter } from "../src/console.adapter.js";
3
- import { scribe } from "../src/logger.factory.js";
4
- describe("Logger Factory with Default Adapter", ()=>{
5
- it("should use console adapter by default", ()=>{
6
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
7
- // No configuration needed
8
- const logger = scribe.logger("default-test");
9
- logger.info("This should work");
10
- expect(spy).toHaveBeenCalled();
11
- spy.mockRestore();
12
- });
13
- it("should allow configuring a different adapter", ()=>{
14
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
15
- // Configure with explicit console adapter
16
- const loggerFn = scribe.configure({
17
- adapter: new ConsoleAdapter()
18
- });
19
- const logger = loggerFn("configured-test");
20
- logger.warn("Configured message");
21
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("WARN [configured-test]: Configured message"));
22
- spy.mockRestore();
23
- });
24
- it("should work for multiple logger instances", ()=>{
25
- const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
26
- const logger1 = scribe.logger("service1");
27
- const logger2 = scribe.logger("service2");
28
- logger1.info("Message from service1");
29
- logger2.error("Message from service2");
30
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO [service1]: Message from service1"));
31
- expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR [service2]: Message from service2"));
32
- spy.mockRestore();
33
- });
34
- });
35
-
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvbG9nZ2VyLmZhY3RvcnkuZGVmYXVsdC5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB7IENvbnNvbGVBZGFwdGVyIH0gZnJvbSBcIi4uL3NyYy9jb25zb2xlLmFkYXB0ZXIuanNcIjtcbmltcG9ydCB7IHNjcmliZSB9IGZyb20gXCIuLi9zcmMvbG9nZ2VyLmZhY3RvcnkuanNcIjtcblxuZGVzY3JpYmUoXCJMb2dnZXIgRmFjdG9yeSB3aXRoIERlZmF1bHQgQWRhcHRlclwiLCAoKSA9PiB7XG5cdGl0KFwic2hvdWxkIHVzZSBjb25zb2xlIGFkYXB0ZXIgYnkgZGVmYXVsdFwiLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdC8vIE5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkXG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcImRlZmF1bHQtdGVzdFwiKTtcblxuXHRcdGxvZ2dlci5pbmZvKFwiVGhpcyBzaG91bGQgd29ya1wiKTtcblxuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcblx0XHRzcHkubW9ja1Jlc3RvcmUoKTtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgYWxsb3cgY29uZmlndXJpbmcgYSBkaWZmZXJlbnQgYWRhcHRlclwiLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdC8vIENvbmZpZ3VyZSB3aXRoIGV4cGxpY2l0IGNvbnNvbGUgYWRhcHRlclxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7XG5cdFx0XHRhZGFwdGVyOiBuZXcgQ29uc29sZUFkYXB0ZXIoKSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiY29uZmlndXJlZC10ZXN0XCIpO1xuXHRcdGxvZ2dlci53YXJuKFwiQ29uZmlndXJlZCBtZXNzYWdlXCIpO1xuXG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG5cdFx0XHRleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIldBUk4gW2NvbmZpZ3VyZWQtdGVzdF06IENvbmZpZ3VyZWQgbWVzc2FnZVwiKSxcblx0XHQpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHdvcmsgZm9yIG11bHRpcGxlIGxvZ2dlciBpbnN0YW5jZXNcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IHNweSA9IHZpLnNweU9uKGNvbnNvbGUsIFwibG9nXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG5cblx0XHRjb25zdCBsb2dnZXIxID0gc2NyaWJlLmxvZ2dlcihcInNlcnZpY2UxXCIpO1xuXHRcdGNvbnN0IGxvZ2dlcjIgPSBzY3JpYmUubG9nZ2VyKFwic2VydmljZTJcIik7XG5cblx0XHRsb2dnZXIxLmluZm8oXCJNZXNzYWdlIGZyb20gc2VydmljZTFcIik7XG5cdFx0bG9nZ2VyMi5lcnJvcihcIk1lc3NhZ2UgZnJvbSBzZXJ2aWNlMlwiKTtcblxuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuXHRcdFx0ZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJJTkZPIFtzZXJ2aWNlMV06IE1lc3NhZ2UgZnJvbSBzZXJ2aWNlMVwiKSxcblx0XHQpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuXHRcdFx0ZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJFUlJPUiBbc2VydmljZTJdOiBNZXNzYWdlIGZyb20gc2VydmljZTJcIiksXG5cdFx0KTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcbn0pO1xuIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiZXhwZWN0IiwiaXQiLCJ2aSIsIkNvbnNvbGVBZGFwdGVyIiwic2NyaWJlIiwic3B5Iiwic3B5T24iLCJjb25zb2xlIiwibW9ja0ltcGxlbWVudGF0aW9uIiwibG9nZ2VyIiwiaW5mbyIsInRvSGF2ZUJlZW5DYWxsZWQiLCJtb2NrUmVzdG9yZSIsImxvZ2dlckZuIiwiY29uZmlndXJlIiwiYWRhcHRlciIsIndhcm4iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInN0cmluZ0NvbnRhaW5pbmciLCJsb2dnZXIxIiwibG9nZ2VyMiIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUNsRCxTQUFTQyxjQUFjLFFBQVEsNEJBQTRCO0FBQzNELFNBQVNDLE1BQU0sUUFBUSwyQkFBMkI7QUFFbERMLFNBQVMsdUNBQXVDO0lBQy9DRSxHQUFHLHlDQUF5QztRQUMzQyxNQUFNSSxNQUFNSCxHQUFHSSxLQUFLLENBQUNDLFNBQVMsT0FBT0Msa0JBQWtCLENBQUMsS0FBTztRQUUvRCwwQkFBMEI7UUFDMUIsTUFBTUMsU0FBU0wsT0FBT0ssTUFBTSxDQUFDO1FBRTdCQSxPQUFPQyxJQUFJLENBQUM7UUFFWlYsT0FBT0ssS0FBS00sZ0JBQWdCO1FBQzVCTixJQUFJTyxXQUFXO0lBQ2hCO0lBRUFYLEdBQUcsZ0RBQWdEO1FBQ2xELE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELDBDQUEwQztRQUMxQyxNQUFNSyxXQUFXVCxPQUFPVSxTQUFTLENBQUM7WUFDakNDLFNBQVMsSUFBSVo7UUFDZDtRQUVBLE1BQU1NLFNBQVNJLFNBQVM7UUFDeEJKLE9BQU9PLElBQUksQ0FBQztRQUVaaEIsT0FBT0ssS0FBS1ksb0JBQW9CLENBQy9CakIsT0FBT2tCLGdCQUFnQixDQUFDO1FBR3pCYixJQUFJTyxXQUFXO0lBQ2hCO0lBRUFYLEdBQUcsNkNBQTZDO1FBQy9DLE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1XLFVBQVVmLE9BQU9LLE1BQU0sQ0FBQztRQUM5QixNQUFNVyxVQUFVaEIsT0FBT0ssTUFBTSxDQUFDO1FBRTlCVSxRQUFRVCxJQUFJLENBQUM7UUFDYlUsUUFBUUMsS0FBSyxDQUFDO1FBRWRyQixPQUFPSyxLQUFLWSxvQkFBb0IsQ0FDL0JqQixPQUFPa0IsZ0JBQWdCLENBQUM7UUFFekJsQixPQUFPSyxLQUFLWSxvQkFBb0IsQ0FDL0JqQixPQUFPa0IsZ0JBQWdCLENBQUM7UUFHekJiLElBQUlPLFdBQVc7SUFDaEI7QUFDRCJ9
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes