@dxos/log 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

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 (90) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/chunk-IEP6GGEX.mjs +23 -0
  3. package/dist/lib/browser/chunk-IEP6GGEX.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-V7FYKT4H.mjs +311 -0
  5. package/dist/lib/browser/chunk-V7FYKT4H.mjs.map +7 -0
  6. package/dist/lib/browser/index.mjs +290 -185
  7. package/dist/lib/browser/index.mjs.map +4 -4
  8. package/dist/lib/browser/meta.json +1 -1
  9. package/dist/lib/browser/platform/browser/index.mjs +26 -0
  10. package/dist/lib/browser/platform/browser/index.mjs.map +7 -0
  11. package/dist/lib/browser/platform/node/index.mjs +21 -0
  12. package/dist/lib/browser/platform/node/index.mjs.map +7 -0
  13. package/dist/lib/browser/processors/console-processor.mjs +102 -0
  14. package/dist/lib/browser/processors/console-processor.mjs.map +7 -0
  15. package/dist/lib/browser/processors/console-stub.mjs +9 -0
  16. package/dist/lib/browser/processors/console-stub.mjs.map +7 -0
  17. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  18. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  19. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs +313 -0
  20. package/dist/lib/node-esm/chunk-5TBDXMQF.mjs.map +7 -0
  21. package/dist/lib/node-esm/index.mjs +292 -274
  22. package/dist/lib/node-esm/index.mjs.map +4 -4
  23. package/dist/lib/node-esm/meta.json +1 -1
  24. package/dist/lib/node-esm/platform/browser/index.mjs +27 -0
  25. package/dist/lib/node-esm/platform/browser/index.mjs.map +7 -0
  26. package/dist/lib/node-esm/platform/node/index.mjs +22 -0
  27. package/dist/lib/node-esm/platform/node/index.mjs.map +7 -0
  28. package/dist/lib/node-esm/processors/console-processor.mjs +103 -0
  29. package/dist/lib/node-esm/processors/console-processor.mjs.map +7 -0
  30. package/dist/lib/node-esm/processors/console-stub.mjs +10 -0
  31. package/dist/lib/node-esm/processors/console-stub.mjs.map +7 -0
  32. package/dist/types/src/context.d.ts +78 -2
  33. package/dist/types/src/context.d.ts.map +1 -1
  34. package/dist/types/src/dbg.d.ts +23 -0
  35. package/dist/types/src/dbg.d.ts.map +1 -0
  36. package/dist/types/src/decorators.d.ts.map +1 -1
  37. package/dist/types/src/environment.d.ts +24 -0
  38. package/dist/types/src/environment.d.ts.map +1 -0
  39. package/dist/types/src/environment.test.d.ts +2 -0
  40. package/dist/types/src/environment.test.d.ts.map +1 -0
  41. package/dist/types/src/experimental/ownership.d.ts.map +1 -1
  42. package/dist/types/src/index.d.ts +7 -3
  43. package/dist/types/src/index.d.ts.map +1 -1
  44. package/dist/types/src/jsonl.d.ts +53 -0
  45. package/dist/types/src/jsonl.d.ts.map +1 -0
  46. package/dist/types/src/jsonl.test.d.ts +2 -0
  47. package/dist/types/src/jsonl.test.d.ts.map +1 -0
  48. package/dist/types/src/log-buffer.d.ts +20 -0
  49. package/dist/types/src/log-buffer.d.ts.map +1 -0
  50. package/dist/types/src/log-buffer.test.d.ts +2 -0
  51. package/dist/types/src/log-buffer.test.d.ts.map +1 -0
  52. package/dist/types/src/log.d.ts +44 -1
  53. package/dist/types/src/log.d.ts.map +1 -1
  54. package/dist/types/src/meta.d.ts +20 -1
  55. package/dist/types/src/meta.d.ts.map +1 -1
  56. package/dist/types/src/options.d.ts.map +1 -1
  57. package/dist/types/src/platform/browser/index.d.ts.map +1 -1
  58. package/dist/types/src/platform/index.d.ts +1 -1
  59. package/dist/types/src/platform/index.d.ts.map +1 -1
  60. package/dist/types/src/platform/node/index.d.ts.map +1 -1
  61. package/dist/types/src/processors/browser-processor.d.ts.map +1 -1
  62. package/dist/types/src/processors/common.d.ts.map +1 -1
  63. package/dist/types/src/processors/console-processor.d.ts.map +1 -1
  64. package/dist/types/src/processors/file-processor.d.ts.map +1 -1
  65. package/dist/types/src/processors/index.d.ts +3 -3
  66. package/dist/types/src/processors/index.d.ts.map +1 -1
  67. package/dist/types/src/scope.d.ts.map +1 -1
  68. package/dist/types/tsconfig.tsbuildinfo +1 -1
  69. package/package.json +31 -16
  70. package/src/context.ts +242 -2
  71. package/src/dbg.ts +34 -0
  72. package/src/decorators.ts +1 -2
  73. package/src/environment.test.ts +222 -0
  74. package/src/environment.ts +129 -0
  75. package/src/experimental/classes.test.ts +0 -1
  76. package/src/index.ts +7 -4
  77. package/src/jsonl.test.ts +121 -0
  78. package/src/jsonl.ts +104 -0
  79. package/src/log-buffer.test.ts +158 -0
  80. package/src/log-buffer.ts +89 -0
  81. package/src/log.test.ts +0 -1
  82. package/src/log.ts +56 -12
  83. package/src/meta.ts +29 -1
  84. package/src/options.ts +3 -1
  85. package/src/platform/index.ts +1 -1
  86. package/src/platform/node/index.ts +1 -2
  87. package/src/processors/browser-processor.ts +27 -28
  88. package/src/processors/console-processor.ts +5 -13
  89. package/src/processors/file-processor.ts +7 -9
  90. package/src/processors/index.ts +3 -3
