snapshot-checker 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +103 -343
  2. package/dist/commands/forkall.d.ts +4 -12
  3. package/dist/commands/forkall.d.ts.map +1 -1
  4. package/dist/commands/forkall.js +46 -23
  5. package/dist/commands/forkall.js.map +1 -1
  6. package/dist/commands/report.d.ts +9 -0
  7. package/dist/commands/report.d.ts.map +1 -1
  8. package/dist/commands/report.js +153 -32
  9. package/dist/commands/report.js.map +1 -1
  10. package/dist/demos/context-demo.d.ts +10 -0
  11. package/dist/demos/context-demo.d.ts.map +1 -0
  12. package/dist/{commands/context_demo.js → demos/context-demo.js} +15 -18
  13. package/dist/demos/context-demo.js.map +1 -0
  14. package/dist/{commands → demos}/mac-example.d.ts +1 -3
  15. package/dist/demos/mac-example.d.ts.map +1 -0
  16. package/dist/{commands → demos}/mac-example.js +2 -4
  17. package/dist/demos/mac-example.js.map +1 -0
  18. package/dist/{commands/timeout_demo.d.ts → demos/timeout-demo.d.ts} +2 -2
  19. package/dist/demos/timeout-demo.d.ts.map +1 -0
  20. package/dist/demos/timeout-demo.js +35 -0
  21. package/dist/demos/timeout-demo.js.map +1 -0
  22. package/dist/src/cli.js +209 -169
  23. package/dist/src/cli.js.map +1 -1
  24. package/dist/src/executor.d.ts +1 -3
  25. package/dist/src/executor.d.ts.map +1 -1
  26. package/dist/src/executor.js +1 -3
  27. package/dist/src/executor.js.map +1 -1
  28. package/dist/src/groupSpecs.d.ts +1 -4
  29. package/dist/src/groupSpecs.d.ts.map +1 -1
  30. package/dist/src/groupSpecs.js.map +1 -1
  31. package/dist/src/index.d.ts +1 -1
  32. package/dist/src/index.d.ts.map +1 -1
  33. package/dist/src/index.js +1 -1
  34. package/dist/src/index.js.map +1 -1
  35. package/dist/src/lib/{common_groups.d.ts → presets.d.ts} +24 -2
  36. package/dist/src/lib/presets.d.ts.map +1 -0
  37. package/dist/src/lib/{common_groups.js → presets.js} +73 -24
  38. package/dist/src/lib/presets.js.map +1 -0
  39. package/dist/src/lib/{programmatic.d.ts → scenario.d.ts} +9 -11
  40. package/dist/src/lib/scenario.d.ts.map +1 -0
  41. package/dist/src/lib/{programmatic.js → scenario.js} +6 -10
  42. package/dist/src/lib/scenario.js.map +1 -0
  43. package/dist/src/logger.d.ts +23 -0
  44. package/dist/src/logger.d.ts.map +1 -0
  45. package/dist/src/logger.js +92 -0
  46. package/dist/src/logger.js.map +1 -0
  47. package/dist/src/runCommand.d.ts +27 -35
  48. package/dist/src/runCommand.d.ts.map +1 -1
  49. package/dist/src/runCommand.js +81 -70
  50. package/dist/src/runCommand.js.map +1 -1
  51. package/dist/src/runGroups.d.ts +6 -12
  52. package/dist/src/runGroups.d.ts.map +1 -1
  53. package/dist/src/runGroups.js +14 -19
  54. package/dist/src/runGroups.js.map +1 -1
  55. package/dist/src/runners/builtinFunctionRunner.d.ts +1 -0
  56. package/dist/src/runners/builtinFunctionRunner.d.ts.map +1 -1
  57. package/dist/src/runners/builtinFunctionRunner.js +5 -12
  58. package/dist/src/runners/builtinFunctionRunner.js.map +1 -1
  59. package/dist/src/runners/embedRunner.d.ts +1 -0
  60. package/dist/src/runners/embedRunner.d.ts.map +1 -1
  61. package/dist/src/runners/embedRunner.js +5 -1
  62. package/dist/src/runners/embedRunner.js.map +1 -1
  63. package/dist/src/runners/shellRunner.d.ts +1 -0
  64. package/dist/src/runners/shellRunner.d.ts.map +1 -1
  65. package/dist/src/runners/shellRunner.js +40 -8
  66. package/dist/src/runners/shellRunner.js.map +1 -1
  67. package/dist/src/runners/types.d.ts +9 -0
  68. package/dist/src/runners/types.d.ts.map +1 -1
  69. package/dist/src/types.d.ts +47 -77
  70. package/dist/src/types.d.ts.map +1 -1
  71. package/dist/src/types.js +37 -10
  72. package/dist/src/types.js.map +1 -1
  73. package/package.json +10 -3
  74. package/dist/commands/context_demo.d.ts +0 -18
  75. package/dist/commands/context_demo.d.ts.map +0 -1
  76. package/dist/commands/context_demo.js.map +0 -1
  77. package/dist/commands/mac-example.d.ts.map +0 -1
  78. package/dist/commands/mac-example.js.map +0 -1
  79. package/dist/commands/timeout_demo.d.ts.map +0 -1
  80. package/dist/commands/timeout_demo.js +0 -48
  81. package/dist/commands/timeout_demo.js.map +0 -1
  82. package/dist/src/lib/common_groups.d.ts.map +0 -1
  83. package/dist/src/lib/common_groups.js.map +0 -1
  84. package/dist/src/lib/foo.d.ts +0 -3
  85. package/dist/src/lib/foo.d.ts.map +0 -1
  86. package/dist/src/lib/foo.js +0 -7
  87. package/dist/src/lib/foo.js.map +0 -1
  88. package/dist/src/lib/programmatic.d.ts.map +0 -1
  89. package/dist/src/lib/programmatic.js.map +0 -1
  90. package/dist/src/lib/trace_formatter.d.ts +0 -9
  91. package/dist/src/lib/trace_formatter.d.ts.map +0 -1
  92. package/dist/src/lib/trace_formatter.js +0 -148
  93. package/dist/src/lib/trace_formatter.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  export { executeOne, executeAll, finalizeBackgroundProcesses, getCommandsToRun, getCommandsToRunWithRepeat, getGroupChunks, runGroupChunks, isSupportedOnCurrentPlatform, type GroupSpec, type RunGroupChunksOptions, type ExecuteAllOptions, } from "./executor.js";
