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