@lage-run/reporters 1.3.0 → 1.3.2
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/CHANGELOG.json +16 -1
- package/CHANGELOG.md +2 -2
- package/lib/AdoReporter.js.map +1 -1
- package/lib/ChromeTraceEventsReporter.js.map +1 -1
- package/lib/JsonReporter.js.map +1 -1
- package/lib/LogReporter.js.map +1 -1
- package/lib/ProgressReporter.js.map +1 -1
- package/lib/VerboseFileLogReporter.js.map +1 -1
- package/lib/index.js +7 -7
- package/lib/index.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.json
CHANGED
|
@@ -2,7 +2,22 @@
|
|
|
2
2
|
"name": "@lage-run/reporters",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
|
-
"date": "
|
|
5
|
+
"date": "Sat, 29 Mar 2025 02:16:38 GMT",
|
|
6
|
+
"version": "1.3.0",
|
|
7
|
+
"tag": "@lage-run/reporters_v1.3.0",
|
|
8
|
+
"comments": {
|
|
9
|
+
"none": [
|
|
10
|
+
{
|
|
11
|
+
"author": "elcraig@microsoft.com",
|
|
12
|
+
"package": "@lage-run/reporters",
|
|
13
|
+
"commit": "a680ab60dcddd84808f223a1b5f38a16e868b66f",
|
|
14
|
+
"comment": "Sync versions, and use workspace:^ versions for local deps"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"date": "Wed, 12 Feb 2025 00:08:30 GMT",
|
|
6
21
|
"version": "1.3.0",
|
|
7
22
|
"tag": "@lage-run/reporters_v1.3.0",
|
|
8
23
|
"comments": {
|
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Change Log - @lage-run/reporters
|
|
2
2
|
|
|
3
|
-
<!-- This log was last generated on Wed, 12 Feb 2025 00:08:
|
|
3
|
+
<!-- This log was last generated on Wed, 12 Feb 2025 00:08:30 GMT and should not be manually modified. -->
|
|
4
4
|
|
|
5
5
|
<!-- Start content -->
|
|
6
6
|
|
|
7
7
|
## 1.3.0
|
|
8
8
|
|
|
9
|
-
Wed, 12 Feb 2025 00:08:
|
|
9
|
+
Wed, 12 Feb 2025 00:08:30 GMT
|
|
10
10
|
|
|
11
11
|
### Minor changes
|
|
12
12
|
|
package/lib/AdoReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AdoReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport type { Writable } from \"stream\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst 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) {\n return `${colors.pkg(pkg)} ${colors.task(task)}`;\n}\n\nfunction normalize(prefixOrMessage: string, message?: string) {\n if (typeof message === \"string\") {\n const prefix = prefixOrMessage;\n return { prefix, message };\n } else {\n const prefix = \"\";\n const message = prefixOrMessage;\n return { prefix, message };\n }\n}\n\nfunction format(level: LogLevel, prefix: string, message: string) {\n return `${logLevelLabel[level]}: ${prefix} ${message}\\n`;\n}\n\nexport class AdoReporter implements Reporter {\n logStream: Writable = process.stdout;\n\n private logEntries = new Map<string, LogEntry[]>();\n readonly groupedEntries = new Map<string, LogEntry[]>();\n\n constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) {\n options.logLevel = options.logLevel || LogLevel.info;\n }\n\n log(entry: LogEntry<any>) {\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 private logTargetEntry(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { target, hash, duration } = data;\n const { packageName, task } = target;\n\n const normalizedArgs = this.options.grouped\n ? normalize(entry.msg)\n : normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), entry.msg);\n\n const pkgTask = this.options.grouped ? `${chalk.magenta(packageName)} ${chalk.cyan(task)}` : \"\";\n\n switch (data.status) {\n case \"running\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok(\"➔\")} start ${pkgTask}`)));\n\n case \"success\":\n return this.logStream.write(\n format(\n entry.level,\n normalizedArgs.prefix,\n colorFn(`${colors.ok(\"✓\")} done ${pkgTask} - ${formatDuration(hrToSeconds(duration!))}`)\n )\n );\n\n case \"failed\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.error(\"✖\")} fail ${pkgTask}`)));\n\n case \"skipped\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok(\"»\")} skip ${pkgTask} - ${hash!}`)));\n\n case \"aborted\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn(\"-\")} aborted ${pkgTask}`)));\n\n case \"queued\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn(\"…\")} aborted ${pkgTask}`)));\n }\n } else if (entry?.data?.target) {\n const { target } = data;\n const { packageName, task } = target;\n const normalizedArgs = this.options.grouped\n ? normalize(entry.msg)\n : normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), entry.msg);\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(\"| \" + normalizedArgs.message)));\n } else if (entry?.msg.trim() !== \"\") {\n return this.logStream.write(format(entry.level, \"\", entry.msg));\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\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(\n `##[group] ${colors.pkg(data.target.packageName ?? \"<root>\")} ${colors.task(data.target.task)} ${status}${\n duration ? `, took ${formatDuration(hrToSeconds(duration))}` : \"\"\n }\\n`\n );\n const entries = this.groupedEntries.get(id)! as LogEntry<TargetStatusEntry>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n this.logStream.write(`##[endgroup]\\n`);\n }\n }\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\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 this.logStream.write(chalk.cyanBright(`##[section]Summary\\n`));\n\n if (targetRuns.size > 0) {\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const colorFn = statusColorFn[wrappedTarget.status];\n const target = wrappedTarget.target;\n\n this.logStream.write(\n format(\n LogLevel.info,\n getTaskLogPrefix(target.packageName || \"[GLOBAL]\", target.task),\n colorFn(\n `${wrappedTarget.status}${wrappedTarget.duration ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}` : \"\"}`\n )\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 if (failed && failed.length > 0) {\n let packagesMessage = `##vso[task.logissue type=error]Your build failed on the following packages => `;\n\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const taskLogs = this.logEntries.get(targetId);\n\n packagesMessage += `[${packageName} ${task}], `;\n\n this.logStream.write(`##[error] [${chalk.magenta(packageName)} ${chalk.cyan(task)}] ${chalk.redBright(\"ERROR DETECTED\")}\\n`);\n\n if (taskLogs) {\n for (const entry of taskLogs) {\n // Log each entry separately to prevent truncation\n this.logStream.write(`##[error] ${entry.msg}\\n`);\n }\n }\n }\n }\n\n packagesMessage += \"find the error logs above with the prefix '##[error]!'\\n\";\n this.logStream.write(packagesMessage);\n }\n\n this.logStream.write(format(LogLevel.info, \"\", `Took a total of ${formatDuration(hrToSeconds(duration))} to complete`));\n }\n}\n"],"names":["AdoReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","silly","green","task","cyan","pkg","magenta","ok","red","yellow","logLevelLabel","getTaskLogPrefix","normalize","prefixOrMessage","message","prefix","format","level","log","entry","data","target","hidden","logEntries","has","id","set","get","push","options","logLevel","grouped","logTargetEntryByGroup","logTargetEntry","colorFn","isTargetStatusLogEntry","hash","duration","packageName","normalizedArgs","msg","pkgTask","status","logStream","write","formatDuration","hrToSeconds","trim","groupedEntries","entries","targetEntry","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","statusColorFn","greenBright","redBright","running","queued","cyanBright","size","slowestTargets","slowestTargetRuns","values","wrappedTarget","length","packagesMessage","targetId","taskLogs","constructor","process","stdout","Map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/AdoReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport type { Writable } from \"stream\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst 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) {\n return `${colors.pkg(pkg)} ${colors.task(task)}`;\n}\n\nfunction normalize(prefixOrMessage: string, message?: string) {\n if (typeof message === \"string\") {\n const prefix = prefixOrMessage;\n return { prefix, message };\n } else {\n const prefix = \"\";\n const message = prefixOrMessage;\n return { prefix, message };\n }\n}\n\nfunction format(level: LogLevel, prefix: string, message: string) {\n return `${logLevelLabel[level]}: ${prefix} ${message}\\n`;\n}\n\nexport class AdoReporter implements Reporter {\n logStream: Writable = process.stdout;\n\n private logEntries = new Map<string, LogEntry[]>();\n readonly groupedEntries = new Map<string, LogEntry[]>();\n\n constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) {\n options.logLevel = options.logLevel || LogLevel.info;\n }\n\n log(entry: LogEntry<any>) {\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 private logTargetEntry(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { target, hash, duration } = data;\n const { packageName, task } = target;\n\n const normalizedArgs = this.options.grouped\n ? normalize(entry.msg)\n : normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), entry.msg);\n\n const pkgTask = this.options.grouped ? `${chalk.magenta(packageName)} ${chalk.cyan(task)}` : \"\";\n\n switch (data.status) {\n case \"running\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok(\"➔\")} start ${pkgTask}`)));\n\n case \"success\":\n return this.logStream.write(\n format(\n entry.level,\n normalizedArgs.prefix,\n colorFn(`${colors.ok(\"✓\")} done ${pkgTask} - ${formatDuration(hrToSeconds(duration!))}`)\n )\n );\n\n case \"failed\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.error(\"✖\")} fail ${pkgTask}`)));\n\n case \"skipped\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok(\"»\")} skip ${pkgTask} - ${hash!}`)));\n\n case \"aborted\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn(\"-\")} aborted ${pkgTask}`)));\n\n case \"queued\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn(\"…\")} aborted ${pkgTask}`)));\n }\n } else if (entry?.data?.target) {\n const { target } = data;\n const { packageName, task } = target;\n const normalizedArgs = this.options.grouped\n ? normalize(entry.msg)\n : normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), entry.msg);\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(\"| \" + normalizedArgs.message)));\n } else if (entry?.msg.trim() !== \"\") {\n return this.logStream.write(format(entry.level, \"\", entry.msg));\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\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(\n `##[group] ${colors.pkg(data.target.packageName ?? \"<root>\")} ${colors.task(data.target.task)} ${status}${\n duration ? `, took ${formatDuration(hrToSeconds(duration))}` : \"\"\n }\\n`\n );\n const entries = this.groupedEntries.get(id)! as LogEntry<TargetStatusEntry>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n this.logStream.write(`##[endgroup]\\n`);\n }\n }\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\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 this.logStream.write(chalk.cyanBright(`##[section]Summary\\n`));\n\n if (targetRuns.size > 0) {\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const colorFn = statusColorFn[wrappedTarget.status];\n const target = wrappedTarget.target;\n\n this.logStream.write(\n format(\n LogLevel.info,\n getTaskLogPrefix(target.packageName || \"[GLOBAL]\", target.task),\n colorFn(\n `${wrappedTarget.status}${wrappedTarget.duration ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}` : \"\"}`\n )\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 if (failed && failed.length > 0) {\n let packagesMessage = `##vso[task.logissue type=error]Your build failed on the following packages => `;\n\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const taskLogs = this.logEntries.get(targetId);\n\n packagesMessage += `[${packageName} ${task}], `;\n\n this.logStream.write(`##[error] [${chalk.magenta(packageName)} ${chalk.cyan(task)}] ${chalk.redBright(\"ERROR DETECTED\")}\\n`);\n\n if (taskLogs) {\n for (const entry of taskLogs) {\n // Log each entry separately to prevent truncation\n this.logStream.write(`##[error] ${entry.msg}\\n`);\n }\n }\n }\n }\n\n packagesMessage += \"find the error logs above with the prefix '##[error]!'\\n\";\n this.logStream.write(packagesMessage);\n }\n\n this.logStream.write(format(LogLevel.info, \"\", `Took a total of ${formatDuration(hrToSeconds(duration))} to complete`));\n }\n}\n"],"names":["AdoReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","silly","green","task","cyan","pkg","magenta","ok","red","yellow","logLevelLabel","getTaskLogPrefix","normalize","prefixOrMessage","message","prefix","format","level","log","entry","data","target","hidden","logEntries","has","id","set","get","push","options","logLevel","grouped","logTargetEntryByGroup","logTargetEntry","colorFn","isTargetStatusLogEntry","hash","duration","packageName","normalizedArgs","msg","pkgTask","status","logStream","write","formatDuration","hrToSeconds","trim","groupedEntries","entries","targetEntry","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","statusColorFn","greenBright","redBright","running","queued","cyanBright","size","slowestTargets","slowestTargetRuns","values","wrappedTarget","length","packagesMessage","targetId","taskLogs","process","stdout","Map"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ChromeTraceEventsReporter.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetRun } from \"@lage-run/scheduler-types\";\nimport type { Writable } from \"stream\";\n\ninterface TraceEventsObject {\n traceEvents: CompleteEvent[];\n displayTimeUnit: \"ms\" | \"ns\";\n}\n\ninterface CompleteEvent {\n name: string;\n cat: string; // status#task\n ph: \"X\";\n ts: number; // in microseconds\n pid: number;\n tid: number;\n dur: number;\n args?: Record<string, any>;\n}\n\nexport interface ChromeTraceEventsReporterOptions {\n outputFile?: string;\n concurrency: number;\n categorize?: (targetRun?: TargetRun) => string;\n}\n\nfunction hrTimeToMicroseconds(hr: [number, number]) {\n return hr[0] * 1e6 + hr[1] * 1e-3;\n}\n\nfunction getTimeBasedFilename(prefix: string) {\n const now = new Date(); // 2011-10-05T14:48:00.000Z\n const datetime = now.toISOString().split(\".\")[0]; // 2011-10-05T14:48:00\n const datetimeNormalized = datetime.replace(/-|:/g, \"\"); // 20111005T144800\n return `${prefix ? prefix + \"-\" : \"\"}${datetimeNormalized}.json`;\n}\n\nexport class ChromeTraceEventsReporter implements Reporter {\n logStream: Writable;\n consoleLogStream: Writable = process.stdout;\n\n private events: TraceEventsObject = {\n traceEvents: [],\n displayTimeUnit: \"ms\",\n };\n private outputFile: string;\n\n constructor(private options: ChromeTraceEventsReporterOptions) {\n this.outputFile = options.outputFile ?? getTimeBasedFilename(\"profile\");\n\n if (!fs.existsSync(path.dirname(this.outputFile))) {\n fs.mkdirSync(path.dirname(this.outputFile), { recursive: true });\n }\n\n this.logStream = fs.createWriteStream(this.outputFile, { flags: \"w\" });\n }\n\n log() {\n // pass\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, startTime } = schedulerRunSummary;\n\n // categorize events\n const { categorize } = this.options;\n\n for (const targetRun of targetRuns.values()) {\n // Skip hidden targets because those should be hidden by reporters.\n // Hiding as well skipped targets to avoid polluting the profile.\n if (targetRun.target.hidden || targetRun.status === \"skipped\") {\n continue;\n }\n\n const event = {\n name: targetRun.target.id,\n cat: `${targetRun.status}#${targetRun.target.task}`,\n ph: \"X\",\n ts: hrTimeToMicroseconds(targetRun.startTime) - hrTimeToMicroseconds(startTime), // in microseconds\n dur: hrTimeToMicroseconds(targetRun.duration ?? [0, 1000]), // in microseconds\n pid: 1,\n tid: targetRun.threadId,\n } as CompleteEvent;\n\n if (categorize) {\n event.cat += `,${categorize(targetRun)}`;\n }\n\n this.events.traceEvents.push(event);\n }\n\n // write events to stream\n this.logStream.write(JSON.stringify(this.events, null, 2));\n\n this.consoleLogStream.write(\n chalk.blueBright(\n `\\nProfiler output written to ${chalk.underline(this.outputFile)}, open it with chrome://tracing or edge://tracing\\n`\n )\n );\n }\n}\n"],"names":["ChromeTraceEventsReporter","hrTimeToMicroseconds","hr","getTimeBasedFilename","prefix","now","Date","datetime","toISOString","split","datetimeNormalized","replace","log","summarize","schedulerRunSummary","targetRuns","startTime","categorize","options","targetRun","values","target","hidden","status","event","name","id","cat","task","ph","ts","dur","duration","pid","tid","threadId","events","traceEvents","push","logStream","write","JSON","stringify","consoleLogStream","chalk","blueBright","underline","outputFile","
|
|
1
|
+
{"version":3,"sources":["../src/ChromeTraceEventsReporter.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetRun } from \"@lage-run/scheduler-types\";\nimport type { Writable } from \"stream\";\n\ninterface TraceEventsObject {\n traceEvents: CompleteEvent[];\n displayTimeUnit: \"ms\" | \"ns\";\n}\n\ninterface CompleteEvent {\n name: string;\n cat: string; // status#task\n ph: \"X\";\n ts: number; // in microseconds\n pid: number;\n tid: number;\n dur: number;\n args?: Record<string, any>;\n}\n\nexport interface ChromeTraceEventsReporterOptions {\n outputFile?: string;\n concurrency: number;\n categorize?: (targetRun?: TargetRun) => string;\n}\n\nfunction hrTimeToMicroseconds(hr: [number, number]) {\n return hr[0] * 1e6 + hr[1] * 1e-3;\n}\n\nfunction getTimeBasedFilename(prefix: string) {\n const now = new Date(); // 2011-10-05T14:48:00.000Z\n const datetime = now.toISOString().split(\".\")[0]; // 2011-10-05T14:48:00\n const datetimeNormalized = datetime.replace(/-|:/g, \"\"); // 20111005T144800\n return `${prefix ? prefix + \"-\" : \"\"}${datetimeNormalized}.json`;\n}\n\nexport class ChromeTraceEventsReporter implements Reporter {\n logStream: Writable;\n consoleLogStream: Writable = process.stdout;\n\n private events: TraceEventsObject = {\n traceEvents: [],\n displayTimeUnit: \"ms\",\n };\n private outputFile: string;\n\n constructor(private options: ChromeTraceEventsReporterOptions) {\n this.outputFile = options.outputFile ?? getTimeBasedFilename(\"profile\");\n\n if (!fs.existsSync(path.dirname(this.outputFile))) {\n fs.mkdirSync(path.dirname(this.outputFile), { recursive: true });\n }\n\n this.logStream = fs.createWriteStream(this.outputFile, { flags: \"w\" });\n }\n\n log() {\n // pass\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, startTime } = schedulerRunSummary;\n\n // categorize events\n const { categorize } = this.options;\n\n for (const targetRun of targetRuns.values()) {\n // Skip hidden targets because those should be hidden by reporters.\n // Hiding as well skipped targets to avoid polluting the profile.\n if (targetRun.target.hidden || targetRun.status === \"skipped\") {\n continue;\n }\n\n const event = {\n name: targetRun.target.id,\n cat: `${targetRun.status}#${targetRun.target.task}`,\n ph: \"X\",\n ts: hrTimeToMicroseconds(targetRun.startTime) - hrTimeToMicroseconds(startTime), // in microseconds\n dur: hrTimeToMicroseconds(targetRun.duration ?? [0, 1000]), // in microseconds\n pid: 1,\n tid: targetRun.threadId,\n } as CompleteEvent;\n\n if (categorize) {\n event.cat += `,${categorize(targetRun)}`;\n }\n\n this.events.traceEvents.push(event);\n }\n\n // write events to stream\n this.logStream.write(JSON.stringify(this.events, null, 2));\n\n this.consoleLogStream.write(\n chalk.blueBright(\n `\\nProfiler output written to ${chalk.underline(this.outputFile)}, open it with chrome://tracing or edge://tracing\\n`\n )\n );\n }\n}\n"],"names":["ChromeTraceEventsReporter","hrTimeToMicroseconds","hr","getTimeBasedFilename","prefix","now","Date","datetime","toISOString","split","datetimeNormalized","replace","log","summarize","schedulerRunSummary","targetRuns","startTime","categorize","options","targetRun","values","target","hidden","status","event","name","id","cat","task","ph","ts","dur","duration","pid","tid","threadId","events","traceEvents","push","logStream","write","JSON","stringify","consoleLogStream","chalk","blueBright","underline","outputFile","process","stdout","displayTimeUnit","fs","existsSync","path","dirname","mkdirSync","recursive","createWriteStream","flags"],"mappings":";;;;+BAwCaA;;;eAAAA;;;8DAxCK;2DACH;6DACE;;;;;;;;;;;;;;;;;;;AA2BjB,SAASC,qBAAqBC,EAAoB;IAChD,OAAOA,EAAE,CAAC,EAAE,GAAG,MAAMA,EAAE,CAAC,EAAE,GAAG;AAC/B;AAEA,SAASC,qBAAqBC,MAAc;IAC1C,MAAMC,MAAM,IAAIC,QAAQ,2BAA2B;IACnD,MAAMC,WAAWF,IAAIG,WAAW,GAAGC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB;IACxE,MAAMC,qBAAqBH,SAASI,OAAO,CAAC,QAAQ,KAAK,kBAAkB;IAC3E,OAAO,GAAGP,SAASA,SAAS,MAAM,KAAKM,mBAAmB,KAAK,CAAC;AAClE;AAEO,MAAMV;IAoBXY,MAAM;IACJ,OAAO;IACT;IAEAC,UAAUC,mBAAwC,EAAE;QAClD,MAAM,EAAEC,UAAU,EAAEC,SAAS,EAAE,GAAGF;QAElC,oBAAoB;QACpB,MAAM,EAAEG,UAAU,EAAE,GAAG,IAAI,CAACC,OAAO;QAEnC,KAAK,MAAMC,aAAaJ,WAAWK,MAAM,GAAI;YAC3C,mEAAmE;YACnE,iEAAiE;YACjE,IAAID,UAAUE,MAAM,CAACC,MAAM,IAAIH,UAAUI,MAAM,KAAK,WAAW;gBAC7D;YACF;YAEA,MAAMC,QAAQ;gBACZC,MAAMN,UAAUE,MAAM,CAACK,EAAE;gBACzBC,KAAK,GAAGR,UAAUI,MAAM,CAAC,CAAC,EAAEJ,UAAUE,MAAM,CAACO,IAAI,EAAE;gBACnDC,IAAI;gBACJC,IAAI7B,qBAAqBkB,UAAUH,SAAS,IAAIf,qBAAqBe;gBACrEe,KAAK9B,qBAAqBkB,UAAUa,QAAQ,IAAI;oBAAC;oBAAG;iBAAK;gBACzDC,KAAK;gBACLC,KAAKf,UAAUgB,QAAQ;YACzB;YAEA,IAAIlB,YAAY;gBACdO,MAAMG,GAAG,IAAI,CAAC,CAAC,EAAEV,WAAWE,YAAY;YAC1C;YAEA,IAAI,CAACiB,MAAM,CAACC,WAAW,CAACC,IAAI,CAACd;QAC/B;QAEA,yBAAyB;QACzB,IAAI,CAACe,SAAS,CAACC,KAAK,CAACC,KAAKC,SAAS,CAAC,IAAI,CAACN,MAAM,EAAE,MAAM;QAEvD,IAAI,CAACO,gBAAgB,CAACH,KAAK,CACzBI,cAAK,CAACC,UAAU,CACd,CAAC,6BAA6B,EAAED,cAAK,CAACE,SAAS,CAAC,IAAI,CAACC,UAAU,EAAE,mDAAmD,CAAC;IAG3H;IApDA,YAAY,AAAQ7B,OAAyC,CAAE;;QAT/DqB,uBAAAA,aAAAA,KAAAA;QACAI,uBAAAA,oBAAAA,KAAAA;QAEA,uBAAQP,UAAR,KAAA;QAIA,uBAAQW,cAAR,KAAA;aAEoB7B,UAAAA;aARpByB,mBAA6BK,QAAQC,MAAM;aAEnCb,SAA4B;YAClCC,aAAa,EAAE;YACfa,iBAAiB;QACnB;QAIE,IAAI,CAACH,UAAU,GAAG7B,QAAQ6B,UAAU,IAAI5C,qBAAqB;QAE7D,IAAI,CAACgD,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,OAAO,CAAC,IAAI,CAACP,UAAU,IAAI;YACjDI,WAAE,CAACI,SAAS,CAACF,aAAI,CAACC,OAAO,CAAC,IAAI,CAACP,UAAU,GAAG;gBAAES,WAAW;YAAK;QAChE;QAEA,IAAI,CAACjB,SAAS,GAAGY,WAAE,CAACM,iBAAiB,CAAC,IAAI,CAACV,UAAU,EAAE;YAAEW,OAAO;QAAI;IACtE;AA6CF"}
|
package/lib/JsonReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/JsonReporter.ts"],"sourcesContent":["/* eslint-disable no-console */\n\nimport { hrToSeconds } from \"@lage-run/format-hrtime\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { LogLevel } from \"@lage-run/logger\";\nimport { type LogEntry, type Reporter } from \"@lage-run/logger\";\n\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\n\nexport class JsonReporter implements Reporter {\n constructor(private options: { logLevel: LogLevel; indented: boolean }) {}\n\n log(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n if (entry.data && entry.data.target && entry.data.target.hidden) {\n return;\n }\n\n if (this.options.logLevel >= entry.level) {\n console.log(this.options.indented ? JSON.stringify(entry, null, 2) : JSON.stringify(entry));\n }\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { duration, targetRuns, targetRunByStatus } = schedulerRunSummary;\n const summary: any = {};\n const taskStats: any[] = [];\n\n for (const targetRun of targetRuns.values()) {\n taskStats.push({\n package: targetRun.target.packageName,\n task: targetRun.target.task,\n duration: hrToSeconds(targetRun.duration),\n status: targetRun.status,\n });\n }\n\n for (const status of Object.keys(targetRunByStatus)) {\n if (targetRunByStatus[status] && targetRunByStatus[status].length.length > 0) {\n summary[`${status}Targets`] = targetRunByStatus[status].length;\n }\n }\n\n summary.duration = hrToSeconds(duration);\n summary.taskStats = taskStats;\n\n console.log(JSON.stringify({ summary }));\n }\n}\n"],"names":["JsonReporter","log","entry","data","target","hidden","options","logLevel","level","console","indented","JSON","stringify","summarize","schedulerRunSummary","duration","targetRuns","targetRunByStatus","summary","taskStats","targetRun","values","push","package","packageName","task","hrToSeconds","status","Object","keys","length"
|
|
1
|
+
{"version":3,"sources":["../src/JsonReporter.ts"],"sourcesContent":["/* eslint-disable no-console */\n\nimport { hrToSeconds } from \"@lage-run/format-hrtime\";\nimport type { SchedulerRunSummary } from \"@lage-run/scheduler-types\";\nimport type { LogLevel } from \"@lage-run/logger\";\nimport { type LogEntry, type Reporter } from \"@lage-run/logger\";\n\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\n\nexport class JsonReporter implements Reporter {\n constructor(private options: { logLevel: LogLevel; indented: boolean }) {}\n\n log(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n if (entry.data && entry.data.target && entry.data.target.hidden) {\n return;\n }\n\n if (this.options.logLevel >= entry.level) {\n console.log(this.options.indented ? JSON.stringify(entry, null, 2) : JSON.stringify(entry));\n }\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { duration, targetRuns, targetRunByStatus } = schedulerRunSummary;\n const summary: any = {};\n const taskStats: any[] = [];\n\n for (const targetRun of targetRuns.values()) {\n taskStats.push({\n package: targetRun.target.packageName,\n task: targetRun.target.task,\n duration: hrToSeconds(targetRun.duration),\n status: targetRun.status,\n });\n }\n\n for (const status of Object.keys(targetRunByStatus)) {\n if (targetRunByStatus[status] && targetRunByStatus[status].length.length > 0) {\n summary[`${status}Targets`] = targetRunByStatus[status].length;\n }\n }\n\n summary.duration = hrToSeconds(duration);\n summary.taskStats = taskStats;\n\n console.log(JSON.stringify({ summary }));\n }\n}\n"],"names":["JsonReporter","log","entry","data","target","hidden","options","logLevel","level","console","indented","JSON","stringify","summarize","schedulerRunSummary","duration","targetRuns","targetRunByStatus","summary","taskStats","targetRun","values","push","package","packageName","task","hrToSeconds","status","Object","keys","length"],"mappings":"AAAA,6BAA6B;;;;+BAShBA;;;eAAAA;;;8BAPe;;;;;;;;;;;;;;AAOrB,MAAMA;IAGXC,IAAIC,KAAuD,EAAE;QAC3D,IAAIA,MAAMC,IAAI,IAAID,MAAMC,IAAI,CAACC,MAAM,IAAIF,MAAMC,IAAI,CAACC,MAAM,CAACC,MAAM,EAAE;YAC/D;QACF;QAEA,IAAI,IAAI,CAACC,OAAO,CAACC,QAAQ,IAAIL,MAAMM,KAAK,EAAE;YACxCC,QAAQR,GAAG,CAAC,IAAI,CAACK,OAAO,CAACI,QAAQ,GAAGC,KAAKC,SAAS,CAACV,OAAO,MAAM,KAAKS,KAAKC,SAAS,CAACV;QACtF;IACF;IAEAW,UAAUC,mBAAwC,EAAE;QAClD,MAAM,EAAEC,QAAQ,EAAEC,UAAU,EAAEC,iBAAiB,EAAE,GAAGH;QACpD,MAAMI,UAAe,CAAC;QACtB,MAAMC,YAAmB,EAAE;QAE3B,KAAK,MAAMC,aAAaJ,WAAWK,MAAM,GAAI;YAC3CF,UAAUG,IAAI,CAAC;gBACbC,SAASH,UAAUhB,MAAM,CAACoB,WAAW;gBACrCC,MAAML,UAAUhB,MAAM,CAACqB,IAAI;gBAC3BV,UAAUW,IAAAA,yBAAW,EAACN,UAAUL,QAAQ;gBACxCY,QAAQP,UAAUO,MAAM;YAC1B;QACF;QAEA,KAAK,MAAMA,UAAUC,OAAOC,IAAI,CAACZ,mBAAoB;YACnD,IAAIA,iBAAiB,CAACU,OAAO,IAAIV,iBAAiB,CAACU,OAAO,CAACG,MAAM,CAACA,MAAM,GAAG,GAAG;gBAC5EZ,OAAO,CAAC,GAAGS,OAAO,OAAO,CAAC,CAAC,GAAGV,iBAAiB,CAACU,OAAO,CAACG,MAAM;YAChE;QACF;QAEAZ,QAAQH,QAAQ,GAAGW,IAAAA,yBAAW,EAACX;QAC/BG,QAAQC,SAAS,GAAGA;QAEpBV,QAAQR,GAAG,CAACU,KAAKC,SAAS,CAAC;YAAEM;QAAQ;IACvC;IApCA,YAAY,AAAQZ,OAAkD,CAAE;;aAApDA,UAAAA;IAAqD;AAqC3E"}
|
package/lib/LogReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/LogReporter.ts"],"sourcesContent":["import { formatDuration, hrtimeDiff, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport ansiRegex from \"ansi-regex\";\nimport chalk from \"chalk\";\nimport type { Chalk } from \"chalk\";\nimport gradient from \"gradient-string\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport type { Writable } from \"stream\";\nimport crypto from \"crypto\";\nimport { formatBytes } from \"./formatBytes.js\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst 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// 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\nconst stripAnsiRegex = ansiRegex();\n\nfunction getTaskLogPrefix(pkg: string, task: string) {\n const pkgColor = getColorForPkg(pkg);\n return `${pkgColor(pkg)} ${colors.task(task)}`;\n}\n\nfunction stripAnsi(message: string) {\n return message.replace(stripAnsiRegex, \"\");\n}\n\nfunction normalize(prefixOrMessage: string, message?: string) {\n if (typeof message === \"string\") {\n const prefix = prefixOrMessage;\n return { prefix, message };\n } else {\n const prefix = \"\";\n const message = prefixOrMessage;\n return { prefix, message };\n }\n}\n\nexport class LogReporter implements Reporter {\n logStream: Writable = process.stdout;\n private logEntries = new Map<string, LogEntry[]>();\n readonly groupedEntries = new Map<string, LogEntry[]>();\n\n constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) {\n options.logLevel = options.logLevel || LogLevel.info;\n }\n\n log(entry: LogEntry<any>) {\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 let msg = message;\n\n if (entry?.data?.target) {\n const { packageName, task } = entry.data.target;\n const normalizedArgs = normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), msg);\n prefix = normalizedArgs.prefix;\n msg = normalizedArgs.message;\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<TargetStatusEntry | TargetMessageEntry>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { hash, duration } = data;\n switch (data.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 - ${formatDuration(hrToSeconds(duration!))}`));\n\n case \"failed\":\n return this.printEntry(entry, colorFn(`${colors.error(\"✖\")} fail`));\n\n case \"skipped\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"»\")} skip - ${hash!}`));\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 } else {\n return this.printEntry(entry, colorFn(\": \" + stripAnsi(entry.msg)));\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\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<TargetStatusEntry>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n if (entries.length > 2) {\n this.hr();\n }\n }\n }\n\n hr() {\n this.print(\"┈\".repeat(80));\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\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 if (targetRuns.size > 0) {\n this.print(chalk.cyanBright(`\\nSummary`));\n\n this.hr();\n\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n if (wrappedTarget.target.hidden) {\n continue;\n }\n\n const colorFn = statusColorFn[wrappedTarget.status] ?? chalk.white;\n const target = wrappedTarget.target;\n const hasDurations = !!wrappedTarget.duration && !!wrappedTarget.queueTime;\n const queueDuration: [number, number] = hasDurations ? hrtimeDiff(wrappedTarget.queueTime, wrappedTarget.startTime) : [0, 0];\n\n this.print(\n `${getTaskLogPrefix(target.packageName || \"<root>\", target.task)} ${colorFn(\n `${wrappedTarget.status === \"running\" ? \"running - incomplete\" : wrappedTarget.status}${\n hasDurations\n ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}, queued for ${formatDuration(hrToSeconds(queueDuration))}`\n : \"\"\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.hr();\n\n if (failed && 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.hr();\n }\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? gradient({ r: 237, g: 178, b: 77 }, \"cyan\")(`All targets skipped!`) : \"\";\n\n this.print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`);\n }\n\n resetLogEntries() {\n this.logEntries.clear();\n }\n}\n"],"names":["LogReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","hex","silly","green","task","pkg","ok","red","yellow","pkgColors","hashStringToNumber","str","hash","crypto","createHash","update","digest","substring","parseInt","pkgNameToIndexInPkgColorArray","Map","getColorForPkg","has","index","length","set","get","stripAnsiRegex","ansiRegex","getTaskLogPrefix","pkgColor","stripAnsi","message","replace","normalize","prefixOrMessage","prefix","log","entry","data","target","hidden","id","logEntries","push","options","logLevel","level","grouped","logTargetEntryByGroup","logTargetEntry","msg","print","printEntry","packageName","normalizedArgs","logStream","write","colorFn","isTargetStatusLogEntry","duration","status","formatDuration","hrToSeconds","entries","targetEntry","hr","repeat","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","statusColorFn","greenBright","redBright","running","queued","magenta","size","cyanBright","slowestTargets","slowestTargetRuns","values","wrappedTarget","hasDurations","queueTime","queueDuration","hrtimeDiff","startTime","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","failureLogs","allCacheHits","filter","run","allCacheHitText","gradient","r","g","b","resetLogEntries","clear","constructor","groupedEntries","process","stdout"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/LogReporter.ts"],"sourcesContent":["import { formatDuration, hrtimeDiff, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport ansiRegex from \"ansi-regex\";\nimport chalk from \"chalk\";\nimport type { Chalk } from \"chalk\";\nimport gradient from \"gradient-string\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport type { Writable } from \"stream\";\nimport crypto from \"crypto\";\nimport { formatBytes } from \"./formatBytes.js\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst 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// 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\nconst stripAnsiRegex = ansiRegex();\n\nfunction getTaskLogPrefix(pkg: string, task: string) {\n const pkgColor = getColorForPkg(pkg);\n return `${pkgColor(pkg)} ${colors.task(task)}`;\n}\n\nfunction stripAnsi(message: string) {\n return message.replace(stripAnsiRegex, \"\");\n}\n\nfunction normalize(prefixOrMessage: string, message?: string) {\n if (typeof message === \"string\") {\n const prefix = prefixOrMessage;\n return { prefix, message };\n } else {\n const prefix = \"\";\n const message = prefixOrMessage;\n return { prefix, message };\n }\n}\n\nexport class LogReporter implements Reporter {\n logStream: Writable = process.stdout;\n private logEntries = new Map<string, LogEntry[]>();\n readonly groupedEntries = new Map<string, LogEntry[]>();\n\n constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) {\n options.logLevel = options.logLevel || LogLevel.info;\n }\n\n log(entry: LogEntry<any>) {\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 let msg = message;\n\n if (entry?.data?.target) {\n const { packageName, task } = entry.data.target;\n const normalizedArgs = normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), msg);\n prefix = normalizedArgs.prefix;\n msg = normalizedArgs.message;\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<TargetStatusEntry | TargetMessageEntry>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { hash, duration } = data;\n switch (data.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 - ${formatDuration(hrToSeconds(duration!))}`));\n\n case \"failed\":\n return this.printEntry(entry, colorFn(`${colors.error(\"✖\")} fail`));\n\n case \"skipped\":\n return this.printEntry(entry, colorFn(`${colors.ok(\"»\")} skip - ${hash!}`));\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 } else {\n return this.printEntry(entry, colorFn(\": \" + stripAnsi(entry.msg)));\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\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<TargetStatusEntry>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n if (entries.length > 2) {\n this.hr();\n }\n }\n }\n\n hr() {\n this.print(\"┈\".repeat(80));\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\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 if (targetRuns.size > 0) {\n this.print(chalk.cyanBright(`\\nSummary`));\n\n this.hr();\n\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n if (wrappedTarget.target.hidden) {\n continue;\n }\n\n const colorFn = statusColorFn[wrappedTarget.status] ?? chalk.white;\n const target = wrappedTarget.target;\n const hasDurations = !!wrappedTarget.duration && !!wrappedTarget.queueTime;\n const queueDuration: [number, number] = hasDurations ? hrtimeDiff(wrappedTarget.queueTime, wrappedTarget.startTime) : [0, 0];\n\n this.print(\n `${getTaskLogPrefix(target.packageName || \"<root>\", target.task)} ${colorFn(\n `${wrappedTarget.status === \"running\" ? \"running - incomplete\" : wrappedTarget.status}${\n hasDurations\n ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}, queued for ${formatDuration(hrToSeconds(queueDuration))}`\n : \"\"\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.hr();\n\n if (failed && 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.hr();\n }\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? gradient({ r: 237, g: 178, b: 77 }, \"cyan\")(`All targets skipped!`) : \"\";\n\n this.print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`);\n }\n\n resetLogEntries() {\n this.logEntries.clear();\n }\n}\n"],"names":["LogReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","hex","silly","green","task","pkg","ok","red","yellow","pkgColors","hashStringToNumber","str","hash","crypto","createHash","update","digest","substring","parseInt","pkgNameToIndexInPkgColorArray","Map","getColorForPkg","has","index","length","set","get","stripAnsiRegex","ansiRegex","getTaskLogPrefix","pkgColor","stripAnsi","message","replace","normalize","prefixOrMessage","prefix","log","entry","data","target","hidden","id","logEntries","push","options","logLevel","level","grouped","logTargetEntryByGroup","logTargetEntry","msg","print","printEntry","packageName","normalizedArgs","logStream","write","colorFn","isTargetStatusLogEntry","duration","status","formatDuration","hrToSeconds","entries","targetEntry","hr","repeat","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","statusColorFn","greenBright","redBright","running","queued","magenta","size","cyanBright","slowestTargets","slowestTargetRuns","values","wrappedTarget","hasDurations","queueTime","queueDuration","hrtimeDiff","startTime","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","failureLogs","allCacheHits","filter","run","allCacheHitText","gradient","r","g","b","resetLogEntries","clear","groupedEntries","process","stdout"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ProgressReporter.ts"],"sourcesContent":["import EventEmitter from \"events\";\nimport { type LogEntry, LogLevel, type Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\n\n// @ts-ignore Ignoring ESM in CJS errors here, but still importing the types to be used\n// import type { TaskReporter as TaskReporterType, TaskReporterTask } from \"@ms-cloudpack/task-reporter\";\nimport { TaskReporter, type TaskReporterTask } from \"@ms-cloudpack/task-reporter\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport gradient from \"gradient-string\";\nimport chalk from \"chalk\";\nimport type { Writable } from \"stream\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\nimport { formatBytes } from \"./formatBytes.js\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst 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\nfunction fancy(str: string) {\n return gradient({ r: 237, g: 178, b: 77 }, \"cyan\")(str);\n}\n\nexport class ProgressReporter implements Reporter {\n logStream: Writable = process.stdout;\n startTime: [number, number] = [0, 0];\n\n logEvent: EventEmitter = new EventEmitter();\n logEntries = new Map<string, LogEntry[]>();\n\n taskReporter: TaskReporter;\n tasks: Map<string, TaskReporterTask> = new Map();\n\n constructor(private options: { concurrency: number; version: string } = { concurrency: 0, version: \"0.0.0\" }) {\n this.taskReporter = this.createTaskReporter();\n\n this.print(`${fancy(\"lage\")} - Version ${options.version} - ${options.concurrency} Workers`);\n }\n\n createTaskReporter() {\n return new TaskReporter({\n productName: \"lage\",\n version: this.options.version,\n\n showCompleted: true,\n showConsoleDebug: true,\n showConsoleError: true,\n showConsoleInfo: true,\n showConsoleLog: true,\n showConsoleWarn: true,\n showErrors: true,\n showPending: true,\n showProgress: true,\n showStarted: true,\n showSummary: true,\n showTaskDetails: true,\n showTaskExtended: true,\n });\n }\n\n log(entry: LogEntry<any>) {\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 \"hidden\", do not even attempt to record or report the entry\n if (entry?.data?.target?.hidden) {\n return;\n }\n\n if (entry.data && entry.data.schedulerRun) {\n this.startTime = entry.data.schedulerRun.startTime;\n }\n\n if (entry.data && entry.data.status && entry.data.target) {\n const target: Target = entry.data.target;\n const status: TargetStatus = entry.data.status;\n\n const reporterTask = this.tasks.has(target.id) ? this.tasks.get(target.id) : this.taskReporter.addTask(target.label, true);\n\n if (reporterTask) {\n this.tasks.set(target.id, reporterTask);\n switch (status) {\n case \"running\":\n reporterTask.start();\n break;\n\n case \"success\":\n reporterTask.complete({ status: \"complete\" });\n break;\n\n case \"aborted\":\n reporterTask.complete({ status: \"abort\" });\n break;\n\n case \"skipped\":\n reporterTask.complete({ status: \"skip\" });\n break;\n\n case \"failed\":\n reporterTask.complete({ status: \"fail\" });\n break;\n }\n }\n }\n }\n\n private print(message: string) {\n this.logStream.write(message + \"\\n\");\n }\n\n hr() {\n this.print(\"┈\".repeat(80));\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending, running, queued } = targetRunByStatus;\n\n // If we are printing summary, and there are still some running / queued tasks - report them as aborted\n for (const wrappedTarget of running.concat(queued)) {\n const reporterTask = this.tasks.get(wrappedTarget);\n if (reporterTask) {\n reporterTask.complete({ status: \"abort\" });\n }\n }\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\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 if (targetRuns.size > 0) {\n this.print(chalk.cyanBright(`\\nSummary`));\n\n this.hr();\n\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n if (wrappedTarget.target.hidden) {\n continue;\n }\n\n const colorFn = statusColorFn[wrappedTarget.status] ?? chalk.white;\n const target = wrappedTarget.target;\n const hasDurations = !!wrappedTarget.duration && !!wrappedTarget.queueTime;\n const queueDuration: [number, number] = hasDurations ? hrtimeDiff(wrappedTarget.queueTime, wrappedTarget.startTime) : [0, 0];\n\n if (wrappedTarget.status === \"running\") {\n const reporterTask = this.tasks.get(wrappedTarget.target.id);\n if (reporterTask) {\n reporterTask.complete({ status: \"fail\" });\n }\n }\n\n this.print(\n `${target.label} ${colorFn(\n `${wrappedTarget.status === \"running\" ? \"running - incomplete\" : wrappedTarget.status}${\n hasDurations\n ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}, queued for ${formatDuration(hrToSeconds(queueDuration))}`\n : \"\"\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.hr();\n\n if (failed && 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.hr();\n }\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? fancy(`All targets skipped!`) : \"\";\n\n this.print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`);\n }\n}\n"],"names":["ProgressReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","hex","silly","green","task","pkg","ok","red","yellow","fancy","str","gradient","r","g","b","createTaskReporter","TaskReporter","productName","version","options","showCompleted","showConsoleDebug","showConsoleError","showConsoleInfo","showConsoleLog","showConsoleWarn","showErrors","showPending","showProgress","showStarted","showSummary","showTaskDetails","showTaskExtended","log","entry","data","target","id","logEntries","has","set","get","push","hidden","schedulerRun","startTime","status","reporterTask","tasks","taskReporter","addTask","label","start","complete","print","message","logStream","write","hr","repeat","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","duration","failed","aborted","skipped","success","pending","running","queued","wrappedTarget","concat","statusColorFn","greenBright","redBright","magenta","size","cyanBright","slowestTargets","slowestTargetRuns","values","colorFn","hasDurations","queueTime","queueDuration","hrtimeDiff","formatDuration","hrToSeconds","length","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","packageName","failureLogs","msg","allCacheHits","filter","run","allCacheHitText","constructor","concurrency","logEvent","process","stdout","EventEmitter","Map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/ProgressReporter.ts"],"sourcesContent":["import EventEmitter from \"events\";\nimport { type LogEntry, LogLevel, type Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\n\n// @ts-ignore Ignoring ESM in CJS errors here, but still importing the types to be used\n// import type { TaskReporter as TaskReporterType, TaskReporterTask } from \"@ms-cloudpack/task-reporter\";\nimport { TaskReporter, type TaskReporterTask } from \"@ms-cloudpack/task-reporter\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport gradient from \"gradient-string\";\nimport chalk from \"chalk\";\nimport type { Writable } from \"stream\";\nimport { formatDuration, hrToSeconds, hrtimeDiff } from \"@lage-run/format-hrtime\";\nimport { formatBytes } from \"./formatBytes.js\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst 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\nfunction fancy(str: string) {\n return gradient({ r: 237, g: 178, b: 77 }, \"cyan\")(str);\n}\n\nexport class ProgressReporter implements Reporter {\n logStream: Writable = process.stdout;\n startTime: [number, number] = [0, 0];\n\n logEvent: EventEmitter = new EventEmitter();\n logEntries = new Map<string, LogEntry[]>();\n\n taskReporter: TaskReporter;\n tasks: Map<string, TaskReporterTask> = new Map();\n\n constructor(private options: { concurrency: number; version: string } = { concurrency: 0, version: \"0.0.0\" }) {\n this.taskReporter = this.createTaskReporter();\n\n this.print(`${fancy(\"lage\")} - Version ${options.version} - ${options.concurrency} Workers`);\n }\n\n createTaskReporter() {\n return new TaskReporter({\n productName: \"lage\",\n version: this.options.version,\n\n showCompleted: true,\n showConsoleDebug: true,\n showConsoleError: true,\n showConsoleInfo: true,\n showConsoleLog: true,\n showConsoleWarn: true,\n showErrors: true,\n showPending: true,\n showProgress: true,\n showStarted: true,\n showSummary: true,\n showTaskDetails: true,\n showTaskExtended: true,\n });\n }\n\n log(entry: LogEntry<any>) {\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 \"hidden\", do not even attempt to record or report the entry\n if (entry?.data?.target?.hidden) {\n return;\n }\n\n if (entry.data && entry.data.schedulerRun) {\n this.startTime = entry.data.schedulerRun.startTime;\n }\n\n if (entry.data && entry.data.status && entry.data.target) {\n const target: Target = entry.data.target;\n const status: TargetStatus = entry.data.status;\n\n const reporterTask = this.tasks.has(target.id) ? this.tasks.get(target.id) : this.taskReporter.addTask(target.label, true);\n\n if (reporterTask) {\n this.tasks.set(target.id, reporterTask);\n switch (status) {\n case \"running\":\n reporterTask.start();\n break;\n\n case \"success\":\n reporterTask.complete({ status: \"complete\" });\n break;\n\n case \"aborted\":\n reporterTask.complete({ status: \"abort\" });\n break;\n\n case \"skipped\":\n reporterTask.complete({ status: \"skip\" });\n break;\n\n case \"failed\":\n reporterTask.complete({ status: \"fail\" });\n break;\n }\n }\n }\n }\n\n private print(message: string) {\n this.logStream.write(message + \"\\n\");\n }\n\n hr() {\n this.print(\"┈\".repeat(80));\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary) {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending, running, queued } = targetRunByStatus;\n\n // If we are printing summary, and there are still some running / queued tasks - report them as aborted\n for (const wrappedTarget of running.concat(queued)) {\n const reporterTask = this.tasks.get(wrappedTarget);\n if (reporterTask) {\n reporterTask.complete({ status: \"abort\" });\n }\n }\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\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 if (targetRuns.size > 0) {\n this.print(chalk.cyanBright(`\\nSummary`));\n\n this.hr();\n\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n if (wrappedTarget.target.hidden) {\n continue;\n }\n\n const colorFn = statusColorFn[wrappedTarget.status] ?? chalk.white;\n const target = wrappedTarget.target;\n const hasDurations = !!wrappedTarget.duration && !!wrappedTarget.queueTime;\n const queueDuration: [number, number] = hasDurations ? hrtimeDiff(wrappedTarget.queueTime, wrappedTarget.startTime) : [0, 0];\n\n if (wrappedTarget.status === \"running\") {\n const reporterTask = this.tasks.get(wrappedTarget.target.id);\n if (reporterTask) {\n reporterTask.complete({ status: \"fail\" });\n }\n }\n\n this.print(\n `${target.label} ${colorFn(\n `${wrappedTarget.status === \"running\" ? \"running - incomplete\" : wrappedTarget.status}${\n hasDurations\n ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}, queued for ${formatDuration(hrToSeconds(queueDuration))}`\n : \"\"\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.hr();\n\n if (failed && 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.hr();\n }\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? fancy(`All targets skipped!`) : \"\";\n\n this.print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`);\n }\n}\n"],"names":["ProgressReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","hex","silly","green","task","pkg","ok","red","yellow","fancy","str","gradient","r","g","b","createTaskReporter","TaskReporter","productName","version","options","showCompleted","showConsoleDebug","showConsoleError","showConsoleInfo","showConsoleLog","showConsoleWarn","showErrors","showPending","showProgress","showStarted","showSummary","showTaskDetails","showTaskExtended","log","entry","data","target","id","logEntries","has","set","get","push","hidden","schedulerRun","startTime","status","reporterTask","tasks","taskReporter","addTask","label","start","complete","print","message","logStream","write","hr","repeat","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","duration","failed","aborted","skipped","success","pending","running","queued","wrappedTarget","concat","statusColorFn","greenBright","redBright","magenta","size","cyanBright","slowestTargets","slowestTargetRuns","values","colorFn","hasDurations","queueTime","queueDuration","hrtimeDiff","formatDuration","hrToSeconds","length","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","packageName","failureLogs","msg","allCacheHits","filter","run","allCacheHitText","concurrency","logEvent","process","stdout","EventEmitter","Map"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/VerboseFileLogReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport ansiRegex from \"ansi-regex\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport { Writable } from \"stream\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nconst stripAnsiRegex = ansiRegex();\n\nfunction stripAnsi(message: string) {\n return message.replace(stripAnsiRegex, \"\");\n}\n\nexport class VerboseFileLogReporter implements Reporter {\n fileStream: Writable;\n constructor(logFile?: string) {\n // if logFile is falsy (not specified on cli args), this.fileStream just become a \"nowhere\" stream and this reporter effectively does nothing\n if (logFile) {\n const logFilePath = path.dirname(path.resolve(logFile));\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(logFilePath, { recursive: true });\n }\n }\n\n this.fileStream = logFile ? fs.createWriteStream(logFile) : new Writable({ write() {} });\n }\n\n cleanup() {\n this.fileStream?.end();\n }\n\n log(entry: LogEntry<any>) {\n // if \"hidden\", do not even attempt to record or report the entry\n if (entry?.data?.target?.hidden) {\n return;\n }\n\n // if loglevel is not high enough, do not report the entry\n if (LogLevel.verbose < entry.level) {\n return;\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 packageAndTask = \"\";\n\n if (entry?.data?.target) {\n const { packageName, task } = entry.data.target;\n const pkg = packageName ?? \"<root>\";\n\n packageAndTask = `${pkg} ${task}`.trim();\n }\n\n this.print(`${this.getEntryTargetId(entry)} ${packageAndTask} ${message}`.trim());\n }\n\n private getEntryTargetId(entry: LogEntry<any>) {\n if (entry.data?.target?.id) {\n return `[:${entry.data.target.id}:]`;\n }\n\n return \"\";\n }\n\n private print(message: string) {\n this.fileStream?.write(message + \"\\n\");\n }\n\n private logTargetEntry(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { hash, duration, status } = data;\n const statusMessages = {\n running: \"➔ start\",\n success: `✓ done - ${duration && formatDuration(hrToSeconds(duration))}`,\n failed: \"✖ fail\",\n skipped: `» skip - ${hash}`,\n aborted: \"- aborted\",\n queued: \"… queued\",\n };\n\n return this.printEntry(entry, statusMessages[status]);\n } else {\n const defaultMessage = `: ${stripAnsi(entry.msg)}`;\n return this.printEntry(entry, defaultMessage);\n }\n }\n\n summarize() {\n // No summary needed for VerboseFileLogReporter\n }\n}\n"],"names":["VerboseFileLogReporter","stripAnsiRegex","ansiRegex","stripAnsi","message","replace","cleanup","fileStream","end","log","entry","data","target","hidden","LogLevel","verbose","level","logTargetEntry","msg","print","printEntry","packageAndTask","packageName","task","pkg","trim","getEntryTargetId","id","write","isTargetStatusLogEntry","hash","duration","status","statusMessages","running","success","formatDuration","hrToSeconds","failed","skipped","aborted","queued","defaultMessage","summarize","
|
|
1
|
+
{"version":3,"sources":["../src/VerboseFileLogReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel } from \"@lage-run/logger\";\nimport ansiRegex from \"ansi-regex\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport { Writable } from \"stream\";\nimport fs from \"fs\";\nimport path from \"path\";\n\nconst stripAnsiRegex = ansiRegex();\n\nfunction stripAnsi(message: string) {\n return message.replace(stripAnsiRegex, \"\");\n}\n\nexport class VerboseFileLogReporter implements Reporter {\n fileStream: Writable;\n constructor(logFile?: string) {\n // if logFile is falsy (not specified on cli args), this.fileStream just become a \"nowhere\" stream and this reporter effectively does nothing\n if (logFile) {\n const logFilePath = path.dirname(path.resolve(logFile));\n if (!fs.existsSync(logFilePath)) {\n fs.mkdirSync(logFilePath, { recursive: true });\n }\n }\n\n this.fileStream = logFile ? fs.createWriteStream(logFile) : new Writable({ write() {} });\n }\n\n cleanup() {\n this.fileStream?.end();\n }\n\n log(entry: LogEntry<any>) {\n // if \"hidden\", do not even attempt to record or report the entry\n if (entry?.data?.target?.hidden) {\n return;\n }\n\n // if loglevel is not high enough, do not report the entry\n if (LogLevel.verbose < entry.level) {\n return;\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 packageAndTask = \"\";\n\n if (entry?.data?.target) {\n const { packageName, task } = entry.data.target;\n const pkg = packageName ?? \"<root>\";\n\n packageAndTask = `${pkg} ${task}`.trim();\n }\n\n this.print(`${this.getEntryTargetId(entry)} ${packageAndTask} ${message}`.trim());\n }\n\n private getEntryTargetId(entry: LogEntry<any>) {\n if (entry.data?.target?.id) {\n return `[:${entry.data.target.id}:]`;\n }\n\n return \"\";\n }\n\n private print(message: string) {\n this.fileStream?.write(message + \"\\n\");\n }\n\n private logTargetEntry(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { hash, duration, status } = data;\n const statusMessages = {\n running: \"➔ start\",\n success: `✓ done - ${duration && formatDuration(hrToSeconds(duration))}`,\n failed: \"✖ fail\",\n skipped: `» skip - ${hash}`,\n aborted: \"- aborted\",\n queued: \"… queued\",\n };\n\n return this.printEntry(entry, statusMessages[status]);\n } else {\n const defaultMessage = `: ${stripAnsi(entry.msg)}`;\n return this.printEntry(entry, defaultMessage);\n }\n }\n\n summarize() {\n // No summary needed for VerboseFileLogReporter\n }\n}\n"],"names":["VerboseFileLogReporter","stripAnsiRegex","ansiRegex","stripAnsi","message","replace","cleanup","fileStream","end","log","entry","data","target","hidden","LogLevel","verbose","level","logTargetEntry","msg","print","printEntry","packageAndTask","packageName","task","pkg","trim","getEntryTargetId","id","write","isTargetStatusLogEntry","hash","duration","status","statusMessages","running","success","formatDuration","hrToSeconds","failed","skipped","aborted","queued","defaultMessage","summarize","logFile","logFilePath","path","dirname","resolve","fs","existsSync","mkdirSync","recursive","createWriteStream","Writable"],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -5,26 +5,26 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
function _export(target, all) {
|
|
6
6
|
for(var name in all)Object.defineProperty(target, name, {
|
|
7
7
|
enumerable: true,
|
|
8
|
-
get: all
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
AdoReporter
|
|
12
|
+
get AdoReporter () {
|
|
13
13
|
return _AdoReporter.AdoReporter;
|
|
14
14
|
},
|
|
15
|
-
ChromeTraceEventsReporter
|
|
15
|
+
get ChromeTraceEventsReporter () {
|
|
16
16
|
return _ChromeTraceEventsReporter.ChromeTraceEventsReporter;
|
|
17
17
|
},
|
|
18
|
-
JsonReporter
|
|
18
|
+
get JsonReporter () {
|
|
19
19
|
return _JsonReporter.JsonReporter;
|
|
20
20
|
},
|
|
21
|
-
LogReporter
|
|
21
|
+
get LogReporter () {
|
|
22
22
|
return _LogReporter.LogReporter;
|
|
23
23
|
},
|
|
24
|
-
ProgressReporter
|
|
24
|
+
get ProgressReporter () {
|
|
25
25
|
return _ProgressReporter.ProgressReporter;
|
|
26
26
|
},
|
|
27
|
-
VerboseFileLogReporter
|
|
27
|
+
get VerboseFileLogReporter () {
|
|
28
28
|
return _VerboseFileLogReporter.VerboseFileLogReporter;
|
|
29
29
|
}
|
|
30
30
|
});
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AdoReporter } from \"./AdoReporter.js\";\nexport { JsonReporter } 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 { TargetStatusEntry, TargetMessageEntry } from \"./types/TargetLogEntry.js\";\n"],"names":["AdoReporter","ChromeTraceEventsReporter","JsonReporter","LogReporter","ProgressReporter","VerboseFileLogReporter"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AdoReporter } from \"./AdoReporter.js\";\nexport { JsonReporter } 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 { TargetStatusEntry, TargetMessageEntry } from \"./types/TargetLogEntry.js\";\n"],"names":["AdoReporter","ChromeTraceEventsReporter","JsonReporter","LogReporter","ProgressReporter","VerboseFileLogReporter"],"mappings":";;;;;;;;;;;QAASA;eAAAA,wBAAW;;QAGXC;eAAAA,oDAAyB;;QAFzBC;eAAAA,0BAAY;;QACZC;eAAAA,wBAAW;;QAEXC;eAAAA,kCAAgB;;QAChBC;eAAAA,8CAAsB;;;6BALH;8BACC;6BACD;2CACc;kCACT;wCACM"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lage-run/reporters",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Log reporters for Lage",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@lage-run/format-hrtime": "^0.1.6",
|
|
21
21
|
"@lage-run/logger": "^1.3.1",
|
|
22
|
-
"@lage-run/scheduler-types": "^0.3.
|
|
23
|
-
"@lage-run/target-graph": "^0.11.
|
|
22
|
+
"@lage-run/scheduler-types": "^0.3.25",
|
|
23
|
+
"@lage-run/target-graph": "^0.11.3",
|
|
24
24
|
"@ms-cloudpack/task-reporter": "0.5.3",
|
|
25
25
|
"ansi-regex": "5.0.1",
|
|
26
26
|
"chalk": "4.1.2",
|