2
2
  export { parseGroupSpecs } from "./groupSpecs.js";
3
- export { resolveScenario, runScenarioGroups, normalizeGroupCliArg, type ScenarioModuleLike, type RunScenarioGroupsInput, type RunScenarioGroupsResult, } from "./lib/programmatic.js";
3
+ export { resolveScenario, runScenarioGroups, normalizeGroupCliArg, type ScenarioModuleLike, type RunScenarioGroupsInput, type RunScenarioGroupsResult, } from "./lib/scenario.js";
4
4
  export { CommandKind, createCommandContext, getCurrentPlatformKind, } from "./types.js";
5
5
  export type { CommandContext, CommandDef, CommandResult, RunOptions, Groups, } from "./types.js";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,4BAA4B,EAC5B,KAAK,SAAS,EACd,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,UAAU,EACV,aAAa,EACb,UAAU,EACV,MAAM,GACP,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,4BAA4B,EAC5B,KAAK,SAAS,EACd,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,UAAU,EACV,aAAa,EACb,UAAU,EACV,MAAM,GACP,MAAM,YAAY,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { executeOne, executeAll, finalizeBackgroundProcesses, getCommandsToRun, getCommandsToRunWithRepeat, getGroupChunks, runGroupChunks, isSupportedOnCurrentPlatform, } from "./executor.js";
2
2
  export { parseGroupSpecs } from "./groupSpecs.js";
