evlog 2.6.0 → 2.8.0

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 (131) hide show
  1. package/README.md +27 -0
  2. package/dist/_drain-C9Nr-6Wc.mjs +18 -0
  3. package/dist/_drain-C9Nr-6Wc.mjs.map +1 -0
  4. package/dist/_http-C2UoHWgm.mjs +82 -0
  5. package/dist/_http-C2UoHWgm.mjs.map +1 -0
  6. package/dist/{_severity-Q1BuITU_.mjs → _severity-BLiOKoxh.mjs} +1 -1
  7. package/dist/{_severity-Q1BuITU_.mjs.map → _severity-BLiOKoxh.mjs.map} +1 -1
  8. package/dist/adapters/axiom.d.mts +3 -1
  9. package/dist/adapters/axiom.d.mts.map +1 -1
  10. package/dist/adapters/axiom.mjs +5 -2
  11. package/dist/adapters/axiom.mjs.map +1 -1
  12. package/dist/adapters/better-stack.d.mts +3 -1
  13. package/dist/adapters/better-stack.d.mts.map +1 -1
  14. package/dist/adapters/better-stack.mjs +5 -2
  15. package/dist/adapters/better-stack.mjs.map +1 -1
  16. package/dist/adapters/fs.d.mts +37 -0
  17. package/dist/adapters/fs.d.mts.map +1 -0
  18. package/dist/adapters/fs.mjs +106 -0
  19. package/dist/adapters/fs.mjs.map +1 -0
  20. package/dist/adapters/otlp.d.mts +3 -1
  21. package/dist/adapters/otlp.d.mts.map +1 -1
  22. package/dist/adapters/otlp.mjs +6 -3
  23. package/dist/adapters/otlp.mjs.map +1 -1
  24. package/dist/adapters/posthog.d.mts +3 -1
  25. package/dist/adapters/posthog.d.mts.map +1 -1
  26. package/dist/adapters/posthog.mjs +7 -3
  27. package/dist/adapters/posthog.mjs.map +1 -1
  28. package/dist/adapters/sentry.d.mts +3 -1
  29. package/dist/adapters/sentry.d.mts.map +1 -1
  30. package/dist/adapters/sentry.mjs +6 -3
  31. package/dist/adapters/sentry.mjs.map +1 -1
  32. package/dist/ai/index.d.mts +88 -0
  33. package/dist/ai/index.d.mts.map +1 -0
  34. package/dist/ai/index.mjs +199 -0
  35. package/dist/ai/index.mjs.map +1 -0
  36. package/dist/browser.d.mts +1 -1
  37. package/dist/client.d.mts +2 -0
  38. package/dist/client.mjs +2 -0
  39. package/dist/{dist-BsWcv7B8.mjs → dist-BFn8qsRC.mjs} +1 -1
  40. package/dist/{dist-BsWcv7B8.mjs.map → dist-BFn8qsRC.mjs.map} +1 -1
  41. package/dist/elysia/index.d.mts +2 -2
  42. package/dist/elysia/index.mjs +1 -1
  43. package/dist/enrichers.d.mts +1 -1
  44. package/dist/{error-iV3zJCY3.d.mts → error-BheHTFFB.d.mts} +2 -2
  45. package/dist/{error-iV3zJCY3.d.mts.map → error-BheHTFFB.d.mts.map} +1 -1
  46. package/dist/error.d.mts +1 -1
  47. package/dist/{errors-BJRXUfMg.mjs → errors-BQgyQ9xe.mjs} +1 -1
  48. package/dist/{errors-BJRXUfMg.mjs.map → errors-BQgyQ9xe.mjs.map} +1 -1
  49. package/dist/{errors-CKSfdvLa.d.mts → errors-D8WVZclz.d.mts} +2 -2
  50. package/dist/{errors-CKSfdvLa.d.mts.map → errors-D8WVZclz.d.mts.map} +1 -1
  51. package/dist/express/index.d.mts +2 -2
  52. package/dist/express/index.mjs +3 -3
  53. package/dist/express/index.mjs.map +1 -1
  54. package/dist/fastify/index.d.mts +2 -2
  55. package/dist/fastify/index.mjs +2 -2
  56. package/dist/{headers-Ba1eKT3i.mjs → headers-DJ_YZbxT.mjs} +9 -8
  57. package/dist/headers-DJ_YZbxT.mjs.map +1 -0
  58. package/dist/hono/index.d.mts +2 -2
  59. package/dist/hono/index.mjs +1 -1
  60. package/dist/index.d.mts +5 -5
  61. package/dist/{logger-CvDYZUze.d.mts → logger-BkXYNnHP.d.mts} +21 -5
  62. package/dist/logger-BkXYNnHP.d.mts.map +1 -0
  63. package/dist/logger.d.mts +2 -2
  64. package/dist/logger.mjs +111 -109
  65. package/dist/logger.mjs.map +1 -1
  66. package/dist/{middleware-hZqyXoSk.d.mts → middleware-B-4hPOVG.d.mts} +2 -2
  67. package/dist/{middleware-hZqyXoSk.d.mts.map → middleware-B-4hPOVG.d.mts.map} +1 -1
  68. package/dist/nestjs/index.d.mts +2 -2
  69. package/dist/nestjs/index.d.mts.map +1 -1
  70. package/dist/nestjs/index.mjs +3 -3
  71. package/dist/nestjs/index.mjs.map +1 -1
  72. package/dist/next/client.d.mts +1 -1
  73. package/dist/next/index.d.mts +10 -4
  74. package/dist/next/index.d.mts.map +1 -1
  75. package/dist/next/index.mjs +8 -5
  76. package/dist/next/index.mjs.map +1 -1
  77. package/dist/nitro/errorHandler.mjs +2 -2
  78. package/dist/nitro/module.d.mts +2 -2
  79. package/dist/nitro/plugin.mjs +6 -4
  80. package/dist/nitro/plugin.mjs.map +1 -1
  81. package/dist/nitro/v3/errorHandler.mjs +3 -3
  82. package/dist/nitro/v3/module.d.mts +1 -1
  83. package/dist/nitro/v3/plugin.mjs +7 -5
  84. package/dist/nitro/v3/plugin.mjs.map +1 -1
  85. package/dist/nitro/v3/useLogger.d.mts +1 -1
  86. package/dist/{nitro-D1pPm37T.mjs → nitro-CzyGROOC.mjs} +2 -2
  87. package/dist/nitro-CzyGROOC.mjs.map +1 -0
  88. package/dist/{nitro-CGGTUned.d.mts → nitro-DCNNxY_7.d.mts} +10 -2
  89. package/dist/nitro-DCNNxY_7.d.mts.map +1 -0
  90. package/dist/nuxt/module.d.mts +21 -1
  91. package/dist/nuxt/module.d.mts.map +1 -1
  92. package/dist/nuxt/module.mjs +7 -2
  93. package/dist/nuxt/module.mjs.map +1 -1
  94. package/dist/{parseError-BztqcPwZ.d.mts → parseError-B08FS7EQ.d.mts} +2 -2
  95. package/dist/parseError-B08FS7EQ.d.mts.map +1 -0
  96. package/dist/{routes-CE3_c-iZ.mjs → routes-CGPmbzCZ.mjs} +1 -1
  97. package/dist/{routes-CE3_c-iZ.mjs.map → routes-CGPmbzCZ.mjs.map} +1 -1
  98. package/dist/runtime/client/log.d.mts +1 -1
  99. package/dist/runtime/server/useLogger.d.mts +1 -1
  100. package/dist/runtime/utils/parseError.d.mts +2 -2
  101. package/dist/source-location-B1VVgXkh.mjs +1165 -0
  102. package/dist/source-location-B1VVgXkh.mjs.map +1 -0
  103. package/dist/{storage-CJBW5Vos.mjs → storage-DsueXspk.mjs} +1 -1
  104. package/dist/{storage-CJBW5Vos.mjs.map → storage-DsueXspk.mjs.map} +1 -1
  105. package/dist/sveltekit/index.d.mts +2 -2
  106. package/dist/sveltekit/index.mjs +4 -4
  107. package/dist/toolkit.d.mts +3 -3
  108. package/dist/toolkit.mjs +4 -4
  109. package/dist/{types-B8-kC2ME.d.mts → types-CBpJBj_7.d.mts} +11 -1
  110. package/dist/types-CBpJBj_7.d.mts.map +1 -0
  111. package/dist/types.d.mts +1 -1
  112. package/dist/{useLogger-_Ec6mXoR.d.mts → useLogger-DBPGEDf_.d.mts} +2 -2
  113. package/dist/{useLogger-_Ec6mXoR.d.mts.map → useLogger-DBPGEDf_.d.mts.map} +1 -1
  114. package/dist/utils.d.mts +1 -1
  115. package/dist/utils.d.mts.map +1 -1
  116. package/dist/utils.mjs +22 -16
  117. package/dist/utils.mjs.map +1 -1
  118. package/dist/vite/index.d.mts +80 -0
  119. package/dist/vite/index.d.mts.map +1 -0
  120. package/dist/vite/index.mjs +213 -0
  121. package/dist/vite/index.mjs.map +1 -0
  122. package/dist/workers.d.mts +1 -1
  123. package/package.json +53 -5
  124. package/dist/_http-DHpGetLZ.mjs +0 -72
  125. package/dist/_http-DHpGetLZ.mjs.map +0 -1
  126. package/dist/headers-Ba1eKT3i.mjs.map +0 -1
  127. package/dist/logger-CvDYZUze.d.mts.map +0 -1
  128. package/dist/nitro-CGGTUned.d.mts.map +0 -1
  129. package/dist/nitro-D1pPm37T.mjs.map +0 -1
  130. package/dist/parseError-BztqcPwZ.d.mts.map +0 -1
  131. package/dist/types-B8-kC2ME.d.mts.map +0 -1
