@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,121 +1,159 @@
1
- // src/index.ts
2
- import omit from "lodash.omit";
3
- import { pick } from "@dxos/util";
1
+ import {
2
+ LogEntry,
3
+ LogLevel,
4
+ LogProcessorType,
5
+ gatherLogInfoFromScope,
6
+ getContextFromEntry,
7
+ getRelativeFilename,
8
+ levels,
9
+ logInfo,
10
+ shortLevelName,
11
+ shouldLog
12
+ } from "./chunk-V7FYKT4H.mjs";
13
+ import {
14
+ __export,
15
+ __reExport
16
+ } from "./chunk-IEP6GGEX.mjs";
4
17
 
5
- // src/config.ts
6
- var LogLevel = /* @__PURE__ */ (function(LogLevel2) {
7
- LogLevel2[LogLevel2["TRACE"] = 5] = "TRACE";
8
- LogLevel2[LogLevel2["DEBUG"] = 10] = "DEBUG";
9
- LogLevel2[LogLevel2["VERBOSE"] = 11] = "VERBOSE";
10
- LogLevel2[LogLevel2["INFO"] = 12] = "INFO";
11
- LogLevel2[LogLevel2["WARN"] = 13] = "WARN";
12
- LogLevel2[LogLevel2["ERROR"] = 14] = "ERROR";
13
- return LogLevel2;
14
- })({});
15
- var levels = {
16
- "*": 5,
17
- trace: 5,
18
- debug: 10,
19
- verbose: 11,
20
- info: 12,
21
- warn: 13,
22
- error: 14
23
- };
24
- var shortLevelName = {
25
- [5]: "T",
26
- [10]: "D",
27
- [11]: "V",
28
- [12]: "I",
29
- [13]: "W",
30
- [14]: "E"
31
- };
32
- var LogProcessorType = /* @__PURE__ */ (function(LogProcessorType2) {
33
- LogProcessorType2["CONSOLE"] = "console";
34
- LogProcessorType2["BROWSER"] = "browser";
35
- LogProcessorType2["DEBUG"] = "debug";
36
- return LogProcessorType2;
37
- })({});
18
+ // src/index.ts
19
+ var index_exports = {};
20
+ __export(index_exports, {
21
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
22
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
23
+ FILE_PROCESSOR: () => FILE_PROCESSOR,
24
+ LOG_META_MARKER: () => LOG_META_MARKER,
25
+ LogBuffer: () => LogBuffer,
26
+ LogEntry: () => LogEntry,
27
+ LogLevel: () => LogLevel,
28
+ LogProcessorType: () => LogProcessorType,
29
+ createFileProcessor: () => createFileProcessor,
30
+ createLog: () => createLog,
31
+ dbg: () => dbg,
32
+ debug: () => debug,
33
+ gatherLogInfoFromScope: () => gatherLogInfoFromScope,
34
+ getContextFromEntry: () => getContextFromEntry,
35
+ getCurrentOwnershipScope: () => getCurrentOwnershipScope,
36
+ getRelativeFilename: () => getRelativeFilename,
37
+ inferEnvironmentName: () => inferEnvironmentName,
38
+ isLogMeta: () => isLogMeta,
39
+ levels: () => levels,
40
+ log: () => log,
41
+ logInfo: () => logInfo,
42
+ omit: () => omit,
43
+ parseFilter: () => parseFilter,
44
+ pick: () => pick,
45
+ serializeToJsonl: () => serializeToJsonl,
46
+ shortLevelName: () => shortLevelName,
47
+ shouldLog: () => shouldLog
48
+ });
49
+ import { omit, pick } from "@dxos/util";
38
50
 
