@dxos/log 0.8.4-main.dedc0f3 → 0.8.4-main.dfabb4ec29

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