@dxos/log 0.8.4-main.fd6878d → 0.8.4-main.fdfb99ef29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/lib/browser/chunk-IEP6GGEX.mjs +23 -0
  2. package/dist/lib/browser/chunk-IEP6GGEX.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-V7FYKT4H.mjs +311 -0
  4. package/dist/lib/browser/chunk-V7FYKT4H.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +347 -198
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/platform/browser/index.mjs +26 -0
  9. package/dist/lib/browser/platform/browser/index.mjs.map +7 -0
  10. package/dist/lib/browser/platform/node/index.mjs +21 -0
  11. package/dist/lib/browser/platform/node/index.mjs.map +7 -0
  12. package/dist/lib/browser/processors/console-processor.mjs +102 -0
  13. package/dist/lib/browser/processors/console-processor.mjs.map +7 -0
  14. package/dist/lib/browser/processors/console-stub.mjs +9 -0
  15. package/dist/lib/browser/processors/console-stub.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  17. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  18. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs +313 -0
  19. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs.map +7 -0
  20. package/dist/lib/node-esm/index.mjs +349 -287
  21. package/dist/lib/node-esm/index.mjs.map +4 -4
  22. package/dist/lib/node-esm/meta.json +1 -1
  23. package/dist/lib/node-esm/platform/browser/index.mjs +27 -0
  24. package/dist/lib/node-esm/platform/browser/index.mjs.map +7 -0
  25. package/dist/lib/node-esm/platform/node/index.mjs +22 -0
  26. package/dist/lib/node-esm/platform/node/index.mjs.map +7 -0
  27. package/dist/lib/node-esm/processors/console-processor.mjs +103 -0
  28. package/dist/lib/node-esm/processors/console-processor.mjs.map +7 -0
  29. package/dist/lib/node-esm/processors/console-stub.mjs +10 -0
  30. package/dist/lib/node-esm/processors/console-stub.mjs.map +7 -0
  31. package/dist/types/src/config.d.ts +2 -3
  32. package/dist/types/src/config.d.ts.map +1 -1
  33. package/dist/types/src/context.d.ts +78 -2
  34. package/dist/types/src/context.d.ts.map +1 -1
  35. package/dist/types/src/dbg.d.ts +23 -0
  36. package/dist/types/src/dbg.d.ts.map +1 -0
  37. package/dist/types/src/decorators.d.ts +1 -1
  38. package/dist/types/src/decorators.d.ts.map +1 -1
  39. package/dist/types/src/environment.d.ts +24 -0
  40. package/dist/types/src/environment.d.ts.map +1 -0
  41. package/dist/types/src/environment.test.d.ts +2 -0
  42. package/dist/types/src/environment.test.d.ts.map +1 -0
  43. package/dist/types/src/experimental/ownership.d.ts.map +1 -1
  44. package/dist/types/src/index.d.ts +7 -3
  45. package/dist/types/src/index.d.ts.map +1 -1
  46. package/dist/types/src/jsonl.d.ts +53 -0
  47. package/dist/types/src/jsonl.d.ts.map +1 -0
  48. package/dist/types/src/jsonl.test.d.ts +2 -0
  49. package/dist/types/src/jsonl.test.d.ts.map +1 -0
  50. package/dist/types/src/log-buffer.d.ts +20 -0
  51. package/dist/types/src/log-buffer.d.ts.map +1 -0
  52. package/dist/types/src/log-buffer.test.d.ts +2 -0
  53. package/dist/types/src/log-buffer.test.d.ts.map +1 -0
  54. package/dist/types/src/log.d.ts +55 -18
  55. package/dist/types/src/log.d.ts.map +1 -1
  56. package/dist/types/src/meta.d.ts +20 -1
  57. package/dist/types/src/meta.d.ts.map +1 -1
  58. package/dist/types/src/options.d.ts +1 -6
  59. package/dist/types/src/options.d.ts.map +1 -1
  60. package/dist/types/src/platform/browser/index.d.ts.map +1 -1
  61. package/dist/types/src/platform/index.d.ts +1 -1
  62. package/dist/types/src/platform/index.d.ts.map +1 -1
  63. package/dist/types/src/platform/node/index.d.ts.map +1 -1
  64. package/dist/types/src/processors/browser-processor.d.ts.map +1 -1
  65. package/dist/types/src/processors/common.d.ts.map +1 -1
  66. package/dist/types/src/processors/console-processor.d.ts.map +1 -1
  67. package/dist/types/src/processors/file-processor.d.ts.map +1 -1
  68. package/dist/types/src/processors/index.d.ts +3 -3
  69. package/dist/types/src/processors/index.d.ts.map +1 -1
  70. package/dist/types/src/scope.d.ts.map +1 -1
  71. package/dist/types/tsconfig.tsbuildinfo +1 -1
  72. package/package.json +30 -15
  73. package/src/config.ts +3 -2
  74. package/src/context.ts +278 -7
  75. package/src/dbg.ts +34 -0
  76. package/src/decorators.ts +4 -5
  77. package/src/environment.test.ts +222 -0
  78. package/src/environment.ts +129 -0
  79. package/src/experimental/classes.test.ts +0 -1
  80. package/src/index.ts +7 -4
  81. package/src/jsonl.test.ts +121 -0
  82. package/src/jsonl.ts +104 -0
  83. package/src/log-buffer.test.ts +158 -0
  84. package/src/log-buffer.ts +89 -0
  85. package/src/log.test.ts +48 -19
  86. package/src/log.ts +146 -58
  87. package/src/meta.ts +29 -1
  88. package/src/options.ts +26 -10
  89. package/src/platform/index.ts +1 -1
  90. package/src/platform/node/index.ts +1 -2
  91. package/src/processors/browser-processor.ts +28 -27
  92. package/src/processors/console-processor.ts +5 -13
  93. package/src/processors/file-processor.ts +9 -9
  94. package/src/processors/index.ts +3 -3
