@dxos/log 0.8.4-main.b97322e → 0.8.4-main.bbf232bc24

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 +349 -197
  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 +351 -284
  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 +32 -17
  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 +3 -3
  77. package/src/environment.test.ts +222 -0
  78. package/src/environment.ts +129 -0
  79. package/src/experimental/classes.test.ts +1 -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 -18
  86. package/src/log.ts +146 -58
  87. package/src/meta.ts +29 -1
  88. package/src/options.ts +27 -11
  89. package/src/platform/index.ts +1 -1
  90. package/src/processors/browser-processor.ts +29 -28
  91. package/src/processors/console-processor.ts +9 -13
  92. package/src/processors/file-processor.ts +9 -8
  93. package/src/processors/index.ts +3 -3
  94. package/src/scope.ts +1 -1
@@ -1,101 +1,155 @@
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 = 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;
80
137
  }
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);
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 {
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
@@ -197,153 +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 yaml from "js-yaml";
215
- import fs from "node:fs";
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 chalk2 from "chalk";
231
- import { inspect as inspect2 } from "node:util";
232
- import { getPrototypeSpecificInstanceId, pickBy } from "@dxos/util";
267
+ // src/platform/index.ts
268
+ var platform_exports = {};
269
+ __reExport(platform_exports, platform_star);
270
+ import * as platform_star from "#platform";
233
271
 
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
- };
243
-
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
- const id = getPrototypeSpecificInstanceId(scope);
264
- instance = chalk2.magentaBright(`${prototype.constructor.name}#${id}`);
265
- }
266
- const formattedTimestamp = config.options?.formatter?.timestamp ? (/* @__PURE__ */ new Date()).toISOString() : void 0;
267
- const formattedLevel = chalk2[LEVEL_COLORS[level]](column ? shortLevelName[level] : LogLevel[level]);
268
- const padding = column && filepath ? "".padStart(column - filepath.length) : void 0;
269
- return config.options?.formatter?.timestampFirst ? [
270
- formattedTimestamp,
271
- filepath,
272
- padding,
273
- formattedLevel,
274
- instance,
275
- message,
276
- context,
277
- error
278
- ] : [
279
- // NOTE: File path must come fist for console hyperlinks.
280
- // Must not truncate for terminal output.
281
- filepath,
282
- padding,
283
- formattedTimestamp,
284
- formattedLevel,
285
- instance,
286
- message,
287
- context,
288
- error
289
- ];
290
- };
291
- var SHORT_FORMATTER = (config, { path, level, message }) => {
292
- return [
293
- chalk2.grey(truncate(path, 16, true)),
294
- chalk2[LEVEL_COLORS[level]](shortLevelName[level]),
295
- message
296
- ];
297
- };
298
- var formatter = DEFAULT_FORMATTER;
299
- var CONSOLE_PROCESSOR = (config, entry) => {
300
- const { level, message, meta, error } = entry;
301
- if (!shouldLog(entry, config.filters)) {
302
- return;
303
- }
304
- const parts = {
305
- level,
306
- message,
307
- error,
308
- path: void 0,
309
- line: void 0,
310
- scope: void 0,
311
- context: void 0
312
- };
313
- if (meta) {
314
- parts.path = getRelativeFilename(meta.F);
315
- parts.line = meta.L;
316
- parts.scope = meta.S;
317
- }
318
- const context = getContextFromEntry(entry);
319
- if (context) {
320
- parts.context = inspect2(pickBy(context, (value) => value !== void 0), {
321
- depth: config.options.depth,
322
- colors: true,
323
- maxArrayLength: 8,
324
- sorted: false
325
- });
326
- }
327
- const line = formatter(config, parts).filter(Boolean).join(" ");
328
- console.log(line);
329
- };
330
-
331
- // src/processors/debug-processor.ts
332
- import { inspect as inspect3 } from "node:util";
333
- var DEBUG_PROCESSOR = (config, entry) => {
334
- console.log(inspect3(entry, false, null, true));
335
- };
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
+ });
336
281
 
337
282
  // src/processors/browser-processor.ts
338
- import { getDebugName, safariCheck } from "@dxos/util";
339
- var getRelativeFilename2 = (filename) => {
340
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
341
- if (match) {
342
- const [, filePath] = match;
343
- return filePath;
344
- }
345
- return filename;
346
- };
283
+ import { safariCheck } from "@dxos/util";
347
284
  var CONFIG = {
348
285
  useTestProcessor: false,
349
286
  printFileLinks: false
@@ -354,18 +291,20 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
354
291
  }
355
292
  const LOG_BROWSER_PREFIX = config.prefix ?? "https://vscode.dev/github.com/dxos/dxos/blob/main/";
356
293
  const LOG_BROWSER_CSS = [];
294
+ const { filename, line: lineNumber, context: scopeDebugName } = entry.computedMeta;
357
295
  let link = "";