@@ -0,0 +1,213 @@
1
+ import { a as walk, i as shouldTransform, n as createStripPlugin, o as MagicString, r as TRANSFORM_FILTER, t as createSourceLocationPlugin } from "../source-location-B1VVgXkh.mjs";
2
+ import { resolve } from "node:path";
3
+ import { existsSync, writeFileSync } from "node:fs";
4
+ //#region src/vite/auto-init.ts
5
+ function createAutoInitPlugin(options) {
6
+ const config = buildConfig(options);
7
+ return {
8
+ name: "evlog:auto-init",
9
+ config() {
10
+ return { define: { __EVLOG_CONFIG__: JSON.stringify(config) } };
11
+ }
12
+ };
13
+ }
14
+ function buildConfig(options) {
15
+ const env = {};
16
+ if (options.service) env.service = options.service;
17
+ if (options.environment) env.environment = options.environment;
18
+ const config = {};
19
+ if (Object.keys(env).length > 0) config.env = env;
20
+ if (options.enabled !== void 0) config.enabled = options.enabled;
21
+ if (options.pretty !== void 0) config.pretty = options.pretty;
22
+ if (options.silent !== void 0) config.silent = options.silent;
23
+ if (options.sampling) config.sampling = options.sampling;
24
+ if (options.stringify !== void 0) config.stringify = options.stringify;
25
+ return config;
26
+ }
27
+ //#endregion
28
+ //#region src/vite/auto-imports.ts
29
+ const DEFAULT_IMPORTS = [
30
+ "log",
31
+ "createEvlogError",
32
+ "parseError"
33
+ ];
34
+ const LOG_METHODS = [
35
+ "info",
36
+ "error",
37
+ "warn",
38
+ "debug"
39
+ ];
40
+ const IMPORT_SOURCES = {
41
+ log: "evlog",
42
+ createEvlogError: "evlog",
43
+ parseError: "evlog",
44
+ setIdentity: "evlog/client",
45
+ clearIdentity: "evlog/client"
46
+ };
47
+ function createAutoImportsPlugin(options = {}) {
48
+ const symbols = options.imports ?? DEFAULT_IMPORTS;
49
+ return {
50
+ name: "evlog:auto-imports",
51
+ configResolved(config) {
52
+ if (options.dts === false) return;
53
+ if (typeof options.dts === "string") {
54
+ writeFileSync(resolve(config.root, options.dts), generateDts(symbols));
55
+ return;
56
+ }
57
+ const srcDir = resolve(config.root, "src");
58
+ writeFileSync(resolve(existsSync(srcDir) ? srcDir : config.root, "auto-imports.d.ts"), generateDts(symbols));
59
+ },
60
+ transform: {
61
+ filter: TRANSFORM_FILTER,
62
+ handler(code, id) {
63
+ if (!shouldTransform(id)) return;
64
+ if (!symbols.some((s) => code.includes(s))) return;
65
+ let ast;
66
+ try {
67
+ ast = this.parse(code);
68
+ } catch {
69
+ return;
70
+ }
71
+ const declared = collectTopLevelDeclarations(ast);
72
+ const needed = detectUsedSymbols(ast, symbols, declared);
73
+ if (needed.size === 0) return;
74
+ const grouped = groupBySource(needed);
75
+ const s = new MagicString(code);
76
+ for (const [source, names] of grouped) s.prepend(`import { ${names.join(", ")} } from '${source}'\n`);
77
+ return {
78
+ code: s.toString(),
79
+ map: s.generateMap({ hires: true })
80
+ };
81
+ }
82
+ }
83
+ };
84
+ }
85
+ function collectBindingNames(pattern, out) {
86
+ if (!pattern) return;
87
+ if (pattern.type === "Identifier") out.add(pattern.name);
88
+ else if (pattern.type === "ObjectPattern") for (const prop of pattern.properties) collectBindingNames(prop.type === "RestElement" ? prop.argument : prop.value, out);
89
+ else if (pattern.type === "ArrayPattern") {
90
+ for (const el of pattern.elements) if (el) collectBindingNames(el, out);
91
+ } else if (pattern.type === "AssignmentPattern") collectBindingNames(pattern.left, out);
92
+ else if (pattern.type === "RestElement") collectBindingNames(pattern.argument, out);
93
+ }
94
+ function collectTopLevelDeclarations(ast) {
95
+ const declared = /* @__PURE__ */ new Set();
96
+ for (const node of ast.body) {
97
+ if (node.type === "VariableDeclaration") for (const decl of node.declarations) collectBindingNames(decl.id, declared);
98
+ if (node.type === "FunctionDeclaration" && node.id?.name) declared.add(node.id.name);
99
+ if (node.type === "ImportDeclaration") {
100
+ for (const spec of node.specifiers ?? []) if (spec.local?.name) declared.add(spec.local.name);
101
+ }
102
+ }
103
+ return declared;
104
+ }
105
+ function detectUsedSymbols(ast, symbols, declared) {
106
+ const needed = /* @__PURE__ */ new Set();
107
+ walk(ast, (node) => {
108
+ if (symbols.includes("log") && !declared.has("log") && node.type === "MemberExpression" && node.object?.type === "Identifier" && node.object.name === "log" && node.property?.type === "Identifier" && LOG_METHODS.includes(node.property.name)) needed.add("log");
109
+ if (node.type === "CallExpression" && node.callee?.type === "Identifier" && symbols.includes(node.callee.name) && !declared.has(node.callee.name)) needed.add(node.callee.name);
110
+ });
111
+ return needed;
112
+ }
113
+ function groupBySource(symbols) {
114
+ const map = /* @__PURE__ */ new Map();
115
+ for (const sym of symbols) {
116
+ const source = IMPORT_SOURCES[sym] ?? "evlog";
117
+ const list = map.get(source) ?? [];
118
+ list.push(sym);
119
+ map.set(source, list);
120
+ }
121
+ return map;
122
+ }
123
+ function generateDts(symbols) {
124
+ const lines = [
125
+ "/* eslint-disable */",
126
+ "// Generated by evlog/vite — do not edit",
127
+ "export {}",
128
+ "declare global {"
129
+ ];
130
+ for (const sym of symbols) switch (sym) {
131
+ case "log":
132
+ lines.push(" const log: import('evlog').Log");
133
+ break;
134
+ case "createEvlogError":
135
+ lines.push(" const createEvlogError: typeof import('evlog').createEvlogError");
136
+ break;
137
+ case "parseError":
138
+ lines.push(" const parseError: typeof import('evlog').parseError");
139
+ break;
140
+ case "setIdentity":
141
+ lines.push(" const setIdentity: (identity: Record<string, unknown>) => void");
142
+ break;
143
+ case "clearIdentity":
144
+ lines.push(" const clearIdentity: () => void");
145
+ break;
146
+ default:
147
+ lines.push(` const ${sym}: typeof import('evlog').${sym}`);
148
+ break;
149
+ }
150
+ lines.push("}", "");
151
+ return lines.join("\n");
152
+ }
153
+ //#endregion
154
+ //#region src/vite/client-inject.ts
155
+ function createClientInjectPlugin(clientOptions) {
156
+ let isDev = true;
157
+ return {
158
+ name: "evlog:client-inject",
159
+ configResolved(config) {
160
+ isDev = config.command === "serve";
161
+ },
162
+ transformIndexHtml() {
163
+ const config = {};
164
+ config.service = clientOptions.service ?? "client";
165
+ if (clientOptions.console !== void 0) config.console = clientOptions.console;
166
+ config.pretty = clientOptions.pretty ?? isDev;
167
+ if (clientOptions.transport) config.transport = clientOptions.transport;
168
+ return [{
169
+ tag: "script",
170
+ attrs: { type: "module" },
171
+ children: `import{initLog}from'evlog/client'\ninitLog(${JSON.stringify(config)})`,
172
+ injectTo: "head-prepend"
173
+ }];
174
+ }
175
+ };
176
+ }
177
+ //#endregion
178
+ //#region src/vite/index.ts
179
+ /**
180
+ * evlog Vite plugin — brings Nuxt-level DX to any Vite-based framework.
181
+ *
182
+ * @example
183
+ * ```ts
184
+ * // vite.config.ts
185
+ * import evlog from 'evlog/vite'
186
+ *
187
+ * export default defineConfig({
188
+ * plugins: [
189
+ * evlog({ service: 'my-app' }),
190
+ * ],
191
+ * })
192
+ * ```
193
+ */
194
+ function evlog(options = {}) {
195
+ const plugins = [];
196
+ plugins.push(createAutoInitPlugin(options));
197
+ if (options.autoImports) {
198
+ const autoImportOpts = typeof options.autoImports === "object" ? options.autoImports : {};
199
+ plugins.push(createAutoImportsPlugin(autoImportOpts));
200
+ }
201
+ if (options.client) plugins.push(createClientInjectPlugin(options.client));
202
+ const stripLevels = options.strip ?? ["debug"];
203
+ if (stripLevels.length > 0) plugins.push(createStripPlugin(stripLevels));
204
+ if (options.sourceLocation) {
205
+ const enabled = options.sourceLocation === "dev" ? void 0 : true;
206
+ plugins.push(createSourceLocationPlugin(enabled));
207
+ }
208
+ return plugins;
209
+ }
210
+ //#endregion
211
+ export { createAutoImportsPlugin, createAutoInitPlugin, createClientInjectPlugin, createSourceLocationPlugin, createStripPlugin, evlog as default };
212
+
213
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/vite/auto-init.ts","../../src/vite/auto-imports.ts","../../src/vite/client-inject.ts","../../src/vite/index.ts"],"sourcesContent":["import type { Plugin } from 'vite'\nimport type { EvlogViteOptions } from './types'\n\nexport function createAutoInitPlugin(options: EvlogViteOptions): Plugin {\n const config = buildConfig(options)\n\n return {\n name: 'evlog:auto-init',\n config() {\n return {\n define: {\n __EVLOG_CONFIG__: JSON.stringify(config),\n },\n }\n },\n }\n}\n\nfunction buildConfig(options: EvlogViteOptions): Record<string, unknown> {\n const env: Record<string, unknown> = {}\n if (options.service) env.service = options.service\n if (options.environment) env.environment = options.environment\n\n const config: Record<string, unknown> = {}\n if (Object.keys(env).length > 0) config.env = env\n if (options.enabled !== undefined) config.enabled = options.enabled\n if (options.pretty !== undefined) config.pretty = options.pretty\n if (options.silent !== undefined) config.silent = options.silent\n if (options.sampling) config.sampling = options.sampling\n if (options.stringify !== undefined) config.stringify = options.stringify\n\n return config\n}\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport type { Plugin } from 'vite'\nimport MagicString from 'magic-string'\nimport type { AutoImportsOptions } from './types'\nimport { TRANSFORM_FILTER, shouldTransform, walk } from './utils'\n\nconst DEFAULT_IMPORTS = ['log', 'createEvlogError', 'parseError']\nconst LOG_METHODS = ['info', 'error', 'warn', 'debug']\n\nconst IMPORT_SOURCES: Record<string, string> = {\n log: 'evlog',\n createEvlogError: 'evlog',\n parseError: 'evlog',\n setIdentity: 'evlog/client',\n clearIdentity: 'evlog/client',\n}\n\nexport function createAutoImportsPlugin(options: AutoImportsOptions = {}): Plugin {\n const symbols = options.imports ?? DEFAULT_IMPORTS\n\n return {\n name: 'evlog:auto-imports',\n\n configResolved(config) {\n if (options.dts === false) return\n if (typeof options.dts === 'string') {\n writeFileSync(resolve(config.root, options.dts), generateDts(symbols))\n return\n }\n const srcDir = resolve(config.root, 'src')\n const dir = existsSync(srcDir) ? srcDir : config.root\n writeFileSync(resolve(dir, 'auto-imports.d.ts'), generateDts(symbols))\n },\n\n transform: {\n filter: TRANSFORM_FILTER,\n handler(code, id) {\n if (!shouldTransform(id)) return\n if (!symbols.some(s => code.includes(s))) return\n\n let ast: any\n try {\n ast = (this as any).parse(code)\n } catch {\n return\n }\n\n const declared = collectTopLevelDeclarations(ast)\n const needed = detectUsedSymbols(ast, symbols, declared)\n\n if (needed.size === 0) return\n\n const grouped = groupBySource(needed)\n const s = new MagicString(code)\n\n for (const [source, names] of grouped) {\n s.prepend(`import { ${names.join(', ')} } from '${source}'\\n`)\n }\n\n return { code: s.toString(), map: s.generateMap({ hires: true }) }\n },\n },\n }\n}\n\nfunction collectBindingNames(pattern: any, out: Set<string>): void {\n if (!pattern) return\n if (pattern.type === 'Identifier') {\n out.add(pattern.name)\n } else if (pattern.type === 'ObjectPattern') {\n for (const prop of pattern.properties) {\n collectBindingNames(prop.type === 'RestElement' ? prop.argument : prop.value, out)\n }\n } else if (pattern.type === 'ArrayPattern') {\n for (const el of pattern.elements) {\n if (el) collectBindingNames(el, out)\n }\n } else if (pattern.type === 'AssignmentPattern') {\n collectBindingNames(pattern.left, out)\n } else if (pattern.type === 'RestElement') {\n collectBindingNames(pattern.argument, out)\n }\n}\n\nfunction collectTopLevelDeclarations(ast: any): Set<string> {\n const declared = new Set<string>()\n for (const node of ast.body) {\n if (node.type === 'VariableDeclaration') {\n for (const decl of node.declarations) {\n collectBindingNames(decl.id, declared)\n }\n }\n if (node.type === 'FunctionDeclaration' && node.id?.name) {\n declared.add(node.id.name)\n }\n if (node.type === 'ImportDeclaration') {\n for (const spec of node.specifiers ?? []) {\n if (spec.local?.name) declared.add(spec.local.name)\n }\n }\n }\n return declared\n}\n\nfunction detectUsedSymbols(ast: any, symbols: string[], declared: Set<string>): Set<string> {\n const needed = new Set<string>()\n\n walk(ast, (node: any) => {\n if (\n symbols.includes('log')\n && !declared.has('log')\n && node.type === 'MemberExpression'\n && node.object?.type === 'Identifier'\n && node.object.name === 'log'\n && node.property?.type === 'Identifier'\n && LOG_METHODS.includes(node.property.name)\n ) {\n needed.add('log')\n }\n\n if (\n node.type === 'CallExpression'\n && node.callee?.type === 'Identifier'\n && symbols.includes(node.callee.name)\n && !declared.has(node.callee.name)\n ) {\n needed.add(node.callee.name)\n }\n })\n\n return needed\n}\n\nfunction groupBySource(symbols: Set<string>): Map<string, string[]> {\n const map = new Map<string, string[]>()\n for (const sym of symbols) {\n const source = IMPORT_SOURCES[sym] ?? 'evlog'\n const list = map.get(source) ?? []\n list.push(sym)\n map.set(source, list)\n }\n return map\n}\n\nfunction generateDts(symbols: string[]): string {\n const lines = [\n '/* eslint-disable */',\n '// Generated by evlog/vite — do not edit',\n 'export {}',\n 'declare global {',\n ]\n\n for (const sym of symbols) {\n switch (sym) {\n case 'log':\n lines.push(' const log: import(\\'evlog\\').Log')\n break\n case 'createEvlogError':\n lines.push(' const createEvlogError: typeof import(\\'evlog\\').createEvlogError')\n break\n case 'parseError':\n lines.push(' const parseError: typeof import(\\'evlog\\').parseError')\n break\n case 'setIdentity':\n lines.push(' const setIdentity: (identity: Record<string, unknown>) => void')\n break\n case 'clearIdentity':\n lines.push(' const clearIdentity: () => void')\n break\n default:\n lines.push(` const ${sym}: typeof import('evlog').${sym}`)\n break\n }\n }\n\n lines.push('}', '')\n return lines.join('\\n')\n}\n","import type { Plugin } from 'vite'\nimport type { ClientOptions } from './types'\n\nexport function createClientInjectPlugin(clientOptions: ClientOptions): Plugin {\n let isDev = true\n\n return {\n name: 'evlog:client-inject',\n\n configResolved(config) {\n isDev = config.command === 'serve'\n },\n\n transformIndexHtml() {\n const config: Record<string, unknown> = {}\n config.service = clientOptions.service ?? 'client'\n if (clientOptions.console !== undefined) config.console = clientOptions.console\n config.pretty = clientOptions.pretty ?? isDev\n if (clientOptions.transport) config.transport = clientOptions.transport\n\n const configJson = JSON.stringify(config)\n\n return [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: `import{initLog}from'evlog/client'\\ninitLog(${configJson})`,\n injectTo: 'head-prepend',\n },\n ]\n },\n }\n}\n","import type { Plugin } from 'vite'\nimport type { EvlogViteOptions } from './types'\nimport { createAutoInitPlugin } from './auto-init'\nimport { createAutoImportsPlugin } from './auto-imports'\nimport { createClientInjectPlugin } from './client-inject'\nimport { createStripPlugin } from './strip'\nimport { createSourceLocationPlugin } from './source-location'\n\n/**\n * evlog Vite plugin — brings Nuxt-level DX to any Vite-based framework.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import evlog from 'evlog/vite'\n *\n * export default defineConfig({\n * plugins: [\n * evlog({ service: 'my-app' }),\n * ],\n * })\n * ```\n */\nexport default function evlog(options: EvlogViteOptions = {}): Plugin[] {\n const plugins: Plugin[] = []\n\n plugins.push(createAutoInitPlugin(options))\n\n if (options.autoImports) {\n const autoImportOpts = typeof options.autoImports === 'object' ? options.autoImports : {}\n plugins.push(createAutoImportsPlugin(autoImportOpts))\n }\n\n if (options.client) {\n plugins.push(createClientInjectPlugin(options.client))\n }\n\n const stripLevels = options.strip ?? ['debug']\n if (stripLevels.length > 0) {\n plugins.push(createStripPlugin(stripLevels))\n }\n\n if (options.sourceLocation) {\n const enabled = options.sourceLocation === 'dev' ? undefined : true\n plugins.push(createSourceLocationPlugin(enabled))\n }\n\n return plugins\n}\n\nexport { createAutoInitPlugin } from './auto-init'\nexport { createAutoImportsPlugin } from './auto-imports'\nexport { createClientInjectPlugin } from './client-inject'\nexport { createStripPlugin } from './strip'\nexport { createSourceLocationPlugin } from './source-location'\nexport type { EvlogViteOptions, AutoImportsOptions, ClientOptions } from './types'\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { g as RequestLogger, p as LoggerConfig } from "./types-B8-kC2ME.mjs";
1
+ import { g as RequestLogger, p as LoggerConfig } from "./types-CBpJBj_7.mjs";
2
2
 
