@lyxa.ai/core 1.4.219 → 1.4.220

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.
@@ -1,187 +1,89 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.handleTRPCError = handleTRPCError;
37
4
  const server_1 = require("@trpc/server");
5
+ const http_1 = require("@trpc/server/http");
38
6
  const error_handler_1 = require("./error-handler");
39
- const util = __importStar(require("util"));
40
7
  const __1 = require("..");
41
8
  const enum_1 = require("./enum");
42
- function handleTRPCError({ error, type, path, ctx }) {
43
- const errorContext = {
44
- procedurePath: path ?? 'unknown',
45
- procedureType: type,
46
- requestId: ctx?.requestId ?? 'unknown',
47
- timestamp: new Date().toISOString(),
48
- };
49
- const logger = (0, __1.getLibraries)().getLoggerKit();
50
- logger.info('Test', {
51
- tag: enum_1.LogTag.HTTP_REQUEST,
52
- });
53
- logger.error('TRPC Error', error, {
54
- tag: enum_1.LogTag.SYSTEM_ERROR,
55
- context: errorContext,
56
- });
57
- console.error(error);
58
- console.error('\n\n');
59
- console.error('╔═══════════════════════════════════════════════════════════════════╗');
60
- console.error('║ 🔥 TRPC ERROR 🔥 ║');
61
- console.error('╚═══════════════════════════════════════════════════════════════════╝');
62
- console.error('\n📋 Error Context:');
63
- console.error('┌─────────────────────────────────────────────────────────────────┐');
64
- console.error(`│ Path: ${errorContext.procedurePath.padEnd(52)} │`);
65
- console.error(`│ Type: ${errorContext.procedureType.padEnd(52)} │`);
66
- console.error(`│ Request ID: ${errorContext.requestId.padEnd(51)} │`);
67
- console.error(`│ Timestamp: ${errorContext.timestamp.padEnd(51)} │`);
68
- console.error('└─────────────────────────────────────────────────────────────────┘');
69
- if (error instanceof server_1.TRPCError) {
70
- console.error('\n🚨 Error Details:');
71
- console.error('┌─────────────────────────────────────────────────────────────────┐');
72
- console.error(`│ Code: ${error.code.padEnd(54)} │`);
73
- console.error('└─────────────────────────────────────────────────────────────────┘');
74
- if (error.code === 'BAD_REQUEST') {
75
- try {
76
- if (error.message.trim().startsWith('[') && error.message.includes('"code"')) {
77
- const validationErrors = JSON.parse(error.message);
78
- console.error('\n📋 Validation Errors:');
79
- validationErrors.forEach((err, index) => {
80
- const fieldPath = err.path.join('.');
81
- console.error(`│ ${(index + 1).toString().padStart(2)}. Field: ${fieldPath.padEnd(52)} │`);
82
- console.error(`│ Error: ${err.message.padEnd(53)} │`);
83
- console.error(`│ Expected: ${err.expected?.padEnd(50) || 'N/A'.padEnd(50)} │`);
84
- console.error(`│ Received: ${err.received?.padEnd(50) || 'N/A'.padEnd(50)} │`);
85
- if (index < validationErrors.length - 1) {
86
- console.error('│ │');
87
- }
88
- });
89
- const fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);
90
- error.message = `Validation failed: ${fieldErrors.join(', ')}`;
91
- console.error('\n📤 Client Response Message:');
92
- const message = error.message;
93
- const chunkSize = 65;
94
- for (let i = 0; i < message.length; i += chunkSize) {
95
- const chunk = message.substring(i, i + chunkSize);
96
- console.error(`│ ${chunk.padEnd(65)}`);
97
- }
98
- return;
99
- }
100
- }
101
- catch (parseError) {
102
- console.error('\n⚠️ Error Parsing Validation Error:');
103
- console.error(`│ ${parseError instanceof Error ? parseError.message.padEnd(65) : String(parseError).padEnd(65)}`);
104
- }
105
- }
106
- console.error('\n📝 Error Message:');
107
- const message = error.message;
108
- const chunkSize = 65;
109
- for (let i = 0; i < message.length; i += chunkSize) {
110
- const chunk = message.substring(i, i + chunkSize);
111
- console.error(`│ ${chunk.padEnd(65)}`);
112
- }
113
- if (error.cause) {
114
- console.error('\n🔍 Error Cause:');
115
- const causeString = util.inspect(error.cause, { depth: 4, colors: true });
116
- const causeLines = causeString.split('\n');
117
- causeLines.forEach(line => {
118
- const plainLine = line.replace(/\x1b\[\d+m/g, '');
119
- console.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);
120
- });
121
- }
122
- if (error.stack) {
123
- console.error('\n📚 Stack Trace:');
124
- const stackLines = error.stack.split('\n');
125
- stackLines.forEach(line => {
126
- if (line.length > 65) {
127
- for (let i = 0; i < line.length; i += 65) {
128
- const chunk = line.substring(i, i + 65);
129
- console.error(`│ ${chunk.padEnd(65)}`);
130
- }
131
- }
132
- else {
133
- console.error(`│ ${line.padEnd(65)}`);
134
- }
135
- });
136
- }
137
- }
138
- else if (error instanceof Error) {
139
- console.error('\n🚨 Standard Error:');
140
- console.error('┌─────────────────────────────────────────────────────────────────┐');
141
- console.error(`│ Name: ${error.name.padEnd(54)} │`);
142
- console.error(`│ Message: ${error.message.padEnd(54)} │`);
143
- console.error('└─────────────────────────────────────────────────────────────────┘');
144
- if (error.stack) {
145
- console.error('\n📚 Stack Trace:');
146
- const stackLines = error.stack.split('\n');
147
- stackLines.forEach(line => {
148
- if (line.length > 65) {
149
- for (let i = 0; i < line.length; i += 65) {
150
- const chunk = line.substring(i, i + 65);
151
- console.error(`│ ${chunk.padEnd(65)} │`);
152
- }
153
- }
154
- else {
155
- console.error(`│ ${line.padEnd(65)} │`);
156
- }
157
- });
158
- }
9
+ function isTRPCError(error) {
10
+ return error instanceof server_1.TRPCError || (error instanceof Error && error.name === 'TRPCError' && 'code' in error);
11
+ }
12
+ function formatValidationError(error) {
13
+ if (!(error.message.trim().startsWith('[') && error.message.includes('"code"')))
14
+ return null;
15
+ try {
16
+ const validationErrors = JSON.parse(error.message);
17
+ const fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);
18
+ error.message = `Validation failed: ${fieldErrors.join(', ')}`;
19
+ return validationErrors;
159
20
  }
160
- else {
161
- console.error('\n❓ Unknown Error:');
162
- const errorString = util.inspect(error, { depth: 4, colors: true });
163
- const errorLines = errorString.split('\n');
164
- errorLines.forEach(line => {
165
- const plainLine = line.replace(/\x1b\[\d+m/g, '');
166
- console.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);
167
- });
21
+ catch {
22
+ return null;
168
23
  }
24
+ }
25
+ const ERROR_PLUMBING = ['error-common', 'error-handler', 'error-middleware', 'logger.service'];
26
+ function getErrorSource(error) {
27
+ const stack = error instanceof Error ? error.stack : undefined;
28
+ if (!stack)
29
+ return undefined;
30
+ const frames = stack.split('\n').slice(1).map(l => l.trim());
31
+ const isNoise = (l) => l.includes('node_modules') || l.includes('node:') || ERROR_PLUMBING.some(f => l.includes(f));
32
+ return (frames.find(l => !isNoise(l)) ?? frames[0])?.trim();
33
+ }
34
+ function resolveInput(input, req) {
35
+ if (input !== undefined && input !== null)
36
+ return input;
37
+ const url = req?.url ?? '';
38
+ if (!url)
39
+ return input;
169
40
  try {
170
- const errorMeta = error_handler_1.ErrorHandler.extractErrorMetadata(error);
171
- if (errorMeta && Object.keys(errorMeta).length > 0) {
172
- console.error('\n🔬 Additional Error Metadata:');
173
- const metaString = util.inspect(errorMeta, { depth: 4, colors: true });
174
- const metaLines = metaString.split('\n');
175
- metaLines.forEach(line => {
176
- const plainLine = line.replace(/\x1b\[\d+m/g, '');
177
- console.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);
178
- });
179
- }
41
+ const raw = new URL(url, 'http://localhost').searchParams.get('input');
42
+ return raw ? JSON.parse(raw) : input;
43
+ }
44
+ catch {
45
+ return input;
180
46
  }
181
- catch (handlingError) {
182
- console.error('\n⚠️ Error While Extracting Metadata:');
183
- console.error(`│ ${handlingError instanceof Error ? handlingError.message.padEnd(65) : String(handlingError).padEnd(65)}`);
47
+ }
48
+ function handleTRPCError({ error, type, path, ctx, req, input }) {
49
+ const resolvedInput = resolveInput(input, req);
50
+ const source = getErrorSource(error_handler_1.ErrorHandler.extractErrorMetadata(error).originalError ?? error);
51
+ const startTime = req?._startTime;
52
+ const durationMs = typeof startTime === 'number' ? Date.now() - startTime : undefined;
53
+ const statusCode = isTRPCError(error) ? (0, http_1.getHTTPStatusCodeFromError)(error) : 500;
54
+ const isClientError = statusCode < 500;
55
+ const validationErrors = isTRPCError(error) && error.code === 'BAD_REQUEST' ? formatValidationError(error) : null;
56
+ const logger = (0, __1.getLibraries)().getLoggerKit();
57
+ const logOptions = {
58
+ tag: enum_1.LogTag.SYSTEM_ERROR,
59
+ status: statusCode,
60
+ request: {
61
+ method: req?.method,
62
+ url: req?.url,
63
+ headers: req?.headers,
64
+ },
65
+ data: {
66
+ procedurePath: path ?? 'unknown',
67
+ procedureType: type,
68
+ input: resolvedInput,
69
+ source,
70
+ caller: {
71
+ userType: ctx?.entity?.type,
72
+ ip: req?.headers?.['x-forwarded-for'] ?? req?.socket?.remoteAddress,
73
+ userAgent: req?.headers?.['user-agent'],
74
+ },
75
+ ...(durationMs !== undefined && { durationMs }),
76
+ validationErrors,
77
+ },
78
+ metadata: {
79
+ userId: ctx?.entity?.id,
80
+ },
81
+ };
82
+ if (isClientError) {
83
+ logger.warn('TRPC Error', { ...logOptions, error });
84
+ }
85
+ else {
86
+ logger.error('TRPC Error', error, logOptions);
184
87
  }
185
- console.error('\n\n');
186
88
  }
187
89
  //# sourceMappingURL=error-middleware.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-middleware.js","sourceRoot":"/","sources":["utilities/error-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport { ErrorHandler } from './error-handler';\nimport * as util from 'util';\nimport { getLibraries } from '..';\nimport { LogTag } from './enum';\n\n/**\n * Parameters for the tRPC error handler\n * @typedef {Object} ErrorHandlerParams\n * @property {TRPCError|Error|unknown} error - The error object to handle\n * @property {'query'|'mutation'|'subscription'|'unknown'} type - The type of tRPC procedure\n * @property {string|undefined} path - The path of the tRPC procedure\n * @property {Record<string,any>|undefined} ctx - The context of the request\n * @property {any} req - The request object\n * @property {unknown} input - The input parameters for the procedure\n */\ninterface ErrorHandlerParams {\n\terror: TRPCError | Error | unknown;\n\ttype: 'query' | 'mutation' | 'subscription' | 'unknown';\n\tpath: string | undefined;\n\tctx: Record<string, any> | undefined;\n\treq: any;\n\tinput: unknown;\n}\n\n/**\n * Structure of validation errors from zod validation\n * @typedef {Object} ValidationError\n * @property {string} code - The error code (e.g., 'invalid_type')\n * @property {string} expected - The expected type or value\n * @property {string} received - The received type or value\n * @property {(string|number)[]} path - The path to the field with the error\n * @property {string} message - The error message\n */\ninterface ValidationError {\n\tcode: string;\n\texpected: string;\n\treceived: string;\n\tpath: (string | number)[];\n\tmessage: string;\n}\n\n/**\n * Central error handler for tRPC HTTP server.\n *\n * This handler provides comprehensive error logging with structured, formatted output in the console.\n * It specializes in handling validation errors from zod schemas, presenting them in a readable format\n * both for console debugging and client response.\n *\n * Key features:\n * - Beautiful console formatting with box-styled outputs\n * - Special handling for validation errors with field-by-field breakdown\n * - Proper handling of nested error objects and stack traces\n * - Integration with ErrorHandler utility for extracting additional metadata\n * - Client-friendly error message formatting for validation errors\n *\n * @param {ErrorHandlerParams} params - The error handler parameters\n * @param {TRPCError|Error|unknown} params.error - The error that occurred\n * @param {'query'|'mutation'|'subscription'|'unknown'} params.type - Type of tRPC procedure\n * @param {string|undefined} params.path - Path of the tRPC procedure\n * @param {Record<string,any>|undefined} params.ctx - Request context\n * @param {any} params.req - The request object\n * @param {unknown} params.input - The input parameters\n *\n * @returns {void}\n */\nexport function handleTRPCError({ error, type, path, ctx }: ErrorHandlerParams): void {\n\tconst errorContext = {\n\t\tprocedurePath: path ?? 'unknown',\n\t\tprocedureType: type,\n\t\trequestId: ctx?.requestId ?? 'unknown',\n\t\ttimestamp: new Date().toISOString(),\n\t};\n\n\n\tconst logger = getLibraries().getLoggerKit();\n\tlogger.info('Test', {\n\t\ttag: LogTag.HTTP_REQUEST,\n\t});\n\tlogger.error('TRPC Error', error, {\n\t\ttag: LogTag.SYSTEM_ERROR,\n\t\tcontext: errorContext,\n\t});\n\tconsole.error(error);\n\n\t// Print a clear error header with context\n\tconsole.error('\\n\\n');\n\tconsole.error('╔═══════════════════════════════════════════════════════════════════╗');\n\tconsole.error('║ 🔥 TRPC ERROR 🔥 ║');\n\tconsole.error('╚═══════════════════════════════════════════════════════════════════╝');\n\n\t// Print context information in a structured format\n\tconsole.error('\\n📋 Error Context:');\n\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\n\tconsole.error(`│ Path: ${errorContext.procedurePath.padEnd(52)} │`);\n\tconsole.error(`│ Type: ${errorContext.procedureType.padEnd(52)} │`);\n\tconsole.error(`│ Request ID: ${errorContext.requestId.padEnd(51)} │`);\n\tconsole.error(`│ Timestamp: ${errorContext.timestamp.padEnd(51)} │`);\n\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\n\n\tif (error instanceof TRPCError) {\n\t\t// Print basic error info\n\t\tconsole.error('\\n🚨 Error Details:');\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\n\t\tconsole.error(`│ Code: ${error.code.padEnd(54)} │`);\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\n\n\t\t// Handle validation errors specially\n\t\tif (error.code === 'BAD_REQUEST') {\n\t\t\ttry {\n\t\t\t\tif (error.message.trim().startsWith('[') && error.message.includes('\"code\"')) {\n\t\t\t\t\tconst validationErrors = JSON.parse(error.message) as ValidationError[];\n\n\t\t\t\t\tconsole.error('\\n📋 Validation Errors:');\n\n\t\t\t\t\tvalidationErrors.forEach((err, index) => {\n\t\t\t\t\t\tconst fieldPath = err.path.join('.');\n\t\t\t\t\t\tconsole.error(`│ ${(index + 1).toString().padStart(2)}. Field: ${fieldPath.padEnd(52)} │`);\n\t\t\t\t\t\tconsole.error(`│ Error: ${err.message.padEnd(53)} │`);\n\t\t\t\t\t\tconsole.error(`│ Expected: ${err.expected?.padEnd(50) || 'N/A'.padEnd(50)} │`);\n\t\t\t\t\t\tconsole.error(`│ Received: ${err.received?.padEnd(50) || 'N/A'.padEnd(50)} │`);\n\n\t\t\t\t\t\t// Add a separator between errors, except for the last one\n\t\t\t\t\t\tif (index < validationErrors.length - 1) {\n\t\t\t\t\t\t\tconsole.error('│ │');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Format field errors for the client response\n\t\t\t\t\tconst fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);\n\n\t\t\t\t\terror.message = `Validation failed: ${fieldErrors.join(', ')}`;\n\n\t\t\t\t\t// Print the formatted client message\n\t\t\t\t\tconsole.error('\\n📤 Client Response Message:');\n\n\t\t\t\t\t// Split the message into multiple lines if it's too long\n\t\t\t\t\tconst message = error.message;\n\t\t\t\t\tconst chunkSize = 65;\n\n\t\t\t\t\tfor (let i = 0; i < message.length; i += chunkSize) {\n\t\t\t\t\t\tconst chunk = message.substring(i, i + chunkSize);\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (parseError) {\n\t\t\t\tconsole.error('\\n⚠️ Error Parsing Validation Error:');\n\t\t\t\tconsole.error(\n\t\t\t\t\t`│ ${parseError instanceof Error ? parseError.message.padEnd(65) : String(parseError).padEnd(65)}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Print the error message\n\t\tconsole.error('\\n📝 Error Message:');\n\n\t\t// Split the message into multiple lines if it's too long\n\t\tconst message = error.message;\n\t\tconst chunkSize = 65;\n\n\t\tfor (let i = 0; i < message.length; i += chunkSize) {\n\t\t\tconst chunk = message.substring(i, i + chunkSize);\n\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\n\t\t}\n\n\t\t// Print the error cause if available\n\t\tif (error.cause) {\n\t\t\tconsole.error('\\n🔍 Error Cause:');\n\n\t\t\t// Use util.inspect to format the cause object nicely\n\t\t\tconst causeString = util.inspect(error.cause, { depth: 4, colors: true });\n\t\t\tconst causeLines = causeString.split('\\n');\n\n\t\t\tcauseLines.forEach(line => {\n\t\t\t\t// Remove ANSI color codes for padding calculation\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\n\t\t\t});\n\t\t}\n\n\t\t// Print stack trace if available\n\t\tif (error.stack) {\n\t\t\tconsole.error('\\n📚 Stack Trace:');\n\n\t\t\tconst stackLines = error.stack.split('\\n');\n\t\t\tstackLines.forEach(line => {\n\t\t\t\t// Truncate or split long lines\n\t\t\t\tif (line.length > 65) {\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)}`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else if (error instanceof Error) {\n\t\t// Handle standard errors\n\t\tconsole.error('\\n🚨 Standard Error:');\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\n\t\tconsole.error(`│ Name: ${error.name.padEnd(54)} │`);\n\t\tconsole.error(`│ Message: ${error.message.padEnd(54)} │`);\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\n\n\t\t// Print stack trace if available\n\t\tif (error.stack) {\n\t\t\tconsole.error('\\n📚 Stack Trace:');\n\n\t\t\tconst stackLines = error.stack.split('\\n');\n\t\t\tstackLines.forEach(line => {\n\t\t\t\t// Truncate or split long lines\n\t\t\t\tif (line.length > 65) {\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)} │`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)} │`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// Handle unknown errors\n\t\tconsole.error('\\n❓ Unknown Error:');\n\n\t\tconst errorString = util.inspect(error, { depth: 4, colors: true });\n\t\tconst errorLines = errorString.split('\\n');\n\n\t\terrorLines.forEach(line => {\n\t\t\t// Remove ANSI color codes for padding calculation\n\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\n\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\n\t\t});\n\t}\n\n\t// Use ErrorHandler's methods for additional metadata\n\ttry {\n\t\tconst errorMeta = ErrorHandler.extractErrorMetadata(error);\n\n\t\tif (errorMeta && Object.keys(errorMeta).length > 0) {\n\t\t\tconsole.error('\\n🔬 Additional Error Metadata:');\n\n\t\t\tconst metaString = util.inspect(errorMeta, { depth: 4, colors: true });\n\t\t\tconst metaLines = metaString.split('\\n');\n\n\t\t\tmetaLines.forEach(line => {\n\t\t\t\t// Remove ANSI color codes for padding calculation\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\n\t\t\t});\n\t\t}\n\t} catch (handlingError) {\n\t\tconsole.error('\\n⚠️ Error While Extracting Metadata:');\n\t\tconsole.error(\n\t\t\t`│ ${\n\t\t\t\thandlingError instanceof Error ? handlingError.message.padEnd(65) : String(handlingError).padEnd(65)\n\t\t\t}`\n\t\t);\n\t}\n\n\tconsole.error('\\n\\n');\n}\n"]}
1
+ {"version":3,"file":"error-middleware.js","sourceRoot":"/","sources":["utilities/error-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport { getHTTPStatusCodeFromError } from '@trpc/server/http';\nimport { ErrorHandler } from './error-handler';\nimport { getLibraries } from '..';\nimport { LogTag } from './enum';\n\n/**\n * Parameters for the tRPC error handler\n * @typedef {Object} ErrorHandlerParams\n * @property {TRPCError|Error|unknown} error - The error object to handle\n * @property {'query'|'mutation'|'subscription'|'unknown'} type - The type of tRPC procedure\n * @property {string|undefined} path - The path of the tRPC procedure\n * @property {Record<string,any>|undefined} ctx - The context of the request\n * @property {any} req - The request object\n * @property {unknown} input - The input parameters for the procedure\n */\ninterface ErrorHandlerParams {\n\terror: TRPCError | Error | unknown;\n\ttype: 'query' | 'mutation' | 'subscription' | 'unknown';\n\tpath: string | undefined;\n\tctx: Record<string, any> | undefined;\n\treq: any;\n\tinput: unknown;\n}\n\n/**\n * Structure of validation errors from zod validation\n * @typedef {Object} ValidationError\n * @property {string} code - The error code (e.g., 'invalid_type')\n * @property {string} expected - The expected type or value\n * @property {string} received - The received type or value\n * @property {(string|number)[]} path - The path to the field with the error\n * @property {string} message - The error message\n */\ninterface ValidationError {\n\tcode: string;\n\texpected: string;\n\treceived: string;\n\tpath: (string | number)[];\n\tmessage: string;\n}\n\n/**\n * Structural check for TRPCError, since `instanceof` can fail when the error\n * crosses a package boundary that resolves a different copy of @trpc/server.\n */\nfunction isTRPCError(error: unknown): error is TRPCError {\n\treturn error instanceof TRPCError || (error instanceof Error && error.name === 'TRPCError' && 'code' in error);\n}\n\n/**\n * Parses a zod field-error message into a client-friendly summary, mutating\n * error.message in place. Returns null if the message isn't a zod validation array.\n */\nfunction formatValidationError(error: TRPCError): ValidationError[] | null {\n\tif (!(error.message.trim().startsWith('[') && error.message.includes('\"code\"'))) return null;\n\n\ttry {\n\t\tconst validationErrors = JSON.parse(error.message) as ValidationError[];\n\t\tconst fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);\n\t\terror.message = `Validation failed: ${fieldErrors.join(', ')}`;\n\t\treturn validationErrors;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// Frames in these files are error plumbing (factories/handlers), not where the error\n// actually originated, so skip them when picking the source frame.\nconst ERROR_PLUMBING = ['error-common', 'error-handler', 'error-middleware', 'logger.service'];\n\n/**\n * Returns the first stack frame originating from real business code, skipping node\n * internals, node_modules, and our own error-construction helpers, so logs point at\n * the actual call site instead of the error factory (e.g. unauthorizedError()).\n */\nfunction getErrorSource(error: unknown): string | undefined {\n\tconst stack = error instanceof Error ? error.stack : undefined;\n\tif (!stack) return undefined;\n\tconst frames = stack.split('\\n').slice(1).map(l => l.trim());\n\tconst isNoise = (l: string) =>\n\t\tl.includes('node_modules') || l.includes('node:') || ERROR_PLUMBING.some(f => l.includes(f));\n\treturn (frames.find(l => !isNoise(l)) ?? frames[0])?.trim();\n}\n\n/**\n * tRPC passes parsed `input` for mutations, but for GET queries the args live in the\n * URL `input` query param. Fall back to parsing the URL so params are always captured.\n */\nfunction resolveInput(input: unknown, req: any): unknown {\n\tif (input !== undefined && input !== null) return input;\n\tconst url: string = req?.url ?? '';\n\tif (!url) return input;\n\ttry {\n\t\tconst raw = new URL(url, 'http://localhost').searchParams.get('input');\n\t\treturn raw ? JSON.parse(raw) : input;\n\t} catch {\n\t\treturn input;\n\t}\n}\n\n/**\n * Central error handler for tRPC HTTP server. Logs structured error data via the\n * logger, plus a readable dump to the console for local debugging.\n *\n * @param {ErrorHandlerParams} params - The error handler parameters\n * @returns {void}\n */\nexport function handleTRPCError({ error, type, path, ctx, req, input }: ErrorHandlerParams): void {\n\tconst resolvedInput = resolveInput(input, req);\n\tconst source = getErrorSource(ErrorHandler.extractErrorMetadata(error).originalError ?? error);\n\t// _startTime is set on req at context creation; absent for requests that fail before context.\n\tconst startTime = (req as any)?._startTime;\n\tconst durationMs = typeof startTime === 'number' ? Date.now() - startTime : undefined;\n\n\tconst statusCode = isTRPCError(error) ? getHTTPStatusCodeFromError(error) : 500;\n\tconst isClientError = statusCode < 500;\n\n\tconst validationErrors = isTRPCError(error) && error.code === 'BAD_REQUEST' ? formatValidationError(error) : null;\n\n\tconst logger = getLibraries().getLoggerKit();\n\t// Each field has a single home to avoid duplicate copies in the persisted document:\n\t// `data` is the human-facing summary (also what prints to the terminal), `request` is\n\t// pure HTTP transport, `metadata.userId` is the indexed/filterable field.\n\tconst logOptions = {\n\t\ttag: LogTag.SYSTEM_ERROR,\n\t\tstatus: statusCode,\n\t\trequest: {\n\t\t\tmethod: req?.method,\n\t\t\turl: req?.url,\n\t\t\theaders: req?.headers,\n\t\t},\n\t\tdata: {\n\t\t\tprocedurePath: path ?? 'unknown',\n\t\t\tprocedureType: type,\n\t\t\tinput: resolvedInput,\n\t\t\tsource,\n\t\t\tcaller: {\n\t\t\t\tuserType: ctx?.entity?.type,\n\t\t\t\tip: (req?.headers?.['x-forwarded-for'] as string) ?? req?.socket?.remoteAddress,\n\t\t\t\tuserAgent: req?.headers?.['user-agent'],\n\t\t\t},\n\t\t\t...(durationMs !== undefined && { durationMs }),\n\t\t\tvalidationErrors,\n\t\t},\n\t\tmetadata: {\n\t\t\tuserId: ctx?.entity?.id,\n\t\t},\n\t};\n\n\tif (isClientError) {\n\t\tlogger.warn('TRPC Error', { ...logOptions, error });\n\t} else {\n\t\tlogger.error('TRPC Error', error, logOptions);\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lyxa.ai/core",
3
- "version": "1.4.219",
3
+ "version": "1.4.220",
4
4
  "description": "The Core system of the Lyxa services.",
5
5
  "author": "elie <42282499+Internalizable@users.noreply.github.com>",
6
6
  "license": "MIT",