@hydranium/protocol 1.0.0-next.353 → 1.0.0-next.356
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/abstract-logger.d.ts +6 -0
- package/lib/abstract-logger.d.ts.map +1 -1
- package/lib/abstract-logger.js +9 -0
- package/lib/abstract-logger.js.map +1 -1
- package/lib/format-log-arg.d.ts +33 -0
- package/lib/format-log-arg.d.ts.map +1 -0
- package/lib/format-log-arg.js +158 -0
- package/lib/format-log-arg.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/src/abstract-logger.ts +10 -0
- package/src/format-log-arg.ts +176 -0
- package/src/index.ts +1 -0
package/lib/abstract-logger.d.ts
CHANGED
|
@@ -40,6 +40,12 @@ export declare abstract class AbstractLogger implements Logger {
|
|
|
40
40
|
* with. The label is padded to the widest, so timestamps line up across sinks.
|
|
41
41
|
*/
|
|
42
42
|
protected formatLinePrefix(label: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* One log argument as the text a sink appends to its line; {@link formatLogArg}
|
|
45
|
+
* by default. `ConsoleLogger` hands its arguments to the console instead.
|
|
46
|
+
* Never throws, since a log call that throws loses the line.
|
|
47
|
+
*/
|
|
48
|
+
protected formatArg(arg: unknown): string;
|
|
43
49
|
error(message?: string, ...args: unknown[]): this;
|
|
44
50
|
warn(message?: string, ...args: unknown[]): this;
|
|
45
51
|
info(message?: string, ...args: unknown[]): this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-logger.d.ts","sourceRoot":"","sources":["../src/abstract-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"abstract-logger.d.ts","sourceRoot":"","sources":["../src/abstract-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAElF,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,SAAS,CAAC;AAElD,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAK1F;;;;;;;;;;;;GAYG;AACH,8BAAsB,cAAe,YAAW,MAAM;IACvC,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM;IAAxC,YAAsB,SAAS,CAAC,EAAE,MAAM,YAAA,EAAI;IAE5C;;;;;;;OAOG;IACH,SAAS,CAAC,KAAK,IAAI,KAAK,CAEvB;IAED,2FAA2F;IAC3F,SAAS,CAAC,SAAS,IAAI,MAAM,CAE5B;IAED;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;IAED;;;;OAIG;IACH,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAExC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAGhD;IACD,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAG/C;IACD,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAG/C;IACD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAGhD;IACD,uFAAuF;IACvF,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAGhD;IACD,4EAA4E;IAC5E,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAG9C;IAED,+EAA+E;IAC/E,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKpD;IAED,qDAAqD;IACrD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3B;IAED,uFAAuF;IACvF,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3B;IAED,kFAAkF;IAClF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzB;IAED,yFAAyF;IACzF,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,OAAO,EAAO,EAAE,KAAK,SAAsB,GAAG,IAAI,CAKlH;IAED,gGAAgG;IAChG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAAC;IAEzG,qFAAqF;IACrF,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD"}
|
package/lib/abstract-logger.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.AbstractLogger = void 0;
|
|
12
12
|
const clock_1 = require("./clock");
|
|
13
|
+
const format_log_arg_1 = require("./format-log-arg");
|
|
13
14
|
const logger_1 = require("./logger");
|
|
14
15
|
/** Default time source for every {@link AbstractLogger}; overridable per subclass via {@link AbstractLogger.clock}. */
|
|
15
16
|
const systemClock = new clock_1.SystemClock();
|
|
@@ -53,6 +54,14 @@ class AbstractLogger {
|
|
|
53
54
|
formatLinePrefix(label) {
|
|
54
55
|
return `[${label.padEnd(5)} - ${this.timestamp()}]${this.component ? ` [${this.component}]` : ''}`;
|
|
55
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* One log argument as the text a sink appends to its line; {@link formatLogArg}
|
|
59
|
+
* by default. `ConsoleLogger` hands its arguments to the console instead.
|
|
60
|
+
* Never throws, since a log call that throws loses the line.
|
|
61
|
+
*/
|
|
62
|
+
formatArg(arg) {
|
|
63
|
+
return (0, format_log_arg_1.formatLogArg)(arg);
|
|
64
|
+
}
|
|
56
65
|
error(message, ...args) {
|
|
57
66
|
this.send('error', message, args);
|
|
58
67
|
return this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-logger.js","sourceRoot":"","sources":["../src/abstract-logger.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"abstract-logger.js","sourceRoot":"","sources":["../src/abstract-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
/** Options of {@link formatLogArg}. An object, so that a `map` index cannot be passed as one. */
|
|
10
|
+
export interface FormatLogArgOptions {
|
|
11
|
+
/** The `space` argument of `JSON.stringify`; compact where omitted. */
|
|
12
|
+
readonly indent?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Render a log argument as text for a log line:
|
|
16
|
+
* - a string as it is;
|
|
17
|
+
* - an error by its stack and causes;
|
|
18
|
+
* - another object as JSON, cut to a bounded size;
|
|
19
|
+
* - anything else by its description, as is an object JSON renders as nothing
|
|
20
|
+
* or cannot render.
|
|
21
|
+
*
|
|
22
|
+
* The cut is needed because the log call serialises synchronously and every
|
|
23
|
+
* Langium AST node is cyclic. The JSON stops at `LOG_ARG_DEPTH` levels,
|
|
24
|
+
* `LOG_ARG_ITEMS` items or keys and `LOG_ARG_STRING_LENGTH` characters per
|
|
25
|
+
* string or key, and at about `LOG_ARG_LENGTH` in all. A reference back to an
|
|
26
|
+
* object that contains it reads `[Circular]`, and a BigInt its digits; the
|
|
27
|
+
* markers are JSON strings. `util.inspect` would cut too, but is Node-only.
|
|
28
|
+
*
|
|
29
|
+
* Never throws, since a log call that throws loses the line and interrupts its
|
|
30
|
+
* caller. A `%s`-style specifier is not substituted.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatLogArg(value: unknown, options?: FormatLogArgOptions): string;
|
|
33
|
+
//# sourceMappingURL=format-log-arg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-log-arg.d.ts","sourceRoot":"","sources":["../src/format-log-arg.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AAgBlF,iGAAiG;AACjG,MAAM,WAAW,mBAAmB;IACjC,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAiBtF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/********************************************************************************
|
|
3
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
4
|
+
*
|
|
5
|
+
* This program and the accompanying materials are made available under the
|
|
6
|
+
* terms of the MIT License which is available in the project root.
|
|
7
|
+
*
|
|
8
|
+
* SPDX-License-Identifier: MIT
|
|
9
|
+
********************************************************************************/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.formatLogArg = formatLogArg;
|
|
12
|
+
const primitives_1 = require("./messages/primitives");
|
|
13
|
+
/** How deep an object argument is rendered; a deeper object reads `[Object]` or `[Array]`. */
|
|
14
|
+
const LOG_ARG_DEPTH = 2;
|
|
15
|
+
/** How many items or keys of one array or object are rendered. */
|
|
16
|
+
const LOG_ARG_ITEMS = 100;
|
|
17
|
+
/** How many characters of one string or key inside an object argument are rendered. */
|
|
18
|
+
const LOG_ARG_STRING_LENGTH = 10_000;
|
|
19
|
+
/**
|
|
20
|
+
* About how many characters one argument renders, since the limits above
|
|
21
|
+
* multiply. The entry that would pass it reads `...`; later ones are left out.
|
|
22
|
+
*/
|
|
23
|
+
const LOG_ARG_LENGTH = 100_000;
|
|
24
|
+
/**
|
|
25
|
+
* Render a log argument as text for a log line:
|
|
26
|
+
* - a string as it is;
|
|
27
|
+
* - an error by its stack and causes;
|
|
28
|
+
* - another object as JSON, cut to a bounded size;
|
|
29
|
+
* - anything else by its description, as is an object JSON renders as nothing
|
|
30
|
+
* or cannot render.
|
|
31
|
+
*
|
|
32
|
+
* The cut is needed because the log call serialises synchronously and every
|
|
33
|
+
* Langium AST node is cyclic. The JSON stops at `LOG_ARG_DEPTH` levels,
|
|
34
|
+
* `LOG_ARG_ITEMS` items or keys and `LOG_ARG_STRING_LENGTH` characters per
|
|
35
|
+
* string or key, and at about `LOG_ARG_LENGTH` in all. A reference back to an
|
|
36
|
+
* object that contains it reads `[Circular]`, and a BigInt its digits; the
|
|
37
|
+
* markers are JSON strings. `util.inspect` would cut too, but is Node-only.
|
|
38
|
+
*
|
|
39
|
+
* Never throws, since a log call that throws loses the line and interrupts its
|
|
40
|
+
* caller. A `%s`-style specifier is not substituted.
|
|
41
|
+
*/
|
|
42
|
+
function formatLogArg(value, options = {}) {
|
|
43
|
+
if (typeof value === 'string') {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
if (typeof value === 'object' && value !== null) {
|
|
47
|
+
try {
|
|
48
|
+
// `undefined` where `toJSON` returns nothing.
|
|
49
|
+
const json = value instanceof Error ? undefined : JSON.stringify(value, boundedReplacer(options.indent), options.indent);
|
|
50
|
+
if (json !== undefined) {
|
|
51
|
+
return json;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// A throwing getter or `toJSON`, or a revoked proxy; described below instead.
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return (0, primitives_1.describeErrorWithStack)(value);
|
|
59
|
+
}
|
|
60
|
+
function boundedReplacer(indent) {
|
|
61
|
+
// Keyed by the object last entered; JSON is written depth first, so its entry is on the path being written.
|
|
62
|
+
const visits = new Map();
|
|
63
|
+
const isOnPath = (value, holder) => holder !== undefined && ((visits.get(holder)?.source ?? holder) === value || isOnPath(value, visits.get(holder)?.parent));
|
|
64
|
+
// As `JSON.stringify` clamps its `space`.
|
|
65
|
+
const space = Math.min(10, Math.max(0, Math.floor(indent ?? 0)));
|
|
66
|
+
let remaining = LOG_ARG_LENGTH;
|
|
67
|
+
let exhausted = false;
|
|
68
|
+
return function (key, raw) {
|
|
69
|
+
if (exhausted) {
|
|
70
|
+
// In an object the entry is left out; in an array it reads `null`.
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
// A boxed primitive is written as its value, so it is cut as one.
|
|
74
|
+
const value = raw instanceof String || raw instanceof Number || raw instanceof Boolean || raw instanceof BigInt ? raw.valueOf() : raw;
|
|
75
|
+
const depth = (visits.get(this)?.depth ?? -1) + 1;
|
|
76
|
+
const rendered = render(value, depth, this);
|
|
77
|
+
const isObject = typeof rendered === 'object' && rendered !== null;
|
|
78
|
+
// What this entry writes: its value, its key unless it is an item, and the punctuation and indent around them.
|
|
79
|
+
const written = isObject ? undefined : JSON.stringify(rendered);
|
|
80
|
+
// A value JSON cannot write is left out of an object, key and all, and written as `null` in an array.
|
|
81
|
+
const leftOut = !isObject && written === undefined && !Array.isArray(this);
|
|
82
|
+
const valueLength = isObject ? 2 : (written?.length ?? 4);
|
|
83
|
+
const keyLength = depth === 0 || Array.isArray(this) ? 0 : JSON.stringify(key).length + 1 + (space > 0 ? 1 : 0);
|
|
84
|
+
const layoutLength = 1 + (space > 0 ? (1 + space * depth) * (isObject ? 2 : 1) : 0);
|
|
85
|
+
const length = leftOut ? 0 : valueLength + keyLength + layoutLength;
|
|
86
|
+
if (length > remaining) {
|
|
87
|
+
exhausted = true;
|
|
88
|
+
return '...';
|
|
89
|
+
}
|
|
90
|
+
remaining -= length;
|
|
91
|
+
if (isObject) {
|
|
92
|
+
visits.set(rendered, { parent: this, depth, source: value });
|
|
93
|
+
}
|
|
94
|
+
return rendered;
|
|
95
|
+
};
|
|
96
|
+
function render(value, depth, holder) {
|
|
97
|
+
if (typeof value === 'string') {
|
|
98
|
+
return cutString(value);
|
|
99
|
+
}
|
|
100
|
+
if (typeof value === 'bigint') {
|
|
101
|
+
return String(value);
|
|
102
|
+
}
|
|
103
|
+
if (typeof value !== 'object' || value === null) {
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
if (isOnPath(value, holder)) {
|
|
107
|
+
return '[Circular]';
|
|
108
|
+
}
|
|
109
|
+
if (depth > LOG_ARG_DEPTH) {
|
|
110
|
+
return Array.isArray(value) || isTypedArray(value) ? '[Array]' : '[Object]';
|
|
111
|
+
}
|
|
112
|
+
return cut(value);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function cutString(value) {
|
|
116
|
+
const more = value.length - LOG_ARG_STRING_LENGTH;
|
|
117
|
+
return more > 0 ? `${value.slice(0, LOG_ARG_STRING_LENGTH)}... ${more} more characters` : value;
|
|
118
|
+
}
|
|
119
|
+
function isTypedArray(value) {
|
|
120
|
+
return ArrayBuffer.isView(value) && !(value instanceof DataView);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* `value`, or a copy of its first {@link LOG_ARG_ITEMS} items or keys, keys cut
|
|
124
|
+
* as strings are, with a note of how many more there are. A typed array is
|
|
125
|
+
* copied to an array, which reads its items without listing its keys.
|
|
126
|
+
*/
|
|
127
|
+
function cut(value) {
|
|
128
|
+
if (Array.isArray(value) || isTypedArray(value)) {
|
|
129
|
+
const more = value.length - LOG_ARG_ITEMS;
|
|
130
|
+
const items = Array.from({ length: Math.min(value.length, LOG_ARG_ITEMS) }, (_, i) => value[i]);
|
|
131
|
+
return more > 0 ? [...items, `... ${more} more items`] : Array.isArray(value) ? value : items;
|
|
132
|
+
}
|
|
133
|
+
// Linear in the keys: no API lists the first few alone, and `JSON.stringify` would list them all too.
|
|
134
|
+
const keys = Object.keys(value);
|
|
135
|
+
const more = keys.length - LOG_ARG_ITEMS;
|
|
136
|
+
const kept = keys.slice(0, LOG_ARG_ITEMS);
|
|
137
|
+
if (more <= 0 && kept.every(key => key.length <= LOG_ARG_STRING_LENGTH)) {
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
// No prototype, so a `__proto__` key is an entry like any other.
|
|
141
|
+
const copy = Object.create(null);
|
|
142
|
+
// A cut key or the note can equal a key already written; numbered, so neither entry is lost.
|
|
143
|
+
const add = (key, entry) => {
|
|
144
|
+
let unique = key;
|
|
145
|
+
for (let i = 2; unique in copy; i++) {
|
|
146
|
+
unique = `${key} (${i})`;
|
|
147
|
+
}
|
|
148
|
+
copy[unique] = entry;
|
|
149
|
+
};
|
|
150
|
+
for (const key of kept) {
|
|
151
|
+
add(cutString(key), value[key]);
|
|
152
|
+
}
|
|
153
|
+
if (more > 0) {
|
|
154
|
+
add(`... ${more} more keys`, '...');
|
|
155
|
+
}
|
|
156
|
+
return copy;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=format-log-arg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-log-arg.js","sourceRoot":"","sources":["../src/format-log-arg.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export * from './glsp-edits-settled-actions';
|
|
|
18
18
|
export * from './glsp-request-model-args';
|
|
19
19
|
export * from './glsp-save-model-actions';
|
|
20
20
|
export * from './errors';
|
|
21
|
+
export * from './format-log-arg';
|
|
21
22
|
export * from './host-diagnostics';
|
|
22
23
|
export * from './logger';
|
|
23
24
|
export * from './latency-collector';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AASlF,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AAIpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;kFAOkF;AASlF,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AAIpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,OAAO,CAAC;AACtB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -40,6 +40,7 @@ __exportStar(require("./glsp-edits-settled-actions"), exports);
|
|
|
40
40
|
__exportStar(require("./glsp-request-model-args"), exports);
|
|
41
41
|
__exportStar(require("./glsp-save-model-actions"), exports);
|
|
42
42
|
__exportStar(require("./errors"), exports);
|
|
43
|
+
__exportStar(require("./format-log-arg"), exports);
|
|
43
44
|
__exportStar(require("./host-diagnostics"), exports);
|
|
44
45
|
__exportStar(require("./logger"), exports);
|
|
45
46
|
__exportStar(require("./latency-collector"), exports);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;;AAElF,kFAAkF;AAClF,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,iDAAiD;AAEjD,oDAAkC;AAClC,mDAAiC;AACjC,2CAAyB;AACzB,+CAA6B;AAC7B,0CAAwB;AACxB,yCAAuB;AACvB,oDAAkC;AAClC,8CAA4B;AAC5B,+DAA6C;AAC7C,4DAA0C;AAC1C,4DAA0C;AAC1C,2CAAyB;AACzB,qDAAmC;AACnC,2CAAyB;AACzB,sDAAoC;AACpC,6EAA6E;AAC7E,+EAA+E;AAC/E,+BAA+B;AAC/B,wDAAsC;AACtC,gDAA8B;AAC9B,oDAAkC;AAClC,gDAA8B;AAC9B,qDAAmC;AACnC,yDAAuC;AACvC,oDAAkC;AAClC,8CAA4B;AAC5B,2CAAyB;AACzB,wDAAsC;AACtC,qDAAmC;AACnC,0CAAwB;AACxB,kDAAgC;AAChC,sDAAoC;AACpC,iDAA+B;AAC/B,4CAA0B;AAC1B,gDAA8B;AAC9B,uDAAqC;AACrC,wCAAsB;AACtB,wCAAsB;AACtB,yCAAuB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;kFAOkF;;;;;;;;;;;;;;;;AAElF,kFAAkF;AAClF,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,iDAAiD;AAEjD,oDAAkC;AAClC,mDAAiC;AACjC,2CAAyB;AACzB,+CAA6B;AAC7B,0CAAwB;AACxB,yCAAuB;AACvB,oDAAkC;AAClC,8CAA4B;AAC5B,+DAA6C;AAC7C,4DAA0C;AAC1C,4DAA0C;AAC1C,2CAAyB;AACzB,mDAAiC;AACjC,qDAAmC;AACnC,2CAAyB;AACzB,sDAAoC;AACpC,6EAA6E;AAC7E,+EAA+E;AAC/E,+BAA+B;AAC/B,wDAAsC;AACtC,gDAA8B;AAC9B,oDAAkC;AAClC,gDAA8B;AAC9B,qDAAmC;AACnC,yDAAuC;AACvC,oDAAkC;AAClC,8CAA4B;AAC5B,2CAAyB;AACzB,wDAAsC;AACtC,qDAAmC;AACnC,0CAAwB;AACxB,kDAAgC;AAChC,sDAAoC;AACpC,iDAA+B;AAC/B,4CAA0B;AAC1B,gDAA8B;AAC9B,uDAAqC;AACrC,wCAAsB;AACtB,wCAAsB;AACtB,yCAAuB"}
|
package/package.json
CHANGED
package/src/abstract-logger.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { type Clock, SystemClock } from './clock';
|
|
11
|
+
import { formatLogArg } from './format-log-arg';
|
|
11
12
|
import { Format, LEVEL_LABELS, type LogLevel, Logger, type LogThreshold } from './logger';
|
|
12
13
|
|
|
13
14
|
/** Default time source for every {@link AbstractLogger}; overridable per subclass via {@link AbstractLogger.clock}. */
|
|
@@ -54,6 +55,15 @@ export abstract class AbstractLogger implements Logger {
|
|
|
54
55
|
return `[${label.padEnd(5)} - ${this.timestamp()}]${this.component ? ` [${this.component}]` : ''}`;
|
|
55
56
|
}
|
|
56
57
|
|
|
58
|
+
/**
|
|
59
|
+
* One log argument as the text a sink appends to its line; {@link formatLogArg}
|
|
60
|
+
* by default. `ConsoleLogger` hands its arguments to the console instead.
|
|
61
|
+
* Never throws, since a log call that throws loses the line.
|
|
62
|
+
*/
|
|
63
|
+
protected formatArg(arg: unknown): string {
|
|
64
|
+
return formatLogArg(arg);
|
|
65
|
+
}
|
|
66
|
+
|
|
57
67
|
error(message?: string, ...args: unknown[]): this {
|
|
58
68
|
this.send('error', message, args);
|
|
59
69
|
return this;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { describeErrorWithStack } from './messages/primitives';
|
|
11
|
+
|
|
12
|
+
/** How deep an object argument is rendered; a deeper object reads `[Object]` or `[Array]`. */
|
|
13
|
+
const LOG_ARG_DEPTH = 2;
|
|
14
|
+
/** How many items or keys of one array or object are rendered. */
|
|
15
|
+
const LOG_ARG_ITEMS = 100;
|
|
16
|
+
/** How many characters of one string or key inside an object argument are rendered. */
|
|
17
|
+
const LOG_ARG_STRING_LENGTH = 10_000;
|
|
18
|
+
/**
|
|
19
|
+
* About how many characters one argument renders, since the limits above
|
|
20
|
+
* multiply. The entry that would pass it reads `...`; later ones are left out.
|
|
21
|
+
*/
|
|
22
|
+
const LOG_ARG_LENGTH = 100_000;
|
|
23
|
+
|
|
24
|
+
/** Options of {@link formatLogArg}. An object, so that a `map` index cannot be passed as one. */
|
|
25
|
+
export interface FormatLogArgOptions {
|
|
26
|
+
/** The `space` argument of `JSON.stringify`; compact where omitted. */
|
|
27
|
+
readonly indent?: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Render a log argument as text for a log line:
|
|
32
|
+
* - a string as it is;
|
|
33
|
+
* - an error by its stack and causes;
|
|
34
|
+
* - another object as JSON, cut to a bounded size;
|
|
35
|
+
* - anything else by its description, as is an object JSON renders as nothing
|
|
36
|
+
* or cannot render.
|
|
37
|
+
*
|
|
38
|
+
* The cut is needed because the log call serialises synchronously and every
|
|
39
|
+
* Langium AST node is cyclic. The JSON stops at `LOG_ARG_DEPTH` levels,
|
|
40
|
+
* `LOG_ARG_ITEMS` items or keys and `LOG_ARG_STRING_LENGTH` characters per
|
|
41
|
+
* string or key, and at about `LOG_ARG_LENGTH` in all. A reference back to an
|
|
42
|
+
* object that contains it reads `[Circular]`, and a BigInt its digits; the
|
|
43
|
+
* markers are JSON strings. `util.inspect` would cut too, but is Node-only.
|
|
44
|
+
*
|
|
45
|
+
* Never throws, since a log call that throws loses the line and interrupts its
|
|
46
|
+
* caller. A `%s`-style specifier is not substituted.
|
|
47
|
+
*/
|
|
48
|
+
export function formatLogArg(value: unknown, options: FormatLogArgOptions = {}): string {
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value === 'object' && value !== null) {
|
|
53
|
+
try {
|
|
54
|
+
// `undefined` where `toJSON` returns nothing.
|
|
55
|
+
const json: string | undefined =
|
|
56
|
+
value instanceof Error ? undefined : JSON.stringify(value, boundedReplacer(options.indent), options.indent);
|
|
57
|
+
if (json !== undefined) {
|
|
58
|
+
return json;
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
// A throwing getter or `toJSON`, or a revoked proxy; described below instead.
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return describeErrorWithStack(value);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface Visit {
|
|
68
|
+
readonly parent: object;
|
|
69
|
+
readonly depth: number;
|
|
70
|
+
/** The object a cut copy stands in for, which a cycle refers back to. */
|
|
71
|
+
readonly source: object;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function boundedReplacer(indent: number | undefined): (this: object, key: string, value: unknown) => unknown {
|
|
75
|
+
// Keyed by the object last entered; JSON is written depth first, so its entry is on the path being written.
|
|
76
|
+
const visits = new Map<object, Visit>();
|
|
77
|
+
const isOnPath = (value: object, holder: object | undefined): boolean =>
|
|
78
|
+
holder !== undefined && ((visits.get(holder)?.source ?? holder) === value || isOnPath(value, visits.get(holder)?.parent));
|
|
79
|
+
// As `JSON.stringify` clamps its `space`.
|
|
80
|
+
const space = Math.min(10, Math.max(0, Math.floor(indent ?? 0)));
|
|
81
|
+
let remaining = LOG_ARG_LENGTH;
|
|
82
|
+
let exhausted = false;
|
|
83
|
+
return function (this: object, key: string, raw: unknown): unknown {
|
|
84
|
+
if (exhausted) {
|
|
85
|
+
// In an object the entry is left out; in an array it reads `null`.
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
// A boxed primitive is written as its value, so it is cut as one.
|
|
89
|
+
const value = raw instanceof String || raw instanceof Number || raw instanceof Boolean || raw instanceof BigInt ? raw.valueOf() : raw;
|
|
90
|
+
const depth = (visits.get(this)?.depth ?? -1) + 1;
|
|
91
|
+
const rendered = render(value, depth, this);
|
|
92
|
+
const isObject = typeof rendered === 'object' && rendered !== null;
|
|
93
|
+
// What this entry writes: its value, its key unless it is an item, and the punctuation and indent around them.
|
|
94
|
+
const written = isObject ? undefined : JSON.stringify(rendered);
|
|
95
|
+
// A value JSON cannot write is left out of an object, key and all, and written as `null` in an array.
|
|
96
|
+
const leftOut = !isObject && written === undefined && !Array.isArray(this);
|
|
97
|
+
const valueLength = isObject ? 2 : (written?.length ?? 4);
|
|
98
|
+
const keyLength = depth === 0 || Array.isArray(this) ? 0 : JSON.stringify(key).length + 1 + (space > 0 ? 1 : 0);
|
|
99
|
+
const layoutLength = 1 + (space > 0 ? (1 + space * depth) * (isObject ? 2 : 1) : 0);
|
|
100
|
+
const length = leftOut ? 0 : valueLength + keyLength + layoutLength;
|
|
101
|
+
if (length > remaining) {
|
|
102
|
+
exhausted = true;
|
|
103
|
+
return '...';
|
|
104
|
+
}
|
|
105
|
+
remaining -= length;
|
|
106
|
+
if (isObject) {
|
|
107
|
+
visits.set(rendered, { parent: this, depth, source: value as object });
|
|
108
|
+
}
|
|
109
|
+
return rendered;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
function render(value: unknown, depth: number, holder: object): unknown {
|
|
113
|
+
if (typeof value === 'string') {
|
|
114
|
+
return cutString(value);
|
|
115
|
+
}
|
|
116
|
+
if (typeof value === 'bigint') {
|
|
117
|
+
return String(value);
|
|
118
|
+
}
|
|
119
|
+
if (typeof value !== 'object' || value === null) {
|
|
120
|
+
return value;
|
|
121
|
+
}
|
|
122
|
+
if (isOnPath(value, holder)) {
|
|
123
|
+
return '[Circular]';
|
|
124
|
+
}
|
|
125
|
+
if (depth > LOG_ARG_DEPTH) {
|
|
126
|
+
return Array.isArray(value) || isTypedArray(value) ? '[Array]' : '[Object]';
|
|
127
|
+
}
|
|
128
|
+
return cut(value);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function cutString(value: string): string {
|
|
133
|
+
const more = value.length - LOG_ARG_STRING_LENGTH;
|
|
134
|
+
return more > 0 ? `${value.slice(0, LOG_ARG_STRING_LENGTH)}... ${more} more characters` : value;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function isTypedArray(value: object): value is ArrayLike<unknown> {
|
|
138
|
+
return ArrayBuffer.isView(value) && !(value instanceof DataView);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* `value`, or a copy of its first {@link LOG_ARG_ITEMS} items or keys, keys cut
|
|
143
|
+
* as strings are, with a note of how many more there are. A typed array is
|
|
144
|
+
* copied to an array, which reads its items without listing its keys.
|
|
145
|
+
*/
|
|
146
|
+
function cut(value: object): object {
|
|
147
|
+
if (Array.isArray(value) || isTypedArray(value)) {
|
|
148
|
+
const more = value.length - LOG_ARG_ITEMS;
|
|
149
|
+
const items = Array.from({ length: Math.min(value.length, LOG_ARG_ITEMS) }, (_, i) => value[i]);
|
|
150
|
+
return more > 0 ? [...items, `... ${more} more items`] : Array.isArray(value) ? value : items;
|
|
151
|
+
}
|
|
152
|
+
// Linear in the keys: no API lists the first few alone, and `JSON.stringify` would list them all too.
|
|
153
|
+
const keys = Object.keys(value);
|
|
154
|
+
const more = keys.length - LOG_ARG_ITEMS;
|
|
155
|
+
const kept = keys.slice(0, LOG_ARG_ITEMS);
|
|
156
|
+
if (more <= 0 && kept.every(key => key.length <= LOG_ARG_STRING_LENGTH)) {
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
// No prototype, so a `__proto__` key is an entry like any other.
|
|
160
|
+
const copy: Record<string, unknown> = Object.create(null);
|
|
161
|
+
// A cut key or the note can equal a key already written; numbered, so neither entry is lost.
|
|
162
|
+
const add = (key: string, entry: unknown): void => {
|
|
163
|
+
let unique = key;
|
|
164
|
+
for (let i = 2; unique in copy; i++) {
|
|
165
|
+
unique = `${key} (${i})`;
|
|
166
|
+
}
|
|
167
|
+
copy[unique] = entry;
|
|
168
|
+
};
|
|
169
|
+
for (const key of kept) {
|
|
170
|
+
add(cutString(key), (value as Record<string, unknown>)[key]);
|
|
171
|
+
}
|
|
172
|
+
if (more > 0) {
|
|
173
|
+
add(`... ${more} more keys`, '...');
|
|
174
|
+
}
|
|
175
|
+
return copy;
|
|
176
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './glsp-edits-settled-actions';
|
|
|
26
26
|
export * from './glsp-request-model-args';
|
|
27
27
|
export * from './glsp-save-model-actions';
|
|
28
28
|
export * from './errors';
|
|
29
|
+
export * from './format-log-arg';
|
|
29
30
|
export * from './host-diagnostics';
|
|
30
31
|
export * from './logger';
|
|
31
32
|
export * from './latency-collector';
|