Skip to content

Commit

Permalink
Add support for a --strip-types flag to bin/jsx
Browse files Browse the repository at this point in the history
  • Loading branch information
jeffmo committed Sep 5, 2014
1 parent bcc291b commit 808730d
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 10 deletions.
6 changes: 5 additions & 1 deletion bin/jsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,18 @@ require('commoner').version(
}).option(
'--harmony',
'Turns on JS transformations such as ES6 Classes etc.'
).option(
'--strip-types',
'Strips out type annotations.'
).option(
'--source-map-inline',
'Embed inline sourcemap in transformed source'
).process(function(id, source) {
// This is where JSX, ES6, etc. desugaring happens.
var options = {
harmony: this.options.harmony,
sourceMap: this.options.sourceMapInline
sourceMap: this.options.sourceMapInline,
stripTypes: this.options.stripTypes
};
return transform(source, options);
});
17 changes: 9 additions & 8 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,17 @@ module.exports = {

function innerTransform(input, options) {
options = options || {};
var visitorList = getVisitors(options.harmony);
return transform(visitorList, input, options);
}

function getVisitors(harmony) {
if (harmony) {
return visitors.getAllVisitors();
} else {
return visitors.transformVisitors.react;
var visitorSets = ['react'];
if (options.harmony) {
visitorSets.push('harmony');
}
if (options.stripTypes) {
visitorSets.push('type-annotations');
}

var visitorList = visitors.getVisitorsBySet(visitorSets);
return transform(visitorList, input, options);
}

function inlineSourceMap(sourceMap, sourceCode, sourceFilename) {
Expand Down
53 changes: 52 additions & 1 deletion vendor/fbtransform/visitors.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ var es6Templates = require('jstransform/visitors/es6-template-visitors');
var es7SpreadProperty = require('jstransform/visitors/es7-spread-property-visitors');
var react = require('./transforms/react');
var reactDisplayName = require('./transforms/reactDisplayName');
var typesSyntax = require('jstransform/visitors/type-syntax');

/**
* Map from transformName => orderedListOfVisitors.
Expand All @@ -22,13 +23,34 @@ var transformVisitors = {
'es6-rest-params': es6RestParameters.visitorList,
'es6-templates': es6Templates.visitorList,
'es7-spread-property': es7SpreadProperty.visitorList,
'react': react.visitorList.concat(reactDisplayName.visitorList)
'react': react.visitorList.concat(reactDisplayName.visitorList),
'types': typesSyntax.visitorList
};

var transformSets = {
'harmony': [
'es6-arrow-functions',
'es6-object-concise-method',
'es6-object-short-notation',
'es6-classes',
'es6-rest-params',
'es6-templates',
'es6-destructuring',
'es7-spread-property'
],
'react': [
'react'
],
'type-annotations': [
'types'
]
};

/**
* Specifies the order in which each transform should run.
*/
var transformRunOrder = [
'types',
'es6-arrow-functions',
'es6-object-concise-method',
'es6-object-short-notation',
Expand Down Expand Up @@ -57,5 +79,34 @@ function getAllVisitors(excludes) {
return ret;
}

/**
* Given a list of visitor set names, return the ordered list of visitors to be
* passed to jstransform.
*
* @param {array}
* @return {array}
*/
function getVisitorsBySet(sets) {
var visitorsToInclude = sets.reduce(function(visitors, set) {
if (!transformSets.hasOwnProperty(set)) {
throw new Error('Unknown visitor set: ' + set);
}
transformSets[set].forEach(function(visitor) {
visitors[visitor] = true;
});
return visitors;
}, {});

var visitorList = [];
for (var i = 0; i < transformRunOrder.length; i++) {
if (visitorsToInclude.hasOwnProperty(transformRunOrder[i])) {
visitorList = visitorList.concat(transformVisitors[transformRunOrder[i]]);
}
}

return visitorList;
}

exports.getVisitorsBySet = getVisitorsBySet;
exports.getAllVisitors = getAllVisitors;
exports.transformVisitors = transformVisitors;

0 comments on commit 808730d

Please sign in to comment.