@@ -89,6 +89,151 @@ export function generateConsolePipeCode(
8989 }
9090 }
9191
92+ var MAX_DEPTH = 6;
93+ var MAX_ARRAY_LEN = 100;
94+ var MAX_OBJECT_KEYS = 100;
95+ var MAX_STRING_LENGTH = 10000;
96+
97+ function truncateString(value) {
98+ if (value.length <= MAX_STRING_LENGTH) return value;
99+ return value.slice(0, MAX_STRING_LENGTH) + '... (' + (value.length - MAX_STRING_LENGTH) + ' more chars)';
100+ }
101+
102+ function formatDomElement(element) {
103+ var tagName = element.tagName ? element.tagName.toLowerCase() : 'element';
104+ var output = '<' + tagName;
105+ var attrs = ['id', 'class', 'name', 'type', 'role', 'aria-label', 'data-testid'];
106+
107+ for (var attrIndex = 0; attrIndex < attrs.length; attrIndex++) {
108+ var attrName = attrs[attrIndex];
109+ var attrValue = element.getAttribute && element.getAttribute(attrName);
110+ if (attrValue) {
111+ output += ' ' + attrName + '="' + truncateString(String(attrValue)).replace(/"/g, '"') + '"';
112+ }
113+ }
114+
115+ return output + '>';
116+ }
117+
118+ function getObjectTypeName(arg) {
119+ return arg && arg.constructor && arg.constructor.name ? arg.constructor.name : 'Object';
120+ }
121+
122+ function formatArrayBufferView(arg) {
123+ var length = typeof arg.length === 'number' ? arg.length : arg.byteLength;
124+ return '[' + getObjectTypeName(arg) + '(' + length + ')]';
125+ }
126+
127+ function serializeConsoleArg(arg, seen, depth) {
128+ if (depth === undefined) depth = 0;
129+ if (arg === undefined) return 'undefined';
130+ if (arg === null) return null;
131+
132+ var argType = typeof arg;
133+
134+ if (argType === 'function') return '[Function' + (arg.name ? ': ' + arg.name : '') + ']';
135+ if (argType === 'symbol') return arg.toString();
136+ if (argType === 'bigint') return arg.toString() + 'n';
137+ if (argType === 'string') return truncateString(arg);
138+ if (argType !== 'object') return arg;
139+
140+ if (!isServer) {
141+ if (
142+ arg.nodeType === 1 &&
143+ typeof arg.tagName === 'string' &&
144+ typeof arg.getAttribute === 'function'
145+ ) {
146+ return formatDomElement(arg);
147+ }
148+ if (arg.nodeType === 9) {
149+ return '[Document]';
150+ }
151+ if (typeof Window !== 'undefined' && arg instanceof Window) {
152+ return '[Window]';
153+ }
154+ if (typeof Event !== 'undefined' && arg instanceof Event) {
155+ return {
156+ type: arg.type,
157+ target: serializeConsoleArg(arg.target, seen, depth + 1),
158+ currentTarget: serializeConsoleArg(arg.currentTarget, seen, depth + 1),
159+ defaultPrevented: arg.defaultPrevented,
160+ };
161+ }
162+ if (typeof Node !== 'undefined' && arg instanceof Node) {
163+ return '[Node: ' + arg.nodeName + ']';
164+ }
165+ }
166+
167+ if (arg instanceof Error) {
168+ return {
169+ name: arg.name,
170+ message: truncateString(arg.message),
171+ stack: arg.stack ? truncateString(arg.stack) : arg.stack,
172+ };
173+ }
174+
175+ if (arg instanceof Date) {
176+ return arg.toISOString();
177+ }
178+
179+ if (arg instanceof RegExp) {
180+ return arg.toString();
181+ }
182+
183+ if (typeof ArrayBuffer !== 'undefined') {
184+ if (ArrayBuffer.isView && ArrayBuffer.isView(arg)) {
185+ return formatArrayBufferView(arg);
186+ }
187+ if (arg instanceof ArrayBuffer) {
188+ return '[ArrayBuffer(' + arg.byteLength + ')]';
189+ }
190+ }
191+
192+ if (typeof SharedArrayBuffer !== 'undefined' && arg instanceof SharedArrayBuffer) {
193+ return '[SharedArrayBuffer(' + arg.byteLength + ')]';
194+ }
195+
196+ if (depth >= MAX_DEPTH) {
197+ return '[MaxDepth]';
198+ }
199+
200+ if (seen.indexOf(arg) !== -1) {
201+ return '[Circular]';
202+ }
203+
204+ seen.push(arg);
205+
206+ if (Array.isArray(arg)) {
207+ var arrayResult = [];
208+ var arrayLength = Math.min(arg.length, MAX_ARRAY_LEN);
209+ for (var arrayIndex = 0; arrayIndex < arrayLength; arrayIndex++) {
210+ arrayResult.push(serializeConsoleArg(arg[arrayIndex], seen, depth + 1));
211+ }
212+ if (arg.length > MAX_ARRAY_LEN) {
213+ arrayResult.push('... (' + (arg.length - MAX_ARRAY_LEN) + ' more)');
214+ }
215+ seen.pop();
216+ return arrayResult;
217+ }
218+
219+ var objectResult = {};
220+ var keys = Object.keys(arg);
221+ var keyLength = Math.min(keys.length, MAX_OBJECT_KEYS);
222+ for (var keyIndex = 0; keyIndex < keyLength; keyIndex++) {
223+ var key = keys[keyIndex];
224+ try {
225+ objectResult[key] = serializeConsoleArg(arg[key], seen, depth + 1);
226+ } catch (error) {
227+ objectResult[key] = '[Thrown: ' + String(error) + ']';
228+ }
229+ }
230+ if (keys.length > MAX_OBJECT_KEYS) {
231+ objectResult['...'] = '(' + (keys.length - MAX_OBJECT_KEYS) + ' more keys)';
232+ }
233+ seen.pop();
234+ return objectResult;
235+ }
236+
92237 // Override global console methods
93238 for (var j = 0; j < CONSOLE_LEVELS.length; j++) {
94239 (function(level) {
@@ -106,15 +251,9 @@ export function generateConsolePipeCode(
106251 return;
107252 }
108253
109- // Serialize args safely
110254 var safeArgs = args.map(function(arg) {
111- if (arg === undefined) return 'undefined';
112- if (arg === null) return null;
113- if (typeof arg === 'function') return '[Function]';
114- if (typeof arg === 'symbol') return arg.toString();
115255 try {
116- JSON.stringify(arg);
117- return arg;
256+ return serializeConsoleArg(arg, [], 0);
118257 } catch (e) {
119258 return String(arg);
120259 }
0 commit comments