@dxos/log 0.8.4-main.548089c → 0.8.4-main.59c2e9b

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 (54) hide show
  1. package/dist/lib/browser/chunk-GPOFUMLO.mjs +133 -0
  2. package/dist/lib/browser/chunk-GPOFUMLO.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-IEP6GGEX.mjs +23 -0
  4. package/dist/lib/browser/chunk-IEP6GGEX.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +130 -176
  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 +107 -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-QPYJZ4SO.mjs +135 -0
  19. package/dist/lib/node-esm/chunk-QPYJZ4SO.mjs.map +7 -0
  20. package/dist/lib/node-esm/index.mjs +127 -260
  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 +108 -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.map +1 -1
  33. package/dist/types/src/decorators.d.ts +1 -1
  34. package/dist/types/src/decorators.d.ts.map +1 -1
  35. package/dist/types/src/log.d.ts +12 -18
  36. package/dist/types/src/log.d.ts.map +1 -1
  37. package/dist/types/src/options.d.ts +1 -6
  38. package/dist/types/src/options.d.ts.map +1 -1
  39. package/dist/types/src/platform/index.d.ts +1 -1
  40. package/dist/types/src/platform/index.d.ts.map +1 -1
  41. package/dist/types/src/processors/file-processor.d.ts.map +1 -1
  42. package/dist/types/src/processors/index.d.ts +3 -3
  43. package/dist/types/src/processors/index.d.ts.map +1 -1
  44. package/dist/types/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +29 -9
  46. package/src/config.ts +1 -0
  47. package/src/context.ts +36 -5
  48. package/src/decorators.ts +3 -3
  49. package/src/log.test.ts +48 -18
  50. package/src/log.ts +101 -57
  51. package/src/options.ts +26 -10
  52. package/src/platform/index.ts +1 -1
  53. package/src/processors/file-processor.ts +2 -0
  54. package/src/processors/index.ts +3 -3