3
3
  //#region src/workers/index.d.ts
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evlog",
3
- "version": "2.6.0",
3
+ "version": "2.8.0",
4
4
  "description": "Wide event logging library with structured error handling. Inspired by LoggingSucks.",
5
5
  "author": "HugoRCD <contact@hrcd.fr>",
6
6
  "homepage": "https://evlog.dev",
@@ -25,6 +25,7 @@
25
25
  "elysia",
26
26
  "nestjs",
27
27
  "sveltekit",
28
+ "vite",
28
29
  "typescript"
29
30
  ],
30
31
  "license": "MIT",
@@ -81,6 +82,11 @@
81
82
  "import": "./dist/adapters/better-stack.mjs",
82
83
  "default": "./dist/adapters/better-stack.mjs"
83
84
  },
85
+ "./fs": {
86
+ "types": "./dist/adapters/fs.d.mts",
87
+ "import": "./dist/adapters/fs.mjs",
88
+ "default": "./dist/adapters/fs.mjs"
89
+ },
84
90
  "./enrichers": {
85
91
  "types": "./dist/enrichers.d.mts",
86
92
  "import": "./dist/enrichers.mjs",
@@ -136,10 +142,25 @@
136
142
  "import": "./dist/sveltekit/index.mjs",
137
143
  "default": "./dist/sveltekit/index.mjs"
138
144
  },