@@ -1,106 +1,160 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ LogEntry,
4
+ LogLevel,
5
+ LogProcessorType,
6
+ gatherLogInfoFromScope,
7
+ getContextFromEntry,
8
+ getRelativeFilename,
9
+ levels,
10
+ logInfo,
11
+ shortLevelName,
12
+ shouldLog
13
+ } from "./chunk-5TBDXMQF.mjs";
14
+ import {
15
+ __export,
16
+ __reExport
17
+ } from "./chunk-2SZHAWBN.mjs";
2
18
 
3
19
  // src/index.ts
4
- import omit from "lodash.omit";
5
- import { pick } from "@dxos/util";
6
-
7
- // src/config.ts
8
- var LogLevel = /* @__PURE__ */ function(LogLevel2) {
9
- LogLevel2[LogLevel2["TRACE"] = 5] = "TRACE";
10
- LogLevel2[LogLevel2["DEBUG"] = 10] = "DEBUG";
11
- LogLevel2[LogLevel2["VERBOSE"] = 11] = "VERBOSE";
12
- LogLevel2[LogLevel2["INFO"] = 12] = "INFO";
13
- LogLevel2[LogLevel2["WARN"] = 13] = "WARN";
14
- LogLevel2[LogLevel2["ERROR"] = 14] = "ERROR";
15
- return LogLevel2;
16
- }({});
17
- var levels = {
18
- trace: 5,
19
- debug: 10,
20
- verbose: 11,
21
- info: 12,
22
- warn: 13,
23
- error: 14
24
- };
25
- var shortLevelName = {
26
- [5]: "T",
27
- [10]: "D",
28
- [11]: "V",
29
- [12]: "I",
30
- [13]: "W",
31
- [14]: "E"
32
- };
33
- var LogProcessorType = /* @__PURE__ */ function(LogProcessorType2) {
34
- LogProcessorType2["CONSOLE"] = "console";
35
- LogProcessorType2["BROWSER"] = "browser";
36
- LogProcessorType2["DEBUG"] = "debug";
37
- return LogProcessorType2;
38
- }({});
20
+ var index_exports = {};
21
+ __export(index_exports, {
22
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
23
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
24
+ FILE_PROCESSOR: () => FILE_PROCESSOR,
25
+ LOG_META_MARKER: () => LOG_META_MARKER,
26
+ LogBuffer: () => LogBuffer,
27
+ LogEntry: () => LogEntry,
28
+ LogLevel: () => LogLevel,
29
+ LogProcessorType: () => LogProcessorType,
30
+ createFileProcessor: () => createFileProcessor,
31
+ createLog: () => createLog,
32
+ dbg: () => dbg,
33
+ debug: () => debug,
34
+ gatherLogInfoFromScope: () => gatherLogInfoFromScope,
35
+ getContextFromEntry: () => getContextFromEntry,
36
+ getCurrentOwnershipScope: () => getCurrentOwnershipScope,
37
+ getRelativeFilename: () => getRelativeFilename,
38
+ inferEnvironmentName: () => inferEnvironmentName,
39
+ isLogMeta: () => isLogMeta,
40
+ levels: () => levels,
41
+ log: () => log,
42
+ logInfo: () => logInfo,
43
+ omit: () => omit,
44
+ parseFilter: () => parseFilter,
45
+ pick: () => pick,
46
+ serializeToJsonl: () => serializeToJsonl,
47
+ shortLevelName: () => shortLevelName,
48
+ shouldLog: () => shouldLog
49
+ });
50
+ import { omit, pick } from "@dxos/util";
39
51
 