@@ -0,0 +1,133 @@
1
+ // src/config.ts
2
+ var LogLevel = /* @__PURE__ */ (function(LogLevel2) {
3
+ LogLevel2[LogLevel2["TRACE"] = 5] = "TRACE";
4
+ LogLevel2[LogLevel2["DEBUG"] = 10] = "DEBUG";
5
+ LogLevel2[LogLevel2["VERBOSE"] = 11] = "VERBOSE";
6
+ LogLevel2[LogLevel2["INFO"] = 12] = "INFO";
7
+ LogLevel2[LogLevel2["WARN"] = 13] = "WARN";
8
+ LogLevel2[LogLevel2["ERROR"] = 14] = "ERROR";
9
+ return LogLevel2;
10
+ })({});
11
+ var levels = {
12
+ "*": 5,
13
+ trace: 5,
14
+ debug: 10,
15
+ verbose: 11,
16
+ info: 12,
17
+ warn: 13,
18
+ error: 14
19
+ };
20
+ var shortLevelName = {
21
+ [5]: "T",
22
+ [10]: "D",
23
+ [11]: "V",
24
+ [12]: "I",
25
+ [13]: "W",
26
+ [14]: "E"
27
+ };
28
+ var LogProcessorType = /* @__PURE__ */ (function(LogProcessorType2) {
29
+ LogProcessorType2["CONSOLE"] = "console";
30
+ LogProcessorType2["BROWSER"] = "browser";
31
+ LogProcessorType2["DEBUG"] = "debug";
32
+ return LogProcessorType2;
33
+ })({});
34
+
35
+ // src/scope.ts
36
+ var logInfoProperties = Symbol("logInfoProperties");
37
+ var logInfo = (target, propertyKey, descriptor) => {
38
+ (target[logInfoProperties] ??= []).push(propertyKey);
39
+ };
40
+ var gatherLogInfoFromScope = (scope) => {
41
+ if (!scope) {
42
+ return {};
43
+ }
44
+ const res = {};
45
+ const prototype = Object.getPrototypeOf(scope);
46
+ const infoProps = (typeof prototype === "object" && prototype !== null ? prototype[logInfoProperties] : []) ?? [];
47
+ for (const prop of infoProps) {
48
+ try {
49
+ res[prop] = typeof scope[prop] === "function" ? scope[prop]() : scope[prop];
50
+ } catch (err) {
51
+ res[prop] = err.message;
52
+ }
53
+ }
54
+ return res;
55
+ };
56
+
57
+ // src/context.ts
58
+ var matchFilter = (filter, level, path) => {
59
+ if (filter.pattern?.startsWith("-")) {
60
+ if (path?.includes(filter.pattern.slice(1))) {
61
+ if (level >= filter.level) {
62
+ return false;
63
+ }
64
+ }
65
+ } else {
66
+ if (filter.pattern?.length) {
67
+ if (path?.includes(filter.pattern)) {
68
+ return level >= filter.level;
69
+ }
70
+ } else {
71
+ if (level >= filter.level) {
72
+ return true;
73
+ }
74
+ }
75
+ }
76
+ };
77
+ var shouldLog = (entry, filters) => {
78
+ if (filters === void 0) {
79
+ return false;
80
+ }
81
+ const results = filters.map((filter) => matchFilter(filter, entry.level, entry.meta?.F)).filter((result) => result !== void 0);
82
+ return results.length > 0 && !results.some((results2) => results2 === false);
83
+ };
84
+ var getContextFromEntry = (entry) => {
85
+ let context;
86
+ if (entry.meta) {
87
+ const scopeInfo = gatherLogInfoFromScope(entry.meta.S);
88
+ if (Object.keys(scopeInfo).length > 0) {
89
+ context = Object.assign(context ?? {}, scopeInfo);
90
+ }
91
+ }
92
+ const entryContext = typeof entry.context === "function" ? entry.context() : entry.context;
93
+ if (entryContext) {
94
+ if (entryContext instanceof Error) {
95
+ const c = entryContext.context;
96
+ context = Object.assign(context ?? {}, {
97
+ error: entryContext.stack,
98
+ ...c
99
+ });
100
+ } else if (typeof entryContext === "object") {
101
+ context = Object.assign(context ?? {}, entryContext);
102
+ }
103
+ }
104
+ if (entry.error) {
105
+ context = Object.assign(context ?? {}, {
106
+ error: entry.error
107
+ });
108
+ }
109
+ return context && Object.keys(context).length > 0 ? context : void 0;
110
+ };
111
+
112
+ // src/processors/common.ts
113
+ var getRelativeFilename = (filename) => {
114
+ const match = filename.match(/.+\/(packages\/.+\/.+)/);
115
+ if (match) {
116
+ const [, filePath] = match;
117
+ return filePath;
118
+ }
119
+ return filename;
120
+ };
121
+
122
+ export {
123
+ LogLevel,
124
+ levels,
125
+ shortLevelName,
126
+ LogProcessorType,
127
+ logInfo,
128
+ gatherLogInfoFromScope,
129
+ shouldLog,
130
+ getContextFromEntry,
131
+ getRelativeFilename
132
+ };
133
+ //# sourceMappingURL=chunk-GPOFUMLO.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/config.ts", "../../../src/scope.ts", "../../../src/context.ts", "../../../src/processors/common.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogProcessor } from './context';\n\n/**\n * Standard levels.\n * NOTE: Keep aligned with LogLevel in @dxos/protocols.\n */\n// TODO(burdon): Update numbers?\nexport enum LogLevel {\n TRACE = 5,\n DEBUG = 10,\n VERBOSE = 11,\n INFO = 12,\n WARN = 13,\n ERROR = 14,\n}\n\nexport const levels: Record<string, LogLevel> = {\n '*': LogLevel.TRACE,\n trace: LogLevel.TRACE,\n debug: LogLevel.DEBUG,\n verbose: LogLevel.VERBOSE,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n};\n\nexport const shortLevelName = {\n [LogLevel.TRACE]: 'T',\n [LogLevel.DEBUG]: 'D',\n [LogLevel.VERBOSE]: 'V',\n [LogLevel.INFO]: 'I',\n [LogLevel.WARN]: 'W',\n [LogLevel.ERROR]: 'E',\n};\n\nexport enum LogProcessorType {\n CONSOLE = 'console',\n BROWSER = 'browser',\n DEBUG = 'debug',\n}\n\n/**\n * Individual filter condition.\n */\nexport type LogFilter = {\n level: LogLevel;\n pattern?: string;\n};\n\n/**\n * Options to set inline or load from the YML file.\n */\nexport type LogOptions = {\n file?: string;\n filter?: string | string[] | LogLevel;\n captureFilter?: string | string[] | LogLevel;\n depth?: number; // Context object depth.\n processor?: string | LogProcessorType;\n formatter?: {\n column: number;\n timestamp: boolean;\n timestampFirst: boolean;\n };\n prefix?: string;\n};\n\n/**\n * Runtime config.\n */\nexport interface LogConfig {\n options: LogOptions;\n filters?: LogFilter[];\n captureFilters?: LogFilter[];\n processors: LogProcessor[];\n prefix?: string;\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nconst logInfoProperties = Symbol('logInfoProperties');\n\n/**\n * Decorate fields, properties, or methods to automatically include their values in log messages.\n *\n * Example:\n *\n * ```typescript\n * class Example {\n * @logInfo\n * peerId: PublicKey;\n * }\n * ```\n */\nexport const logInfo = (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n // console.log(target, propertyKey, descriptor);\n (target[logInfoProperties] ??= []).push(propertyKey);\n};\n\n/**\n * Introspects class instance to find decorated metadata.\n * @param scope Class instance.\n */\nexport const gatherLogInfoFromScope = (scope: any): Record<string, any> => {\n if (!scope) {\n return {};\n }\n\n const res: Record<string, any> = {};\n\n const prototype = Object.getPrototypeOf(scope);\n const infoProps = (typeof prototype === 'object' && prototype !== null ? prototype[logInfoProperties] : []) ?? [];\n for (const prop of infoProps) {\n try {\n res[prop] = typeof scope[prop] === 'function' ? scope[prop]() : scope[prop];\n } catch (err: any) {\n res[prop] = err.message;\n }\n }\n\n return res;\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type LogConfig, type LogFilter, type LogLevel } from './config';\nimport { type CallMetadata } from './meta';\nimport { gatherLogInfoFromScope } from './scope';\n\n/**\n * Optional object passed to the logging API.\n */\nexport type LogContext = Record<string, any> | Error | any;\n\n/**\n * Record for current log line.\n */\nexport interface LogEntry {\n level: LogLevel;\n message?: string;\n context?: LogContext;\n meta?: CallMetadata;\n error?: Error;\n}\n\n/**\n * Processes (e.g., prints, forwards) log entries.\n */\nexport type LogProcessor = (config: LogConfig, entry: LogEntry) => void;\n\n/**\n * Returns:\n * true if the log entry matches the filter,\n * false if should be excluded, or\n * undefined if it the filter doesn't match the level.\n */\nconst matchFilter = (filter: LogFilter, level: LogLevel, path?: string): boolean | undefined => {\n // TODO(burdon): Support regexp.\n if (filter.pattern?.startsWith('-')) {\n // Exclude.\n if (path?.includes(filter.pattern.slice(1))) {\n if (level >= filter.level) {\n return false;\n }\n }\n } else {\n // Include.\n if (filter.pattern?.length) {\n if (path?.includes(filter.pattern)) {\n return level >= filter.level;\n }\n } else {\n if (level >= filter.level) {\n return true;\n }\n }\n }\n};\n\n/**\n * Determines if the current line should be logged (called by the processor).\n */\nexport const shouldLog = (entry: LogEntry, filters?: LogFilter[]): boolean => {\n if (filters === undefined) {\n return false;\n }\n\n const results = filters\n .map((filter) => matchFilter(filter, entry.level, entry.meta?.F))\n .filter((result): result is boolean => result !== undefined);\n\n // Skip if any are explicitely false.\n // console.log({ level: entry.level, path: entry.meta?.F }, filters, results, results.length);\n return results.length > 0 && !results.some((results) => results === false);\n};\n\nexport const getContextFromEntry = (entry: LogEntry): Record<string, any> | undefined => {\n let context;\n if (entry.meta) {\n const scopeInfo = gatherLogInfoFromScope(entry.meta.S);\n if (Object.keys(scopeInfo).length > 0) {\n context = Object.assign(context ?? {}, scopeInfo);\n }\n }\n\n const entryContext = typeof entry.context === 'function' ? entry.context() : entry.context;\n if (entryContext) {\n if (entryContext instanceof Error) {\n // Additional context from Error.\n const c = (entryContext as any).context;\n // If ERROR then show stacktrace.\n context = Object.assign(context ?? {}, { error: entryContext.stack, ...c });\n } else if (typeof entryContext === 'object') {\n context = Object.assign(context ?? {}, entryContext);\n }\n }\n\n if (entry.error) {\n context = Object.assign(context ?? {}, { error: entry.error });\n }\n\n return context && Object.keys(context).length > 0 ? context : undefined;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n"],
5
+ "mappings": ";AAWO,IAAKA,WAAAA,0BAAAA,WAAAA;;;;;;;SAAAA;;AASL,IAAMC,SAAmC;EAC9C,KAAG;EACHC,OAAK;EACLC,OAAK;EACLC,SAAO;EACPC,MAAI;EACJC,MAAI;EACJC,OAAK;AACP;AAEO,IAAMC,iBAAiB;EAC5B,CAAA,CAAA,GAAkB;EAClB,CAAA,EAAA,GAAkB;EAClB,CAAA,EAAA,GAAoB;EACpB,CAAA,EAAA,GAAiB;EACjB,CAAA,EAAA,GAAiB;EACjB,CAAA,EAAA,GAAkB;AACpB;AAEO,IAAKC,mBAAAA,0BAAAA,mBAAAA;;;;SAAAA;;;;ACnCZ,IAAMC,oBAAoBC,OAAO,mBAAA;AAc1B,IAAMC,UAAU,CAACC,QAAaC,aAAqBC,eAAAA;AAEvDF,GAAAA,OAAOH,iBAAAA,MAAuB,CAAA,GAAIM,KAAKF,WAAAA;AAC1C;AAMO,IAAMG,yBAAyB,CAACC,UAAAA;AACrC,MAAI,CAACA,OAAO;AACV,WAAO,CAAC;EACV;AAEA,QAAMC,MAA2B,CAAC;AAElC,QAAMC,YAAYC,OAAOC,eAAeJ,KAAAA;AACxC,QAAMK,aAAa,OAAOH,cAAc,YAAYA,cAAc,OAAOA,UAAUV,iBAAAA,IAAqB,CAAA,MAAO,CAAA;AAC/G,aAAWc,QAAQD,WAAW;AAC5B,QAAI;AACFJ,UAAIK,IAAAA,IAAQ,OAAON,MAAMM,IAAAA,MAAU,aAAaN,MAAMM,IAAAA,EAAK,IAAKN,MAAMM,IAAAA;IACxE,SAASC,KAAU;AACjBN,UAAIK,IAAAA,IAAQC,IAAIC;IAClB;EACF;AAEA,SAAOP;AACT;;;ACVA,IAAMQ,cAAc,CAACC,QAAmBC,OAAiBC,SAAAA;AAEvD,MAAIF,OAAOG,SAASC,WAAW,GAAA,GAAM;AAEnC,QAAIF,MAAMG,SAASL,OAAOG,QAAQG,MAAM,CAAA,CAAA,GAAK;AAC3C,UAAIL,SAASD,OAAOC,OAAO;AACzB,eAAO;MACT;IACF;EACF,OAAO;AAEL,QAAID,OAAOG,SAASI,QAAQ;AAC1B,UAAIL,MAAMG,SAASL,OAAOG,OAAO,GAAG;AAClC,eAAOF,SAASD,OAAOC;MACzB;IACF,OAAO;AACL,UAAIA,SAASD,OAAOC,OAAO;AACzB,eAAO;MACT;IACF;EACF;AACF;AAKO,IAAMO,YAAY,CAACC,OAAiBC,YAAAA;AACzC,MAAIA,YAAYC,QAAW;AACzB,WAAO;EACT;AAEA,QAAMC,UAAUF,QACbG,IAAI,CAACb,WAAWD,YAAYC,QAAQS,MAAMR,OAAOQ,MAAMK,MAAMC,CAAAA,CAAAA,EAC7Df,OAAO,CAACgB,WAA8BA,WAAWL,MAAAA;AAIpD,SAAOC,QAAQL,SAAS,KAAK,CAACK,QAAQK,KAAK,CAACL,aAAYA,aAAY,KAAA;AACtE;AAEO,IAAMM,sBAAsB,CAACT,UAAAA;AAClC,MAAIU;AACJ,MAAIV,MAAMK,MAAM;AACd,UAAMM,YAAYC,uBAAuBZ,MAAMK,KAAKQ,CAAC;AACrD,QAAIC,OAAOC,KAAKJ,SAAAA,EAAWb,SAAS,GAAG;AACrCY,gBAAUI,OAAOE,OAAON,WAAW,CAAC,GAAGC,SAAAA;IACzC;EACF;AAEA,QAAMM,eAAe,OAAOjB,MAAMU,YAAY,aAAaV,MAAMU,QAAO,IAAKV,MAAMU;AACnF,MAAIO,cAAc;AAChB,QAAIA,wBAAwBC,OAAO;AAEjC,YAAMC,IAAKF,aAAqBP;AAEhCA,gBAAUI,OAAOE,OAAON,WAAW,CAAC,GAAG;QAAEU,OAAOH,aAAaI;QAAO,GAAGF;MAAE,CAAA;IAC3E,WAAW,OAAOF,iBAAiB,UAAU;AAC3CP,gBAAUI,OAAOE,OAAON,WAAW,CAAC,GAAGO,YAAAA;IACzC;EACF;AAEA,MAAIjB,MAAMoB,OAAO;AACfV,cAAUI,OAAOE,OAAON,WAAW,CAAC,GAAG;MAAEU,OAAOpB,MAAMoB;IAAM,CAAA;EAC9D;AAEA,SAAOV,WAAWI,OAAOC,KAAKL,OAAAA,EAASZ,SAAS,IAAIY,UAAUR;AAChE;;;ACjGO,IAAMoB,sBAAsB,CAACC,aAAAA;AAGlC,QAAMC,QAAQD,SAASC,MAAM,wBAAA;AAC7B,MAAIA,OAAO;AACT,UAAM,CAAA,EAAGC,QAAAA,IAAYD;AACrB,WAAOC;EACT;AAEA,SAAOF;AACT;",
6
+ "names": ["LogLevel", "levels", "trace", "debug", "verbose", "info", "warn", "error", "shortLevelName", "LogProcessorType", "logInfoProperties", "Symbol", "logInfo", "target", "propertyKey", "descriptor", "push", "gatherLogInfoFromScope", "scope", "res", "prototype", "Object", "getPrototypeOf", "infoProps", "prop", "err", "message", "matchFilter", "filter", "level", "path", "pattern", "startsWith", "includes", "slice", "length", "shouldLog", "entry", "filters", "undefined", "results", "map", "meta", "F", "result", "some", "getContextFromEntry", "context", "scopeInfo", "gatherLogInfoFromScope", "S", "Object", "keys", "assign", "entryContext", "Error", "c", "error", "stack", "getRelativeFilename", "filename", "match", "filePath"]
7
+ }
@@ -0,0 +1,23 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
+
19
+ export {
20
+ __export,
21
+ __reExport
22
+ };
23
+ //# sourceMappingURL=chunk-IEP6GGEX.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,101 +1,46 @@
1
+ import {
2
+ LogLevel,
3
+ LogProcessorType,
4
+ gatherLogInfoFromScope,
5
+ getContextFromEntry,
6
+ getRelativeFilename,
7
+ levels,
8
+ logInfo,
9
+ shortLevelName,
10
+ shouldLog
11
+ } from "./chunk-GPOFUMLO.mjs";
12
+ import {
13
+ __export,
14
+ __reExport
15
+ } from "./chunk-IEP6GGEX.mjs";
16
+
1
17
  // src/index.ts