145
+ "./vite": {
146
+ "types": "./dist/vite/index.d.mts",
147
+ "import": "./dist/vite/index.mjs",
148
+ "default": "./dist/vite/index.mjs"
149
+ },
150
+ "./client": {
151
+ "types": "./dist/client.d.mts",
152
+ "import": "./dist/client.mjs",
153
+ "default": "./dist/client.mjs"
154
+ },
139
155
  "./toolkit": {
140
156
  "types": "./dist/toolkit.d.mts",
141
157
  "import": "./dist/toolkit.mjs",
142
158
  "default": "./dist/toolkit.mjs"
159
+ },
160
+ "./ai": {
161
+ "types": "./dist/ai/index.d.mts",
162
+ "import": "./dist/ai/index.mjs",
163
+ "default": "./dist/ai/index.mjs"
143
164
  }
144
165
  },
145
166
  "main": "./dist/index.mjs",
@@ -176,6 +197,9 @@
176
197
  "better-stack": [
177
198
  "./dist/adapters/better-stack.d.mts"
178
199
  ],
200
+ "fs": [
201
+ "./dist/adapters/fs.d.mts"
202
+ ],
179
203
  "enrichers": [
180
204
  "./dist/enrichers.d.mts"
181
205
  ],
@@ -209,8 +233,17 @@
209
233
  "sveltekit": [
210
234
  "./dist/sveltekit/index.d.mts"
211
235
  ],
