hazo_logs 1.1.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -4
- package/config/hazo_logs_config.ini.sample +2 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/alert-triggers.d.ts +54 -0
- package/dist/lib/alert-triggers.d.ts.map +1 -0
- package/dist/lib/alert-triggers.js +96 -0
- package/dist/lib/alert-triggers.js.map +1 -0
- package/dist/lib/config_loader.d.ts.map +1 -1
- package/dist/lib/config_loader.js +1 -7
- package/dist/lib/config_loader.js.map +1 -1
- package/dist/lib/console-logger.d.ts +17 -1
- package/dist/lib/console-logger.d.ts.map +1 -1
- package/dist/lib/console-logger.js +47 -4
- package/dist/lib/console-logger.js.map +1 -1
- package/dist/lib/context/log-context.d.ts.map +1 -1
- package/dist/lib/context/log-context.js +4 -0
- package/dist/lib/context/log-context.js.map +1 -1
- package/dist/lib/eslint_plugin/index.d.ts +109 -0
- package/dist/lib/eslint_plugin/index.d.ts.map +1 -0
- package/dist/lib/eslint_plugin/index.js +168 -0
- package/dist/lib/eslint_plugin/index.js.map +1 -0
- package/dist/lib/global-error-handlers.d.ts +23 -0
- package/dist/lib/global-error-handlers.d.ts.map +1 -0
- package/dist/lib/global-error-handlers.js +46 -0
- package/dist/lib/global-error-handlers.js.map +1 -0
- package/dist/lib/hazo_logger.d.ts +9 -0
- package/dist/lib/hazo_logger.d.ts.map +1 -1
- package/dist/lib/hazo_logger.js +32 -0
- package/dist/lib/hazo_logger.js.map +1 -1
- package/dist/lib/level_resolver.d.ts +26 -0
- package/dist/lib/level_resolver.d.ts.map +1 -0
- package/dist/lib/level_resolver.js +65 -0
- package/dist/lib/level_resolver.js.map +1 -0
- package/dist/lib/log-reader.d.ts.map +1 -1
- package/dist/lib/log-reader.js +6 -4
- package/dist/lib/log-reader.js.map +1 -1
- package/dist/lib/package_logger.d.ts +47 -3
- package/dist/lib/package_logger.d.ts.map +1 -1
- package/dist/lib/package_logger.js +196 -10
- package/dist/lib/package_logger.js.map +1 -1
- package/dist/lib/ring_buffer.d.ts +51 -0
- package/dist/lib/ring_buffer.d.ts.map +1 -0
- package/dist/lib/ring_buffer.js +107 -0
- package/dist/lib/ring_buffer.js.map +1 -0
- package/dist/lib/types.d.ts +57 -24
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/universal-logger.d.ts.map +1 -1
- package/dist/lib/universal-logger.js +18 -0
- package/dist/lib/universal-logger.js.map +1 -1
- package/dist/lib/utils/caller_info.d.ts +25 -1
- package/dist/lib/utils/caller_info.d.ts.map +1 -1
- package/dist/lib/utils/caller_info.js +62 -1
- package/dist/lib/utils/caller_info.js.map +1 -1
- package/dist/lib/with-error-handler.d.ts +19 -0
- package/dist/lib/with-error-handler.d.ts.map +1 -0
- package/dist/lib/with-error-handler.js +77 -0
- package/dist/lib/with-error-handler.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -1
- package/dist/ui/components/ErrorBoundary.d.ts +44 -0
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/ui/components/ErrorBoundary.js +57 -0
- package/dist/ui/components/ErrorBoundary.js.map +1 -0
- package/dist/ui/components/LogLevelBadge.d.ts.map +1 -1
- package/dist/ui/components/LogLevelBadge.js +1 -0
- package/dist/ui/components/LogLevelBadge.js.map +1 -1
- package/dist/ui/hooks/useErrorReporter.d.ts +16 -0
- package/dist/ui/hooks/useErrorReporter.d.ts.map +1 -0
- package/dist/ui/hooks/useErrorReporter.js +56 -0
- package/dist/ui/hooks/useErrorReporter.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -1
- package/package.json +19 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-context.d.ts","sourceRoot":"","sources":["../../../src/lib/context/log-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAwCtD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAeH;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"log-context.d.ts","sourceRoot":"","sources":["../../../src/lib/context/log-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAwCtD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAM1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAeH;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAChD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAeZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAgBxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,UAAU,EACnB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAGtD;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEnF"}
|
|
@@ -113,6 +113,8 @@ export function runWithLogContext(context, fn) {
|
|
|
113
113
|
// Use provided values or inherit from parent
|
|
114
114
|
sessionId: context.sessionId ?? parentContext?.sessionId,
|
|
115
115
|
reference: context.reference ?? parentContext?.reference,
|
|
116
|
+
userId: context.userId ?? parentContext?.userId,
|
|
117
|
+
scope: context.scope ?? parentContext?.scope,
|
|
116
118
|
// Auto-increment depth
|
|
117
119
|
depth: parentDepth + 1,
|
|
118
120
|
};
|
|
@@ -135,6 +137,8 @@ export function runWithLogContextAsync(context, fn) {
|
|
|
135
137
|
const newContext = {
|
|
136
138
|
sessionId: context.sessionId ?? parentContext?.sessionId,
|
|
137
139
|
reference: context.reference ?? parentContext?.reference,
|
|
140
|
+
userId: context.userId ?? parentContext?.userId,
|
|
141
|
+
scope: context.scope ?? parentContext?.scope,
|
|
138
142
|
depth: parentDepth + 1,
|
|
139
143
|
};
|
|
140
144
|
return logContextStorage.run(newContext, fn);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-context.js","sourceRoot":"","sources":["../../../src/lib/context/log-context.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log-context.js","sourceRoot":"","sources":["../../../src/lib/context/log-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo-logs ESLint plugin
|
|
3
|
+
*
|
|
4
|
+
* Provides 3 rules that enforce the structured-first log API from design spec §2.5.
|
|
5
|
+
*
|
|
6
|
+
* Usage (flat-config):
|
|
7
|
+
* import { plugin as hazoLogsPlugin } from 'hazo_logs/eslint-plugin';
|
|
8
|
+
*
|
|
9
|
+
* export default [
|
|
10
|
+
* {
|
|
11
|
+
* plugins: { 'hazo-logs': hazoLogsPlugin },
|
|
12
|
+
* rules: {
|
|
13
|
+
* ...hazoLogsPlugin.configs.recommended.rules,
|
|
14
|
+
* },
|
|
15
|
+
* },
|
|
16
|
+
* ];
|
|
17
|
+
*/
|
|
18
|
+
interface Node {
|
|
19
|
+
type: string;
|
|
20
|
+
}
|
|
21
|
+
interface MemberExpression extends Node {
|
|
22
|
+
type: 'MemberExpression';
|
|
23
|
+
computed: boolean;
|
|
24
|
+
property: Node;
|
|
25
|
+
}
|
|
26
|
+
interface CallExpressionNode extends Node {
|
|
27
|
+
type: 'CallExpression';
|
|
28
|
+
callee: MemberExpression & Node;
|
|
29
|
+
arguments: Node[];
|
|
30
|
+
}
|
|
31
|
+
export declare const plugin: {
|
|
32
|
+
rules: {
|
|
33
|
+
'no-template-message': {
|
|
34
|
+
meta: {
|
|
35
|
+
type: "suggestion";
|
|
36
|
+
docs: {
|
|
37
|
+
description: string;
|
|
38
|
+
recommended: boolean;
|
|
39
|
+
};
|
|
40
|
+
schema: never[];
|
|
41
|
+
messages: {
|
|
42
|
+
noTemplate: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
create(context: {
|
|
46
|
+
report(opts: {
|
|
47
|
+
node: Node;
|
|
48
|
+
messageId: string;
|
|
49
|
+
}): void;
|
|
50
|
+
}): {
|
|
51
|
+
CallExpression(node: CallExpressionNode): void;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
'no-string-concat-message': {
|
|
55
|
+
meta: {
|
|
56
|
+
type: "suggestion";
|
|
57
|
+
docs: {
|
|
58
|
+
description: string;
|
|
59
|
+
recommended: boolean;
|
|
60
|
+
};
|
|
61
|
+
schema: never[];
|
|
62
|
+
messages: {
|
|
63
|
+
noConcat: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
create(context: {
|
|
67
|
+
report(opts: {
|
|
68
|
+
node: Node;
|
|
69
|
+
messageId: string;
|
|
70
|
+
}): void;
|
|
71
|
+
}): {
|
|
72
|
+
CallExpression(node: CallExpressionNode): void;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
'event-name-format': {
|
|
76
|
+
meta: {
|
|
77
|
+
type: "suggestion";
|
|
78
|
+
docs: {
|
|
79
|
+
description: string;
|
|
80
|
+
recommended: boolean;
|
|
81
|
+
};
|
|
82
|
+
schema: never[];
|
|
83
|
+
messages: {
|
|
84
|
+
sentenceCase: string;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
create(context: {
|
|
88
|
+
report(opts: {
|
|
89
|
+
node: Node;
|
|
90
|
+
messageId: string;
|
|
91
|
+
data?: Record<string, string>;
|
|
92
|
+
}): void;
|
|
93
|
+
}): {
|
|
94
|
+
CallExpression(node: CallExpressionNode): void;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
configs: {
|
|
99
|
+
recommended: {
|
|
100
|
+
rules: {
|
|
101
|
+
'hazo-logs/no-template-message': string;
|
|
102
|
+
'hazo-logs/no-string-concat-message': string;
|
|
103
|
+
'hazo-logs/event-name-format': string;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
export default plugin;
|
|
109
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/eslint_plugin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAuBH,UAAU,IAAI;IAAG,IAAI,EAAE,MAAM,CAAA;CAAE;AAK/B,UAAU,gBAAiB,SAAQ,IAAI;IAAG,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE;AACvG,UAAU,kBAAmB,SAAQ,IAAI;IAAG,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,EAAE,CAAA;CAAE;AAiIxH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;4BA5GD;gBAAE,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,EAAE,IAAI,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE;qCAEhD,kBAAkB;;;;;;;;;;;;;;;4BA4C3B;gBAAE,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,EAAE,IAAI,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE;qCAEhD,kBAAkB;;;;;;;;;;;;;;;4BAqC3B;gBAAE,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,EAAE,IAAI,CAAC;oBAAC,SAAS,EAAE,MAAM,CAAC;oBAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;iBAAE,GAAG,IAAI,CAAA;aAAE;qCAE/E,kBAAkB;;;;;;;;;;;;;CAoC5C,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hazo-logs ESLint plugin
|
|
3
|
+
*
|
|
4
|
+
* Provides 3 rules that enforce the structured-first log API from design spec §2.5.
|
|
5
|
+
*
|
|
6
|
+
* Usage (flat-config):
|
|
7
|
+
* import { plugin as hazoLogsPlugin } from 'hazo_logs/eslint-plugin';
|
|
8
|
+
*
|
|
9
|
+
* export default [
|
|
10
|
+
* {
|
|
11
|
+
* plugins: { 'hazo-logs': hazoLogsPlugin },
|
|
12
|
+
* rules: {
|
|
13
|
+
* ...hazoLogsPlugin.configs.recommended.rules,
|
|
14
|
+
* },
|
|
15
|
+
* },
|
|
16
|
+
* ];
|
|
17
|
+
*/
|
|
18
|
+
// ─── Shared helpers ───────────────────────────────────────────────────────────
|
|
19
|
+
/** The log method names we care about */
|
|
20
|
+
const LOG_METHODS = new Set(['trace', 'debug', 'info', 'warn', 'error', 'fatal']);
|
|
21
|
+
/**
|
|
22
|
+
* Returns true when the call expression is a log method call:
|
|
23
|
+
* log.info(...) logger.warn(...) this.log.debug(...)
|
|
24
|
+
*/
|
|
25
|
+
function isLogCall(node) {
|
|
26
|
+
if (node.callee.type !== 'MemberExpression')
|
|
27
|
+
return false;
|
|
28
|
+
const prop = node.callee.property;
|
|
29
|
+
return (!node.callee.computed &&
|
|
30
|
+
prop.type === 'Identifier' &&
|
|
31
|
+
LOG_METHODS.has(prop.name));
|
|
32
|
+
}
|
|
33
|
+
// ─── Rule: no-template-message ────────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Flags: log.info(`User ${id} did something`)
|
|
36
|
+
* Template literals with embedded expressions in the first arg of a log call.
|
|
37
|
+
*/
|
|
38
|
+
const noTemplateMessage = {
|
|
39
|
+
meta: {
|
|
40
|
+
type: 'suggestion',
|
|
41
|
+
docs: {
|
|
42
|
+
description: 'Disallow template literals with expressions as log message argument',
|
|
43
|
+
recommended: true,
|
|
44
|
+
},
|
|
45
|
+
schema: [],
|
|
46
|
+
messages: {
|
|
47
|
+
noTemplate: 'Log message should be a plain string event name (e.g. "user.logged_in"), not a template literal with interpolations. Put variable data in the second argument (fields).',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
create(context) {
|
|
51
|
+
return {
|
|
52
|
+
CallExpression(node) {
|
|
53
|
+
if (!isLogCall(node))
|
|
54
|
+
return;
|
|
55
|
+
const firstArg = node.arguments[0];
|
|
56
|
+
if (!firstArg)
|
|
57
|
+
return;
|
|
58
|
+
if (firstArg.type === 'TemplateLiteral' &&
|
|
59
|
+
firstArg.expressions.length > 0) {
|
|
60
|
+
context.report({ node: firstArg, messageId: 'noTemplate' });
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
// ─── Rule: no-string-concat-message ──────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* Flags: log.info('User ' + userId + ' logged in')
|
|
69
|
+
* Binary `+` expressions anywhere in the first arg.
|
|
70
|
+
*/
|
|
71
|
+
function containsStringConcat(node) {
|
|
72
|
+
if (node.type !== 'BinaryExpression')
|
|
73
|
+
return false;
|
|
74
|
+
const bin = node;
|
|
75
|
+
return (bin.operator === '+' ||
|
|
76
|
+
containsStringConcat(bin.left) ||
|
|
77
|
+
containsStringConcat(bin.right));
|
|
78
|
+
}
|
|
79
|
+
const noStringConcatMessage = {
|
|
80
|
+
meta: {
|
|
81
|
+
type: 'suggestion',
|
|
82
|
+
docs: {
|
|
83
|
+
description: 'Disallow string concatenation in log message argument',
|
|
84
|
+
recommended: true,
|
|
85
|
+
},
|
|
86
|
+
schema: [],
|
|
87
|
+
messages: {
|
|
88
|
+
noConcat: 'Log message should be a plain string event name, not a concatenated string. Put variable data in the second argument (fields).',
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
create(context) {
|
|
92
|
+
return {
|
|
93
|
+
CallExpression(node) {
|
|
94
|
+
if (!isLogCall(node))
|
|
95
|
+
return;
|
|
96
|
+
const firstArg = node.arguments[0];
|
|
97
|
+
if (!firstArg)
|
|
98
|
+
return;
|
|
99
|
+
if (containsStringConcat(firstArg)) {
|
|
100
|
+
context.report({ node: firstArg, messageId: 'noConcat' });
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
// ─── Rule: event-name-format ──────────────────────────────────────────────────
|
|
107
|
+
/**
|
|
108
|
+
* Flags: log.info('File was uploaded successfully')
|
|
109
|
+
* Sentence-case strings (starts with uppercase, contains spaces) are likely
|
|
110
|
+
* free-form sentences rather than structured event names.
|
|
111
|
+
*
|
|
112
|
+
* Allowed: 'file.uploaded', 'db.slow', 'request.headers'
|
|
113
|
+
* Flagged: 'File was uploaded', 'Polling channels'
|
|
114
|
+
*/
|
|
115
|
+
const SENTENCE_CASE_RE = /^[A-Z][a-z].*\s/;
|
|
116
|
+
const eventNameFormat = {
|
|
117
|
+
meta: {
|
|
118
|
+
type: 'suggestion',
|
|
119
|
+
docs: {
|
|
120
|
+
description: 'Log message should be a dotted lowercase event name, not a sentence',
|
|
121
|
+
recommended: true,
|
|
122
|
+
},
|
|
123
|
+
schema: [],
|
|
124
|
+
messages: {
|
|
125
|
+
sentenceCase: 'Log message looks like a sentence ("{{value}}"). Prefer a dotted lowercase event name (e.g. "file.uploaded") so it is grep-friendly and structured.',
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
create(context) {
|
|
129
|
+
return {
|
|
130
|
+
CallExpression(node) {
|
|
131
|
+
if (!isLogCall(node))
|
|
132
|
+
return;
|
|
133
|
+
const firstArg = node.arguments[0];
|
|
134
|
+
if (!firstArg)
|
|
135
|
+
return;
|
|
136
|
+
if (firstArg.type === 'Literal') {
|
|
137
|
+
const value = firstArg.value;
|
|
138
|
+
if (typeof value === 'string' && SENTENCE_CASE_RE.test(value)) {
|
|
139
|
+
context.report({
|
|
140
|
+
node: firstArg,
|
|
141
|
+
messageId: 'sentenceCase',
|
|
142
|
+
data: { value: value.slice(0, 40) },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
// ─── Plugin export ────────────────────────────────────────────────────────────
|
|
151
|
+
export const plugin = {
|
|
152
|
+
rules: {
|
|
153
|
+
'no-template-message': noTemplateMessage,
|
|
154
|
+
'no-string-concat-message': noStringConcatMessage,
|
|
155
|
+
'event-name-format': eventNameFormat,
|
|
156
|
+
},
|
|
157
|
+
configs: {
|
|
158
|
+
recommended: {
|
|
159
|
+
rules: {
|
|
160
|
+
'hazo-logs/no-template-message': 'warn',
|
|
161
|
+
'hazo-logs/no-string-concat-message': 'warn',
|
|
162
|
+
'hazo-logs/event-name-format': 'warn',
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
export default plugin;
|
|
168
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/eslint_plugin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* installGlobalErrorHandlers — installs process-level error catchers.
|
|
3
|
+
*
|
|
4
|
+
* Behaviour:
|
|
5
|
+
* - Intercepts unhandledRejection + uncaughtException
|
|
6
|
+
* - Logs each at 'fatal' with a synthetic correlationId
|
|
7
|
+
* - Calls onFatal callback (if provided) before exit
|
|
8
|
+
* - Waits FLUSH_DELAY_MS for log writes to complete, then exits with code 1
|
|
9
|
+
* - exitOnUncaught: false skips the exit (useful when a process supervisor manages restart)
|
|
10
|
+
*
|
|
11
|
+
* Call once at process startup, before any other code.
|
|
12
|
+
*/
|
|
13
|
+
export interface GlobalErrorHandlerOptions {
|
|
14
|
+
/** Called with the error just before process.exit — use for escalation (PagerDuty etc.) */
|
|
15
|
+
onFatal?: (err: Error) => void | Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Whether to call process.exit(1) after flushing.
|
|
18
|
+
* Default: true. Set to false if your process supervisor manages restart.
|
|
19
|
+
*/
|
|
20
|
+
exitOnUncaught?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function installGlobalErrorHandlers(options?: GlobalErrorHandlerOptions): void;
|
|
23
|
+
//# sourceMappingURL=global-error-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-error-handlers.d.ts","sourceRoot":"","sources":["../../src/lib/global-error-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,yBAAyB;IACxC,2FAA2F;IAC3F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA6BD,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,yBAA8B,GAAG,IAAI,CASxF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* installGlobalErrorHandlers — installs process-level error catchers.
|
|
3
|
+
*
|
|
4
|
+
* Behaviour:
|
|
5
|
+
* - Intercepts unhandledRejection + uncaughtException
|
|
6
|
+
* - Logs each at 'fatal' with a synthetic correlationId
|
|
7
|
+
* - Calls onFatal callback (if provided) before exit
|
|
8
|
+
* - Waits FLUSH_DELAY_MS for log writes to complete, then exits with code 1
|
|
9
|
+
* - exitOnUncaught: false skips the exit (useful when a process supervisor manages restart)
|
|
10
|
+
*
|
|
11
|
+
* Call once at process startup, before any other code.
|
|
12
|
+
*/
|
|
13
|
+
import { generateRequestId } from 'hazo_core';
|
|
14
|
+
import { createLogger } from './package_logger.js';
|
|
15
|
+
const logger = createLogger('hazo_logs.globalHandlers');
|
|
16
|
+
const FLUSH_DELAY_MS = 500;
|
|
17
|
+
async function handleFatal(err, source, options) {
|
|
18
|
+
const correlationId = generateRequestId();
|
|
19
|
+
logger.fatal(`[${source}] ${err.message}`, {
|
|
20
|
+
correlationId,
|
|
21
|
+
source,
|
|
22
|
+
name: err.name,
|
|
23
|
+
stack: err.stack,
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
await options.onFatal?.(err);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// onFatal must never crash the crash handler
|
|
30
|
+
}
|
|
31
|
+
if (options.exitOnUncaught !== false) {
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}, FLUSH_DELAY_MS);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function installGlobalErrorHandlers(options = {}) {
|
|
38
|
+
process.on('unhandledRejection', (reason) => {
|
|
39
|
+
const err = reason instanceof Error ? reason : new Error(String(reason));
|
|
40
|
+
void handleFatal(err, 'unhandledRejection', options);
|
|
41
|
+
});
|
|
42
|
+
process.on('uncaughtException', (err) => {
|
|
43
|
+
void handleFatal(err, 'uncaughtException', options);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=global-error-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-error-handlers.js","sourceRoot":"","sources":["../../src/lib/global-error-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;AAExD,MAAM,cAAc,GAAG,GAAG,CAAC;AAY3B,KAAK,UAAU,WAAW,CACxB,GAAU,EACV,MAAkD,EAClD,OAAkC;IAElC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE;QACzC,aAAa;QACb,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QACrC,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,cAAc,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAAqC,EAAE;IAChF,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,WAAW,CAAC,GAAG,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,KAAK,WAAW,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -17,6 +17,15 @@ export declare class HazoLogger {
|
|
|
17
17
|
private winstonLogger;
|
|
18
18
|
private config;
|
|
19
19
|
private executionId;
|
|
20
|
+
/** Log hooks — called synchronously after every log() call */
|
|
21
|
+
private static logHooks;
|
|
22
|
+
/**
|
|
23
|
+
* Register a hook that fires after every log entry is written.
|
|
24
|
+
* Returns an unregister function — call it to remove the hook.
|
|
25
|
+
*
|
|
26
|
+
* Used by registerAlertTrigger internally.
|
|
27
|
+
*/
|
|
28
|
+
static addLogHook(fn: (entry: LogEntry) => void): () => void;
|
|
20
29
|
private constructor();
|
|
21
30
|
/**
|
|
22
31
|
* Generate a human-readable execution ID
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazo_logger.d.ts","sourceRoot":"","sources":["../../src/lib/hazo_logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAY,MAAM,YAAY,CAAC;AAUpE;;;GAGG;AACH,iBAAe,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB/C;
|
|
1
|
+
{"version":3,"file":"hazo_logger.d.ts","sourceRoot":"","sources":["../../src/lib/hazo_logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAY,MAAM,YAAY,CAAC;AAUpE;;;GAGG;AACH,iBAAe,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB/C;AAYD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAoC;IAClE,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAE5B,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAE/D;;;;;OAKG;WACW,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAOnE,OAAO;IASP;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;;OAGG;WACiB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkB9E;;;;OAIG;WACW,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU;IAgB1D;;OAEG;WACW,KAAK,IAAI,IAAI;IAS3B;;OAEG;IACI,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAUjC;;;OAGG;IACI,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC,GAAG,IAAI;IAclF;;OAEG;IACI,SAAS,IAAI,aAAa;IAIjC;;OAEG;IACI,cAAc,IAAI,MAAM;IAI/B,OAAO,CAAC,mBAAmB;CAqB5B;AAGD,OAAO,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,CAAC"}
|
package/dist/lib/hazo_logger.js
CHANGED
|
@@ -40,12 +40,35 @@ async function loadDependencies() {
|
|
|
40
40
|
})();
|
|
41
41
|
return loadPromise;
|
|
42
42
|
}
|
|
43
|
+
/** Winston numeric levels — lower = more severe. fatal sits above error. */
|
|
44
|
+
const HAZO_WINSTON_LEVELS = {
|
|
45
|
+
fatal: 0,
|
|
46
|
+
error: 1,
|
|
47
|
+
warn: 2,
|
|
48
|
+
info: 3,
|
|
49
|
+
debug: 4,
|
|
50
|
+
trace: 5,
|
|
51
|
+
};
|
|
43
52
|
export class HazoLogger {
|
|
44
53
|
static instance = null;
|
|
45
54
|
static instancePromise = null;
|
|
46
55
|
winstonLogger;
|
|
47
56
|
config;
|
|
48
57
|
executionId;
|
|
58
|
+
/** Log hooks — called synchronously after every log() call */
|
|
59
|
+
static logHooks = [];
|
|
60
|
+
/**
|
|
61
|
+
* Register a hook that fires after every log entry is written.
|
|
62
|
+
* Returns an unregister function — call it to remove the hook.
|
|
63
|
+
*
|
|
64
|
+
* Used by registerAlertTrigger internally.
|
|
65
|
+
*/
|
|
66
|
+
static addLogHook(fn) {
|
|
67
|
+
HazoLogger.logHooks.push(fn);
|
|
68
|
+
return () => {
|
|
69
|
+
HazoLogger.logHooks = HazoLogger.logHooks.filter((h) => h !== fn);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
49
72
|
constructor(configPath) {
|
|
50
73
|
if (!dependenciesLoaded || !loadConfigFn) {
|
|
51
74
|
throw new Error('[hazo_logs] Dependencies not loaded. Use HazoLogger.getInstanceAsync() instead.');
|
|
@@ -108,6 +131,7 @@ export class HazoLogger {
|
|
|
108
131
|
HazoLogger.instance = null;
|
|
109
132
|
HazoLogger.instancePromise = null;
|
|
110
133
|
}
|
|
134
|
+
HazoLogger.logHooks = [];
|
|
111
135
|
}
|
|
112
136
|
/**
|
|
113
137
|
* Log an entry - called by PackageLogger
|
|
@@ -117,6 +141,13 @@ export class HazoLogger {
|
|
|
117
141
|
return;
|
|
118
142
|
const { level, message, ...meta } = entry;
|
|
119
143
|
this.winstonLogger.log(level, message, meta);
|
|
144
|
+
// Fire registered hooks (e.g. alert triggers) — void, never block logging
|
|
145
|
+
HazoLogger.logHooks.forEach((fn) => {
|
|
146
|
+
try {
|
|
147
|
+
fn(entry);
|
|
148
|
+
}
|
|
149
|
+
catch { /* hooks must not crash the logger */ }
|
|
150
|
+
});
|
|
120
151
|
}
|
|
121
152
|
/**
|
|
122
153
|
* Log a client-side entry - called by API handler
|
|
@@ -160,6 +191,7 @@ export class HazoLogger {
|
|
|
160
191
|
transports.push(createFileTransportFn(this.config));
|
|
161
192
|
}
|
|
162
193
|
return winston.createLogger({
|
|
194
|
+
levels: HAZO_WINSTON_LEVELS,
|
|
163
195
|
level: this.config.log_level,
|
|
164
196
|
transports,
|
|
165
197
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hazo_logger.js","sourceRoot":"","sources":["../../src/lib/hazo_logger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hazo_logger.js","sourceRoot":"","sources":["../../src/lib/hazo_logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LevelResolver — resolves the effective log level for a given namespace.
|
|
3
|
+
*
|
|
4
|
+
* Precedence (highest wins):
|
|
5
|
+
* 1. Exact match: overrides['hazo_chat/poll']
|
|
6
|
+
* 2. Prefix match (/): overrides['hazo_chat/'] (matches hazo_chat/* sub-namespaces)
|
|
7
|
+
* 3. Package-level: overrides['hazo_chat'] (matches hazo_chat and any sub-namespace)
|
|
8
|
+
* 4. Default: this.defaultLevel
|
|
9
|
+
*/
|
|
10
|
+
import type { ConfigLogLevel, Logger } from './types.js';
|
|
11
|
+
export type OverrideMap = Record<string, ConfigLogLevel>;
|
|
12
|
+
export declare class LevelResolver {
|
|
13
|
+
private readonly defaultLevel;
|
|
14
|
+
private readonly overrides;
|
|
15
|
+
constructor(defaultLevel: ConfigLogLevel, overrides?: OverrideMap);
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the effective level for a given namespace.
|
|
18
|
+
*/
|
|
19
|
+
resolve(namespace: string): ConfigLogLevel;
|
|
20
|
+
/**
|
|
21
|
+
* Log the resolved levels for all registered namespaces.
|
|
22
|
+
* Called once at process start so the effective configuration is visible in the log.
|
|
23
|
+
*/
|
|
24
|
+
logResolvedLevels(logger: Pick<Logger, 'info'>): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=level_resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"level_resolver.d.ts","sourceRoot":"","sources":["../../src/lib/level_resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAEzD,qBAAa,aAAa;IAEtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,YAAY,EAAE,cAAc,EAC5B,SAAS,GAAE,WAAgB;IAG9C;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IA0B1C;;;OAGG;IACH,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;CAoBtD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LevelResolver — resolves the effective log level for a given namespace.
|
|
3
|
+
*
|
|
4
|
+
* Precedence (highest wins):
|
|
5
|
+
* 1. Exact match: overrides['hazo_chat/poll']
|
|
6
|
+
* 2. Prefix match (/): overrides['hazo_chat/'] (matches hazo_chat/* sub-namespaces)
|
|
7
|
+
* 3. Package-level: overrides['hazo_chat'] (matches hazo_chat and any sub-namespace)
|
|
8
|
+
* 4. Default: this.defaultLevel
|
|
9
|
+
*/
|
|
10
|
+
export class LevelResolver {
|
|
11
|
+
defaultLevel;
|
|
12
|
+
overrides;
|
|
13
|
+
constructor(defaultLevel, overrides = {}) {
|
|
14
|
+
this.defaultLevel = defaultLevel;
|
|
15
|
+
this.overrides = overrides;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the effective level for a given namespace.
|
|
19
|
+
*/
|
|
20
|
+
resolve(namespace) {
|
|
21
|
+
// 1. Exact match
|
|
22
|
+
if (Object.prototype.hasOwnProperty.call(this.overrides, namespace)) {
|
|
23
|
+
return this.overrides[namespace];
|
|
24
|
+
}
|
|
25
|
+
// 2. Prefix match with trailing /
|
|
26
|
+
// e.g. override key 'hazo_chat/' matches namespace 'hazo_chat/poll'
|
|
27
|
+
for (const key of Object.keys(this.overrides)) {
|
|
28
|
+
if (key.endsWith('/') && namespace.startsWith(key)) {
|
|
29
|
+
return this.overrides[key];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 3. Package-level match
|
|
33
|
+
// e.g. override key 'hazo_chat' matches 'hazo_chat' and 'hazo_chat/poll'
|
|
34
|
+
for (const key of Object.keys(this.overrides)) {
|
|
35
|
+
if (!key.endsWith('/') && (namespace === key || namespace.startsWith(key + '/'))) {
|
|
36
|
+
return this.overrides[key];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// 4. Default
|
|
40
|
+
return this.defaultLevel;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Log the resolved levels for all registered namespaces.
|
|
44
|
+
* Called once at process start so the effective configuration is visible in the log.
|
|
45
|
+
*/
|
|
46
|
+
logResolvedLevels(logger) {
|
|
47
|
+
const namespaces = Object.keys(this.overrides);
|
|
48
|
+
if (namespaces.length === 0) {
|
|
49
|
+
logger.info('log.level.resolved', {
|
|
50
|
+
default: this.defaultLevel,
|
|
51
|
+
overrides: 0,
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const resolved = {};
|
|
56
|
+
for (const ns of namespaces) {
|
|
57
|
+
resolved[ns] = this.resolve(ns);
|
|
58
|
+
}
|
|
59
|
+
logger.info('log.level.resolved', {
|
|
60
|
+
default: this.defaultLevel,
|
|
61
|
+
overrides: resolved,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=level_resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"level_resolver.js","sourceRoot":"","sources":["../../src/lib/level_resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,YAA4B,EAC5B,YAAyB,EAAE;QAD3B,iBAAY,GAAZ,YAAY,CAAgB;QAC5B,cAAS,GAAT,SAAS,CAAkB;IAC3C,CAAC;IAEJ;;OAEG;IACH,OAAO,CAAC,SAAiB;QACvB,iBAAiB;QACjB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAED,kCAAkC;QAClC,uEAAuE;QACvE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,4EAA4E;QAC5E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,aAAa;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,MAA4B;QAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBAChC,OAAO,EAAE,IAAI,CAAC,YAAY;gBAC1B,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAChC,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-reader.d.ts","sourceRoot":"","sources":["../../src/lib/log-reader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhE,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IACvF,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"log-reader.d.ts","sourceRoot":"","sources":["../../src/lib/log-reader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhE,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IACvF,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgDrF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnF;AAgCD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,CAAC,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,CAAC,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,CAAC,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,CAAC,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB"}
|