@sfmc-bds/cli 0.2.0-beta.0 → 0.2.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/i18n/locales/en.d.ts +10 -10
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +10 -10
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +10 -10
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/log-filter.d.ts +69 -0
- package/dist/log-filter.d.ts.map +1 -0
- package/dist/log-filter.js +150 -0
- package/dist/log-filter.js.map +7 -0
- package/dist/logs.d.ts +13 -6
- package/dist/logs.d.ts.map +1 -1
- package/dist/logs.js +87 -64
- package/dist/logs.js.map +3 -3
- package/dist/pack-update/providers/curseforge.d.ts.map +1 -1
- package/dist/pack-update/providers/curseforge.js +25 -5
- package/dist/pack-update/providers/curseforge.js.map +2 -2
- package/dist/pack-update/service.d.ts.map +1 -1
- package/dist/pack-update/service.js +12 -7
- package/dist/pack-update/service.js.map +2 -2
- package/dist/pack-update/version-policy.d.ts +3 -2
- package/dist/pack-update/version-policy.d.ts.map +1 -1
- package/dist/pack-update/version-policy.js +11 -17
- package/dist/pack-update/version-policy.js.map +2 -2
- package/dist/world-packs.d.ts +15 -0
- package/dist/world-packs.d.ts.map +1 -1
- package/dist/world-packs.js +86 -86
- package/dist/world-packs.js.map +2 -2
- package/package.json +15 -15
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { LogLevel } from "@sfmc-bds/sdk/logs";
|
|
2
|
+
export type LogFilterMode = "drop" | "keep";
|
|
3
|
+
export type LogFilterApplyTo = "display" | "all";
|
|
4
|
+
export interface LogFilterRule {
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
sources?: string[];
|
|
7
|
+
levels?: LogLevel[];
|
|
8
|
+
contains?: string;
|
|
9
|
+
/** JS RegExp 源;支持前缀 (?i) 表示忽略大小写 */
|
|
10
|
+
regex?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LogFilterConfig {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
mode: LogFilterMode;
|
|
15
|
+
applyTo: LogFilterApplyTo;
|
|
16
|
+
rules: LogFilterRule[];
|
|
17
|
+
}
|
|
18
|
+
export type LogFilterEntry = {
|
|
19
|
+
text: string;
|
|
20
|
+
source: string;
|
|
21
|
+
level: LogLevel;
|
|
22
|
+
};
|
|
23
|
+
export declare function logFilterConfigPath(): string;
|
|
24
|
+
/** 确保 configs/log-filter.json 存在(委托 SDK ensureSchemaConfig,禁止手写 withConfigSchema) */
|
|
25
|
+
export declare function ensureLogFilterConfigFile(): string;
|
|
26
|
+
type CompiledRule = {
|
|
27
|
+
sources?: Set<string>;
|
|
28
|
+
levels?: Set<string>;
|
|
29
|
+
contains?: string;
|
|
30
|
+
regex?: RegExp;
|
|
31
|
+
};
|
|
32
|
+
type CompiledFilter = {
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
mode: LogFilterMode;
|
|
35
|
+
applyTo: LogFilterApplyTo;
|
|
36
|
+
rules: CompiledRule[];
|
|
37
|
+
mtimeMs: number;
|
|
38
|
+
};
|
|
39
|
+
/** 将 (?i) 前缀转为 RegExp i 旗标(JS 无内联 (?i)) */
|
|
40
|
+
export declare function compileLogFilterRegex(src: string): RegExp | null;
|
|
41
|
+
/**
|
|
42
|
+
* 加载并编译过滤配置(按文件 mtime 热读)。
|
|
43
|
+
* onBadRegex:正则非法时回调(由 logs 层打 warn,避免循环依赖)。
|
|
44
|
+
*/
|
|
45
|
+
export declare function getCompiledLogFilter(onBadRegex?: (src: string) => void): CompiledFilter;
|
|
46
|
+
/** 单条规则是否命中(同条 AND) */
|
|
47
|
+
export declare function ruleMatchesEntry(rule: CompiledRule, entry: LogFilterEntry): boolean;
|
|
48
|
+
/** 任一规则命中即为 matched */
|
|
49
|
+
export declare function entryMatchesAnyRule(entry: LogFilterEntry, rules: CompiledRule[]): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* 是否应丢弃该条(对展示/内存而言)。
|
|
52
|
+
* enabled=false → 不丢;keep 模式未匹配 → 丢;drop 模式匹配 → 丢。
|
|
53
|
+
*/
|
|
54
|
+
export declare function shouldDropForDisplay(entry: LogFilterEntry, filter: CompiledFilter): boolean;
|
|
55
|
+
/** 是否应跳过落盘(仅 applyTo=all 时与 display 一致) */
|
|
56
|
+
export declare function shouldDropForDisk(entry: LogFilterEntry, filter: CompiledFilter): boolean;
|
|
57
|
+
/** 测试用:清空缓存 */
|
|
58
|
+
export declare function resetLogFilterCacheForTests(): void;
|
|
59
|
+
/**
|
|
60
|
+
* 纯函数判定(不读盘):供单测与调用方表驱动。
|
|
61
|
+
* dropDisplay / dropDisk 语义与 pushLog 一致。
|
|
62
|
+
*/
|
|
63
|
+
export declare function evaluateLogFilter(entry: LogFilterEntry, cfg: LogFilterConfig): {
|
|
64
|
+
dropDisplay: boolean;
|
|
65
|
+
dropDisk: boolean;
|
|
66
|
+
matched: boolean;
|
|
67
|
+
};
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=log-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-filter.d.ts","sourceRoot":"","sources":["../src/log-filter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAC5C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,KAAK,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,CAAC;CACjB,CAAC;AASF,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,IAAI,MAAM,CAGlD;AAED,KAAK,YAAY,GAAG;IAClB,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,2CAA2C;AAC3C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYhE;AAiDD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,cAAc,CA8BvF;AAED,uBAAuB;AACvB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAMnF;AAED,uBAAuB;AACvB,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAGzF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAK3F;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAGxF;AAED,eAAe;AACf,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,eAAe,GACnB;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAa/D"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { ensureSchemaConfig, readJson, stripConfigMeta } from "@sfmc-bds/sdk/node/config";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { ROOT } from "./runtime.js";
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
enabled: false,
|
|
7
|
+
mode: "drop",
|
|
8
|
+
applyTo: "display",
|
|
9
|
+
rules: []
|
|
10
|
+
};
|
|
11
|
+
function logFilterConfigPath() {
|
|
12
|
+
return path.join(ROOT, "configs", "log-filter.json");
|
|
13
|
+
}
|
|
14
|
+
function ensureLogFilterConfigFile() {
|
|
15
|
+
ensureSchemaConfig(ROOT, "log-filter.json", "log_filter", { ...DEFAULTS });
|
|
16
|
+
return logFilterConfigPath();
|
|
17
|
+
}
|
|
18
|
+
let cache = null;
|
|
19
|
+
function compileLogFilterRegex(src) {
|
|
20
|
+
let pattern = String(src ?? "");
|
|
21
|
+
let flags = "";
|
|
22
|
+
if (pattern.startsWith("(?i)")) {
|
|
23
|
+
pattern = pattern.slice(4);
|
|
24
|
+
flags = "i";
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return new RegExp(pattern, flags);
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function compileRules(rules, onBadRegex) {
|
|
33
|
+
const out = [];
|
|
34
|
+
for (const r of rules) {
|
|
35
|
+
if (r.enabled === false) continue;
|
|
36
|
+
const hasAny = r.sources && r.sources.length > 0 || r.levels && r.levels.length > 0 || typeof r.contains === "string" && r.contains.length > 0 || typeof r.regex === "string" && r.regex.length > 0;
|
|
37
|
+
if (!hasAny) continue;
|
|
38
|
+
const compiled = {};
|
|
39
|
+
if (r.sources && r.sources.length > 0) {
|
|
40
|
+
compiled.sources = new Set(r.sources.map((s) => s.toLowerCase()));
|
|
41
|
+
}
|
|
42
|
+
if (r.levels && r.levels.length > 0) {
|
|
43
|
+
compiled.levels = new Set(r.levels.map((l) => l.toLowerCase()));
|
|
44
|
+
}
|
|
45
|
+
if (typeof r.contains === "string" && r.contains.length > 0) {
|
|
46
|
+
compiled.contains = r.contains;
|
|
47
|
+
}
|
|
48
|
+
if (typeof r.regex === "string" && r.regex.length > 0) {
|
|
49
|
+
const re = compileLogFilterRegex(r.regex);
|
|
50
|
+
if (!re) {
|
|
51
|
+
onBadRegex?.(r.regex);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
compiled.regex = re;
|
|
55
|
+
}
|
|
56
|
+
out.push(compiled);
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function normalizeConfig(raw) {
|
|
61
|
+
const stripped = stripConfigMeta(raw);
|
|
62
|
+
const mode = stripped.mode === "keep" ? "keep" : "drop";
|
|
63
|
+
const applyTo = stripped.applyTo === "all" ? "all" : "display";
|
|
64
|
+
const rules = Array.isArray(stripped.rules) ? stripped.rules : [];
|
|
65
|
+
return {
|
|
66
|
+
enabled: Boolean(stripped.enabled),
|
|
67
|
+
mode,
|
|
68
|
+
applyTo,
|
|
69
|
+
rules
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function getCompiledLogFilter(onBadRegex) {
|
|
73
|
+
const p = ensureLogFilterConfigFile();
|
|
74
|
+
let mtimeMs = 0;
|
|
75
|
+
try {
|
|
76
|
+
mtimeMs = fs.statSync(p).mtimeMs;
|
|
77
|
+
} catch {
|
|
78
|
+
mtimeMs = 0;
|
|
79
|
+
}
|
|
80
|
+
if (cache && cache.mtimeMs === mtimeMs) return cache;
|
|
81
|
+
let cfg = { ...DEFAULTS };
|
|
82
|
+
const raw = readJson(p);
|
|
83
|
+
if (raw) {
|
|
84
|
+
try {
|
|
85
|
+
cfg = normalizeConfig(raw);
|
|
86
|
+
} catch {
|
|
87
|
+
cfg = { ...DEFAULTS };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const rules = compileRules(cfg.rules, onBadRegex);
|
|
91
|
+
cache = {
|
|
92
|
+
enabled: cfg.enabled,
|
|
93
|
+
mode: cfg.mode,
|
|
94
|
+
applyTo: cfg.applyTo,
|
|
95
|
+
rules,
|
|
96
|
+
mtimeMs
|
|
97
|
+
};
|
|
98
|
+
return cache;
|
|
99
|
+
}
|
|
100
|
+
function ruleMatchesEntry(rule, entry) {
|
|
101
|
+
if (rule.sources && !rule.sources.has(entry.source.toLowerCase())) return false;
|
|
102
|
+
if (rule.levels && !rule.levels.has(entry.level.toLowerCase())) return false;
|
|
103
|
+
if (rule.contains != null && !entry.text.includes(rule.contains)) return false;
|
|
104
|
+
if (rule.regex && !rule.regex.test(entry.text)) return false;
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function entryMatchesAnyRule(entry, rules) {
|
|
108
|
+
if (rules.length === 0) return false;
|
|
109
|
+
return rules.some((r) => ruleMatchesEntry(r, entry));
|
|
110
|
+
}
|
|
111
|
+
function shouldDropForDisplay(entry, filter) {
|
|
112
|
+
if (!filter.enabled) return false;
|
|
113
|
+
const matched = entryMatchesAnyRule(entry, filter.rules);
|
|
114
|
+
if (filter.mode === "keep") return !matched;
|
|
115
|
+
return matched;
|
|
116
|
+
}
|
|
117
|
+
function shouldDropForDisk(entry, filter) {
|
|
118
|
+
if (filter.applyTo !== "all") return false;
|
|
119
|
+
return shouldDropForDisplay(entry, filter);
|
|
120
|
+
}
|
|
121
|
+
function resetLogFilterCacheForTests() {
|
|
122
|
+
cache = null;
|
|
123
|
+
}
|
|
124
|
+
function evaluateLogFilter(entry, cfg) {
|
|
125
|
+
const compiled = {
|
|
126
|
+
enabled: cfg.enabled,
|
|
127
|
+
mode: cfg.mode,
|
|
128
|
+
applyTo: cfg.applyTo,
|
|
129
|
+
rules: compileRules(cfg.rules),
|
|
130
|
+
mtimeMs: 0
|
|
131
|
+
};
|
|
132
|
+
return {
|
|
133
|
+
matched: entryMatchesAnyRule(entry, compiled.rules),
|
|
134
|
+
dropDisplay: shouldDropForDisplay(entry, compiled),
|
|
135
|
+
dropDisk: shouldDropForDisk(entry, compiled)
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
compileLogFilterRegex,
|
|
140
|
+
ensureLogFilterConfigFile,
|
|
141
|
+
entryMatchesAnyRule,
|
|
142
|
+
evaluateLogFilter,
|
|
143
|
+
getCompiledLogFilter,
|
|
144
|
+
logFilterConfigPath,
|
|
145
|
+
resetLogFilterCacheForTests,
|
|
146
|
+
ruleMatchesEntry,
|
|
147
|
+
shouldDropForDisk,
|
|
148
|
+
shouldDropForDisplay
|
|
149
|
+
};
|
|
150
|
+
//# sourceMappingURL=log-filter.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/log-filter.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * log-filter.ts \u2014 configs/log-filter.json \u52A0\u8F7D\u4E0E\u5339\u914D\uFF08\u7EAF\u5224\u5B9A + \u70ED\u8BFB\u7F13\u5B58\uFF09\n */\nimport { ensureSchemaConfig, readJson, stripConfigMeta } from \"@sfmc-bds/sdk/node/config\";\nimport type { LogLevel } from \"@sfmc-bds/sdk/logs\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogFilterMode = \"drop\" | \"keep\";\nexport type LogFilterApplyTo = \"display\" | \"all\";\n\nexport interface LogFilterRule {\n enabled?: boolean;\n sources?: string[];\n levels?: LogLevel[];\n contains?: string;\n /** JS RegExp \u6E90\uFF1B\u652F\u6301\u524D\u7F00 (?i) \u8868\u793A\u5FFD\u7565\u5927\u5C0F\u5199 */\n regex?: string;\n}\n\nexport interface LogFilterConfig {\n enabled: boolean;\n mode: LogFilterMode;\n applyTo: LogFilterApplyTo;\n rules: LogFilterRule[];\n}\n\nexport type LogFilterEntry = {\n text: string;\n source: string;\n level: LogLevel;\n};\n\nconst DEFAULTS: LogFilterConfig = {\n enabled: false,\n mode: \"drop\",\n applyTo: \"display\",\n rules: [],\n};\n\nexport function logFilterConfigPath(): string {\n return path.join(ROOT, \"configs\", \"log-filter.json\");\n}\n\n/** \u786E\u4FDD configs/log-filter.json \u5B58\u5728\uFF08\u59D4\u6258 SDK ensureSchemaConfig\uFF0C\u7981\u6B62\u624B\u5199 withConfigSchema\uFF09 */\nexport function ensureLogFilterConfigFile(): string {\n ensureSchemaConfig(ROOT, \"log-filter.json\", \"log_filter\", { ...DEFAULTS } as Record<string, unknown>);\n return logFilterConfigPath();\n}\n\ntype CompiledRule = {\n sources?: Set<string>;\n levels?: Set<string>;\n contains?: string;\n regex?: RegExp;\n};\n\ntype CompiledFilter = {\n enabled: boolean;\n mode: LogFilterMode;\n applyTo: LogFilterApplyTo;\n rules: CompiledRule[];\n mtimeMs: number;\n};\n\nlet cache: CompiledFilter | null = null;\n\n/** \u5C06 (?i) \u524D\u7F00\u8F6C\u4E3A RegExp i \u65D7\u6807\uFF08JS \u65E0\u5185\u8054 (?i)\uFF09 */\nexport function compileLogFilterRegex(src: string): RegExp | null {\n let pattern = String(src ?? \"\");\n let flags = \"\";\n if (pattern.startsWith(\"(?i)\")) {\n pattern = pattern.slice(4);\n flags = \"i\";\n }\n try {\n return new RegExp(pattern, flags);\n } catch {\n return null;\n }\n}\n\nfunction compileRules(rules: LogFilterRule[], onBadRegex?: (src: string) => void): CompiledRule[] {\n const out: CompiledRule[] = [];\n for (const r of rules) {\n if (r.enabled === false) continue;\n const hasAny =\n (r.sources && r.sources.length > 0) ||\n (r.levels && r.levels.length > 0) ||\n (typeof r.contains === \"string\" && r.contains.length > 0) ||\n (typeof r.regex === \"string\" && r.regex.length > 0);\n if (!hasAny) continue;\n\n const compiled: CompiledRule = {};\n if (r.sources && r.sources.length > 0) {\n compiled.sources = new Set(r.sources.map((s) => s.toLowerCase()));\n }\n if (r.levels && r.levels.length > 0) {\n compiled.levels = new Set(r.levels.map((l) => l.toLowerCase()));\n }\n if (typeof r.contains === \"string\" && r.contains.length > 0) {\n compiled.contains = r.contains;\n }\n if (typeof r.regex === \"string\" && r.regex.length > 0) {\n const re = compileLogFilterRegex(r.regex);\n if (!re) {\n onBadRegex?.(r.regex);\n continue;\n }\n compiled.regex = re;\n }\n out.push(compiled);\n }\n return out;\n}\n\nfunction normalizeConfig(raw: Record<string, unknown>): LogFilterConfig {\n const stripped = stripConfigMeta(raw);\n const mode = stripped.mode === \"keep\" ? \"keep\" : \"drop\";\n const applyTo = stripped.applyTo === \"all\" ? \"all\" : \"display\";\n const rules = Array.isArray(stripped.rules) ? (stripped.rules as LogFilterRule[]) : [];\n return {\n enabled: Boolean(stripped.enabled),\n mode,\n applyTo,\n rules,\n };\n}\n\n/**\n * \u52A0\u8F7D\u5E76\u7F16\u8BD1\u8FC7\u6EE4\u914D\u7F6E\uFF08\u6309\u6587\u4EF6 mtime \u70ED\u8BFB\uFF09\u3002\n * onBadRegex\uFF1A\u6B63\u5219\u975E\u6CD5\u65F6\u56DE\u8C03\uFF08\u7531 logs \u5C42\u6253 warn\uFF0C\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\uFF09\u3002\n */\nexport function getCompiledLogFilter(onBadRegex?: (src: string) => void): CompiledFilter {\n const p = ensureLogFilterConfigFile();\n let mtimeMs = 0;\n try {\n mtimeMs = fs.statSync(p).mtimeMs;\n } catch {\n mtimeMs = 0;\n }\n if (cache && cache.mtimeMs === mtimeMs) return cache;\n\n let cfg = { ...DEFAULTS };\n const raw = readJson<Record<string, unknown>>(p);\n if (raw) {\n try {\n cfg = normalizeConfig(raw);\n } catch {\n cfg = { ...DEFAULTS };\n }\n }\n\n const rules = compileRules(cfg.rules, onBadRegex);\n\n cache = {\n enabled: cfg.enabled,\n mode: cfg.mode,\n applyTo: cfg.applyTo,\n rules,\n mtimeMs,\n };\n return cache;\n}\n\n/** \u5355\u6761\u89C4\u5219\u662F\u5426\u547D\u4E2D\uFF08\u540C\u6761 AND\uFF09 */\nexport function ruleMatchesEntry(rule: CompiledRule, entry: LogFilterEntry): boolean {\n if (rule.sources && !rule.sources.has(entry.source.toLowerCase())) return false;\n if (rule.levels && !rule.levels.has(entry.level.toLowerCase())) return false;\n if (rule.contains != null && !entry.text.includes(rule.contains)) return false;\n if (rule.regex && !rule.regex.test(entry.text)) return false;\n return true;\n}\n\n/** \u4EFB\u4E00\u89C4\u5219\u547D\u4E2D\u5373\u4E3A matched */\nexport function entryMatchesAnyRule(entry: LogFilterEntry, rules: CompiledRule[]): boolean {\n if (rules.length === 0) return false;\n return rules.some((r) => ruleMatchesEntry(r, entry));\n}\n\n/**\n * \u662F\u5426\u5E94\u4E22\u5F03\u8BE5\u6761\uFF08\u5BF9\u5C55\u793A/\u5185\u5B58\u800C\u8A00\uFF09\u3002\n * enabled=false \u2192 \u4E0D\u4E22\uFF1Bkeep \u6A21\u5F0F\u672A\u5339\u914D \u2192 \u4E22\uFF1Bdrop \u6A21\u5F0F\u5339\u914D \u2192 \u4E22\u3002\n */\nexport function shouldDropForDisplay(entry: LogFilterEntry, filter: CompiledFilter): boolean {\n if (!filter.enabled) return false;\n const matched = entryMatchesAnyRule(entry, filter.rules);\n if (filter.mode === \"keep\") return !matched;\n return matched;\n}\n\n/** \u662F\u5426\u5E94\u8DF3\u8FC7\u843D\u76D8\uFF08\u4EC5 applyTo=all \u65F6\u4E0E display \u4E00\u81F4\uFF09 */\nexport function shouldDropForDisk(entry: LogFilterEntry, filter: CompiledFilter): boolean {\n if (filter.applyTo !== \"all\") return false;\n return shouldDropForDisplay(entry, filter);\n}\n\n/** \u6D4B\u8BD5\u7528\uFF1A\u6E05\u7A7A\u7F13\u5B58 */\nexport function resetLogFilterCacheForTests(): void {\n cache = null;\n}\n\n/**\n * \u7EAF\u51FD\u6570\u5224\u5B9A\uFF08\u4E0D\u8BFB\u76D8\uFF09\uFF1A\u4F9B\u5355\u6D4B\u4E0E\u8C03\u7528\u65B9\u8868\u9A71\u52A8\u3002\n * dropDisplay / dropDisk \u8BED\u4E49\u4E0E pushLog \u4E00\u81F4\u3002\n */\nexport function evaluateLogFilter(\n entry: LogFilterEntry,\n cfg: LogFilterConfig\n): { dropDisplay: boolean; dropDisk: boolean; matched: boolean } {\n const compiled = {\n enabled: cfg.enabled,\n mode: cfg.mode,\n applyTo: cfg.applyTo,\n rules: compileRules(cfg.rules),\n mtimeMs: 0,\n };\n return {\n matched: entryMatchesAnyRule(entry, compiled.rules),\n dropDisplay: shouldDropForDisplay(entry, compiled),\n dropDisk: shouldDropForDisk(entry, compiled),\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/logs.d.ts
CHANGED
|
@@ -17,16 +17,16 @@ export type LogLevel = SharedLogLevel;
|
|
|
17
17
|
export type LogSource = string;
|
|
18
18
|
export interface UnifiedLog extends LogEntry {
|
|
19
19
|
}
|
|
20
|
+
/** 再导出 SDK BDS 解析(测试与调用方统一入口,权威在 @sfmc-bds/sdk/logs) */
|
|
21
|
+
export { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from "@sfmc-bds/sdk/logs";
|
|
20
22
|
/** 推送一条日志到内存缓冲,并按策略落盘 */
|
|
21
23
|
export declare function pushLog(text: string, source: LogSource, level: LogLevel): void;
|
|
22
24
|
/** 订阅新日志事件,返回取消订阅函数 */
|
|
23
25
|
export declare function onLog(fn: (log: UnifiedLog) => void): () => void;
|
|
24
|
-
/**
|
|
25
|
-
export declare function getAllLogs(): UnifiedLog[];
|
|
26
|
-
/** 获取最近 n 条,可按 level / source 过滤 */
|
|
26
|
+
/** 获取最近 n 条,可按 level / source 过滤;再套配置过滤(display) */
|
|
27
27
|
export declare function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[];
|
|
28
|
-
/**
|
|
29
|
-
export declare function
|
|
28
|
+
/** 获取全部日志;配置过滤仅影响返回视图(缓冲内可能仍有全量,视 push 时 applyTo) */
|
|
29
|
+
export declare function getAllLogs(): UnifiedLog[];
|
|
30
30
|
export interface SourceMeta {
|
|
31
31
|
value: string;
|
|
32
32
|
/** 显示名,尽量 8 宽对齐 */
|
|
@@ -35,13 +35,20 @@ export interface SourceMeta {
|
|
|
35
35
|
}
|
|
36
36
|
export declare const SOURCE_META: SourceMeta[];
|
|
37
37
|
export declare function formatSourceTag(source: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* 展示用级别:BDS 若仍带时间戳前缀则解析内嵌级别;已剥离(pushLog 入库)则信任 entry.level。
|
|
40
|
+
* 禁止对正文做松散关键词匹配(会把 `[Commands] Error on line` 误判为 error)。
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveDisplayLevel(l: UnifiedLog): LogLevel;
|
|
43
|
+
/** 从原始文本推断级别:委托共享包(内含 BDS 时间戳解析) */
|
|
44
|
+
export declare function inferLevel(text: string): LogLevel;
|
|
38
45
|
/** 格式化日志用于 REPL 展示 (用 theme.ts chalk 配色) */
|
|
39
46
|
export declare function formatLog(l: UnifiedLog): string;
|
|
40
47
|
/** 字符串在终端的可见宽度 (strip ANSI 后按 CJK 宽度累加) */
|
|
41
48
|
export declare function visibleWidth(s: string): number;
|
|
42
49
|
/**
|
|
43
50
|
* 日志前缀可见宽度(时间 + 源 + 级别 + 尾空格),供悬挂缩进对齐正文起点。
|
|
44
|
-
* 与 formatLog
|
|
51
|
+
* 与 formatLog 拼接顺序保持一致(共用 resolveDisplayLevel / sourceTagPlain / levelTagPlain)。
|
|
45
52
|
*/
|
|
46
53
|
export declare function logPrefixWidth(l: UnifiedLog): number;
|
|
47
54
|
/**
|
package/dist/logs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAQL,KAAK,QAAQ,EACb,KAAK,QAAQ,IAAI,cAAc,EAChC,MAAM,oBAAoB,CAAC;AAU5B,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,WAAW,UAAW,SAAQ,QAAQ;CAAG;AAE/C,wDAAwD;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA+BhG,yBAAyB;AACzB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CA2C9E;AAED,uBAAuB;AACvB,wBAAgB,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAE/D;AAED,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAG/F;AAED,qDAAqD;AACrD,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAGzC;AAMD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,WAAW,EAAE,UAAU,EASnC,CAAC;AASF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CAM3D;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAEjD;AA+BD,4CAA4C;AAC5C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAQ/C;AAwBD,2CAA2C;AAC3C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAKpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa7D"}
|
package/dist/logs.js
CHANGED
|
@@ -2,11 +2,19 @@ import {
|
|
|
2
2
|
createFileSink,
|
|
3
3
|
createMemoryBuffer,
|
|
4
4
|
formatLogLine,
|
|
5
|
-
inferLevel as sharedInferLevel
|
|
5
|
+
inferLevel as sharedInferLevel,
|
|
6
|
+
parseBdsEmbeddedLevel,
|
|
7
|
+
stripBdsLogPrefix
|
|
6
8
|
} from "@sfmc-bds/sdk/logs";
|
|
7
9
|
import { logFile } from "@sfmc-bds/sdk/node/config";
|
|
10
|
+
import {
|
|
11
|
+
getCompiledLogFilter,
|
|
12
|
+
shouldDropForDisk,
|
|
13
|
+
shouldDropForDisplay
|
|
14
|
+
} from "./log-filter.js";
|
|
8
15
|
import { c, highlightLogLine } from "./theme.js";
|
|
9
16
|
import { ROOT } from "./runtime.js";
|
|
17
|
+
import { mapBdsLevelToken, parseBdsEmbeddedLevel as parseBdsEmbeddedLevel2, stripBdsLogPrefix as stripBdsLogPrefix2 } from "@sfmc-bds/sdk/logs";
|
|
10
18
|
const buffer = createMemoryBuffer(5e3);
|
|
11
19
|
const CHILD_OWNED_SOURCES = /* @__PURE__ */ new Set(["db", "qq", "update"]);
|
|
12
20
|
const fileSinks = /* @__PURE__ */ new Map();
|
|
@@ -29,10 +37,36 @@ process.on("exit", () => {
|
|
|
29
37
|
for (const sink of fileSinks.values()) sink.close();
|
|
30
38
|
});
|
|
31
39
|
function pushLog(text, source, level) {
|
|
32
|
-
|
|
40
|
+
let body = text;
|
|
41
|
+
let lvl = level;
|
|
42
|
+
if (source === "bds") {
|
|
43
|
+
const embedded = parseBdsEmbeddedLevel(text);
|
|
44
|
+
if (embedded) lvl = embedded;
|
|
45
|
+
body = stripBdsLogPrefix(text);
|
|
46
|
+
}
|
|
47
|
+
const entry = { time: /* @__PURE__ */ new Date(), text: body, source, level: lvl };
|
|
48
|
+
const filter = getCompiledLogFilter((src) => {
|
|
49
|
+
try {
|
|
50
|
+
const sink2 = sinkFor("system");
|
|
51
|
+
if (!sink2) return;
|
|
52
|
+
const warn = {
|
|
53
|
+
time: /* @__PURE__ */ new Date(),
|
|
54
|
+
text: `log-filter: invalid regex skipped: ${src}`,
|
|
55
|
+
source: "system",
|
|
56
|
+
level: "warn"
|
|
57
|
+
};
|
|
58
|
+
sink2.write(warn, formatLogLine(warn, false));
|
|
59
|
+
} catch {
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
const dropDisplay = shouldDropForDisplay(entry, filter);
|
|
63
|
+
const dropDisk = shouldDropForDisk(entry, filter);
|
|
64
|
+
if (!dropDisplay) {
|
|
65
|
+
buffer.pushDirect(body, source, lvl);
|
|
66
|
+
}
|
|
67
|
+
if (dropDisk) return;
|
|
33
68
|
const sink = sinkFor(source);
|
|
34
69
|
if (!sink) return;
|
|
35
|
-
const entry = { time: /* @__PURE__ */ new Date(), text, source, level };
|
|
36
70
|
try {
|
|
37
71
|
sink.write(entry, formatLogLine(entry, false));
|
|
38
72
|
} catch {
|
|
@@ -41,14 +75,13 @@ function pushLog(text, source, level) {
|
|
|
41
75
|
function onLog(fn) {
|
|
42
76
|
return buffer.subscribe(fn);
|
|
43
77
|
}
|
|
44
|
-
function getAllLogs() {
|
|
45
|
-
return buffer.getAll();
|
|
46
|
-
}
|
|
47
78
|
function getRecentLogs(n, levels, sources) {
|
|
48
|
-
|
|
79
|
+
const filter = getCompiledLogFilter();
|
|
80
|
+
return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));
|
|
49
81
|
}
|
|
50
|
-
function
|
|
51
|
-
|
|
82
|
+
function getAllLogs() {
|
|
83
|
+
const filter = getCompiledLogFilter();
|
|
84
|
+
return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));
|
|
52
85
|
}
|
|
53
86
|
const SOURCE_META = [
|
|
54
87
|
{ value: "bds", name: "BDServer", paint: (s) => c.green(s) },
|
|
@@ -60,55 +93,60 @@ const SOURCE_META = [
|
|
|
60
93
|
{ value: "pack", name: " PACK ", paint: (s) => c.purple(s) },
|
|
61
94
|
{ value: "bds-tools", name: "BDSTools", paint: (s) => c.red(s) }
|
|
62
95
|
];
|
|
96
|
+
function sourceTagPlain(source) {
|
|
97
|
+
const meta = SOURCE_META.find((m) => m.value === source);
|
|
98
|
+
if (meta) return `[${meta.name}]`;
|
|
99
|
+
return `[${source.padEnd(7).slice(0, 8)}]`;
|
|
100
|
+
}
|
|
63
101
|
function formatSourceTag(source) {
|
|
64
102
|
const meta = SOURCE_META.find((m) => m.value === source);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
function stripLogPrefix(line) {
|
|
69
|
-
const prefixRegex = /^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}:\d{3} (INFO|WARNING|ERROR|FATAL|DEBUG)\]\s*/;
|
|
70
|
-
return line.replace(prefixRegex, "");
|
|
71
|
-
}
|
|
72
|
-
function getLogLevel(line) {
|
|
73
|
-
const levelNames = ["INFO", "WARNING", "ERROR", "FATAL", "DEBUG", "TRACE", "WARN"];
|
|
74
|
-
const levelPattern = levelNames.join("|");
|
|
75
|
-
let match = line.match(new RegExp(`\\[(${levelPattern})\\]`, "i"));
|
|
76
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
77
|
-
match = line.match(new RegExp(`^\\[.*?\\]\\s*(${levelPattern})`, "i"));
|
|
78
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
79
|
-
match = line.match(new RegExp(`^(${levelPattern})\\s*:`, "i"));
|
|
80
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
81
|
-
match = line.match(new RegExp(`\\[.*?\\]\\s*(${levelPattern})\\s*:`, "i"));
|
|
82
|
-
if (match && match[1]) return match[1].toUpperCase();
|
|
83
|
-
return "UNKNOWN";
|
|
103
|
+
const plain = sourceTagPlain(source);
|
|
104
|
+
if (meta) return meta.paint(plain);
|
|
105
|
+
return c.bold(plain);
|
|
84
106
|
}
|
|
85
|
-
function
|
|
86
|
-
const ts = c.dim(l.time.toLocaleTimeString());
|
|
87
|
-
let lvl = levelTag(l.level);
|
|
88
|
-
let txt = highlightLogLine(l.text);
|
|
89
|
-
const src = formatSourceTag(l.source);
|
|
107
|
+
function resolveDisplayLevel(l) {
|
|
90
108
|
if (l.source === "bds") {
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
txt = highlightLogLine(stripLogPrefix(l.text));
|
|
94
|
-
lvl = levelTag(mapped);
|
|
109
|
+
const embedded = parseBdsEmbeddedLevel(l.text);
|
|
110
|
+
if (embedded) return embedded;
|
|
95
111
|
}
|
|
96
|
-
return
|
|
112
|
+
return l.level;
|
|
113
|
+
}
|
|
114
|
+
function inferLevel(text) {
|
|
115
|
+
return sharedInferLevel(text);
|
|
116
|
+
}
|
|
117
|
+
const LEVEL_TAG_TEXT = {
|
|
118
|
+
error: "[ERR]",
|
|
119
|
+
warn: "[WRN]",
|
|
120
|
+
success: "[OK]",
|
|
121
|
+
debug: "[DBG]",
|
|
122
|
+
info: "[INF]"
|
|
123
|
+
};
|
|
124
|
+
function levelTagPlain(lvl) {
|
|
125
|
+
return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;
|
|
97
126
|
}
|
|
98
127
|
function levelTag(lvl) {
|
|
128
|
+
const text = levelTagPlain(lvl);
|
|
99
129
|
switch (lvl) {
|
|
100
130
|
case "error":
|
|
101
|
-
return c.red(
|
|
131
|
+
return c.red(text);
|
|
102
132
|
case "warn":
|
|
103
|
-
return c.yellow(
|
|
133
|
+
return c.yellow(text);
|
|
104
134
|
case "success":
|
|
105
|
-
return c.green(c.bold(
|
|
135
|
+
return c.green(c.bold(text));
|
|
106
136
|
case "debug":
|
|
107
|
-
return c.dim(
|
|
137
|
+
return c.dim(text);
|
|
108
138
|
default:
|
|
109
|
-
return c.blue(
|
|
139
|
+
return c.blue(text);
|
|
110
140
|
}
|
|
111
141
|
}
|
|
142
|
+
function formatLog(l) {
|
|
143
|
+
const ts = c.dim(l.time.toLocaleTimeString());
|
|
144
|
+
const level = resolveDisplayLevel(l);
|
|
145
|
+
const lvl = levelTag(level);
|
|
146
|
+
const src = formatSourceTag(l.source);
|
|
147
|
+
const txt = highlightLogLine(l.source === "bds" ? stripBdsLogPrefix(l.text) : l.text);
|
|
148
|
+
return `${ts} ${src} ${lvl} ${txt}`;
|
|
149
|
+
}
|
|
112
150
|
function charWidth(ch) {
|
|
113
151
|
const cp = ch.codePointAt(0) ?? 0;
|
|
114
152
|
if (cp >= 4352 && (cp <= 4447 || cp >= 11904 && cp <= 42191 && cp !== 12351 || cp >= 44032 && cp <= 55203 || cp >= 63744 && cp <= 64255 || cp >= 65072 && cp <= 65103 || cp >= 65280 && cp <= 65376 || cp >= 65504 && cp <= 65510 || cp >= 131072 && cp <= 196605))
|
|
@@ -121,29 +159,10 @@ function visibleWidth(s) {
|
|
|
121
159
|
for (const ch of stripped) w += charWidth(ch);
|
|
122
160
|
return w;
|
|
123
161
|
}
|
|
124
|
-
function levelTagPlain(lvl) {
|
|
125
|
-
switch (lvl) {
|
|
126
|
-
case "error":
|
|
127
|
-
return "[ERR]";
|
|
128
|
-
case "warn":
|
|
129
|
-
return "[WRN]";
|
|
130
|
-
case "success":
|
|
131
|
-
return "[OK]";
|
|
132
|
-
case "debug":
|
|
133
|
-
return "[DBG]";
|
|
134
|
-
default:
|
|
135
|
-
return "[INF]";
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
162
|
function logPrefixWidth(l) {
|
|
139
163
|
const ts = l.time.toLocaleTimeString();
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
let level = l.level;
|
|
143
|
-
if (l.source === "bds") {
|
|
144
|
-
const parsed = getLogLevel(l.text);
|
|
145
|
-
level = parsed === "WARNING" || parsed === "WARN" ? "warn" : parsed === "ERROR" || parsed === "FATAL" ? "error" : parsed === "DEBUG" || parsed === "TRACE" ? "debug" : "info";
|
|
146
|
-
}
|
|
164
|
+
const src = sourceTagPlain(l.source);
|
|
165
|
+
const level = resolveDisplayLevel(l);
|
|
147
166
|
return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);
|
|
148
167
|
}
|
|
149
168
|
function wrapLogLine(s, indent) {
|
|
@@ -209,8 +228,12 @@ export {
|
|
|
209
228
|
getRecentLogs,
|
|
210
229
|
inferLevel,
|
|
211
230
|
logPrefixWidth,
|
|
231
|
+
mapBdsLevelToken,
|
|
212
232
|
onLog,
|
|
233
|
+
parseBdsEmbeddedLevel2 as parseBdsEmbeddedLevel,
|
|
213
234
|
pushLog,
|
|
235
|
+
resolveDisplayLevel,
|
|
236
|
+
stripBdsLogPrefix2 as stripBdsLogPrefix,
|
|
214
237
|
visibleWidth,
|
|
215
238
|
wrapLogLine
|
|
216
239
|
};
|
package/dist/logs.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/logs.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * logs.ts \u2014 sfmc \u4E3B\u8FDB\u7A0B\u7EDF\u4E00\u65E5\u5FD7\u805A\u5408\u5C42\n *\n * \u5185\u90E8\u59D4\u6258 @sfmc-bds/logs \u5171\u4EAB\u5305\u7684 createMemoryBuffer + inferLevel,\n * \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684 pushLog / onLog / getAllLogs / getRecentLogs API\n * (services.ts \u6355\u83B7\u5B50\u8FDB\u7A0B stdout \u540E\u8C03\u7528 pushLog \u6C47\u805A\u5230\u6B64)\u3002\n *\n * \u843D\u76D8\u7B56\u7565(\u4E0E\u5B50\u8FDB\u7A0B\u81EA\u5199\u6587\u4EF6\u5206\u5DE5,\u907F\u514D\u91CD\u590D):\n * - db / qq / update \u2192 \u5B50\u8FDB\u7A0B\u5DF2\u5199 `.sfmc/logs/{db,qq,bds-update}.log`,\u6B64\u5904\u8DF3\u8FC7\n * - bds / llbot \u2192 `.sfmc/logs/{bds,llbot}.log`(\u5916\u90E8\u8FDB\u7A0B\u65E0\u81EA\u5E26 file sink)\n * - \u5176\u4F59(system / pack / \u2026) \u2192 `.sfmc/logs/sfmc.log`\n *\n * formatLog \u4FDD\u7559 theme.ts (chalk) \u914D\u8272,\u6BD4\u5171\u4EAB\u5305\u7684\u7EAF ANSI \u7248\u672C\u89C6\u89C9\u66F4\u4E30\u5BCC\u3002\n */\n\nimport {\n createFileSink,\n createMemoryBuffer,\n formatLogLine,\n inferLevel as sharedInferLevel,\n type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile } from \"@sfmc-bds/sdk/node/config\";\nimport { c, highlightLogLine } from \"./theme.js\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogLevel = SharedLogLevel;\nexport type LogSource = string;\nexport interface UnifiedLog extends LogEntry {}\n\nconst buffer = createMemoryBuffer(5000);\n\n/** \u5B50\u8FDB\u7A0B\u5DF2\u7528 createNodeServiceLogger \u81EA\u884C\u843D\u76D8\u7684 source */\nconst CHILD_OWNED_SOURCES = new Set([\"db\", \"qq\", \"update\"]);\n\nconst fileSinks = new Map<string, FileSink>();\n\n/** \u89E3\u6790\u672C\u6761\u65E5\u5FD7\u5E94\u5199\u5165\u7684\u6587\u4EF6\u540D(\u4E0D\u542B .log);null \u8868\u793A\u8DF3\u8FC7(\u5B50\u8FDB\u7A0B\u5DF2\u5199) */\nfunction resolveDiskLogName(source: string): string | null {\n if (CHILD_OWNED_SOURCES.has(source)) return null;\n if (source === \"bds\" || source === \"llbot\") return source;\n return \"sfmc\";\n}\n\nfunction sinkFor(source: string): FileSink | null {\n const name = resolveDiskLogName(source);\n if (!name) return null;\n let sink = fileSinks.get(name);\n if (!sink) {\n sink = createFileSink(logFile(ROOT, name));\n fileSinks.set(name, sink);\n }\n return sink;\n}\n\nprocess.on(\"exit\", () => {\n for (const sink of fileSinks.values()) sink.close();\n});\n\n/** \u63A8\u9001\u4E00\u6761\u65E5\u5FD7\u5230\u5185\u5B58\u7F13\u51B2,\u5E76\u6309\u7B56\u7565\u843D\u76D8 */\nexport function pushLog(text: string, source: LogSource, level: LogLevel): void {\n buffer.pushDirect(text, source, level);\n const sink = sinkFor(source);\n if (!sink) return;\n const entry: LogEntry = { time: new Date(), text, source, level };\n try {\n sink.write(entry, formatLogLine(entry, false));\n } catch {\n /* \u843D\u76D8\u5931\u8D25\u4E0D\u963B\u65AD\u4E3B\u6D41\u7A0B */\n }\n}\n\n/** \u8BA2\u9605\u65B0\u65E5\u5FD7\u4E8B\u4EF6,\u8FD4\u56DE\u53D6\u6D88\u8BA2\u9605\u51FD\u6570 */\nexport function onLog(fn: (log: UnifiedLog) => void): () => void {\n return buffer.subscribe(fn);\n}\n\n/** \u83B7\u53D6\u5168\u90E8\u65E5\u5FD7 (\u6309\u65F6\u95F4\u987A\u5E8F) */\nexport function getAllLogs(): UnifiedLog[] {\n return buffer.getAll();\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n return buffer.getRecent(n, levels, sources);\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u65E5\u5FD7\u7EA7\u522B (\u59D4\u6258\u5171\u4EAB\u5305) */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\n}\n\n/* ==================================================================\n * \u6765\u6E90\u6807\u7B7E\u5143\u6570\u636E (\u65B9\u62EC\u53F7\u4E0E\u6587\u5B57\u540C\u8272,\u5BF9\u9F50 levelTag)\n * ================================================================== */\n\nexport interface SourceMeta {\n value: string;\n /** \u663E\u793A\u540D,\u5C3D\u91CF 8 \u5BBD\u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDServer\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DataBase\", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQBridge\", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \" LL-BOT \", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \" SYSTEM \", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \" UPDATE \", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \" PACK \", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"BDSTools\", paint: (s) => c.red(s) },\n];\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return meta.paint(`[${meta.name}]`);\n return c.bold(`[${source.padEnd(7).slice(0, 8)}]`);\n}\n\n/** \u7B80\u5316BDS\u65E5\u5FD7 */\nfunction stripLogPrefix(line: string): string {\n // \u5339\u914D\u683C\u5F0F: [2026-07-18 23:56:06:778 INFO]\n const prefixRegex = /^\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}:\\d{3} (INFO|WARNING|ERROR|FATAL|DEBUG)\\]\\s*/;\n return line.replace(prefixRegex, \"\");\n}\n\n/**\n * \u4ECE\u4E00\u884C BDS \u65E5\u5FD7\u4E2D\u63D0\u53D6\u65E5\u5FD7\u7B49\u7EA7\n * @param line \u65E5\u5FD7\u884C\u5B57\u7B26\u4E32\n * @returns \u65E5\u5FD7\u7B49\u7EA7\uFF08\u5927\u5199\uFF09\uFF0C\u82E5\u65E0\u6CD5\u8BC6\u522B\u5219\u8FD4\u56DE 'UNKNOWN'\n */\nfunction getLogLevel(line: string): string {\n const levelNames = [\"INFO\", \"WARNING\", \"ERROR\", \"FATAL\", \"DEBUG\", \"TRACE\", \"WARN\"];\n const levelPattern = levelNames.join(\"|\");\n\n let match = line.match(new RegExp(`\\\\[(${levelPattern})\\\\]`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n match = line.match(new RegExp(`^\\\\[.*?\\\\]\\\\s*(${levelPattern})`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n match = line.match(new RegExp(`^(${levelPattern})\\\\s*:`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n match = line.match(new RegExp(`\\\\[.*?\\\\]\\\\s*(${levelPattern})\\\\s*:`, \"i\"));\n if (match && match[1]) return match[1].toUpperCase();\n\n return \"UNKNOWN\";\n}\n\n/** \u683C\u5F0F\u5316\u65E5\u5FD7\u7528\u4E8E REPL \u5C55\u793A (\u7528 theme.ts chalk \u914D\u8272) */\nexport function formatLog(l: UnifiedLog): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n let lvl = levelTag(l.level);\n let txt = highlightLogLine(l.text);\n const src = formatSourceTag(l.source);\n if (l.source === \"bds\") {\n const parsed = getLogLevel(l.text);\n const mapped: LogLevel =\n parsed === \"WARNING\" || parsed === \"WARN\"\n ? \"warn\"\n : parsed === \"ERROR\" || parsed === \"FATAL\"\n ? \"error\"\n : parsed === \"DEBUG\" || parsed === \"TRACE\"\n ? \"debug\"\n : \"info\";\n /* \u53BB\u6389 BDS \u81EA\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u540E\u518D\u9AD8\u4EAE\u6B63\u6587 */\n txt = highlightLogLine(stripLogPrefix(l.text));\n lvl = levelTag(mapped);\n }\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n switch (lvl) {\n case \"error\":\n return c.red(\"[ERR]\");\n case \"warn\":\n return c.yellow(\"[WRN]\");\n case \"success\":\n return c.green(c.bold(\"[OK]\"));\n case \"debug\":\n return c.dim(\"[DBG]\");\n default:\n return c.blue(\"[INF]\");\n }\n}\n\n/* ==================================================================\n * \u8F6F\u6362\u884C: \u8D85\u7EC8\u7AEF\u5BBD\u5EA6\u65F6\u6362\u884C,\u540E\u7EED\u884C\u7F29\u8FDB\u5BF9\u9F50\n * ================================================================== */\n\n/** \u5355\u4E2A\u5B57\u7B26\u5728\u7EC8\u7AEF\u7684\u663E\u793A\u5BBD\u5EA6 (CJK \u5168\u89D2=2, \u5176\u4F59=1) */\nfunction charWidth(ch: string): number {\n const cp = ch.codePointAt(0) ?? 0;\n if (\n cp >= 0x1100 &&\n (cp <= 0x115f ||\n (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x20000 && cp <= 0x2fffd))\n )\n return 2;\n return 1;\n}\n\n/** \u5B57\u7B26\u4E32\u5728\u7EC8\u7AEF\u7684\u53EF\u89C1\u5BBD\u5EA6 (strip ANSI \u540E\u6309 CJK \u5BBD\u5EA6\u7D2F\u52A0) */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) w += charWidth(ch);\n return w;\n}\n\n/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E,\u4E0E levelTag \u53EF\u89C1\u5BBD\u5EA6\u4E00\u81F4 */\nfunction levelTagPlain(lvl: LogLevel): string {\n switch (lvl) {\n case \"error\":\n return \"[ERR]\";\n case \"warn\":\n return \"[WRN]\";\n case \"success\":\n return \"[OK]\";\n case \"debug\":\n return \"[DBG]\";\n default:\n return \"[INF]\";\n }\n}\n\n/**\n * \u65E5\u5FD7\u524D\u7F00\u53EF\u89C1\u5BBD\u5EA6(\u65F6\u95F4 + \u6E90 + \u7EA7\u522B + \u5C3E\u7A7A\u683C),\u4F9B\u60AC\u6302\u7F29\u8FDB\u5BF9\u9F50\u6B63\u6587\u8D77\u70B9\u3002\n * \u4E0E formatLog \u62FC\u63A5\u987A\u5E8F\u4FDD\u6301\u4E00\u81F4\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const meta = SOURCE_META.find((m) => m.value === l.source);\n const src = meta ? `[${meta.name}]` : `[${l.source.padEnd(7).slice(0, 8)}]`;\n let level: LogLevel = l.level;\n if (l.source === \"bds\") {\n const parsed = getLogLevel(l.text);\n level =\n parsed === \"WARNING\" || parsed === \"WARN\"\n ? \"warn\"\n : parsed === \"ERROR\" || parsed === \"FATAL\"\n ? \"error\"\n : parsed === \"DEBUG\" || parsed === \"TRACE\"\n ? \"debug\"\n : \"info\";\n }\n return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);\n}\n\n/**\n * \u6309\u7EC8\u7AEF\u53EF\u89C1\u5BBD\u5EA6\u6362\u884C;\u663E\u5F0F \\\\n \u4E0E\u8F6F\u6362\u884C\u7684\u540E\u7EED\u884C\u4E00\u5F8B\u5DE6\u4FA7\u7F29\u8FDB indent \u5217\u3002\n * \u4FDD\u7559 ANSI:\u6362\u884C\u65F6 reset,\u65B0\u884C\u6062\u590D\u5F53\u524D\u989C\u8272\u72B6\u6001(\u53EF\u591A\u5C42\u53E0\u52A0)\u3002\n * \u5BBD\u5B57\u7B26(CJK)\u6309 2 \u5217;cols \u9884\u7559 1 \u5217,\u907F\u514D Windows Terminal \u8FB9\u754C\u518D\u8F6F\u6298\u5230\u7B2C 0 \u5217\u3002\n */\nexport function wrapLogLine(s: string, indent: number): string {\n const rawCols = process.stdout.columns || 80;\n /* \u81F3\u5C11\u7559\u7ED9\u6B63\u6587\u82E5\u5E72\u5217,\u907F\u514D indent >= cols \u65F6\u6B7B\u5FAA\u73AF */\n const cols = Math.max(rawCols - 1, indent + 4);\n const segments = s.split(/\\r?\\n/);\n const out: string[] = [];\n for (let si = 0; si < segments.length; si++) {\n const raw = segments[si]!;\n /* \u663E\u5F0F\u6362\u884C\u6BB5\u53BB\u6389\u6587\u6848\u81EA\u5E26\u7684\u5DE6\u7A7A\u683C,\u7EDF\u4E00\u7531 hang indent \u5BF9\u9F50\u6B63\u6587 */\n const piece = si === 0 ? raw : raw.replace(/^[ \\t]+/, \"\");\n out.push(wrapSegment(piece, cols, si === 0 ? 0 : indent, indent));\n }\n return out.join(\"\\n\");\n}\n\n/** \u5355\u6BB5(\u65E0\u5185\u5D4C \\\\n)\u8F6F\u6362\u884C;startPad>0 \u8868\u793A\u672C\u6BB5\u5F00\u5934\u5DF2\u5360\u7528\u7684\u5217(\u663E\u5F0F\u6362\u884C\u540E\u7684\u60AC\u6302) */\nfunction wrapSegment(s: string, cols: number, startPad: number, hangIndent: number): string {\n if (s.length === 0) return startPad > 0 ? \" \".repeat(startPad) : \"\";\n\n const lines: string[] = [];\n let cur = startPad > 0 ? \" \".repeat(startPad) : \"\";\n let w = startPad;\n /** \u5F53\u524D\u751F\u6548\u7684 ANSI \u5F00\u7801\u6808(\u4E0D\u542B reset),\u6362\u884C\u540E\u91CD\u653E */\n const ansiStack: string[] = [];\n\n const resetIfNeeded = (): void => {\n if (ansiStack.length) cur += \"\\x1b[0m\";\n };\n const replayAnsi = (): void => {\n for (const code of ansiStack) cur += code;\n };\n\n let i = 0;\n while (i < s.length) {\n const m = /^\\x1b\\[[0-9;]*m/.exec(s.slice(i));\n if (m) {\n const code = m[0]!;\n cur += code;\n if (code === \"\\x1b[0m\") ansiStack.length = 0;\n else ansiStack.push(code);\n i += code.length;\n continue;\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const cw = charWidth(ch);\n const advance = ch.length;\n\n /* w > startPad:\u5F53\u524D\u884C\u9664\u5DE6\u57AB\u5916\u5DF2\u6709\u5185\u5BB9,\u53EF\u4EE5\u62C6\u884C;\u5426\u5219\u5F3A\u5236\u585E\u5165\u907F\u514D\u6B7B\u5FAA\u73AF */\n if (w + cw > cols && w > startPad) {\n resetIfNeeded();\n lines.push(cur);\n cur = \" \".repeat(hangIndent);\n replayAnsi();\n w = hangIndent;\n startPad = hangIndent;\n }\n\n cur += ch;\n w += cw;\n i += advance;\n }\n\n if (ansiStack.length) cur += \"\\x1b[0m\";\n lines.push(cur);\n return lines.join(\"\\n\");\n}\n\n"],
|
|
5
|
-
"mappings": "AAeA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["/**\n * logs.ts \u2014 sfmc \u4E3B\u8FDB\u7A0B\u7EDF\u4E00\u65E5\u5FD7\u805A\u5408\u5C42\n *\n * \u5185\u90E8\u59D4\u6258 @sfmc-bds/logs \u5171\u4EAB\u5305\u7684 createMemoryBuffer + inferLevel,\n * \u4FDD\u6301\u5411\u540E\u517C\u5BB9\u7684 pushLog / onLog / getAllLogs / getRecentLogs API\n * (services.ts \u6355\u83B7\u5B50\u8FDB\u7A0B stdout \u540E\u8C03\u7528 pushLog \u6C47\u805A\u5230\u6B64)\u3002\n *\n * \u843D\u76D8\u7B56\u7565(\u4E0E\u5B50\u8FDB\u7A0B\u81EA\u5199\u6587\u4EF6\u5206\u5DE5,\u907F\u514D\u91CD\u590D):\n * - db / qq / update \u2192 \u5B50\u8FDB\u7A0B\u5DF2\u5199 `.sfmc/logs/{db,qq,bds-update}.log`,\u6B64\u5904\u8DF3\u8FC7\n * - bds / llbot \u2192 `.sfmc/logs/{bds,llbot}.log`(\u5916\u90E8\u8FDB\u7A0B\u65E0\u81EA\u5E26 file sink)\n * - \u5176\u4F59(system / pack / \u2026) \u2192 `.sfmc/logs/sfmc.log`\n *\n * formatLog \u4FDD\u7559 theme.ts (chalk) \u914D\u8272,\u6BD4\u5171\u4EAB\u5305\u7684\u7EAF ANSI \u7248\u672C\u89C6\u89C9\u66F4\u4E30\u5BCC\u3002\n */\n\nimport {\n createFileSink,\n createMemoryBuffer,\n formatLogLine,\n inferLevel as sharedInferLevel,\n parseBdsEmbeddedLevel,\n stripBdsLogPrefix,\n type FileSink,\n type LogEntry,\n type LogLevel as SharedLogLevel,\n} from \"@sfmc-bds/sdk/logs\";\nimport { logFile } from \"@sfmc-bds/sdk/node/config\";\nimport {\n getCompiledLogFilter,\n shouldDropForDisk,\n shouldDropForDisplay,\n} from \"./log-filter.js\";\nimport { c, highlightLogLine } from \"./theme.js\";\nimport { ROOT } from \"./runtime.js\";\n\nexport type LogLevel = SharedLogLevel;\nexport type LogSource = string;\nexport interface UnifiedLog extends LogEntry {}\n\n/** \u518D\u5BFC\u51FA SDK BDS \u89E3\u6790\uFF08\u6D4B\u8BD5\u4E0E\u8C03\u7528\u65B9\u7EDF\u4E00\u5165\u53E3\uFF0C\u6743\u5A01\u5728 @sfmc-bds/sdk/logs\uFF09 */\nexport { mapBdsLevelToken, parseBdsEmbeddedLevel, stripBdsLogPrefix } from \"@sfmc-bds/sdk/logs\";\n\nconst buffer = createMemoryBuffer(5000);\n\n/** \u5B50\u8FDB\u7A0B\u5DF2\u7528 createNodeServiceLogger \u81EA\u884C\u843D\u76D8\u7684 source */\nconst CHILD_OWNED_SOURCES = new Set([\"db\", \"qq\", \"update\"]);\n\nconst fileSinks = new Map<string, FileSink>();\n\n/** \u89E3\u6790\u672C\u6761\u65E5\u5FD7\u5E94\u5199\u5165\u7684\u6587\u4EF6\u540D(\u4E0D\u542B .log);null \u8868\u793A\u8DF3\u8FC7(\u5B50\u8FDB\u7A0B\u5DF2\u5199) */\nfunction resolveDiskLogName(source: string): string | null {\n if (CHILD_OWNED_SOURCES.has(source)) return null;\n if (source === \"bds\" || source === \"llbot\") return source;\n return \"sfmc\";\n}\n\nfunction sinkFor(source: string): FileSink | null {\n const name = resolveDiskLogName(source);\n if (!name) return null;\n let sink = fileSinks.get(name);\n if (!sink) {\n sink = createFileSink(logFile(ROOT, name));\n fileSinks.set(name, sink);\n }\n return sink;\n}\n\nprocess.on(\"exit\", () => {\n for (const sink of fileSinks.values()) sink.close();\n});\n\n/** \u63A8\u9001\u4E00\u6761\u65E5\u5FD7\u5230\u5185\u5B58\u7F13\u51B2,\u5E76\u6309\u7B56\u7565\u843D\u76D8 */\nexport function pushLog(text: string, source: LogSource, level: LogLevel): void {\n let body = text;\n let lvl = level;\n /* BDS\uFF1A\u5148\u63D0\u53D6\u5185\u5D4C\u7EA7\u522B\uFF0C\u518D\u5265\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\uFF0C\u907F\u514D\u5C55\u793A/\u843D\u76D8\u91CD\u590D */\n if (source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(text);\n if (embedded) lvl = embedded;\n body = stripBdsLogPrefix(text);\n }\n\n const entry: LogEntry = { time: new Date(), text: body, source, level: lvl };\n const filter = getCompiledLogFilter((src) => {\n /* \u907F\u514D\u9012\u5F52\uFF1A\u975E\u6CD5\u6B63\u5219\u53EA\u5199\u6587\u4EF6 sink\uFF0C\u4E0D\u7ECF pushLog */\n try {\n const sink = sinkFor(\"system\");\n if (!sink) return;\n const warn: LogEntry = {\n time: new Date(),\n text: `log-filter: invalid regex skipped: ${src}`,\n source: \"system\",\n level: \"warn\",\n };\n sink.write(warn, formatLogLine(warn, false));\n } catch {\n /* ignore */\n }\n });\n\n const dropDisplay = shouldDropForDisplay(entry, filter);\n const dropDisk = shouldDropForDisk(entry, filter);\n\n if (!dropDisplay) {\n buffer.pushDirect(body, source, lvl);\n }\n\n if (dropDisk) return;\n const sink = sinkFor(source);\n if (!sink) return;\n try {\n sink.write(entry, formatLogLine(entry, false));\n } catch {\n /* \u843D\u76D8\u5931\u8D25\u4E0D\u963B\u65AD\u4E3B\u6D41\u7A0B */\n }\n}\n\n/** \u8BA2\u9605\u65B0\u65E5\u5FD7\u4E8B\u4EF6,\u8FD4\u56DE\u53D6\u6D88\u8BA2\u9605\u51FD\u6570 */\nexport function onLog(fn: (log: UnifiedLog) => void): () => void {\n return buffer.subscribe(fn);\n}\n\n/** \u83B7\u53D6\u6700\u8FD1 n \u6761,\u53EF\u6309 level / source \u8FC7\u6EE4\uFF1B\u518D\u5957\u914D\u7F6E\u8FC7\u6EE4\uFF08display\uFF09 */\nexport function getRecentLogs(n: number, levels: LogLevel[], sources: LogSource[]): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getRecent(n, levels, sources).filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/** \u83B7\u53D6\u5168\u90E8\u65E5\u5FD7\uFF1B\u914D\u7F6E\u8FC7\u6EE4\u4EC5\u5F71\u54CD\u8FD4\u56DE\u89C6\u56FE\uFF08\u7F13\u51B2\u5185\u53EF\u80FD\u4ECD\u6709\u5168\u91CF\uFF0C\u89C6 push \u65F6 applyTo\uFF09 */\nexport function getAllLogs(): UnifiedLog[] {\n const filter = getCompiledLogFilter();\n return buffer.getAll().filter((l) => !shouldDropForDisplay(l, filter));\n}\n\n/* ==================================================================\n * \u6765\u6E90\u6807\u7B7E\u5143\u6570\u636E (\u65B9\u62EC\u53F7\u4E0E\u6587\u5B57\u540C\u8272,\u5BF9\u9F50 levelTag)\n * ================================================================== */\n\nexport interface SourceMeta {\n value: string;\n /** \u663E\u793A\u540D,\u5C3D\u91CF 8 \u5BBD\u5BF9\u9F50 */\n name: string;\n paint: (s: string) => string;\n}\n\nexport const SOURCE_META: SourceMeta[] = [\n { value: \"bds\", name: \"BDServer\", paint: (s) => c.green(s) },\n { value: \"db\", name: \"DataBase\", paint: (s) => c.blue(s) },\n { value: \"qq\", name: \"QQBridge\", paint: (s) => c.purple(s) },\n { value: \"llbot\", name: \" LL-BOT \", paint: (s) => c.yellow(s) },\n { value: \"system\", name: \" SYSTEM \", paint: (s) => c.cyan(s) },\n { value: \"update\", name: \" UPDATE \", paint: (s) => c.orange(s) },\n { value: \"pack\", name: \" PACK \", paint: (s) => c.purple(s) },\n { value: \"bds-tools\", name: \"BDSTools\", paint: (s) => c.red(s) },\n];\n\n/** \u6E90\u6807\u7B7E\u65E0\u8272\u6587\u672C\uFF08formatSourceTag / logPrefixWidth \u5171\u7528\uFF09 */\nfunction sourceTagPlain(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n if (meta) return `[${meta.name}]`;\n return `[${source.padEnd(7).slice(0, 8)}]`;\n}\n\nexport function formatSourceTag(source: string): string {\n const meta = SOURCE_META.find((m) => m.value === source);\n const plain = sourceTagPlain(source);\n if (meta) return meta.paint(plain);\n return c.bold(plain);\n}\n\n/**\n * \u5C55\u793A\u7528\u7EA7\u522B\uFF1ABDS \u82E5\u4ECD\u5E26\u65F6\u95F4\u6233\u524D\u7F00\u5219\u89E3\u6790\u5185\u5D4C\u7EA7\u522B\uFF1B\u5DF2\u5265\u79BB\uFF08pushLog \u5165\u5E93\uFF09\u5219\u4FE1\u4EFB entry.level\u3002\n * \u7981\u6B62\u5BF9\u6B63\u6587\u505A\u677E\u6563\u5173\u952E\u8BCD\u5339\u914D\uFF08\u4F1A\u628A `[Commands] Error on line` \u8BEF\u5224\u4E3A error\uFF09\u3002\n */\nexport function resolveDisplayLevel(l: UnifiedLog): LogLevel {\n if (l.source === \"bds\") {\n const embedded = parseBdsEmbeddedLevel(l.text);\n if (embedded) return embedded;\n }\n return l.level;\n}\n\n/** \u4ECE\u539F\u59CB\u6587\u672C\u63A8\u65AD\u7EA7\u522B\uFF1A\u59D4\u6258\u5171\u4EAB\u5305\uFF08\u5185\u542B BDS \u65F6\u95F4\u6233\u89E3\u6790\uFF09 */\nexport function inferLevel(text: string): LogLevel {\n return sharedInferLevel(text);\n}\n\n/** \u65E0\u8272\u7EA7\u522B\u6807\u7B7E\u6587\u672C\uFF08\u53EF\u89C1\u5BBD\u5EA6\u6743\u5A01\u6E90\uFF09 */\nconst LEVEL_TAG_TEXT: Record<LogLevel, string> = {\n error: \"[ERR]\",\n warn: \"[WRN]\",\n success: \"[OK]\",\n debug: \"[DBG]\",\n info: \"[INF]\",\n};\n\nfunction levelTagPlain(lvl: LogLevel): string {\n return LEVEL_TAG_TEXT[lvl] ?? LEVEL_TAG_TEXT.info;\n}\n\nfunction levelTag(lvl: LogLevel): string {\n const text = levelTagPlain(lvl);\n switch (lvl) {\n case \"error\":\n return c.red(text);\n case \"warn\":\n return c.yellow(text);\n case \"success\":\n return c.green(c.bold(text));\n case \"debug\":\n return c.dim(text);\n default:\n return c.blue(text);\n }\n}\n\n/** \u683C\u5F0F\u5316\u65E5\u5FD7\u7528\u4E8E REPL \u5C55\u793A (\u7528 theme.ts chalk \u914D\u8272) */\nexport function formatLog(l: UnifiedLog): string {\n const ts = c.dim(l.time.toLocaleTimeString());\n const level = resolveDisplayLevel(l);\n const lvl = levelTag(level);\n const src = formatSourceTag(l.source);\n /* BDS\uFF1A\u53BB\u6389\u81EA\u5E26\u65F6\u95F4\u6233+\u7B49\u7EA7\u524D\u7F00\u540E\u518D\u9AD8\u4EAE\u6B63\u6587\uFF08push \u65F6\u591A\u534A\u5DF2\u5265\u8FC7\uFF0C\u6B64\u5904\u5E42\u7B49\uFF09 */\n const txt = highlightLogLine(l.source === \"bds\" ? stripBdsLogPrefix(l.text) : l.text);\n return `${ts} ${src} ${lvl} ${txt}`;\n}\n\n/* ==================================================================\n * \u8F6F\u6362\u884C: \u8D85\u7EC8\u7AEF\u5BBD\u5EA6\u65F6\u6362\u884C,\u540E\u7EED\u884C\u7F29\u8FDB\u5BF9\u9F50\n * ================================================================== */\n\n/** \u5355\u4E2A\u5B57\u7B26\u5728\u7EC8\u7AEF\u7684\u663E\u793A\u5BBD\u5EA6 (CJK \u5168\u89D2=2, \u5176\u4F59=1) */\nfunction charWidth(ch: string): number {\n const cp = ch.codePointAt(0) ?? 0;\n if (\n cp >= 0x1100 &&\n (cp <= 0x115f ||\n (cp >= 0x2e80 && cp <= 0xa4cf && cp !== 0x303f) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x20000 && cp <= 0x2fffd))\n )\n return 2;\n return 1;\n}\n\n/** \u5B57\u7B26\u4E32\u5728\u7EC8\u7AEF\u7684\u53EF\u89C1\u5BBD\u5EA6 (strip ANSI \u540E\u6309 CJK \u5BBD\u5EA6\u7D2F\u52A0) */\nexport function visibleWidth(s: string): number {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) w += charWidth(ch);\n return w;\n}\n\n/**\n * \u65E5\u5FD7\u524D\u7F00\u53EF\u89C1\u5BBD\u5EA6(\u65F6\u95F4 + \u6E90 + \u7EA7\u522B + \u5C3E\u7A7A\u683C),\u4F9B\u60AC\u6302\u7F29\u8FDB\u5BF9\u9F50\u6B63\u6587\u8D77\u70B9\u3002\n * \u4E0E formatLog \u62FC\u63A5\u987A\u5E8F\u4FDD\u6301\u4E00\u81F4\uFF08\u5171\u7528 resolveDisplayLevel / sourceTagPlain / levelTagPlain\uFF09\u3002\n */\nexport function logPrefixWidth(l: UnifiedLog): number {\n const ts = l.time.toLocaleTimeString();\n const src = sourceTagPlain(l.source);\n const level = resolveDisplayLevel(l);\n return visibleWidth(`${ts} ${src} ${levelTagPlain(level)} `);\n}\n\n/**\n * \u6309\u7EC8\u7AEF\u53EF\u89C1\u5BBD\u5EA6\u6362\u884C;\u663E\u5F0F \\\\n \u4E0E\u8F6F\u6362\u884C\u7684\u540E\u7EED\u884C\u4E00\u5F8B\u5DE6\u4FA7\u7F29\u8FDB indent \u5217\u3002\n * \u4FDD\u7559 ANSI:\u6362\u884C\u65F6 reset,\u65B0\u884C\u6062\u590D\u5F53\u524D\u989C\u8272\u72B6\u6001(\u53EF\u591A\u5C42\u53E0\u52A0)\u3002\n * \u5BBD\u5B57\u7B26(CJK)\u6309 2 \u5217;cols \u9884\u7559 1 \u5217,\u907F\u514D Windows Terminal \u8FB9\u754C\u518D\u8F6F\u6298\u5230\u7B2C 0 \u5217\u3002\n */\nexport function wrapLogLine(s: string, indent: number): string {\n const rawCols = process.stdout.columns || 80;\n /* \u81F3\u5C11\u7559\u7ED9\u6B63\u6587\u82E5\u5E72\u5217,\u907F\u514D indent >= cols \u65F6\u6B7B\u5FAA\u73AF */\n const cols = Math.max(rawCols - 1, indent + 4);\n const segments = s.split(/\\r?\\n/);\n const out: string[] = [];\n for (let si = 0; si < segments.length; si++) {\n const raw = segments[si]!;\n /* \u663E\u5F0F\u6362\u884C\u6BB5\u53BB\u6389\u6587\u6848\u81EA\u5E26\u7684\u5DE6\u7A7A\u683C,\u7EDF\u4E00\u7531 hang indent \u5BF9\u9F50\u6B63\u6587 */\n const piece = si === 0 ? raw : raw.replace(/^[ \\t]+/, \"\");\n out.push(wrapSegment(piece, cols, si === 0 ? 0 : indent, indent));\n }\n return out.join(\"\\n\");\n}\n\n/** \u5355\u6BB5(\u65E0\u5185\u5D4C \\\\n)\u8F6F\u6362\u884C;startPad>0 \u8868\u793A\u672C\u6BB5\u5F00\u5934\u5DF2\u5360\u7528\u7684\u5217(\u663E\u5F0F\u6362\u884C\u540E\u7684\u60AC\u6302) */\nfunction wrapSegment(s: string, cols: number, startPad: number, hangIndent: number): string {\n if (s.length === 0) return startPad > 0 ? \" \".repeat(startPad) : \"\";\n\n const lines: string[] = [];\n let cur = startPad > 0 ? \" \".repeat(startPad) : \"\";\n let w = startPad;\n /** \u5F53\u524D\u751F\u6548\u7684 ANSI \u5F00\u7801\u6808(\u4E0D\u542B reset),\u6362\u884C\u540E\u91CD\u653E */\n const ansiStack: string[] = [];\n\n const resetIfNeeded = (): void => {\n if (ansiStack.length) cur += \"\\x1b[0m\";\n };\n const replayAnsi = (): void => {\n for (const code of ansiStack) cur += code;\n };\n\n let i = 0;\n while (i < s.length) {\n const m = /^\\x1b\\[[0-9;]*m/.exec(s.slice(i));\n if (m) {\n const code = m[0]!;\n cur += code;\n if (code === \"\\x1b[0m\") ansiStack.length = 0;\n else ansiStack.push(code);\n i += code.length;\n continue;\n }\n\n const cp = s.codePointAt(i)!;\n const ch = String.fromCodePoint(cp);\n const cw = charWidth(ch);\n const advance = ch.length;\n\n /* w > startPad:\u5F53\u524D\u884C\u9664\u5DE6\u57AB\u5916\u5DF2\u6709\u5185\u5BB9,\u53EF\u4EE5\u62C6\u884C;\u5426\u5219\u5F3A\u5236\u585E\u5165\u907F\u514D\u6B7B\u5FAA\u73AF */\n if (w + cw > cols && w > startPad) {\n resetIfNeeded();\n lines.push(cur);\n cur = \" \".repeat(hangIndent);\n replayAnsi();\n w = hangIndent;\n startPad = hangIndent;\n }\n\n cur += ch;\n w += cw;\n i += advance;\n }\n\n if (ansiStack.length) cur += \"\\x1b[0m\";\n lines.push(cur);\n return lines.join(\"\\n\");\n}\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["parseBdsEmbeddedLevel", "stripBdsLogPrefix", "sink"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curseforge.d.ts","sourceRoot":"","sources":["../../../src/pack-update/providers/curseforge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,wBAAwB,EAExB,kBAAkB,EAClB,aAAa,EACb,eAAe,EAChB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"curseforge.d.ts","sourceRoot":"","sources":["../../../src/pack-update/providers/curseforge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,wBAAwB,EAExB,kBAAkB,EAClB,aAAa,EACb,eAAe,EAChB,MAAM,aAAa,CAAC;AAyDrB,qBAAa,yBAA0B,YAAW,kBAAkB;IAItD,OAAO,CAAC,QAAQ,CAAC,GAAG;IAHhC,QAAQ,CAAC,EAAE,EAAG,YAAY,CAAU;IACpC,OAAO,CAAC,YAAY,CAAuB;IAE3C,YAA6B,GAAG,EAAE,wBAAwB,EAAI;IAE9D,YAAY,IAAI,OAAO,CAEtB;IAED,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,QAAQ;YAaF,SAAS;IA4BvB,sBAAsB;IACtB,OAAO,CAAC,MAAM;IAUR,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB7C;IAEK,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA0BtD;IAEK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAa1E;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6DpE;IAEK,QAAQ,CACZ,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/C,OAAO,CAAC,IAAI,CAAC,CAiBf;CACF"}
|