From b1a949ed455dbecc1d7c868d723c76576ae713f9 Mon Sep 17 00:00:00 2001 From: "Fabio M. Costa" Date: Fri, 27 Dec 2013 16:42:57 -0800 Subject: [PATCH 1/3] Adds the filename to JSXTransform error message, making it easier to debug JSX syntax errors. --- vendor/browser-transforms.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/vendor/browser-transforms.js b/vendor/browser-transforms.js index f6a6980c691b..0bcf7f096258 100644 --- a/vendor/browser-transforms.js +++ b/vendor/browser-transforms.js @@ -41,7 +41,20 @@ var transformCode = function(code, source) { var jsx = docblock.parseAsObject(docblock.extract(code)).jsx; if (jsx) { - var transformed = transformReact(code); + try { + var transformed = transformReact(code); + } catch(e) { + if (source) { + if ('fileName' in e) { + // We set `fileName` if it's supported by this error object and + // a `source` was provided. + // The error will correctly point to `source` in Firefox. + e.fileName = source; + } + e.message += '\n at ' + source + ':' + e.lineNumber + ':' + e.column; + } + throw e; + } var map = transformed.sourceMap.toJSON(); if (source == null) { @@ -98,7 +111,7 @@ var load = exports.load = function(url, callback) { runScripts = function() { var scripts = document.getElementsByTagName('script'); - + // Array.prototype.slice cannot be used on NodeList on IE8 var jsxScripts = []; for (var i = 0; i < scripts.length; i++) { @@ -106,7 +119,7 @@ runScripts = function() { jsxScripts.push(scripts.item(i)); } } - + console.warn("You are using the in-browser JSX transformer. Be sure to precompile your JSX for production - http://facebook.github.io/react/docs/tooling-integration.html#jsx"); jsxScripts.forEach(function(script) { From d829d1ab9b9c8e6a3a07fb987f609be3f71d081c Mon Sep 17 00:00:00 2001 From: "Fabio M. Costa" Date: Fri, 27 Dec 2013 19:38:53 -0800 Subject: [PATCH 2/3] Adding current page's url for inline code and code improvement --- vendor/browser-transforms.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vendor/browser-transforms.js b/vendor/browser-transforms.js index 0bcf7f096258..6e9319a14eb5 100644 --- a/vendor/browser-transforms.js +++ b/vendor/browser-transforms.js @@ -44,6 +44,7 @@ var transformCode = function(code, source) { try { var transformed = transformReact(code); } catch(e) { + e.message += '\n at '; if (source) { if ('fileName' in e) { // We set `fileName` if it's supported by this error object and @@ -51,7 +52,9 @@ var transformCode = function(code, source) { // The error will correctly point to `source` in Firefox. e.fileName = source; } - e.message += '\n at ' + source + ':' + e.lineNumber + ':' + e.column; + e.message += source + ':' + e.lineNumber + ':' + e.column; + } else { + e.message += location.href; } throw e; } From de7a92afa703d27cf05f176b2bbd176beb03ea52 Mon Sep 17 00:00:00 2001 From: "Fabio M. Costa" Date: Sun, 29 Dec 2013 19:40:16 -0800 Subject: [PATCH 3/3] Updating error message to also show part of the code, making it easier to find the error --- vendor/browser-transforms.js | 38 ++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/vendor/browser-transforms.js b/vendor/browser-transforms.js index 6e9319a14eb5..701693c34a7c 100644 --- a/vendor/browser-transforms.js +++ b/vendor/browser-transforms.js @@ -37,6 +37,43 @@ exports.exec = function(code) { var inlineScriptCount = 0; +// This method returns a nicely formated line of code pointing the +// exactly location of the error `e`. +// The line is limited in size so big lines of code are also shown +// in a readable way. +// Example: +// +// ... x', overflow:'scroll'}} id={} onScroll={this.scroll} class=" ... +// ^ +var createSourceCodeErrorMessage = function(code, e) { + var sourceLines = code.split('\n'); + var erroneousLine = sourceLines[e.lineNumber - 1]; + + // Removes any leading indenting spaces and gets the number of + // chars indenting the `erroneousLine` + var indentation = 0; + erroneousLine = erroneousLine.replace(/^\s+/, function(leadingSpaces) { + indentation = leadingSpaces.length; + return ''; + }); + + // Defines the number of characters that are going to show + // before and after the erroneous code + var LIMIT = 30; + var errorColumn = e.column - indentation; + + if (errorColumn > LIMIT) { + erroneousLine = '... ' + erroneousLine.slice(errorColumn - LIMIT); + errorColumn = 4 + LIMIT; + } + if (erroneousLine.length - errorColumn > LIMIT) { + erroneousLine = erroneousLine.slice(0, errorColumn + LIMIT) + ' ...'; + } + var message = '\n\n' + erroneousLine + '\n'; + message += new Array(errorColumn - 1).join(' ') + '^'; + return message; +}; + var transformCode = function(code, source) { var jsx = docblock.parseAsObject(docblock.extract(code)).jsx; @@ -56,6 +93,7 @@ var transformCode = function(code, source) { } else { e.message += location.href; } + e.message += createSourceCodeErrorMessage(code, e); throw e; }