@deepracticex/logger
Advanced tools
| /** | ||
| * Runtime environment type | ||
| */ | ||
| type RuntimeEnvironment = "nodejs" | "cloudflare-workers" | "browser" | "test" | "pkg"; | ||
| /** | ||
| * Logger configuration interface | ||
| */ | ||
| interface LoggerConfig { | ||
| /** | ||
| * Log level threshold | ||
| * @default "info" | ||
| */ | ||
| level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| /** | ||
| * Enable console output | ||
| * @default true | ||
| */ | ||
| console?: boolean; | ||
| /** | ||
| * File logging configuration | ||
| * @default { dirname: "~/.deepractice/logs" } | ||
| */ | ||
| file?: boolean | { | ||
| dirname?: string; | ||
| }; | ||
| /** | ||
| * Enable colored output | ||
| * @default true | ||
| */ | ||
| colors?: boolean; | ||
| /** | ||
| * Package/service name for identification | ||
| * @default "app" | ||
| */ | ||
| name?: string; | ||
| /** | ||
| * Explicitly specify the runtime environment | ||
| * If not provided, will auto-detect | ||
| * @default auto-detect | ||
| */ | ||
| environment?: RuntimeEnvironment; | ||
| } | ||
| /** | ||
| * Logger interface - all methods accept any arguments for maximum flexibility | ||
| */ | ||
| interface Logger { | ||
| /** | ||
| * Log trace level message | ||
| */ | ||
| trace: any; | ||
| /** | ||
| * Log debug level message | ||
| */ | ||
| debug: any; | ||
| /** | ||
| * Log info level message | ||
| */ | ||
| info: any; | ||
| /** | ||
| * Log warning level message | ||
| */ | ||
| warn: any; | ||
| /** | ||
| * Log error level message | ||
| */ | ||
| error: any; | ||
| /** | ||
| * Log fatal level message | ||
| */ | ||
| fatal: any; | ||
| } | ||
| /** | ||
| * Log level type | ||
| */ | ||
| type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| export type { LoggerConfig as L, Logger as a, LogLevel as b }; |
| /** | ||
| * Runtime environment type | ||
| */ | ||
| type RuntimeEnvironment = "nodejs" | "cloudflare-workers" | "browser" | "test" | "pkg"; | ||
| /** | ||
| * Logger configuration interface | ||
| */ | ||
| interface LoggerConfig { | ||
| /** | ||
| * Log level threshold | ||
| * @default "info" | ||
| */ | ||
| level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| /** | ||
| * Enable console output | ||
| * @default true | ||
| */ | ||
| console?: boolean; | ||
| /** | ||
| * File logging configuration | ||
| * @default { dirname: "~/.deepractice/logs" } | ||
| */ | ||
| file?: boolean | { | ||
| dirname?: string; | ||
| }; | ||
| /** | ||
| * Enable colored output | ||
| * @default true | ||
| */ | ||
| colors?: boolean; | ||
| /** | ||
| * Package/service name for identification | ||
| * @default "app" | ||
| */ | ||
| name?: string; | ||
| /** | ||
| * Explicitly specify the runtime environment | ||
| * If not provided, will auto-detect | ||
| * @default auto-detect | ||
| */ | ||
| environment?: RuntimeEnvironment; | ||
| } | ||
| /** | ||
| * Logger interface - all methods accept any arguments for maximum flexibility | ||
| */ | ||
| interface Logger { | ||
| /** | ||
| * Log trace level message | ||
| */ | ||
| trace: any; | ||
| /** | ||
| * Log debug level message | ||
| */ | ||
| debug: any; | ||
| /** | ||
| * Log info level message | ||
| */ | ||
| info: any; | ||
| /** | ||
| * Log warning level message | ||
| */ | ||
| warn: any; | ||
| /** | ||
| * Log error level message | ||
| */ | ||
| error: any; | ||
| /** | ||
| * Log fatal level message | ||
| */ | ||
| fatal: any; | ||
| } | ||
| /** | ||
| * Log level type | ||
| */ | ||
| type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| export type { LoggerConfig as L, Logger as a, LogLevel as b }; |
+125
| "use strict"; | ||
| var __create = Object.create; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __getProtoOf = Object.getPrototypeOf; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __export = (target, all) => { | ||
| for (var name in all) | ||
| __defProp(target, name, { get: all[name], enumerable: true }); | ||
| }; | ||
| var __copyProps = (to, from, except, desc) => { | ||
| if (from && typeof from === "object" || typeof from === "function") { | ||
| for (let key of __getOwnPropNames(from)) | ||
| if (!__hasOwnProp.call(to, key) && key !== except) | ||
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | ||
| } | ||
| return to; | ||
| }; | ||
| var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( | ||
| // If the importer is in node compatibility mode or this is not an ESM | ||
| // file that has been converted to a CommonJS file using a Babel- | ||
| // compatible transform (i.e. "__esModule" has not been set), then set | ||
| // "default" to the CommonJS "module.exports" for node compatibility. | ||
| isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, | ||
| mod | ||
| )); | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
| // src/pkg.ts | ||
| var pkg_exports = {}; | ||
| __export(pkg_exports, { | ||
| createLogger: () => createLogger | ||
| }); | ||
| module.exports = __toCommonJS(pkg_exports); | ||
| // src/core/pkg-adapter.ts | ||
| var import_pino = __toESM(require("pino"), 1); | ||
| var import_path2 = __toESM(require("path"), 1); | ||
| var import_os = __toESM(require("os"), 1); | ||
| var import_fs = __toESM(require("fs"), 1); | ||
| // src/core/caller-tracker.ts | ||
| var import_path = __toESM(require("path"), 1); | ||
| function getCallerInfo(packageName) { | ||
| const stack = new Error().stack || ""; | ||
| const stackLines = stack.split("\n"); | ||
| for (let i = 2; i < stackLines.length; i++) { | ||
| const line = stackLines[i]; | ||
| if (line && !line.includes("node_modules/pino") && !line.includes("packages/logger") && !line.includes("@deepracticex/logger")) { | ||
| const match = line.match(/at\s+(?:.*?\s+)?\(?(.*?):(\d+):(\d+)\)?/); | ||
| if (match && match[1] && match[2]) { | ||
| const fullPath = match[1]; | ||
| const lineNum = parseInt(match[2], 10); | ||
| const filename = import_path.default.basename(fullPath); | ||
| return { | ||
| package: packageName, | ||
| file: filename, | ||
| line: lineNum | ||
| }; | ||
| } | ||
| } | ||
| } | ||
| return { package: packageName, file: "unknown", line: 0 }; | ||
| } | ||
| // src/core/pkg-adapter.ts | ||
| var defaultConfig = { | ||
| level: process.env.LOG_LEVEL || "info", | ||
| console: true, | ||
| file: { | ||
| dirname: import_path2.default.join(import_os.default.homedir(), ".deepractice", "logs") | ||
| }, | ||
| colors: false, | ||
| // No colors in pkg (no pino-pretty) | ||
| name: "app" | ||
| }; | ||
| function createPkgLogger(config = {}) { | ||
| const finalConfig = { ...defaultConfig, ...config }; | ||
| if (finalConfig.file) { | ||
| const fileConfig = typeof finalConfig.file === "object" ? finalConfig.file : {}; | ||
| const logDir = fileConfig.dirname || import_path2.default.join(import_os.default.homedir(), ".deepractice", "logs"); | ||
| if (!import_fs.default.existsSync(logDir)) { | ||
| import_fs.default.mkdirSync(logDir, { recursive: true }); | ||
| } | ||
| } | ||
| const baseOptions = { | ||
| level: finalConfig.level || "info", | ||
| base: { pid: process.pid }, | ||
| mixin: () => getCallerInfo(finalConfig.name || "app"), | ||
| formatters: { | ||
| level: (label) => ({ level: label }), | ||
| log: (obj) => { | ||
| const { package: pkg, file, line, ...rest } = obj; | ||
| return { | ||
| ...rest, | ||
| location: pkg && file ? `${pkg} [${file}:${line}]` : void 0 | ||
| }; | ||
| } | ||
| } | ||
| }; | ||
| if (finalConfig.file) { | ||
| const fileConfig = typeof finalConfig.file === "object" ? finalConfig.file : {}; | ||
| const logDir = fileConfig.dirname || import_path2.default.join(import_os.default.homedir(), ".deepractice", "logs"); | ||
| const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0]; | ||
| const logPath = import_path2.default.join(logDir, `deepractice-${today}.log`); | ||
| const dest = import_pino.default.destination({ | ||
| dest: logPath, | ||
| sync: true | ||
| // Critical for pkg | ||
| }); | ||
| return (0, import_pino.default)(baseOptions, dest); | ||
| } | ||
| return (0, import_pino.default)(baseOptions); | ||
| } | ||
| // src/pkg.ts | ||
| function createLogger(config = {}) { | ||
| return createPkgLogger({ ...config, environment: "pkg" }); | ||
| } | ||
| // Annotate the CommonJS export names for ESM import in node: | ||
| 0 && (module.exports = { | ||
| createLogger | ||
| }); | ||
| //# sourceMappingURL=pkg.cjs.map |
| {"version":3,"sources":["../src/pkg.ts","../src/core/pkg-adapter.ts","../src/core/caller-tracker.ts"],"sourcesContent":["/**\n * PKG binary entry point\n * Uses simplified pino adapter without transports or pino-pretty\n * Compatible with @yao-pkg/pkg binary packaging\n */\nimport { createPkgLogger } from \"./core/pkg-adapter.js\";\nimport type { LoggerConfig, Logger } from \"./types/index.js\";\n\n/**\n * Create logger for PKG binary runtime\n * Uses simplified pino without dynamic imports (pkg compatible)\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return createPkgLogger({ ...config, environment: \"pkg\" });\n}\n\nexport type { Logger, LoggerConfig };\n","/**\n * PKG logger adapter - simplified pino for pkg binary compatibility\n * No transports, no pino-pretty, only direct file writing\n */\nimport pino from \"pino\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport { getCallerInfo } from \"~/core/caller-tracker.js\";\n\nconst defaultConfig: LoggerConfig = {\n level: (process.env.LOG_LEVEL as any) || \"info\",\n console: true,\n file: {\n dirname: path.join(os.homedir(), \".deepractice\", \"logs\"),\n },\n colors: false, // No colors in pkg (no pino-pretty)\n name: \"app\",\n};\n\n/**\n * Create a PKG-compatible logger instance\n * Uses sync mode and direct file writing (no transports)\n */\nexport function createPkgLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config };\n\n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n\n const baseOptions = {\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label: string) => ({ level: label }),\n log: (obj: any) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n };\n\n // File logging with sync mode (pkg compatible)\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n const logPath = path.join(logDir, `deepractice-${today}.log`);\n\n // Use pino.destination with sync mode for pkg compatibility\n const dest = pino.destination({\n dest: logPath,\n sync: true, // Critical for pkg\n });\n\n return pino(baseOptions, dest);\n }\n\n // Console only (no file)\n return pino(baseOptions);\n}\n","/**\n * Caller location tracking utility\n */\nimport path from \"path\";\n\nexport interface CallerInfo {\n package: string;\n file: string;\n line: number;\n}\n\n/**\n * Get caller information from stack trace\n */\nexport function getCallerInfo(packageName: string): CallerInfo {\n const stack = new Error().stack || \"\";\n const stackLines = stack.split(\"\\n\");\n\n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i];\n if (\n line &&\n !line.includes(\"node_modules/pino\") &&\n !line.includes(\"packages/logger\") &&\n !line.includes(\"@deepracticex/logger\")\n ) {\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/);\n if (match && match[1] && match[2]) {\n const fullPath = match[1];\n const lineNum = parseInt(match[2], 10);\n const filename = path.basename(fullPath);\n\n return {\n package: packageName,\n file: filename,\n line: lineNum,\n };\n }\n }\n }\n\n return { package: packageName, file: \"unknown\", line: 0 };\n}\n"],"mappings":"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","names":["import_path","path","path","os","fs","pino"]} |
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.cjs'; | ||
| /** | ||
| * Create logger for PKG binary runtime | ||
| * Uses simplified pino without dynamic imports (pkg compatible) | ||
| */ | ||
| declare function createLogger(config?: LoggerConfig): Logger; | ||
| export { Logger, LoggerConfig, createLogger }; |
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.js'; | ||
| /** | ||
| * Create logger for PKG binary runtime | ||
| * Uses simplified pino without dynamic imports (pkg compatible) | ||
| */ | ||
| declare function createLogger(config?: LoggerConfig): Logger; | ||
| export { Logger, LoggerConfig, createLogger }; |
+88
| // src/core/pkg-adapter.ts | ||
| import pino from "pino"; | ||
| import path2 from "path"; | ||
| import os from "os"; | ||
| import fs from "fs"; | ||
| // src/core/caller-tracker.ts | ||
| import path from "path"; | ||
| function getCallerInfo(packageName) { | ||
| const stack = new Error().stack || ""; | ||
| const stackLines = stack.split("\n"); | ||
| for (let i = 2; i < stackLines.length; i++) { | ||
| const line = stackLines[i]; | ||
| if (line && !line.includes("node_modules/pino") && !line.includes("packages/logger") && !line.includes("@deepracticex/logger")) { | ||
| const match = line.match(/at\s+(?:.*?\s+)?\(?(.*?):(\d+):(\d+)\)?/); | ||
| if (match && match[1] && match[2]) { | ||
| const fullPath = match[1]; | ||
| const lineNum = parseInt(match[2], 10); | ||
| const filename = path.basename(fullPath); | ||
| return { | ||
| package: packageName, | ||
| file: filename, | ||
| line: lineNum | ||
| }; | ||
| } | ||
| } | ||
| } | ||
| return { package: packageName, file: "unknown", line: 0 }; | ||
| } | ||
| // src/core/pkg-adapter.ts | ||
| var defaultConfig = { | ||
| level: process.env.LOG_LEVEL || "info", | ||
| console: true, | ||
| file: { | ||
| dirname: path2.join(os.homedir(), ".deepractice", "logs") | ||
| }, | ||
| colors: false, | ||
| // No colors in pkg (no pino-pretty) | ||
| name: "app" | ||
| }; | ||
| function createPkgLogger(config = {}) { | ||
| const finalConfig = { ...defaultConfig, ...config }; | ||
| if (finalConfig.file) { | ||
| const fileConfig = typeof finalConfig.file === "object" ? finalConfig.file : {}; | ||
| const logDir = fileConfig.dirname || path2.join(os.homedir(), ".deepractice", "logs"); | ||
| if (!fs.existsSync(logDir)) { | ||
| fs.mkdirSync(logDir, { recursive: true }); | ||
| } | ||
| } | ||
| const baseOptions = { | ||
| level: finalConfig.level || "info", | ||
| base: { pid: process.pid }, | ||
| mixin: () => getCallerInfo(finalConfig.name || "app"), | ||
| formatters: { | ||
| level: (label) => ({ level: label }), | ||
| log: (obj) => { | ||
| const { package: pkg, file, line, ...rest } = obj; | ||
| return { | ||
| ...rest, | ||
| location: pkg && file ? `${pkg} [${file}:${line}]` : void 0 | ||
| }; | ||
| } | ||
| } | ||
| }; | ||
| if (finalConfig.file) { | ||
| const fileConfig = typeof finalConfig.file === "object" ? finalConfig.file : {}; | ||
| const logDir = fileConfig.dirname || path2.join(os.homedir(), ".deepractice", "logs"); | ||
| const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0]; | ||
| const logPath = path2.join(logDir, `deepractice-${today}.log`); | ||
| const dest = pino.destination({ | ||
| dest: logPath, | ||
| sync: true | ||
| // Critical for pkg | ||
| }); | ||
| return pino(baseOptions, dest); | ||
| } | ||
| return pino(baseOptions); | ||
| } | ||
| // src/pkg.ts | ||
| function createLogger(config = {}) { | ||
| return createPkgLogger({ ...config, environment: "pkg" }); | ||
| } | ||
| export { | ||
| createLogger | ||
| }; | ||
| //# sourceMappingURL=pkg.js.map |
| {"version":3,"sources":["../src/core/pkg-adapter.ts","../src/core/caller-tracker.ts","../src/pkg.ts"],"sourcesContent":["/**\n * PKG logger adapter - simplified pino for pkg binary compatibility\n * No transports, no pino-pretty, only direct file writing\n */\nimport pino from \"pino\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport { getCallerInfo } from \"~/core/caller-tracker.js\";\n\nconst defaultConfig: LoggerConfig = {\n level: (process.env.LOG_LEVEL as any) || \"info\",\n console: true,\n file: {\n dirname: path.join(os.homedir(), \".deepractice\", \"logs\"),\n },\n colors: false, // No colors in pkg (no pino-pretty)\n name: \"app\",\n};\n\n/**\n * Create a PKG-compatible logger instance\n * Uses sync mode and direct file writing (no transports)\n */\nexport function createPkgLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config };\n\n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n\n const baseOptions = {\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label: string) => ({ level: label }),\n log: (obj: any) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n };\n\n // File logging with sync mode (pkg compatible)\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n const logPath = path.join(logDir, `deepractice-${today}.log`);\n\n // Use pino.destination with sync mode for pkg compatibility\n const dest = pino.destination({\n dest: logPath,\n sync: true, // Critical for pkg\n });\n\n return pino(baseOptions, dest);\n }\n\n // Console only (no file)\n return pino(baseOptions);\n}\n","/**\n * Caller location tracking utility\n */\nimport path from \"path\";\n\nexport interface CallerInfo {\n package: string;\n file: string;\n line: number;\n}\n\n/**\n * Get caller information from stack trace\n */\nexport function getCallerInfo(packageName: string): CallerInfo {\n const stack = new Error().stack || \"\";\n const stackLines = stack.split(\"\\n\");\n\n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i];\n if (\n line &&\n !line.includes(\"node_modules/pino\") &&\n !line.includes(\"packages/logger\") &&\n !line.includes(\"@deepracticex/logger\")\n ) {\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/);\n if (match && match[1] && match[2]) {\n const fullPath = match[1];\n const lineNum = parseInt(match[2], 10);\n const filename = path.basename(fullPath);\n\n return {\n package: packageName,\n file: filename,\n line: lineNum,\n };\n }\n }\n }\n\n return { package: packageName, file: \"unknown\", line: 0 };\n}\n","/**\n * PKG binary entry point\n * Uses simplified pino adapter without transports or pino-pretty\n * Compatible with @yao-pkg/pkg binary packaging\n */\nimport { createPkgLogger } from \"./core/pkg-adapter.js\";\nimport type { LoggerConfig, Logger } from \"./types/index.js\";\n\n/**\n * Create logger for PKG binary runtime\n * Uses simplified pino without dynamic imports (pkg compatible)\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return createPkgLogger({ ...config, environment: \"pkg\" });\n}\n\nexport type { Logger, LoggerConfig };\n"],"mappings":"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","names":["path","path"]} |
@@ -1,2 +0,2 @@ | ||
| import { L as LoggerConfig, a as Logger } from './logger-Lmm6XEQc.cjs'; | ||
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.cjs'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,2 +0,2 @@ | ||
| import { L as LoggerConfig, a as Logger } from './logger-Lmm6XEQc.js'; | ||
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.js'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,2 +0,2 @@ | ||
| import { L as LoggerConfig, a as Logger } from './logger-Lmm6XEQc.cjs'; | ||
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.cjs'; | ||
@@ -3,0 +3,0 @@ /** |
@@ -1,2 +0,2 @@ | ||
| import { L as LoggerConfig, a as Logger } from './logger-Lmm6XEQc.js'; | ||
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.js'; | ||
@@ -3,0 +3,0 @@ /** |
+3
-3
@@ -199,8 +199,8 @@ "use strict"; | ||
| } else if (env === "nodejs") { | ||
| const adapterPath = "./pino-adapter.js"; | ||
| const { createPinoLogger } = await import( | ||
| const adapterPath = "./node-adapter.js"; | ||
| const { createNodeLogger } = await import( | ||
| /* @vite-ignore */ | ||
| adapterPath | ||
| ); | ||
| return createPinoLogger(config); | ||
| return createNodeLogger(config); | ||
| } else { | ||
@@ -207,0 +207,0 @@ const { createConsoleLogger: createConsoleLogger2 } = await Promise.resolve().then(() => (init_console_adapter(), console_adapter_exports)); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/index.ts","../src/core/adapter-factory.ts","../src/api/logger.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * @deepracticex/logger\n *\n * Unified logging solution with environment-aware adapters\n * - Pino for Node.js (high performance, structured logging)\n * - Console adapter for edge runtimes (Cloudflare Workers, Deno, browser)\n * - Zero side effects: no instances created at module load time\n * - Explicit configuration: users must explicitly create logger instances\n */\n\n// Export core API only\nexport { DefaultLogger, createLogger } from \"~/api/logger.js\";\n\n// Export types\nexport type { Logger, LoggerConfig, LogLevel } from \"~/types/index.js\";\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./pino-adapter\" + \".js\";\n const { createPinoLogger } = await import(/* @vite-ignore */ adapterPath);\n return createPinoLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n"],"mappings":"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","names":["shouldLog","createTestLogger","createConsoleLogger"]} | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/index.ts","../src/core/adapter-factory.ts","../src/api/logger.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * @deepracticex/logger\n *\n * Unified logging solution with environment-aware adapters\n * - Pino for Node.js (high performance, structured logging)\n * - Console adapter for edge runtimes (Cloudflare Workers, Deno, browser)\n * - Zero side effects: no instances created at module load time\n * - Explicit configuration: users must explicitly create logger instances\n */\n\n// Export core API only\nexport { DefaultLogger, createLogger } from \"~/api/logger.js\";\n\n// Export types\nexport type { Logger, LoggerConfig, LogLevel } from \"~/types/index.js\";\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./node-adapter\" + \".js\";\n const { createNodeLogger } = await import(/* @vite-ignore */ adapterPath);\n return createNodeLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n"],"mappings":"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","names":["shouldLog","createTestLogger","createConsoleLogger"]} |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { a as Logger, L as LoggerConfig } from './logger-Lmm6XEQc.cjs'; | ||
| export { b as LogLevel } from './logger-Lmm6XEQc.cjs'; | ||
| import { a as Logger, L as LoggerConfig } from './logger-Dd9o7ZZH.cjs'; | ||
| export { b as LogLevel } from './logger-Dd9o7ZZH.cjs'; | ||
@@ -4,0 +4,0 @@ /** |
+2
-2
@@ -1,3 +0,3 @@ | ||
| import { a as Logger, L as LoggerConfig } from './logger-Lmm6XEQc.js'; | ||
| export { b as LogLevel } from './logger-Lmm6XEQc.js'; | ||
| import { a as Logger, L as LoggerConfig } from './logger-Dd9o7ZZH.js'; | ||
| export { b as LogLevel } from './logger-Dd9o7ZZH.js'; | ||
@@ -4,0 +4,0 @@ /** |
+3
-3
@@ -179,8 +179,8 @@ var __defProp = Object.defineProperty; | ||
| } else if (env === "nodejs") { | ||
| const adapterPath = "./pino-adapter.js"; | ||
| const { createPinoLogger } = await import( | ||
| const adapterPath = "./node-adapter.js"; | ||
| const { createNodeLogger } = await import( | ||
| /* @vite-ignore */ | ||
| adapterPath | ||
| ); | ||
| return createPinoLogger(config); | ||
| return createNodeLogger(config); | ||
| } else { | ||
@@ -187,0 +187,0 @@ const { createConsoleLogger: createConsoleLogger2 } = await Promise.resolve().then(() => (init_console_adapter(), console_adapter_exports)); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/core/adapter-factory.ts","../src/api/logger.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./pino-adapter\" + \".js\";\n const { createPinoLogger } = await import(/* @vite-ignore */ adapterPath);\n return createPinoLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n"],"mappings":"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","names":["shouldLog","createTestLogger","createConsoleLogger"]} | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/core/adapter-factory.ts","../src/api/logger.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./node-adapter\" + \".js\";\n const { createNodeLogger } = await import(/* @vite-ignore */ adapterPath);\n return createNodeLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n"],"mappings":"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","names":["shouldLog","createTestLogger","createConsoleLogger"]} |
+4
-4
@@ -37,3 +37,3 @@ "use strict"; | ||
| // src/core/pino-adapter.ts | ||
| // src/core/node-adapter.ts | ||
| var import_pino = __toESM(require("pino"), 1); | ||
@@ -68,3 +68,3 @@ var import_path2 = __toESM(require("path"), 1); | ||
| // src/core/pino-adapter.ts | ||
| // src/core/node-adapter.ts | ||
| var defaultConfig = { | ||
@@ -79,3 +79,3 @@ level: process.env.LOG_LEVEL || "info", | ||
| }; | ||
| function createPinoLogger(config = {}) { | ||
| function createNodeLogger(config = {}) { | ||
| const finalConfig = { ...defaultConfig, ...config }; | ||
@@ -196,3 +196,3 @@ if (finalConfig.file) { | ||
| function createLogger(config = {}) { | ||
| return createPinoLogger({ ...config, environment: "nodejs" }); | ||
| return createNodeLogger({ ...config, environment: "nodejs" }); | ||
| } | ||
@@ -199,0 +199,0 @@ // Annotate the CommonJS export names for ESM import in node: |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/nodejs.ts","../src/core/pino-adapter.ts","../src/core/caller-tracker.ts"],"sourcesContent":["/**\n * Node.js platform entry point (default)\n * Directly uses Pino adapter for production-grade logging\n */\nimport { createPinoLogger } from \"./core/pino-adapter.js\";\nimport type { LoggerConfig, Logger } from \"./types/index.js\";\n\n/**\n * Create logger for Node.js runtime\n * Always uses Pino for structured logging with file support\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n // Force environment to prevent any detection logic\n return createPinoLogger({ ...config, environment: \"nodejs\" });\n}\n\nexport type { Logger, LoggerConfig };\n","/**\n * Pino logger adapter - internal implementation\n */\nimport pino from \"pino\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport { getCallerInfo } from \"~/core/caller-tracker.js\";\n\nconst defaultConfig: LoggerConfig = {\n level: (process.env.LOG_LEVEL as any) || \"info\",\n console: true,\n file: {\n dirname: path.join(os.homedir(), \".deepractice\", \"logs\"),\n },\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a Pino logger instance\n */\nexport function createPinoLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config };\n\n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n\n // For Electron desktop app, avoid worker thread issues\n const isElectron = process.versions && \"electron\" in process.versions;\n const isTest =\n process.env.NODE_ENV === \"test\" || process.env.VITEST === \"true\";\n\n if (isElectron || isTest || process.env.DEEPRACTICE_NO_WORKERS === \"true\") {\n // For Electron: use sync mode to avoid worker thread issues\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n const logPath = path.join(logDir, `deepractice-${today}.log`);\n\n const dest = pino.destination({\n dest: logPath,\n sync: true,\n });\n\n return pino(\n {\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n },\n dest,\n );\n } else {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n });\n }\n } else {\n // Use transports for non-Electron environments (better for servers)\n const targets: any[] = [];\n\n // Console transport\n if (finalConfig.console) {\n targets.push({\n target: \"pino-pretty\",\n level: finalConfig.level,\n options: {\n // MCP stdio mode disables colors to avoid ANSI escape codes\n colorize:\n process.env.MCP_TRANSPORT === \"stdio\" ? false : finalConfig.colors,\n translateTime: \"SYS:yyyy-mm-dd HH:MM:ss.l\",\n ignore: \"hostname,pid,package,file,line\",\n destination: 2, // stderr (fd 2) - MCP best practice\n messageFormat: \"{package} [{file}:{line}] {msg}\",\n },\n });\n }\n\n // File transport\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n\n targets.push({\n target: \"pino/file\",\n level: finalConfig.level,\n options: {\n destination: path.join(logDir, `deepractice-${today}.log`),\n },\n });\n\n // Separate error log\n targets.push({\n target: \"pino/file\",\n level: \"error\",\n options: {\n destination: path.join(logDir, `deepractice-error-${today}.log`),\n },\n });\n }\n\n // Create logger with transports\n if (targets.length > 0) {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n transport: {\n targets,\n },\n });\n }\n }\n\n // Fallback to basic logger\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n });\n}\n","/**\n * Caller location tracking utility\n */\nimport path from \"path\";\n\nexport interface CallerInfo {\n package: string;\n file: string;\n line: number;\n}\n\n/**\n * Get caller information from stack trace\n */\nexport function getCallerInfo(packageName: string): CallerInfo {\n const stack = new Error().stack || \"\";\n const stackLines = stack.split(\"\\n\");\n\n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i];\n if (\n line &&\n !line.includes(\"node_modules/pino\") &&\n !line.includes(\"packages/logger\") &&\n !line.includes(\"@deepracticex/logger\")\n ) {\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/);\n if (match && match[1] && match[2]) {\n const fullPath = match[1];\n const lineNum = parseInt(match[2], 10);\n const filename = path.basename(fullPath);\n\n return {\n package: packageName,\n file: filename,\n line: lineNum,\n };\n }\n }\n }\n\n return { package: packageName, file: \"unknown\", line: 0 };\n}\n"],"mappings":"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","names":["import_path","path","path","os","fs","pino"]} | ||
| {"version":3,"sources":["../src/nodejs.ts","../src/core/node-adapter.ts","../src/core/caller-tracker.ts"],"sourcesContent":["/**\n * Node.js platform entry point (default)\n * Directly uses Node adapter for production-grade logging\n */\nimport { createNodeLogger } from \"./core/node-adapter.js\";\nimport type { LoggerConfig, Logger } from \"./types/index.js\";\n\n/**\n * Create logger for Node.js runtime\n * Always uses Pino for structured logging with file support\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n // Force environment to prevent any detection logic\n return createNodeLogger({ ...config, environment: \"nodejs\" });\n}\n\nexport type { Logger, LoggerConfig };\n","/**\n * Node.js logger adapter - full-featured pino implementation\n * Supports pino-pretty, transports, and all pino features\n */\nimport pino from \"pino\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport { getCallerInfo } from \"~/core/caller-tracker.js\";\n\nconst defaultConfig: LoggerConfig = {\n level: (process.env.LOG_LEVEL as any) || \"info\",\n console: true,\n file: {\n dirname: path.join(os.homedir(), \".deepractice\", \"logs\"),\n },\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a Node.js logger instance with full pino features\n */\nexport function createNodeLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config };\n\n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n\n // For Electron desktop app, avoid worker thread issues\n const isElectron = process.versions && \"electron\" in process.versions;\n const isTest =\n process.env.NODE_ENV === \"test\" || process.env.VITEST === \"true\";\n\n if (isElectron || isTest || process.env.DEEPRACTICE_NO_WORKERS === \"true\") {\n // For Electron: use sync mode to avoid worker thread issues\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n const logPath = path.join(logDir, `deepractice-${today}.log`);\n\n const dest = pino.destination({\n dest: logPath,\n sync: true,\n });\n\n return pino(\n {\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n },\n dest,\n );\n } else {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n });\n }\n } else {\n // Use transports for non-Electron environments (better for servers)\n const targets: any[] = [];\n\n // Console transport\n if (finalConfig.console) {\n targets.push({\n target: \"pino-pretty\",\n level: finalConfig.level,\n options: {\n // MCP stdio mode disables colors to avoid ANSI escape codes\n colorize:\n process.env.MCP_TRANSPORT === \"stdio\" ? false : finalConfig.colors,\n translateTime: \"SYS:yyyy-mm-dd HH:MM:ss.l\",\n ignore: \"hostname,pid,package,file,line\",\n destination: 2, // stderr (fd 2) - MCP best practice\n messageFormat: \"{package} [{file}:{line}] {msg}\",\n },\n });\n }\n\n // File transport\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n\n targets.push({\n target: \"pino/file\",\n level: finalConfig.level,\n options: {\n destination: path.join(logDir, `deepractice-${today}.log`),\n },\n });\n\n // Separate error log\n targets.push({\n target: \"pino/file\",\n level: \"error\",\n options: {\n destination: path.join(logDir, `deepractice-error-${today}.log`),\n },\n });\n }\n\n // Create logger with transports\n if (targets.length > 0) {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n transport: {\n targets,\n },\n });\n }\n }\n\n // Fallback to basic logger\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n });\n}\n","/**\n * Caller location tracking utility\n */\nimport path from \"path\";\n\nexport interface CallerInfo {\n package: string;\n file: string;\n line: number;\n}\n\n/**\n * Get caller information from stack trace\n */\nexport function getCallerInfo(packageName: string): CallerInfo {\n const stack = new Error().stack || \"\";\n const stackLines = stack.split(\"\\n\");\n\n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i];\n if (\n line &&\n !line.includes(\"node_modules/pino\") &&\n !line.includes(\"packages/logger\") &&\n !line.includes(\"@deepracticex/logger\")\n ) {\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/);\n if (match && match[1] && match[2]) {\n const fullPath = match[1];\n const lineNum = parseInt(match[2], 10);\n const filename = path.basename(fullPath);\n\n return {\n package: packageName,\n file: filename,\n line: lineNum,\n };\n }\n }\n }\n\n return { package: packageName, file: \"unknown\", line: 0 };\n}\n"],"mappings":"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","names":["import_path","path","path","os","fs","pino"]} |
@@ -1,2 +0,2 @@ | ||
| import { L as LoggerConfig, a as Logger } from './logger-Lmm6XEQc.cjs'; | ||
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.cjs'; | ||
@@ -3,0 +3,0 @@ /** |
+1
-1
@@ -1,2 +0,2 @@ | ||
| import { L as LoggerConfig, a as Logger } from './logger-Lmm6XEQc.js'; | ||
| import { L as LoggerConfig, a as Logger } from './logger-Dd9o7ZZH.js'; | ||
@@ -3,0 +3,0 @@ /** |
+4
-4
@@ -1,2 +0,2 @@ | ||
| // src/core/pino-adapter.ts | ||
| // src/core/node-adapter.ts | ||
| import pino from "pino"; | ||
@@ -31,3 +31,3 @@ import path2 from "path"; | ||
| // src/core/pino-adapter.ts | ||
| // src/core/node-adapter.ts | ||
| var defaultConfig = { | ||
@@ -42,3 +42,3 @@ level: process.env.LOG_LEVEL || "info", | ||
| }; | ||
| function createPinoLogger(config = {}) { | ||
| function createNodeLogger(config = {}) { | ||
| const finalConfig = { ...defaultConfig, ...config }; | ||
@@ -159,3 +159,3 @@ if (finalConfig.file) { | ||
| function createLogger(config = {}) { | ||
| return createPinoLogger({ ...config, environment: "nodejs" }); | ||
| return createNodeLogger({ ...config, environment: "nodejs" }); | ||
| } | ||
@@ -162,0 +162,0 @@ export { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/core/pino-adapter.ts","../src/core/caller-tracker.ts","../src/nodejs.ts"],"sourcesContent":["/**\n * Pino logger adapter - internal implementation\n */\nimport pino from \"pino\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport { getCallerInfo } from \"~/core/caller-tracker.js\";\n\nconst defaultConfig: LoggerConfig = {\n level: (process.env.LOG_LEVEL as any) || \"info\",\n console: true,\n file: {\n dirname: path.join(os.homedir(), \".deepractice\", \"logs\"),\n },\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a Pino logger instance\n */\nexport function createPinoLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config };\n\n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n\n // For Electron desktop app, avoid worker thread issues\n const isElectron = process.versions && \"electron\" in process.versions;\n const isTest =\n process.env.NODE_ENV === \"test\" || process.env.VITEST === \"true\";\n\n if (isElectron || isTest || process.env.DEEPRACTICE_NO_WORKERS === \"true\") {\n // For Electron: use sync mode to avoid worker thread issues\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n const logPath = path.join(logDir, `deepractice-${today}.log`);\n\n const dest = pino.destination({\n dest: logPath,\n sync: true,\n });\n\n return pino(\n {\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n },\n dest,\n );\n } else {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n });\n }\n } else {\n // Use transports for non-Electron environments (better for servers)\n const targets: any[] = [];\n\n // Console transport\n if (finalConfig.console) {\n targets.push({\n target: \"pino-pretty\",\n level: finalConfig.level,\n options: {\n // MCP stdio mode disables colors to avoid ANSI escape codes\n colorize:\n process.env.MCP_TRANSPORT === \"stdio\" ? false : finalConfig.colors,\n translateTime: \"SYS:yyyy-mm-dd HH:MM:ss.l\",\n ignore: \"hostname,pid,package,file,line\",\n destination: 2, // stderr (fd 2) - MCP best practice\n messageFormat: \"{package} [{file}:{line}] {msg}\",\n },\n });\n }\n\n // File transport\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n\n targets.push({\n target: \"pino/file\",\n level: finalConfig.level,\n options: {\n destination: path.join(logDir, `deepractice-${today}.log`),\n },\n });\n\n // Separate error log\n targets.push({\n target: \"pino/file\",\n level: \"error\",\n options: {\n destination: path.join(logDir, `deepractice-error-${today}.log`),\n },\n });\n }\n\n // Create logger with transports\n if (targets.length > 0) {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n transport: {\n targets,\n },\n });\n }\n }\n\n // Fallback to basic logger\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n });\n}\n","/**\n * Caller location tracking utility\n */\nimport path from \"path\";\n\nexport interface CallerInfo {\n package: string;\n file: string;\n line: number;\n}\n\n/**\n * Get caller information from stack trace\n */\nexport function getCallerInfo(packageName: string): CallerInfo {\n const stack = new Error().stack || \"\";\n const stackLines = stack.split(\"\\n\");\n\n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i];\n if (\n line &&\n !line.includes(\"node_modules/pino\") &&\n !line.includes(\"packages/logger\") &&\n !line.includes(\"@deepracticex/logger\")\n ) {\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/);\n if (match && match[1] && match[2]) {\n const fullPath = match[1];\n const lineNum = parseInt(match[2], 10);\n const filename = path.basename(fullPath);\n\n return {\n package: packageName,\n file: filename,\n line: lineNum,\n };\n }\n }\n }\n\n return { package: packageName, file: \"unknown\", line: 0 };\n}\n","/**\n * Node.js platform entry point (default)\n * Directly uses Pino adapter for production-grade logging\n */\nimport { createPinoLogger } from \"./core/pino-adapter.js\";\nimport type { LoggerConfig, Logger } from \"./types/index.js\";\n\n/**\n * Create logger for Node.js runtime\n * Always uses Pino for structured logging with file support\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n // Force environment to prevent any detection logic\n return createPinoLogger({ ...config, environment: \"nodejs\" });\n}\n\nexport type { Logger, LoggerConfig };\n"],"mappings":"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","names":["path","path"]} | ||
| {"version":3,"sources":["../src/core/node-adapter.ts","../src/core/caller-tracker.ts","../src/nodejs.ts"],"sourcesContent":["/**\n * Node.js logger adapter - full-featured pino implementation\n * Supports pino-pretty, transports, and all pino features\n */\nimport pino from \"pino\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport { getCallerInfo } from \"~/core/caller-tracker.js\";\n\nconst defaultConfig: LoggerConfig = {\n level: (process.env.LOG_LEVEL as any) || \"info\",\n console: true,\n file: {\n dirname: path.join(os.homedir(), \".deepractice\", \"logs\"),\n },\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a Node.js logger instance with full pino features\n */\nexport function createNodeLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config };\n\n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true });\n }\n }\n\n // For Electron desktop app, avoid worker thread issues\n const isElectron = process.versions && \"electron\" in process.versions;\n const isTest =\n process.env.NODE_ENV === \"test\" || process.env.VITEST === \"true\";\n\n if (isElectron || isTest || process.env.DEEPRACTICE_NO_WORKERS === \"true\") {\n // For Electron: use sync mode to avoid worker thread issues\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n const logPath = path.join(logDir, `deepractice-${today}.log`);\n\n const dest = pino.destination({\n dest: logPath,\n sync: true,\n });\n\n return pino(\n {\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n },\n dest,\n );\n } else {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n formatters: {\n level: (label) => {\n return { level: label };\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj;\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined,\n };\n },\n },\n });\n }\n } else {\n // Use transports for non-Electron environments (better for servers)\n const targets: any[] = [];\n\n // Console transport\n if (finalConfig.console) {\n targets.push({\n target: \"pino-pretty\",\n level: finalConfig.level,\n options: {\n // MCP stdio mode disables colors to avoid ANSI escape codes\n colorize:\n process.env.MCP_TRANSPORT === \"stdio\" ? false : finalConfig.colors,\n translateTime: \"SYS:yyyy-mm-dd HH:MM:ss.l\",\n ignore: \"hostname,pid,package,file,line\",\n destination: 2, // stderr (fd 2) - MCP best practice\n messageFormat: \"{package} [{file}:{line}] {msg}\",\n },\n });\n }\n\n // File transport\n if (finalConfig.file) {\n const fileConfig =\n typeof finalConfig.file === \"object\" ? finalConfig.file : {};\n const logDir =\n fileConfig.dirname || path.join(os.homedir(), \".deepractice\", \"logs\");\n const today = new Date().toISOString().split(\"T\")[0];\n\n targets.push({\n target: \"pino/file\",\n level: finalConfig.level,\n options: {\n destination: path.join(logDir, `deepractice-${today}.log`),\n },\n });\n\n // Separate error log\n targets.push({\n target: \"pino/file\",\n level: \"error\",\n options: {\n destination: path.join(logDir, `deepractice-error-${today}.log`),\n },\n });\n }\n\n // Create logger with transports\n if (targets.length > 0) {\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n transport: {\n targets,\n },\n });\n }\n }\n\n // Fallback to basic logger\n return pino({\n level: finalConfig.level || \"info\",\n base: { pid: process.pid },\n mixin: () => getCallerInfo(finalConfig.name || \"app\"),\n });\n}\n","/**\n * Caller location tracking utility\n */\nimport path from \"path\";\n\nexport interface CallerInfo {\n package: string;\n file: string;\n line: number;\n}\n\n/**\n * Get caller information from stack trace\n */\nexport function getCallerInfo(packageName: string): CallerInfo {\n const stack = new Error().stack || \"\";\n const stackLines = stack.split(\"\\n\");\n\n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i];\n if (\n line &&\n !line.includes(\"node_modules/pino\") &&\n !line.includes(\"packages/logger\") &&\n !line.includes(\"@deepracticex/logger\")\n ) {\n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/);\n if (match && match[1] && match[2]) {\n const fullPath = match[1];\n const lineNum = parseInt(match[2], 10);\n const filename = path.basename(fullPath);\n\n return {\n package: packageName,\n file: filename,\n line: lineNum,\n };\n }\n }\n }\n\n return { package: packageName, file: \"unknown\", line: 0 };\n}\n","/**\n * Node.js platform entry point (default)\n * Directly uses Node adapter for production-grade logging\n */\nimport { createNodeLogger } from \"./core/node-adapter.js\";\nimport type { LoggerConfig, Logger } from \"./types/index.js\";\n\n/**\n * Create logger for Node.js runtime\n * Always uses Pino for structured logging with file support\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n // Force environment to prevent any detection logic\n return createNodeLogger({ ...config, environment: \"nodejs\" });\n}\n\nexport type { Logger, LoggerConfig };\n"],"mappings":"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","names":["path","path"]} |
+3
-3
@@ -203,8 +203,8 @@ "use strict"; | ||
| } else if (env === "nodejs") { | ||
| const adapterPath = "./pino-adapter.js"; | ||
| const { createPinoLogger } = await import( | ||
| const adapterPath = "./node-adapter.js"; | ||
| const { createNodeLogger } = await import( | ||
| /* @vite-ignore */ | ||
| adapterPath | ||
| ); | ||
| return createPinoLogger(config); | ||
| return createNodeLogger(config); | ||
| } else { | ||
@@ -211,0 +211,0 @@ const { createConsoleLogger: createConsoleLogger2 } = await Promise.resolve().then(() => (init_console_adapter(), console_adapter_exports)); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/test.ts","../src/core/adapter-factory.ts","../src/api/logger.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * Test environment entry point\n * Provides in-memory logger for testing with inspection utilities\n */\nimport { createLogger } from \"~/api/logger.js\";\nimport type { LoggerConfig } from \"~/types/index.js\";\n\n// Export test utilities\nexport {\n getTestLogs,\n getTestLogsByLevel,\n clearTestLogs,\n getTestLogsCount,\n type CapturedLog,\n} from \"~/core/test-adapter.js\";\n\n/**\n * Create a test logger instance\n * Automatically uses test adapter with in-memory capture\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n return createLogger({\n ...config,\n environment: \"test\",\n });\n}\n\n// Re-export the standard createLogger for convenience\nexport { createLogger };\n\n// Re-export types\nexport type { LoggerConfig, Logger, LogLevel } from \"~/types/index.js\";\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./pino-adapter\" + \".js\";\n const { createPinoLogger } = await import(/* @vite-ignore */ adapterPath);\n return createPinoLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n"],"mappings":"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","names":["shouldLog","createTestLogger","createTestLogger","createConsoleLogger","createTestLogger"]} | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/test.ts","../src/core/adapter-factory.ts","../src/api/logger.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * Test environment entry point\n * Provides in-memory logger for testing with inspection utilities\n */\nimport { createLogger } from \"~/api/logger.js\";\nimport type { LoggerConfig } from \"~/types/index.js\";\n\n// Export test utilities\nexport {\n getTestLogs,\n getTestLogsByLevel,\n clearTestLogs,\n getTestLogsCount,\n type CapturedLog,\n} from \"~/core/test-adapter.js\";\n\n/**\n * Create a test logger instance\n * Automatically uses test adapter with in-memory capture\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n return createLogger({\n ...config,\n environment: \"test\",\n });\n}\n\n// Re-export the standard createLogger for convenience\nexport { createLogger };\n\n// Re-export types\nexport type { LoggerConfig, Logger, LogLevel } from \"~/types/index.js\";\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./node-adapter\" + \".js\";\n const { createNodeLogger } = await import(/* @vite-ignore */ adapterPath);\n return createNodeLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCA,SAAS,eAAe,QAAkB,QAAgB;AACxD,SAAO,mBAAmB,KAAK;AACjC;AAKA,SAAS,UAAU,OAAiB,UAA2B;AAC7D,SAAO,mBAAmB,KAAK,KAAK;AACtC;AAKA,SAAS,eACP,OACA,MACA,cACA,UACM;AAEN,MAAI,CAAC,UAAU,OAAO,QAAQ,GAAG;AAC/B;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AAGJ,MAAI,KAAK,WAAW,GAAG;AACrB,QAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAC/B,gBAAU,KAAK,CAAC;AAAA,IAClB,OAAO;AACL,gBAAU,KAAK,CAAC;AAChB,gBAAU,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,IAClC;AAAA,EACF,WAAW,KAAK,UAAU,GAAG;AAE3B,QAAI,OAAO,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM;AACnD,gBAAU,KAAK,CAAC;AAChB,gBAAU,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,IAClC,OAAO;AACL,gBAAU,KAAK,KAAK,GAAG;AAAA,IACzB;AAAA,EACF,OAAO;AACL,cAAU;AAAA,EACZ;AAGA,eAAa,KAAK;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAI;AAAA,EACtB,CAAC;AAGD,MAAI,cAAc;AAChB,UAAM,gBAAgB,UAAU,UAAU,UAAU;AACpD,UAAM,QAAS,QAAgB,aAAa,KAAK,QAAQ;AAEzD,QAAI,SAAS;AACX,YAAM,IAAI,MAAM,YAAY,CAAC,KAAK,SAAS,OAAO;AAAA,IACpD,OAAO;AACL,YAAM,IAAI,MAAM,YAAY,CAAC,KAAK,OAAO;AAAA,IAC3C;AAAA,EACF;AACF;AAKO,SAAS,iBAAiB,SAAuB,CAAC,GAAQ;AAE/D,QAAM,eAAe,OAAO,YAAY;AACxC,QAAM,WAAW,eAAe,OAAO,KAAK;AAE5C,SAAO;AAAA,IACL,OAAO,IAAI,SACT,eAAe,SAAS,MAAM,cAAc,QAAQ;AAAA,IACtD,OAAO,IAAI,SACT,eAAe,SAAS,MAAM,cAAc,QAAQ;AAAA,IACtD,MAAM,IAAI,SACR,eAAe,QAAQ,MAAM,cAAc,QAAQ;AAAA,IACrD,MAAM,IAAI,SACR,eAAe,QAAQ,MAAM,cAAc,QAAQ;AAAA,IACrD,OAAO,IAAI,SACT,eAAe,SAAS,MAAM,cAAc,QAAQ;AAAA,IACtD,OAAO,IAAI,SACT,eAAe,SAAS,MAAM,cAAc,QAAQ;AAAA,EACxD;AACF;AAKO,SAAS,cAA6B;AAC3C,SAAO,CAAC,GAAG,YAAY;AACzB;AAKO,SAAS,mBAAmB,OAAgC;AACjE,SAAO,aAAa,OAAO,CAAC,QAAQ,IAAI,UAAU,KAAK;AACzD;AAKO,SAAS,gBAAsB;AACpC,eAAa,SAAS;AACxB;AAKO,SAAS,mBAA2B;AACzC,SAAO,aAAa;AACtB;AAzJA,IAiBM,cAKA;AAtBN;AAAA;AAAA;AAiBA,IAAM,eAA8B,CAAC;AAKrC,IAAM,qBAA+C;AAAA,MACnD,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA;AAAA;;;AC7BA;AAAA;AAAA;AAAA;AAkCO,SAAS,oBACd,SAAuB,CAAC,GACD;AACvB,QAAM,cAAc,EAAE,GAAG,eAAe,GAAG,OAAO;AAClD,QAAM,iBAAiB,WAAW,YAAY,SAAS,MAAM;AAC7D,QAAM,OAAO,YAAY,QAAQ;AAEjC,QAAM,gBAAgB,CAAC,UAAoB,SAAwB;AACjE,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,UAAM,SAAS,IAAI,SAAS,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI;AAC/D,WAAO,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,EACpC;AAEA,QAAMA,aAAY,CAAC,UAA6B;AAC9C,WAAO,WAAW,KAAK,KAAK;AAAA,EAC9B;AAEA,QAAM,YAAY,CAAC,OAAiB,kBAAuB;AACzD,WAAO,IAAI,SAAgB;AACzB,UAAI,CAACA,WAAU,KAAK,EAAG;AACvB,UAAI,CAAC,YAAY,QAAS;AAE1B,YAAM,UAAU,cAAc,OAAO,GAAG,IAAI;AAC5C,oBAAc,OAAO;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,UAAU,SAAS,QAAQ,GAAG;AAAA,IACrC,OAAO,UAAU,SAAS,QAAQ,GAAG;AAAA,IACrC,MAAM,UAAU,QAAQ,QAAQ,IAAI;AAAA,IACpC,MAAM,UAAU,QAAQ,QAAQ,IAAI;AAAA,IACpC,OAAO,UAAU,SAAS,QAAQ,KAAK;AAAA,IACvC,OAAO,UAAU,SAAS,QAAQ,KAAK;AAAA,EACzC;AACF;AArEA,IAeM,YASA;AAxBN;AAAA;AAAA;AAeA,IAAM,aAAuC;AAAA,MAC3C,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAEA,IAAM,gBAA8B;AAAA,MAClC,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA;AAAA;;;AC7BA;AAAA;AAAA;AAAA;AAAA,0BAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,SAAS,oBAAwC;AAGtD,MACE,OAAO,YAAY,gBAClB,QAAQ,IAAI,WAAW,UACtB,QAAQ,IAAI,mBAAmB,UAC/B,QAAQ,IAAI,aAAa,SAC3B;AACA,WAAO;AAAA,EACT;AAKA,MACE,OAAO,eAAe,eACtB,YAAY,cACZ,aAAa,cACb,cAAc,YACd;AAGA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,YAAY,eACnB,QAAQ,YACR,QAAQ,SAAS,MACjB;AACA,WAAO;AAAA,EACT;AAGA,SAAO;AACT;AAQA,eAAsB,oBACpB,SAAuB,CAAC,GACV;AACd,QAAM,MAAM,OAAO,eAAe,kBAAkB;AAEpD,MAAI,QAAQ,QAAQ;AAElB,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM;AACnC,WAAOA,kBAAiB,MAAM;AAAA,EAChC,WAAW,QAAQ,UAAU;AAG3B,UAAM,cAAc;AACpB,UAAM,EAAE,iBAAiB,IAAI,MAAM;AAAA;AAAA,MAA0B;AAAA;AAC7D,WAAO,iBAAiB,MAAM;AAAA,EAChC,OAAO;AAEL,UAAM,EAAE,qBAAAC,qBAAoB,IAAI,MAAM;AACtC,WAAOA,qBAAoB,MAAM;AAAA,EACnC;AACF;;;ACnEO,IAAM,gBAAN,MAAsC;AAAA,EACnC;AAAA,EACA;AAAA,EAER,YAAY,SAAuB,CAAC,GAAG;AAErC,SAAK,cAAc,oBAAoB,MAAM,EAAE,KAAK,CAAC,YAAY;AAC/D,WAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,QAAa,UAAU,SAAgB;AACrC,UAAM,KAAK;AACX,IAAC,KAAK,QAAQ,MAAc,GAAG,IAAI;AAAA,EACrC;AAAA,EAEA,QAAa,UAAU,SAAgB;AACrC,UAAM,KAAK;AACX,IAAC,KAAK,QAAQ,MAAc,GAAG,IAAI;AAAA,EACrC;AAAA,EAEA,OAAY,UAAU,SAAgB;AACpC,UAAM,KAAK;AACX,IAAC,KAAK,QAAQ,KAAa,GAAG,IAAI;AAAA,EACpC;AAAA,EAEA,OAAY,UAAU,SAAgB;AACpC,UAAM,KAAK;AACX,IAAC,KAAK,QAAQ,KAAa,GAAG,IAAI;AAAA,EACpC;AAAA,EAEA,QAAa,UAAU,SAAgB;AACrC,UAAM,KAAK;AACX,IAAC,KAAK,QAAQ,MAAc,GAAG,IAAI;AAAA,EACrC;AAAA,EAEA,QAAa,UAAU,SAAgB;AACrC,UAAM,KAAK;AACX,IAAC,KAAK,QAAQ,MAAc,GAAG,IAAI;AAAA,EACrC;AACF;AAKO,SAAS,aAAa,SAAuB,CAAC,GAAW;AAC9D,SAAO,IAAI,cAAc,MAAM;AACjC;;;AF9CA;AAYO,SAASC,kBAAiB,SAAuB,CAAC,GAAQ;AAC/D,SAAO,aAAa;AAAA,IAClB,GAAG;AAAA,IACH,aAAa;AAAA,EACf,CAAC;AACH;","names":["shouldLog","createTestLogger","createTestLogger","createConsoleLogger","createTestLogger"]} |
+2
-2
| export { createLogger } from './index.cjs'; | ||
| import { b as LogLevel, L as LoggerConfig } from './logger-Lmm6XEQc.cjs'; | ||
| export { a as Logger } from './logger-Lmm6XEQc.cjs'; | ||
| import { b as LogLevel, L as LoggerConfig } from './logger-Dd9o7ZZH.cjs'; | ||
| export { a as Logger } from './logger-Dd9o7ZZH.cjs'; | ||
@@ -5,0 +5,0 @@ /** |
+2
-2
| export { createLogger } from './index.js'; | ||
| import { b as LogLevel, L as LoggerConfig } from './logger-Lmm6XEQc.js'; | ||
| export { a as Logger } from './logger-Lmm6XEQc.js'; | ||
| import { b as LogLevel, L as LoggerConfig } from './logger-Dd9o7ZZH.js'; | ||
| export { a as Logger } from './logger-Dd9o7ZZH.js'; | ||
@@ -5,0 +5,0 @@ /** |
+3
-3
@@ -179,8 +179,8 @@ var __defProp = Object.defineProperty; | ||
| } else if (env === "nodejs") { | ||
| const adapterPath = "./pino-adapter.js"; | ||
| const { createPinoLogger } = await import( | ||
| const adapterPath = "./node-adapter.js"; | ||
| const { createNodeLogger } = await import( | ||
| /* @vite-ignore */ | ||
| adapterPath | ||
| ); | ||
| return createPinoLogger(config); | ||
| return createNodeLogger(config); | ||
| } else { | ||
@@ -187,0 +187,0 @@ const { createConsoleLogger: createConsoleLogger2 } = await Promise.resolve().then(() => (init_console_adapter(), console_adapter_exports)); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/core/adapter-factory.ts","../src/api/logger.ts","../src/test.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./pino-adapter\" + \".js\";\n const { createPinoLogger } = await import(/* @vite-ignore */ adapterPath);\n return createPinoLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n","/**\n * Test environment entry point\n * Provides in-memory logger for testing with inspection utilities\n */\nimport { createLogger } from \"~/api/logger.js\";\nimport type { LoggerConfig } from \"~/types/index.js\";\n\n// Export test utilities\nexport {\n getTestLogs,\n getTestLogsByLevel,\n clearTestLogs,\n getTestLogsCount,\n type CapturedLog,\n} from \"~/core/test-adapter.js\";\n\n/**\n * Create a test logger instance\n * Automatically uses test adapter with in-memory capture\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n return createLogger({\n ...config,\n environment: \"test\",\n });\n}\n\n// Re-export the standard createLogger for convenience\nexport { createLogger };\n\n// Re-export types\nexport type { LoggerConfig, Logger, LogLevel } from \"~/types/index.js\";\n"],"mappings":"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","names":["shouldLog","createTestLogger","createConsoleLogger","createTestLogger"]} | ||
| {"version":3,"sources":["../src/core/test-adapter.ts","../src/core/console-adapter.ts","../src/core/adapter-factory.ts","../src/api/logger.ts","../src/test.ts"],"sourcesContent":["/**\n * Test adapter - In-memory logger for testing environments\n * Captures all logs in memory for inspection and assertion\n */\nimport type { LoggerConfig, LogLevel } from \"~/types/index.js\";\n\nexport interface CapturedLog {\n level: LogLevel;\n message: string;\n context?: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Global log storage for test environment\n * Shared across all test logger instances in the same process\n */\nconst capturedLogs: CapturedLog[] = [];\n\n/**\n * Log level priority mapping for filtering\n */\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\n/**\n * Get current log level priority\n */\nfunction getMinLogLevel(level: LogLevel = \"info\"): number {\n return LOG_LEVEL_PRIORITY[level];\n}\n\n/**\n * Check if a log level should be recorded based on config\n */\nfunction shouldLog(level: LogLevel, minLevel: number): boolean {\n return LOG_LEVEL_PRIORITY[level] >= minLevel;\n}\n\n/**\n * Create a log entry and optionally output to console\n */\nfunction createLogEntry(\n level: LogLevel,\n args: any[],\n shouldOutput: boolean,\n minLevel: number,\n): void {\n // Check if this level should be logged\n if (!shouldLog(level, minLevel)) {\n return;\n }\n\n let message: string;\n let context: Record<string, any> | undefined;\n\n // Parse arguments - support both (message) and (context, message) patterns\n if (args.length === 1) {\n if (typeof args[0] === \"string\") {\n message = args[0];\n } else {\n context = args[0];\n message = JSON.stringify(args[0]);\n }\n } else if (args.length >= 2) {\n // First arg might be context object\n if (typeof args[0] === \"object\" && args[0] !== null) {\n context = args[0];\n message = args.slice(1).join(\" \");\n } else {\n message = args.join(\" \");\n }\n } else {\n message = \"\";\n }\n\n // Always capture in memory\n capturedLogs.push({\n level,\n message,\n context,\n timestamp: Date.now(),\n });\n\n // Optionally output to console\n if (shouldOutput) {\n const consoleMethod = level === \"fatal\" ? \"error\" : level;\n const logFn = (console as any)[consoleMethod] || console.log;\n\n if (context) {\n logFn(`[${level.toUpperCase()}]`, context, message);\n } else {\n logFn(`[${level.toUpperCase()}]`, message);\n }\n }\n}\n\n/**\n * Create a test logger instance\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n // Default: silent in tests (console: false), unless explicitly enabled\n const shouldOutput = config.console === true;\n const minLevel = getMinLogLevel(config.level);\n\n return {\n trace: (...args: any[]) =>\n createLogEntry(\"trace\", args, shouldOutput, minLevel),\n debug: (...args: any[]) =>\n createLogEntry(\"debug\", args, shouldOutput, minLevel),\n info: (...args: any[]) =>\n createLogEntry(\"info\", args, shouldOutput, minLevel),\n warn: (...args: any[]) =>\n createLogEntry(\"warn\", args, shouldOutput, minLevel),\n error: (...args: any[]) =>\n createLogEntry(\"error\", args, shouldOutput, minLevel),\n fatal: (...args: any[]) =>\n createLogEntry(\"fatal\", args, shouldOutput, minLevel),\n };\n}\n\n/**\n * Get all captured logs\n */\nexport function getTestLogs(): CapturedLog[] {\n return [...capturedLogs];\n}\n\n/**\n * Get logs filtered by level\n */\nexport function getTestLogsByLevel(level: LogLevel): CapturedLog[] {\n return capturedLogs.filter((log) => log.level === level);\n}\n\n/**\n * Clear all captured logs\n */\nexport function clearTestLogs(): void {\n capturedLogs.length = 0;\n}\n\n/**\n * Get the count of captured logs\n */\nexport function getTestLogsCount(): number {\n return capturedLogs.length;\n}\n","/**\n * Console logger adapter - for edge runtimes and browsers\n */\nimport type { LoggerConfig } from \"~/types/config.js\";\nimport type { LogLevel } from \"~/types/logger.js\";\n\ninterface ConsoleLoggerInstance {\n trace: (...args: any[]) => void;\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n fatal: (...args: any[]) => void;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n};\n\nconst defaultConfig: LoggerConfig = {\n level: \"info\",\n console: true,\n colors: true,\n name: \"app\",\n};\n\n/**\n * Create a console-based logger instance for edge runtimes\n */\nexport function createConsoleLogger(\n config: LoggerConfig = {},\n): ConsoleLoggerInstance {\n const finalConfig = { ...defaultConfig, ...config };\n const levelThreshold = LOG_LEVELS[finalConfig.level || \"info\"];\n const name = finalConfig.name || \"app\";\n\n const formatMessage = (level: LogLevel, ...args: any[]): string => {\n const timestamp = new Date().toISOString();\n const prefix = `[${timestamp}] [${level.toUpperCase()}] [${name}]`;\n return `${prefix} ${args.join(\" \")}`;\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n return LOG_LEVELS[level] >= levelThreshold;\n };\n\n const logMethod = (level: LogLevel, consoleMethod: any) => {\n return (...args: any[]) => {\n if (!shouldLog(level)) return;\n if (!finalConfig.console) return;\n\n const message = formatMessage(level, ...args);\n consoleMethod(message);\n };\n };\n\n return {\n trace: logMethod(\"trace\", console.log),\n debug: logMethod(\"debug\", console.log),\n info: logMethod(\"info\", console.info),\n warn: logMethod(\"warn\", console.warn),\n error: logMethod(\"error\", console.error),\n fatal: logMethod(\"fatal\", console.error),\n };\n}\n","/**\n * Logger adapter factory - auto-detect environment and create appropriate logger\n */\nimport type { LoggerConfig, RuntimeEnvironment } from \"~/types/config.js\";\n\n/**\n * Detect the current runtime environment\n */\nexport function detectEnvironment(): RuntimeEnvironment {\n // Priority 0: Check for test environment (vitest, jest, etc.)\n // Test environments should use in-memory test adapter\n if (\n typeof process !== \"undefined\" &&\n (process.env.VITEST === \"true\" ||\n process.env.JEST_WORKER_ID !== undefined ||\n process.env.NODE_ENV === \"test\")\n ) {\n return \"test\";\n }\n\n // Priority 1: Check for Cloudflare Workers specific globals\n // Workers have caches API - this is the most reliable indicator\n // If these globals exist, it's definitely Cloudflare Workers runtime\n if (\n typeof globalThis !== \"undefined\" &&\n \"caches\" in globalThis &&\n \"Request\" in globalThis &&\n \"Response\" in globalThis\n ) {\n // Presence of Workers globals is sufficient - return immediately\n // Don't check fs/process as they're unreliable in wrangler dev with nodejs_compat\n return \"cloudflare-workers\";\n }\n\n // Priority 2: Check for Node.js\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"nodejs\";\n }\n\n // Fallback to browser\n return \"browser\";\n}\n\n/**\n * Create appropriate logger adapter based on environment\n *\n * Uses dynamic import() to conditionally load adapters based on runtime.\n * Tree-shaking in production builds ensures unused adapters are removed.\n */\nexport async function createLoggerAdapter(\n config: LoggerConfig = {},\n): Promise<any> {\n const env = config.environment || detectEnvironment();\n\n if (env === \"test\") {\n // Test adapter for vitest/jest - in-memory, silent by default\n const { createTestLogger } = await import(\"./test-adapter.js\");\n return createTestLogger(config);\n } else if (env === \"nodejs\") {\n // Use string concatenation to hide import from bundler static analysis\n // This prevents edge runtime bundlers from including Node.js-only dependencies\n const adapterPath = \"./node-adapter\" + \".js\";\n const { createNodeLogger } = await import(/* @vite-ignore */ adapterPath);\n return createNodeLogger(config);\n } else {\n // Console adapter is safe for all environments\n const { createConsoleLogger } = await import(\"./console-adapter.js\");\n return createConsoleLogger(config);\n }\n}\n","/**\n * Default logger implementation\n */\nimport type { Logger, LoggerConfig } from \"~/types/index.js\";\nimport { createLoggerAdapter } from \"~/core/adapter-factory.js\";\n\nexport class DefaultLogger implements Logger {\n private adapter: any;\n private initPromise: Promise<void>;\n\n constructor(config: LoggerConfig = {}) {\n // Initialize adapter asynchronously\n this.initPromise = createLoggerAdapter(config).then((adapter) => {\n this.adapter = adapter;\n });\n }\n\n // All methods are typed as `any` for maximum flexibility\n trace: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.trace as any)(...args);\n };\n\n debug: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.debug as any)(...args);\n };\n\n info: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.info as any)(...args);\n };\n\n warn: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.warn as any)(...args);\n };\n\n error: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.error as any)(...args);\n };\n\n fatal: any = async (...args: any[]) => {\n await this.initPromise;\n (this.adapter.fatal as any)(...args);\n };\n}\n\n/**\n * Factory function to create a logger instance\n */\nexport function createLogger(config: LoggerConfig = {}): Logger {\n return new DefaultLogger(config);\n}\n","/**\n * Test environment entry point\n * Provides in-memory logger for testing with inspection utilities\n */\nimport { createLogger } from \"~/api/logger.js\";\nimport type { LoggerConfig } from \"~/types/index.js\";\n\n// Export test utilities\nexport {\n getTestLogs,\n getTestLogsByLevel,\n clearTestLogs,\n getTestLogsCount,\n type CapturedLog,\n} from \"~/core/test-adapter.js\";\n\n/**\n * Create a test logger instance\n * Automatically uses test adapter with in-memory capture\n */\nexport function createTestLogger(config: LoggerConfig = {}): any {\n return createLogger({\n ...config,\n environment: \"test\",\n });\n}\n\n// Re-export the standard createLogger for convenience\nexport { createLogger };\n\n// Re-export types\nexport type { LoggerConfig, Logger, LogLevel } from \"~/types/index.js\";\n"],"mappings":"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","names":["shouldLog","createTestLogger","createConsoleLogger","createTestLogger"]} |
+6
-1
| { | ||
| "name": "@deepracticex/logger", | ||
| "version": "1.1.0", | ||
| "version": "1.1.1", | ||
| "description": "Unified logging system for Deepractice projects using Pino", | ||
@@ -34,2 +34,7 @@ "type": "module", | ||
| "require": "./dist/test.cjs" | ||
| }, | ||
| "./pkg": { | ||
| "types": "./dist/pkg.d.ts", | ||
| "import": "./dist/pkg.js", | ||
| "require": "./dist/pkg.cjs" | ||
| } | ||
@@ -36,0 +41,0 @@ }, |
| /** | ||
| * Runtime environment type | ||
| */ | ||
| type RuntimeEnvironment = "nodejs" | "cloudflare-workers" | "browser" | "test"; | ||
| /** | ||
| * Logger configuration interface | ||
| */ | ||
| interface LoggerConfig { | ||
| /** | ||
| * Log level threshold | ||
| * @default "info" | ||
| */ | ||
| level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| /** | ||
| * Enable console output | ||
| * @default true | ||
| */ | ||
| console?: boolean; | ||
| /** | ||
| * File logging configuration | ||
| * @default { dirname: "~/.deepractice/logs" } | ||
| */ | ||
| file?: boolean | { | ||
| dirname?: string; | ||
| }; | ||
| /** | ||
| * Enable colored output | ||
| * @default true | ||
| */ | ||
| colors?: boolean; | ||
| /** | ||
| * Package/service name for identification | ||
| * @default "app" | ||
| */ | ||
| name?: string; | ||
| /** | ||
| * Explicitly specify the runtime environment | ||
| * If not provided, will auto-detect | ||
| * @default auto-detect | ||
| */ | ||
| environment?: RuntimeEnvironment; | ||
| } | ||
| /** | ||
| * Logger interface - all methods accept any arguments for maximum flexibility | ||
| */ | ||
| interface Logger { | ||
| /** | ||
| * Log trace level message | ||
| */ | ||
| trace: any; | ||
| /** | ||
| * Log debug level message | ||
| */ | ||
| debug: any; | ||
| /** | ||
| * Log info level message | ||
| */ | ||
| info: any; | ||
| /** | ||
| * Log warning level message | ||
| */ | ||
| warn: any; | ||
| /** | ||
| * Log error level message | ||
| */ | ||
| error: any; | ||
| /** | ||
| * Log fatal level message | ||
| */ | ||
| fatal: any; | ||
| } | ||
| /** | ||
| * Log level type | ||
| */ | ||
| type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| export type { LoggerConfig as L, Logger as a, LogLevel as b }; |
| /** | ||
| * Runtime environment type | ||
| */ | ||
| type RuntimeEnvironment = "nodejs" | "cloudflare-workers" | "browser" | "test"; | ||
| /** | ||
| * Logger configuration interface | ||
| */ | ||
| interface LoggerConfig { | ||
| /** | ||
| * Log level threshold | ||
| * @default "info" | ||
| */ | ||
| level?: "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| /** | ||
| * Enable console output | ||
| * @default true | ||
| */ | ||
| console?: boolean; | ||
| /** | ||
| * File logging configuration | ||
| * @default { dirname: "~/.deepractice/logs" } | ||
| */ | ||
| file?: boolean | { | ||
| dirname?: string; | ||
| }; | ||
| /** | ||
| * Enable colored output | ||
| * @default true | ||
| */ | ||
| colors?: boolean; | ||
| /** | ||
| * Package/service name for identification | ||
| * @default "app" | ||
| */ | ||
| name?: string; | ||
| /** | ||
| * Explicitly specify the runtime environment | ||
| * If not provided, will auto-detect | ||
| * @default auto-detect | ||
| */ | ||
| environment?: RuntimeEnvironment; | ||
| } | ||
| /** | ||
| * Logger interface - all methods accept any arguments for maximum flexibility | ||
| */ | ||
| interface Logger { | ||
| /** | ||
| * Log trace level message | ||
| */ | ||
| trace: any; | ||
| /** | ||
| * Log debug level message | ||
| */ | ||
| debug: any; | ||
| /** | ||
| * Log info level message | ||
| */ | ||
| info: any; | ||
| /** | ||
| * Log warning level message | ||
| */ | ||
| warn: any; | ||
| /** | ||
| * Log error level message | ||
| */ | ||
| error: any; | ||
| /** | ||
| * Log fatal level message | ||
| */ | ||
| fatal: any; | ||
| } | ||
| /** | ||
| * Log level type | ||
| */ | ||
| type LogLevel = "trace" | "debug" | "info" | "warn" | "error" | "fatal"; | ||
| export type { LoggerConfig as L, Logger as a, LogLevel as b }; |
188437
12.58%40
17.65%1952
12.06%28
16.67%