39
- // src/scope.ts
40
- var logInfoProperties = Symbol("logInfoProperties");
41
- var logInfo = (target, propertyKey, descriptor) => {
42
- (target[logInfoProperties] ??= []).push(propertyKey);
43
- };
44
- var gatherLogInfoFromScope = (scope) => {
45
- if (!scope) {
46
- return {};
47
- }
48
- const res = {};
49
- const prototype = Object.getPrototypeOf(scope);
50
- const infoProps = (typeof prototype === "object" && prototype !== null ? prototype[logInfoProperties] : []) ?? [];
51
- for (const prop of infoProps) {
52
- try {
53
- res[prop] = typeof scope[prop] === "function" ? scope[prop]() : scope[prop];
54
- } catch (err) {
55
- res[prop] = err.message;
51
+ // src/environment.ts
52
+ var TAB_SUFFIX_STORAGE_KEY = "@dxos/log:env-suffix";
53
+ var SUFFIX_LENGTH = 6;
54
+ var randomSuffix = () => {
55
+ const cryptoRef = globalThis.crypto;
56
+ if (cryptoRef?.getRandomValues) {
57
+ const bytes = new Uint8Array(SUFFIX_LENGTH);
58
+ cryptoRef.getRandomValues(bytes);
59
+ let suffix = "";
60
+ for (const byte of bytes) {
61
+ suffix += (byte % 36).toString(36);
56
62
  }
63
+ return suffix;
57
64
  }
58
- return res;
65
+ return Math.random().toString(36).slice(2, 2 + SUFFIX_LENGTH).padEnd(SUFFIX_LENGTH, "0");
59
66
  };
60
-
61
- // src/context.ts
62
- var matchFilter = (filter, level, path) => {
63
- if (filter.pattern?.startsWith("-")) {
64
- if (path?.includes(filter.pattern.slice(1))) {
65
- if (level >= filter.level) {
66
- return false;
67
- }
68
- }
69
- } else {
70
- if (filter.pattern?.length) {
71
- if (path?.includes(filter.pattern)) {
72
- return level >= filter.level;
73
- }
74
- } else {
75
- if (level >= filter.level) {
76
- return true;
77
- }
67
+ var getOrCreateTabSuffix = (session) => {
68
+ if (!session) {
69
+ return randomSuffix();
70
+ }
71
+ try {
72
+ const existing = session.getItem(TAB_SUFFIX_STORAGE_KEY);
73
+ if (existing && existing.length > 0) {
74
+ return existing;
78
75
  }
76
+ const suffix = randomSuffix();
77
+ session.setItem(TAB_SUFFIX_STORAGE_KEY, suffix);
78
+ return suffix;
79
+ } catch {
80
+ return randomSuffix();
79
81
  }
80
82
  };
81
- var shouldLog = (entry, filters) => {
82
- if (filters === void 0) {
83
- return false;
83
+ var isInstanceOf = (scope, ctorName) => {
84
+ const ctor = scope?.[ctorName];
85
+ return typeof ctor === "function" && scope instanceof ctor;
86
+ };
87
+ var CF_WORKER_USER_AGENT = "Cloudflare-Workers";
88
+ var inferEnvironmentName = (options = {}) => {
89
+ const scope = options.scope ?? globalThis;
90
+ if (scope.navigator?.userAgent === CF_WORKER_USER_AGENT) {
91
+ return `cf-worker::${randomSuffix()}`;
92
+ }
93
+ if (isInstanceOf(scope, "SharedWorkerGlobalScope")) {
94
+ return `shared-worker:${scope.name ?? ""}:${randomSuffix()}`;
84
95
  }
85
- const results = filters.map((filter) => matchFilter(filter, entry.level, entry.meta?.F)).filter((result) => result !== void 0);
86
- return results.length > 0 && !results.some((results2) => results2 === false);
96
+ if (isInstanceOf(scope, "ServiceWorkerGlobalScope")) {
97
+ return `service-worker::${randomSuffix()}`;
98
+ }
99
+ if (isInstanceOf(scope, "DedicatedWorkerGlobalScope")) {
100
+ return `dedicated-worker:${scope.name ?? ""}:${randomSuffix()}`;
101
+ }
102
+ if (scope.window !== void 0 && scope.window === scope) {
103
+ const origin = scope.location?.origin ?? "";
104
+ return `tab:${origin}:${getOrCreateTabSuffix(scope.sessionStorage)}`;
105
+ }
106
+ const proc = scope.process;
107
+ if (proc && typeof proc === "object" && proc.versions?.node) {
108
+ const pid = typeof proc.pid === "number" ? String(proc.pid) : "";
109
+ return `node:${pid}:${randomSuffix()}`;
110
+ }
111
+ return `unknown::${randomSuffix()}`;
87
112
  };
88
- var getContextFromEntry = (entry) => {
89
- let context;
90
- if (entry.meta) {
91
- const scopeInfo = gatherLogInfoFromScope(entry.meta.S);
92
- if (Object.keys(scopeInfo).length > 0) {
93
- context = Object.assign(context ?? {}, scopeInfo);
94
- }
113
+
114
+ // src/jsonl.ts
115
+ var serializeToJsonl = (entry, opts = {}) => {
116
+ if (entry.level <= LogLevel.TRACE) {
117
+ return void 0;
95
118
  }
96
- const entryContext = typeof entry.context === "function" ? entry.context() : entry.context;
97
- if (entryContext) {
98
- if (entryContext instanceof Error) {
99
- const c = entryContext.context;
100
- context = Object.assign(context ?? {}, {
101
- error: entryContext.stack,
102
- ...c
103
- });
104
- } else if (typeof entryContext === "object") {
105
- context = Object.assign(context ?? {}, entryContext);
119
+ const { filename, line, context: scopeName } = entry.computedMeta;
120
+ const record = {
121
+ t: new Date(entry.timestamp).toISOString(),
122
+ l: shortLevelName[entry.level] ?? "?",
123
+ m: entry.message ?? ""
124
+ };
125
+ if (filename !== void 0) {
126
+ record.f = filename;
127
+ }
128
+ if (line !== void 0) {
129
+ record.n = line;
130
+ }
131
+ if (scopeName !== void 0) {
132
+ record.o = scopeName;
133
+ }
134
+ if (entry.computedError !== void 0) {
135
+ record.e = entry.computedError;
136
+ }
137
+ if (opts.env !== void 0) {
138
+ record.i = opts.env;
139
+ }
140
+ const computedContext = entry.computedContext;
141
+ if (Object.keys(computedContext).length > 0) {
142
+ try {
143
+ record.c = JSON.stringify(computedContext);
144
+ } catch {
106
145
  }
107
146
  }
108
- if (entry.error) {
109
- context = Object.assign(context ?? {}, {
110
- error: entry.error
111
- });
147
+ try {
148
+ return JSON.stringify(record);
149
+ } catch {
150
+ return void 0;
112
151
  }
113
- return context && Object.keys(context).length > 0 ? context : void 0;
114
152
  };
115
153
 
116
154
  // src/decorators.ts
117
- import { inspect } from "@dxos/node-std/util";
118
155
  import chalk from "chalk";
156
+ import { inspect } from "@dxos/node-std/util";
119
157
  var nextPromiseId = 0;
120
158
  var createMethodLogDecorator = (log2) => (arg0, arg1, meta) => (target, propertyKey, descriptor) => {
121
159
  const method = descriptor.value;
@@ -225,47 +263,23 @@ var formatPromise = (id) => chalk.blue(`Promise#${id}`);
225
263
  // src/options.ts
226
264
  import defaultsDeep from "lodash.defaultsdeep";
227
265
 
228
- // src/platform/browser/index.ts
229
- var loadOptions = (filepath) => {
230
- try {
231
- let dxlog;
232
- if (typeof localStorage === "undefined") {
233
- if (globalThis.localStorage_dxlog) {
234
- dxlog = globalThis.localStorage_dxlog;
235
- }
236
- } else {
237
- dxlog = localStorage.getItem("dxlog") ?? void 0;
238
- }
239
- if (!dxlog) {
240
- return void 0;
241
- }
242
- return JSON.parse(dxlog);
243
- } catch (err) {
244
- console.info("can't parse dxlog config", err);
245
- return void 0;
246
- }
247
- };
266
+ // src/platform/index.ts
267
+ var platform_exports = {};
268
+ __reExport(platform_exports, platform_star);
269
+ import * as platform_star from "#platform";
248
270
 
249
- // src/processors/console-stub.ts
250
- var CONSOLE_PROCESSOR = () => {
251
- };
252
-
253
- // src/processors/debug-processor.ts
254
- import { inspect as inspect2 } from "@dxos/node-std/util";
255
- var DEBUG_PROCESSOR = (config, entry) => {
256
- console.log(inspect2(entry, false, null, true));
257
- };
271
+ // src/processors/index.ts
272
+ var processors_exports = {};
273
+ __export(processors_exports, {
274
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
275
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
276
+ FILE_PROCESSOR: () => FILE_PROCESSOR,
277
+ createFileProcessor: () => createFileProcessor,
278
+ getRelativeFilename: () => getRelativeFilename
279
+ });
258
280
 
259
281
  // src/processors/browser-processor.ts
260
- import { getDebugName, safariCheck } from "@dxos/util";
261
- var getRelativeFilename = (filename) => {
262
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
263
- if (match) {
264
- const [, filePath] = match;
265
- return filePath;
266
- }
267
- return filename;
268
- };
282
+ import { safariCheck } from "@dxos/util";
269
283
  var CONFIG = {
270
284
  useTestProcessor: false,
271
285
  printFileLinks: false
@@ -276,18 +290,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
276
290
  }
277
291
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
278
292
  const LOG_BROWSER_CSS = [];
293
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
279
294
  let link = "";
280
- if (entry.meta) {
281
- const filename = getRelativeFilename(entry.meta.F);
295
+ if (filename !== void 0 && lineNumber !== void 0) {
282
296
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
283
- link = `${filepath}#L${entry.meta.L}`;
297
+ link = `${filepath}#L${lineNumber}`;
284
298
  }
285
299
  let args = [];
286
- if (entry.meta?.S) {
287
- const scope = entry.meta?.S;
288
- const scopeName = scope.name || getDebugName(scope);
289
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
290
- args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
300
+ const scope = entry.meta?.S;
301
+ if (scope) {
302
+ const scopeName = scope.name || scopeDebugName;
303
+ if (scopeName) {
304
+ const processPrefix = scope.hostSessionId ? "[worker] " : "";
305
+ args.push(`%c${processPrefix}${scopeName}`, "color:#C026D3;font-weight:bold");
306
+ }
291
307
  }
292
308
  if (entry.message) {
293
309
  args.push(entry.message);
@@ -295,9 +311,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
295
311
  const context = getContextFromEntry(entry);
296
312
  if (context) {
297
313
  if (Object.keys(context).length === 1 && "error" in context) {
298
- args.push(context.error);
314
+ args.push(unwrapEffectError(context.error));
299
315
  } else if (Object.keys(context).length === 1 && "err" in context) {
300
- args.push(context.err);
316
+ args.push(unwrapEffectError(context.err));
301
317
  } else {
302
318
  args.push(context);
303
319
  }
@@ -332,10 +348,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
332
348
  if (!shouldLog(entry, config.filters)) {
333
349
  return;
334
350
  }
335
- let path = "";
336
- if (entry.meta) {
337
- path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;
338
- }
351
+ const { filename, line: lineNumber } = entry.computedMeta;
352
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
339
353
  let args = [];
340
354
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
341
355
  args.push(`${processPrefix}${entry.message}`);
@@ -362,23 +376,27 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
362
376
  }
363
377
  };
364
378
  var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;
379
+ var originalSymbol = /* @__PURE__ */ Symbol.for("effect/OriginalAnnotation");
380
+ var unwrapEffectError = (error) => {
381
+ if (typeof error === "object" && error !== null && originalSymbol in error) {
382
+ return error[originalSymbol];
383
+ }
384
+ return error;
385
+ };
365
386
 
366
- // src/processors/file-processor.ts
367
- import { appendFileSync, mkdirSync, openSync } from "@dxos/node-std/fs";
368
- import { dirname } from "@dxos/node-std/path";
369
- import { jsonlogify } from "@dxos/util";
387
+ // src/processors/index.ts
388
+ __reExport(processors_exports, console_processor_star);
389
+ import * as console_processor_star from "#console-processor";
370
390
 
371
- // src/processors/common.ts
372
- var getRelativeFilename2 = (filename) => {
373
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
374
- if (match) {
375
- const [, filePath] = match;
376
- return filePath;
377
- }
378
- return filename;
391
+ // src/processors/debug-processor.ts
392
+ import { inspect as inspect2 } from "@dxos/node-std/util";
393
+ var DEBUG_PROCESSOR = (config, entry) => {
394
+ console.log(inspect2(entry, false, null, true));
379
395
  };
380
396
 
381
397
  // src/processors/file-processor.ts
398
+ import { appendFileSync, mkdirSync, openSync } from "@dxos/node-std/fs";
399
+ import { dirname } from "@dxos/node-std/path";
382
400
  var EAGAIN_MAX_DURATION = 1e3;
383
401
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
384
402
  let fd;
@@ -399,15 +417,12 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
399
417
  fd = openSync(pathOrFd, "a");
400
418
  }
401
419
  const record = {
402
- ...entry,
403
- timestamp: Date.now(),
404
- ...entry.meta ? {
405
- meta: {
406
- file: getRelativeFilename2(entry.meta.F),
407
- line: entry.meta.L
408
- }
409
- } : {},
410
- context: jsonlogify(getContextFromEntry(entry))
420
+ level: entry.level,
421
+ message: entry.message,
422
+ timestamp: entry.timestamp,
423
+ meta: entry.computedMeta,
424
+ context: entry.computedContext,
425
+ error: entry.computedError
411
426
  };
412
427
  let retryTS = 0;
413
428
  while (true) {
@@ -446,13 +461,13 @@ var FILE_PROCESSOR = createFileProcessor({
446
461
 
447
462
  // src/options.ts
448
463
  var processors = {
449
- [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,
464
+ [LogProcessorType.CONSOLE]: processors_exports.CONSOLE_PROCESSOR,
450
465
  [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,
451
466
  [LogProcessorType.DEBUG]: DEBUG_PROCESSOR
452
467
  };
453
- var browser = typeof window !== "undefined" || typeof navigator !== "undefined";
468
+ var browser = (typeof window !== "undefined" || typeof navigator !== "undefined") && !(typeof process !== "undefined" && process?.env?.VITEST);
454
469
  var DEFAULT_PROCESSORS = [
455
- browser ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR
470
+ browser ? BROWSER_PROCESSOR : processors_exports.CONSOLE_PROCESSOR
456
471
  ];
457
472
  var parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
458
473
  var parseFilter = (filter) => {
@@ -480,7 +495,7 @@ var createConfig = (options) => {
480
495
  filter: process.env.LOG_FILTER,
481
496
  processor: process.env.LOG_PROCESSOR
482
497
  } : void 0;
483
- const mergedOptions = defaultsDeep({}, loadOptions(envOptions?.file), envOptions, options);
498
+ const mergedOptions = defaultsDeep({}, (0, platform_exports.loadOptions)(envOptions?.file), envOptions, options);
484
499
  return {
485
500
  options: mergedOptions,
486
501
  filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),
@@ -506,13 +521,14 @@ var createLog = () => {
506
521
  get: () => log2._config
507
522
  });
508
523
  const processLog = (level, message, context = {}, meta, error) => {
509
- log2._config.processors.forEach((processor) => processor(log2._config, {
524
+ const entry = new LogEntry({
510
525
  level,
511
526
  message,
512
527
  context,
513
528
  meta,
514
529
  error
515
- }));
530
+ });
531
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
516
532
  };
517
533
  Object.assign(log2, {
518
534
  /**
@@ -520,7 +536,7 @@ var createLog = () => {
520
536
  * NOTE: Preserves any processors that were already added to this logger instance
521
537
  * unless an explicit processor option is provided.
522
538
  */
523
- config: ({ processor, ...options }) => {
539
+ config: ({ processor, ...options } = {}) => {
524
540
  const config = createConfig(options);
525
541
  const processors2 = processor ? config.processors : log2._config.processors;
526
542
  log2._config = {
@@ -574,11 +590,94 @@ var debug = (label, args) => {
574
590
  };
575
591
  var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("\n");
576
592
 
593
+ // src/index.ts
594
+ __reExport(index_exports, processors_exports);
595
+
596
+ // src/meta.ts
597
+ var LOG_META_MARKER = "~LogMeta";
598
+ var isLogMeta = (value) => {
599
+ return value != null && typeof value === "object" && value[LOG_META_MARKER] === LOG_META_MARKER;
600
+ };
601
+
602
+ // src/dbg.ts
603
+ var dbg = (arg, meta) => {
604
+ if (meta?.A) {
605
+ console.log(`${meta.A[0]} =`, arg);
606
+ } else {
607
+ console.log(arg);
608
+ }
609
+ return arg;
610
+ };
611
+
612
+ // src/log-buffer.ts
613
+ import { CircularBuffer } from "@dxos/util";
614
+ var DEFAULT_BUFFER_SIZE = 2e3;
615
+ var MAX_CONTEXT_LENGTH = 500;
616
+ var LogBuffer = class {
617
+ _buffer;
618
+ constructor(size = DEFAULT_BUFFER_SIZE) {
619
+ this._buffer = new CircularBuffer(size);
620
+ }
621
+ /**
622
+ * Log processor that can be registered with `log.runtimeConfig.processors`.
623
+ * Captures every level except TRACE (does not apply `shouldLog` / filter; use for full debug dumps).
624
+ */
625
+ logProcessor = (_config, entry) => {
626
+ if (entry.level <= LogLevel.TRACE) {
627
+ return;
628
+ }
629
+ const { filename, line, context: scopeName } = entry.computedMeta;
630
+ const record = {
631
+ t: new Date(entry.timestamp).toISOString(),
632
+ l: shortLevelName[entry.level] ?? "?",
633
+ m: entry.message ?? ""
634
+ };
635
+ if (filename !== void 0) {
636
+ record.f = filename;
637
+ }
638
+ if (line !== void 0) {
639
+ record.n = line;
640
+ }
641
+ if (scopeName !== void 0) {
642
+ record.o = scopeName;
643
+ }
644
+ if (entry.computedError !== void 0) {
645
+ record.e = entry.computedError;
646
+ }
647
+ const computedContext = entry.computedContext;
648
+ if (Object.keys(computedContext).length > 0) {
649
+ try {
650
+ let json = JSON.stringify(computedContext);
651
+ if (json.length > MAX_CONTEXT_LENGTH) {
652
+ json = json.slice(0, MAX_CONTEXT_LENGTH);
653
+ }
654
+ record.c = json;
655
+ } catch {
656
+ }
657
+ }
658
+ this._buffer.push(record);
659
+ };
660
+ /** Number of entries currently in the buffer. */
661
+ get size() {
662
+ return this._buffer.elementCount;
663
+ }
664
+ /** Discard all buffered entries. */
665
+ clear() {
666
+ this._buffer.clear();
667
+ }
668
+ /** Serialize buffer contents as NDJSON (newline-delimited JSON). */
669
+ serialize() {
670
+ const lines = [];
671
+ for (const record of this._buffer) {
672
+ lines.push(JSON.stringify(record));
673
+ }
674
+ return lines.join("\n");
675
+ }
676
+ };
677
+
577
678
  // src/experimental/ownership.ts
578
679
  import { inspect as inspect3 } from "@dxos/node-std/util";
579
- var kOwnershipScope = Symbol("kOwnershipScope");
580
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
581
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
680
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
582
681
  var OwnershipScope = class {
583
682
  constr;
584
683
  parent;
@@ -609,24 +708,30 @@ var OwnershipScope = class {
609
708
  var getCurrentOwnershipScope = (thisRef) => thisRef;
610
709
  export {
611
710
  BROWSER_PROCESSOR,
612
- CONSOLE_PROCESSOR,
613
711
  DEBUG_PROCESSOR,
614
712
  FILE_PROCESSOR,
713
+ LOG_META_MARKER,
714
+ LogBuffer,
715
+ LogEntry,
615
716
  LogLevel,
616
717
  LogProcessorType,
617
718
  createFileProcessor,
618
719
  createLog,
720
+ dbg,
619
721
  debug,
620
722
  gatherLogInfoFromScope,
621
723
  getContextFromEntry,
622
724
  getCurrentOwnershipScope,
623
- getRelativeFilename2 as getRelativeFilename,
725
+ getRelativeFilename,
726
+ inferEnvironmentName,
727
+ isLogMeta,
624
728
  levels,
625
729
  log,
626
730
  logInfo,
627
731
  omit,
628
732
  parseFilter,
629
733
  pick,
734
+ serializeToJsonl,
630
735
  shortLevelName,
631
736
  shouldLog
632
737
  };