@@ -1,123 +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
- "*": 5,
19
- trace: 5,
20
- debug: 10,
21
- verbose: 11,
22
- info: 12,
23
- warn: 13,
24
- error: 14
25
- };
26
- var shortLevelName = {
27
- [5]: "T",
28
- [10]: "D",
29
- [11]: "V",
30
- [12]: "I",
31
- [13]: "W",
32
- [14]: "E"
33
- };
34
- var LogProcessorType = /* @__PURE__ */ (function(LogProcessorType2) {
35
- LogProcessorType2["CONSOLE"] = "console";
36
- LogProcessorType2["BROWSER"] = "browser";
37
- LogProcessorType2["DEBUG"] = "debug";
38
- return LogProcessorType2;
39
- })({});
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";
40
51
 
41
- // src/scope.ts
42
- var logInfoProperties = Symbol("logInfoProperties");
43
- var logInfo = (target, propertyKey, descriptor) => {
44
- (target[logInfoProperties] ??= []).push(propertyKey);
45
- };
46
- var gatherLogInfoFromScope = (scope) => {
47
- if (!scope) {
48
- return {};
49
- }
50
- const res = {};
51
- const prototype = Object.getPrototypeOf(scope);
52
- const infoProps = (typeof prototype === "object" && prototype !== null ? prototype[logInfoProperties] : []) ?? [];
53
- for (const prop of infoProps) {
54
- try {
55
- res[prop] = typeof scope[prop] === "function" ? scope[prop]() : scope[prop];
56
- } catch (err) {
57
- res[prop] = err.message;
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);
58
63
  }
64
+ return suffix;
59
65
  }
60
- return res;
66
+ return Math.random().toString(36).slice(2, 2 + SUFFIX_LENGTH).padEnd(SUFFIX_LENGTH, "0");
61
67
  };