40
- // src/scope.ts
41
- var logInfoProperties = Symbol("logInfoProperties");
42
- var logInfo = (target, propertyKey, descriptor) => {
43
- (target[logInfoProperties] ??= []).push(propertyKey);
52
+ // src/environment.ts
53
+ var TAB_SUFFIX_STORAGE_KEY = "@dxos/log:env-suffix";
54
+ var SUFFIX_LENGTH = 6;
55
+ var randomSuffix = () => {
56
+ const cryptoRef = globalThis.crypto;
57
+ if (cryptoRef?.getRandomValues) {
58
+ const bytes = new Uint8Array(SUFFIX_LENGTH);
59
+ cryptoRef.getRandomValues(bytes);
60
+ let suffix = "";
61
+ for (const byte of bytes) {
62
+ suffix += (byte % 36).toString(36);
63
+ }
64
+ return suffix;
65
+ }
66
+ return Math.random().toString(36).slice(2, 2 + SUFFIX_LENGTH).padEnd(SUFFIX_LENGTH, "0");
44
67
  };
45
- var gatherLogInfoFromScope = (scope) => {
46
- if (!scope) {
47
- return {};
48
- }
49
- const res = {};
50
- const prototype = Object.getPrototypeOf(scope);
51
- const infoProps = (typeof prototype === "object" && prototype !== null ? prototype[logInfoProperties] : []) ?? [];
52
- for (const prop of infoProps) {
53
- try {
54
- res[prop] = typeof scope[prop] === "function" ? scope[prop]() : scope[prop];
55
- } catch (err) {
56
- res[prop] = err.message;
68
+ var getOrCreateTabSuffix = (session) => {
69
+ if (!session) {
70
+ return randomSuffix();
71
+ }
72
+ try {
73
+ const existing = session.getItem(TAB_SUFFIX_STORAGE_KEY);
74
+ if (existing && existing.length > 0) {
75
+ return existing;
57
76
  }
77
+ const suffix = randomSuffix();
78
+ session.setItem(TAB_SUFFIX_STORAGE_KEY, suffix);
79
+ return suffix;
80
+ } catch {
81
+ return randomSuffix();
58
82
  }
59
- return res;
60
83
  };
61
-
62
- // src/context.ts
63
- var matchFilter = (filter, level, path) => {
64
- return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));
84
+ var isInstanceOf = (scope, ctorName) => {
85
+ const ctor = scope?.[ctorName];
86
+ return typeof ctor === "function" && scope instanceof ctor;
65
87
  };
66
- var shouldLog = (entry, filters) => {
67
- if (filters === void 0) {
68
- return true;
69
- } else {
70
- return filters.some((filter) => matchFilter(filter, entry.level, entry.meta?.F ?? ""));
88
+ var CF_WORKER_USER_AGENT = "Cloudflare-Workers";
89
+ var inferEnvironmentName = (options = {}) => {
90
+ const scope = options.scope ?? globalThis;
91
+ if (scope.navigator?.userAgent === CF_WORKER_USER_AGENT) {
92
+ return `cf-worker::${randomSuffix()}`;
93
+ }
94
+ if (isInstanceOf(scope, "SharedWorkerGlobalScope")) {
95
+ return `shared-worker:${scope.name ?? ""}:${randomSuffix()}`;
96
+ }
97
+ if (isInstanceOf(scope, "ServiceWorkerGlobalScope")) {
98
+ return `service-worker::${randomSuffix()}`;
99
+ }
100
+ if (isInstanceOf(scope, "DedicatedWorkerGlobalScope")) {
101
+ return `dedicated-worker:${scope.name ?? ""}:${randomSuffix()}`;
102
+ }
103
+ if (scope.window !== void 0 && scope.window === scope) {
104
+ const origin = scope.location?.origin ?? "";
105
+ return `tab:${origin}:${getOrCreateTabSuffix(scope.sessionStorage)}`;
106
+ }
107
+ const proc = scope.process;
108
+ if (proc && typeof proc === "object" && proc.versions?.node) {
109
+ const pid = typeof proc.pid === "number" ? String(proc.pid) : "";
110
+ return `node:${pid}:${randomSuffix()}`;
71
111
  }
112
+ return `unknown::${randomSuffix()}`;
72
113
  };
73
- var getContextFromEntry = (entry) => {
74
- let context;
75
- if (entry.meta) {
76
- const scopeInfo = gatherLogInfoFromScope(entry.meta.S);
77
- if (Object.keys(scopeInfo).length > 0) {
78
- context = Object.assign(context ?? {}, scopeInfo);
79
- }
114
+
115
+ // src/jsonl.ts
116
+ var serializeToJsonl = (entry, opts = {}) => {
117
+ if (entry.level <= LogLevel.TRACE) {
118
+ return void 0;
119
+ }
120
+ const { filename, line, context: scopeName } = entry.computedMeta;
121
+ const record = {
122
+ t: new Date(entry.timestamp).toISOString(),
123
+ l: shortLevelName[entry.level] ?? "?",
124
+ m: entry.message ?? ""
125
+ };
126
+ if (filename !== void 0) {
127
+ record.f = filename;
128
+ }
129
+ if (line !== void 0) {
130
+ record.n = line;
131
+ }
132
+ if (scopeName !== void 0) {
133
+ record.o = scopeName;
134
+ }
135
+ if (entry.computedError !== void 0) {
136
+ record.e = entry.computedError;
137
+ }
138
+ if (opts.env !== void 0) {
139
+ record.i = opts.env;
80
140
  }
81
- const entryContext = typeof entry.context === "function" ? entry.context() : entry.context;
82
- if (entryContext) {
83
- if (entryContext instanceof Error) {
84
- const c = entryContext.context;
85
- context = Object.assign(context ?? {}, {
86
- error: entryContext.stack,
87
- ...c
88
- });
89
- } else if (typeof entryContext === "object") {
90
- context = Object.assign(context ?? {}, entryContext);
141
+ const computedContext = entry.computedContext;
142
+ if (Object.keys(computedContext).length > 0) {
143
+ try {
144
+ record.c = JSON.stringify(computedContext);
145
+ } catch {
91
146
  }
92
147
  }
93
- if (entry.error) {
94
- context = Object.assign(context ?? {}, {
95
- error: entry.error
96
- });
148
+ try {
149
+ return JSON.stringify(record);
150
+ } catch {
151
+ return void 0;
97
152
  }
98
- return context && Object.keys(context).length > 0 ? context : void 0;
99
153
  };
100
154
 
101
155
  // src/decorators.ts
102
- import { inspect } from "node:util";
103
156
  import chalk from "chalk";
157
+ import { inspect } from "node:util";
104
158
  var nextPromiseId = 0;
105
159
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
106
160
  const method = descriptor.value;
@@ -197,155 +251,36 @@ var logAsyncResolved = (log2, methodName, resolvedValue, promiseId, startTime, c
197
251
  var logAsyncRejected = (log2, methodName, err, promiseId, startTime, combinedMeta) => {
198
252
  log2.info(`.${formatFunction(methodName)} \u21B2 \u{1F525} ${chalk.gray("reject")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray("=>")} ${err}`, {}, combinedMeta);
199
253
  };
200
- var greenCheck = typeof chalk.green === "function" ? chalk.green("\u2714") : "\u2714";
201
- var formatTimeElapsed = (startTime) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
202
254
  var COLOR_FUNCTION = [
203
255
  220,
204
256
  220,
205
257
  170
206
258
  ];
259
+ var greenCheck = typeof chalk.green === "function" ? chalk.green("\u2714") : "\u2714";
260
+ var formatTimeElapsed = (startTime) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
207
261
  var formatFunction = (name) => chalk.bold(chalk.rgb(...COLOR_FUNCTION)(name));
208
262
  var formatPromise = (id) => chalk.blue(`Promise#${id}`);
209
263
 
210
264
  // src/options.ts
211
265
  import defaultsDeep from "lodash.defaultsdeep";
212
266
 
213
- // src/platform/node/index.ts
214
- import fs from "node:fs";
215
- import yaml from "js-yaml";
216
- var loadOptions = (filepath) => {
217
- if (filepath) {
218
- try {
219
- const text = fs.readFileSync(filepath, "utf-8");
220
- if (text) {
221
- return yaml.load(text);
222
- }
223
- } catch (err) {
224
- console.warn(`Invalid log file: ${filepath}`);
225
- }
226
- }
227
- };
228
-
229
- // src/processors/console-processor.ts
230
- import { inspect as inspect2 } from "node:util";
231
- import chalk2 from "chalk";
232
- import { getPrototypeSpecificInstanceId, pickBy } from "@dxos/util";
233
-
234
- // src/processors/common.ts
235
- var getRelativeFilename = (filename) => {
236
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
237
- if (match) {
238
- const [, filePath] = match;
239
- return filePath;
240
- }
241
- return filename;
242
- };
267
+ // src/platform/index.ts
268
+ var platform_exports = {};
269
+ __reExport(platform_exports, platform_star);
270
+ import * as platform_star from "#platform";
243
271
 
244
- // src/processors/console-processor.ts
245
- var LEVEL_COLORS = {
246
- [LogLevel.TRACE]: "gray",
247
- [LogLevel.DEBUG]: "gray",
248
- [LogLevel.VERBOSE]: "gray",
249
- [LogLevel.INFO]: "white",
250
- [LogLevel.WARN]: "yellow",
251
- [LogLevel.ERROR]: "red"
252
- };
253
- var truncate = (text, length = 0, right = false) => {
254
- const str = text && length ? right ? text.slice(-length) : text.substring(0, length) : text ?? "";
255
- return right ? str.padStart(length, " ") : str.padEnd(length, " ");
256
- };
257
- var DEFAULT_FORMATTER = (config, { path, line, level, message, context, error, scope }) => {
258
- const column = config.options?.formatter?.column;
259
- const filepath = path !== void 0 && line !== void 0 ? chalk2.grey(`${path}:${line}`) : void 0;
260
- let instance;
261
- if (scope) {
262
- const prototype = Object.getPrototypeOf(scope);
263
- if (prototype !== null) {
264
- const id = getPrototypeSpecificInstanceId(scope);
265
- instance = chalk2.magentaBright(`${prototype.constructor.name}#${id}`);
266
- }
267
- }
268
- const formattedTimestamp = config.options?.formatter?.timestamp ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
269
- const formattedLevel = chalk2[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);
270
- const padding = column && filepath ? "".padStart(column - filepath.length) : void 0;
271
- return config.options?.formatter?.timestampFirst ? [
272
- formattedTimestamp,
273
- filepath,
274
- padding,
275
- formattedLevel,
276
- instance,
277
- message,
278
- context,
279
- error
280
- ] : [
281
- // NOTE: File path must come fist for console hyperlinks.
282
- // Must not truncate for terminal output.
283
- filepath,
284
- padding,
285
- formattedTimestamp,
286
- formattedLevel,
287
- instance,
288
- message,
289
- context,
290
- error
291
- ];
292
- };
293
- var SHORT_FORMATTER = (config, { path, level, message }) => {
294
- return [
295
- chalk2.grey(truncate(path, 16, true)),
296
- chalk2[LEVEL_COLORS[level]](shortLevelName[level]),
297
- message
298
- ];
299
- };
300
- var formatter = DEFAULT_FORMATTER;
301
- var CONSOLE_PROCESSOR = (config, entry) => {
302
- const { level, message, meta, error } = entry;
303
- if (!shouldLog(entry, config.filters)) {
304
- return;
305
- }
306
- const parts = {
307
- level,
308
- message,
309
- error,
310
- path: void 0,
311
- line: void 0,
312
- scope: void 0,
313
- context: void 0
314
- };
315
- if (meta) {
316
- parts.path = getRelativeFilename(meta.F);
317
- parts.line = meta.L;
318
- parts.scope = meta.S;
319
- }
320
- const context = getContextFromEntry(entry);
321
- if (context) {
322
- parts.context = inspect2(pickBy(context, (value) => value !== void 0), {
323
- depth: config.options.depth,
324
- colors: true,
325
- maxArrayLength: 8,
326
- sorted: false
327
- });
328
- }
329
- const line = formatter(config, parts).filter(Boolean).join(" ");
330
- console.log(line);
331
- };
332
-
333
- // src/processors/debug-processor.ts
334
- import { inspect as inspect3 } from "node:util";
335
- var DEBUG_PROCESSOR = (config, entry) => {
336
- console.log(inspect3(entry, false, null, true));
337
- };
272
+ // src/processors/index.ts
273
+ var processors_exports = {};
274
+ __export(processors_exports, {
275
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
276
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
277
+ FILE_PROCESSOR: () => FILE_PROCESSOR,
278
+ createFileProcessor: () => createFileProcessor,
279
+ getRelativeFilename: () => getRelativeFilename
280
+ });
338
281
 
339
282
  // src/processors/browser-processor.ts
340
- import { getDebugName, safariCheck } from "@dxos/util";
341
- var getRelativeFilename2 = (filename) => {
342
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
343
- if (match) {
344
- const [, filePath] = match;
345
- return filePath;
346
- }
347
- return filename;
348
- };
283
+ import { safariCheck } from "@dxos/util";
349
284
  var CONFIG = {
350
285
  useTestProcessor: false,
351
286
  printFileLinks: false
@@ -356,18 +291,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
356
291
  }
357
292
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
358
293
  const LOG_BROWSER_CSS = [];
294
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
359
295
  let link = "";
360
- if (entry.meta) {
361
- const filename = getRelativeFilename2(entry.meta.F);
296
+ if (filename !== void 0 && lineNumber !== void 0) {
362
297
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
363
- link = `${filepath}#L${entry.meta.L}`;
298
+ link = `${filepath}#L${lineNumber}`;
364
299
  }
365
300
  let args = [];
366
- if (entry.meta?.S) {
367
- const scope = entry.meta?.S;
368
- const scopeName = scope.name || getDebugName(scope);
369
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
370
- args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
301
+ const scope = entry.meta?.S;
302
+ if (scope) {
303
+ const scopeName = scope.name || scopeDebugName;
304
+ if (scopeName) {
305
+ const processPrefix = scope.hostSessionId ? "[worker] " : "";
306
+ args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
307
+ }
371
308
  }
372
309
  if (entry.message) {
373
310
  args.push(entry.message);
@@ -375,7 +312,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
375
312
  const context = getContextFromEntry(entry);
376
313
  if (context) {
377
314
  if (Object.keys(context).length === 1 && "error" in context) {
378
- args.push(context.error);
315
+ args.push(unwrapEffectError(context.error));
316
+ } else if (Object.keys(context).length === 1 && "err" in context) {
317
+ args.push(unwrapEffectError(context.err));
379
318
  } else {
380
319
  args.push(context);
381
320
  }
@@ -410,10 +349,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
410
349
  if (!shouldLog(entry, config.filters)) {
411
350
  return;
412
351
  }
413
- let path = "";
414
- if (entry.meta) {
415
- path = `${getRelativeFilename2(entry.meta.F)}:${entry.meta.L}`;
416
- }
352
+ const { filename, line: lineNumber } = entry.computedMeta;
353
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
417
354
  let args = [];
418
355
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
419
356
  args.push(`${processPrefix}${entry.message}`);
@@ -440,11 +377,27 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
440
377
  }
441
378
  };
442
379
  var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;
380
+ var originalSymbol = /* @__PURE__ */ Symbol.for("effect/OriginalAnnotation");
381
+ var unwrapEffectError = (error) => {
382
+ if (typeof error === "object" && error !== null && originalSymbol in error) {
383
+ return error[originalSymbol];
384
+ }
385
+ return error;
386
+ };
387
+
388
+ // src/processors/index.ts
389
+ __reExport(processors_exports, console_processor_star);
390
+ import * as console_processor_star from "#console-processor";
391
+
392
+ // src/processors/debug-processor.ts
393
+ import { inspect as inspect2 } from "node:util";
394
+ var DEBUG_PROCESSOR = (config, entry) => {
395
+ console.log(inspect2(entry, false, null, true));
396
+ };
443
397
 
444
398
  // src/processors/file-processor.ts
445
399
  import { appendFileSync, mkdirSync, openSync } from "node:fs";
446
400
  import { dirname } from "node:path";
447
- import { jsonlogify } from "@dxos/util";
448
401
  var EAGAIN_MAX_DURATION = 1e3;
449
402
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
450
403
  let fd;
@@ -465,15 +418,12 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
465
418
  fd = openSync(pathOrFd, "a");
466
419
  }
467
420
  const record = {
468
- ...entry,
469
- timestamp: Date.now(),
470
- ...entry.meta ? {
471
- meta: {
472
- file: getRelativeFilename(entry.meta.F),
473
- line: entry.meta.L
474
- }
475
- } : {},
476
- context: jsonlogify(getContextFromEntry(entry))
421
+ level: entry.level,
422
+ message: entry.message,
423
+ timestamp: entry.timestamp,
424
+ meta: entry.computedMeta,
425
+ context: entry.computedContext,
426
+ error: entry.computedError
477
427
  };
478
428
  let retryTS = 0;
479
429
  while (true) {
@@ -512,14 +462,15 @@ var FILE_PROCESSOR = createFileProcessor({
512
462
 
513
463
  // src/options.ts
514
464
  var processors = {
515
- [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,
465
+ [LogProcessorType.CONSOLE]: processors_exports.CONSOLE_PROCESSOR,
516
466
  [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,
517
467
  [LogProcessorType.DEBUG]: DEBUG_PROCESSOR
518
468
  };
519
- var IS_BROWSER = typeof window !== "undefined" || typeof navigator !== "undefined";
469
+ var browser = (typeof window !== "undefined" || typeof navigator !== "undefined") && !(typeof process !== "undefined" && process?.env?.VITEST);
520
470
  var DEFAULT_PROCESSORS = [
521
- IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR
471
+ browser ? BROWSER_PROCESSOR : processors_exports.CONSOLE_PROCESSOR
522
472
  ];
473
+ var parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
523
474
  var parseFilter = (filter) => {
524
475
  if (typeof filter === "number") {
525
476
  return [
@@ -528,7 +479,6 @@ var parseFilter = (filter) => {
528
479
  }
529
480
  ];
530
481
  }
531
- const parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
532
482
  const lines = typeof filter === "string" ? filter.split(/,\s*/) : filter;
533
483
  return lines.map((filter2) => {
534
484
  const [pattern, level] = filter2.split(":");
@@ -540,66 +490,91 @@ var parseFilter = (filter) => {
540
490
  };
541
491
  });
542
492
  };
543
- var getConfig = (options) => {
544
- const nodeOptions = "process" in globalThis ? {
493
+ var createConfig = (options) => {
494
+ const envOptions = "process" in globalThis ? {
545
495
  file: process.env.LOG_CONFIG,
546
496
  filter: process.env.LOG_FILTER,
547
497
  processor: process.env.LOG_PROCESSOR
548
498
  } : void 0;
549
- const mergedOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);
499
+ const mergedOptions = defaultsDeep({}, (0, platform_exports.loadOptions)(envOptions?.file), envOptions, options);
550
500
  return {
551
501
  options: mergedOptions,
552
502
  filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),
553
503
  captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),
554
504
  processors: mergedOptions.processor ? [
555
505
  processors[mergedOptions.processor]
556
- ] : DEFAULT_PROCESSORS,
506
+ ] : [
507
+ ...DEFAULT_PROCESSORS
508
+ ],
557
509
  prefix: mergedOptions.prefix
558
510
  };
559
511
  };
560
512
 
561
513
  // src/log.ts
514
+ var logCount = 0;
562
515
  var createLog = () => {
563
516
  const log2 = (...params) => processLog(LogLevel.DEBUG, ...params);
564
- log2._config = getConfig();
517
+ Object.assign(log2, {
518
+ _id: `log-${++logCount}`,
519
+ _config: createConfig()
520
+ });
565
521
  Object.defineProperty(log2, "runtimeConfig", {
566
522
  get: () => log2._config
567
523
  });
568
- log2.addProcessor = (processor) => {
569
- if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {
570
- DEFAULT_PROCESSORS.push(processor);
571
- }
572
- if (log2._config.processors.filter((p) => p === processor).length === 0) {
573
- log2._config.processors.push(processor);
574
- }
575
- };
576
- log2.config = (options) => {
577
- log2._config = getConfig(options);
578
- };
579
- log2.trace = (...params) => processLog(LogLevel.TRACE, ...params);
580
- log2.debug = (...params) => processLog(LogLevel.DEBUG, ...params);
581
- log2.verbose = (...params) => processLog(LogLevel.VERBOSE, ...params);
582
- log2.info = (...params) => processLog(LogLevel.INFO, ...params);
583
- log2.warn = (...params) => processLog(LogLevel.WARN, ...params);
584
- log2.error = (...params) => processLog(LogLevel.ERROR, ...params);
585
- log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, void 0, context, meta, error);
586
- log2.break = () => log2.info("\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014");
587
- log2.stack = (message, context, meta) => processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
588
- ${getFormattedStackTrace()}`, context, meta);
589
- log2.method = createMethodLogDecorator(log2);
590
- log2.func = createFunctionLogDecorator(log2);
591
524
  const processLog = (level, message, context = {}, meta, error) => {
592
- log2._config.processors.forEach((processor) => processor(log2._config, {
525
+ const entry = new LogEntry({
593
526
  level,
594
527
  message,
595
528
  context,
596
529
  meta,
597
530
  error
598
- }));
531
+ });
532
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
599
533
  };
534
+ Object.assign(log2, {
535
+ /**
536
+ * Update config.
537
+ * NOTE: Preserves any processors that were already added to this logger instance
538
+ * unless an explicit processor option is provided.
539
+ */
540
+ config: ({ processor, ...options } = {}) => {
541
+ const config = createConfig(options);
542
+ const processors2 = processor ? config.processors : log2._config.processors;
543
+ log2._config = {
544
+ ...config,
545
+ processors: processors2
546
+ };
547
+ return log2;
548
+ },
549
+ /**
550
+ * Adds a processor to the logger.
551
+ */
552
+ addProcessor: (processor) => {
553
+ if (log2._config.processors.filter((p) => p === processor).length === 0) {
554
+ log2._config.processors.push(processor);
555
+ }
556
+ return () => {
557
+ log2._config.processors = log2._config.processors.filter((p) => p !== processor);
558
+ };
559
+ },
560
+ trace: (...params) => processLog(LogLevel.TRACE, ...params),
561
+ debug: (...params) => processLog(LogLevel.DEBUG, ...params),
562
+ verbose: (...params) => processLog(LogLevel.VERBOSE, ...params),
563
+ info: (...params) => processLog(LogLevel.INFO, ...params),
564
+ warn: (...params) => processLog(LogLevel.WARN, ...params),
565
+ error: (...params) => processLog(LogLevel.ERROR, ...params),
566
+ catch: (error, context, meta) => processLog(LogLevel.ERROR, void 0, context, meta, error),
567
+ method: createMethodLogDecorator(log2),
568
+ function: createFunctionLogDecorator(log2),
569
+ break: () => log2.info("-".repeat(80)),
570
+ stack: (message, context, meta) => {
571
+ return processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
572
+ ${getFormattedStackTrace()}`, context, meta);
573
+ }
574
+ });
600
575
  return log2;
601
576
  };
602
- var log = globalThis.dx_log ??= createLog();
577
+ var log = globalThis.DX_LOG ??= createLog();
603
578
  var start = Date.now();
604
579
  var last = start;
605
580
  var debug = (label, args) => {
@@ -616,11 +591,94 @@ var debug = (label, args) => {
616
591
  };
617
592
  var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("\n");
618
593
 
594
+ // src/index.ts
595
+ __reExport(index_exports, processors_exports);
596
+
597
+ // src/meta.ts
598
+ var LOG_META_MARKER = "~LogMeta";
599
+ var isLogMeta = (value) => {
600
+ return value != null && typeof value === "object" && value[LOG_META_MARKER] === LOG_META_MARKER;
601
+ };
602
+
603
+ // src/dbg.ts
604
+ var dbg = (arg, meta) => {
605
+ if (meta?.A) {
606
+ console.log(`${meta.A[0]} =`, arg);
607
+ } else {
608
+ console.log(arg);
609
+ }
610
+ return arg;
611
+ };
612
+
613
+ // src/log-buffer.ts
614
+ import { CircularBuffer } from "@dxos/util";
615
+ var DEFAULT_BUFFER_SIZE = 2e3;
616
+ var MAX_CONTEXT_LENGTH = 500;
617
+ var LogBuffer = class {
618
+ _buffer;
619
+ constructor(size = DEFAULT_BUFFER_SIZE) {
620
+ this._buffer = new CircularBuffer(size);
621
+ }
622
+ /**
623
+ * Log processor that can be registered with `log.runtimeConfig.processors`.
624
+ * Captures every level except TRACE (does not apply `shouldLog` / filter; use for full debug dumps).
625
+ */
626
+ logProcessor = (_config, entry) => {
627
+ if (entry.level <= LogLevel.TRACE) {
628
+ return;
629
+ }
630
+ const { filename, line, context: scopeName } = entry.computedMeta;
631
+ const record = {
632
+ t: new Date(entry.timestamp).toISOString(),
633
+ l: shortLevelName[entry.level] ?? "?",
634
+ m: entry.message ?? ""
635
+ };
636
+ if (filename !== void 0) {
637
+ record.f = filename;
638
+ }
639
+ if (line !== void 0) {
640
+ record.n = line;
641
+ }
642
+ if (scopeName !== void 0) {
643
+ record.o = scopeName;
644
+ }
645
+ if (entry.computedError !== void 0) {
646
+ record.e = entry.computedError;
647
+ }
648
+ const computedContext = entry.computedContext;
649
+ if (Object.keys(computedContext).length > 0) {
650
+ try {
651
+ let json = JSON.stringify(computedContext);
652
+ if (json.length > MAX_CONTEXT_LENGTH) {
653
+ json = json.slice(0, MAX_CONTEXT_LENGTH);
654
+ }
655
+ record.c = json;
656
+ } catch {
657
+ }
658
+ }
659
+ this._buffer.push(record);
660
+ };
661
+ /** Number of entries currently in the buffer. */
662
+ get size() {
663
+ return this._buffer.elementCount;
664
+ }
665
+ /** Discard all buffered entries. */
666
+ clear() {
667
+ this._buffer.clear();
668
+ }
669
+ /** Serialize buffer contents as NDJSON (newline-delimited JSON). */
670
+ serialize() {
671
+ const lines = [];
672
+ for (const record of this._buffer) {
673
+ lines.push(JSON.stringify(record));
674
+ }
675
+ return lines.join("\n");
676
+ }
677
+ };
678
+
619
679
  // src/experimental/ownership.ts
620
- import { inspect as inspect4 } from "node:util";
621
- var kOwnershipScope = Symbol("kOwnershipScope");
622
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
623
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
680
+ import { inspect as inspect3 } from "node:util";
681
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
624
682
  var OwnershipScope = class {
625
683
  constr;
626
684
  parent;
@@ -640,7 +698,7 @@ var OwnershipScope = class {
640
698
  }
641
699
  return info;
642
700
  }
643
- [inspect4.custom]() {
701
+ [inspect3.custom]() {
644
702
  return {
645
703
  className: this.constr.name,
646
704
  info: this.getInfo(),
@@ -651,27 +709,31 @@ var OwnershipScope = class {
651
709
  var getCurrentOwnershipScope = (thisRef) => thisRef;
652
710
  export {
653
711
  BROWSER_PROCESSOR,
654
- CONSOLE_PROCESSOR,
655
712
  DEBUG_PROCESSOR,
656
- DEFAULT_FORMATTER,
657
713
  FILE_PROCESSOR,
714
+ LOG_META_MARKER,
715
+ LogBuffer,
716
+ LogEntry,
658
717
  LogLevel,
659
718
  LogProcessorType,
660
- SHORT_FORMATTER,
661
719
  createFileProcessor,
720
+ createLog,
721
+ dbg,
662
722
  debug,
663
723
  gatherLogInfoFromScope,
664
724
  getContextFromEntry,
665
725
  getCurrentOwnershipScope,
666
726
  getRelativeFilename,
727
+ inferEnvironmentName,
728
+ isLogMeta,
667
729
  levels,
668
730
  log,
669
731
  logInfo,
670
732
  omit,
671
733
  parseFilter,
672
734
  pick,
735
+ serializeToJsonl,
673
736
  shortLevelName,
674
- shouldLog,
675
- truncate
737
+ shouldLog
676
738
  };
677
739
  //# sourceMappingURL=index.mjs.map