236
+ "vite": [
237
+ "./dist/vite/index.d.mts"
238
+ ],
239
+ "client": [
240
+ "./dist/client.d.mts"
241
+ ],
212
242
  "toolkit": [
213
243
  "./dist/toolkit.d.mts"
244
+ ],
245
+ "ai": [
246
+ "./dist/ai/index.d.mts"
214
247
  ]
215
248
  }
216
249
  },
@@ -224,12 +257,20 @@
224
257
  "dev:prepare": "tsdown",
225
258
  "lint": "eslint .",
226
259
  "lint:fix": "eslint . --fix",
260
+ "bench": "vitest bench bench/core/ && cp bench/results.json bench/baseline/bench.json && bun bench/scripts/report.ts",
261
+ "bench:compare": "vitest bench bench/comparison/ && cp bench/results.json bench/baseline/comparison.json && bun bench/scripts/report.ts",
262
+ "bench:report": "bun bench/scripts/report.ts",
263
+ "size": "bun bench/scripts/size.ts",
264
+ "size:json": "bun bench/scripts/size.ts --json",
227
265
  "test": "vitest run",
228
266
  "test:watch": "vitest watch",
229
267
  "test:coverage": "vitest run --coverage",
230
268
  "typecheck": "echo 'Typecheck handled by build'"
231
269
  },
232
270
  "devDependencies": {
271
+ "acorn": "^8.14.1",
272
+ "@codspeed/vitest-plugin": "^5.2.0",
273
+ "@nestjs/common": "^11.1.16",
233
274
  "@nuxt/devtools": "^3.2.3",
234
275
  "@nuxt/schema": "^4.4.2",
235
276
  "@nuxt/test-utils": "^4.0.0",
@@ -239,17 +280,20 @@
239
280
  "consola": "^3.4.2",
240
281
  "elysia": "^1.4.27",
241
282
  "express": "^5.2.1",
242
- "@nestjs/common": "^11.1.16",
243
283
  "fastify": "^5.8.2",
244
284
  "h3": "^1.15.6",
245
285
  "happy-dom": "^20.8.3",
246
286
  "nitro": "^3.0.260311-beta",
247
287
  "nitropack": "^2.13.1",
248
288
  "nuxt": "^4.4.2",
289
+ "pino": "^10.3.1",
249
290
  "supertest": "^7.2.2",
250
291
  "tsdown": "^0.21.1",
292
+ "magic-string": "^0.30.17",
251
293
  "typescript": "^5.9.3",
252
- "ufo": "^1.6.3"
294
+ "vite": "^8.0.0",
295
+ "ufo": "^1.6.3",
296
+ "winston": "^3.19.0"
253
297
  },
254
298
  "peerDependencies": {
255
299
  "@nuxt/kit": "^4.4.2",
@@ -264,7 +308,8 @@
264
308
  "elysia": ">=1.4.27",
265
309
  "fastify": ">=5.8.2",
266
310
  "@nestjs/common": ">=11.1.16",
267
- "@sveltejs/kit": ">=2.53.4"
311
+ "vite": "^7.0.0 || ^8.0.0",
312
+ "ai": ">=6.0.0"
268
313
  },