62
-
63
- // src/context.ts
64
- var matchFilter = (filter, level, path) => {
65
- if (filter.pattern?.startsWith("-")) {
66
- if (path?.includes(filter.pattern.slice(1))) {
67
- if (level >= filter.level) {
68
- return false;
69
- }
70
- }
71
- } else {
72
- if (filter.pattern?.length) {
73
- if (path?.includes(filter.pattern)) {
74
- return level >= filter.level;
75
- }
76
- } else {
77
- if (level >= filter.level) {
78
- return true;
79
- }
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;
80
76
  }
77
+ const suffix = randomSuffix();
78
+ session.setItem(TAB_SUFFIX_STORAGE_KEY, suffix);
79
+ return suffix;
80
+ } catch {
81
+ return randomSuffix();
81
82
  }
82
83
  };
83
- var shouldLog = (entry, filters) => {
84
- if (filters === void 0) {
85
- return false;
84
+ var isInstanceOf = (scope, ctorName) => {
85
+ const ctor = scope?.[ctorName];
86
+ return typeof ctor === "function" && scope instanceof ctor;
87
+ };
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()}`;
86
102
  }
87
- const results = filters.map((filter) => matchFilter(filter, entry.level, entry.meta?.F)).filter((result) => result !== void 0);
88
- return results.length > 0 && !results.some((results2) => results2 === false);
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()}`;
111
+ }
112
+ return `unknown::${randomSuffix()}`;
89
113
  };