358
- if (entry.meta) {
359
- const filename = getRelativeFilename2(entry.meta.F);
296
+ if (filename !== void 0 && lineNumber !== void 0) {
360
297
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
361
- link = `${filepath}#L${entry.meta.L}`;
298
+ link = `${filepath}#L${lineNumber}`;
362
299
  }
363
300
  let args = [];
364
- if (entry.meta?.S) {
365
- const scope = entry.meta?.S;
366
- const scopeName = scope.name || getDebugName(scope);
367
- const processPrefix = entry.meta.S?.hostSessionId ? "[worker] " : "";
368
- 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
+ }
369
308
  }
370
309
  if (entry.message) {
371
310
  args.push(entry.message);
@@ -373,7 +312,9 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
373
312
  const context = getContextFromEntry(entry);
374
313
  if (context) {
375
314
  if (Object.keys(context).length === 1 && "error" in context) {
376
- 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));
377
318
  } else {
378
319
  args.push(context);
379
320
  }
@@ -408,10 +349,8 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
408
349
  if (!shouldLog(entry, config.filters)) {
409
350
  return;
410
351
  }
411
- let path = "";
412
- if (entry.meta) {
413
- path = `${getRelativeFilename2(entry.meta.F)}:${entry.meta.L}`;
414
- }
352
+ const { filename, line: lineNumber } = entry.computedMeta;
353
+ const path = filename !== void 0 && lineNumber !== void 0 ? `${filename}:${lineNumber}` : "";
415
354
  let args = [];
416
355
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
417
356
  args.push(`${processPrefix}${entry.message}`);
@@ -438,11 +377,27 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
438
377
  }
439
378
  };
440
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
+ };
441
397
 
442
398
  // src/processors/file-processor.ts
443
399
  import { appendFileSync, mkdirSync, openSync } from "node:fs";
444
400
  import { dirname } from "node:path";
445
- import { jsonlogify } from "@dxos/util";
446
401
  var EAGAIN_MAX_DURATION = 1e3;
447
402
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
448
403
  let fd;
@@ -463,15 +418,12 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
463
418
  fd = openSync(pathOrFd, "a");
464
419
  }
465
420
  const record = {
466
- ...entry,
467
- timestamp: Date.now(),
468
- ...entry.meta ? {
469
- meta: {
470
- file: getRelativeFilename(entry.meta.F),
471
- line: entry.meta.L
472
- }
473
- } : {},
474
- 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
475
427
  };
476
428
  let retryTS = 0;