18
+ var index_exports = {};
19
+ __export(index_exports, {
20
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
21
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
22
+ FILE_PROCESSOR: () => FILE_PROCESSOR,
23
+ LogLevel: () => LogLevel,
24
+ LogProcessorType: () => LogProcessorType,
25
+ createFileProcessor: () => createFileProcessor,
26
+ createLog: () => createLog,
27
+ debug: () => debug,
28
+ gatherLogInfoFromScope: () => gatherLogInfoFromScope,
29
+ getContextFromEntry: () => getContextFromEntry,
30
+ getCurrentOwnershipScope: () => getCurrentOwnershipScope,
31
+ getRelativeFilename: () => getRelativeFilename,
32
+ levels: () => levels,
33
+ log: () => log,
34
+ logInfo: () => logInfo,
35
+ omit: () => omit,
36
+ parseFilter: () => parseFilter,
37
+ pick: () => pick,
38
+ shortLevelName: () => shortLevelName,
39
+ shouldLog: () => shouldLog
40
+ });
2
41
  import omit from "lodash.omit";
3
42
  import { pick } from "@dxos/util";
4
43
 
5
- // src/config.ts
6
- var LogLevel = /* @__PURE__ */ (function(LogLevel2) {
7
- LogLevel2[LogLevel2["TRACE"] = 5] = "TRACE";
8
- LogLevel2[LogLevel2["DEBUG"] = 10] = "DEBUG";
9
- LogLevel2[LogLevel2["VERBOSE"] = 11] = "VERBOSE";
10
- LogLevel2[LogLevel2["INFO"] = 12] = "INFO";
11
- LogLevel2[LogLevel2["WARN"] = 13] = "WARN";
12
- LogLevel2[LogLevel2["ERROR"] = 14] = "ERROR";
13
- return LogLevel2;
14
- })({});
15
- var levels = {
16
- trace: 5,
17
- debug: 10,
18
- verbose: 11,
19
- info: 12,
20
- warn: 13,
21
- error: 14
22
- };
23
- var shortLevelName = {
24
- [5]: "T",
25
- [10]: "D",
26
- [11]: "V",
27
- [12]: "I",
28
- [13]: "W",
29
- [14]: "E"
30
- };
31
- var LogProcessorType = /* @__PURE__ */ (function(LogProcessorType2) {
32
- LogProcessorType2["CONSOLE"] = "console";
33
- LogProcessorType2["BROWSER"] = "browser";
34
- LogProcessorType2["DEBUG"] = "debug";
35
- return LogProcessorType2;
36
- })({});
37
-
38
- // src/scope.ts
39
- var logInfoProperties = Symbol("logInfoProperties");
40
- var logInfo = (target, propertyKey, descriptor) => {
41
- (target[logInfoProperties] ??= []).push(propertyKey);
42
- };
43
- var gatherLogInfoFromScope = (scope) => {
44
- if (!scope) {
45
- return {};
46
- }
47
- const res = {};
48
- const prototype = Object.getPrototypeOf(scope);
49
- const infoProps = (typeof prototype === "object" && prototype !== null ? prototype[logInfoProperties] : []) ?? [];
50
- for (const prop of infoProps) {
51
- try {
52
- res[prop] = typeof scope[prop] === "function" ? scope[prop]() : scope[prop];
53
- } catch (err) {
54
- res[prop] = err.message;
55
- }
56
- }
57
- return res;
58
- };
59
-
60
- // src/context.ts
61
- var matchFilter = (filter, level, path) => {
62
- return level >= filter.level && (!filter.pattern || path.includes(filter.pattern));
63
- };
64
- var shouldLog = (entry, filters) => {
65
- if (filters === void 0) {
66
- return true;
67
- } else {
68
- return filters.some((filter) => matchFilter(filter, entry.level, entry.meta?.F ?? ""));
69
- }
70
- };
71
- var getContextFromEntry = (entry) => {
72
- let context;
73
- if (entry.meta) {
74
- const scopeInfo = gatherLogInfoFromScope(entry.meta.S);
75
- if (Object.keys(scopeInfo).length > 0) {
76
- context = Object.assign(context ?? {}, scopeInfo);
77
- }
78
- }
79
- const entryContext = typeof entry.context === "function" ? entry.context() : entry.context;
80
- if (entryContext) {
81
- if (entryContext instanceof Error) {
82
- const c = entryContext.context;
83
- context = Object.assign(context ?? {}, {
84
- error: entryContext.stack,
85
- ...c
86
- });
87
- } else if (typeof entryContext === "object") {
88
- context = Object.assign(context ?? {}, entryContext);
89
- }
90
- }
91
- if (entry.error) {
92
- context = Object.assign(context ?? {}, {
93
- error: entry.error
94
- });
95
- }
96
- return context && Object.keys(context).length > 0 ? context : void 0;
97
- };
98
-
99
44
  // src/decorators.ts