90
- var getContextFromEntry = (entry) => {
91
- let context;
92
- if (entry.meta) {
93
- const scopeInfo = gatherLogInfoFromScope(entry.meta.S);
94
- if (Object.keys(scopeInfo).length > 0) {
95
- context = Object.assign(context ?? {}, scopeInfo);
96
- }
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;
97
131
  }
98
- const entryContext = typeof entry.context === "function" ? entry.context() : entry.context;
99
- if (entryContext) {
100
- if (entryContext instanceof Error) {
101
- const c = entryContext.context;
102
- context = Object.assign(context ?? {}, {
103
- error: entryContext.stack,
104
- ...c
105
- });
106
- } else if (typeof entryContext === "object") {
107
- context = Object.assign(context ?? {}, entryContext);
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;
140
+ }
141
+ const computedContext = entry.computedContext;
142
+ if (Object.keys(computedContext).length > 0) {
143
+ try {
144
+ record.c = JSON.stringify(computedContext);
145
+ } catch {
108
146
  }
109
147
  }
110
- if (entry.error) {
111
- context = Object.assign(context ?? {}, {
112
- error: entry.error
113
- });
148
+ try {
149
+ return JSON.stringify(record);
150
+ } catch {
151
+ return void 0;
114
152
  }
115
- return context && Object.keys(context).length > 0 ? context : void 0;
116
153
  };
117
154
 
118
155
  // src/decorators.ts
119
- import { inspect } from "node:util";
120
156
  import chalk from "chalk";
157
+ import { inspect } from "node:util";
121
158
  var nextPromiseId = 0;
122
159
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
123
160
  const method = descriptor.value;
@@ -227,142 +264,23 @@ var formatPromise = (id) => chalk.blue(`Promise#${id}`);
227
264
  // src/options.ts
228
265
  import defaultsDeep from "lodash.defaultsdeep";
229
266
 
230
- // src/platform/node/index.ts
231
- import fs from "node:fs";
232
- import yaml from "js-yaml";
233
- var loadOptions = (filepath) => {
234
- if (filepath) {
235
- try {
236
- const text = fs.readFileSync(filepath, "utf-8");
237
- if (text) {
238
- return yaml.load(text);
239
- }
240
- } catch (err) {
241
- console.warn(`Invalid log file: ${filepath}`);
242
- }
243
- }
244
- };
245
-
246
- // src/processors/console-processor.ts
247
- import { inspect as inspect2 } from "node:util";
248
- import chalk2 from "chalk";
249
- import { getPrototypeSpecificInstanceId, pickBy } from "@dxos/util";
250
-
251
- // src/processors/common.ts
252
- var getRelativeFilename = (filename) => {
253
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
254
- if (match) {
255
- const [, filePath] = match;
256
- return filePath;
257
- }
258
- return filename;
259
- };
260
-
261
- // src/processors/console-processor.ts
262
- var LEVEL_COLORS = {
263
- [LogLevel.TRACE]: "gray",
264
- [LogLevel.DEBUG]: "gray",
265
- [LogLevel.VERBOSE]: "gray",
266
- [LogLevel.INFO]: "white",
267
- [LogLevel.WARN]: "yellow",
268
- [LogLevel.ERROR]: "red"
269
- };
270
- var truncate = (text, length = 0, right = false) => {
271
- const str = text && length ? right ? text.slice(-length) : text.substring(0, length) : text ?? "";
272
- return right ? str.padStart(length, " ") : str.padEnd(length, " ");
273
- };
274
- var DEFAULT_FORMATTER = (config, { path, line, level, message, context, error, scope }) => {
275
- const column = config.options?.formatter?.column;
276
- const filepath = path !== void 0 && line !== void 0 ? chalk2.grey(`${path}:${line}`) : void 0;
277
- let instance;
278
- if (scope) {
279
- const prototype = Object.getPrototypeOf(scope);
280
- if (prototype !== null) {
281
- const id = getPrototypeSpecificInstanceId(scope);
282
- instance = chalk2.magentaBright(`${prototype.constructor.name}#${id}`);
283
- }
284
- }
285
- const formattedTimestamp = config.options?.formatter?.timestamp ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
286
- const formattedLevel = chalk2[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);
287
- const padding = column && filepath ? "".padStart(column - filepath.length) : void 0;
288
- return config.options?.formatter?.timestampFirst ? [
289
- formattedTimestamp,
290
- filepath,
291
- padding,
292
- formattedLevel,
293
- instance,
294
- message,
295
- context,
296
- error
297
- ] : [
298
- // NOTE: File path must come fist for console hyperlinks.
299
- // Must not truncate for terminal output.
300
- filepath,
301
- padding,
302
- formattedTimestamp,
303
- formattedLevel,
304
- instance,
305
- message,
306
- context,
307
- error
308
- ];
309
- };
310
- var SHORT_FORMATTER = (config, { path, level, message }) => {
311
- return [
312
- chalk2.grey(truncate(path, 16, true)),
313
- chalk2[LEVEL_COLORS[level]](shortLevelName[level]),
314
- message
315
- ];
316
- };
317
- var formatter = DEFAULT_FORMATTER;
318
- var CONSOLE_PROCESSOR = (config, entry) => {
319
- const { level, message, meta, error } = entry;
320
- if (!shouldLog(entry, config.filters)) {
321
- return;
322
- }
323
- const parts = {
324
- level,
325
- message,
326
- error,
327
- path: void 0,
328
- line: void 0,
329
- scope: void 0,
330
- context: void 0
331
- };
332
- if (meta) {
333
- parts.path = getRelativeFilename(meta.F);
334
- parts.line = meta.L;
335
- parts.scope = meta.S;
336
- }
337
- const context = getContextFromEntry(entry);
338
- if (context) {
339
- parts.context = inspect2(pickBy(context, (value) => value !== void 0), {
340
- depth: config.options.depth,
341
- colors: true,
342
- maxArrayLength: 8,
343
- sorted: false
344
- });
345
- }
346
- const line = formatter(config, parts).filter(Boolean).join(" ");
347
- console.log(line);
348
- };
267
+ // src/platform/index.ts
268
+ var platform_exports = {};
269
+ __reExport(platform_exports, platform_star);
270
+ import * as platform_star from "#platform";
349
271
 
350
- // src/processors/debug-processor.ts
351
- import { inspect as inspect3 } from "node:util";
352
- var DEBUG_PROCESSOR = (config, entry) => {
353
- console.log(inspect3(entry, false, null, true));
354
- };
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
+ });
355
281
 