269
314
  "peerDependenciesMeta": {
270
315
  "@nuxt/kit": {
@@ -303,7 +348,10 @@
303
348
  "@nestjs/common": {
304
349
  "optional": true
305
350
  },
306
- "@sveltejs/kit": {
351
+ "vite": {
352
+ "optional": true
353
+ },
354
+ "ai": {
307
355
  "optional": true
308
356
  }
309
357
  }
@@ -1,72 +0,0 @@
1
- import { createRequire } from "node:module";
2
- //#region \0rolldown/runtime.js
3
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
4
- //#endregion
5
- //#region src/adapters/_config.ts
6
- /**
7
- * Try to get runtime config from Nitro/Nuxt environment.
8
- * Returns undefined if not in a Nitro context.
9
- */
10
- function getRuntimeConfig() {
11
- try {
12
- const { useRuntimeConfig } = __require("nitropack/runtime");
13
- return useRuntimeConfig();
14
- } catch {
15
- return;
16
- }
17
- }
18
- function resolveAdapterConfig(namespace, fields, overrides) {
19
- const runtimeConfig = getRuntimeConfig();
20
- const evlogNs = runtimeConfig?.evlog?.[namespace];
21
- const rootNs = runtimeConfig?.[namespace];
22
- const config = {};
23
- for (const { key, env } of fields) config[key] = overrides?.[key] ?? evlogNs?.[key] ?? rootNs?.[key] ?? resolveEnv(env);
24
- return config;
25
- }
26
- function resolveEnv(envKeys) {
27
- if (!envKeys) return void 0;
28
- for (const key of envKeys) {
29
- const val = process.env[key];
30
- if (val) return val;
31
- }
32
- }
33
- //#endregion
34
- //#region src/adapters/_drain.ts
35
- function defineDrain(options) {
36
- return async (ctx) => {
37
- const contexts = Array.isArray(ctx) ? ctx : [ctx];
38
- if (contexts.length === 0) return;
39
- const config = options.resolve();
40
- if (!config) return;
41
- try {
42
- await options.send(contexts.map((c) => c.event), config);
43
- } catch (error) {
44
- console.error(`[evlog/${options.name}] Failed to send events:`, error);
45
- }
46
- };
47
- }
48
- //#endregion
49
- //#region src/adapters/_http.ts
50
- async function httpPost({ url, headers, body, timeout, label }) {
51
- const controller = new AbortController();
52
- const timeoutId = setTimeout(() => controller.abort(), timeout);
53
- try {
54
- const response = await fetch(url, {
55
- method: "POST",
56
- headers,
57
- body,
58
- signal: controller.signal
59
- });
60
- if (!response.ok) {
61
- const text = await response.text().catch(() => "Unknown error");
62
- const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text;
63
- throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`);
64
- }
65
- } finally {
66
- clearTimeout(timeoutId);
67
- }
68
- }
69
- //#endregion
70
- export { defineDrain as n, resolveAdapterConfig as r, httpPost as t };
71
-
72
- //# sourceMappingURL=_http-DHpGetLZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_http-DHpGetLZ.mjs","names":[],"sources":["../src/adapters/_config.ts","../src/adapters/_drain.ts","../src/adapters/_http.ts"],"sourcesContent":["/**\n * Try to get runtime config from Nitro/Nuxt environment.\n * Returns undefined if not in a Nitro context.\n */\nexport function getRuntimeConfig(): Record<string, any> | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { useRuntimeConfig } = require('nitropack/runtime')\n return useRuntimeConfig()\n } catch {\n return undefined\n }\n}\n\nexport interface ConfigField<T> {\n key: keyof T & string\n env?: string[]\n}\n\nexport function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): Partial<T> {\n const runtimeConfig = getRuntimeConfig()\n const evlogNs = runtimeConfig?.evlog?.[namespace]\n const rootNs = runtimeConfig?.[namespace]\n\n const config: Record<string, unknown> = {}\n\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key]\n ?? evlogNs?.[key]\n ?? rootNs?.[key]\n ?? resolveEnv(env)\n }\n\n return config as Partial<T>\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined\n for (const key of envKeys) {\n const val = process.env[key]\n if (val) return val\n }\n return undefined\n}\n","import type { DrainContext, WideEvent } from '../types'\n\nexport interface DrainOptions<TConfig> {\n name: string\n resolve: () => TConfig | null\n send: (events: WideEvent[], config: TConfig) => Promise<void>\n}\n\nexport function defineDrain<TConfig>(options: DrainOptions<TConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void> {\n return async (ctx: DrainContext | DrainContext[]) => {\n const contexts = Array.isArray(ctx) ? ctx : [ctx]\n if (contexts.length === 0) return\n\n const config = options.resolve()\n if (!config) return\n\n try {\n await options.send(contexts.map(c => c.event), config)\n } catch (error) {\n console.error(`[evlog/${options.name}] Failed to send events:`, error)\n }\n }\n}\n","export interface HttpPostOptions {\n url: string\n headers: Record<string, string>\n body: string\n timeout: number\n label: string\n}\n\nexport async function httpPost({ url, headers, body, timeout, label }: HttpPostOptions): Promise<void> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error')\n const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text\n throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`)\n }\n } finally {\n clearTimeout(timeoutId)\n }\n}\n"],"mappings":";;;;;;;;;AAIA,SAAgB,mBAAoD;AAClE,KAAI;EAEF,MAAM,EAAE,qBAAA,UAA6B,oBAAoB;AACzD,SAAO,kBAAkB;SACnB;AACN;;;AASJ,SAAgB,qBACd,WACA,QACA,WACY;CACZ,MAAM,gBAAgB,kBAAkB;CACxC,MAAM,UAAU,eAAe,QAAQ;CACvC,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,EAAE;AAE1C,MAAK,MAAM,EAAE,KAAK,SAAS,OACzB,QAAO,OACL,YAAY,QACT,UAAU,QACV,SAAS,QACT,WAAW,IAAI;AAGtB,QAAO;;AAGT,SAAS,WAAW,SAAwC;AAC1D,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,MAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAO;;;;;ACrCpB,SAAgB,YAAqB,SAAuF;AAC1H,QAAO,OAAO,QAAuC;EACnD,MAAM,WAAW,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC,IAAI;AACjD,MAAI,SAAS,WAAW,EAAG;EAE3B,MAAM,SAAS,QAAQ,SAAS;AAChC,MAAI,CAAC,OAAQ;AAEb,MAAI;AACF,SAAM,QAAQ,KAAK,SAAS,KAAI,MAAK,EAAE,MAAM,EAAE,OAAO;WAC/C,OAAO;AACd,WAAQ,MAAM,UAAU,QAAQ,KAAK,2BAA2B,MAAM;;;;;;ACX5E,eAAsB,SAAS,EAAE,KAAK,SAAS,MAAM,SAAS,SAAyC;CACrG,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,QAAQ;AAE/D,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ;GACR;GACA;GACA,QAAQ,WAAW;GACpB,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;GAC/D,MAAM,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB;AAC7E,SAAM,IAAI,MAAM,GAAG,MAAM,cAAc,SAAS,OAAO,GAAG,SAAS,WAAW,KAAK,WAAW;;WAExF;AACR,eAAa,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"headers-Ba1eKT3i.mjs","names":[],"sources":["../src/shared/middleware.ts","../src/shared/headers.ts"],"sourcesContent":["import type { DrainContext, EnrichContext, RequestLogger, RouteConfig, TailSamplingContext, WideEvent } from '../types'\nimport { createRequestLogger, isEnabled, shouldKeep } from '../logger'\nimport { extractErrorStatus } from './errors'\nimport { shouldLog, getServiceForPath } from './routes'\n\n/**\n * Base options shared by all framework integrations.\n *\n * Every framework-specific options interface (e.g. `EvlogExpressOptions`)\n * extends this type. If a framework needs extra fields it can add them\n * on top; otherwise the base is used as-is.\n *\n * @beta Part of `evlog/toolkit` — the public API for building custom integrations.\n */\nexport interface BaseEvlogOptions {\n /** Route patterns to include in logging (glob). If not set, all routes are logged */\n include?: string[]\n /** Route patterns to exclude from logging. Exclusions take precedence over inclusions */\n exclude?: string[]\n /** Route-specific service configuration */\n routes?: Record<string, RouteConfig>\n /**\n * Drain callback called with every emitted event.\n * Use with drain adapters (Axiom, OTLP, Sentry, etc.) or custom endpoints.\n */\n drain?: (ctx: DrainContext) => void | Promise<void>\n /**\n * Enrich callback called after emit, before drain.\n * Use to add derived context (geo, deployment info, user agent, etc.).\n */\n enrich?: (ctx: EnrichContext) => void | Promise<void>\n /**\n * Custom tail sampling callback.\n * Set `ctx.shouldKeep = true` to force-keep the log regardless of head sampling.\n */\n keep?: (ctx: TailSamplingContext) => void | Promise<void>\n}\n\n/**\n * Internal options consumed by `createMiddlewareLogger`.\n * Extends `BaseEvlogOptions` with the request-specific fields\n * that framework adapters must provide.\n */\nexport interface MiddlewareLoggerOptions extends BaseEvlogOptions {\n method: string\n path: string\n requestId?: string\n /** Pre-filtered safe request headers (used for enrich/drain context) */\n headers?: Record<string, string>\n}\n\nexport interface MiddlewareLoggerResult {\n logger: RequestLogger\n finish: (opts?: { status?: number; error?: Error }) => Promise<WideEvent | null>\n skipped: boolean\n}\n\nconst noopResult: MiddlewareLoggerResult = {\n logger: {\n set() {},\n error() {},\n info() {},\n warn() {},\n emit() {\n return null \n },\n getContext() {\n return {} \n },\n },\n finish: () => Promise.resolve(null),\n skipped: true,\n}\n\nasync function runEnrichAndDrain(\n emittedEvent: WideEvent,\n options: MiddlewareLoggerOptions,\n requestInfo: { method: string; path: string; requestId?: string },\n responseStatus?: number,\n): Promise<void> {\n if (options.enrich) {\n const enrichCtx: EnrichContext = {\n event: emittedEvent,\n request: requestInfo,\n headers: options.headers,\n response: { status: responseStatus },\n }\n try {\n await options.enrich(enrichCtx)\n } catch (err) {\n console.error('[evlog] enrich failed:', err)\n }\n }\n\n if (options.drain) {\n const drainCtx: DrainContext = {\n event: emittedEvent,\n request: requestInfo,\n headers: options.headers,\n }\n try {\n await options.drain(drainCtx)\n } catch (err) {\n console.error('[evlog] drain failed:', err)\n }\n }\n}\n\n/**\n * Create a middleware-aware request logger with full lifecycle management.\n *\n * Handles the complete pipeline shared across all framework integrations:\n * route filtering, logger creation, service overrides, duration tracking,\n * tail sampling evaluation, event emission, enrichment, and draining.\n *\n * Framework adapters only need to:\n * 1. Extract method/path/requestId/headers from the framework request\n * 2. Call `createMiddlewareLogger()` with those + user options\n * 3. Check `skipped` — if true, skip to next middleware\n * 4. Store `logger` in framework-specific context (e.g., `c.set('log', logger)`)\n * 5. Call `finish({ status })` or `finish({ error })` at response end\n *\n * @beta Part of `evlog/toolkit` — the public API for building custom integrations.\n */\nexport function createMiddlewareLogger(options: MiddlewareLoggerOptions): MiddlewareLoggerResult {\n if (!isEnabled()) return noopResult\n\n const { method, path, requestId, include, exclude, routes, keep } = options\n\n if (!shouldLog(path, include, exclude)) {\n return noopResult\n }\n\n const resolvedRequestId = requestId || crypto.randomUUID()\n\n const logger = createRequestLogger({\n method,\n path,\n requestId: resolvedRequestId,\n })\n\n const routeService = getServiceForPath(path, routes)\n if (routeService) {\n logger.set({ service: routeService })\n }\n\n const startTime = Date.now()\n const requestInfo = { method, path, requestId: resolvedRequestId }\n\n const finish = async (opts?: { status?: number; error?: Error }): Promise<WideEvent | null> => {\n const { status, error } = opts ?? {}\n\n if (error) {\n logger.error(error)\n const errorStatus = extractErrorStatus(error)\n logger.set({ status: errorStatus })\n } else if (status !== undefined) {\n logger.set({ status })\n }\n\n const durationMs = Date.now() - startTime\n\n const resolvedStatus = error\n ? extractErrorStatus(error)\n : status ?? (logger.getContext().status as number | undefined)\n\n const tailCtx: TailSamplingContext = {\n status: resolvedStatus,\n duration: durationMs,\n path,\n method,\n context: logger.getContext(),\n shouldKeep: false,\n }\n\n if (keep) {\n await keep(tailCtx)\n }\n\n const forceKeep = tailCtx.shouldKeep || shouldKeep(tailCtx)\n const emittedEvent = logger.emit({ _forceKeep: forceKeep })\n\n if (emittedEvent && (options.enrich || options.drain)) {\n await runEnrichAndDrain(emittedEvent, options, requestInfo, resolvedStatus)\n }\n\n return emittedEvent\n }\n\n return { logger, finish, skipped: false }\n}\n","import { filterSafeHeaders } from '../utils'\n\n/**\n * Extract headers from a Web API `Headers` object and filter out sensitive ones.\n * Works with any runtime that supports the standard `Headers` API (Hono, Elysia,\n * Nitro v3, Cloudflare Workers, Bun, Deno, etc.).\n */\nexport function extractSafeHeaders(headers: Headers): Record<string, string> {\n const raw: Record<string, string> = {}\n headers.forEach((value, key) => {\n raw[key] = value\n })\n return filterSafeHeaders(raw)\n}\n\n/**\n * Extract headers from Node.js `IncomingHttpHeaders` and filter out sensitive ones.\n * Works with Express, Fastify, and any Node.js HTTP server using `req.headers`.\n */\nexport function extractSafeNodeHeaders(headers: Record<string, string | string[] | undefined>): Record<string, string> {\n const raw: Record<string, string> = {}\n for (const [key, value] of Object.entries(headers)) {\n if (value === undefined) continue\n raw[key] = Array.isArray(value) ? value.join(', ') : value\n }\n return filterSafeHeaders(raw)\n}\n"],"mappings":";;;;;AAyDA,MAAM,aAAqC;CACzC,QAAQ;EACN,MAAM;EACN,QAAQ;EACR,OAAO;EACP,OAAO;EACP,OAAO;AACL,UAAO;;EAET,aAAa;AACX,UAAO,EAAE;;EAEZ;CACD,cAAc,QAAQ,QAAQ,KAAK;CACnC,SAAS;CACV;AAED,eAAe,kBACb,cACA,SACA,aACA,gBACe;AACf,KAAI,QAAQ,QAAQ;EAClB,MAAM,YAA2B;GAC/B,OAAO;GACP,SAAS;GACT,SAAS,QAAQ;GACjB,UAAU,EAAE,QAAQ,gBAAgB;GACrC;AACD,MAAI;AACF,SAAM,QAAQ,OAAO,UAAU;WACxB,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;;;AAIhD,KAAI,QAAQ,OAAO;EACjB,MAAM,WAAyB;GAC7B,OAAO;GACP,SAAS;GACT,SAAS,QAAQ;GAClB;AACD,MAAI;AACF,SAAM,QAAQ,MAAM,SAAS;WACtB,KAAK;AACZ,WAAQ,MAAM,yBAAyB,IAAI;;;;;;;;;;;;;;;;;;;;AAqBjD,SAAgB,uBAAuB,SAA0D;AAC/F,KAAI,CAAC,WAAW,CAAE,QAAO;CAEzB,MAAM,EAAE,QAAQ,MAAM,WAAW,SAAS,SAAS,QAAQ,SAAS;AAEpE,KAAI,CAAC,UAAU,MAAM,SAAS,QAAQ,CACpC,QAAO;CAGT,MAAM,oBAAoB,aAAa,OAAO,YAAY;CAE1D,MAAM,SAAS,oBAAoB;EACjC;EACA;EACA,WAAW;EACZ,CAAC;CAEF,MAAM,eAAe,kBAAkB,MAAM,OAAO;AACpD,KAAI,aACF,QAAO,IAAI,EAAE,SAAS,cAAc,CAAC;CAGvC,MAAM,YAAY,KAAK,KAAK;CAC5B,MAAM,cAAc;EAAE;EAAQ;EAAM,WAAW;EAAmB;CAElE,MAAM,SAAS,OAAO,SAAyE;EAC7F,MAAM,EAAE,QAAQ,UAAU,QAAQ,EAAE;AAEpC,MAAI,OAAO;AACT,UAAO,MAAM,MAAM;GACnB,MAAM,cAAc,mBAAmB,MAAM;AAC7C,UAAO,IAAI,EAAE,QAAQ,aAAa,CAAC;aAC1B,WAAW,KAAA,EACpB,QAAO,IAAI,EAAE,QAAQ,CAAC;EAGxB,MAAM,aAAa,KAAK,KAAK,GAAG;EAEhC,MAAM,iBAAiB,QACnB,mBAAmB,MAAM,GACzB,UAAW,OAAO,YAAY,CAAC;EAEnC,MAAM,UAA+B;GACnC,QAAQ;GACR,UAAU;GACV;GACA;GACA,SAAS,OAAO,YAAY;GAC5B,YAAY;GACb;AAED,MAAI,KACF,OAAM,KAAK,QAAQ;EAGrB,MAAM,YAAY,QAAQ,cAAc,WAAW,QAAQ;EAC3D,MAAM,eAAe,OAAO,KAAK,EAAE,YAAY,WAAW,CAAC;AAE3D,MAAI,iBAAiB,QAAQ,UAAU,QAAQ,OAC7C,OAAM,kBAAkB,cAAc,SAAS,aAAa,eAAe;AAG7E,SAAO;;AAGT,QAAO;EAAE;EAAQ;EAAQ,SAAS;EAAO;;;;;;;;;ACtL3C,SAAgB,mBAAmB,SAA0C;CAC3E,MAAM,MAA8B,EAAE;AACtC,SAAQ,SAAS,OAAO,QAAQ;AAC9B,MAAI,OAAO;GACX;AACF,QAAO,kBAAkB,IAAI;;;;;;AAO/B,SAAgB,uBAAuB,SAAgF;CACrH,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,QAAQ,EAAE;AAClD,MAAI,UAAU,KAAA,EAAW;AACzB,MAAI,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK,KAAK,GAAG;;AAEvD,QAAO,kBAAkB,IAAI"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger-CvDYZUze.d.mts","names":[],"sources":["../src/logger.ts"],"mappings":";;;;;AAoCA;;iBAAgB,UAAA,CAAW,MAAA,GAAQ,YAAA;;;AAqBnC;iBAAgB,SAAA,CAAA;;;;AA8BhB;iBAAgB,UAAA,CAAW,GAAA,EAAK,mBAAA;;;;AAgB/B;;;;;AAsOD;cAjCM,IAAA,EAAM,GAAA;;;;;;;;;;;;iBAiCI,YAAA,oBAAgC,MAAA,kBAAA,CAAyB,cAAA,GAAgB,MAAA,oBAA+B,aAAA,CAAc,CAAA;;;AAsHtI;;;;;;;;;;iBAAgB,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,GAAS,oBAAA,GAA4B,aAAA,CAAc,CAAA;;;;iBAWnH,cAAA,CAAA,GAAkB,kBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nitro-CGGTUned.d.mts","names":[],"sources":["../src/nitro.ts"],"mappings":";;;UAKiB,kBAAA;EAAA;;;;EAKf,OAAA;EA8BwB;;;EAzBxB,GAAA,GAAM,OAAA,CAAQ,kBAAA;EA8BW;;;;EAxBzB,MAAA;EAAA;;;;;EAOA,OAAA;EAiBA;;;;;EAVA,OAAA;;;;EAKA,MAAA,GAAS,MAAA,SAAe,WAAA;;;;EAKxB,QAAA,GAAW,cAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nitro-D1pPm37T.mjs","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import type { EnvironmentContext, RouteConfig, SamplingConfig } from './types'\nimport { extractErrorStatus } from './shared/errors'\n\nexport { shouldLog, getServiceForPath } from './shared/routes'\n\nexport interface NitroModuleOptions {\n /**\n * Enable or disable all logging globally.\n * @default true\n */\n enabled?: boolean\n\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable pretty printing.\n * @default true in development, false in production\n */\n pretty?: boolean\n\n /**\n * Route patterns to include in logging.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are logged.\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/_nitro/**'.\n * Exclusions take precedence over inclusions.\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n */\n sampling?: SamplingConfig\n}\n\nexport interface EvlogConfig {\n enabled?: boolean\n env?: Record<string, unknown>\n pretty?: boolean\n include?: string[]\n exclude?: string[]\n routes?: Record<string, RouteConfig>\n sampling?: SamplingConfig\n}\n\n/**\n * Resolve an EvlogError from an error or its cause chain.\n * Both Nitro v2 (h3) and v3 wrap thrown errors — this unwraps them.\n */\nexport function resolveEvlogError(error: Error): Error | null {\n if (error.name === 'EvlogError') return error\n if ((error.cause as Error)?.name === 'EvlogError') return error.cause as Error\n return null\n}\n\nexport { extractErrorStatus } from './shared/errors'\n\n/**\n * Build a standard evlog error JSON response body.\n * Used by both v2 and v3 error handlers to ensure consistent shape.\n */\nexport function serializeEvlogErrorResponse(error: Error, url: string): Record<string, unknown> {\n const status = extractErrorStatus(error)\n const { data } = error as { data?: unknown }\n const statusMessage = (error as { statusMessage?: string }).statusMessage || error.message\n return {\n url,\n status,\n statusCode: status,\n statusText: statusMessage,\n statusMessage,\n message: error.message,\n error: true,\n ...(data !== undefined && { data }),\n }\n}\n\n"],"mappings":";;;;;;AA8DA,SAAgB,kBAAkB,OAA4B;AAC5D,KAAI,MAAM,SAAS,aAAc,QAAO;AACxC,KAAK,MAAM,OAAiB,SAAS,aAAc,QAAO,MAAM;AAChE,QAAO;;;;;;AAST,SAAgB,4BAA4B,OAAc,KAAsC;CAC9F,MAAM,SAAS,mBAAmB,MAAM;CACxC,MAAM,EAAE,SAAS;CACjB,MAAM,gBAAiB,MAAqC,iBAAiB,MAAM;AACnF,QAAO;EACL;EACA;EACA,YAAY;EACZ,YAAY;EACZ;EACA,SAAS,MAAM;EACf,OAAO;EACP,GAAI,SAAS,KAAA,KAAa,EAAE,MAAM;EACnC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseError-BztqcPwZ.d.mts","names":[],"sources":["../src/runtime/utils/parseError.ts"],"mappings":";;;iBAKgB,UAAA,CAAW,KAAA,YAAiB,WAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types-B8-kC2ME.d.mts","names":[],"sources":["../src/types.ts"],"mappings":"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"}