477
429
  while (true) {
@@ -510,14 +462,15 @@ var FILE_PROCESSOR = createFileProcessor({
510
462
 
511
463
  // src/options.ts
512
464
  var processors = {
513
- [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,
465
+ [LogProcessorType.CONSOLE]: processors_exports.CONSOLE_PROCESSOR,
514
466
  [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,
515
467
  [LogProcessorType.DEBUG]: DEBUG_PROCESSOR
516
468
  };
517
- var IS_BROWSER = typeof window !== "undefined" || typeof navigator !== "undefined";
469
+ var browser = (typeof window !== "undefined" || typeof navigator !== "undefined") && !(typeof process !== "undefined" && process?.env?.VITEST);
518
470
  var DEFAULT_PROCESSORS = [
519
- IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR
471
+ browser ? BROWSER_PROCESSOR : processors_exports.CONSOLE_PROCESSOR
520
472
  ];
473
+ var parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
521
474
  var parseFilter = (filter) => {
522
475
  if (typeof filter === "number") {
523
476
  return [
@@ -526,7 +479,6 @@ var parseFilter = (filter) => {
526
479
  }
527
480
  ];
528
481
  }
529
- const parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
530
482
  const lines = typeof filter === "string" ? filter.split(/,\s*/) : filter;
531
483
  return lines.map((filter2) => {
532
484
  const [pattern, level] = filter2.split(":");
@@ -538,66 +490,91 @@ var parseFilter = (filter) => {
538
490
  };
539
491
  });
540
492
  };
541
- var getConfig = (options) => {
542
- const nodeOptions = "process" in globalThis ? {
493
+ var createConfig = (options) => {
494
+ const envOptions = "process" in globalThis ? {
543
495
  file: process.env.LOG_CONFIG,
544
496
  filter: process.env.LOG_FILTER,
545
497
  processor: process.env.LOG_PROCESSOR
546
498
  } : void 0;
547
- const mergedOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);
499
+ const mergedOptions = defaultsDeep({}, (0, platform_exports.loadOptions)(envOptions?.file), envOptions, options);
548
500
  return {
549
501
  options: mergedOptions,
550
502
  filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),
551
503
  captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),
552
504
  processors: mergedOptions.processor ? [
553
505
  processors[mergedOptions.processor]
554
- ] : DEFAULT_PROCESSORS,
506
+ ] : [
507
+ ...DEFAULT_PROCESSORS
508
+ ],
555
509
  prefix: mergedOptions.prefix
556
510
  };
557
511
  };
558
512
 
559
513
  // src/log.ts
514
+ var logCount = 0;
560
515
  var createLog = () => {
561
516
  const log2 = (...params) => processLog(LogLevel.DEBUG, ...params);
562
- log2._config = getConfig();
517
+ Object.assign(log2, {
518
+ _id: `log-${++logCount}`,
519
+ _config: createConfig()
520
+ });
563
521
  Object.defineProperty(log2, "runtimeConfig", {
564
522
  get: () => log2._config
565
523
  });
566
- log2.addProcessor = (processor) => {
567
- if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {
568
- DEFAULT_PROCESSORS.push(processor);
569
- }
570
- if (log2._config.processors.filter((p) => p === processor).length === 0) {
571
- log2._config.processors.push(processor);
572
- }
573
- };
574
- log2.config = (options) => {
575
- log2._config = getConfig(options);
576
- };
577
- log2.trace = (...params) => processLog(LogLevel.TRACE, ...params);
578
- log2.debug = (...params) => processLog(LogLevel.DEBUG, ...params);
579
- log2.verbose = (...params) => processLog(LogLevel.VERBOSE, ...params);
580
- log2.info = (...params) => processLog(LogLevel.INFO, ...params);
581
- log2.warn = (...params) => processLog(LogLevel.WARN, ...params);
582
- log2.error = (...params) => processLog(LogLevel.ERROR, ...params);
583
- log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, void 0, context, meta, error);
584
- 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");
585
- log2.stack = (message, context, meta) => processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
586
- ${getFormattedStackTrace()}`, context, meta);
587
- log2.method = createMethodLogDecorator(log2);
588
- log2.func = createFunctionLogDecorator(log2);
589
524
  const processLog = (level, message, context = {}, meta, error) => {
590
- log2._config.processors.forEach((processor) => processor(log2._config, {
525
+ const entry = new LogEntry({
591
526
  level,
592
527
  message,
593
528
  context,
594
529
  meta,
595
530
  error
596
- }));
531
+ });
532
+ log2._config.processors.forEach((processor) => processor(log2._config, entry));
597
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
+ });
598
575
  return log2;
599
576
  };
600
- var log = globalThis.dx_log ??= createLog();
577
+ var log = globalThis.DX_LOG ??= createLog();
601
578
  var start = Date.now();
602
579
  var last = start;
603
580
  var debug = (label, args) => {
@@ -614,12 +591,98 @@ var debug = (label, args) => {
614
591
  };
615
592
  var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("\n");
616
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
+
617
679
  // src/experimental/ownership.ts
618
- import { inspect as inspect4 } from "node:util";
619
- var kOwnershipScope = Symbol("kOwnershipScope");
620
- var kCurrentOwnershipScope = Symbol("kCurrentOwnershipScope");
621
- var kDebugInfoProperties = Symbol("kDebugInfoProperties");
680
+ import { inspect as inspect3 } from "node:util";
681
+ var kDebugInfoProperties = /* @__PURE__ */ Symbol("kDebugInfoProperties");
622
682
  var OwnershipScope = class {
683
+ constr;
684
+ parent;
685
+ instance;
623
686
  constructor(constr, parent) {
624
687
  this.constr = constr;
625
688
  this.parent = parent;
@@ -635,7 +698,7 @@ var OwnershipScope = class {
635
698
  }
636
699
  return info;
637
700
  }
638
- [inspect4.custom]() {
701
+ [inspect3.custom]() {
639
702
  return {
640
703
  className: this.constr.name,
641
704
  info: this.getInfo(),
@@ -646,27 +709,31 @@ var OwnershipScope = class {
646
709
  var getCurrentOwnershipScope = (thisRef) => thisRef;
647
710
  export {
648
711
  BROWSER_PROCESSOR,
649
- CONSOLE_PROCESSOR,
650
712
  DEBUG_PROCESSOR,
651
- DEFAULT_FORMATTER,
652
713
  FILE_PROCESSOR,
714
+ LOG_META_MARKER,
715
+ LogBuffer,
716
+ LogEntry,
653
717
  LogLevel,
654
718
  LogProcessorType,
655
- SHORT_FORMATTER,
656
719
  createFileProcessor,
720
+ createLog,
721
+ dbg,
657
722
  debug,
658
723
  gatherLogInfoFromScope,
659
724
  getContextFromEntry,
660
725
  getCurrentOwnershipScope,
661
726
  getRelativeFilename,
727
+ inferEnvironmentName,
728
+ isLogMeta,
662
729
  levels,
663
730
  log,
664
731
  logInfo,
665
732
  omit,
666
733
  parseFilter,
667
734
  pick,
735
+ serializeToJsonl,
668
736
  shortLevelName,
669
- shouldLog,
670
- truncate
737
+ shouldLog
671
738
  };
672
739
  //# sourceMappingURL=index.mjs.map