next
Version:
The React Framework
142 lines (141 loc) • 4.77 kB
JavaScript
import isError from '../../lib/is-error';
function formatObject(arg, depth) {
switch(typeof arg){
case 'object':
if (arg === null) {
return 'null';
} else if (Array.isArray(arg)) {
let result = '[';
if (depth < 1) {
for(let i = 0; i < arg.length; i++){
if (result !== '[') {
result += ',';
}
if (Object.prototype.hasOwnProperty.call(arg, i)) {
result += formatObject(arg[i], depth + 1);
}
}
} else {
result += arg.length > 0 ? '...' : '';
}
result += ']';
return result;
} else if (arg instanceof Error) {
return arg + '';
} else {
const keys = Object.keys(arg);
let result = '{';
if (depth < 1) {
for(let i = 0; i < keys.length; i++){
const key = keys[i];
const desc = Object.getOwnPropertyDescriptor(arg, 'key');
if (desc && !desc.get && !desc.set) {
const jsonKey = JSON.stringify(key);
if (jsonKey !== '"' + key + '"') {
result += jsonKey + ': ';
} else {
result += key + ': ';
}
result += formatObject(desc.value, depth + 1);
}
}
} else {
result += keys.length > 0 ? '...' : '';
}
result += '}';
return result;
}
case 'string':
return JSON.stringify(arg);
default:
return String(arg);
}
}
export function formatConsoleArgs(args) {
let message;
let idx;
if (typeof args[0] === 'string') {
message = args[0];
idx = 1;
} else {
message = '';
idx = 0;
}
let result = '';
let startQuote = false;
for(let i = 0; i < message.length; ++i){
const char = message[i];
if (char !== '%' || i === message.length - 1 || idx >= args.length) {
result += char;
continue;
}
const code = message[++i];
switch(code){
case 'c':
{
// TODO: We should colorize with HTML instead of turning into a string.
// Ignore for now.
result = startQuote ? "" + result + "]" : "[" + result;
startQuote = !startQuote;
idx++;
break;
}
case 'O':
case 'o':
{
result += formatObject(args[idx++], 0);
break;
}
case 'd':
case 'i':
{
result += parseInt(args[idx++], 10);
break;
}
case 'f':
{
result += parseFloat(args[idx++]);
break;
}
case 's':
{
result += String(args[idx++]);
break;
}
default:
result += '%' + code;
}
}
for(; idx < args.length; idx++){
result += (idx > 0 ? ' ' : '') + formatObject(args[idx], 0);
}
return result;
}
export function parseConsoleArgs(args) {
// See
// https://github.com/facebook/react/blob/65a56d0e99261481c721334a3ec4561d173594cd/packages/react-devtools-shared/src/backend/flight/renderer.js#L88-L93
//
// Logs replayed from the server look like this:
// [
// "%c%s%c %o\n\n%s\n\n%s\n",
// "background: #e6e6e6; ...",
// " Server ", // can also be e.g. " Prerender "
// "",
// Error,
// "The above error occurred in the <Page> component.",
// ...
// ]
if (args.length > 3 && typeof args[0] === 'string' && args[0].startsWith('%c%s%c ') && typeof args[1] === 'string' && typeof args[2] === 'string' && typeof args[3] === 'string') {
const environmentName = args[2];
const maybeError = args[4];
return {
environmentName: environmentName.trim(),
error: isError(maybeError) ? maybeError : null
};
}
return {
environmentName: null,
error: null
};
}
//# sourceMappingURL=console.js.map