3
- export { resolveScenario, runScenarioGroups, normalizeGroupCliArg, } from "./lib/programmatic.js";
3
+ export { resolveScenario, runScenarioGroups, normalizeGroupCliArg, } from "./lib/scenario.js";
4
4
  export { CommandKind, createCommandContext, getCurrentPlatformKind, } from "./types.js";
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,4BAA4B,GAI7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GAIrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACd,cAAc,EACd,4BAA4B,GAI7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,oBAAoB,GAIrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -32,9 +32,20 @@ export declare function decodeRawPerfDataAndWriteOutputs(input: {
32
32
  inputFilePath: string;
33
33
  dumpStackTxt: string;
34
34
  dumpStackJson: string;
35
+ dumpStackXlsx: string;
35
36
  traceFormatProfile: string;
36
37
  stageName: string;
37
- }): boolean;
38
+ skipDedupePerfData?: boolean;
39
+ /** 解码 trace 后是否调用 {@link backtrackFS}(在 dedupe 之前) */
40
+ runBacktrackFS?: boolean;
41
+ /**
42
+ * 为 `true` 时向 {@link backtrackFS} 传入 `keepNonFsRevoked: false`(过滤非 FS revoked);
43
+ * 默认 `false` 即保留(与 hmtrace-parser 默认一致)。
44
+ */
45
+ skipNonBacktrack?: boolean;
46
+ /** 传入 {@link decodePerfRawData}:丢弃有 raw 但无对应 trace 解析器的样本 */
47
+ dropFailedSamples?: boolean;
48
+ }): Promise<boolean>;
38
49
  type DecodeInputConfig = {
39
50
  inputFilePath: string;
40
51
  inputContextKey?: never;
@@ -50,9 +61,20 @@ export declare function buildCommonAnalysisGroup(input: {
50
61
  decodeInput: DecodeInputConfig;
51
62
  dumpStackTxt: string;
52
63
  dumpStackJson: string;
64
+ dumpStackXlsx: string;
53
65
  traceFormatProfile: string;
54
66
  decodeStageName: string;
55
67
  missingInputMessage: string;
68
+ skipDedupePerfData?: boolean;
69
+ /** 解码 trace 后是否调用 {@link backtrackFS}(在 dedupe 之前) */
70
+ runBacktrackFS?: boolean;
71
+ /**
72
+ * 为 `true` 时向 {@link backtrackFS} 传入 `keepNonFsRevoked: false`;
73
+ * 仅在开启回溯关联(`runBacktrackFS`)时生效。
74
+ */
75
+ skipNonBacktrack?: boolean;
76
+ /** 传入 {@link decodePerfRawData}:丢弃有 raw 但无对应 trace 解析器的样本 */
77
+ dropFailedSamples?: boolean;
56
78
  }): CommandDef[];
57
79
  export {};
58
- //# sourceMappingURL=common_groups.d.ts.map
80
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/lib/presets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,aAAa,CAAC;AAa9D,OAAO,KAAK,EAAe,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAc/D,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,UAAU,EAAE,CAkDf;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6BAA6B,EAAE,MAAM,CAAC;IACtC,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GAAG,UAAU,EAAE,CAmBf;AAED,wBAAgB,oCAAoC,CAAC,KAAK,EAAE;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;CAC/B,GAAG,UAAU,EAAE,CA0Df;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,QAAQ,GAAG,SAAS,CAavB;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACvD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAYA;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CASA;AAED,wBAAsB,gCAAgC,CAAC,KAAK,EAAE;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAAC,OAAO,CAAC,CA+FnB;AAED,KAAK,iBAAiB,GAClB;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,KAAK,CAAA;CAAE,GAClD;IAAE,aAAa,CAAC,EAAE,KAAK,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC;IACjC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,UAAU,EAAE,CAqDf"}
@@ -1,7 +1,14 @@
1
+ /** forkall / report 等场景复用的命令组拼装与 perf 解码辅助 */
2
+ import { logger } from "../logger.js";
1
3
  import { CommandKind } from "../types.js";
2
4
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
- import { buildTraceParserRegistry, decodePerfRawData, filterByTgid, formatPerfDataToJson, formatPerfDataToText, parsePerfData, toBackTraceStacks, } from "hiperf_txt_parser";
4
- import { getTraceEventFormatProfiles, getTraceEventFormats, } from "./trace_formatter.js";
5
+ import { buildTraceParserRegistry, decodePerfRawData, dedupePerfData, filterByTgid, formatPerfDataToExcel, formatPerfDataToJson, formatPerfDataToText, parsePerfData, toBackTraceStacks, } from "hiperf_txt_parser";
6
+ import { backtrackFS, getTraceEventFormatProfiles, getTraceEventFormats, setHmtraceLogger, } from "hmtrace-parser";
7
+ setHmtraceLogger({
8
+ trace: (msg) => logger.trace(msg),
9
+ debug: (msg) => logger.debug(msg),
10
+ info: (msg) => logger.info(msg),
11
+ });
5
12
  export function buildCommonInitEnvGroup(input) {
6
13
  const { app, snapshotLogFile, checkStateCommand, permissionCommands } = input;
7
14
  const permissionDefs = permissionCommands.map((run) => ({
@@ -37,7 +44,7 @@ export function buildCommonInitEnvGroup(input) {
37
44
  {
38
45
  kind: CommandKind.Windows,
39
46
  description: "删除应用镜像",
40
- run: `hdc shell hidumper -s 1901 -a '-p libforkall_plugin.z.so --delete ${app}'`,
47
+ run: `hdc shell "hidumper -s 1901 -a '-p libforkall_plugin.z.so --destroy 100 ${app}'"`,
41
48
  },
42
49
  {
43
50
  kind: CommandKind.Windows,
@@ -47,7 +54,7 @@ export function buildCommonInitEnvGroup(input) {
47
54
  {
48
55
  kind: CommandKind.Windows,
49
56
  description: "配置模式开关",
50
- run: 'hdc shell "echo 1:0000 > /proc/checkpoint/revoke_switch && echo checkout_witch "',
57
+ run: 'hdc shell "echo 0:0000 > /proc/checkpoint/revoke_switch && echo 1:0000 > /proc/checkpoint/revoke_switch && echo 2:0000 > /proc/checkpoint/revoke_switch && cat /proc/checkpoint/revoke_switch"',
51
58
  },
52
59
  ...permissionDefs,
53
60
  ];
@@ -88,24 +95,24 @@ export function buildCommonAnalysisTargetFilterGroup(input) {
88
95
  func: (ctx) => {
89
96
  const targetTgidRaw = ctx.get("target_tgid");
90
97
  if (!targetTgidRaw) {
91
- console.warn("[过滤目标数据] 未获取到 target_tgid,跳过数据过滤");
98
+ logger.warn("[过滤目标数据] 未获取到 target_tgid,跳过数据过滤");
92
99
  return false;
93
100
  }
94
101
  const targetTgid = parseInt(targetTgidRaw, 10);
95
102
  if (Number.isNaN(targetTgid)) {
96
- console.error(`[过滤目标数据] target_tgid 非法: ${targetTgidRaw}`);
103
+ logger.error(`[过滤目标数据] target_tgid 非法: ${targetTgidRaw}`);
97
104
  return false;
98
105
  }
99
106
  try {
100
107
  if (!existsSync(snapshotPerfFile)) {
101
- console.warn(`[过滤目标数据] 输入文件不存在,跳过处理: ${snapshotPerfFile}`);
108
+ logger.warn(`[过滤目标数据] 输入文件不存在,跳过处理: ${snapshotPerfFile}`);
102
109
  return false;
103
110
  }
104
111
  const inputText = readFileSync(snapshotPerfFile, "utf-8");
105
112
  const recordSamples = parsePerfData(inputText);
106
113
  const filteredRecordSamples = filterByTgid(recordSamples, targetTgid);
107
114
  if (filteredRecordSamples.recordSamples.length === 0) {
108
- console.error(`[过滤目标数据] filterByTgid 后无样本数据(tgid=${targetTgid}),终止流程`);
115
+ logger.error(`[过滤目标数据] filterByTgid 后无样本数据(tgid=${targetTgid}),终止流程`);
109
116
  return false;
110
117
  }
111
118
  const samplesToWrite = writeBacktraceStacks
@@ -113,10 +120,10 @@ export function buildCommonAnalysisTargetFilterGroup(input) {
113
120
  : filteredRecordSamples;
114
121
  const filteredRecordSamplesTxt = formatPerfDataToText(samplesToWrite);
115
122
  writeFileSync(snapshotPerfFile, filteredRecordSamplesTxt, "utf-8");
116
- console.info(`[过滤目标数据] 处理完成并写回文件: ${snapshotPerfFile}`);
123
+ logger.info(`[过滤目标数据] 处理完成并写回文件: ${snapshotPerfFile}`);
117
124
  }
118
125
  catch (error) {
119
- console.error(`[过滤目标数据] 处理失败: ${snapshotPerfFile}`, error);
126
+ logger.error(`[过滤目标数据] 处理失败: ${snapshotPerfFile}`, error);
120
127
  return false;
121
128
  }
122
129
  },
@@ -126,7 +133,7 @@ export function buildCommonAnalysisTargetFilterGroup(input) {
126
133
  export function readPerfDataOrWarn(input) {
127
134
  const { filePath, stageName } = input;
128
135
  if (!existsSync(filePath)) {
129
- console.warn(`[${stageName}] 输入文件不存在,跳过处理: ${filePath}`);
136
+ logger.warn(`[${stageName}] 输入文件不存在,跳过处理: ${filePath}`);
130
137
  return undefined;
131
138
  }
132
139
  try {
@@ -134,7 +141,7 @@ export function readPerfDataOrWarn(input) {
134
141
  return parsePerfData(inputText);
135
142
  }
136
143
  catch (error) {
137
- console.error(`[${stageName}] 读取或解析失败: ${filePath}`, error);
144
+ logger.error(`[${stageName}] 读取或解析失败: ${filePath}`, error);
138
145
  return undefined;
139
146
  }
140
147
  }
@@ -158,19 +165,19 @@ export function selectFirstValidPerfInput(candidates) {
158
165
  if (valid) {
159
166
  return { filePath };
160
167
  }
161
- console.warn(`[选择 perf 输入] 跳过文件: ${filePath},原因: ${reason}`);
168
+ logger.warn(`[选择 perf 输入] 跳过文件: ${filePath},原因: ${reason}`);
162
169
  }
163
170
  return { reason: "未找到可用 perf 输入文件" };
164
171
  }
165
- export function decodeRawPerfDataAndWriteOutputs(input) {
166
- const { inputFilePath, dumpStackTxt, dumpStackJson, traceFormatProfile, stageName, } = input;
172
+ export async function decodeRawPerfDataAndWriteOutputs(input) {
173
+ const { inputFilePath, dumpStackTxt, dumpStackJson, dumpStackXlsx, traceFormatProfile, stageName, skipDedupePerfData = false, runBacktrackFS = false, skipNonBacktrack = false, dropFailedSamples = false, } = input;
167
174
  try {
168
175
  const availableProfiles = getTraceEventFormatProfiles();
169
176
  const selectedProfile = availableProfiles.includes(traceFormatProfile)
170
177
  ? traceFormatProfile
171
178
  : "default";
172
179
  if (selectedProfile !== traceFormatProfile) {
173
- console.warn(`[${stageName}] 未识别 trace-format-profile="${traceFormatProfile}",已回退到 default`);
180
+ logger.warn(`[${stageName}] 未识别 trace-format-profile="${traceFormatProfile}",已回退到 default`);
174
181
  }
175
182
  const traceParser = buildTraceParserRegistry(getTraceEventFormats(selectedProfile));
176
183
  const recordSamples = readPerfDataOrWarn({
@@ -182,21 +189,58 @@ export function decodeRawPerfDataAndWriteOutputs(input) {
182
189
  }
183
190
  const parsedRecordSamples = decodePerfRawData(recordSamples, traceParser, {
184
191
  tracePrintMode: "fieldDict",
192
+ dropFailedSamples,
185
193
  });
186
- const recordSamplesJson = formatPerfDataToJson(parsedRecordSamples);
187
- const recordSamplesTxt = formatPerfDataToText(parsedRecordSamples);
194
+ let dataForDedupe = parsedRecordSamples;
195
+ if (runBacktrackFS) {
196
+ const [backtrackSamples] = backtrackFS(parsedRecordSamples, {
197
+ keepNonFsRevoked: !skipNonBacktrack,
198
+ });
199
+ if (backtrackSamples.length === 0) {
200
+ logger.error(`[${stageName}] 已启用回溯关联(backtrackFS),但输出样本数为 0,中止处理`);
201
+ return false;
202
+ }
203
+ dataForDedupe = {
204
+ ...parsedRecordSamples,
205
+ recordSamples: [...backtrackSamples],
206
+ };
207
+ }
208
+ const dedupedPerfData = skipDedupePerfData
209
+ ? dataForDedupe
210
+ : dedupePerfData(dataForDedupe, {
211
+ onEnd: (s) => {
212
+ logger.info(`[${stageName}] perf 去重: input=${s.input}, removed=${s.removed}, remaining=${s.remaining}`);
213
+ },
214
+ });
215
+ const recordSamplesJson = formatPerfDataToJson(dedupedPerfData);
216
+ const recordSamplesTxt = formatPerfDataToText(dedupedPerfData);
188
217
  writeFileSync(dumpStackJson, JSON.stringify(recordSamplesJson, null, 2), "utf-8");
189
218
  writeFileSync(dumpStackTxt, recordSamplesTxt, "utf-8");
190
- console.info(`[${stageName}] 分析完成,格式版本: ${selectedProfile},输出文件: ${dumpStackJson}, ${dumpStackTxt}`);
219
+ const outputPaths = [dumpStackJson, dumpStackTxt];
220
+ if (dedupedPerfData.recordSamples.length === 0) {
221
+ logger.info(`[${stageName}] 无样本数据,跳过 Excel 导出`);
222
+ }
223
+ else {
224
+ try {
225
+ const xlsxBuffer = await formatPerfDataToExcel(dedupedPerfData);
226
+ writeFileSync(dumpStackXlsx, xlsxBuffer);
227
+ outputPaths.push(dumpStackXlsx);
228
+ }
229
+ catch (error) {
230
+ const message = error instanceof Error ? error.message : String(error);
231
+ logger.warn(`[${stageName}] Excel 导出未写入(${message})`, error);
232
+ }
233
+ }
234
+ logger.info(`[${stageName}] 分析完成,格式版本: ${selectedProfile},输出文件: ${outputPaths.join(", ")}`);
191
235
  return true;
192
236
  }
193
237
  catch (error) {
194
- console.error(`[${stageName}] 处理失败`, error);
238
+ logger.error(`[${stageName}] 处理失败`, error);
195
239
  return false;
196
240
  }
197
241
  }
198
242
  export function buildCommonAnalysisGroup(input) {
199
- const { app, snapshotPerfFile, writeBacktraceStacks, preDecodeCommands = [], decodeInput, dumpStackTxt, dumpStackJson, traceFormatProfile, decodeStageName, missingInputMessage, } = input;
243
+ const { app, snapshotPerfFile, writeBacktraceStacks, preDecodeCommands = [], decodeInput, dumpStackTxt, dumpStackJson, dumpStackXlsx, traceFormatProfile, decodeStageName, missingInputMessage, skipDedupePerfData = false, runBacktrackFS = false, skipNonBacktrack = false, dropFailedSamples = false, } = input;
200
244
  const targetFilterGroup = buildCommonAnalysisTargetFilterGroup({
201
245
  app,
202
246
  snapshotPerfFile,
@@ -205,23 +249,28 @@ export function buildCommonAnalysisGroup(input) {
205
249
  const decodeCommand = {
206
250
  kind: CommandKind.BuiltinFunction,
207
251
  description: decodeStageName,
208
- func: (ctx) => {
252
+ func: async (ctx) => {
209
253
  const inputFilePath = decodeInput.inputContextKey != null
210
254
  ? ctx.get(decodeInput.inputContextKey)
211
255
  : decodeInput.inputFilePath;
212
256
  if (!inputFilePath) {
213
- console.warn(missingInputMessage);
257
+ logger.warn(missingInputMessage);
214
258
  return false;
215
259
  }
216
260
  return decodeRawPerfDataAndWriteOutputs({
217
261
  inputFilePath,
218
262
  dumpStackTxt,
219
263
  dumpStackJson,
264
+ dumpStackXlsx,
220
265
  traceFormatProfile,
221
266
  stageName: decodeStageName,
267
+ skipDedupePerfData,
268
+ runBacktrackFS,
269
+ skipNonBacktrack,
270
+ dropFailedSamples,
222
271
  });
223
272
  },
224
273
  };
225
274
  return [...targetFilterGroup, ...preDecodeCommands, decodeCommand];
226
275
  }
227
- //# sourceMappingURL=common_groups.js.map
276
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/lib/presets.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { GroupSpec } from "../runGroups.js";
2
2
  import type { CommandResult, Groups } from "../types.js";
3
- /** 与 commands/*.ts 场景模块兼容的最小形状 */
3
+ /** 与 `commands/*.ts` 场景模块导出面兼容的最小接口 */
4
4
  export interface ScenarioModuleLike {
5
5
  groups: Groups;
6
6
  defaultGroupOrder: string[];
@@ -13,13 +13,9 @@ export interface ScenarioModuleLike {
13
13
  defaultGroupOrder?: string[];
14
14
  } | void;
15
15
  }
16
- /**
17
- * 将 Commander 的 variadic --group 规范为 string[](单参时可能是单个字符串)。
18
- */
16
+ /** 将 Commander 的 variadic `--group` 归一化为 `string[]`(单参数时可能为单个字符串) */
19
17
  export declare function normalizeGroupCliArg(groupRaw: string[] | string | undefined): string[] | undefined;
20
- /**
21
- * 若场景导出 applyOptions,则根据 scenarioOptions 得到最终 groups / defaultGroupOrder。
22
- */
18
+ /** 若模块导出 `applyOptions`,则按 `scenarioOptions` 生成最终的 `groups` 与 `defaultGroupOrder` */
23
19
  export declare function resolveScenario(mod: ScenarioModuleLike, scenarioOptions?: Record<string, unknown>): {
24
20
  groups: Groups;
25
21
  defaultGroupOrder: string[];
@@ -27,14 +23,16 @@ export declare function resolveScenario(mod: ScenarioModuleLike, scenarioOptions
27
23
  export interface RunScenarioGroupsInput {
28
24
  groups: Groups;
29
25
  defaultGroupOrder: string[];
30
- /** 等价 CLI -g/--group,不传则按 defaultGroupOrder 顺序各执行 1 次 */
26
+ /** CLI `-g` / `--group` 相同;缺省时按 `defaultGroupOrder` 各执行一次 */
31
27
  group?: string[] | string;
32
- /** 直接指定组规格时优先于 group / defaultGroupOrder 的默认展开 */
28
+ /** 显式组规格时覆盖由 `group` `defaultGroupOrder` 推导的结果 */
33
29
  groupSpecs?: GroupSpec[];
34
30
  ignorePlatform?: boolean;
35
31
  stopOnError?: boolean;
32
+ /** 见 `RunOptions.silent` */
36
33
  silent?: boolean;
37
34
  waitForBackground?: boolean;
35
+ /** 见 `RunOptions.intervalMs` */
38
36
  intervalMs?: number;
39
37
  }
40
38
  export interface RunScenarioGroupsResult {
@@ -42,7 +40,7 @@ export interface RunScenarioGroupsResult {
42
40
  failed: boolean;
43
41
  }
44
42
  /**
45
- * 按组规格执行命令(与 CLI list/dry-run 路径一致)。
43
+ * 按组规格执行命令;语义与 CLI 在排除 `--list`、`--dry-run` 时的执行路径一致。
46
44
  */
47
45
  export declare function runScenarioGroups(input: RunScenarioGroupsInput): Promise<RunScenarioGroupsResult>;
48
- //# sourceMappingURL=programmatic.d.ts.map
46
+ //# sourceMappingURL=scenario.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario.d.ts","sourceRoot":"","sources":["../../../src/lib/scenario.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEzD,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,KAAK;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9B,GAAG,IAAI,CAAC;CACV;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAGtB;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAC7B,GAAG,EAAE,kBAAkB,EACvB,eAAe,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAC5C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAcjD;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,oDAAoD;IACpD,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CA2BlC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * 程序化 API:在代码中复用与 CLI 相同的场景解析与组执行能力。
2
+ * 编程方式复用 CLI 的场景解析与按组执行逻辑。
3
3
  *
4
- * 典型用法:
4
+ * 示例:
5
5
  * ```ts
6
6
  * import { resolveScenario, runScenarioGroups } from 'snapshot-checker';
7
7
  * import * as report from './commands/report.js';
@@ -16,17 +16,13 @@
16
16
  */
17
17
  import { getGroupChunks, runGroupChunks, } from "../runGroups.js";
18
18
  import { parseGroupSpecs } from "../groupSpecs.js";
19
- /**
20
- * 将 Commander 的 variadic --group 规范为 string[](单参时可能是单个字符串)。
21
- */
19
+ /** 将 Commander 的 variadic `--group` 归一化为 `string[]`(单参数时可能为单个字符串) */
22
20
  export function normalizeGroupCliArg(groupRaw) {
23
21
  if (groupRaw === undefined || groupRaw === null)
24
22
  return undefined;
25
23
  return Array.isArray(groupRaw) ? groupRaw : [String(groupRaw)];
26
24
  }
27
- /**
28
- * 若场景导出 applyOptions,则根据 scenarioOptions 得到最终 groups / defaultGroupOrder。
29
- */
25
+ /** 若模块导出 `applyOptions`,则按 `scenarioOptions` 生成最终的 `groups` 与 `defaultGroupOrder` */
30
26
  export function resolveScenario(mod, scenarioOptions = {}) {
31
27
  let groups = mod.groups;
32
28
  let defaultGroupOrder = mod.defaultGroupOrder;
@@ -44,7 +40,7 @@ export function resolveScenario(mod, scenarioOptions = {}) {
44
40
  return { groups, defaultGroupOrder };
45
41
  }
46
42
  /**
47
- * 按组规格执行命令(与 CLI list/dry-run 路径一致)。
43
+ * 按组规格执行命令;语义与 CLI 在排除 `--list`、`--dry-run` 时的执行路径一致。
48
44
  */
49
45
  export async function runScenarioGroups(input) {
50
46
  const { groups, defaultGroupOrder, group, groupSpecs: explicitSpecs, ignorePlatform = false, stopOnError = false, silent = false, waitForBackground = false, intervalMs, } = input;
@@ -60,4 +56,4 @@ export async function runScenarioGroups(input) {
60
56
  };
61
57
  return runGroupChunks(chunks, options);
62
58
  }
63
- //# sourceMappingURL=programmatic.js.map
59
+ //# sourceMappingURL=scenario.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario.js","sourceRoot":"","sources":["../../../src/lib/scenario.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,cAAc,EACd,cAAc,GAEf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAiBnD,qEAAqE;AACrE,MAAM,UAAU,oBAAoB,CAClC,QAAuC;IAEvC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAC7B,GAAuB,EACvB,kBAA2C,EAAE;IAE7C,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACxB,IAAI,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAC9C,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC;YACnC,MAAM;YACN,iBAAiB;YACjB,OAAO,EAAE,eAAe;SACzB,CAAC,CAAC;QACH,IAAI,WAAW,EAAE,MAAM;YAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QACrD,IAAI,WAAW,EAAE,iBAAiB;YAChC,iBAAiB,GAAG,WAAW,CAAC,iBAAiB,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACvC,CAAC;AAuBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA6B;IAE7B,MAAM,EACJ,MAAM,EACN,iBAAiB,EACjB,KAAK,EACL,UAAU,EAAE,aAAa,EACzB,cAAc,GAAG,KAAK,EACtB,WAAW,GAAG,KAAK,EACnB,MAAM,GAAG,KAAK,EACd,iBAAiB,GAAG,KAAK,EACzB,UAAU,GACX,GAAG,KAAK,CAAC;IAEV,MAAM,KAAK,GACT,aAAa;QACb,eAAe,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IACjE,MAAM,OAAO,GAA0B;QACrC,WAAW;QACX,MAAM;QACN,iBAAiB;QACjB,cAAc;QACd,UAAU,EACR,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACtE,CAAC;IACF,OAAO,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 工具侧结构化日志;子进程标准流由 Shell 等 Runner 与 `streamOutput` 控制。
3
+ *
4
+ * 默认级别由 `SNAPSHOT_CHECKER_LOG_LEVEL` 或 `LOG_LEVEL` 给出(与 `hiperf_txt_parser` 同名枚举;未识别时回退为 `info`),并与 {@link setHiperfLogLevel} 对齐。
5
+ * CLI 全局 `--log-level` 通过 {@link setGlobalLogLevelFromCli} 覆盖该基准(直至进程退出)。
6
+ */
7
+ import { type ConsolaInstance } from "consola";
8
+ import { type HiperfLogLevelName } from "hiperf_txt_parser";
9
+ /** 与 `hiperf_txt_parser` 一致的合法级别(供 CLI choices 与环境解析共用) */
10
+ export declare const SNAPSHOT_CHECKER_LOG_LEVEL_CHOICES: readonly HiperfLogLevelName[];
11
+ /**
12
+ * 由 CLI 全局 `--log-level` 在子命令 `preAction` 中调用,覆盖环境变量给出的基准。
13
+ */
14
+ export declare function setGlobalLogLevelFromCli(level: string | undefined): void;
15
+ /**
16
+ * 按 `silent` 进入嵌套静默:将日志与 `hiperf_txt_parser` 限制为 `error`,可多次嵌套计数。
17
+ *
18
+ * @returns 结束当前作用域时须调用的恢复函数。
19
+ */
20
+ export declare function attachQuietSilent(silent: boolean): () => void;
21
+ /** 全局共享的 Consola 实例;未处于 {@link attachQuietSilent} 时与 {@link baselineLevelName} 一致 */
22
+ export declare const logger: ConsolaInstance;
23
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,2DAA2D;AAC3D,eAAO,MAAM,kCAAkC,EAAE,SAAS,kBAAkB,EAOlE,CAAC;AAsCX;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUxE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAmB7D;AAED,qFAAqF;AACrF,eAAO,MAAM,MAAM,EAAE,eAEnB,CAAC"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * 工具侧结构化日志;子进程标准流由 Shell 等 Runner 与 `streamOutput` 控制。
3
+ *
4
+ * 默认级别由 `SNAPSHOT_CHECKER_LOG_LEVEL` 或 `LOG_LEVEL` 给出(与 `hiperf_txt_parser` 同名枚举;未识别时回退为 `info`),并与 {@link setHiperfLogLevel} 对齐。
5
+ * CLI 全局 `--log-level` 通过 {@link setGlobalLogLevelFromCli} 覆盖该基准(直至进程退出)。
6
+ */
7
+ import { createConsola, LogLevels } from "consola";
8
+ import { setHiperfLogLevel, } from "hiperf_txt_parser";
9
+ /** 与 `hiperf_txt_parser` 一致的合法级别(供 CLI choices 与环境解析共用) */
10
+ export const SNAPSHOT_CHECKER_LOG_LEVEL_CHOICES = [
11
+ "silent",
12
+ "error",
13
+ "warn",
14
+ "info",
15
+ "debug",
16
+ "trace",
17
+ ];
18
+ function resolveHiperfLevelNameFromEnv() {
19
+ const raw = (process.env.SNAPSHOT_CHECKER_LOG_LEVEL ??
20
+ process.env.LOG_LEVEL ??
21
+ "info")
22
+ .trim()
23
+ .toLowerCase();
24
+ return SNAPSHOT_CHECKER_LOG_LEVEL_CHOICES.includes(raw)
25
+ ? raw
26
+ : "info";
27
+ }
28
+ /** 基准级别:初始为环境变量;可被 {@link setGlobalLogLevelFromCli} 覆盖(不含 {@link attachQuietSilent} 嵌套降噪) */
29
+ let baselineLevelName = resolveHiperfLevelNameFromEnv();
30
+ setHiperfLogLevel(baselineLevelName);
31
+ const LEVEL_TO_CONSOLA = {
32
+ silent: LogLevels.silent,
33
+ error: LogLevels.error,
34
+ warn: LogLevels.warn,
35
+ info: LogLevels.info,
36
+ debug: LogLevels.debug,
37
+ trace: LogLevels.trace,
38
+ };
39
+ /** `RunOptions.silent` / CLI `-s` 时与 consola、`hiperf_txt_parser` 对齐的静默级别标识 */
40
+ const QUIET_HIPEXF_NAME = "error";
41
+ let quietSilentDepth = 0;
42
+ /** 恢复 {@link baselineLevelName},并同步 `hiperf_txt_parser`。 */
43
+ function applySyncedLevels() {
44
+ logger.level = LEVEL_TO_CONSOLA[baselineLevelName];
45
+ setHiperfLogLevel(baselineLevelName);
46
+ }
47
+ /**
48
+ * 由 CLI 全局 `--log-level` 在子命令 `preAction` 中调用,覆盖环境变量给出的基准。
49
+ */
50
+ export function setGlobalLogLevelFromCli(level) {
51
+ if (level === undefined || level === "")
52
+ return;
53
+ const raw = level.trim().toLowerCase();
54
+ if (!SNAPSHOT_CHECKER_LOG_LEVEL_CHOICES.includes(raw)) {
55
+ return;
56
+ }
57
+ baselineLevelName = raw;
58
+ if (quietSilentDepth === 0) {
59
+ applySyncedLevels();
60
+ }
61
+ }
62
+ /**
63
+ * 按 `silent` 进入嵌套静默:将日志与 `hiperf_txt_parser` 限制为 `error`,可多次嵌套计数。
64
+ *
65
+ * @returns 结束当前作用域时须调用的恢复函数。
66
+ */
67
+ export function attachQuietSilent(silent) {
68
+ if (!silent) {
69
+ return () => { };
70
+ }
71
+ quietSilentDepth += 1;
72
+ if (quietSilentDepth === 1) {
73
+ logger.level = LogLevels.error;
74
+ setHiperfLogLevel(QUIET_HIPEXF_NAME);
75
+ }
76
+ let done = false;
77
+ return () => {
78
+ if (done)
79
+ return;
80
+ done = true;
81
+ quietSilentDepth -= 1;
82
+ if (quietSilentDepth <= 0) {
83
+ quietSilentDepth = 0;
84
+ applySyncedLevels();
85
+ }
86
+ };
87
+ }
88
+ /** 全局共享的 Consola 实例;未处于 {@link attachQuietSilent} 时与 {@link baselineLevelName} 一致 */
89
+ export const logger = createConsola({
90
+ level: LEVEL_TO_CONSOLA[baselineLevelName],
91
+ });
92
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAwB,MAAM,SAAS,CAAC;AACzE,OAAO,EACL,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,2DAA2D;AAC3D,MAAM,CAAC,MAAM,kCAAkC,GAAkC;IAC/E,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;CACC,CAAC;AAEX,SAAS,6BAA6B;IACpC,MAAM,GAAG,GAAG,CACV,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,MAAM,CACP;SACE,IAAI,EAAE;SACN,WAAW,EAAE,CAAC;IACjB,OAAQ,kCAAwD,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC5E,CAAC,CAAE,GAA0B;QAC7B,CAAC,CAAC,MAAM,CAAC;AACb,CAAC;AAED,6FAA6F;AAC7F,IAAI,iBAAiB,GAAuB,6BAA6B,EAAE,CAAC;AAC5E,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;AAErC,MAAM,gBAAgB,GAAuC;IAC3D,MAAM,EAAE,SAAS,CAAC,MAAM;IACxB,KAAK,EAAE,SAAS,CAAC,KAAK;IACtB,IAAI,EAAE,SAAS,CAAC,IAAI;IACpB,IAAI,EAAE,SAAS,CAAC,IAAI;IACpB,KAAK,EAAE,SAAS,CAAC,KAAK;IACtB,KAAK,EAAE,SAAS,CAAC,KAAK;CACvB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,iBAAiB,GAAG,OAAoC,CAAC;AAC/D,IAAI,gBAAgB,GAAG,CAAC,CAAC;AAEzB,4DAA4D;AAC5D,SAAS,iBAAiB;IACxB,MAAM,CAAC,KAAK,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACnD,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAE,kCAAwD,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7E,OAAO;IACT,CAAC;IACD,iBAAiB,GAAG,GAAyB,CAAC;IAC9C,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAC3B,iBAAiB,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IACD,gBAAgB,IAAI,CAAC,CAAC;IACtB,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QAC/B,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,OAAO,GAAS,EAAE;QAChB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,gBAAgB,IAAI,CAAC,CAAC;QACtB,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;YAC1B,gBAAgB,GAAG,CAAC,CAAC;YACrB,iBAAiB,EAAE,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,MAAM,GAAoB,aAAa,CAAC;IACnD,KAAK,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;CAC3C,CAAC,CAAC"}