356
282
  // src/processors/browser-processor.ts
357
- import { getDebugName, safariCheck } from "@dxos/util";
358
- var getRelativeFilename2 = (filename) => {
359
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
360
- if (match) {
361
- const [, filePath] = match;
362
- return filePath;
363
- }
364
- return filename;
365
- };
283
+ import { safariCheck } from "@dxos/util";
366
284
  var CONFIG = {
367
285
  useTestProcessor: false,
368
286
  printFileLinks: false
@@ -373,18 +291,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
373
291
  }
374
292
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
375
293
  const LOG_BROWSER_CSS = [];
294
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
376
295
  let link = "";
377
- if (entry.meta) {
378
- const filename = getRelativeFilename2(entry.meta.F);
296
+ if (filename !== void 0 && lineNumber !== void 0) {
379
297
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
380
- link = `${filepath}#L${entry.meta.L}`;
298
+ link = `${filepath}#L${lineNumber}`;
381
299
  }
382
300
  let args = [];
383
- if (entry.meta?.S) {
384
- const scope = entry.meta?.S;
385
- const scopeName = scope.name || getDebugName(scope);
386
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
387
- 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
+ }
388
308
  }
389
309
  if (entry.message) {
390
310
  args.push(entry.message);
@@ -392,9 +312,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
392
312
  const context = getContextFromEntry(entry);
393
313
  if (context) {
394
314
  if (Object.keys(context).length === 1 && "error" in context) {
395
- args.push(context.error);
315
+ args.push(unwrapEffectError(context.error));
396
316
  } else if (Object.keys(context).length === 1 && "err" in context) {
397
- args.push(context.err);
317
+ args.push(unwrapEffectError(context.err));
398
318
  } else {
399
319
  args.push(context);
400
320
  }
@@ -429,10 +349,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
429
349
  if (!shouldLog(entry, config.filters)) {
430
350
  return;
431
351
  }
432
- let path = "";
433
- if (entry.meta) {
434
- path = `${getRelativeFilename2(entry.meta.F)}:${entry.meta.L}`;
435
- }
352
+ const { filename, line: lineNumber } = entry.computedMeta;
353
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
436
354
  let args = [];
437
355
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
438
356
  args.push(`${processPrefix}${entry.message}`);
@@ -459,11 +377,27 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
459
377
  }
460
378
  };
461
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
+ };
462
397
 
463
398
  // src/processors/file-processor.ts
464
399
  import { appendFileSync, mkdirSync, openSync } from "node:fs";
465
400
  import { dirname } from "node:path";
466
- import { jsonlogify } from "@dxos/util";
467
401
  var EAGAIN_MAX_DURATION = 1e3;
468
402
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
469
403
  let fd;
@@ -484,15 +418,12 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
484
418
  fd = openSync(pathOrFd, "a");
485
419
  }
486
420
  const record = {
487
- ...entry,
488
- timestamp: Date.now(),
489
- ...entry.meta ? {
490
- meta: {
491
- file: getRelativeFilename(entry.meta.F),
492
- line: entry.meta.L
493
- }
494
- } : {},
495
- 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
496
427
  };
497
428
  let retryTS = 0;
