@nmakarov/cli-toolkit 0.76.0 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/logger.cjs CHANGED
@@ -91,6 +91,8 @@ var Logger = class _Logger {
91
91
  options;
92
92
  transport;
93
93
  startTimes = {};
94
+ /** Count at the first progress sample for each prefix (rate baseline). */
95
+ startCounts = {};
94
96
  lastProgressTimes = {};
95
97
  constructor(context, options = {}) {
96
98
  this.context = context;
@@ -226,15 +228,17 @@ var Logger = class _Logger {
226
228
  total,
227
229
  prefix
228
230
  };
229
- if (!this.startTimes[prefix ?? ""]) {
230
- this.startTimes[prefix ?? ""] = Date.now();
231
+ const key = prefix ?? "";
232
+ if (this.startTimes[key] === void 0) {
233
+ this.startTimes[key] = Date.now();
234
+ this.startCounts[key] = count;
231
235
  }
232
236
  const wantTimes = this.options.progressTimes;
233
237
  const wantRate = this.options.progressRate;
234
238
  if (wantTimes || wantRate) {
235
- const elapsedSeconds = (Date.now() - this.startTimes[prefix ?? ""]) / 1e3;
236
- const intervals = count > 1 ? count - 1 : 0;
237
- const itemsPerSec = intervals > 0 && elapsedSeconds > 0 ? intervals / elapsedSeconds : -1;
239
+ const elapsedSeconds = (Date.now() - this.startTimes[key]) / 1e3;
240
+ const done = count - (this.startCounts[key] ?? count);
241
+ const itemsPerSec = done > 0 && elapsedSeconds > 0 ? done / elapsedSeconds : -1;
238
242
  if (wantTimes) {
239
243
  let remaining = -1;
240
244
  if (itemsPerSec > 0) {
@@ -248,8 +252,9 @@ var Logger = class _Logger {
248
252
  }
249
253
  }
250
254
  if (count >= total) {
251
- delete this.startTimes[prefix ?? ""];
252
- delete this.lastProgressTimes[prefix ?? ""];
255
+ delete this.startTimes[key];
256
+ delete this.startCounts[key];
257
+ delete this.lastProgressTimes[key];
253
258
  }
254
259
  if (this.shouldOutputProgress(prefix ?? "", count, total)) {
255
260
  this.out(payload);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/logger/index.js","../src/logger/transports.js"],"sourcesContent":["import chalk from \"chalk\";\nimport util from \"util\";\n\n\n\n\n\n\n\n\n\n\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\n\nconst ALL_LEVELS = [\n \"silly\",\n \"debug\",\n \"logic\",\n \"info\",\n \"notice\",\n \"warn\",\n \"error\",\n \"results\",\n \"request\",\n \"response\",\n \"progress\"\n];\nconst DEFAULT_LEVELS = ALL_LEVELS.filter((l) => l !== \"silly\");\n\n// Calculate maximum level name length for alignment\nconst MAX_LEVEL_LENGTH = Math.max(...ALL_LEVELS.map(level => level.toUpperCase().length));\n\nconst LEVEL_COLORS = {\n error: chalk.red.bold,\n warn: chalk.rgb(255, 165, 0),\n notice: chalk.cyan,\n info: chalk.white.bold,\n logic: chalk.gray,\n debug: chalk.gray,\n silly: chalk.gray,\n request: chalk.green,\n response: chalk.yellow,\n // Magenta stands out from white info / green request lines.\n progress: chalk.magentaBright,\n results: chalk.magenta\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\nexport class Logger {\n context; // Partial context during initialization\n options;\n transport;\n startTimes = {};\n lastProgressTimes = {};\n\n constructor(context, options = {}) {\n this.context = context;\n // Set defaults first\n this.options = this.getDefaultOptions();\n // Apply configuration\n if (options) {\n this.configure(options);\n }\n // Initialize transport\n this.updateTransport();\n }\n\n /**\n * Configure logger options. Accepts both LoggerOptions shape and flat param names\n * (levels string, progressWithTimes, progressWithRate, progressThrottleMs).\n */\n configure(options) {\n if (options.mode !== undefined) {\n this.options.mode = this.isValidMode(options.mode) ? options.mode : \"text\";\n }\n if (options.route !== undefined) {\n this.options.route = options.route;\n this.updateTransport();\n }\n if (options.prefix !== undefined) this.options.prefix = options.prefix;\n if (options.silent !== undefined) this.options.silent = options.silent;\n if (options.showLevel !== undefined) this.options.showLevel = options.showLevel;\n if (options.timestamp !== undefined) this.options.timestamp = options.timestamp;\n if (options.levels !== undefined) {\n const levels = typeof options.levels === \"string\" ? options.levels.split(\",\") : options.levels;\n this.options.levels = this.normalizeLevels(levels);\n }\n if (options.progress !== undefined) {\n if (options.progress.withTimes !== undefined) this.options.progressTimes = options.progress.withTimes;\n if (options.progress.withRate !== undefined) this.options.progressRate = options.progress.withRate;\n if (options.progress.throttleMs !== undefined) this.options.progressThrottle = options.progress.throttleMs;\n }\n const flat = options ;\n if (flat.progressWithTimes !== undefined) this.options.progressTimes = flat.progressWithTimes;\n if (flat.progressWithRate !== undefined) this.options.progressRate = flat.progressWithRate;\n if (flat.progressThrottleMs !== undefined) this.options.progressThrottle = flat.progressThrottleMs;\n }\n\n /**\n * Initialize logger from context and CLI parameters. Whatever is in options goes (after discovered params).\n * Params are tracked under the `logger` module for --showUsedParams.\n */\n static init(context, options) {\n const paramDefs = {\n mode: \"string default text\",\n route: \"string default console\",\n prefix: \"string\",\n silent: \"boolean default false\",\n showLevel: \"boolean default true\",\n timestamp: \"boolean default false\",\n levels: \"string\",\n progressWithTimes: \"boolean default false\",\n progressWithRate: \"boolean default false\",\n progressThrottleMs: \"number\",\n };\n const discovered = context.params.getAllForModule(\"logger\", paramDefs);\n const config = { ...discovered, ...options } ;\n const logger = new Logger(context, config);\n context.logger = logger;\n return logger;\n }\n\n getDefaultOptions() {\n return {\n mode: \"text\",\n route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n prefix: undefined,\n silent: false,\n showLevel: false,\n timestamp: false,\n levels: DEFAULT_LEVELS,\n progressTimes: false,\n progressRate: false,\n progressThrottle: undefined,\n };\n }\n\n updateTransport() {\n this.transport = this.options.route === \"ipc\"\n ? new ParentProcessTransport()\n : new ConsoleTransport();\n }\n\n setMode(mode) {\n if (!this.isValidMode(mode)) {\n throw new Error(`Unsupported logger mode: ${mode}`);\n }\n this.options.mode = mode;\n }\n\n /** Returns a styled string (bright white) for highlighting; keeps chalk inside logger. */\n highlight(text) {\n return chalk.whiteBright(text);\n }\n\n debug(message, ...chunks) {\n this.out({ level: \"debug\", message, chunks });\n }\n\n info(message, ...chunks) {\n this.out({ level: \"info\", message, chunks });\n }\n\n notice(message, ...chunks) {\n this.out({ level: \"notice\", message, chunks });\n }\n\n warn(message, ...chunks) {\n this.out({ level: \"warn\", message, chunks });\n }\n\n error(message, ...chunks) {\n this.out({ level: \"error\", message, chunks });\n }\n\n logic(message, ...chunks) {\n this.out({ level: \"logic\", message, chunks });\n }\n\n silly(message, ...chunks) {\n this.out({ level: \"silly\", message, chunks });\n }\n\n results(results) {\n this.out({ level: \"results\", message: \"results\", results });\n }\n\n request(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"request\", message });\n }\n\n response(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"response\", message });\n }\n\n /**\n * @returns {boolean} true when the progress line was emitted (not throttled)\n */\n progress(message, opts) {\n const { prefix, count, total } = opts;\n const paddedTotal = String(total).length;\n const paddedCount = String(count).padStart(paddedTotal, \" \");\n const payload = {\n level: \"progress\",\n message,\n count: paddedCount,\n total,\n prefix\n };\n\n if (!this.startTimes[prefix ?? \"\"]) {\n this.startTimes[prefix ?? \"\"] = Date.now();\n }\n const wantTimes = this.options.progressTimes;\n const wantRate = this.options.progressRate;\n if (wantTimes || wantRate) {\n const elapsedSeconds = (Date.now() - this.startTimes[prefix ?? \"\"]) / 1000;\n // Intervals completed = count - 1 (same basis as ETA).\n const intervals = count > 1 ? count - 1 : 0;\n const itemsPerSec = intervals > 0 && elapsedSeconds > 0 ? intervals / elapsedSeconds : -1;\n if (wantTimes) {\n let remaining = -1;\n if (itemsPerSec > 0) {\n remaining = (total - count) / itemsPerSec;\n }\n payload.elapsed = this.round(elapsedSeconds, 2);\n payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n }\n if (wantRate) {\n payload.rate = itemsPerSec >= 0 ? this.round(itemsPerSec, 2) : itemsPerSec;\n }\n }\n\n if (count >= total) {\n delete this.startTimes[prefix ?? \"\"];\n delete this.lastProgressTimes[prefix ?? \"\"];\n }\n\n if (this.shouldOutputProgress(prefix ?? \"\", count, total)) {\n this.out(payload);\n if (this.options.progressThrottle && prefix) {\n this.lastProgressTimes[prefix] = Date.now();\n }\n return true;\n }\n return false;\n }\n\n shouldOutputProgress(prefix, count, total) {\n if (!this.options.progressThrottle) {\n return true;\n }\n if (count === 1 || count === total || !prefix) {\n return true;\n }\n const lastTime = this.lastProgressTimes[prefix];\n if (!lastTime) {\n return true;\n }\n return Date.now() - lastTime >= this.options.progressThrottle;\n }\n\n out(struct) {\n if (this.options.silent) {\n return;\n }\n if (!this.options.levels.includes(struct.level)) {\n return;\n }\n\n if (this.options.prefix && !struct.prefix) {\n struct.prefix = this.options.prefix;\n }\n\n const output = this.options.mode === \"json\"\n ? struct\n : this.formatLog(struct);\n\n this.transport.write(output);\n }\n\n formatLog(struct) {\n const parts = [];\n const now = new Date();\n\n if (this.options.timestamp) {\n parts.push(now.toISOString());\n }\n\n if (this.options.showLevel) {\n parts.push(struct.level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n }\n\n if (struct.level === \"progress\") {\n if (struct.prefix) {\n parts.push(LEVEL_COLORS[struct.level].bold(struct.prefix));\n }\n if (struct.count !== undefined && struct.total !== undefined) {\n parts.push(LEVEL_COLORS[struct.level](`${struct.count}/${struct.total}`));\n }\n } else if (struct.prefix) {\n parts.push(chalk.cyan(`[${struct.prefix}]`));\n }\n\n if (struct.message) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter.bold(struct.message));\n }\n\n if (struct.level === \"progress\") {\n const formatter = LEVEL_COLORS[struct.level];\n if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n parts.push(formatter(`${struct.elapsed}/${struct.remaining}`));\n }\n if (struct.rate !== undefined) {\n parts.push(formatter(struct.rate >= 0 ? `${struct.rate}/s` : \"-/s\"));\n }\n }\n\n if (struct.chunks && struct.chunks.length) {\n parts.push(this.inspectChunks(struct.chunks));\n }\n\n if (struct.results) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter(JSON.stringify(struct.results, null, 4)));\n }\n\n return parts.join(\" \");\n }\n\n inspectChunks(chunks) {\n return chunks\n .map(chunk => util.inspect(chunk, { colors: true, depth: null }))\n .join(\" \");\n }\n\n shouldUseIpcRoute() {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n return false;\n }\n // Only use IPC if process.send exists AND we're connected to a parent\n // In Vitest workers, process.send exists but process.connected is undefined/false\n // process.connected is only true in actual child processes created with fork()\n return typeof process.send === \"function\" && process.connected === true;\n }\n\n normalizeLevels(levels) {\n if (!levels || !levels.length) {\n return DEFAULT_LEVELS;\n }\n\n const tokens = levels.map((t) => String(t).trim()).filter(Boolean);\n const explicitIncludes = tokens\n .filter((t) => !t.startsWith(\"+\") && !t.startsWith(\"-\"))\n .map((t) => t );\n const addIncludes = tokens\n .filter((t) => t.startsWith(\"+\"))\n .map((t) => t.slice(1) );\n const excludes = tokens\n .filter((t) => t.startsWith(\"-\"))\n .map((t) => t.slice(1) );\n\n const unknown = [...explicitIncludes, ...addIncludes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n if (unknown.length) {\n console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n }\n\n const base = explicitIncludes.length\n ? explicitIncludes\n : Array.from(new Set([...DEFAULT_LEVELS, ...addIncludes]));\n return base.filter(level => !excludes.includes(level));\n }\n\n isValidMode(mode) {\n return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n }\n\n round(value, places) {\n const factor = Math.pow(10, places);\n return Math.round(value * factor) / factor;\n }\n}\n\n","\n\nexport class ConsoleTransport {\n write(payload) {\n console.info(payload);\n }\n}\n\nexport class ParentProcessTransport {\n write(payload) {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n console.info(payload);\n return;\n }\n // Only use process.send if we're actually connected to a parent process\n // In Vitest workers, process.send exists but shouldn't be used\n if (typeof process.send === \"function\" && process.connected === true) {\n process.send(payload);\n } else {\n console.info(payload);\n }\n }\n}\n\n\n"],"mappings":"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","names":["chalk","util"]}
1
+ {"version":3,"sources":["../src/logger/index.js","../src/logger/transports.js"],"sourcesContent":["import chalk from \"chalk\";\nimport util from \"util\";\n\n\n\n\n\n\n\n\n\n\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\n\nconst ALL_LEVELS = [\n \"silly\",\n \"debug\",\n \"logic\",\n \"info\",\n \"notice\",\n \"warn\",\n \"error\",\n \"results\",\n \"request\",\n \"response\",\n \"progress\"\n];\nconst DEFAULT_LEVELS = ALL_LEVELS.filter((l) => l !== \"silly\");\n\n// Calculate maximum level name length for alignment\nconst MAX_LEVEL_LENGTH = Math.max(...ALL_LEVELS.map(level => level.toUpperCase().length));\n\nconst LEVEL_COLORS = {\n error: chalk.red.bold,\n warn: chalk.rgb(255, 165, 0),\n notice: chalk.cyan,\n info: chalk.white.bold,\n logic: chalk.gray,\n debug: chalk.gray,\n silly: chalk.gray,\n request: chalk.green,\n response: chalk.yellow,\n // Magenta stands out from white info / green request lines.\n progress: chalk.magentaBright,\n results: chalk.magenta\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\nexport class Logger {\n context; // Partial context during initialization\n options;\n transport;\n startTimes = {};\n /** Count at the first progress sample for each prefix (rate baseline). */\n startCounts = {};\n lastProgressTimes = {};\n\n constructor(context, options = {}) {\n this.context = context;\n // Set defaults first\n this.options = this.getDefaultOptions();\n // Apply configuration\n if (options) {\n this.configure(options);\n }\n // Initialize transport\n this.updateTransport();\n }\n\n /**\n * Configure logger options. Accepts both LoggerOptions shape and flat param names\n * (levels string, progressWithTimes, progressWithRate, progressThrottleMs).\n */\n configure(options) {\n if (options.mode !== undefined) {\n this.options.mode = this.isValidMode(options.mode) ? options.mode : \"text\";\n }\n if (options.route !== undefined) {\n this.options.route = options.route;\n this.updateTransport();\n }\n if (options.prefix !== undefined) this.options.prefix = options.prefix;\n if (options.silent !== undefined) this.options.silent = options.silent;\n if (options.showLevel !== undefined) this.options.showLevel = options.showLevel;\n if (options.timestamp !== undefined) this.options.timestamp = options.timestamp;\n if (options.levels !== undefined) {\n const levels = typeof options.levels === \"string\" ? options.levels.split(\",\") : options.levels;\n this.options.levels = this.normalizeLevels(levels);\n }\n if (options.progress !== undefined) {\n if (options.progress.withTimes !== undefined) this.options.progressTimes = options.progress.withTimes;\n if (options.progress.withRate !== undefined) this.options.progressRate = options.progress.withRate;\n if (options.progress.throttleMs !== undefined) this.options.progressThrottle = options.progress.throttleMs;\n }\n const flat = options ;\n if (flat.progressWithTimes !== undefined) this.options.progressTimes = flat.progressWithTimes;\n if (flat.progressWithRate !== undefined) this.options.progressRate = flat.progressWithRate;\n if (flat.progressThrottleMs !== undefined) this.options.progressThrottle = flat.progressThrottleMs;\n }\n\n /**\n * Initialize logger from context and CLI parameters. Whatever is in options goes (after discovered params).\n * Params are tracked under the `logger` module for --showUsedParams.\n */\n static init(context, options) {\n const paramDefs = {\n mode: \"string default text\",\n route: \"string default console\",\n prefix: \"string\",\n silent: \"boolean default false\",\n showLevel: \"boolean default true\",\n timestamp: \"boolean default false\",\n levels: \"string\",\n progressWithTimes: \"boolean default false\",\n progressWithRate: \"boolean default false\",\n progressThrottleMs: \"number\",\n };\n const discovered = context.params.getAllForModule(\"logger\", paramDefs);\n const config = { ...discovered, ...options } ;\n const logger = new Logger(context, config);\n context.logger = logger;\n return logger;\n }\n\n getDefaultOptions() {\n return {\n mode: \"text\",\n route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n prefix: undefined,\n silent: false,\n showLevel: false,\n timestamp: false,\n levels: DEFAULT_LEVELS,\n progressTimes: false,\n progressRate: false,\n progressThrottle: undefined,\n };\n }\n\n updateTransport() {\n this.transport = this.options.route === \"ipc\"\n ? new ParentProcessTransport()\n : new ConsoleTransport();\n }\n\n setMode(mode) {\n if (!this.isValidMode(mode)) {\n throw new Error(`Unsupported logger mode: ${mode}`);\n }\n this.options.mode = mode;\n }\n\n /** Returns a styled string (bright white) for highlighting; keeps chalk inside logger. */\n highlight(text) {\n return chalk.whiteBright(text);\n }\n\n debug(message, ...chunks) {\n this.out({ level: \"debug\", message, chunks });\n }\n\n info(message, ...chunks) {\n this.out({ level: \"info\", message, chunks });\n }\n\n notice(message, ...chunks) {\n this.out({ level: \"notice\", message, chunks });\n }\n\n warn(message, ...chunks) {\n this.out({ level: \"warn\", message, chunks });\n }\n\n error(message, ...chunks) {\n this.out({ level: \"error\", message, chunks });\n }\n\n logic(message, ...chunks) {\n this.out({ level: \"logic\", message, chunks });\n }\n\n silly(message, ...chunks) {\n this.out({ level: \"silly\", message, chunks });\n }\n\n results(results) {\n this.out({ level: \"results\", message: \"results\", results });\n }\n\n request(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"request\", message });\n }\n\n response(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"response\", message });\n }\n\n /**\n * @returns {boolean} true when the progress line was emitted (not throttled)\n */\n progress(message, opts) {\n const { prefix, count, total } = opts;\n const paddedTotal = String(total).length;\n const paddedCount = String(count).padStart(paddedTotal, \" \");\n const payload = {\n level: \"progress\",\n message,\n count: paddedCount,\n total,\n prefix\n };\n\n const key = prefix ?? \"\";\n // First sample for this prefix: establish baseline only (no rate yet).\n // Rate/ETA use items completed since that sample, so batched reporters\n // (e.g. every 500 records) don't inflate early /s from a late start clock.\n if (this.startTimes[key] === undefined) {\n this.startTimes[key] = Date.now();\n this.startCounts[key] = count;\n }\n const wantTimes = this.options.progressTimes;\n const wantRate = this.options.progressRate;\n if (wantTimes || wantRate) {\n const elapsedSeconds = (Date.now() - this.startTimes[key]) / 1000;\n const done = count - (this.startCounts[key] ?? count);\n const itemsPerSec = done > 0 && elapsedSeconds > 0 ? done / elapsedSeconds : -1;\n if (wantTimes) {\n let remaining = -1;\n if (itemsPerSec > 0) {\n remaining = (total - count) / itemsPerSec;\n }\n payload.elapsed = this.round(elapsedSeconds, 2);\n payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n }\n if (wantRate) {\n payload.rate = itemsPerSec >= 0 ? this.round(itemsPerSec, 2) : itemsPerSec;\n }\n }\n\n if (count >= total) {\n delete this.startTimes[key];\n delete this.startCounts[key];\n delete this.lastProgressTimes[key];\n }\n\n if (this.shouldOutputProgress(prefix ?? \"\", count, total)) {\n this.out(payload);\n if (this.options.progressThrottle && prefix) {\n this.lastProgressTimes[prefix] = Date.now();\n }\n return true;\n }\n return false;\n }\n\n shouldOutputProgress(prefix, count, total) {\n if (!this.options.progressThrottle) {\n return true;\n }\n if (count === 1 || count === total || !prefix) {\n return true;\n }\n const lastTime = this.lastProgressTimes[prefix];\n if (!lastTime) {\n return true;\n }\n return Date.now() - lastTime >= this.options.progressThrottle;\n }\n\n out(struct) {\n if (this.options.silent) {\n return;\n }\n if (!this.options.levels.includes(struct.level)) {\n return;\n }\n\n if (this.options.prefix && !struct.prefix) {\n struct.prefix = this.options.prefix;\n }\n\n const output = this.options.mode === \"json\"\n ? struct\n : this.formatLog(struct);\n\n this.transport.write(output);\n }\n\n formatLog(struct) {\n const parts = [];\n const now = new Date();\n\n if (this.options.timestamp) {\n parts.push(now.toISOString());\n }\n\n if (this.options.showLevel) {\n parts.push(struct.level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n }\n\n if (struct.level === \"progress\") {\n if (struct.prefix) {\n parts.push(LEVEL_COLORS[struct.level].bold(struct.prefix));\n }\n if (struct.count !== undefined && struct.total !== undefined) {\n parts.push(LEVEL_COLORS[struct.level](`${struct.count}/${struct.total}`));\n }\n } else if (struct.prefix) {\n parts.push(chalk.cyan(`[${struct.prefix}]`));\n }\n\n if (struct.message) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter.bold(struct.message));\n }\n\n if (struct.level === \"progress\") {\n const formatter = LEVEL_COLORS[struct.level];\n if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n parts.push(formatter(`${struct.elapsed}/${struct.remaining}`));\n }\n if (struct.rate !== undefined) {\n parts.push(formatter(struct.rate >= 0 ? `${struct.rate}/s` : \"-/s\"));\n }\n }\n\n if (struct.chunks && struct.chunks.length) {\n parts.push(this.inspectChunks(struct.chunks));\n }\n\n if (struct.results) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter(JSON.stringify(struct.results, null, 4)));\n }\n\n return parts.join(\" \");\n }\n\n inspectChunks(chunks) {\n return chunks\n .map(chunk => util.inspect(chunk, { colors: true, depth: null }))\n .join(\" \");\n }\n\n shouldUseIpcRoute() {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n return false;\n }\n // Only use IPC if process.send exists AND we're connected to a parent\n // In Vitest workers, process.send exists but process.connected is undefined/false\n // process.connected is only true in actual child processes created with fork()\n return typeof process.send === \"function\" && process.connected === true;\n }\n\n normalizeLevels(levels) {\n if (!levels || !levels.length) {\n return DEFAULT_LEVELS;\n }\n\n const tokens = levels.map((t) => String(t).trim()).filter(Boolean);\n const explicitIncludes = tokens\n .filter((t) => !t.startsWith(\"+\") && !t.startsWith(\"-\"))\n .map((t) => t );\n const addIncludes = tokens\n .filter((t) => t.startsWith(\"+\"))\n .map((t) => t.slice(1) );\n const excludes = tokens\n .filter((t) => t.startsWith(\"-\"))\n .map((t) => t.slice(1) );\n\n const unknown = [...explicitIncludes, ...addIncludes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n if (unknown.length) {\n console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n }\n\n const base = explicitIncludes.length\n ? explicitIncludes\n : Array.from(new Set([...DEFAULT_LEVELS, ...addIncludes]));\n return base.filter(level => !excludes.includes(level));\n }\n\n isValidMode(mode) {\n return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n }\n\n round(value, places) {\n const factor = Math.pow(10, places);\n return Math.round(value * factor) / factor;\n }\n}\n\n","\n\nexport class ConsoleTransport {\n write(payload) {\n console.info(payload);\n }\n}\n\nexport class ParentProcessTransport {\n write(payload) {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n console.info(payload);\n return;\n }\n // Only use process.send if we're actually connected to a parent process\n // In Vitest workers, process.send exists but shouldn't be used\n if (typeof process.send === \"function\" && process.connected === true) {\n process.send(payload);\n } else {\n console.info(payload);\n }\n }\n}\n\n\n"],"mappings":"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","names":["chalk","util"]}
package/dist/logger.js CHANGED
@@ -58,6 +58,8 @@ var Logger = class _Logger {
58
58
  options;
59
59
  transport;
60
60
  startTimes = {};
61
+ /** Count at the first progress sample for each prefix (rate baseline). */
62
+ startCounts = {};
61
63
  lastProgressTimes = {};
62
64
  constructor(context, options = {}) {
63
65
  this.context = context;
@@ -193,15 +195,17 @@ var Logger = class _Logger {
193
195
  total,
194
196
  prefix
195
197
  };
196
- if (!this.startTimes[prefix ?? ""]) {
197
- this.startTimes[prefix ?? ""] = Date.now();
198
+ const key = prefix ?? "";
199
+ if (this.startTimes[key] === void 0) {
200
+ this.startTimes[key] = Date.now();
201
+ this.startCounts[key] = count;
198
202
  }
199
203
  const wantTimes = this.options.progressTimes;
200
204
  const wantRate = this.options.progressRate;
201
205
  if (wantTimes || wantRate) {
202
- const elapsedSeconds = (Date.now() - this.startTimes[prefix ?? ""]) / 1e3;
203
- const intervals = count > 1 ? count - 1 : 0;
204
- const itemsPerSec = intervals > 0 && elapsedSeconds > 0 ? intervals / elapsedSeconds : -1;
206
+ const elapsedSeconds = (Date.now() - this.startTimes[key]) / 1e3;
207
+ const done = count - (this.startCounts[key] ?? count);
208
+ const itemsPerSec = done > 0 && elapsedSeconds > 0 ? done / elapsedSeconds : -1;
205
209
  if (wantTimes) {
206
210
  let remaining = -1;
207
211
  if (itemsPerSec > 0) {
@@ -215,8 +219,9 @@ var Logger = class _Logger {
215
219
  }
216
220
  }
217
221
  if (count >= total) {
218
- delete this.startTimes[prefix ?? ""];
219
- delete this.lastProgressTimes[prefix ?? ""];
222
+ delete this.startTimes[key];
223
+ delete this.startCounts[key];
224
+ delete this.lastProgressTimes[key];
220
225
  }
221
226
  if (this.shouldOutputProgress(prefix ?? "", count, total)) {
222
227
  this.out(payload);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/logger/index.js","../src/logger/transports.js"],"sourcesContent":["import chalk from \"chalk\";\nimport util from \"util\";\n\n\n\n\n\n\n\n\n\n\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\n\nconst ALL_LEVELS = [\n \"silly\",\n \"debug\",\n \"logic\",\n \"info\",\n \"notice\",\n \"warn\",\n \"error\",\n \"results\",\n \"request\",\n \"response\",\n \"progress\"\n];\nconst DEFAULT_LEVELS = ALL_LEVELS.filter((l) => l !== \"silly\");\n\n// Calculate maximum level name length for alignment\nconst MAX_LEVEL_LENGTH = Math.max(...ALL_LEVELS.map(level => level.toUpperCase().length));\n\nconst LEVEL_COLORS = {\n error: chalk.red.bold,\n warn: chalk.rgb(255, 165, 0),\n notice: chalk.cyan,\n info: chalk.white.bold,\n logic: chalk.gray,\n debug: chalk.gray,\n silly: chalk.gray,\n request: chalk.green,\n response: chalk.yellow,\n // Magenta stands out from white info / green request lines.\n progress: chalk.magentaBright,\n results: chalk.magenta\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\nexport class Logger {\n context; // Partial context during initialization\n options;\n transport;\n startTimes = {};\n lastProgressTimes = {};\n\n constructor(context, options = {}) {\n this.context = context;\n // Set defaults first\n this.options = this.getDefaultOptions();\n // Apply configuration\n if (options) {\n this.configure(options);\n }\n // Initialize transport\n this.updateTransport();\n }\n\n /**\n * Configure logger options. Accepts both LoggerOptions shape and flat param names\n * (levels string, progressWithTimes, progressWithRate, progressThrottleMs).\n */\n configure(options) {\n if (options.mode !== undefined) {\n this.options.mode = this.isValidMode(options.mode) ? options.mode : \"text\";\n }\n if (options.route !== undefined) {\n this.options.route = options.route;\n this.updateTransport();\n }\n if (options.prefix !== undefined) this.options.prefix = options.prefix;\n if (options.silent !== undefined) this.options.silent = options.silent;\n if (options.showLevel !== undefined) this.options.showLevel = options.showLevel;\n if (options.timestamp !== undefined) this.options.timestamp = options.timestamp;\n if (options.levels !== undefined) {\n const levels = typeof options.levels === \"string\" ? options.levels.split(\",\") : options.levels;\n this.options.levels = this.normalizeLevels(levels);\n }\n if (options.progress !== undefined) {\n if (options.progress.withTimes !== undefined) this.options.progressTimes = options.progress.withTimes;\n if (options.progress.withRate !== undefined) this.options.progressRate = options.progress.withRate;\n if (options.progress.throttleMs !== undefined) this.options.progressThrottle = options.progress.throttleMs;\n }\n const flat = options ;\n if (flat.progressWithTimes !== undefined) this.options.progressTimes = flat.progressWithTimes;\n if (flat.progressWithRate !== undefined) this.options.progressRate = flat.progressWithRate;\n if (flat.progressThrottleMs !== undefined) this.options.progressThrottle = flat.progressThrottleMs;\n }\n\n /**\n * Initialize logger from context and CLI parameters. Whatever is in options goes (after discovered params).\n * Params are tracked under the `logger` module for --showUsedParams.\n */\n static init(context, options) {\n const paramDefs = {\n mode: \"string default text\",\n route: \"string default console\",\n prefix: \"string\",\n silent: \"boolean default false\",\n showLevel: \"boolean default true\",\n timestamp: \"boolean default false\",\n levels: \"string\",\n progressWithTimes: \"boolean default false\",\n progressWithRate: \"boolean default false\",\n progressThrottleMs: \"number\",\n };\n const discovered = context.params.getAllForModule(\"logger\", paramDefs);\n const config = { ...discovered, ...options } ;\n const logger = new Logger(context, config);\n context.logger = logger;\n return logger;\n }\n\n getDefaultOptions() {\n return {\n mode: \"text\",\n route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n prefix: undefined,\n silent: false,\n showLevel: false,\n timestamp: false,\n levels: DEFAULT_LEVELS,\n progressTimes: false,\n progressRate: false,\n progressThrottle: undefined,\n };\n }\n\n updateTransport() {\n this.transport = this.options.route === \"ipc\"\n ? new ParentProcessTransport()\n : new ConsoleTransport();\n }\n\n setMode(mode) {\n if (!this.isValidMode(mode)) {\n throw new Error(`Unsupported logger mode: ${mode}`);\n }\n this.options.mode = mode;\n }\n\n /** Returns a styled string (bright white) for highlighting; keeps chalk inside logger. */\n highlight(text) {\n return chalk.whiteBright(text);\n }\n\n debug(message, ...chunks) {\n this.out({ level: \"debug\", message, chunks });\n }\n\n info(message, ...chunks) {\n this.out({ level: \"info\", message, chunks });\n }\n\n notice(message, ...chunks) {\n this.out({ level: \"notice\", message, chunks });\n }\n\n warn(message, ...chunks) {\n this.out({ level: \"warn\", message, chunks });\n }\n\n error(message, ...chunks) {\n this.out({ level: \"error\", message, chunks });\n }\n\n logic(message, ...chunks) {\n this.out({ level: \"logic\", message, chunks });\n }\n\n silly(message, ...chunks) {\n this.out({ level: \"silly\", message, chunks });\n }\n\n results(results) {\n this.out({ level: \"results\", message: \"results\", results });\n }\n\n request(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"request\", message });\n }\n\n response(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"response\", message });\n }\n\n /**\n * @returns {boolean} true when the progress line was emitted (not throttled)\n */\n progress(message, opts) {\n const { prefix, count, total } = opts;\n const paddedTotal = String(total).length;\n const paddedCount = String(count).padStart(paddedTotal, \" \");\n const payload = {\n level: \"progress\",\n message,\n count: paddedCount,\n total,\n prefix\n };\n\n if (!this.startTimes[prefix ?? \"\"]) {\n this.startTimes[prefix ?? \"\"] = Date.now();\n }\n const wantTimes = this.options.progressTimes;\n const wantRate = this.options.progressRate;\n if (wantTimes || wantRate) {\n const elapsedSeconds = (Date.now() - this.startTimes[prefix ?? \"\"]) / 1000;\n // Intervals completed = count - 1 (same basis as ETA).\n const intervals = count > 1 ? count - 1 : 0;\n const itemsPerSec = intervals > 0 && elapsedSeconds > 0 ? intervals / elapsedSeconds : -1;\n if (wantTimes) {\n let remaining = -1;\n if (itemsPerSec > 0) {\n remaining = (total - count) / itemsPerSec;\n }\n payload.elapsed = this.round(elapsedSeconds, 2);\n payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n }\n if (wantRate) {\n payload.rate = itemsPerSec >= 0 ? this.round(itemsPerSec, 2) : itemsPerSec;\n }\n }\n\n if (count >= total) {\n delete this.startTimes[prefix ?? \"\"];\n delete this.lastProgressTimes[prefix ?? \"\"];\n }\n\n if (this.shouldOutputProgress(prefix ?? \"\", count, total)) {\n this.out(payload);\n if (this.options.progressThrottle && prefix) {\n this.lastProgressTimes[prefix] = Date.now();\n }\n return true;\n }\n return false;\n }\n\n shouldOutputProgress(prefix, count, total) {\n if (!this.options.progressThrottle) {\n return true;\n }\n if (count === 1 || count === total || !prefix) {\n return true;\n }\n const lastTime = this.lastProgressTimes[prefix];\n if (!lastTime) {\n return true;\n }\n return Date.now() - lastTime >= this.options.progressThrottle;\n }\n\n out(struct) {\n if (this.options.silent) {\n return;\n }\n if (!this.options.levels.includes(struct.level)) {\n return;\n }\n\n if (this.options.prefix && !struct.prefix) {\n struct.prefix = this.options.prefix;\n }\n\n const output = this.options.mode === \"json\"\n ? struct\n : this.formatLog(struct);\n\n this.transport.write(output);\n }\n\n formatLog(struct) {\n const parts = [];\n const now = new Date();\n\n if (this.options.timestamp) {\n parts.push(now.toISOString());\n }\n\n if (this.options.showLevel) {\n parts.push(struct.level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n }\n\n if (struct.level === \"progress\") {\n if (struct.prefix) {\n parts.push(LEVEL_COLORS[struct.level].bold(struct.prefix));\n }\n if (struct.count !== undefined && struct.total !== undefined) {\n parts.push(LEVEL_COLORS[struct.level](`${struct.count}/${struct.total}`));\n }\n } else if (struct.prefix) {\n parts.push(chalk.cyan(`[${struct.prefix}]`));\n }\n\n if (struct.message) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter.bold(struct.message));\n }\n\n if (struct.level === \"progress\") {\n const formatter = LEVEL_COLORS[struct.level];\n if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n parts.push(formatter(`${struct.elapsed}/${struct.remaining}`));\n }\n if (struct.rate !== undefined) {\n parts.push(formatter(struct.rate >= 0 ? `${struct.rate}/s` : \"-/s\"));\n }\n }\n\n if (struct.chunks && struct.chunks.length) {\n parts.push(this.inspectChunks(struct.chunks));\n }\n\n if (struct.results) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter(JSON.stringify(struct.results, null, 4)));\n }\n\n return parts.join(\" \");\n }\n\n inspectChunks(chunks) {\n return chunks\n .map(chunk => util.inspect(chunk, { colors: true, depth: null }))\n .join(\" \");\n }\n\n shouldUseIpcRoute() {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n return false;\n }\n // Only use IPC if process.send exists AND we're connected to a parent\n // In Vitest workers, process.send exists but process.connected is undefined/false\n // process.connected is only true in actual child processes created with fork()\n return typeof process.send === \"function\" && process.connected === true;\n }\n\n normalizeLevels(levels) {\n if (!levels || !levels.length) {\n return DEFAULT_LEVELS;\n }\n\n const tokens = levels.map((t) => String(t).trim()).filter(Boolean);\n const explicitIncludes = tokens\n .filter((t) => !t.startsWith(\"+\") && !t.startsWith(\"-\"))\n .map((t) => t );\n const addIncludes = tokens\n .filter((t) => t.startsWith(\"+\"))\n .map((t) => t.slice(1) );\n const excludes = tokens\n .filter((t) => t.startsWith(\"-\"))\n .map((t) => t.slice(1) );\n\n const unknown = [...explicitIncludes, ...addIncludes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n if (unknown.length) {\n console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n }\n\n const base = explicitIncludes.length\n ? explicitIncludes\n : Array.from(new Set([...DEFAULT_LEVELS, ...addIncludes]));\n return base.filter(level => !excludes.includes(level));\n }\n\n isValidMode(mode) {\n return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n }\n\n round(value, places) {\n const factor = Math.pow(10, places);\n return Math.round(value * factor) / factor;\n }\n}\n\n","\n\nexport class ConsoleTransport {\n write(payload) {\n console.info(payload);\n }\n}\n\nexport class ParentProcessTransport {\n write(payload) {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n console.info(payload);\n return;\n }\n // Only use process.send if we're actually connected to a parent process\n // In Vitest workers, process.send exists but shouldn't be used\n if (typeof process.send === \"function\" && process.connected === true) {\n process.send(payload);\n } else {\n console.info(payload);\n }\n }\n}\n\n\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/logger/index.js","../src/logger/transports.js"],"sourcesContent":["import chalk from \"chalk\";\nimport util from \"util\";\n\n\n\n\n\n\n\n\n\n\nimport { ConsoleTransport, ParentProcessTransport } from \"./transports.js\";\n\n\nconst ALL_LEVELS = [\n \"silly\",\n \"debug\",\n \"logic\",\n \"info\",\n \"notice\",\n \"warn\",\n \"error\",\n \"results\",\n \"request\",\n \"response\",\n \"progress\"\n];\nconst DEFAULT_LEVELS = ALL_LEVELS.filter((l) => l !== \"silly\");\n\n// Calculate maximum level name length for alignment\nconst MAX_LEVEL_LENGTH = Math.max(...ALL_LEVELS.map(level => level.toUpperCase().length));\n\nconst LEVEL_COLORS = {\n error: chalk.red.bold,\n warn: chalk.rgb(255, 165, 0),\n notice: chalk.cyan,\n info: chalk.white.bold,\n logic: chalk.gray,\n debug: chalk.gray,\n silly: chalk.gray,\n request: chalk.green,\n response: chalk.yellow,\n // Magenta stands out from white info / green request lines.\n progress: chalk.magentaBright,\n results: chalk.magenta\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\nexport class Logger {\n context; // Partial context during initialization\n options;\n transport;\n startTimes = {};\n /** Count at the first progress sample for each prefix (rate baseline). */\n startCounts = {};\n lastProgressTimes = {};\n\n constructor(context, options = {}) {\n this.context = context;\n // Set defaults first\n this.options = this.getDefaultOptions();\n // Apply configuration\n if (options) {\n this.configure(options);\n }\n // Initialize transport\n this.updateTransport();\n }\n\n /**\n * Configure logger options. Accepts both LoggerOptions shape and flat param names\n * (levels string, progressWithTimes, progressWithRate, progressThrottleMs).\n */\n configure(options) {\n if (options.mode !== undefined) {\n this.options.mode = this.isValidMode(options.mode) ? options.mode : \"text\";\n }\n if (options.route !== undefined) {\n this.options.route = options.route;\n this.updateTransport();\n }\n if (options.prefix !== undefined) this.options.prefix = options.prefix;\n if (options.silent !== undefined) this.options.silent = options.silent;\n if (options.showLevel !== undefined) this.options.showLevel = options.showLevel;\n if (options.timestamp !== undefined) this.options.timestamp = options.timestamp;\n if (options.levels !== undefined) {\n const levels = typeof options.levels === \"string\" ? options.levels.split(\",\") : options.levels;\n this.options.levels = this.normalizeLevels(levels);\n }\n if (options.progress !== undefined) {\n if (options.progress.withTimes !== undefined) this.options.progressTimes = options.progress.withTimes;\n if (options.progress.withRate !== undefined) this.options.progressRate = options.progress.withRate;\n if (options.progress.throttleMs !== undefined) this.options.progressThrottle = options.progress.throttleMs;\n }\n const flat = options ;\n if (flat.progressWithTimes !== undefined) this.options.progressTimes = flat.progressWithTimes;\n if (flat.progressWithRate !== undefined) this.options.progressRate = flat.progressWithRate;\n if (flat.progressThrottleMs !== undefined) this.options.progressThrottle = flat.progressThrottleMs;\n }\n\n /**\n * Initialize logger from context and CLI parameters. Whatever is in options goes (after discovered params).\n * Params are tracked under the `logger` module for --showUsedParams.\n */\n static init(context, options) {\n const paramDefs = {\n mode: \"string default text\",\n route: \"string default console\",\n prefix: \"string\",\n silent: \"boolean default false\",\n showLevel: \"boolean default true\",\n timestamp: \"boolean default false\",\n levels: \"string\",\n progressWithTimes: \"boolean default false\",\n progressWithRate: \"boolean default false\",\n progressThrottleMs: \"number\",\n };\n const discovered = context.params.getAllForModule(\"logger\", paramDefs);\n const config = { ...discovered, ...options } ;\n const logger = new Logger(context, config);\n context.logger = logger;\n return logger;\n }\n\n getDefaultOptions() {\n return {\n mode: \"text\",\n route: this.shouldUseIpcRoute() ? \"ipc\" : \"console\",\n prefix: undefined,\n silent: false,\n showLevel: false,\n timestamp: false,\n levels: DEFAULT_LEVELS,\n progressTimes: false,\n progressRate: false,\n progressThrottle: undefined,\n };\n }\n\n updateTransport() {\n this.transport = this.options.route === \"ipc\"\n ? new ParentProcessTransport()\n : new ConsoleTransport();\n }\n\n setMode(mode) {\n if (!this.isValidMode(mode)) {\n throw new Error(`Unsupported logger mode: ${mode}`);\n }\n this.options.mode = mode;\n }\n\n /** Returns a styled string (bright white) for highlighting; keeps chalk inside logger. */\n highlight(text) {\n return chalk.whiteBright(text);\n }\n\n debug(message, ...chunks) {\n this.out({ level: \"debug\", message, chunks });\n }\n\n info(message, ...chunks) {\n this.out({ level: \"info\", message, chunks });\n }\n\n notice(message, ...chunks) {\n this.out({ level: \"notice\", message, chunks });\n }\n\n warn(message, ...chunks) {\n this.out({ level: \"warn\", message, chunks });\n }\n\n error(message, ...chunks) {\n this.out({ level: \"error\", message, chunks });\n }\n\n logic(message, ...chunks) {\n this.out({ level: \"logic\", message, chunks });\n }\n\n silly(message, ...chunks) {\n this.out({ level: \"silly\", message, chunks });\n }\n\n results(results) {\n this.out({ level: \"results\", message: \"results\", results });\n }\n\n request(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"request\", message });\n }\n\n response(operation, ...chunks) {\n const message = this.inspectChunks([operation, ...chunks]);\n this.out({ level: \"response\", message });\n }\n\n /**\n * @returns {boolean} true when the progress line was emitted (not throttled)\n */\n progress(message, opts) {\n const { prefix, count, total } = opts;\n const paddedTotal = String(total).length;\n const paddedCount = String(count).padStart(paddedTotal, \" \");\n const payload = {\n level: \"progress\",\n message,\n count: paddedCount,\n total,\n prefix\n };\n\n const key = prefix ?? \"\";\n // First sample for this prefix: establish baseline only (no rate yet).\n // Rate/ETA use items completed since that sample, so batched reporters\n // (e.g. every 500 records) don't inflate early /s from a late start clock.\n if (this.startTimes[key] === undefined) {\n this.startTimes[key] = Date.now();\n this.startCounts[key] = count;\n }\n const wantTimes = this.options.progressTimes;\n const wantRate = this.options.progressRate;\n if (wantTimes || wantRate) {\n const elapsedSeconds = (Date.now() - this.startTimes[key]) / 1000;\n const done = count - (this.startCounts[key] ?? count);\n const itemsPerSec = done > 0 && elapsedSeconds > 0 ? done / elapsedSeconds : -1;\n if (wantTimes) {\n let remaining = -1;\n if (itemsPerSec > 0) {\n remaining = (total - count) / itemsPerSec;\n }\n payload.elapsed = this.round(elapsedSeconds, 2);\n payload.remaining = remaining >= 0 ? this.round(remaining, 2) : remaining;\n }\n if (wantRate) {\n payload.rate = itemsPerSec >= 0 ? this.round(itemsPerSec, 2) : itemsPerSec;\n }\n }\n\n if (count >= total) {\n delete this.startTimes[key];\n delete this.startCounts[key];\n delete this.lastProgressTimes[key];\n }\n\n if (this.shouldOutputProgress(prefix ?? \"\", count, total)) {\n this.out(payload);\n if (this.options.progressThrottle && prefix) {\n this.lastProgressTimes[prefix] = Date.now();\n }\n return true;\n }\n return false;\n }\n\n shouldOutputProgress(prefix, count, total) {\n if (!this.options.progressThrottle) {\n return true;\n }\n if (count === 1 || count === total || !prefix) {\n return true;\n }\n const lastTime = this.lastProgressTimes[prefix];\n if (!lastTime) {\n return true;\n }\n return Date.now() - lastTime >= this.options.progressThrottle;\n }\n\n out(struct) {\n if (this.options.silent) {\n return;\n }\n if (!this.options.levels.includes(struct.level)) {\n return;\n }\n\n if (this.options.prefix && !struct.prefix) {\n struct.prefix = this.options.prefix;\n }\n\n const output = this.options.mode === \"json\"\n ? struct\n : this.formatLog(struct);\n\n this.transport.write(output);\n }\n\n formatLog(struct) {\n const parts = [];\n const now = new Date();\n\n if (this.options.timestamp) {\n parts.push(now.toISOString());\n }\n\n if (this.options.showLevel) {\n parts.push(struct.level.toUpperCase().padEnd(MAX_LEVEL_LENGTH));\n }\n\n if (struct.level === \"progress\") {\n if (struct.prefix) {\n parts.push(LEVEL_COLORS[struct.level].bold(struct.prefix));\n }\n if (struct.count !== undefined && struct.total !== undefined) {\n parts.push(LEVEL_COLORS[struct.level](`${struct.count}/${struct.total}`));\n }\n } else if (struct.prefix) {\n parts.push(chalk.cyan(`[${struct.prefix}]`));\n }\n\n if (struct.message) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter.bold(struct.message));\n }\n\n if (struct.level === \"progress\") {\n const formatter = LEVEL_COLORS[struct.level];\n if (struct.elapsed !== undefined && struct.remaining !== undefined) {\n parts.push(formatter(`${struct.elapsed}/${struct.remaining}`));\n }\n if (struct.rate !== undefined) {\n parts.push(formatter(struct.rate >= 0 ? `${struct.rate}/s` : \"-/s\"));\n }\n }\n\n if (struct.chunks && struct.chunks.length) {\n parts.push(this.inspectChunks(struct.chunks));\n }\n\n if (struct.results) {\n const formatter = LEVEL_COLORS[struct.level] ?? chalk.white;\n parts.push(formatter(JSON.stringify(struct.results, null, 4)));\n }\n\n return parts.join(\" \");\n }\n\n inspectChunks(chunks) {\n return chunks\n .map(chunk => util.inspect(chunk, { colors: true, depth: null }))\n .join(\" \");\n }\n\n shouldUseIpcRoute() {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n return false;\n }\n // Only use IPC if process.send exists AND we're connected to a parent\n // In Vitest workers, process.send exists but process.connected is undefined/false\n // process.connected is only true in actual child processes created with fork()\n return typeof process.send === \"function\" && process.connected === true;\n }\n\n normalizeLevels(levels) {\n if (!levels || !levels.length) {\n return DEFAULT_LEVELS;\n }\n\n const tokens = levels.map((t) => String(t).trim()).filter(Boolean);\n const explicitIncludes = tokens\n .filter((t) => !t.startsWith(\"+\") && !t.startsWith(\"-\"))\n .map((t) => t );\n const addIncludes = tokens\n .filter((t) => t.startsWith(\"+\"))\n .map((t) => t.slice(1) );\n const excludes = tokens\n .filter((t) => t.startsWith(\"-\"))\n .map((t) => t.slice(1) );\n\n const unknown = [...explicitIncludes, ...addIncludes, ...excludes].filter(level => !ALL_LEVELS.includes(level));\n if (unknown.length) {\n console.warn(`[Logger] Unknown level(s): ${unknown.join(\", \")}`);\n }\n\n const base = explicitIncludes.length\n ? explicitIncludes\n : Array.from(new Set([...DEFAULT_LEVELS, ...addIncludes]));\n return base.filter(level => !excludes.includes(level));\n }\n\n isValidMode(mode) {\n return mode === undefined || mode === null || mode === \"text\" || mode === \"json\";\n }\n\n round(value, places) {\n const factor = Math.pow(10, places);\n return Math.round(value * factor) / factor;\n }\n}\n\n","\n\nexport class ConsoleTransport {\n write(payload) {\n console.info(payload);\n }\n}\n\nexport class ParentProcessTransport {\n write(payload) {\n // Don't use IPC in test environments (Vitest workers interfere with process.send)\n if (process.env.VITEST || process.env.NODE_ENV === \"test\") {\n console.info(payload);\n return;\n }\n // Only use process.send if we're actually connected to a parent process\n // In Vitest workers, process.send exists but shouldn't be used\n if (typeof process.send === \"function\" && process.connected === true) {\n process.send(payload);\n } else {\n console.info(payload);\n }\n }\n}\n\n\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nmakarov/cli-toolkit",
3
- "version": "0.76.0",
3
+ "version": "0.78.0",
4
4
  "description": "A comprehensive toolkit for building CLI applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",