100
45
  import { inspect } from "@dxos/node-std/util";
101
46
  import chalk from "chalk";
@@ -195,53 +140,37 @@ var logAsyncResolved = (log2, methodName, resolvedValue, promiseId, startTime, c
195
140
  var logAsyncRejected = (log2, methodName, err, promiseId, startTime, combinedMeta) => {
196
141
  log2.info(`.${formatFunction(methodName)} \u21B2 \u{1F525} ${chalk.gray("reject")} ${formatPromise(promiseId)} ${formatTimeElapsed(startTime)} ${chalk.gray("=>")} ${err}`, {}, combinedMeta);
197
142
  };
198
- var greenCheck = typeof chalk.green === "function" ? chalk.green("\u2714") : "\u2714";
199
- var formatTimeElapsed = (startTime) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
200
143
  var COLOR_FUNCTION = [
201
144
  220,
202
145
  220,
203
146
  170
204
147
  ];
148
+ var greenCheck = typeof chalk.green === "function" ? chalk.green("\u2714") : "\u2714";
149
+ var formatTimeElapsed = (startTime) => chalk.gray(`${(performance.now() - startTime).toFixed(0)}ms`);
205
150
  var formatFunction = (name) => chalk.bold(chalk.rgb(...COLOR_FUNCTION)(name));
206
151
  var formatPromise = (id) => chalk.blue(`Promise#${id}`);
207
152
 
208
153
  // src/options.ts
209
154
  import defaultsDeep from "lodash.defaultsdeep";
210
155
 
211
- // src/platform/browser/index.ts
212
- var loadOptions = (filepath) => {
213
- try {
214
- let dxlog;
215
- if (typeof localStorage === "undefined") {
216
- if (globalThis.localStorage_dxlog) {
217
- dxlog = globalThis.localStorage_dxlog;
218
- }
219
- } else {
220
- dxlog = localStorage.getItem("dxlog") ?? void 0;
221
- }
222
- if (!dxlog) {
223
- return void 0;
224
- }
225
- return JSON.parse(dxlog);
226
- } catch (err) {
227
- console.info("can't parse dxlog config", err);
228
- return void 0;
229
- }
230
- };
231
-
232
- // src/processors/console-stub.ts
233
- var CONSOLE_PROCESSOR = () => {
234
- };
156
+ // src/platform/index.ts
157
+ var platform_exports = {};
158
+ __reExport(platform_exports, platform_star);
159
+ import * as platform_star from "#platform";
235
160
 
236
- // src/processors/debug-processor.ts
237
- import { inspect as inspect2 } from "@dxos/node-std/util";
238
- var DEBUG_PROCESSOR = (config, entry) => {
239
- console.log(inspect2(entry, false, null, true));
240
- };
161
+ // src/processors/index.ts
162
+ var processors_exports = {};
163
+ __export(processors_exports, {
164
+ BROWSER_PROCESSOR: () => BROWSER_PROCESSOR,
165
+ DEBUG_PROCESSOR: () => DEBUG_PROCESSOR,
166
+ FILE_PROCESSOR: () => FILE_PROCESSOR,
167
+ createFileProcessor: () => createFileProcessor,
168
+ getRelativeFilename: () => getRelativeFilename
169
+ });
241
170
 
242
171
  // src/processors/browser-processor.ts
243
172
  import { getDebugName, safariCheck } from "@dxos/util";
244
- var getRelativeFilename = (filename) => {
173
+ var getRelativeFilename2 = (filename) => {
245
174
  const match = filename.match(/.+\/(packages\/.+\/.+)/);
246
175
  if (match) {
247
176
  const [, filePath] = match;
@@ -261,7 +190,7 @@ var APP_BROWSER_PROCESSOR = (config, entry) => {
261
190
  const LOG_BROWSER_CSS = [];
262
191
  let link = "";
263
192
  if (entry.meta) {
264
- const filename = getRelativeFilename(entry.meta.F);
193
+ const filename = getRelativeFilename2(entry.meta.F);
265
194
  const filepath = `${LOG_BROWSER_PREFIX.replace(/\/$/, "")}/${filename}`;
266
195
  link = `${filepath}#L${entry.meta.L}`;
267
196
  }
@@ -317,7 +246,7 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
317
246
  }
318
247
  let path = "";
319
248
  if (entry.meta) {
320
- path = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;
249
+ path = `${getRelativeFilename2(entry.meta.F)}:${entry.meta.L}`;
321
250
  }
322
251
  let args = [];
323
252
  const processPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
@@ -346,22 +275,20 @@ var TEST_BROWSER_PROCESSOR = (config, entry) => {
346
275
  };
347
276
  var BROWSER_PROCESSOR = CONFIG.useTestProcessor ? TEST_BROWSER_PROCESSOR : APP_BROWSER_PROCESSOR;
348
277
 
349
- // src/processors/file-processor.ts
350
- import { appendFileSync, mkdirSync, openSync } from "@dxos/node-std/fs";
351
- import { dirname } from "@dxos/node-std/path";
352
- import { jsonlogify } from "@dxos/util";
278
+ // src/processors/index.ts
279
+ __reExport(processors_exports, console_processor_star);
280
+ import * as console_processor_star from "#console-processor";
353
281
 
354
- // src/processors/common.ts
355
- var getRelativeFilename2 = (filename) => {
356
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
357
- if (match) {
358
- const [, filePath] = match;
359
- return filePath;
360
- }
361
- return filename;
282
+ // src/processors/debug-processor.ts
283
+ import { inspect as inspect2 } from "@dxos/node-std/util";
284
+ var DEBUG_PROCESSOR = (config, entry) => {
285
+ console.log(inspect2(entry, false, null, true));
362
286
  };
363
287
 
364
288
  // src/processors/file-processor.ts
289
+ import { appendFileSync, mkdirSync, openSync } from "@dxos/node-std/fs";
290
+ import { dirname } from "@dxos/node-std/path";
291
+ import { jsonlogify } from "@dxos/util";
365
292
  var EAGAIN_MAX_DURATION = 1e3;
366
293
  var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
367
294
  let fd;
@@ -386,7 +313,7 @@ var createFileProcessor = ({ pathOrFd, levels: levels2, filters }) => {
386
313
  timestamp: Date.now(),
387
314
  ...entry.meta ? {
388
315
  meta: {
389
- file: getRelativeFilename2(entry.meta.F),
316
+ file: getRelativeFilename(entry.meta.F),
390
317
  line: entry.meta.L
391
318
  }
392
319
  } : {},
@@ -429,14 +356,15 @@ var FILE_PROCESSOR = createFileProcessor({
429
356
 
430
357
  // src/options.ts
431
358
  var processors = {
432
- [LogProcessorType.CONSOLE]: CONSOLE_PROCESSOR,
359
+ [LogProcessorType.CONSOLE]: processors_exports.CONSOLE_PROCESSOR,
433
360
  [LogProcessorType.BROWSER]: BROWSER_PROCESSOR,
434
361
  [LogProcessorType.DEBUG]: DEBUG_PROCESSOR
435
362
  };
436
- var IS_BROWSER = typeof window !== "undefined" || typeof navigator !== "undefined";
363
+ var browser = (typeof window !== "undefined" || typeof navigator !== "undefined") && !(typeof process !== "undefined" && process?.env?.VITEST);
437
364
  var DEFAULT_PROCESSORS = [
438
- IS_BROWSER ? BROWSER_PROCESSOR : CONSOLE_PROCESSOR
365
+ browser ? BROWSER_PROCESSOR : processors_exports.CONSOLE_PROCESSOR
439
366
  ];
367
+ var parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
440
368
  var parseFilter = (filter) => {
441
369
  if (typeof filter === "number") {
442
370
  return [
@@ -445,7 +373,6 @@ var parseFilter = (filter) => {
445
373
  }
446
374
  ];
447
375
  }
448
- const parseLogLevel = (level, defValue = LogLevel.WARN) => levels[level.toLowerCase()] ?? defValue;
449
376
  const lines = typeof filter === "string" ? filter.split(/,\s*/) : filter;
450
377
  return lines.map((filter2) => {
451
378
  const [pattern, level] = filter2.split(":");
@@ -457,54 +384,37 @@ var parseFilter = (filter) => {
457
384
  };
458
385
  });
459
386
  };
460
- var getConfig = (options) => {
461
- const nodeOptions = "process" in globalThis ? {
387
+ var createConfig = (options) => {
388
+ const envOptions = "process" in globalThis ? {
462
389
  file: process.env.LOG_CONFIG,
463
390
  filter: process.env.LOG_FILTER,
464
391
  processor: process.env.LOG_PROCESSOR
465
392
  } : void 0;
466
- const mergedOptions = defaultsDeep({}, loadOptions(nodeOptions?.file), nodeOptions, options);
393
+ const mergedOptions = defaultsDeep({}, (0, platform_exports.loadOptions)(envOptions?.file), envOptions, options);
467
394
  return {
468
395
  options: mergedOptions,
469
396
  filters: parseFilter(mergedOptions.filter ?? LogLevel.INFO),
470
397
  captureFilters: parseFilter(mergedOptions.captureFilter ?? LogLevel.WARN),
471
398
  processors: mergedOptions.processor ? [
472
399
  processors[mergedOptions.processor]
473
- ] : DEFAULT_PROCESSORS,
400
+ ] : [
401
+ ...DEFAULT_PROCESSORS
402
+ ],
474
403
  prefix: mergedOptions.prefix
475
404
  };
476
405
  };
477
406
 
478
407
  // src/log.ts
408
+ var logCount = 0;
479
409
  var createLog = () => {
480
410
  const log2 = (...params) => processLog(LogLevel.DEBUG, ...params);
481
- log2._config = getConfig();
411
+ Object.assign(log2, {
412
+ _id: `log-${++logCount}`,
413
+ _config: createConfig()
414
+ });
482
415
  Object.defineProperty(log2, "runtimeConfig", {
483
416
  get: () => log2._config
484
417
  });
485
- log2.addProcessor = (processor) => {
486
- if (DEFAULT_PROCESSORS.filter((p) => p === processor).length === 0) {
487
- DEFAULT_PROCESSORS.push(processor);
488
- }
489
- if (log2._config.processors.filter((p) => p === processor).length === 0) {
490
- log2._config.processors.push(processor);
491
- }
492
- };
493
- log2.config = (options) => {
494
- log2._config = getConfig(options);
495
- };
496
- log2.trace = (...params) => processLog(LogLevel.TRACE, ...params);
497
- log2.debug = (...params) => processLog(LogLevel.DEBUG, ...params);
498
- log2.verbose = (...params) => processLog(LogLevel.VERBOSE, ...params);
499
- log2.info = (...params) => processLog(LogLevel.INFO, ...params);
500
- log2.warn = (...params) => processLog(LogLevel.WARN, ...params);
501
- log2.error = (...params) => processLog(LogLevel.ERROR, ...params);
502
- log2.catch = (error, context, meta) => processLog(LogLevel.ERROR, void 0, context, meta, error);
503
- 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");
504
- log2.stack = (message, context, meta) => processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
505
- ${getFormattedStackTrace()}`, context, meta);
506
- log2.method = createMethodLogDecorator(log2);
507
- log2.func = createFunctionLogDecorator(log2);
508
418
  const processLog = (level, message, context = {}, meta, error) => {
509
419
  log2._config.processors.forEach((processor) => processor(log2._config, {
510
420
  level,
@@ -514,9 +424,50 @@ ${getFormattedStackTrace()}`, context, meta);
514
424
  error
515
425
  }));
516
426
  };
427
+ Object.assign(log2, {
428
+ /**
429
+ * Update config.
430
+ * NOTE: Preserves any processors that were already added to this logger instance
431
+ * unless an explicit processor option is provided.
432
+ */
433
+ config: ({ processor, ...options }) => {
434
+ const config = createConfig(options);
435
+ const processors2 = processor ? config.processors : log2._config.processors;
436
+ log2._config = {
437
+ ...config,
438
+ processors: processors2
439
+ };
440
+ return log2;
441
+ },
442
+ /**
443
+ * Adds a processor to the logger.
444
+ */
445
+ addProcessor: (processor) => {
446
+ if (log2._config.processors.filter((p) => p === processor).length === 0) {
447
+ log2._config.processors.push(processor);
448
+ }
449
+ return () => {
450
+ log2._config.processors = log2._config.processors.filter((p) => p !== processor);
451
+ };
452
+ },
453
+ trace: (...params) => processLog(LogLevel.TRACE, ...params),
454
+ debug: (...params) => processLog(LogLevel.DEBUG, ...params),
455
+ verbose: (...params) => processLog(LogLevel.VERBOSE, ...params),
456
+ info: (...params) => processLog(LogLevel.INFO, ...params),
457
+ warn: (...params) => processLog(LogLevel.WARN, ...params),
458
+ error: (...params) => processLog(LogLevel.ERROR, ...params),
459
+ catch: (error, context, meta) => processLog(LogLevel.ERROR, void 0, context, meta, error),
460
+ method: createMethodLogDecorator(log2),
461
+ function: createFunctionLogDecorator(log2),
462
+ break: () => log2.info("-".repeat(80)),
463
+ stack: (message, context, meta) => {
464
+ return processLog(LogLevel.INFO, `${message ?? "Stack Dump"}
465
+ ${getFormattedStackTrace()}`, context, meta);
466
+ }
467
+ });
517
468
  return log2;
518
469
  };
519
- var log = globalThis.dx_log ??= createLog();
470
+ var log = globalThis.DX_LOG ??= createLog();
520
471
  var start = Date.now();
521
472
  var last = start;
522
473
  var debug = (label, args) => {
@@ -533,6 +484,9 @@ var debug = (label, args) => {
533
484
  };
534
485
  var getFormattedStackTrace = () => new Error().stack.split("\n").slice(3).join("\n");
535
486
 
487
+ // src/index.ts
488
+ __reExport(index_exports, processors_exports);
489
+
536
490
  // src/experimental/ownership.ts
537
491
  import { inspect as inspect3 } from "@dxos/node-std/util";
538
492
  var kOwnershipScope = Symbol("kOwnershipScope");
@@ -568,17 +522,17 @@ var OwnershipScope = class {
568
522
  var getCurrentOwnershipScope = (thisRef) => thisRef;
569
523
  export {
570
524
  BROWSER_PROCESSOR,
571
- CONSOLE_PROCESSOR,
572
525
  DEBUG_PROCESSOR,
573
526
  FILE_PROCESSOR,
574
527
  LogLevel,
575
528
  LogProcessorType,
576
529
  createFileProcessor,
530
+ createLog,
577
531
  debug,
578
532
  gatherLogInfoFromScope,
579
533
  getContextFromEntry,
580
534
  getCurrentOwnershipScope,
581
- getRelativeFilename2 as getRelativeFilename,
535
+ getRelativeFilename,
582
536
  levels,
583
537
  log,
584
538
  logInfo,