498
429
  while (true) {
@@ -531,13 +462,13 @@ var FILE_PROCESSOR = createFileProcessor({
531
462
 
532
463
  // src/options.ts
533
464
  var processors = {
534
- [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,
465
+ [LogProcessorType.CONSOLE]: processors_exports.CONSOLE_PROCESSOR,
535
466
  [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,
536
467
  [LogProcessorType.DEBUG]: DEBUG_PROCESSOR
537
468
  };
538
- var browser = typeof window !== "undefined" || typeof navigator !== "undefined";
469
+ var browser = (typeof window !== "undefined" || typeof navigator !== "undefined") && !(typeof process !== "undefined" && process?.env?.VITEST);
539
470
  var DEFAULT_PROCESSORS = [
540
- browser ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR
471
+ browser ? BROWSER_PROCESSOR : processors_exports.CONSOLE_PROCESSOR
541
472
  ];
542
473
  var parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
543
474
  var parseFilter = (filter) => {
@@ -565,7 +496,7 @@ var createConfig = (options) => {
565
496
  filter: process.env.LOG_FILTER,
566
497
  processor: process.env.LOG_PROCESSOR
567
498
  } : void 0;
568
- const mergedOptions = defaultsDeep({}, loadOptions(envOptions?.file), envOptions, options);
499
+ const mergedOptions = defaultsDeep({}, (0, platform_exports.loadOptions)(envOptions?.file), envOptions, options);
569
500
  return {
570
501
  options: mergedOptions,
571
502
  filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),
@@ -591,13 +522,14 @@ var createLog = () => {
591
522
  get: () => log2._config
592
523
  });
593
524
  const processLog = (level, message, context = {}, meta, error) => {
594
- log2._config.processors.forEach((processor) => processor(log2._config, {
525
+ const entry = new LogEntry({
595
526
  level,
596
527
  message,
597
528
  context,
598
529
  meta,
599
530
  error
600
- }));
531
+ });
532
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
601
533
  };
602
534
  Object.assign(log2, {
603
535
  /**
@@ -605,7 +537,7 @@ var createLog = () => {
605
537
  * NOTE: Preserves any processors that were already added to this logger instance
606
538
  * unless an explicit processor option is provided.
607
539
  */
608
- config: ({ processor, ...options }) => {
540
+ config: ({ processor, ...options } = {}) => {
609
541
  const config = createConfig(options);
610
542
  const processors2 = processor ? config.processors : log2._config.processors;
611
543
  log2._config = {
@@ -659,11 +591,94 @@ var debug = (label, args) => {
659
591
  };
660
592
  var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("\n");
661
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
+
662
679
  // src/experimental/ownership.ts
663
- import { inspect as inspect4 } from "node:util";
664
- var kOwnershipScope = Symbol("kOwnershipScope");
665
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
666
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
680
+ import { inspect as inspect3 } from "node:util";
681
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
667
682
  var OwnershipScope = class {
668
683
  constr;
669
684
  parent;
@@ -683,7 +698,7 @@ var OwnershipScope = class {
683
698
  }
684
699
  return info;
685
700
  }
686
- [inspect4.custom]() {
701
+ [inspect3.custom]() {
687
702
  return {
688
703
  className: this.constr.name,
689
704
  info: this.getInfo(),
@@ -694,28 +709,31 @@ var OwnershipScope = class {
694
709
  var getCurrentOwnershipScope = (thisRef) => thisRef;
695
710
  export {
696
711
  BROWSER_PROCESSOR,
697
- CONSOLE_PROCESSOR,
698
712
  DEBUG_PROCESSOR,
699
- DEFAULT_FORMATTER,
700
713
  FILE_PROCESSOR,
714
+ LOG_META_MARKER,
715
+ LogBuffer,
716
+ LogEntry,
701
717
  LogLevel,
702
718
  LogProcessorType,
703
- SHORT_FORMATTER,
704
719
  createFileProcessor,
705
720
  createLog,
721
+ dbg,
706
722
  debug,
707
723
  gatherLogInfoFromScope,
708
724
  getContextFromEntry,
709
725
  getCurrentOwnershipScope,
710
726
  getRelativeFilename,
727
+ inferEnvironmentName,
728
+ isLogMeta,
711
729
  levels,
712
730
  log,
713
731
  logInfo,
714
732
  omit,
715
733
  parseFilter,
716
734
  pick,
735
+ serializeToJsonl,
717
736
  shortLevelName,
718
- shouldLog,
719
- truncate
737
+ shouldLog
720
738
  };
721
739
  //# sourceMappingURL=index.mjs.map