@lage-run/reporters 1.7.0 → 1.7.1
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/lib/GroupedReporter.js +4 -0
- package/lib/GroupedReporter.js.map +1 -1
- package/lib/LogReporter.js +5 -0
- package/lib/LogReporter.js.map +1 -1
- package/lib/formatDuration.js +6 -0
- package/lib/formatDuration.js.map +1 -1
- package/lib/formatHelpers.js +7 -0
- package/lib/formatHelpers.js.map +1 -1
- package/lib/index.js +14 -0
- package/lib/index.js.map +1 -1
- package/package.json +4 -4
package/lib/GroupedReporter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/GroupedReporter.ts"],"sourcesContent":["import { formatHrtime } from \"./formatDuration.js\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel, type LogStructuredData } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetRun } from \"@lage-run/scheduler-types\";\nimport type { TargetLogData, TargetStatusData } from \"./types/TargetLogData.js\";\nimport type { Writable } from \"stream\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\nimport { formatMemoryUsage } from \"./formatHelpers.js\";\nimport { statusColorFn } from \"./LogReporter.js\";\n\nexport const colors = {\n [LogLevel.info]: chalk.white,\n [LogLevel.verbose]: chalk.gray,\n [LogLevel.warn]: chalk.white,\n [LogLevel.error]: chalk.white,\n [LogLevel.silly]: chalk.green,\n task: chalk.cyan,\n pkg: chalk.magenta,\n ok: chalk.green,\n error: chalk.red,\n warn: chalk.yellow,\n};\n\nconst logLevelLabel = {\n [LogLevel.info]: \"INFO\",\n [LogLevel.warn]: \"WARN\",\n [LogLevel.error]: \"ERR!\",\n [LogLevel.silly]: \"SILLY\",\n [LogLevel.verbose]: \"VERB\",\n};\n\nfunction getTaskLogPrefix(pkg: string, task: string): string {\n return `${colors.pkg(pkg)} ${colors.task(task)}`;\n}\n\nfunction format(level: LogLevel, prefix: string, message: string): string {\n return `${logLevelLabel[level]}: ${prefix} ${message}\\n`;\n}\n\n/**\n * Abstract reporter which optionally groups log entries by target.\n * If grouping is enabled, it only flushes a target's log entries when it completes.\n */\nexport abstract class GroupedReporter implements Reporter {\n protected logStream: Writable;\n protected logEntries = new Map<string, LogEntry[]>();\n private readonly groupedEntries: Map<string, LogEntry<LogStructuredData>[]> = new Map<string, LogEntry[]>();\n\n constructor(\n protected options: {\n logLevel?: LogLevel;\n grouped?: boolean;\n /** Whether to capture and report main process memory usage on target completion */\n logMemory?: boolean;\n /** stream for testing */\n logStream?: Writable;\n }\n ) {\n options.logLevel = options.logLevel || LogLevel.info;\n this.logStream = options.logStream || process.stdout;\n }\n\n public log(entry: LogEntry<any>): boolean | void {\n if (entry.data && entry.data.target && entry.data.target.hidden) {\n return;\n }\n\n if (entry.data && entry.data.target) {\n if (!this.logEntries.has(entry.data.target.id)) {\n this.logEntries.set(entry.data.target.id, []);\n }\n\n this.logEntries.get(entry.data.target.id)!.push(entry);\n }\n\n if (this.options.logLevel! >= entry.level) {\n if (this.options.grouped && entry.data?.target) {\n return this.logTargetEntryByGroup(entry);\n }\n\n return this.logTargetEntry(entry);\n }\n }\n\n /** Print the entry for a target */\n protected logTargetEntry(entry: LogEntry<TargetLogData>): boolean | void {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (!data?.target) {\n if (entry.msg.trim()) {\n this.logStream.write(format(entry.level, \"\", entry.msg));\n }\n return;\n }\n\n const { target } = data;\n const { packageName, task } = target;\n const prefix = this.options.grouped ? \"\" : getTaskLogPrefix(packageName ?? \"<root>\", task);\n\n if (!isTargetStatusLogEntry(data)) {\n return this.logStream.write(format(entry.level, prefix, colorFn(\"| \" + entry.msg)));\n }\n\n const { hash, duration, memoryUsage, status } = data as TargetStatusData;\n const mem = formatMemoryUsage(memoryUsage, this.options.logMemory);\n\n const pkgTask = this.options.grouped ? `${chalk.magenta(packageName)} ${chalk.cyan(task)}` : \"\";\n\n switch (status) {\n case \"running\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.ok(\"➔\")} start ${pkgTask}`)));\n\n case \"success\":\n return this.logStream.write(\n format(entry.level, prefix, colorFn(`${colors.ok(\"✓\")} done ${pkgTask} - ${formatHrtime(duration!)}${mem}`))\n );\n\n case \"failed\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.error(\"✖\")} fail ${pkgTask}${mem}`)));\n\n case \"skipped\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.ok(\"»\")} skip ${pkgTask} - ${hash!}${mem}`)));\n\n case \"aborted\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.warn(\"-\")} aborted ${pkgTask}`)));\n\n case \"queued\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.warn(\"…\")} queued ${pkgTask}`)));\n\n case \"pending\":\n return;\n\n default:\n throw new Error(`Internal error: unhandled target status \"${status}\"`);\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetLogData>) {\n const data = entry.data!;\n\n const target = data.target;\n const { id } = target;\n\n this.groupedEntries.set(id, this.groupedEntries.get(id) || []);\n this.groupedEntries.get(id)?.push(entry);\n\n if (isTargetStatusLogEntry(data)) {\n if (data.status === \"success\" || data.status === \"failed\" || data.status === \"skipped\" || data.status === \"aborted\") {\n const { status, duration } = data;\n this.logStream.write(this.formatGroupStart(data.target.packageName ?? \"<root>\", data.target.task, status, duration));\n\n const entries = this.groupedEntries.get(id)! as LogEntry<TargetStatusData>[];\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n this.logStream.write(this.formatGroupEnd());\n }\n }\n }\n\n public summarize(schedulerRunSummary: SchedulerRunSummary): void {\n const { targetRuns, targetRunByStatus } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n this.writeSummaryHeader();\n\n if (targetRuns.size > 0) {\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const { target, status, duration } = wrappedTarget;\n\n const colorFn = statusColorFn[status] ?? chalk.white;\n\n this.logStream.write(\n format(\n LogLevel.info,\n getTaskLogPrefix(target.packageName || \"[GLOBAL]\", target.task),\n colorFn(`${status}${duration ? `, took ${formatHrtime(duration)}` : \"\"}`)\n )\n );\n }\n\n this.logStream.write(\n `[Tasks Count] success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}\\n`\n );\n } else {\n this.logStream.write(\"Nothing has been run.\\n\");\n }\n\n this.writeSummaryFooter();\n\n if (failed.length > 0) {\n this.writeFailures(failed, targetRuns);\n }\n\n const formattedDuration = formatHrtime(schedulerRunSummary.duration);\n this.logStream.write(format(LogLevel.info, \"\", `Took a total of ${formattedDuration} to complete`));\n }\n\n /** Returns the opening line for a grouped target log block, including trailing newline. */\n protected abstract formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string;\n\n /** Returns the closing line for a grouped target log block, including trailing newline. */\n protected abstract formatGroupEnd(): string;\n\n /** Writes the summary section header. */\n protected abstract writeSummaryHeader(): void;\n\n /** Writes anything needed after the summary target list (e.g. closing a group). */\n protected abstract writeSummaryFooter(): void;\n\n /** Writes per-CI-system error annotations for all failed targets. */\n protected abstract writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void;\n}\n"],"names":["GroupedReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","silly","green","task","cyan","pkg","magenta","ok","red","yellow","logLevelLabel","getTaskLogPrefix","format","level","prefix","message","log","entry","data","target","hidden","logEntries","has","id","set","get","push","options","logLevel","grouped","logTargetEntryByGroup","logTargetEntry","colorFn","msg","trim","logStream","write","packageName","isTargetStatusLogEntry","hash","duration","memoryUsage","status","mem","formatMemoryUsage","logMemory","pkgTask","formatHrtime","Error","groupedEntries","formatGroupStart","entries","targetEntry","formatGroupEnd","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","writeSummaryHeader","size","slowestTargets","slowestTargetRuns","values","wrappedTarget","statusColorFn","length","writeSummaryFooter","writeFailures","formattedDuration","Map","process","stdout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/GroupedReporter.ts"],"sourcesContent":["import { formatHrtime } from \"./formatDuration.js\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel, type LogStructuredData } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetRun } from \"@lage-run/scheduler-types\";\nimport type { TargetLogData, TargetStatusData } from \"./types/TargetLogData.js\";\nimport type { Writable } from \"stream\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\nimport { formatMemoryUsage } from \"./formatHelpers.js\";\nimport { statusColorFn } from \"./LogReporter.js\";\n\nexport const colors = {\n [LogLevel.info]: chalk.white,\n [LogLevel.verbose]: chalk.gray,\n [LogLevel.warn]: chalk.white,\n [LogLevel.error]: chalk.white,\n [LogLevel.silly]: chalk.green,\n task: chalk.cyan,\n pkg: chalk.magenta,\n ok: chalk.green,\n error: chalk.red,\n warn: chalk.yellow,\n};\n\nconst logLevelLabel = {\n [LogLevel.info]: \"INFO\",\n [LogLevel.warn]: \"WARN\",\n [LogLevel.error]: \"ERR!\",\n [LogLevel.silly]: \"SILLY\",\n [LogLevel.verbose]: \"VERB\",\n};\n\nfunction getTaskLogPrefix(pkg: string, task: string): string {\n return `${colors.pkg(pkg)} ${colors.task(task)}`;\n}\n\nfunction format(level: LogLevel, prefix: string, message: string): string {\n return `${logLevelLabel[level]}: ${prefix} ${message}\\n`;\n}\n\n/**\n * Abstract reporter which optionally groups log entries by target.\n * If grouping is enabled, it only flushes a target's log entries when it completes.\n */\nexport abstract class GroupedReporter implements Reporter {\n protected logStream: Writable;\n protected logEntries = new Map<string, LogEntry[]>();\n private readonly groupedEntries: Map<string, LogEntry<LogStructuredData>[]> = new Map<string, LogEntry[]>();\n\n constructor(\n protected options: {\n logLevel?: LogLevel;\n grouped?: boolean;\n /** Whether to capture and report main process memory usage on target completion */\n logMemory?: boolean;\n /** stream for testing */\n logStream?: Writable;\n }\n ) {\n options.logLevel = options.logLevel || LogLevel.info;\n this.logStream = options.logStream || process.stdout;\n }\n\n public log(entry: LogEntry<any>): boolean | void {\n if (entry.data && entry.data.target && entry.data.target.hidden) {\n return;\n }\n\n if (entry.data && entry.data.target) {\n if (!this.logEntries.has(entry.data.target.id)) {\n this.logEntries.set(entry.data.target.id, []);\n }\n\n this.logEntries.get(entry.data.target.id)!.push(entry);\n }\n\n if (this.options.logLevel! >= entry.level) {\n if (this.options.grouped && entry.data?.target) {\n return this.logTargetEntryByGroup(entry);\n }\n\n return this.logTargetEntry(entry);\n }\n }\n\n /** Print the entry for a target */\n protected logTargetEntry(entry: LogEntry<TargetLogData>): boolean | void {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (!data?.target) {\n if (entry.msg.trim()) {\n this.logStream.write(format(entry.level, \"\", entry.msg));\n }\n return;\n }\n\n const { target } = data;\n const { packageName, task } = target;\n const prefix = this.options.grouped ? \"\" : getTaskLogPrefix(packageName ?? \"<root>\", task);\n\n if (!isTargetStatusLogEntry(data)) {\n return this.logStream.write(format(entry.level, prefix, colorFn(\"| \" + entry.msg)));\n }\n\n const { hash, duration, memoryUsage, status } = data as TargetStatusData;\n const mem = formatMemoryUsage(memoryUsage, this.options.logMemory);\n\n const pkgTask = this.options.grouped ? `${chalk.magenta(packageName)} ${chalk.cyan(task)}` : \"\";\n\n switch (status) {\n case \"running\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.ok(\"➔\")} start ${pkgTask}`)));\n\n case \"success\":\n return this.logStream.write(\n format(entry.level, prefix, colorFn(`${colors.ok(\"✓\")} done ${pkgTask} - ${formatHrtime(duration!)}${mem}`))\n );\n\n case \"failed\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.error(\"✖\")} fail ${pkgTask}${mem}`)));\n\n case \"skipped\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.ok(\"»\")} skip ${pkgTask} - ${hash!}${mem}`)));\n\n case \"aborted\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.warn(\"-\")} aborted ${pkgTask}`)));\n\n case \"queued\":\n return this.logStream.write(format(entry.level, prefix, colorFn(`${colors.warn(\"…\")} queued ${pkgTask}`)));\n\n case \"pending\":\n return;\n\n default:\n throw new Error(`Internal error: unhandled target status \"${status}\"`);\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetLogData>) {\n const data = entry.data!;\n\n const target = data.target;\n const { id } = target;\n\n this.groupedEntries.set(id, this.groupedEntries.get(id) || []);\n this.groupedEntries.get(id)?.push(entry);\n\n if (isTargetStatusLogEntry(data)) {\n if (data.status === \"success\" || data.status === \"failed\" || data.status === \"skipped\" || data.status === \"aborted\") {\n const { status, duration } = data;\n this.logStream.write(this.formatGroupStart(data.target.packageName ?? \"<root>\", data.target.task, status, duration));\n\n const entries = this.groupedEntries.get(id)! as LogEntry<TargetStatusData>[];\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n this.logStream.write(this.formatGroupEnd());\n }\n }\n }\n\n public summarize(schedulerRunSummary: SchedulerRunSummary): void {\n const { targetRuns, targetRunByStatus } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n this.writeSummaryHeader();\n\n if (targetRuns.size > 0) {\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const { target, status, duration } = wrappedTarget;\n\n const colorFn = statusColorFn[status] ?? chalk.white;\n\n this.logStream.write(\n format(\n LogLevel.info,\n getTaskLogPrefix(target.packageName || \"[GLOBAL]\", target.task),\n colorFn(`${status}${duration ? `, took ${formatHrtime(duration)}` : \"\"}`)\n )\n );\n }\n\n this.logStream.write(\n `[Tasks Count] success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}\\n`\n );\n } else {\n this.logStream.write(\"Nothing has been run.\\n\");\n }\n\n this.writeSummaryFooter();\n\n if (failed.length > 0) {\n this.writeFailures(failed, targetRuns);\n }\n\n const formattedDuration = formatHrtime(schedulerRunSummary.duration);\n this.logStream.write(format(LogLevel.info, \"\", `Took a total of ${formattedDuration} to complete`));\n }\n\n /** Returns the opening line for a grouped target log block, including trailing newline. */\n protected abstract formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string;\n\n /** Returns the closing line for a grouped target log block, including trailing newline. */\n protected abstract formatGroupEnd(): string;\n\n /** Writes the summary section header. */\n protected abstract writeSummaryHeader(): void;\n\n /** Writes anything needed after the summary target list (e.g. closing a group). */\n protected abstract writeSummaryFooter(): void;\n\n /** Writes per-CI-system error annotations for all failed targets. */\n protected abstract writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void;\n}\n"],"names":["GroupedReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","silly","green","task","cyan","pkg","magenta","ok","red","yellow","logLevelLabel","getTaskLogPrefix","format","level","prefix","message","log","entry","data","target","hidden","logEntries","has","id","set","get","push","options","logLevel","grouped","logTargetEntryByGroup","logTargetEntry","colorFn","msg","trim","logStream","write","packageName","isTargetStatusLogEntry","hash","duration","memoryUsage","status","mem","formatMemoryUsage","logMemory","pkgTask","formatHrtime","Error","groupedEntries","formatGroupStart","entries","targetEntry","formatGroupEnd","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","writeSummaryHeader","size","slowestTargets","slowestTargetRuns","values","wrappedTarget","statusColorFn","length","writeSummaryFooter","writeFailures","formattedDuration","Map","process","stdout"],"mappings":"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"}
|
package/lib/LogReporter.js
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
0 && (module.exports = {
|
|
6
|
+
LogReporter: null,
|
|
7
|
+
colors: null,
|
|
8
|
+
statusColorFn: null
|
|
9
|
+
});
|
|
5
10
|
function _export(target, all) {
|
|
6
11
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
12
|
enumerable: true,
|
package/lib/LogReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/LogReporter.ts"],"sourcesContent":["import { formatHrtime, hrtimeDiff } from \"./formatDuration.js\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Chalk } from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetLogData, TargetStatusData } from \"./types/TargetLogData.js\";\nimport type { Writable } from \"stream\";\nimport crypto from \"crypto\";\nimport { fancyGradient, formatBytes, formatMemoryUsage, hrLine, stripAnsi } from \"./formatHelpers.js\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\n/** Color scheme from lage v1's reporter and others derived from it */\nexport const colors = {\n [LogLevel.info]: chalk.white,\n [LogLevel.verbose]: chalk.gray,\n [LogLevel.warn]: chalk.white,\n [LogLevel.error]: chalk.hex(\"#FF1010\"),\n [LogLevel.silly]: chalk.green,\n task: chalk.hex(\"#00DDDD\"),\n pkg: chalk.hex(\"#FFD66B\"),\n ok: chalk.green,\n error: chalk.red,\n warn: chalk.yellow,\n};\n\n/** Status color scheme from lage v1's reporter and others derived from it */\nexport const statusColorFn: Record<TargetStatus, Chalk> = {\n success: chalk.greenBright,\n failed: chalk.redBright,\n skipped: chalk.gray,\n running: chalk.yellow,\n pending: chalk.gray,\n aborted: chalk.red,\n queued: chalk.magenta,\n};\n\n// Monokai color scheme\nconst pkgColors: Chalk[] = [\n chalk.hex(\"#e5b567\"),\n chalk.hex(\"#b4d273\"),\n chalk.hex(\"#e87d3e\"),\n chalk.hex(\"#9e86c8\"),\n chalk.hex(\"#b05279\"),\n chalk.hex(\"#6c99bb\"),\n];\n\nfunction hashStringToNumber(str: string): number {\n const hash = crypto.createHash(\"md5\");\n hash.update(str);\n const hex = hash.digest(\"hex\").substring(0, 6);\n return parseInt(hex, 16);\n}\n\nconst pkgNameToIndexInPkgColorArray = new Map<string, number>();\n\nfunction getColorForPkg(pkg: string): Chalk {\n if (!pkgNameToIndexInPkgColorArray.has(pkg)) {\n const index = hashStringToNumber(pkg) % pkgColors.length;\n pkgNameToIndexInPkgColorArray.set(pkg, index);\n }\n\n return pkgColors[pkgNameToIndexInPkgColorArray.get(pkg)!];\n}\n\nfunction getTaskLogPrefix(pkg: string, task: string) {\n const pkgColor = getColorForPkg(pkg);\n return `${pkgColor(pkg)} ${colors.task(task)}`;\n}\n\n/**\n * Lage v1 reporter that logs tasks without progress spinners.\n * It can either log entries immediately, or grouped when a target completes.\n */\nexport class LogReporter implements Reporter {\n private logStream: Writable;\n private logEntries = new Map<string, LogEntry[]>();\n\n constructor(\n private options: {\n logLevel?: LogLevel;\n grouped?: boolean;\n /** Whether to capture and report main process memory usage on target completion */\n logMemory?: boolean;\n /** stream for testing */\n logStream?: Writable;\n }\n ) {\n options.logLevel = options.logLevel || LogLevel.info;\n this.logStream = options.logStream || process.stdout;\n }\n\n public log(entry: LogEntry<any>): void {\n // if \"hidden\", do not even attempt to record or report the entry\n if (entry?.data?.target?.hidden) {\n return;\n }\n\n // save the logs for errors\n if (entry.data?.target?.id) {\n if (!this.logEntries.has(entry.data.target.id)) {\n this.logEntries.set(entry.data.target.id, []);\n }\n this.logEntries.get(entry.data.target.id)!.push(entry);\n }\n\n // if loglevel is not high enough, do not report the entry\n if (this.options.logLevel! < entry.level) {\n return;\n }\n\n // log to grouped entries\n if (this.options.grouped && entry.data?.target) {\n return this.logTargetEntryByGroup(entry);\n }\n\n // log normal target entries\n if (entry.data && entry.data.target) {\n return this.logTargetEntry(entry);\n }\n\n // log generic entries (not related to target)\n if (entry.msg) {\n return this.print(entry.msg);\n }\n }\n\n private printEntry(entry: LogEntry<any>, message: string) {\n let prefix = \"\";\n const msg = message;\n\n if (entry?.data?.target) {\n const { packageName, task } = entry.data.target;\n prefix = getTaskLogPrefix(packageName ?? \"<root>\", task);\n }\n\n this.print(`${prefix ? prefix + \" \" : \"\"}${msg}`);\n }\n\n private print(message: string) {\n this.logStream.write(message + \"\\n\");\n }\n\n private logTargetEntry(entry: LogEntry<TargetLogData>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (!isTargetStatusLogEntry(data)) {\n return this.printEntry(entry, colorFn(\": \" + stripAnsi(entry.msg)));\n }\n\n const { hash, duration, memoryUsage, status } = data;\n const mem = formatMemoryUsage(memoryUsage, this.options.logMemory);\n\n switch (status) {\n case \"running\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"➔\")} start`));\n\n case \"success\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"✓\")} done - ${formatHrtime(duration!)}${mem}`));\n\n case \"failed\":\n return this.printEntry(entry, colorFn(`${colors.error(\"✖\")} fail${mem}`));\n\n case \"skipped\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"»\")} skip - ${hash!}${mem}`));\n\n case \"aborted\":\n return this.printEntry(entry, colorFn(`${colors.warn(\"-\")} aborted`));\n\n case \"queued\":\n return this.printEntry(entry, colorFn(`${colors.warn(\"…\")} queued`));\n\n case \"pending\":\n return;\n\n default:\n throw new Error(`Internal error: unhandled target status \"${status}\"`);\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetLogData>) {\n const data = entry.data!;\n\n const target = data.target;\n const { id } = target;\n\n if (\n isTargetStatusLogEntry(data) &&\n (data.status === \"success\" || data.status === \"failed\" || data.status === \"skipped\" || data.status === \"aborted\")\n ) {\n const entries = this.logEntries.get(id)! as LogEntry<TargetStatusData>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n if (entries.length > 2) {\n this.print(hrLine);\n }\n }\n }\n\n public summarize(schedulerRunSummary: SchedulerRunSummary): void {\n const { targetRuns, targetRunByStatus } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n if (targetRuns.size > 0) {\n this.print(chalk.cyanBright(`\\nSummary`));\n\n this.print(hrLine);\n\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const { target, status, duration } = wrappedTarget;\n if (target.hidden) {\n continue;\n }\n\n const colorFn = statusColorFn[status] ?? chalk.white;\n const queueDuration = hrtimeDiff(wrappedTarget.queueTime, wrappedTarget.startTime);\n\n this.print(\n `${getTaskLogPrefix(target.packageName || \"<root>\", target.task)} ${colorFn(\n `${status === \"running\" ? \"running - incomplete\" : status}${\n duration ? `, took ${formatHrtime(duration)}, queued for ${formatHrtime(queueDuration)}` : \"\"\n }`\n )}`\n );\n }\n\n this.print(\n `success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}, failed: ${failed.length}`\n );\n\n this.print(\n `worker restarts: ${schedulerRunSummary.workerRestarts}, max worker memory usage: ${formatBytes(\n schedulerRunSummary.maxWorkerMemoryUsage\n )}`\n );\n } else {\n this.print(\"Nothing has been run.\");\n }\n\n this.print(hrLine);\n\n if (failed.length > 0) {\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const failureLogs = this.logEntries.get(targetId);\n\n this.print(`[${colors.pkg(packageName ?? \"<root>\")} ${colors.task(task)}] ${colors[LogLevel.error](\"ERROR DETECTED\")}`);\n\n if (failureLogs) {\n for (const entry of failureLogs) {\n // Log each entry separately to prevent truncation\n this.print(entry.msg);\n }\n }\n\n this.print(hrLine);\n }\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? fancyGradient(`All targets skipped!`) : \"\";\n\n this.print(`Took a total of ${formatHrtime(schedulerRunSummary.duration)} to complete. ${allCacheHitText}`);\n }\n\n public resetLogEntries(): void {\n this.logEntries.clear();\n }\n}\n"],"names":["LogReporter","colors","statusColorFn","LogLevel","info","chalk","white","verbose","gray","warn","error","hex","silly","green","task","pkg","ok","red","yellow","success","greenBright","failed","redBright","skipped","running","pending","aborted","queued","magenta","pkgColors","hashStringToNumber","str","hash","crypto","createHash","update","digest","substring","parseInt","pkgNameToIndexInPkgColorArray","Map","getColorForPkg","has","index","length","set","get","getTaskLogPrefix","pkgColor","log","entry","data","target","hidden","id","logEntries","push","options","logLevel","level","grouped","logTargetEntryByGroup","logTargetEntry","msg","print","printEntry","message","prefix","packageName","logStream","write","colorFn","isTargetStatusLogEntry","stripAnsi","duration","memoryUsage","status","mem","formatMemoryUsage","logMemory","formatHrtime","Error","entries","targetEntry","hrLine","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","size","cyanBright","slowestTargets","slowestTargetRuns","values","wrappedTarget","queueDuration","hrtimeDiff","queueTime","startTime","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","failureLogs","allCacheHits","filter","run","allCacheHitText","fancyGradient","resetLogEntries","clear","process","stdout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/LogReporter.ts"],"sourcesContent":["import { formatHrtime, hrtimeDiff } from \"./formatDuration.js\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Chalk } from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetLogData, TargetStatusData } from \"./types/TargetLogData.js\";\nimport type { Writable } from \"stream\";\nimport crypto from \"crypto\";\nimport { fancyGradient, formatBytes, formatMemoryUsage, hrLine, stripAnsi } from \"./formatHelpers.js\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\n/** Color scheme from lage v1's reporter and others derived from it */\nexport const colors = {\n [LogLevel.info]: chalk.white,\n [LogLevel.verbose]: chalk.gray,\n [LogLevel.warn]: chalk.white,\n [LogLevel.error]: chalk.hex(\"#FF1010\"),\n [LogLevel.silly]: chalk.green,\n task: chalk.hex(\"#00DDDD\"),\n pkg: chalk.hex(\"#FFD66B\"),\n ok: chalk.green,\n error: chalk.red,\n warn: chalk.yellow,\n};\n\n/** Status color scheme from lage v1's reporter and others derived from it */\nexport const statusColorFn: Record<TargetStatus, Chalk> = {\n success: chalk.greenBright,\n failed: chalk.redBright,\n skipped: chalk.gray,\n running: chalk.yellow,\n pending: chalk.gray,\n aborted: chalk.red,\n queued: chalk.magenta,\n};\n\n// Monokai color scheme\nconst pkgColors: Chalk[] = [\n chalk.hex(\"#e5b567\"),\n chalk.hex(\"#b4d273\"),\n chalk.hex(\"#e87d3e\"),\n chalk.hex(\"#9e86c8\"),\n chalk.hex(\"#b05279\"),\n chalk.hex(\"#6c99bb\"),\n];\n\nfunction hashStringToNumber(str: string): number {\n const hash = crypto.createHash(\"md5\");\n hash.update(str);\n const hex = hash.digest(\"hex\").substring(0, 6);\n return parseInt(hex, 16);\n}\n\nconst pkgNameToIndexInPkgColorArray = new Map<string, number>();\n\nfunction getColorForPkg(pkg: string): Chalk {\n if (!pkgNameToIndexInPkgColorArray.has(pkg)) {\n const index = hashStringToNumber(pkg) % pkgColors.length;\n pkgNameToIndexInPkgColorArray.set(pkg, index);\n }\n\n return pkgColors[pkgNameToIndexInPkgColorArray.get(pkg)!];\n}\n\nfunction getTaskLogPrefix(pkg: string, task: string) {\n const pkgColor = getColorForPkg(pkg);\n return `${pkgColor(pkg)} ${colors.task(task)}`;\n}\n\n/**\n * Lage v1 reporter that logs tasks without progress spinners.\n * It can either log entries immediately, or grouped when a target completes.\n */\nexport class LogReporter implements Reporter {\n private logStream: Writable;\n private logEntries = new Map<string, LogEntry[]>();\n\n constructor(\n private options: {\n logLevel?: LogLevel;\n grouped?: boolean;\n /** Whether to capture and report main process memory usage on target completion */\n logMemory?: boolean;\n /** stream for testing */\n logStream?: Writable;\n }\n ) {\n options.logLevel = options.logLevel || LogLevel.info;\n this.logStream = options.logStream || process.stdout;\n }\n\n public log(entry: LogEntry<any>): void {\n // if \"hidden\", do not even attempt to record or report the entry\n if (entry?.data?.target?.hidden) {\n return;\n }\n\n // save the logs for errors\n if (entry.data?.target?.id) {\n if (!this.logEntries.has(entry.data.target.id)) {\n this.logEntries.set(entry.data.target.id, []);\n }\n this.logEntries.get(entry.data.target.id)!.push(entry);\n }\n\n // if loglevel is not high enough, do not report the entry\n if (this.options.logLevel! < entry.level) {\n return;\n }\n\n // log to grouped entries\n if (this.options.grouped && entry.data?.target) {\n return this.logTargetEntryByGroup(entry);\n }\n\n // log normal target entries\n if (entry.data && entry.data.target) {\n return this.logTargetEntry(entry);\n }\n\n // log generic entries (not related to target)\n if (entry.msg) {\n return this.print(entry.msg);\n }\n }\n\n private printEntry(entry: LogEntry<any>, message: string) {\n let prefix = \"\";\n const msg = message;\n\n if (entry?.data?.target) {\n const { packageName, task } = entry.data.target;\n prefix = getTaskLogPrefix(packageName ?? \"<root>\", task);\n }\n\n this.print(`${prefix ? prefix + \" \" : \"\"}${msg}`);\n }\n\n private print(message: string) {\n this.logStream.write(message + \"\\n\");\n }\n\n private logTargetEntry(entry: LogEntry<TargetLogData>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (!isTargetStatusLogEntry(data)) {\n return this.printEntry(entry, colorFn(\": \" + stripAnsi(entry.msg)));\n }\n\n const { hash, duration, memoryUsage, status } = data;\n const mem = formatMemoryUsage(memoryUsage, this.options.logMemory);\n\n switch (status) {\n case \"running\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"➔\")} start`));\n\n case \"success\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"✓\")} done - ${formatHrtime(duration!)}${mem}`));\n\n case \"failed\":\n return this.printEntry(entry, colorFn(`${colors.error(\"✖\")} fail${mem}`));\n\n case \"skipped\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"»\")} skip - ${hash!}${mem}`));\n\n case \"aborted\":\n return this.printEntry(entry, colorFn(`${colors.warn(\"-\")} aborted`));\n\n case \"queued\":\n return this.printEntry(entry, colorFn(`${colors.warn(\"…\")} queued`));\n\n case \"pending\":\n return;\n\n default:\n throw new Error(`Internal error: unhandled target status \"${status}\"`);\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetLogData>) {\n const data = entry.data!;\n\n const target = data.target;\n const { id } = target;\n\n if (\n isTargetStatusLogEntry(data) &&\n (data.status === \"success\" || data.status === \"failed\" || data.status === \"skipped\" || data.status === \"aborted\")\n ) {\n const entries = this.logEntries.get(id)! as LogEntry<TargetStatusData>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n if (entries.length > 2) {\n this.print(hrLine);\n }\n }\n }\n\n public summarize(schedulerRunSummary: SchedulerRunSummary): void {\n const { targetRuns, targetRunByStatus } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n if (targetRuns.size > 0) {\n this.print(chalk.cyanBright(`\\nSummary`));\n\n this.print(hrLine);\n\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const { target, status, duration } = wrappedTarget;\n if (target.hidden) {\n continue;\n }\n\n const colorFn = statusColorFn[status] ?? chalk.white;\n const queueDuration = hrtimeDiff(wrappedTarget.queueTime, wrappedTarget.startTime);\n\n this.print(\n `${getTaskLogPrefix(target.packageName || \"<root>\", target.task)} ${colorFn(\n `${status === \"running\" ? \"running - incomplete\" : status}${\n duration ? `, took ${formatHrtime(duration)}, queued for ${formatHrtime(queueDuration)}` : \"\"\n }`\n )}`\n );\n }\n\n this.print(\n `success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}, failed: ${failed.length}`\n );\n\n this.print(\n `worker restarts: ${schedulerRunSummary.workerRestarts}, max worker memory usage: ${formatBytes(\n schedulerRunSummary.maxWorkerMemoryUsage\n )}`\n );\n } else {\n this.print(\"Nothing has been run.\");\n }\n\n this.print(hrLine);\n\n if (failed.length > 0) {\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const failureLogs = this.logEntries.get(targetId);\n\n this.print(`[${colors.pkg(packageName ?? \"<root>\")} ${colors.task(task)}] ${colors[LogLevel.error](\"ERROR DETECTED\")}`);\n\n if (failureLogs) {\n for (const entry of failureLogs) {\n // Log each entry separately to prevent truncation\n this.print(entry.msg);\n }\n }\n\n this.print(hrLine);\n }\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? fancyGradient(`All targets skipped!`) : \"\";\n\n this.print(`Took a total of ${formatHrtime(schedulerRunSummary.duration)} to complete. ${allCacheHitText}`);\n }\n\n public resetLogEntries(): void {\n this.logEntries.clear();\n }\n}\n"],"names":["LogReporter","colors","statusColorFn","LogLevel","info","chalk","white","verbose","gray","warn","error","hex","silly","green","task","pkg","ok","red","yellow","success","greenBright","failed","redBright","skipped","running","pending","aborted","queued","magenta","pkgColors","hashStringToNumber","str","hash","crypto","createHash","update","digest","substring","parseInt","pkgNameToIndexInPkgColorArray","Map","getColorForPkg","has","index","length","set","get","getTaskLogPrefix","pkgColor","log","entry","data","target","hidden","id","logEntries","push","options","logLevel","level","grouped","logTargetEntryByGroup","logTargetEntry","msg","print","printEntry","message","prefix","packageName","logStream","write","colorFn","isTargetStatusLogEntry","stripAnsi","duration","memoryUsage","status","mem","formatMemoryUsage","logMemory","formatHrtime","Error","entries","targetEntry","hrLine","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","size","cyanBright","slowestTargets","slowestTargetRuns","values","wrappedTarget","queueDuration","hrtimeDiff","queueTime","startTime","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","failureLogs","allCacheHits","filter","run","allCacheHitText","fancyGradient","resetLogEntries","clear","process","stdout"],"mappings":"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"}
|
package/lib/formatDuration.js
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
0 && (module.exports = {
|
|
6
|
+
formatDuration: null,
|
|
7
|
+
formatHrtime: null,
|
|
8
|
+
hrToSeconds: null,
|
|
9
|
+
hrtimeDiff: null
|
|
10
|
+
});
|
|
5
11
|
function _export(target, all) {
|
|
6
12
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
13
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formatDuration.ts"],"sourcesContent":["/** Format a duration given in seconds as minutes and seconds: e.g. \"90\" → \"1m 30.00s\" */\nexport function formatDuration(seconds: string): string {\n const raw = parseFloat(seconds);\n if (raw > 60) {\n const minutes = Math.floor(raw / 60);\n const sec = (raw - minutes * 60).toFixed(2);\n return `${minutes}m ${sec}s`;\n }\n const sec = raw.toFixed(2);\n return `${sec}s`;\n}\n\n/** Format an hrtime tuple as a human-readable duration */\nexport function formatHrtime(hrtime: [number, number]): string {\n return formatDuration(hrToSeconds(hrtime));\n}\n\n/** Convert an hrtime tuple to seconds */\nexport function hrToSeconds(hrtime: [number, number]): string {\n const raw = hrtime[0] + hrtime[1] / 1e9;\n return raw.toFixed(2);\n}\n\n/**\n * calculates the difference of two hrtime values\n */\nexport function hrtimeDiff(start: [number, number] = [0, 0], end: [number, number] = [0, 0]): [number, number] {\n const sec = end[0] - start[0];\n const nsec = end[1] - start[1];\n\n if (nsec < 0) {\n return [Math.max(0, sec - 1), 1e9 + nsec];\n }\n\n return [sec, nsec];\n}\n"],"names":["formatDuration","formatHrtime","hrToSeconds","hrtimeDiff","seconds","raw","parseFloat","minutes","Math","floor","sec","toFixed","hrtime","start","end","nsec","max"],"mappings":"AAAA,uFAAuF
|
|
1
|
+
{"version":3,"sources":["../src/formatDuration.ts"],"sourcesContent":["/** Format a duration given in seconds as minutes and seconds: e.g. \"90\" → \"1m 30.00s\" */\nexport function formatDuration(seconds: string): string {\n const raw = parseFloat(seconds);\n if (raw > 60) {\n const minutes = Math.floor(raw / 60);\n const sec = (raw - minutes * 60).toFixed(2);\n return `${minutes}m ${sec}s`;\n }\n const sec = raw.toFixed(2);\n return `${sec}s`;\n}\n\n/** Format an hrtime tuple as a human-readable duration */\nexport function formatHrtime(hrtime: [number, number]): string {\n return formatDuration(hrToSeconds(hrtime));\n}\n\n/** Convert an hrtime tuple to seconds */\nexport function hrToSeconds(hrtime: [number, number]): string {\n const raw = hrtime[0] + hrtime[1] / 1e9;\n return raw.toFixed(2);\n}\n\n/**\n * calculates the difference of two hrtime values\n */\nexport function hrtimeDiff(start: [number, number] = [0, 0], end: [number, number] = [0, 0]): [number, number] {\n const sec = end[0] - start[0];\n const nsec = end[1] - start[1];\n\n if (nsec < 0) {\n return [Math.max(0, sec - 1), 1e9 + nsec];\n }\n\n return [sec, nsec];\n}\n"],"names":["formatDuration","formatHrtime","hrToSeconds","hrtimeDiff","seconds","raw","parseFloat","minutes","Math","floor","sec","toFixed","hrtime","start","end","nsec","max"],"mappings":"AAAA,uFAAuF;;;;;;;;;;;;;;;;;QACvEA;eAAAA;;QAYAC;eAAAA;;QAKAC;eAAAA;;QAQAC;eAAAA;;;AAzBT,SAASH,eAAeI,OAAe;IAC5C,MAAMC,MAAMC,WAAWF;IACvB,IAAIC,MAAM,IAAI;QACZ,MAAME,UAAUC,KAAKC,KAAK,CAACJ,MAAM;QACjC,MAAMK,MAAM,AAACL,CAAAA,MAAME,UAAU,EAAC,EAAGI,OAAO,CAAC;QACzC,OAAO,GAAGJ,QAAQ,EAAE,EAAEG,IAAI,CAAC,CAAC;IAC9B;IACA,MAAMA,MAAML,IAAIM,OAAO,CAAC;IACxB,OAAO,GAAGD,IAAI,CAAC,CAAC;AAClB;AAGO,SAAST,aAAaW,MAAwB;IACnD,OAAOZ,eAAeE,YAAYU;AACpC;AAGO,SAASV,YAAYU,MAAwB;IAClD,MAAMP,MAAMO,MAAM,CAAC,EAAE,GAAGA,MAAM,CAAC,EAAE,GAAG;IACpC,OAAOP,IAAIM,OAAO,CAAC;AACrB;AAKO,SAASR,WAAWU,QAA0B;IAAC;IAAG;CAAE,EAAEC,MAAwB;IAAC;IAAG;CAAE;IACzF,MAAMJ,MAAMI,GAAG,CAAC,EAAE,GAAGD,KAAK,CAAC,EAAE;IAC7B,MAAME,OAAOD,GAAG,CAAC,EAAE,GAAGD,KAAK,CAAC,EAAE;IAE9B,IAAIE,OAAO,GAAG;QACZ,OAAO;YAACP,KAAKQ,GAAG,CAAC,GAAGN,MAAM;YAAI,MAAMK;SAAK;IAC3C;IAEA,OAAO;QAACL;QAAKK;KAAK;AACpB"}
|
package/lib/formatHelpers.js
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
0 && (module.exports = {
|
|
6
|
+
fancyGradient: null,
|
|
7
|
+
formatBytes: null,
|
|
8
|
+
formatMemoryUsage: null,
|
|
9
|
+
hrLine: null,
|
|
10
|
+
stripAnsi: null
|
|
11
|
+
});
|
|
5
12
|
function _export(target, all) {
|
|
6
13
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
14
|
enumerable: true,
|
package/lib/formatHelpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formatHelpers.ts"],"sourcesContent":["import { gradient } from \"@ms-cloudpack/task-reporter\";\nimport ansiRegex from \"ansi-regex\";\n\n/** 80-character divider line */\nexport const hrLine = \"┈\".repeat(80);\n\nconst stripAnsiRegex = ansiRegex();\n\n/** Strip ANSI escape codes from a string */\nexport function stripAnsi(message: string): string {\n return message.replace(stripAnsiRegex, \"\");\n}\n\nconst orangeTuple = [237, 178, 77] as const;\nconst cyanTuple = [0, 255, 255] as const;\n\n/** Return the string with an orange to cyan gradient */\nexport function fancyGradient(str: string): string {\n return gradient(str, orangeTuple, cyanTuple);\n}\n\n/** Format a number of bytes as MB */\nexport function formatBytes(bytes: number): string {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\n/**\n * Format the memory usage if enabled: e.g. ` [rss: 50.00 MB, heap: 30.00 MB]`.\n * Returns an empty string if not enabled.\n */\nexport function formatMemoryUsage(memoryUsage: NodeJS.MemoryUsage | undefined, logMemory: boolean | undefined): string {\n if (!memoryUsage || !logMemory) {\n return \"\";\n }\n return ` [rss: ${formatBytes(memoryUsage.rss)}, heap: ${formatBytes(memoryUsage.heapUsed)}]`;\n}\n"],"names":["fancyGradient","formatBytes","formatMemoryUsage","hrLine","stripAnsi","repeat","stripAnsiRegex","ansiRegex","message","replace","orangeTuple","cyanTuple","str","gradient","bytes","toFixed","memoryUsage","logMemory","rss","heapUsed"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/formatHelpers.ts"],"sourcesContent":["import { gradient } from \"@ms-cloudpack/task-reporter\";\nimport ansiRegex from \"ansi-regex\";\n\n/** 80-character divider line */\nexport const hrLine = \"┈\".repeat(80);\n\nconst stripAnsiRegex = ansiRegex();\n\n/** Strip ANSI escape codes from a string */\nexport function stripAnsi(message: string): string {\n return message.replace(stripAnsiRegex, \"\");\n}\n\nconst orangeTuple = [237, 178, 77] as const;\nconst cyanTuple = [0, 255, 255] as const;\n\n/** Return the string with an orange to cyan gradient */\nexport function fancyGradient(str: string): string {\n return gradient(str, orangeTuple, cyanTuple);\n}\n\n/** Format a number of bytes as MB */\nexport function formatBytes(bytes: number): string {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\n/**\n * Format the memory usage if enabled: e.g. ` [rss: 50.00 MB, heap: 30.00 MB]`.\n * Returns an empty string if not enabled.\n */\nexport function formatMemoryUsage(memoryUsage: NodeJS.MemoryUsage | undefined, logMemory: boolean | undefined): string {\n if (!memoryUsage || !logMemory) {\n return \"\";\n }\n return ` [rss: ${formatBytes(memoryUsage.rss)}, heap: ${formatBytes(memoryUsage.heapUsed)}]`;\n}\n"],"names":["fancyGradient","formatBytes","formatMemoryUsage","hrLine","stripAnsi","repeat","stripAnsiRegex","ansiRegex","message","replace","orangeTuple","cyanTuple","str","gradient","bytes","toFixed","memoryUsage","logMemory","rss","heapUsed"],"mappings":";;;;;;;;;;;;;;;;;;QAiBgBA;eAAAA;;QAKAC;eAAAA;;QAQAC;eAAAA;;QA1BHC;eAAAA;;QAKGC;eAAAA;;;8BATS;kEACH;;;;;;AAGf,MAAMD,SAAS,IAAIE,MAAM,CAAC;AAEjC,MAAMC,iBAAiBC,IAAAA,kBAAS;AAGzB,SAASH,UAAUI,OAAe;IACvC,OAAOA,QAAQC,OAAO,CAACH,gBAAgB;AACzC;AAEA,MAAMI,cAAc;IAAC;IAAK;IAAK;CAAG;AAClC,MAAMC,YAAY;IAAC;IAAG;IAAK;CAAI;AAGxB,SAASX,cAAcY,GAAW;IACvC,OAAOC,IAAAA,sBAAQ,EAACD,KAAKF,aAAaC;AACpC;AAGO,SAASV,YAAYa,KAAa;IACvC,OAAO,GAAG,AAACA,CAAAA,QAAQ,OAAO,IAAG,EAAGC,OAAO,CAAC,GAAG,GAAG,CAAC;AACjD;AAMO,SAASb,kBAAkBc,WAA2C,EAAEC,SAA8B;IAC3G,IAAI,CAACD,eAAe,CAACC,WAAW;QAC9B,OAAO;IACT;IACA,OAAO,CAAC,OAAO,EAAEhB,YAAYe,YAAYE,GAAG,EAAE,QAAQ,EAAEjB,YAAYe,YAAYG,QAAQ,EAAE,CAAC,CAAC;AAC9F"}
|
package/lib/index.js
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
0 && (module.exports = {
|
|
6
|
+
AdoReporter: null,
|
|
7
|
+
BasicReporter: null,
|
|
8
|
+
ChromeTraceEventsReporter: null,
|
|
9
|
+
GithubActionsReporter: null,
|
|
10
|
+
JsonReporter: null,
|
|
11
|
+
LogReporter: null,
|
|
12
|
+
ProgressReporter: null,
|
|
13
|
+
VerboseFileLogReporter: null,
|
|
14
|
+
formatDuration: null,
|
|
15
|
+
formatHrtime: null,
|
|
16
|
+
hrToSeconds: null,
|
|
17
|
+
hrtimeDiff: null
|
|
18
|
+
});
|
|
5
19
|
function _export(target, all) {
|
|
6
20
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
21
|
enumerable: true,
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AdoReporter } from \"./AdoReporter.js\";\nexport { GithubActionsReporter } from \"./GithubActionsReporter.js\";\nexport { BasicReporter } from \"./BasicReporter.js\";\nexport { JsonReporter, type JsonReporterLogData, type JsonReporterSummaryData } from \"./JsonReporter.js\";\nexport { LogReporter } from \"./LogReporter.js\";\nexport { ChromeTraceEventsReporter } from \"./ChromeTraceEventsReporter.js\";\nexport { ProgressReporter } from \"./ProgressReporter.js\";\nexport { VerboseFileLogReporter } from \"./VerboseFileLogReporter.js\";\nexport type { TargetStatusData, TargetMessageData, TargetLogData } from \"./types/TargetLogData.js\";\nexport { formatDuration, formatHrtime, hrToSeconds, hrtimeDiff } from \"./formatDuration.js\";\n"],"names":["AdoReporter","BasicReporter","ChromeTraceEventsReporter","GithubActionsReporter","JsonReporter","LogReporter","ProgressReporter","VerboseFileLogReporter","formatDuration","formatHrtime","hrToSeconds","hrtimeDiff"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AdoReporter } from \"./AdoReporter.js\";\nexport { GithubActionsReporter } from \"./GithubActionsReporter.js\";\nexport { BasicReporter } from \"./BasicReporter.js\";\nexport { JsonReporter, type JsonReporterLogData, type JsonReporterSummaryData } from \"./JsonReporter.js\";\nexport { LogReporter } from \"./LogReporter.js\";\nexport { ChromeTraceEventsReporter } from \"./ChromeTraceEventsReporter.js\";\nexport { ProgressReporter } from \"./ProgressReporter.js\";\nexport { VerboseFileLogReporter } from \"./VerboseFileLogReporter.js\";\nexport type { TargetStatusData, TargetMessageData, TargetLogData } from \"./types/TargetLogData.js\";\nexport { formatDuration, formatHrtime, hrToSeconds, hrtimeDiff } from \"./formatDuration.js\";\n"],"names":["AdoReporter","BasicReporter","ChromeTraceEventsReporter","GithubActionsReporter","JsonReporter","LogReporter","ProgressReporter","VerboseFileLogReporter","formatDuration","formatHrtime","hrToSeconds","hrtimeDiff"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;QAASA;eAAAA,wBAAW;;QAEXC;eAAAA,4BAAa;;QAGbC;eAAAA,oDAAyB;;QAJzBC;eAAAA,4CAAqB;;QAErBC;eAAAA,0BAAY;;QACZC;eAAAA,wBAAW;;QAEXC;eAAAA,kCAAgB;;QAChBC;eAAAA,8CAAsB;;QAEtBC;eAAAA,8BAAc;;QAAEC;eAAAA,4BAAY;;QAAEC;eAAAA,2BAAW;;QAAEC;eAAAA,0BAAU;;;6BATlC;uCACU;+BACR;8BACuD;6BACzD;2CACc;kCACT;wCACM;gCAE+B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/reporters",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Log reporters for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"lint": "monorepo-scripts lint"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@lage-run/logger": "^1.4.
|
|
23
|
-
"@lage-run/scheduler-types": "^0.4.
|
|
24
|
-
"@lage-run/target-graph": "^0.15.
|
|
22
|
+
"@lage-run/logger": "^1.4.1",
|
|
23
|
+
"@lage-run/scheduler-types": "^0.4.2",
|
|
24
|
+
"@lage-run/target-graph": "^0.15.1",
|
|
25
25
|
"@ms-cloudpack/task-reporter": "^0.20.1",
|
|
26
26
|
"ansi-regex": "^5.0.1",
|
|
27
27
|
"chalk": "^4.1.2"
|