From 6dca7532b7aba93caeecef2f9e6f94b62d5c29eb Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Tue, 17 Jun 2014 15:10:44 -0400 Subject: [PATCH 1/8] quote attr name uses double quotes --- vendor/fbtransform/transforms/xjs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index 66a8fb13cb2..942b8989fec 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -237,7 +237,7 @@ function renderXJSExpressionContainer(traverse, object, isLast, path, state) { function quoteAttrName(attr) { // Quote invalid JS identifiers. if (!/^[a-z_$][a-z\d_$]*$/i.test(attr)) { - return "'" + attr + "'"; + return "\"" + attr + "\""; } return attr; } From c4a99197b8cca7d045ba766ad9ba256baf60dc86 Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Tue, 17 Jun 2014 16:27:36 -0400 Subject: [PATCH 2/8] configurable quotes --- vendor/fbtransform/transforms/react.js | 2 +- vendor/fbtransform/transforms/reactDisplayName.js | 5 ++++- vendor/fbtransform/transforms/xjs.js | 8 +++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js index ae149cdde96..7b6e6974f37 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -94,7 +94,7 @@ function visitReactTag(traverse, object, path, state) { var isLast = index === attributesObject.length - 1; utils.catchup(attr.range[0], state, trimLeft); - utils.append(quoteAttrName(name), state); + utils.append(quoteAttrName(name, state.g.opts.useSingleQuotes), state); utils.append(': ', state); if (!attr.value) { diff --git a/vendor/fbtransform/transforms/reactDisplayName.js b/vendor/fbtransform/transforms/reactDisplayName.js index 6bc784c6e0b..d166117ec25 100644 --- a/vendor/fbtransform/transforms/reactDisplayName.js +++ b/vendor/fbtransform/transforms/reactDisplayName.js @@ -40,7 +40,10 @@ function addDisplayName(displayName, object, state) { if (safe) { utils.catchup(object['arguments'][0].range[0] + 1, state); - utils.append("displayName: '" + displayName + "',", state); + utils.append( + state.g.useSingleQuotes ? "displayName: '" + displayName + "'," : "displayName: \"" + displayName + "\",", + state + ); } } } diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index 942b8989fec..f275269cebe 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -190,7 +190,9 @@ function renderXJSLiteral(object, isLast, state, start, end) { if (trimmedLine || isLastNonEmptyLine) { utils.append( - JSON.stringify(trimmedLine) + + state.g.useSingleQuotes ? JSON.stringify(trimmedLine).replace( + /([^\\])"/g, '$1\'' + ).replace(/^"/g, '\''): JSON.stringify(trimmedLine) + (!isLastNonEmptyLine ? " + ' ' +" : ''), state); @@ -234,10 +236,10 @@ function renderXJSExpressionContainer(traverse, object, isLast, path, state) { return false; } -function quoteAttrName(attr) { +function quoteAttrName(attr, useSingleQuotes) { // Quote invalid JS identifiers. if (!/^[a-z_$][a-z\d_$]*$/i.test(attr)) { - return "\"" + attr + "\""; + return useSingleQuotes ? "'" + attr + "'" : "\"" + attr + "\"" ; } return attr; } From ecbf704dacba2e1c1cd6e9c26df8c5a170c1563d Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Tue, 17 Jun 2014 16:30:25 -0400 Subject: [PATCH 3/8] read opts --- vendor/fbtransform/transforms/reactDisplayName.js | 2 +- vendor/fbtransform/transforms/xjs.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/fbtransform/transforms/reactDisplayName.js b/vendor/fbtransform/transforms/reactDisplayName.js index d166117ec25..9ef093e8f0c 100644 --- a/vendor/fbtransform/transforms/reactDisplayName.js +++ b/vendor/fbtransform/transforms/reactDisplayName.js @@ -41,7 +41,7 @@ function addDisplayName(displayName, object, state) { if (safe) { utils.catchup(object['arguments'][0].range[0] + 1, state); utils.append( - state.g.useSingleQuotes ? "displayName: '" + displayName + "'," : "displayName: \"" + displayName + "\",", + state.g.opts.useSingleQuotes ? "displayName: '" + displayName + "'," : "displayName: \"" + displayName + "\",", state ); } diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index f275269cebe..50d81aa890b 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -190,7 +190,7 @@ function renderXJSLiteral(object, isLast, state, start, end) { if (trimmedLine || isLastNonEmptyLine) { utils.append( - state.g.useSingleQuotes ? JSON.stringify(trimmedLine).replace( + state.g.opts.useSingleQuotes ? JSON.stringify(trimmedLine).replace( /([^\\])"/g, '$1\'' ).replace(/^"/g, '\''): JSON.stringify(trimmedLine) + (!isLastNonEmptyLine ? " + ' ' +" : ''), From ac4b562d4e1c34e04d6ccbac016a1a4d8c3a03dd Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Tue, 17 Jun 2014 23:32:01 -0400 Subject: [PATCH 4/8] add option to bin --- bin/jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bin/jsx b/bin/jsx index e0f6247a39a..ee893af2e95 100755 --- a/bin/jsx +++ b/bin/jsx @@ -12,13 +12,19 @@ require('commoner').version( }).option( '--harmony', 'Turns on JS transformations such as ES6 Classes etc.' +).option( + '--use-single-quotes', + 'Uses single quotes for transform output.' ).process(function(id, source) { // This is where JSX, ES6, etc. desugaring happens. var visitorList; + if (this.options.harmony) { visitorList = visitors.getAllVisitors(); } else { visitorList = visitors.transformVisitors.react; } - return transform(visitorList, source).code; + return transform(visitorList, source, { + useSingleQuotes: this.options.useSingleQuotes + }).code; }); From 2337325ad4912f9e5a441e13aa97b5dc0245a31b Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Wed, 18 Jun 2014 08:54:45 -0400 Subject: [PATCH 5/8] swap quotes before and after stringify --- vendor/fbtransform/transforms/xjs.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index 50d81aa890b..b7f679eeebc 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -190,11 +190,12 @@ function renderXJSLiteral(object, isLast, state, start, end) { if (trimmedLine || isLastNonEmptyLine) { utils.append( - state.g.opts.useSingleQuotes ? JSON.stringify(trimmedLine).replace( - /([^\\])"/g, '$1\'' - ).replace(/^"/g, '\''): JSON.stringify(trimmedLine) + + state.g.opts.useSingleQuotes ? swapQuotes( + JSON.stringify(swapQuotes(trimmedLine)) + ) : JSON.stringify(trimmedLine) + (!isLastNonEmptyLine ? " + ' ' +" : ''), - state); + state + ); if (isLastNonEmptyLine) { if (end) { @@ -236,6 +237,12 @@ function renderXJSExpressionContainer(traverse, object, isLast, path, state) { return false; } +function swapQuotes(str) { + return str.replace(/['"]/g, function(m) { + return m === "\"" ? "'" : "\""; + }); +} + function quoteAttrName(attr, useSingleQuotes) { // Quote invalid JS identifiers. if (!/^[a-z_$][a-z\d_$]*$/i.test(attr)) { From b17bdac76071bcdb9c2789c08e030c7791e71dd6 Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Wed, 18 Jun 2014 11:22:01 -0400 Subject: [PATCH 6/8] helper for double or single quotes --- vendor/fbtransform/transforms/reactDisplayName.js | 6 ++---- vendor/fbtransform/transforms/xjs.js | 9 +++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/vendor/fbtransform/transforms/reactDisplayName.js b/vendor/fbtransform/transforms/reactDisplayName.js index 9ef093e8f0c..aee49b9b744 100644 --- a/vendor/fbtransform/transforms/reactDisplayName.js +++ b/vendor/fbtransform/transforms/reactDisplayName.js @@ -18,6 +18,7 @@ var Syntax = require('esprima-fb').Syntax; var utils = require('jstransform/src/utils'); +var doubleOrSingleQuotes = require('./xjs').doubleOrSingleQuotes; function addDisplayName(displayName, object, state) { if (object && @@ -40,10 +41,7 @@ function addDisplayName(displayName, object, state) { if (safe) { utils.catchup(object['arguments'][0].range[0] + 1, state); - utils.append( - state.g.opts.useSingleQuotes ? "displayName: '" + displayName + "'," : "displayName: \"" + displayName + "\",", - state - ); + utils.append('displayName: ' + doubleOrSingleQuotes(displayName, state) + ",", state); } } } diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index b7f679eeebc..53e71cb5e14 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -237,16 +237,20 @@ function renderXJSExpressionContainer(traverse, object, isLast, path, state) { return false; } +function doubleOrSingleQuotes(value, state) { + return state.g.opts.useSingleQuotes ? "'" + value + "'" : "\"" + value + "\""; +} + function swapQuotes(str) { return str.replace(/['"]/g, function(m) { return m === "\"" ? "'" : "\""; }); } -function quoteAttrName(attr, useSingleQuotes) { +function quoteAttrName(attr, state) { // Quote invalid JS identifiers. if (!/^[a-z_$][a-z\d_$]*$/i.test(attr)) { - return useSingleQuotes ? "'" + attr + "'" : "\"" + attr + "\"" ; + return doubleOrSingleQuotes(attr, state); } return attr; } @@ -259,4 +263,5 @@ exports.knownTags = knownTags; exports.renderXJSExpressionContainer = renderXJSExpressionContainer; exports.renderXJSLiteral = renderXJSLiteral; exports.quoteAttrName = quoteAttrName; +exports.doubleOrSingleQuotes = doubleOrSingleQuotes; exports.trimLeft = trimLeft; From 4260f89e8aac0921c1ce44e5b0433f5aad66d45d Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Wed, 18 Jun 2014 13:42:09 -0400 Subject: [PATCH 7/8] lint --- vendor/fbtransform/transforms/reactDisplayName.js | 5 ++++- vendor/fbtransform/transforms/xjs.js | 7 +++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/vendor/fbtransform/transforms/reactDisplayName.js b/vendor/fbtransform/transforms/reactDisplayName.js index aee49b9b744..31d3ea488e1 100644 --- a/vendor/fbtransform/transforms/reactDisplayName.js +++ b/vendor/fbtransform/transforms/reactDisplayName.js @@ -41,7 +41,10 @@ function addDisplayName(displayName, object, state) { if (safe) { utils.catchup(object['arguments'][0].range[0] + 1, state); - utils.append('displayName: ' + doubleOrSingleQuotes(displayName, state) + ",", state); + utils.append( + 'displayName: ' + doubleOrSingleQuotes(displayName, state) + ',', + state + ); } } } diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index 53e71cb5e14..a974b40c382 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -238,12 +238,15 @@ function renderXJSExpressionContainer(traverse, object, isLast, path, state) { } function doubleOrSingleQuotes(value, state) { - return state.g.opts.useSingleQuotes ? "'" + value + "'" : "\"" + value + "\""; + if (state.g.opts.useSingleQuotes) { + return '\'' + value + '\''; + } + return '"' + value + '"'; } function swapQuotes(str) { return str.replace(/['"]/g, function(m) { - return m === "\"" ? "'" : "\""; + return m === '"' ? '\'' : '"'; }); } From cca9f21620e5d2acefff464ca5f2f1e32b754514 Mon Sep 17 00:00:00 2001 From: Jeff McRiffey Date: Thu, 19 Jun 2014 11:05:01 -0400 Subject: [PATCH 8/8] check for state --- vendor/fbtransform/transforms/xjs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/fbtransform/transforms/xjs.js b/vendor/fbtransform/transforms/xjs.js index a974b40c382..5a1b92725b0 100644 --- a/vendor/fbtransform/transforms/xjs.js +++ b/vendor/fbtransform/transforms/xjs.js @@ -238,7 +238,7 @@ function renderXJSExpressionContainer(traverse, object, isLast, path, state) { } function doubleOrSingleQuotes(value, state) { - if (state.g.opts.useSingleQuotes) { + if (state && state.g.opts.useSingleQuotes) { return '\'' + value + '\''; } return '"' + value + '"';