@orion-js/logger 4.0.6 → 4.1.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.
- package/dist/index.cjs +189 -65
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +184 -60
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -42,47 +42,68 @@ __export(index_exports, {
|
|
|
42
42
|
textConsoleFormat: () => textConsoleFormat,
|
|
43
43
|
textConsoleTransport: () => textConsoleTransport,
|
|
44
44
|
updateOrionAsyncContext: () => updateOrionAsyncContext,
|
|
45
|
-
winston: () =>
|
|
45
|
+
winston: () => import_winston5.default,
|
|
46
46
|
winstonLogger: () => winstonLogger
|
|
47
47
|
});
|
|
48
48
|
module.exports = __toCommonJS(index_exports);
|
|
49
|
-
var
|
|
49
|
+
var import_winston5 = __toESM(require("winston"), 1);
|
|
50
50
|
|
|
51
|
-
// src/formats.ts
|
|
51
|
+
// src/formats/consoleFormats.ts
|
|
52
|
+
var import_winston3 = require("winston");
|
|
53
|
+
|
|
54
|
+
// src/formats/winstonFormats.ts
|
|
52
55
|
var import_winston = require("winston");
|
|
53
|
-
var
|
|
56
|
+
var import_api = __toESM(require("@opentelemetry/api"), 1);
|
|
54
57
|
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
// src/asyncContext.ts
|
|
59
|
+
var import_node_async_hooks = require("async_hooks");
|
|
60
|
+
var import_node_crypto = require("crypto");
|
|
61
|
+
var storage = new import_node_async_hooks.AsyncLocalStorage();
|
|
62
|
+
async function runWithOrionAsyncContext(context, callback) {
|
|
63
|
+
const contextWithId = {
|
|
64
|
+
contextId: (0, import_node_crypto.randomUUID)(),
|
|
65
|
+
...context
|
|
66
|
+
};
|
|
67
|
+
return await storage.run(contextWithId, async () => {
|
|
68
|
+
return await callback();
|
|
69
|
+
});
|
|
66
70
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (inputType === "Object") {
|
|
75
|
-
return Object.keys(input).length === 0;
|
|
71
|
+
var getOrionAsyncContext = () => {
|
|
72
|
+
return storage.getStore();
|
|
73
|
+
};
|
|
74
|
+
var updateOrionAsyncContext = (context) => {
|
|
75
|
+
const currentContext = storage.getStore();
|
|
76
|
+
if (!currentContext) {
|
|
77
|
+
return void 0;
|
|
76
78
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
Object.assign(currentContext, context);
|
|
80
|
+
return currentContext;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// src/formats/getAsyncContextLabel.ts
|
|
84
|
+
function getAsyncContextLabel() {
|
|
85
|
+
const asyncContext = getOrionAsyncContext();
|
|
86
|
+
if (!asyncContext) return "";
|
|
87
|
+
const { controllerType } = asyncContext;
|
|
88
|
+
switch (controllerType) {
|
|
89
|
+
case "job":
|
|
90
|
+
return `${controllerType}:${asyncContext.jobName}`;
|
|
91
|
+
case "route":
|
|
92
|
+
return `${controllerType}:${asyncContext.pathname}`;
|
|
93
|
+
case "resolver":
|
|
94
|
+
return asyncContext.resolverName ? `${controllerType}:${asyncContext.resolverName}` : controllerType;
|
|
95
|
+
case "modelResolver":
|
|
96
|
+
return asyncContext.modelResolverName ? `${controllerType}:${asyncContext.modelName}:${asyncContext.modelResolverName}` : controllerType;
|
|
97
|
+
case "subscription":
|
|
98
|
+
return `${controllerType}:${asyncContext.subscriptionName}`;
|
|
99
|
+
case "echo":
|
|
100
|
+
return `${controllerType}:${asyncContext.echoName}`;
|
|
101
|
+
default:
|
|
102
|
+
return controllerType;
|
|
79
103
|
}
|
|
80
|
-
return false;
|
|
81
104
|
}
|
|
82
105
|
|
|
83
|
-
// src/formats.ts
|
|
84
|
-
var import_api = __toESM(require("@opentelemetry/api"), 1);
|
|
85
|
-
var { metadata, timestamp, json, colorize, combine, printf } = import_winston.format;
|
|
106
|
+
// src/formats/winstonFormats.ts
|
|
86
107
|
var opentelemetryContext = (0, import_winston.format)((info) => {
|
|
87
108
|
const activeSpan = import_api.default.trace.getActiveSpan();
|
|
88
109
|
if (activeSpan) {
|
|
@@ -113,6 +134,12 @@ var metaError = (0, import_winston.format)((info) => {
|
|
|
113
134
|
}
|
|
114
135
|
return info;
|
|
115
136
|
});
|
|
137
|
+
var asyncContextFormat = (0, import_winston.format)((info) => {
|
|
138
|
+
if (!info.context) {
|
|
139
|
+
info.context = getAsyncContextLabel();
|
|
140
|
+
}
|
|
141
|
+
return info;
|
|
142
|
+
});
|
|
116
143
|
var sentryFormat = (0, import_winston.format)((info) => {
|
|
117
144
|
const { path, label, ...extra } = info;
|
|
118
145
|
return {
|
|
@@ -123,26 +150,147 @@ var sentryFormat = (0, import_winston.format)((info) => {
|
|
|
123
150
|
}
|
|
124
151
|
};
|
|
125
152
|
});
|
|
153
|
+
|
|
154
|
+
// src/formats/getMetadataText.ts
|
|
155
|
+
var import_node_util = __toESM(require("util"), 1);
|
|
156
|
+
|
|
157
|
+
// ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js
|
|
158
|
+
function type(input) {
|
|
159
|
+
if (input === null) {
|
|
160
|
+
return "Null";
|
|
161
|
+
} else if (input === void 0) {
|
|
162
|
+
return "Undefined";
|
|
163
|
+
} else if (Number.isNaN(input)) {
|
|
164
|
+
return "NaN";
|
|
165
|
+
}
|
|
166
|
+
const typeResult = Object.prototype.toString.call(input).slice(8, -1);
|
|
167
|
+
return typeResult === "AsyncFunction" ? "Promise" : typeResult;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js
|
|
171
|
+
function isEmpty(input) {
|
|
172
|
+
const inputType = type(input);
|
|
173
|
+
if (["Undefined", "NaN", "Number", "Null"].includes(inputType))
|
|
174
|
+
return false;
|
|
175
|
+
if (!input) return true;
|
|
176
|
+
if (inputType === "Object") {
|
|
177
|
+
return Object.keys(input).length === 0;
|
|
178
|
+
}
|
|
179
|
+
if (inputType === "Array") {
|
|
180
|
+
return input.length === 0;
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// src/formats/getMetadataText.ts
|
|
126
186
|
function getMetadataText(metadata2) {
|
|
127
187
|
const { value, ...rest } = metadata2;
|
|
128
188
|
if (isEmpty(rest)) {
|
|
129
189
|
if (typeof value === "undefined") return "";
|
|
130
|
-
return import_node_util.default.inspect(value);
|
|
190
|
+
return import_node_util.default.inspect(value, { colors: true });
|
|
131
191
|
}
|
|
132
|
-
return `${import_node_util.default.inspect(value)} ${import_node_util.default.inspect(rest)}`;
|
|
192
|
+
return `${import_node_util.default.inspect(value, { colors: true })} ${import_node_util.default.inspect(rest, { colors: true })}`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// src/formats/formatStack.ts
|
|
196
|
+
function formatStack(stack) {
|
|
197
|
+
if (!stack) return "";
|
|
198
|
+
const lines = stack.split("\n");
|
|
199
|
+
const errorLine = lines[0];
|
|
200
|
+
const stackLines = lines.slice(1);
|
|
201
|
+
const dim = "\x1B[2m";
|
|
202
|
+
const reset = "\x1B[0m";
|
|
203
|
+
const cyan = "\x1B[36m";
|
|
204
|
+
const yellow = "\x1B[33m";
|
|
205
|
+
const gray = "\x1B[90m";
|
|
206
|
+
const formattedStackLines = stackLines.map((line) => {
|
|
207
|
+
if (!line.trim()) return "";
|
|
208
|
+
const match1 = line.match(/^(\s+at\s+)(.+?)(\s+\()([^)]+)(\))/);
|
|
209
|
+
if (match1) {
|
|
210
|
+
const [, atSpace, funcName, openParen, filePath, closeParen] = match1;
|
|
211
|
+
const fileMatch = filePath.match(/^(.*):(\d+):(\d+)$/);
|
|
212
|
+
if (fileMatch) {
|
|
213
|
+
const [, file, lineNum, colNum] = fileMatch;
|
|
214
|
+
return `${gray} ${atSpace}${reset}${dim}${funcName}${reset} ${gray}${openParen}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${gray}${closeParen}${reset}`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const match2 = line.match(/^(\s+at\s+)([^(]+):(\d+):(\d+)/);
|
|
218
|
+
if (match2) {
|
|
219
|
+
const [, atSpace, file, lineNum, colNum] = match2;
|
|
220
|
+
return `${gray} ${atSpace}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${reset}`;
|
|
221
|
+
}
|
|
222
|
+
return `${gray} ${line.trim()}${reset}`;
|
|
223
|
+
});
|
|
224
|
+
return `
|
|
225
|
+
${errorLine}
|
|
226
|
+
${formattedStackLines.filter(Boolean).join("\n")}`;
|
|
133
227
|
}
|
|
228
|
+
|
|
229
|
+
// src/formats/enrichWithAsyncContext.ts
|
|
230
|
+
var import_winston2 = require("winston");
|
|
231
|
+
var enrichWithAsyncContext = (0, import_winston2.format)((info) => {
|
|
232
|
+
const asyncContext = getOrionAsyncContext();
|
|
233
|
+
if (!asyncContext) return info;
|
|
234
|
+
const contextData = {
|
|
235
|
+
controllerType: asyncContext.controllerType,
|
|
236
|
+
contextId: asyncContext.contextId
|
|
237
|
+
};
|
|
238
|
+
switch (asyncContext.controllerType) {
|
|
239
|
+
case "job":
|
|
240
|
+
contextData.jobName = asyncContext.jobName;
|
|
241
|
+
break;
|
|
242
|
+
case "route":
|
|
243
|
+
contextData.routeName = asyncContext.routeName;
|
|
244
|
+
contextData.pathname = asyncContext.pathname;
|
|
245
|
+
break;
|
|
246
|
+
case "resolver":
|
|
247
|
+
if (asyncContext.resolverName) {
|
|
248
|
+
contextData.resolverName = asyncContext.resolverName;
|
|
249
|
+
}
|
|
250
|
+
break;
|
|
251
|
+
case "modelResolver":
|
|
252
|
+
if (asyncContext.modelName) {
|
|
253
|
+
contextData.modelName = asyncContext.modelName;
|
|
254
|
+
}
|
|
255
|
+
if (asyncContext.modelResolverName) {
|
|
256
|
+
contextData.modelResolverName = asyncContext.modelResolverName;
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
259
|
+
case "subscription":
|
|
260
|
+
contextData.subscriptionName = asyncContext.subscriptionName;
|
|
261
|
+
break;
|
|
262
|
+
case "echo":
|
|
263
|
+
contextData.echoName = asyncContext.echoName;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
if (asyncContext.viewer && typeof asyncContext.viewer === "object") {
|
|
267
|
+
const viewer = asyncContext.viewer;
|
|
268
|
+
if (viewer.userId) {
|
|
269
|
+
contextData.userId = viewer.userId;
|
|
270
|
+
} else if (viewer._id) {
|
|
271
|
+
contextData.userId = viewer._id;
|
|
272
|
+
} else if (viewer.id) {
|
|
273
|
+
contextData.userId = viewer.id;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
info.asyncContext = contextData;
|
|
277
|
+
return info;
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
// src/formats/consoleFormats.ts
|
|
281
|
+
var { metadata, timestamp, json, colorize, combine, printf } = import_winston3.format;
|
|
134
282
|
var textConsoleFormat = combine(
|
|
135
283
|
colorize(),
|
|
136
284
|
metadata({ fillExcept: ["fileName", "level", "message", "stack"] }),
|
|
137
285
|
opentelemetryContext(),
|
|
286
|
+
asyncContextFormat(),
|
|
138
287
|
metaError(),
|
|
139
288
|
timestamp(),
|
|
140
289
|
printf((info) => {
|
|
141
290
|
const date = new Date(info.timestamp);
|
|
142
291
|
const timeLabel = `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`;
|
|
143
292
|
const fileNameLabel = info.fileName ? `[${info.fileName}]` : "";
|
|
144
|
-
const stack = info.stack ?
|
|
145
|
-
${info.stack}` : "";
|
|
293
|
+
const stack = info.stack ? formatStack(info.stack) : "";
|
|
146
294
|
const value = getMetadataText(info.metadata);
|
|
147
295
|
const traceId = info.trace_id ? `${String(info.trace_id).substring(0, 8)}@${String(info.span_id).substring(0, 8)}` : "";
|
|
148
296
|
const context = [info.context, traceId].filter(Boolean).join(" ").trim();
|
|
@@ -158,24 +306,25 @@ ${info.stack}` : "";
|
|
|
158
306
|
].filter(Boolean).join(" ");
|
|
159
307
|
})
|
|
160
308
|
);
|
|
161
|
-
var textConsoleTransport = new
|
|
309
|
+
var textConsoleTransport = new import_winston3.transports.Console({
|
|
162
310
|
handleExceptions: true,
|
|
163
311
|
format: textConsoleFormat
|
|
164
312
|
});
|
|
165
313
|
var jsonConsoleFormat = combine(
|
|
166
314
|
metadata({ fillExcept: ["fileName", "level", "message"] }),
|
|
167
315
|
opentelemetryContext(),
|
|
316
|
+
enrichWithAsyncContext(),
|
|
168
317
|
metaError(),
|
|
169
318
|
timestamp(),
|
|
170
319
|
json()
|
|
171
320
|
);
|
|
172
|
-
var jsonConsoleTransport = new
|
|
321
|
+
var jsonConsoleTransport = new import_winston3.transports.Console({
|
|
173
322
|
handleExceptions: true,
|
|
174
323
|
format: jsonConsoleFormat
|
|
175
324
|
});
|
|
176
325
|
|
|
177
326
|
// src/logger.ts
|
|
178
|
-
var
|
|
327
|
+
var import_winston4 = require("winston");
|
|
179
328
|
|
|
180
329
|
// src/helpers/getFileName.ts
|
|
181
330
|
var getFileName = () => {
|
|
@@ -221,10 +370,10 @@ var improveFileName = (path) => {
|
|
|
221
370
|
var transports2 = [
|
|
222
371
|
process.env.NODE_ENV !== "production" || process.env.ORION_DEV || process.env.JEST_WORKER_ID ? textConsoleTransport : jsonConsoleTransport
|
|
223
372
|
];
|
|
224
|
-
var winstonLogger = (0,
|
|
225
|
-
levels:
|
|
373
|
+
var winstonLogger = (0, import_winston4.createLogger)({
|
|
374
|
+
levels: import_winston4.config.npm.levels,
|
|
226
375
|
handleExceptions: true,
|
|
227
|
-
format:
|
|
376
|
+
format: import_winston4.format.errors({ stack: true }),
|
|
228
377
|
transports: transports2
|
|
229
378
|
});
|
|
230
379
|
var configureLogger = (options) => {
|
|
@@ -271,31 +420,6 @@ var createLogger = (logger2) => {
|
|
|
271
420
|
};
|
|
272
421
|
};
|
|
273
422
|
var logger = createLogger(winstonLogger);
|
|
274
|
-
|
|
275
|
-
// src/asyncContext.ts
|
|
276
|
-
var import_node_async_hooks = require("async_hooks");
|
|
277
|
-
var import_node_crypto = require("crypto");
|
|
278
|
-
var storage = new import_node_async_hooks.AsyncLocalStorage();
|
|
279
|
-
async function runWithOrionAsyncContext(context, callback) {
|
|
280
|
-
const contextWithId = {
|
|
281
|
-
contextId: (0, import_node_crypto.randomUUID)(),
|
|
282
|
-
...context
|
|
283
|
-
};
|
|
284
|
-
return await storage.run(contextWithId, async () => {
|
|
285
|
-
return await callback();
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
var getOrionAsyncContext = () => {
|
|
289
|
-
return storage.getStore();
|
|
290
|
-
};
|
|
291
|
-
var updateOrionAsyncContext = (context) => {
|
|
292
|
-
const currentContext = storage.getStore();
|
|
293
|
-
if (!currentContext) {
|
|
294
|
-
return void 0;
|
|
295
|
-
}
|
|
296
|
-
Object.assign(currentContext, context);
|
|
297
|
-
return currentContext;
|
|
298
|
-
};
|
|
299
423
|
// Annotate the CommonJS export names for ESM import in node:
|
|
300
424
|
0 && (module.exports = {
|
|
301
425
|
addTransport,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/formats.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js","../src/logger.ts","../src/helpers/getFileName.ts","../src/asyncContext.ts"],"sourcesContent":["import winston from 'winston'\n\nexport * from './formats'\nexport * from './logger'\nexport * from './types'\nexport * from './asyncContext'\n\nexport {winston}\n","import {format, transports} from 'winston'\nimport util from 'node:util'\nimport {isEmpty} from 'rambdax'\nimport opentelemetry, {Span} from '@opentelemetry/api'\n\nconst {metadata, timestamp, json, colorize, combine, printf} = format\n\nconst opentelemetryContext = format(info => {\n const activeSpan: Span & {name?: string} = opentelemetry.trace.getActiveSpan()\n if (activeSpan) {\n const spanContex = activeSpan.spanContext()\n if (activeSpan.name && !info.context) {\n info.context = activeSpan.name\n }\n const fields = {\n trace_id: spanContex.traceId,\n span_id: spanContex.spanId,\n trace_flags: `0${spanContex.traceFlags.toString(16)}`,\n }\n Object.assign(info, fields)\n }\n return info\n})\n\nconst metaError = format((info: any) => {\n if (info?.metadata?.value?.error instanceof Error) {\n info.stack = info?.metadata?.value?.error.stack\n info.errorMessage = info?.metadata?.value?.error.message\n delete info?.metadata?.value?.error\n }\n\n if (info?.metadata?.value instanceof Error) {\n info.stack = info?.metadata?.value.stack\n info.errorMessage = info?.metadata?.value.message\n delete info?.metadata?.value\n }\n\n return info\n})\n\nexport const sentryFormat: any = format(info => {\n const {path, label, ...extra} = info\n return {\n ...extra,\n tags: {\n path: path || '',\n request_id: label,\n },\n }\n})\n\nfunction getMetadataText(metadata: any) {\n const {value, ...rest} = metadata\n if (isEmpty(rest)) {\n if (typeof value === 'undefined') return ''\n return util.inspect(value)\n }\n return `${util.inspect(value)} ${util.inspect(rest)}`\n}\n\nexport const textConsoleFormat: any = combine(\n colorize(),\n metadata({fillExcept: ['fileName', 'level', 'message', 'stack']}),\n opentelemetryContext(),\n metaError(),\n timestamp(),\n printf((info: any) => {\n // console.log(info)\n\n const date = new Date(info.timestamp)\n const timeLabel = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`\n const fileNameLabel = info.fileName ? `[${info.fileName}]` : ''\n const stack = info.stack ? `\\n${info.stack}` : ''\n const value = getMetadataText(info.metadata)\n const traceId = info.trace_id\n ? `${String(info.trace_id).substring(0, 8)}@${String(info.span_id).substring(0, 8)}`\n : ''\n const context = [info.context, traceId].filter(Boolean).join(' ').trim()\n const contextLabel = context ? `[${context}]` : ''\n return [\n `[${info.level}]`,\n `[${timeLabel}]`,\n contextLabel,\n fileNameLabel,\n info.message,\n value,\n stack,\n ]\n .filter(Boolean)\n .join(' ')\n }),\n)\n\nexport const textConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: textConsoleFormat,\n})\n\nexport const jsonConsoleFormat: any = combine(\n metadata({fillExcept: ['fileName', 'level', 'message']}),\n opentelemetryContext(),\n metaError(),\n timestamp(),\n json(),\n)\n\nexport const jsonConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: jsonConsoleFormat,\n})\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","import { type } from './type.js'\n\nexport function isEmpty(input){\n const inputType = type(input)\n if ([ 'Undefined', 'NaN', 'Number', 'Null' ].includes(inputType))\n return false\n if (!input) return true\n\n if (inputType === 'Object'){\n return Object.keys(input).length === 0\n }\n\n if (inputType === 'Array'){\n return input.length === 0\n }\n\n return false\n}\n","import winston, {createLogger as winstonCreateLogger, config, format} from 'winston'\nimport {jsonConsoleTransport, textConsoleTransport} from './formats'\nimport {getFileName} from './helpers/getFileName'\nimport {OrionLogger} from './types'\n\nconst transports: winston.transport[] = [\n process.env.NODE_ENV !== 'production' || process.env.ORION_DEV || process.env.JEST_WORKER_ID\n ? textConsoleTransport\n : jsonConsoleTransport,\n]\n\nexport const winstonLogger = winstonCreateLogger({\n levels: config.npm.levels,\n handleExceptions: true,\n format: format.errors({stack: true}),\n transports: transports,\n})\n\nexport const configureLogger = (options: winston.LoggerOptions) => {\n return winstonLogger.configure(options)\n}\n\nexport const setLogLevel = (level: string) => {\n winstonLogger.level = level\n}\n\nexport const addTransport = (transport: winston.transport) => {\n return winstonLogger.add(transport)\n}\n\nexport const getLogger = (context: string) => {\n return winstonLogger.child({context})\n}\n\nconst createLogger = (logger: winston.Logger): OrionLogger => {\n return {\n debug: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.debug({message, fileName, value})\n },\n info: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.info({message, fileName, value})\n },\n warn: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.warn({message, fileName, value})\n },\n error: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.error({message, fileName, value})\n },\n addContext: (module: NodeJS.Module) => {\n if (module.id) {\n const split = String(module.id).split('.orion/build/')\n const fileName = split.length > 1 ? split[1] : split[0]\n return createLogger(logger.child({fileName}))\n }\n return createLogger(logger.child({}))\n },\n addMetadata: (metadata: any) => {\n return createLogger(logger.child(metadata))\n },\n }\n}\n\nexport const logger = createLogger(winstonLogger)\n","export const getFileName = () => {\n try {\n const stack = new Error().stack\n const lines = stack.split('\\n')\n const filePath = lines[3].split('(')[1].split(')')[0]\n return improveFileName(filePath)\n } catch {\n return\n }\n}\n\nexport const improveFileName = (path: string) => {\n path = path.replace(`${process.cwd()}/`, '')\n if (path.includes('orionjs/packages')) {\n return path.replace(/^.+\\/orionjs\\/packages\\//, '@orion-js/')\n }\n\n if (path.includes('node_modules/@orion-js/')) {\n const after = path.split('node_modules/@orion-js/')[1]\n const onlyPackageName = after.split('/')[0]\n return `@orion-js/${onlyPackageName}`\n }\n\n if (path.includes('.orion/build')) {\n return path.replace(/^.+\\.orion\\/build\\//, '')\n }\n if (path.includes('.pnpm/@orion-js+')) {\n return `@orion-js/${path.split('.pnpm/@orion-js+')[1].split('@')[0]}`\n }\n if (path.includes('/node_modules/@')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}/${parts[1]}`\n }\n if (path.includes('/node_modules/')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}`\n }\n return path\n}\n","import {AsyncLocalStorage} from 'node:async_hooks'\nimport {randomUUID} from 'node:crypto'\n\ninterface BaseOrionAsyncContext {\n contextId: string\n viewer?: unknown\n params?: unknown\n}\n\nexport interface JobAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'job'\n jobName: string\n}\n\nexport interface RouteAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'route'\n routeName: string\n pathname: string\n}\n\nexport interface ResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'resolver'\n resolverName?: string\n}\n\nexport interface ModelResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'modelResolver'\n modelName?: string\n modelResolverName?: string\n parentData?: unknown\n}\n\nexport interface SubscriptionAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'subscription'\n subscriptionName: string\n}\n\nexport interface EchoAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'echo'\n echoName: string\n}\n\nexport type OrionAsyncContext =\n | JobAsyncContext\n | RouteAsyncContext\n | ResolverAsyncContext\n | ModelResolverAsyncContext\n | SubscriptionAsyncContext\n | EchoAsyncContext\n\nconst storage: AsyncLocalStorage<OrionAsyncContext> = new AsyncLocalStorage()\n\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<JobAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<RouteAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ModelResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<SubscriptionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<EchoAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<OrionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn> {\n const contextWithId = {\n contextId: randomUUID(),\n ...context,\n } as OrionAsyncContext\n return await storage.run(contextWithId, async () => {\n return await callback()\n })\n}\n\nexport const getOrionAsyncContext = (): OrionAsyncContext | undefined => {\n return storage.getStore()\n}\n\nexport const updateOrionAsyncContext = (\n context: Partial<OrionAsyncContext>,\n): OrionAsyncContext | undefined => {\n const currentContext: OrionAsyncContext | undefined = storage.getStore()\n if (!currentContext) {\n return undefined\n }\n\n Object.assign(currentContext, context)\n return currentContext\n}\n"],"mappings":"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","names":["winston","import_winston","opentelemetry","metadata","util","import_winston","transports","winstonCreateLogger","logger","module","metadata"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/formats/consoleFormats.ts","../src/formats/winstonFormats.ts","../src/asyncContext.ts","../src/formats/getAsyncContextLabel.ts","../src/formats/getMetadataText.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js","../src/formats/formatStack.ts","../src/formats/enrichWithAsyncContext.ts","../src/logger.ts","../src/helpers/getFileName.ts"],"sourcesContent":["import winston from 'winston'\n\nexport * from './formats'\nexport * from './logger'\nexport * from './types'\nexport * from './asyncContext'\n\nexport {winston}\n","import {format, transports} from 'winston'\nimport {opentelemetryContext, metaError, asyncContextFormat} from './winstonFormats'\nimport {getMetadataText} from './getMetadataText'\nimport {formatStack} from './formatStack'\nimport {enrichWithAsyncContext} from './enrichWithAsyncContext'\n\nconst {metadata, timestamp, json, colorize, combine, printf} = format\n\nexport const textConsoleFormat: any = combine(\n colorize(),\n metadata({fillExcept: ['fileName', 'level', 'message', 'stack']}),\n opentelemetryContext(),\n asyncContextFormat(),\n metaError(),\n timestamp(),\n printf((info: any) => {\n const date = new Date(info.timestamp)\n const timeLabel = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`\n const fileNameLabel = info.fileName ? `[${info.fileName}]` : ''\n const stack = info.stack ? formatStack(info.stack) : ''\n const value = getMetadataText(info.metadata)\n const traceId = info.trace_id\n ? `${String(info.trace_id).substring(0, 8)}@${String(info.span_id).substring(0, 8)}`\n : ''\n const context = [info.context, traceId].filter(Boolean).join(' ').trim()\n const contextLabel = context ? `[${context}]` : ''\n return [\n `[${info.level}]`,\n `[${timeLabel}]`,\n contextLabel,\n fileNameLabel,\n info.message,\n value,\n stack,\n ]\n .filter(Boolean)\n .join(' ')\n }),\n)\n\nexport const textConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: textConsoleFormat,\n})\n\nexport const jsonConsoleFormat: any = combine(\n metadata({fillExcept: ['fileName', 'level', 'message']}),\n opentelemetryContext(),\n enrichWithAsyncContext(),\n metaError(),\n timestamp(),\n json(),\n)\n\nexport const jsonConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: jsonConsoleFormat,\n})\n","import {format, Logform} from 'winston'\nimport opentelemetry, {Span} from '@opentelemetry/api'\nimport {getAsyncContextLabel} from './getAsyncContextLabel'\n\nexport const opentelemetryContext: Logform.FormatWrap = format(info => {\n const activeSpan: Span & {name?: string} = opentelemetry.trace.getActiveSpan()\n if (activeSpan) {\n const spanContex = activeSpan.spanContext()\n if (activeSpan.name && !info.context) {\n info.context = activeSpan.name\n }\n const fields = {\n trace_id: spanContex.traceId,\n span_id: spanContex.spanId,\n trace_flags: `0${spanContex.traceFlags.toString(16)}`,\n }\n Object.assign(info, fields)\n }\n return info\n})\n\nexport const metaError: Logform.FormatWrap = format((info: any) => {\n if (info?.metadata?.value?.error instanceof Error) {\n info.stack = info?.metadata?.value?.error.stack\n info.errorMessage = info?.metadata?.value?.error.message\n delete info?.metadata?.value?.error\n }\n\n if (info?.metadata?.value instanceof Error) {\n info.stack = info?.metadata?.value.stack\n info.errorMessage = info?.metadata?.value.message\n delete info?.metadata?.value\n }\n\n return info\n})\n\nexport const asyncContextFormat: Logform.FormatWrap = format(info => {\n if (!info.context) {\n info.context = getAsyncContextLabel()\n }\n return info\n})\n\nexport const sentryFormat: Logform.FormatWrap = format(info => {\n const {path, label, ...extra} = info\n return {\n ...extra,\n tags: {\n path: path || '',\n request_id: label,\n },\n }\n})\n","import {AsyncLocalStorage} from 'node:async_hooks'\nimport {randomUUID} from 'node:crypto'\n\ninterface BaseOrionAsyncContext {\n contextId: string\n viewer?: unknown\n params?: unknown\n}\n\nexport interface JobAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'job'\n jobName: string\n}\n\nexport interface RouteAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'route'\n routeName: string\n pathname: string\n}\n\nexport interface ResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'resolver'\n resolverName?: string\n}\n\nexport interface ModelResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'modelResolver'\n modelName?: string\n modelResolverName?: string\n parentData?: unknown\n}\n\nexport interface SubscriptionAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'subscription'\n subscriptionName: string\n}\n\nexport interface EchoAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'echo'\n echoName: string\n}\n\nexport type OrionAsyncContext =\n | JobAsyncContext\n | RouteAsyncContext\n | ResolverAsyncContext\n | ModelResolverAsyncContext\n | SubscriptionAsyncContext\n | EchoAsyncContext\n\nconst storage: AsyncLocalStorage<OrionAsyncContext> = new AsyncLocalStorage()\n\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<JobAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<RouteAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ModelResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<SubscriptionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<EchoAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<OrionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn> {\n const contextWithId = {\n contextId: randomUUID(),\n ...context,\n } as OrionAsyncContext\n return await storage.run(contextWithId, async () => {\n return await callback()\n })\n}\n\nexport const getOrionAsyncContext = (): OrionAsyncContext | undefined => {\n return storage.getStore()\n}\n\nexport const updateOrionAsyncContext = (\n context: Partial<OrionAsyncContext>,\n): OrionAsyncContext | undefined => {\n const currentContext: OrionAsyncContext | undefined = storage.getStore()\n if (!currentContext) {\n return undefined\n }\n\n Object.assign(currentContext, context)\n return currentContext\n}\n","import {getOrionAsyncContext} from '../asyncContext'\n\nexport function getAsyncContextLabel(): string {\n const asyncContext = getOrionAsyncContext()\n if (!asyncContext) return ''\n\n const {controllerType} = asyncContext\n\n switch (controllerType) {\n case 'job':\n return `${controllerType}:${asyncContext.jobName}`\n case 'route':\n return `${controllerType}:${asyncContext.pathname}`\n case 'resolver':\n return asyncContext.resolverName\n ? `${controllerType}:${asyncContext.resolverName}`\n : controllerType\n case 'modelResolver':\n return asyncContext.modelResolverName\n ? `${controllerType}:${asyncContext.modelName}:${asyncContext.modelResolverName}`\n : controllerType\n case 'subscription':\n return `${controllerType}:${asyncContext.subscriptionName}`\n case 'echo':\n return `${controllerType}:${asyncContext.echoName}`\n default:\n return controllerType\n }\n}\n","import util from 'node:util'\nimport {isEmpty} from 'rambdax'\n\nexport function getMetadataText(metadata: any): string {\n const {value, ...rest} = metadata\n if (isEmpty(rest)) {\n if (typeof value === 'undefined') return ''\n return util.inspect(value, {colors: true})\n }\n return `${util.inspect(value, {colors: true})} ${util.inspect(rest, {colors: true})}`\n}\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","import { type } from './type.js'\n\nexport function isEmpty(input){\n const inputType = type(input)\n if ([ 'Undefined', 'NaN', 'Number', 'Null' ].includes(inputType))\n return false\n if (!input) return true\n\n if (inputType === 'Object'){\n return Object.keys(input).length === 0\n }\n\n if (inputType === 'Array'){\n return input.length === 0\n }\n\n return false\n}\n","export function formatStack(stack: string): string {\n if (!stack) return ''\n\n const lines = stack.split('\\n')\n const errorLine = lines[0]\n const stackLines = lines.slice(1)\n\n // ANSI codes\n const dim = '\\x1b[2m'\n const reset = '\\x1b[0m'\n const cyan = '\\x1b[36m'\n const yellow = '\\x1b[33m'\n const gray = '\\x1b[90m'\n\n const formattedStackLines = stackLines.map(line => {\n if (!line.trim()) return ''\n\n // Match different stack trace formats\n // Format: at functionName (path/file.ts:line:col)\n const match1 = line.match(/^(\\s+at\\s+)(.+?)(\\s+\\()([^)]+)(\\))/)\n if (match1) {\n const [, atSpace, funcName, openParen, filePath, closeParen] = match1\n const fileMatch = filePath.match(/^(.*):(\\d+):(\\d+)$/)\n if (fileMatch) {\n const [, file, lineNum, colNum] = fileMatch\n return `${gray} ${atSpace}${reset}${dim}${funcName}${reset} ${gray}${openParen}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${gray}${closeParen}${reset}`\n }\n }\n\n // Format: at path/file.ts:line:col\n const match2 = line.match(/^(\\s+at\\s+)([^(]+):(\\d+):(\\d+)/)\n if (match2) {\n const [, atSpace, file, lineNum, colNum] = match2\n return `${gray} ${atSpace}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${reset}`\n }\n\n // Default: just dim the whole line\n return `${gray} ${line.trim()}${reset}`\n })\n\n return `\\n${errorLine}\\n${formattedStackLines.filter(Boolean).join('\\n')}`\n}\n","import {format, Logform} from 'winston'\nimport {getOrionAsyncContext} from '../asyncContext'\n\nexport const enrichWithAsyncContext: Logform.FormatWrap = format(info => {\n const asyncContext = getOrionAsyncContext()\n if (!asyncContext) return info\n\n const contextData: any = {\n controllerType: asyncContext.controllerType,\n contextId: asyncContext.contextId,\n }\n\n // Add controller-specific fields\n switch (asyncContext.controllerType) {\n case 'job':\n contextData.jobName = asyncContext.jobName\n break\n case 'route':\n contextData.routeName = asyncContext.routeName\n contextData.pathname = asyncContext.pathname\n break\n case 'resolver':\n if (asyncContext.resolverName) {\n contextData.resolverName = asyncContext.resolverName\n }\n break\n case 'modelResolver':\n if (asyncContext.modelName) {\n contextData.modelName = asyncContext.modelName\n }\n if (asyncContext.modelResolverName) {\n contextData.modelResolverName = asyncContext.modelResolverName\n }\n break\n case 'subscription':\n contextData.subscriptionName = asyncContext.subscriptionName\n break\n case 'echo':\n contextData.echoName = asyncContext.echoName\n break\n }\n\n // Extract userId from viewer if available\n if (asyncContext.viewer && typeof asyncContext.viewer === 'object') {\n const viewer = asyncContext.viewer as any\n if (viewer.userId) {\n contextData.userId = viewer.userId\n } else if (viewer._id) {\n contextData.userId = viewer._id\n } else if (viewer.id) {\n contextData.userId = viewer.id\n }\n }\n\n info.asyncContext = contextData\n\n return info\n})\n","import winston, {createLogger as winstonCreateLogger, config, format} from 'winston'\nimport {jsonConsoleTransport, textConsoleTransport} from './formats'\nimport {getFileName} from './helpers/getFileName'\nimport {OrionLogger} from './types'\n\nconst transports: winston.transport[] = [\n process.env.NODE_ENV !== 'production' || process.env.ORION_DEV || process.env.JEST_WORKER_ID\n ? textConsoleTransport\n : jsonConsoleTransport,\n]\n\nexport const winstonLogger = winstonCreateLogger({\n levels: config.npm.levels,\n handleExceptions: true,\n format: format.errors({stack: true}),\n transports: transports,\n})\n\nexport const configureLogger = (options: winston.LoggerOptions) => {\n return winstonLogger.configure(options)\n}\n\nexport const setLogLevel = (level: string) => {\n winstonLogger.level = level\n}\n\nexport const addTransport = (transport: winston.transport) => {\n return winstonLogger.add(transport)\n}\n\nexport const getLogger = (context: string) => {\n return winstonLogger.child({context})\n}\n\nconst createLogger = (logger: winston.Logger): OrionLogger => {\n return {\n debug: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.debug({message, fileName, value})\n },\n info: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.info({message, fileName, value})\n },\n warn: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.warn({message, fileName, value})\n },\n error: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.error({message, fileName, value})\n },\n addContext: (module: NodeJS.Module) => {\n if (module.id) {\n const split = String(module.id).split('.orion/build/')\n const fileName = split.length > 1 ? split[1] : split[0]\n return createLogger(logger.child({fileName}))\n }\n return createLogger(logger.child({}))\n },\n addMetadata: (metadata: any) => {\n return createLogger(logger.child(metadata))\n },\n }\n}\n\nexport const logger = createLogger(winstonLogger)\n","export const getFileName = () => {\n try {\n const stack = new Error().stack\n const lines = stack.split('\\n')\n const filePath = lines[3].split('(')[1].split(')')[0]\n return improveFileName(filePath)\n } catch {\n return\n }\n}\n\nexport const improveFileName = (path: string) => {\n path = path.replace(`${process.cwd()}/`, '')\n if (path.includes('orionjs/packages')) {\n return path.replace(/^.+\\/orionjs\\/packages\\//, '@orion-js/')\n }\n\n if (path.includes('node_modules/@orion-js/')) {\n const after = path.split('node_modules/@orion-js/')[1]\n const onlyPackageName = after.split('/')[0]\n return `@orion-js/${onlyPackageName}`\n }\n\n if (path.includes('.orion/build')) {\n return path.replace(/^.+\\.orion\\/build\\//, '')\n }\n if (path.includes('.pnpm/@orion-js+')) {\n return `@orion-js/${path.split('.pnpm/@orion-js+')[1].split('@')[0]}`\n }\n if (path.includes('/node_modules/@')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}/${parts[1]}`\n }\n if (path.includes('/node_modules/')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}`\n }\n return path\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAAAA;AAAA,EAAA;AAAA;AAAA;AAAA,IAAAC,kBAAoB;;;ACApB,IAAAC,kBAAiC;;;ACAjC,qBAA8B;AAC9B,iBAAkC;;;ACDlC,8BAAgC;AAChC,yBAAyB;AAiDzB,IAAM,UAAgD,IAAI,0CAAkB;AA0B5E,eAAsB,yBACpB,SACA,UACkB;AAClB,QAAM,gBAAgB;AAAA,IACpB,eAAW,+BAAW;AAAA,IACtB,GAAG;AAAA,EACL;AACA,SAAO,MAAM,QAAQ,IAAI,eAAe,YAAY;AAClD,WAAO,MAAM,SAAS;AAAA,EACxB,CAAC;AACH;AAEO,IAAM,uBAAuB,MAAqC;AACvE,SAAO,QAAQ,SAAS;AAC1B;AAEO,IAAM,0BAA0B,CACrC,YACkC;AAClC,QAAM,iBAAgD,QAAQ,SAAS;AACvE,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,gBAAgB,OAAO;AACrC,SAAO;AACT;;;ACrGO,SAAS,uBAA+B;AAC7C,QAAM,eAAe,qBAAqB;AAC1C,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,EAAC,eAAc,IAAI;AAEzB,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,GAAG,cAAc,IAAI,aAAa,OAAO;AAAA,IAClD,KAAK;AACH,aAAO,GAAG,cAAc,IAAI,aAAa,QAAQ;AAAA,IACnD,KAAK;AACH,aAAO,aAAa,eAChB,GAAG,cAAc,IAAI,aAAa,YAAY,KAC9C;AAAA,IACN,KAAK;AACH,aAAO,aAAa,oBAChB,GAAG,cAAc,IAAI,aAAa,SAAS,IAAI,aAAa,iBAAiB,KAC7E;AAAA,IACN,KAAK;AACH,aAAO,GAAG,cAAc,IAAI,aAAa,gBAAgB;AAAA,IAC3D,KAAK;AACH,aAAO,GAAG,cAAc,IAAI,aAAa,QAAQ;AAAA,IACnD;AACE,aAAO;AAAA,EACX;AACF;;;AFxBO,IAAM,2BAA2C,uBAAO,UAAQ;AACrE,QAAM,aAAqC,WAAAC,QAAc,MAAM,cAAc;AAC7E,MAAI,YAAY;AACd,UAAM,aAAa,WAAW,YAAY;AAC1C,QAAI,WAAW,QAAQ,CAAC,KAAK,SAAS;AACpC,WAAK,UAAU,WAAW;AAAA,IAC5B;AACA,UAAM,SAAS;AAAA,MACb,UAAU,WAAW;AAAA,MACrB,SAAS,WAAW;AAAA,MACpB,aAAa,IAAI,WAAW,WAAW,SAAS,EAAE,CAAC;AAAA,IACrD;AACA,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AACA,SAAO;AACT,CAAC;AAEM,IAAM,gBAAgC,uBAAO,CAAC,SAAc;AArBnE;AAsBE,QAAI,wCAAM,aAAN,mBAAgB,UAAhB,mBAAuB,kBAAiB,OAAO;AACjD,SAAK,SAAQ,wCAAM,aAAN,mBAAgB,UAAhB,mBAAuB,MAAM;AAC1C,SAAK,gBAAe,wCAAM,aAAN,mBAAgB,UAAhB,mBAAuB,MAAM;AACjD,WAAO,kCAAM,aAAN,mBAAgB,UAAvB,wBAA8B;AAAA,EAChC;AAEA,QAAI,kCAAM,aAAN,mBAAgB,kBAAiB,OAAO;AAC1C,SAAK,SAAQ,kCAAM,aAAN,mBAAgB,MAAM;AACnC,SAAK,gBAAe,kCAAM,aAAN,mBAAgB,MAAM;AAC1C,UAAO,6BAAM,aAAb,wBAAuB;AAAA,EACzB;AAEA,SAAO;AACT,CAAC;AAEM,IAAM,yBAAyC,uBAAO,UAAQ;AACnE,MAAI,CAAC,KAAK,SAAS;AACjB,SAAK,UAAU,qBAAqB;AAAA,EACtC;AACA,SAAO;AACT,CAAC;AAEM,IAAM,mBAAmC,uBAAO,UAAQ;AAC7D,QAAM,EAAC,MAAM,OAAO,GAAG,MAAK,IAAI;AAChC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,MACJ,MAAM,QAAQ;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AACF,CAAC;;;AGrDD,uBAAiB;;;ACAV,SAAS,KAAK,OAAM;AACzB,MAAI,UAAU,MAAK;AACjB,WAAO;AAAA,EACT,WAAW,UAAU,QAAU;AAC7B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,KAAK,GAAE;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,aAAa,OAAO,UAAU,SAAS,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AAEpE,SAAO,eAAe,kBAAkB,YAAY;AACtD;;;ACTO,SAAS,QAAQ,OAAM;AAC5B,QAAM,YAAY,KAAK,KAAK;AAC5B,MAAI,CAAE,aAAa,OAAO,UAAU,MAAO,EAAE,SAAS,SAAS;AAC7D,WAAO;AACT,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,cAAc,UAAS;AACzB,WAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AAAA,EACvC;AAEA,MAAI,cAAc,SAAQ;AACxB,WAAO,MAAM,WAAW;AAAA,EAC1B;AAEA,SAAO;AACT;;;AFdO,SAAS,gBAAgBC,WAAuB;AACrD,QAAM,EAAC,OAAO,GAAG,KAAI,IAAIA;AACzB,MAAI,QAAQ,IAAI,GAAG;AACjB,QAAI,OAAO,UAAU,YAAa,QAAO;AACzC,WAAO,iBAAAC,QAAK,QAAQ,OAAO,EAAC,QAAQ,KAAI,CAAC;AAAA,EAC3C;AACA,SAAO,GAAG,iBAAAA,QAAK,QAAQ,OAAO,EAAC,QAAQ,KAAI,CAAC,CAAC,IAAI,iBAAAA,QAAK,QAAQ,MAAM,EAAC,QAAQ,KAAI,CAAC,CAAC;AACrF;;;AGVO,SAAS,YAAY,OAAuB;AACjD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,QAAM,YAAY,MAAM,CAAC;AACzB,QAAM,aAAa,MAAM,MAAM,CAAC;AAGhC,QAAM,MAAM;AACZ,QAAM,QAAQ;AACd,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM,OAAO;AAEb,QAAM,sBAAsB,WAAW,IAAI,UAAQ;AACjD,QAAI,CAAC,KAAK,KAAK,EAAG,QAAO;AAIzB,UAAM,SAAS,KAAK,MAAM,oCAAoC;AAC9D,QAAI,QAAQ;AACV,YAAM,CAAC,EAAE,SAAS,UAAU,WAAW,UAAU,UAAU,IAAI;AAC/D,YAAM,YAAY,SAAS,MAAM,oBAAoB;AACrD,UAAI,WAAW;AACb,cAAM,CAAC,EAAE,MAAM,SAAS,MAAM,IAAI;AAClC,eAAO,GAAG,IAAI,KAAK,OAAO,GAAG,KAAK,GAAG,GAAG,GAAG,QAAQ,GAAG,KAAK,IAAI,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,MAAM,GAAG,OAAO,IAAI,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK;AAAA,MAChK;AAAA,IACF;AAGA,UAAM,SAAS,KAAK,MAAM,gCAAgC;AAC1D,QAAI,QAAQ;AACV,YAAM,CAAC,EAAE,SAAS,MAAM,SAAS,MAAM,IAAI;AAC3C,aAAO,GAAG,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,MAAM,GAAG,OAAO,IAAI,MAAM,GAAG,KAAK;AAAA,IACvF;AAGA,WAAO,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK;AAAA,EACxC,CAAC;AAED,SAAO;AAAA,EAAK,SAAS;AAAA,EAAK,oBAAoB,OAAO,OAAO,EAAE,KAAK,IAAI,CAAC;AAC1E;;;ACzCA,IAAAC,kBAA8B;AAGvB,IAAM,6BAA6C,wBAAO,UAAQ;AACvE,QAAM,eAAe,qBAAqB;AAC1C,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,cAAmB;AAAA,IACvB,gBAAgB,aAAa;AAAA,IAC7B,WAAW,aAAa;AAAA,EAC1B;AAGA,UAAQ,aAAa,gBAAgB;AAAA,IACnC,KAAK;AACH,kBAAY,UAAU,aAAa;AACnC;AAAA,IACF,KAAK;AACH,kBAAY,YAAY,aAAa;AACrC,kBAAY,WAAW,aAAa;AACpC;AAAA,IACF,KAAK;AACH,UAAI,aAAa,cAAc;AAC7B,oBAAY,eAAe,aAAa;AAAA,MAC1C;AACA;AAAA,IACF,KAAK;AACH,UAAI,aAAa,WAAW;AAC1B,oBAAY,YAAY,aAAa;AAAA,MACvC;AACA,UAAI,aAAa,mBAAmB;AAClC,oBAAY,oBAAoB,aAAa;AAAA,MAC/C;AACA;AAAA,IACF,KAAK;AACH,kBAAY,mBAAmB,aAAa;AAC5C;AAAA,IACF,KAAK;AACH,kBAAY,WAAW,aAAa;AACpC;AAAA,EACJ;AAGA,MAAI,aAAa,UAAU,OAAO,aAAa,WAAW,UAAU;AAClE,UAAM,SAAS,aAAa;AAC5B,QAAI,OAAO,QAAQ;AACjB,kBAAY,SAAS,OAAO;AAAA,IAC9B,WAAW,OAAO,KAAK;AACrB,kBAAY,SAAS,OAAO;AAAA,IAC9B,WAAW,OAAO,IAAI;AACpB,kBAAY,SAAS,OAAO;AAAA,IAC9B;AAAA,EACF;AAEA,OAAK,eAAe;AAEpB,SAAO;AACT,CAAC;;;ARnDD,IAAM,EAAC,UAAU,WAAW,MAAM,UAAU,SAAS,OAAM,IAAI;AAExD,IAAM,oBAAyB;AAAA,EACpC,SAAS;AAAA,EACT,SAAS,EAAC,YAAY,CAAC,YAAY,SAAS,WAAW,OAAO,EAAC,CAAC;AAAA,EAChE,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO,CAAC,SAAc;AACpB,UAAM,OAAO,IAAI,KAAK,KAAK,SAAS;AACpC,UAAM,YAAY,GAAG,KAAK,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAClK,UAAM,gBAAgB,KAAK,WAAW,IAAI,KAAK,QAAQ,MAAM;AAC7D,UAAM,QAAQ,KAAK,QAAQ,YAAY,KAAK,KAAK,IAAI;AACrD,UAAM,QAAQ,gBAAgB,KAAK,QAAQ;AAC3C,UAAM,UAAU,KAAK,WACjB,GAAG,OAAO,KAAK,QAAQ,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI,OAAO,KAAK,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,KAChF;AACJ,UAAM,UAAU,CAAC,KAAK,SAAS,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK;AACvE,UAAM,eAAe,UAAU,IAAI,OAAO,MAAM;AAChD,WAAO;AAAA,MACL,IAAI,KAAK,KAAK;AAAA,MACd,IAAI,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,EACb,CAAC;AACH;AAEO,IAAM,uBAAuB,IAAI,2BAAW,QAAQ;AAAA,EACzD,kBAAkB;AAAA,EAClB,QAAQ;AACV,CAAC;AAEM,IAAM,oBAAyB;AAAA,EACpC,SAAS,EAAC,YAAY,CAAC,YAAY,SAAS,SAAS,EAAC,CAAC;AAAA,EACvD,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AACP;AAEO,IAAM,uBAAuB,IAAI,2BAAW,QAAQ;AAAA,EACzD,kBAAkB;AAAA,EAClB,QAAQ;AACV,CAAC;;;ASzDD,IAAAC,kBAA2E;;;ACApE,IAAM,cAAc,MAAM;AAC/B,MAAI;AACF,UAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,UAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,UAAM,WAAW,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AACpD,WAAO,gBAAgB,QAAQ;AAAA,EACjC,QAAQ;AACN;AAAA,EACF;AACF;AAEO,IAAM,kBAAkB,CAAC,SAAiB;AAC/C,SAAO,KAAK,QAAQ,GAAG,QAAQ,IAAI,CAAC,KAAK,EAAE;AAC3C,MAAI,KAAK,SAAS,kBAAkB,GAAG;AACrC,WAAO,KAAK,QAAQ,4BAA4B,YAAY;AAAA,EAC9D;AAEA,MAAI,KAAK,SAAS,yBAAyB,GAAG;AAC5C,UAAM,QAAQ,KAAK,MAAM,yBAAyB,EAAE,CAAC;AACrD,UAAM,kBAAkB,MAAM,MAAM,GAAG,EAAE,CAAC;AAC1C,WAAO,aAAa,eAAe;AAAA,EACrC;AAEA,MAAI,KAAK,SAAS,cAAc,GAAG;AACjC,WAAO,KAAK,QAAQ,uBAAuB,EAAE;AAAA,EAC/C;AACA,MAAI,KAAK,SAAS,kBAAkB,GAAG;AACrC,WAAO,aAAa,KAAK,MAAM,kBAAkB,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EACrE;AACA,MAAI,KAAK,SAAS,iBAAiB,GAAG;AACpC,UAAM,QAAQ,KAAK,MAAM,gBAAgB,EAAE,CAAC;AAC5C,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WAAO,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAAA,EAChC;AACA,MAAI,KAAK,SAAS,gBAAgB,GAAG;AACnC,UAAM,QAAQ,KAAK,MAAM,gBAAgB,EAAE,CAAC;AAC5C,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,WAAO,GAAG,MAAM,CAAC,CAAC;AAAA,EACpB;AACA,SAAO;AACT;;;ADnCA,IAAMC,cAAkC;AAAA,EACtC,QAAQ,IAAI,aAAa,gBAAgB,QAAQ,IAAI,aAAa,QAAQ,IAAI,iBAC1E,uBACA;AACN;AAEO,IAAM,oBAAgB,gBAAAC,cAAoB;AAAA,EAC/C,QAAQ,uBAAO,IAAI;AAAA,EACnB,kBAAkB;AAAA,EAClB,QAAQ,uBAAO,OAAO,EAAC,OAAO,KAAI,CAAC;AAAA,EACnC,YAAYD;AACd,CAAC;AAEM,IAAM,kBAAkB,CAAC,YAAmC;AACjE,SAAO,cAAc,UAAU,OAAO;AACxC;AAEO,IAAM,cAAc,CAAC,UAAkB;AAC5C,gBAAc,QAAQ;AACxB;AAEO,IAAM,eAAe,CAAC,cAAiC;AAC5D,SAAO,cAAc,IAAI,SAAS;AACpC;AAEO,IAAM,YAAY,CAAC,YAAoB;AAC5C,SAAO,cAAc,MAAM,EAAC,QAAO,CAAC;AACtC;AAEA,IAAM,eAAe,CAACE,YAAwC;AAC5D,SAAO;AAAA,IACL,OAAO,CAAC,SAAiB,UAAe;AACtC,YAAM,WAAW,YAAY;AAC7B,aAAOA,QAAO,MAAM,EAAC,SAAS,UAAU,MAAK,CAAC;AAAA,IAChD;AAAA,IACA,MAAM,CAAC,SAAiB,UAAe;AACrC,YAAM,WAAW,YAAY;AAC7B,aAAOA,QAAO,KAAK,EAAC,SAAS,UAAU,MAAK,CAAC;AAAA,IAC/C;AAAA,IACA,MAAM,CAAC,SAAiB,UAAe;AACrC,YAAM,WAAW,YAAY;AAC7B,aAAOA,QAAO,KAAK,EAAC,SAAS,UAAU,MAAK,CAAC;AAAA,IAC/C;AAAA,IACA,OAAO,CAAC,SAAiB,UAAe;AACtC,YAAM,WAAW,YAAY;AAC7B,aAAOA,QAAO,MAAM,EAAC,SAAS,UAAU,MAAK,CAAC;AAAA,IAChD;AAAA,IACA,YAAY,CAACC,YAA0B;AACrC,UAAIA,QAAO,IAAI;AACb,cAAM,QAAQ,OAAOA,QAAO,EAAE,EAAE,MAAM,eAAe;AACrD,cAAM,WAAW,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC;AACtD,eAAO,aAAaD,QAAO,MAAM,EAAC,SAAQ,CAAC,CAAC;AAAA,MAC9C;AACA,aAAO,aAAaA,QAAO,MAAM,CAAC,CAAC,CAAC;AAAA,IACtC;AAAA,IACA,aAAa,CAACE,cAAkB;AAC9B,aAAO,aAAaF,QAAO,MAAME,SAAQ,CAAC;AAAA,IAC5C;AAAA,EACF;AACF;AAEO,IAAM,SAAS,aAAa,aAAa;","names":["winston","import_winston","import_winston","opentelemetry","metadata","util","import_winston","import_winston","transports","winstonCreateLogger","logger","module","metadata"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import winston, { transports } from 'winston';
|
|
1
|
+
import winston, { transports, Logform } from 'winston';
|
|
2
2
|
export { default as winston } from 'winston';
|
|
3
3
|
|
|
4
|
-
declare const sentryFormat: any;
|
|
5
4
|
declare const textConsoleFormat: any;
|
|
6
5
|
declare const textConsoleTransport: transports.ConsoleTransportInstance;
|
|
7
6
|
declare const jsonConsoleFormat: any;
|
|
8
7
|
declare const jsonConsoleTransport: transports.ConsoleTransportInstance;
|
|
9
8
|
|
|
9
|
+
declare const sentryFormat: Logform.FormatWrap;
|
|
10
|
+
|
|
10
11
|
type LogFunction = (message: string, metadata?: any) => void;
|
|
11
12
|
interface OrionLogger {
|
|
12
13
|
debug: LogFunction;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import winston, { transports } from 'winston';
|
|
1
|
+
import winston, { transports, Logform } from 'winston';
|
|
2
2
|
export { default as winston } from 'winston';
|
|
3
3
|
|
|
4
|
-
declare const sentryFormat: any;
|
|
5
4
|
declare const textConsoleFormat: any;
|
|
6
5
|
declare const textConsoleTransport: transports.ConsoleTransportInstance;
|
|
7
6
|
declare const jsonConsoleFormat: any;
|
|
8
7
|
declare const jsonConsoleTransport: transports.ConsoleTransportInstance;
|
|
9
8
|
|
|
9
|
+
declare const sentryFormat: Logform.FormatWrap;
|
|
10
|
+
|
|
10
11
|
type LogFunction = (message: string, metadata?: any) => void;
|
|
11
12
|
interface OrionLogger {
|
|
12
13
|
debug: LogFunction;
|
package/dist/index.js
CHANGED
|
@@ -1,41 +1,62 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import winston2 from "winston";
|
|
3
3
|
|
|
4
|
-
// src/formats.ts
|
|
5
|
-
import { format, transports } from "winston";
|
|
6
|
-
import util from "util";
|
|
4
|
+
// src/formats/consoleFormats.ts
|
|
5
|
+
import { format as format3, transports } from "winston";
|
|
7
6
|
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return "Null";
|
|
12
|
-
} else if (input === void 0) {
|
|
13
|
-
return "Undefined";
|
|
14
|
-
} else if (Number.isNaN(input)) {
|
|
15
|
-
return "NaN";
|
|
16
|
-
}
|
|
17
|
-
const typeResult = Object.prototype.toString.call(input).slice(8, -1);
|
|
18
|
-
return typeResult === "AsyncFunction" ? "Promise" : typeResult;
|
|
19
|
-
}
|
|
7
|
+
// src/formats/winstonFormats.ts
|
|
8
|
+
import { format } from "winston";
|
|
9
|
+
import opentelemetry from "@opentelemetry/api";
|
|
20
10
|
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
11
|
+
// src/asyncContext.ts
|
|
12
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
13
|
+
import { randomUUID } from "crypto";
|
|
14
|
+
var storage = new AsyncLocalStorage();
|
|
15
|
+
async function runWithOrionAsyncContext(context, callback) {
|
|
16
|
+
const contextWithId = {
|
|
17
|
+
contextId: randomUUID(),
|
|
18
|
+
...context
|
|
19
|
+
};
|
|
20
|
+
return await storage.run(contextWithId, async () => {
|
|
21
|
+
return await callback();
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
var getOrionAsyncContext = () => {
|
|
25
|
+
return storage.getStore();
|
|
26
|
+
};
|
|
27
|
+
var updateOrionAsyncContext = (context) => {
|
|
28
|
+
const currentContext = storage.getStore();
|
|
29
|
+
if (!currentContext) {
|
|
30
|
+
return void 0;
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
Object.assign(currentContext, context);
|
|
33
|
+
return currentContext;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// src/formats/getAsyncContextLabel.ts
|
|
37
|
+
function getAsyncContextLabel() {
|
|
38
|
+
const asyncContext = getOrionAsyncContext();
|
|
39
|
+
if (!asyncContext) return "";
|
|
40
|
+
const { controllerType } = asyncContext;
|
|
41
|
+
switch (controllerType) {
|
|
42
|
+
case "job":
|
|
43
|
+
return `${controllerType}:${asyncContext.jobName}`;
|
|
44
|
+
case "route":
|
|
45
|
+
return `${controllerType}:${asyncContext.pathname}`;
|
|
46
|
+
case "resolver":
|
|
47
|
+
return asyncContext.resolverName ? `${controllerType}:${asyncContext.resolverName}` : controllerType;
|
|
48
|
+
case "modelResolver":
|
|
49
|
+
return asyncContext.modelResolverName ? `${controllerType}:${asyncContext.modelName}:${asyncContext.modelResolverName}` : controllerType;
|
|
50
|
+
case "subscription":
|
|
51
|
+
return `${controllerType}:${asyncContext.subscriptionName}`;
|
|
52
|
+
case "echo":
|
|
53
|
+
return `${controllerType}:${asyncContext.echoName}`;
|
|
54
|
+
default:
|
|
55
|
+
return controllerType;
|
|
32
56
|
}
|
|
33
|
-
return false;
|
|
34
57
|
}
|
|
35
58
|
|
|
36
|
-
// src/formats.ts
|
|
37
|
-
import opentelemetry from "@opentelemetry/api";
|
|
38
|
-
var { metadata, timestamp, json, colorize, combine, printf } = format;
|
|
59
|
+
// src/formats/winstonFormats.ts
|
|
39
60
|
var opentelemetryContext = format((info) => {
|
|
40
61
|
const activeSpan = opentelemetry.trace.getActiveSpan();
|
|
41
62
|
if (activeSpan) {
|
|
@@ -66,6 +87,12 @@ var metaError = format((info) => {
|
|
|
66
87
|
}
|
|
67
88
|
return info;
|
|
68
89
|
});
|
|
90
|
+
var asyncContextFormat = format((info) => {
|
|
91
|
+
if (!info.context) {
|
|
92
|
+
info.context = getAsyncContextLabel();
|
|
93
|
+
}
|
|
94
|
+
return info;
|
|
95
|
+
});
|
|
69
96
|
var sentryFormat = format((info) => {
|
|
70
97
|
const { path, label, ...extra } = info;
|
|
71
98
|
return {
|
|
@@ -76,26 +103,147 @@ var sentryFormat = format((info) => {
|
|
|
76
103
|
}
|
|
77
104
|
};
|
|
78
105
|
});
|
|
106
|
+
|
|
107
|
+
// src/formats/getMetadataText.ts
|
|
108
|
+
import util from "util";
|
|
109
|
+
|
|
110
|
+
// ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js
|
|
111
|
+
function type(input) {
|
|
112
|
+
if (input === null) {
|
|
113
|
+
return "Null";
|
|
114
|
+
} else if (input === void 0) {
|
|
115
|
+
return "Undefined";
|
|
116
|
+
} else if (Number.isNaN(input)) {
|
|
117
|
+
return "NaN";
|
|
118
|
+
}
|
|
119
|
+
const typeResult = Object.prototype.toString.call(input).slice(8, -1);
|
|
120
|
+
return typeResult === "AsyncFunction" ? "Promise" : typeResult;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js
|
|
124
|
+
function isEmpty(input) {
|
|
125
|
+
const inputType = type(input);
|
|
126
|
+
if (["Undefined", "NaN", "Number", "Null"].includes(inputType))
|
|
127
|
+
return false;
|
|
128
|
+
if (!input) return true;
|
|
129
|
+
if (inputType === "Object") {
|
|
130
|
+
return Object.keys(input).length === 0;
|
|
131
|
+
}
|
|
132
|
+
if (inputType === "Array") {
|
|
133
|
+
return input.length === 0;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// src/formats/getMetadataText.ts
|
|
79
139
|
function getMetadataText(metadata2) {
|
|
80
140
|
const { value, ...rest } = metadata2;
|
|
81
141
|
if (isEmpty(rest)) {
|
|
82
142
|
if (typeof value === "undefined") return "";
|
|
83
|
-
return util.inspect(value);
|
|
143
|
+
return util.inspect(value, { colors: true });
|
|
84
144
|
}
|
|
85
|
-
return `${util.inspect(value)} ${util.inspect(rest)}`;
|
|
145
|
+
return `${util.inspect(value, { colors: true })} ${util.inspect(rest, { colors: true })}`;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/formats/formatStack.ts
|
|
149
|
+
function formatStack(stack) {
|
|
150
|
+
if (!stack) return "";
|
|
151
|
+
const lines = stack.split("\n");
|
|
152
|
+
const errorLine = lines[0];
|
|
153
|
+
const stackLines = lines.slice(1);
|
|
154
|
+
const dim = "\x1B[2m";
|
|
155
|
+
const reset = "\x1B[0m";
|
|
156
|
+
const cyan = "\x1B[36m";
|
|
157
|
+
const yellow = "\x1B[33m";
|
|
158
|
+
const gray = "\x1B[90m";
|
|
159
|
+
const formattedStackLines = stackLines.map((line) => {
|
|
160
|
+
if (!line.trim()) return "";
|
|
161
|
+
const match1 = line.match(/^(\s+at\s+)(.+?)(\s+\()([^)]+)(\))/);
|
|
162
|
+
if (match1) {
|
|
163
|
+
const [, atSpace, funcName, openParen, filePath, closeParen] = match1;
|
|
164
|
+
const fileMatch = filePath.match(/^(.*):(\d+):(\d+)$/);
|
|
165
|
+
if (fileMatch) {
|
|
166
|
+
const [, file, lineNum, colNum] = fileMatch;
|
|
167
|
+
return `${gray} ${atSpace}${reset}${dim}${funcName}${reset} ${gray}${openParen}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${gray}${closeParen}${reset}`;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const match2 = line.match(/^(\s+at\s+)([^(]+):(\d+):(\d+)/);
|
|
171
|
+
if (match2) {
|
|
172
|
+
const [, atSpace, file, lineNum, colNum] = match2;
|
|
173
|
+
return `${gray} ${atSpace}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${reset}`;
|
|
174
|
+
}
|
|
175
|
+
return `${gray} ${line.trim()}${reset}`;
|
|
176
|
+
});
|
|
177
|
+
return `
|
|
178
|
+
${errorLine}
|
|
179
|
+
${formattedStackLines.filter(Boolean).join("\n")}`;
|
|
86
180
|
}
|
|
181
|
+
|
|
182
|
+
// src/formats/enrichWithAsyncContext.ts
|
|
183
|
+
import { format as format2 } from "winston";
|
|
184
|
+
var enrichWithAsyncContext = format2((info) => {
|
|
185
|
+
const asyncContext = getOrionAsyncContext();
|
|
186
|
+
if (!asyncContext) return info;
|
|
187
|
+
const contextData = {
|
|
188
|
+
controllerType: asyncContext.controllerType,
|
|
189
|
+
contextId: asyncContext.contextId
|
|
190
|
+
};
|
|
191
|
+
switch (asyncContext.controllerType) {
|
|
192
|
+
case "job":
|
|
193
|
+
contextData.jobName = asyncContext.jobName;
|
|
194
|
+
break;
|
|
195
|
+
case "route":
|
|
196
|
+
contextData.routeName = asyncContext.routeName;
|
|
197
|
+
contextData.pathname = asyncContext.pathname;
|
|
198
|
+
break;
|
|
199
|
+
case "resolver":
|
|
200
|
+
if (asyncContext.resolverName) {
|
|
201
|
+
contextData.resolverName = asyncContext.resolverName;
|
|
202
|
+
}
|
|
203
|
+
break;
|
|
204
|
+
case "modelResolver":
|
|
205
|
+
if (asyncContext.modelName) {
|
|
206
|
+
contextData.modelName = asyncContext.modelName;
|
|
207
|
+
}
|
|
208
|
+
if (asyncContext.modelResolverName) {
|
|
209
|
+
contextData.modelResolverName = asyncContext.modelResolverName;
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
case "subscription":
|
|
213
|
+
contextData.subscriptionName = asyncContext.subscriptionName;
|
|
214
|
+
break;
|
|
215
|
+
case "echo":
|
|
216
|
+
contextData.echoName = asyncContext.echoName;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
if (asyncContext.viewer && typeof asyncContext.viewer === "object") {
|
|
220
|
+
const viewer = asyncContext.viewer;
|
|
221
|
+
if (viewer.userId) {
|
|
222
|
+
contextData.userId = viewer.userId;
|
|
223
|
+
} else if (viewer._id) {
|
|
224
|
+
contextData.userId = viewer._id;
|
|
225
|
+
} else if (viewer.id) {
|
|
226
|
+
contextData.userId = viewer.id;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
info.asyncContext = contextData;
|
|
230
|
+
return info;
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// src/formats/consoleFormats.ts
|
|
234
|
+
var { metadata, timestamp, json, colorize, combine, printf } = format3;
|
|
87
235
|
var textConsoleFormat = combine(
|
|
88
236
|
colorize(),
|
|
89
237
|
metadata({ fillExcept: ["fileName", "level", "message", "stack"] }),
|
|
90
238
|
opentelemetryContext(),
|
|
239
|
+
asyncContextFormat(),
|
|
91
240
|
metaError(),
|
|
92
241
|
timestamp(),
|
|
93
242
|
printf((info) => {
|
|
94
243
|
const date = new Date(info.timestamp);
|
|
95
244
|
const timeLabel = `${date.getHours().toString().padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}:${date.getSeconds().toString().padStart(2, "0")}`;
|
|
96
245
|
const fileNameLabel = info.fileName ? `[${info.fileName}]` : "";
|
|
97
|
-
const stack = info.stack ?
|
|
98
|
-
${info.stack}` : "";
|
|
246
|
+
const stack = info.stack ? formatStack(info.stack) : "";
|
|
99
247
|
const value = getMetadataText(info.metadata);
|
|
100
248
|
const traceId = info.trace_id ? `${String(info.trace_id).substring(0, 8)}@${String(info.span_id).substring(0, 8)}` : "";
|
|
101
249
|
const context = [info.context, traceId].filter(Boolean).join(" ").trim();
|
|
@@ -118,6 +266,7 @@ var textConsoleTransport = new transports.Console({
|
|
|
118
266
|
var jsonConsoleFormat = combine(
|
|
119
267
|
metadata({ fillExcept: ["fileName", "level", "message"] }),
|
|
120
268
|
opentelemetryContext(),
|
|
269
|
+
enrichWithAsyncContext(),
|
|
121
270
|
metaError(),
|
|
122
271
|
timestamp(),
|
|
123
272
|
json()
|
|
@@ -128,7 +277,7 @@ var jsonConsoleTransport = new transports.Console({
|
|
|
128
277
|
});
|
|
129
278
|
|
|
130
279
|
// src/logger.ts
|
|
131
|
-
import { createLogger as winstonCreateLogger, config, format as
|
|
280
|
+
import { createLogger as winstonCreateLogger, config, format as format4 } from "winston";
|
|
132
281
|
|
|
133
282
|
// src/helpers/getFileName.ts
|
|
134
283
|
var getFileName = () => {
|
|
@@ -177,7 +326,7 @@ var transports2 = [
|
|
|
177
326
|
var winstonLogger = winstonCreateLogger({
|
|
178
327
|
levels: config.npm.levels,
|
|
179
328
|
handleExceptions: true,
|
|
180
|
-
format:
|
|
329
|
+
format: format4.errors({ stack: true }),
|
|
181
330
|
transports: transports2
|
|
182
331
|
});
|
|
183
332
|
var configureLogger = (options) => {
|
|
@@ -224,31 +373,6 @@ var createLogger = (logger2) => {
|
|
|
224
373
|
};
|
|
225
374
|
};
|
|
226
375
|
var logger = createLogger(winstonLogger);
|
|
227
|
-
|
|
228
|
-
// src/asyncContext.ts
|
|
229
|
-
import { AsyncLocalStorage } from "async_hooks";
|
|
230
|
-
import { randomUUID } from "crypto";
|
|
231
|
-
var storage = new AsyncLocalStorage();
|
|
232
|
-
async function runWithOrionAsyncContext(context, callback) {
|
|
233
|
-
const contextWithId = {
|
|
234
|
-
contextId: randomUUID(),
|
|
235
|
-
...context
|
|
236
|
-
};
|
|
237
|
-
return await storage.run(contextWithId, async () => {
|
|
238
|
-
return await callback();
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
var getOrionAsyncContext = () => {
|
|
242
|
-
return storage.getStore();
|
|
243
|
-
};
|
|
244
|
-
var updateOrionAsyncContext = (context) => {
|
|
245
|
-
const currentContext = storage.getStore();
|
|
246
|
-
if (!currentContext) {
|
|
247
|
-
return void 0;
|
|
248
|
-
}
|
|
249
|
-
Object.assign(currentContext, context);
|
|
250
|
-
return currentContext;
|
|
251
|
-
};
|
|
252
376
|
export {
|
|
253
377
|
addTransport,
|
|
254
378
|
configureLogger,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/formats.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js","../src/logger.ts","../src/helpers/getFileName.ts","../src/asyncContext.ts"],"sourcesContent":["import winston from 'winston'\n\nexport * from './formats'\nexport * from './logger'\nexport * from './types'\nexport * from './asyncContext'\n\nexport {winston}\n","import {format, transports} from 'winston'\nimport util from 'node:util'\nimport {isEmpty} from 'rambdax'\nimport opentelemetry, {Span} from '@opentelemetry/api'\n\nconst {metadata, timestamp, json, colorize, combine, printf} = format\n\nconst opentelemetryContext = format(info => {\n const activeSpan: Span & {name?: string} = opentelemetry.trace.getActiveSpan()\n if (activeSpan) {\n const spanContex = activeSpan.spanContext()\n if (activeSpan.name && !info.context) {\n info.context = activeSpan.name\n }\n const fields = {\n trace_id: spanContex.traceId,\n span_id: spanContex.spanId,\n trace_flags: `0${spanContex.traceFlags.toString(16)}`,\n }\n Object.assign(info, fields)\n }\n return info\n})\n\nconst metaError = format((info: any) => {\n if (info?.metadata?.value?.error instanceof Error) {\n info.stack = info?.metadata?.value?.error.stack\n info.errorMessage = info?.metadata?.value?.error.message\n delete info?.metadata?.value?.error\n }\n\n if (info?.metadata?.value instanceof Error) {\n info.stack = info?.metadata?.value.stack\n info.errorMessage = info?.metadata?.value.message\n delete info?.metadata?.value\n }\n\n return info\n})\n\nexport const sentryFormat: any = format(info => {\n const {path, label, ...extra} = info\n return {\n ...extra,\n tags: {\n path: path || '',\n request_id: label,\n },\n }\n})\n\nfunction getMetadataText(metadata: any) {\n const {value, ...rest} = metadata\n if (isEmpty(rest)) {\n if (typeof value === 'undefined') return ''\n return util.inspect(value)\n }\n return `${util.inspect(value)} ${util.inspect(rest)}`\n}\n\nexport const textConsoleFormat: any = combine(\n colorize(),\n metadata({fillExcept: ['fileName', 'level', 'message', 'stack']}),\n opentelemetryContext(),\n metaError(),\n timestamp(),\n printf((info: any) => {\n // console.log(info)\n\n const date = new Date(info.timestamp)\n const timeLabel = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`\n const fileNameLabel = info.fileName ? `[${info.fileName}]` : ''\n const stack = info.stack ? `\\n${info.stack}` : ''\n const value = getMetadataText(info.metadata)\n const traceId = info.trace_id\n ? `${String(info.trace_id).substring(0, 8)}@${String(info.span_id).substring(0, 8)}`\n : ''\n const context = [info.context, traceId].filter(Boolean).join(' ').trim()\n const contextLabel = context ? `[${context}]` : ''\n return [\n `[${info.level}]`,\n `[${timeLabel}]`,\n contextLabel,\n fileNameLabel,\n info.message,\n value,\n stack,\n ]\n .filter(Boolean)\n .join(' ')\n }),\n)\n\nexport const textConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: textConsoleFormat,\n})\n\nexport const jsonConsoleFormat: any = combine(\n metadata({fillExcept: ['fileName', 'level', 'message']}),\n opentelemetryContext(),\n metaError(),\n timestamp(),\n json(),\n)\n\nexport const jsonConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: jsonConsoleFormat,\n})\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","import { type } from './type.js'\n\nexport function isEmpty(input){\n const inputType = type(input)\n if ([ 'Undefined', 'NaN', 'Number', 'Null' ].includes(inputType))\n return false\n if (!input) return true\n\n if (inputType === 'Object'){\n return Object.keys(input).length === 0\n }\n\n if (inputType === 'Array'){\n return input.length === 0\n }\n\n return false\n}\n","import winston, {createLogger as winstonCreateLogger, config, format} from 'winston'\nimport {jsonConsoleTransport, textConsoleTransport} from './formats'\nimport {getFileName} from './helpers/getFileName'\nimport {OrionLogger} from './types'\n\nconst transports: winston.transport[] = [\n process.env.NODE_ENV !== 'production' || process.env.ORION_DEV || process.env.JEST_WORKER_ID\n ? textConsoleTransport\n : jsonConsoleTransport,\n]\n\nexport const winstonLogger = winstonCreateLogger({\n levels: config.npm.levels,\n handleExceptions: true,\n format: format.errors({stack: true}),\n transports: transports,\n})\n\nexport const configureLogger = (options: winston.LoggerOptions) => {\n return winstonLogger.configure(options)\n}\n\nexport const setLogLevel = (level: string) => {\n winstonLogger.level = level\n}\n\nexport const addTransport = (transport: winston.transport) => {\n return winstonLogger.add(transport)\n}\n\nexport const getLogger = (context: string) => {\n return winstonLogger.child({context})\n}\n\nconst createLogger = (logger: winston.Logger): OrionLogger => {\n return {\n debug: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.debug({message, fileName, value})\n },\n info: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.info({message, fileName, value})\n },\n warn: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.warn({message, fileName, value})\n },\n error: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.error({message, fileName, value})\n },\n addContext: (module: NodeJS.Module) => {\n if (module.id) {\n const split = String(module.id).split('.orion/build/')\n const fileName = split.length > 1 ? split[1] : split[0]\n return createLogger(logger.child({fileName}))\n }\n return createLogger(logger.child({}))\n },\n addMetadata: (metadata: any) => {\n return createLogger(logger.child(metadata))\n },\n }\n}\n\nexport const logger = createLogger(winstonLogger)\n","export const getFileName = () => {\n try {\n const stack = new Error().stack\n const lines = stack.split('\\n')\n const filePath = lines[3].split('(')[1].split(')')[0]\n return improveFileName(filePath)\n } catch {\n return\n }\n}\n\nexport const improveFileName = (path: string) => {\n path = path.replace(`${process.cwd()}/`, '')\n if (path.includes('orionjs/packages')) {\n return path.replace(/^.+\\/orionjs\\/packages\\//, '@orion-js/')\n }\n\n if (path.includes('node_modules/@orion-js/')) {\n const after = path.split('node_modules/@orion-js/')[1]\n const onlyPackageName = after.split('/')[0]\n return `@orion-js/${onlyPackageName}`\n }\n\n if (path.includes('.orion/build')) {\n return path.replace(/^.+\\.orion\\/build\\//, '')\n }\n if (path.includes('.pnpm/@orion-js+')) {\n return `@orion-js/${path.split('.pnpm/@orion-js+')[1].split('@')[0]}`\n }\n if (path.includes('/node_modules/@')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}/${parts[1]}`\n }\n if (path.includes('/node_modules/')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}`\n }\n return path\n}\n","import {AsyncLocalStorage} from 'node:async_hooks'\nimport {randomUUID} from 'node:crypto'\n\ninterface BaseOrionAsyncContext {\n contextId: string\n viewer?: unknown\n params?: unknown\n}\n\nexport interface JobAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'job'\n jobName: string\n}\n\nexport interface RouteAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'route'\n routeName: string\n pathname: string\n}\n\nexport interface ResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'resolver'\n resolverName?: string\n}\n\nexport interface ModelResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'modelResolver'\n modelName?: string\n modelResolverName?: string\n parentData?: unknown\n}\n\nexport interface SubscriptionAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'subscription'\n subscriptionName: string\n}\n\nexport interface EchoAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'echo'\n echoName: string\n}\n\nexport type OrionAsyncContext =\n | JobAsyncContext\n | RouteAsyncContext\n | ResolverAsyncContext\n | ModelResolverAsyncContext\n | SubscriptionAsyncContext\n | EchoAsyncContext\n\nconst storage: AsyncLocalStorage<OrionAsyncContext> = new AsyncLocalStorage()\n\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<JobAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<RouteAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ModelResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<SubscriptionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<EchoAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<OrionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn> {\n const contextWithId = {\n contextId: randomUUID(),\n ...context,\n } as OrionAsyncContext\n return await storage.run(contextWithId, async () => {\n return await callback()\n })\n}\n\nexport const getOrionAsyncContext = (): OrionAsyncContext | undefined => {\n return storage.getStore()\n}\n\nexport const updateOrionAsyncContext = (\n context: Partial<OrionAsyncContext>,\n): OrionAsyncContext | undefined => {\n const currentContext: OrionAsyncContext | undefined = storage.getStore()\n if (!currentContext) {\n return undefined\n }\n\n Object.assign(currentContext, context)\n return currentContext\n}\n"],"mappings":"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","names":["winston","metadata","format","transports","format","logger","metadata"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/formats/consoleFormats.ts","../src/formats/winstonFormats.ts","../src/asyncContext.ts","../src/formats/getAsyncContextLabel.ts","../src/formats/getMetadataText.ts","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/type.js","../../../node_modules/.pnpm/rambdax@11.3.1/node_modules/rambdax/src/isEmpty.js","../src/formats/formatStack.ts","../src/formats/enrichWithAsyncContext.ts","../src/logger.ts","../src/helpers/getFileName.ts"],"sourcesContent":["import winston from 'winston'\n\nexport * from './formats'\nexport * from './logger'\nexport * from './types'\nexport * from './asyncContext'\n\nexport {winston}\n","import {format, transports} from 'winston'\nimport {opentelemetryContext, metaError, asyncContextFormat} from './winstonFormats'\nimport {getMetadataText} from './getMetadataText'\nimport {formatStack} from './formatStack'\nimport {enrichWithAsyncContext} from './enrichWithAsyncContext'\n\nconst {metadata, timestamp, json, colorize, combine, printf} = format\n\nexport const textConsoleFormat: any = combine(\n colorize(),\n metadata({fillExcept: ['fileName', 'level', 'message', 'stack']}),\n opentelemetryContext(),\n asyncContextFormat(),\n metaError(),\n timestamp(),\n printf((info: any) => {\n const date = new Date(info.timestamp)\n const timeLabel = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`\n const fileNameLabel = info.fileName ? `[${info.fileName}]` : ''\n const stack = info.stack ? formatStack(info.stack) : ''\n const value = getMetadataText(info.metadata)\n const traceId = info.trace_id\n ? `${String(info.trace_id).substring(0, 8)}@${String(info.span_id).substring(0, 8)}`\n : ''\n const context = [info.context, traceId].filter(Boolean).join(' ').trim()\n const contextLabel = context ? `[${context}]` : ''\n return [\n `[${info.level}]`,\n `[${timeLabel}]`,\n contextLabel,\n fileNameLabel,\n info.message,\n value,\n stack,\n ]\n .filter(Boolean)\n .join(' ')\n }),\n)\n\nexport const textConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: textConsoleFormat,\n})\n\nexport const jsonConsoleFormat: any = combine(\n metadata({fillExcept: ['fileName', 'level', 'message']}),\n opentelemetryContext(),\n enrichWithAsyncContext(),\n metaError(),\n timestamp(),\n json(),\n)\n\nexport const jsonConsoleTransport = new transports.Console({\n handleExceptions: true,\n format: jsonConsoleFormat,\n})\n","import {format, Logform} from 'winston'\nimport opentelemetry, {Span} from '@opentelemetry/api'\nimport {getAsyncContextLabel} from './getAsyncContextLabel'\n\nexport const opentelemetryContext: Logform.FormatWrap = format(info => {\n const activeSpan: Span & {name?: string} = opentelemetry.trace.getActiveSpan()\n if (activeSpan) {\n const spanContex = activeSpan.spanContext()\n if (activeSpan.name && !info.context) {\n info.context = activeSpan.name\n }\n const fields = {\n trace_id: spanContex.traceId,\n span_id: spanContex.spanId,\n trace_flags: `0${spanContex.traceFlags.toString(16)}`,\n }\n Object.assign(info, fields)\n }\n return info\n})\n\nexport const metaError: Logform.FormatWrap = format((info: any) => {\n if (info?.metadata?.value?.error instanceof Error) {\n info.stack = info?.metadata?.value?.error.stack\n info.errorMessage = info?.metadata?.value?.error.message\n delete info?.metadata?.value?.error\n }\n\n if (info?.metadata?.value instanceof Error) {\n info.stack = info?.metadata?.value.stack\n info.errorMessage = info?.metadata?.value.message\n delete info?.metadata?.value\n }\n\n return info\n})\n\nexport const asyncContextFormat: Logform.FormatWrap = format(info => {\n if (!info.context) {\n info.context = getAsyncContextLabel()\n }\n return info\n})\n\nexport const sentryFormat: Logform.FormatWrap = format(info => {\n const {path, label, ...extra} = info\n return {\n ...extra,\n tags: {\n path: path || '',\n request_id: label,\n },\n }\n})\n","import {AsyncLocalStorage} from 'node:async_hooks'\nimport {randomUUID} from 'node:crypto'\n\ninterface BaseOrionAsyncContext {\n contextId: string\n viewer?: unknown\n params?: unknown\n}\n\nexport interface JobAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'job'\n jobName: string\n}\n\nexport interface RouteAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'route'\n routeName: string\n pathname: string\n}\n\nexport interface ResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'resolver'\n resolverName?: string\n}\n\nexport interface ModelResolverAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'modelResolver'\n modelName?: string\n modelResolverName?: string\n parentData?: unknown\n}\n\nexport interface SubscriptionAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'subscription'\n subscriptionName: string\n}\n\nexport interface EchoAsyncContext extends BaseOrionAsyncContext {\n controllerType: 'echo'\n echoName: string\n}\n\nexport type OrionAsyncContext =\n | JobAsyncContext\n | RouteAsyncContext\n | ResolverAsyncContext\n | ModelResolverAsyncContext\n | SubscriptionAsyncContext\n | EchoAsyncContext\n\nconst storage: AsyncLocalStorage<OrionAsyncContext> = new AsyncLocalStorage()\n\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<JobAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<RouteAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<ModelResolverAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<SubscriptionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<EchoAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn>\nexport async function runWithOrionAsyncContext<TReturn>(\n context: Omit<OrionAsyncContext, 'contextId'>,\n callback: () => Promise<TReturn> | TReturn,\n): Promise<TReturn> {\n const contextWithId = {\n contextId: randomUUID(),\n ...context,\n } as OrionAsyncContext\n return await storage.run(contextWithId, async () => {\n return await callback()\n })\n}\n\nexport const getOrionAsyncContext = (): OrionAsyncContext | undefined => {\n return storage.getStore()\n}\n\nexport const updateOrionAsyncContext = (\n context: Partial<OrionAsyncContext>,\n): OrionAsyncContext | undefined => {\n const currentContext: OrionAsyncContext | undefined = storage.getStore()\n if (!currentContext) {\n return undefined\n }\n\n Object.assign(currentContext, context)\n return currentContext\n}\n","import {getOrionAsyncContext} from '../asyncContext'\n\nexport function getAsyncContextLabel(): string {\n const asyncContext = getOrionAsyncContext()\n if (!asyncContext) return ''\n\n const {controllerType} = asyncContext\n\n switch (controllerType) {\n case 'job':\n return `${controllerType}:${asyncContext.jobName}`\n case 'route':\n return `${controllerType}:${asyncContext.pathname}`\n case 'resolver':\n return asyncContext.resolverName\n ? `${controllerType}:${asyncContext.resolverName}`\n : controllerType\n case 'modelResolver':\n return asyncContext.modelResolverName\n ? `${controllerType}:${asyncContext.modelName}:${asyncContext.modelResolverName}`\n : controllerType\n case 'subscription':\n return `${controllerType}:${asyncContext.subscriptionName}`\n case 'echo':\n return `${controllerType}:${asyncContext.echoName}`\n default:\n return controllerType\n }\n}\n","import util from 'node:util'\nimport {isEmpty} from 'rambdax'\n\nexport function getMetadataText(metadata: any): string {\n const {value, ...rest} = metadata\n if (isEmpty(rest)) {\n if (typeof value === 'undefined') return ''\n return util.inspect(value, {colors: true})\n }\n return `${util.inspect(value, {colors: true})} ${util.inspect(rest, {colors: true})}`\n}\n","export function type(input){\n if (input === null){\n return 'Null'\n } else if (input === undefined){\n return 'Undefined'\n } else if (Number.isNaN(input)){\n return 'NaN'\n }\n const typeResult = Object.prototype.toString.call(input).slice(8, -1)\n\n return typeResult === 'AsyncFunction' ? 'Promise' : typeResult\n}\n","import { type } from './type.js'\n\nexport function isEmpty(input){\n const inputType = type(input)\n if ([ 'Undefined', 'NaN', 'Number', 'Null' ].includes(inputType))\n return false\n if (!input) return true\n\n if (inputType === 'Object'){\n return Object.keys(input).length === 0\n }\n\n if (inputType === 'Array'){\n return input.length === 0\n }\n\n return false\n}\n","export function formatStack(stack: string): string {\n if (!stack) return ''\n\n const lines = stack.split('\\n')\n const errorLine = lines[0]\n const stackLines = lines.slice(1)\n\n // ANSI codes\n const dim = '\\x1b[2m'\n const reset = '\\x1b[0m'\n const cyan = '\\x1b[36m'\n const yellow = '\\x1b[33m'\n const gray = '\\x1b[90m'\n\n const formattedStackLines = stackLines.map(line => {\n if (!line.trim()) return ''\n\n // Match different stack trace formats\n // Format: at functionName (path/file.ts:line:col)\n const match1 = line.match(/^(\\s+at\\s+)(.+?)(\\s+\\()([^)]+)(\\))/)\n if (match1) {\n const [, atSpace, funcName, openParen, filePath, closeParen] = match1\n const fileMatch = filePath.match(/^(.*):(\\d+):(\\d+)$/)\n if (fileMatch) {\n const [, file, lineNum, colNum] = fileMatch\n return `${gray} ${atSpace}${reset}${dim}${funcName}${reset} ${gray}${openParen}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${gray}${closeParen}${reset}`\n }\n }\n\n // Format: at path/file.ts:line:col\n const match2 = line.match(/^(\\s+at\\s+)([^(]+):(\\d+):(\\d+)/)\n if (match2) {\n const [, atSpace, file, lineNum, colNum] = match2\n return `${gray} ${atSpace}${cyan}${file}${gray}:${yellow}${lineNum}:${colNum}${reset}`\n }\n\n // Default: just dim the whole line\n return `${gray} ${line.trim()}${reset}`\n })\n\n return `\\n${errorLine}\\n${formattedStackLines.filter(Boolean).join('\\n')}`\n}\n","import {format, Logform} from 'winston'\nimport {getOrionAsyncContext} from '../asyncContext'\n\nexport const enrichWithAsyncContext: Logform.FormatWrap = format(info => {\n const asyncContext = getOrionAsyncContext()\n if (!asyncContext) return info\n\n const contextData: any = {\n controllerType: asyncContext.controllerType,\n contextId: asyncContext.contextId,\n }\n\n // Add controller-specific fields\n switch (asyncContext.controllerType) {\n case 'job':\n contextData.jobName = asyncContext.jobName\n break\n case 'route':\n contextData.routeName = asyncContext.routeName\n contextData.pathname = asyncContext.pathname\n break\n case 'resolver':\n if (asyncContext.resolverName) {\n contextData.resolverName = asyncContext.resolverName\n }\n break\n case 'modelResolver':\n if (asyncContext.modelName) {\n contextData.modelName = asyncContext.modelName\n }\n if (asyncContext.modelResolverName) {\n contextData.modelResolverName = asyncContext.modelResolverName\n }\n break\n case 'subscription':\n contextData.subscriptionName = asyncContext.subscriptionName\n break\n case 'echo':\n contextData.echoName = asyncContext.echoName\n break\n }\n\n // Extract userId from viewer if available\n if (asyncContext.viewer && typeof asyncContext.viewer === 'object') {\n const viewer = asyncContext.viewer as any\n if (viewer.userId) {\n contextData.userId = viewer.userId\n } else if (viewer._id) {\n contextData.userId = viewer._id\n } else if (viewer.id) {\n contextData.userId = viewer.id\n }\n }\n\n info.asyncContext = contextData\n\n return info\n})\n","import winston, {createLogger as winstonCreateLogger, config, format} from 'winston'\nimport {jsonConsoleTransport, textConsoleTransport} from './formats'\nimport {getFileName} from './helpers/getFileName'\nimport {OrionLogger} from './types'\n\nconst transports: winston.transport[] = [\n process.env.NODE_ENV !== 'production' || process.env.ORION_DEV || process.env.JEST_WORKER_ID\n ? textConsoleTransport\n : jsonConsoleTransport,\n]\n\nexport const winstonLogger = winstonCreateLogger({\n levels: config.npm.levels,\n handleExceptions: true,\n format: format.errors({stack: true}),\n transports: transports,\n})\n\nexport const configureLogger = (options: winston.LoggerOptions) => {\n return winstonLogger.configure(options)\n}\n\nexport const setLogLevel = (level: string) => {\n winstonLogger.level = level\n}\n\nexport const addTransport = (transport: winston.transport) => {\n return winstonLogger.add(transport)\n}\n\nexport const getLogger = (context: string) => {\n return winstonLogger.child({context})\n}\n\nconst createLogger = (logger: winston.Logger): OrionLogger => {\n return {\n debug: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.debug({message, fileName, value})\n },\n info: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.info({message, fileName, value})\n },\n warn: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.warn({message, fileName, value})\n },\n error: (message: string, value: any) => {\n const fileName = getFileName()\n return logger.error({message, fileName, value})\n },\n addContext: (module: NodeJS.Module) => {\n if (module.id) {\n const split = String(module.id).split('.orion/build/')\n const fileName = split.length > 1 ? split[1] : split[0]\n return createLogger(logger.child({fileName}))\n }\n return createLogger(logger.child({}))\n },\n addMetadata: (metadata: any) => {\n return createLogger(logger.child(metadata))\n },\n }\n}\n\nexport const logger = createLogger(winstonLogger)\n","export const getFileName = () => {\n try {\n const stack = new Error().stack\n const lines = stack.split('\\n')\n const filePath = lines[3].split('(')[1].split(')')[0]\n return improveFileName(filePath)\n } catch {\n return\n }\n}\n\nexport const improveFileName = (path: string) => {\n path = path.replace(`${process.cwd()}/`, '')\n if (path.includes('orionjs/packages')) {\n return path.replace(/^.+\\/orionjs\\/packages\\//, '@orion-js/')\n }\n\n if (path.includes('node_modules/@orion-js/')) {\n const after = path.split('node_modules/@orion-js/')[1]\n const onlyPackageName = after.split('/')[0]\n return `@orion-js/${onlyPackageName}`\n }\n\n if (path.includes('.orion/build')) {\n return path.replace(/^.+\\.orion\\/build\\//, '')\n }\n if (path.includes('.pnpm/@orion-js+')) {\n return `@orion-js/${path.split('.pnpm/@orion-js+')[1].split('@')[0]}`\n }\n if (path.includes('/node_modules/@')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}/${parts[1]}`\n }\n if (path.includes('/node_modules/')) {\n const after = path.split('/node_modules/')[1]\n const parts = after.split('/')\n return `${parts[0]}`\n }\n return path\n}\n"],"mappings":"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","names":["winston","format","metadata","format","format","format","format","transports","format","logger","metadata"]}
|