Skip to content
This repository was archived by the owner on Jan 19, 2019. It is now read-only.

Commit 9521396

Browse files
JamesHenrynzakas
authored andcommitted
Breaking: Updated to TypeScript 2.x (fixes #105) (#112)
* Breaking: Updated TypeScript peerDependency to ^2.0.3 (refs #105) * Chore: Added test for shorthand-ambient-module-declaration (refs #105) (#109) * Chore: Added test for non-null assertion operator (refs #105) (#110) * Breaking: Update JSX tagName conversion for TS 2 (refs #105) (#108) * Chore: Added test for typed this parameter (fixes #105) * Fix: Add parameter type annotations to the AST (refs #105) (#111)
1 parent a7320df commit 9521396

26 files changed

+3205
-1060
lines changed

lib/ast-converter.js

+58-14
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,34 @@ function fixExports(node, result, ast) {
244244
return result;
245245
}
246246

247+
/**
248+
* Returns true if a given TSNode is a JSX token
249+
* @param {TSNode} node TSNode to be checked
250+
* @returns {boolean} is a JSX token
251+
*/
252+
function isJSXToken(node) {
253+
return (
254+
node.kind >= SyntaxKind.JsxElement
255+
&& node.kind <= SyntaxKind.JsxAttribute
256+
);
257+
}
258+
259+
/**
260+
* Returns true if a given TSNode has a JSX token within its hierarchy
261+
* @param {TSNode} node TSNode to be checked
262+
* @returns {boolean} has JSX ancestor
263+
*/
264+
function hasJSXAncestor(node) {
265+
while (node) {
266+
if (isJSXToken(node)) {
267+
return true;
268+
}
269+
node = node.parent;
270+
}
271+
return false;
272+
}
273+
274+
247275
/**
248276
* Extends and formats a given error object
249277
* @param {Object} error the error object
@@ -331,12 +359,12 @@ function getTokenType(token) {
331359

332360
// Some JSX tokens have to be determined based on their parent
333361
if (token.parent) {
334-
if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.FirstNode) {
362+
if (token.kind === SyntaxKind.Identifier && token.parent.kind === SyntaxKind.PropertyAccessExpression && hasJSXAncestor(token)) {
335363
return "JSXIdentifier";
336364
}
337365

338-
if (token.parent.kind >= SyntaxKind.JsxElement && token.parent.kind <= SyntaxKind.JsxAttribute) {
339-
if (token.kind === SyntaxKind.FirstNode) {
366+
if (isJSXToken(token.parent)) {
367+
if (token.kind === SyntaxKind.PropertyAccessExpression) {
340368
return "JSXMemberExpression";
341369
}
342370

@@ -616,12 +644,12 @@ module.exports = function(ast, extra) {
616644

617645
if (tagNameToken.type === "JSXMemberExpression") {
618646

619-
var isNestedMemberExpression = (node.tagName.left.kind === SyntaxKind.FirstNode);
647+
var isNestedMemberExpression = (node.tagName.expression.kind === SyntaxKind.PropertyAccessExpression);
620648

621649
// Convert TSNode left and right objects into ESTreeNode object
622650
// and property objects
623-
tagNameToken.object = convertChild(node.tagName.left);
624-
tagNameToken.property = convertChild(node.tagName.right);
651+
tagNameToken.object = convertChild(node.tagName.expression);
652+
tagNameToken.property = convertChild(node.tagName.name);
625653

626654
// Assign the appropriate types
627655
tagNameToken.object.type = (isNestedMemberExpression) ? "JSXMemberExpression" : "JSXIdentifier";
@@ -1061,7 +1089,7 @@ module.exports = function(ast, extra) {
10611089
} else { // class
10621090

10631091
/**
1064-
* Unlinke in object literal methods, class method params can have decorators
1092+
* Unlike in object literal methods, class method params can have decorators
10651093
*/
10661094
method.params = node.parameters.map(function(param) {
10671095
var convertedParam = convertChild(param);
@@ -1380,7 +1408,11 @@ module.exports = function(ast, extra) {
13801408
right: convertChild(node.initializer)
13811409
});
13821410
} else {
1383-
return convert(node.name, parent);
1411+
var convertedParameter = convert(node.name, parent);
1412+
if (node.type) {
1413+
convertedParameter.typeAnnotation = convertTypeAnnotation(node.type);
1414+
}
1415+
return convertedParameter;
13841416
}
13851417

13861418
break;
@@ -1626,12 +1658,24 @@ module.exports = function(ast, extra) {
16261658
break;
16271659

16281660
case SyntaxKind.PropertyAccessExpression:
1629-
assign(result, {
1630-
type: "MemberExpression",
1631-
object: convertChild(node.expression),
1632-
property: convertChild(node.name),
1633-
computed: false
1634-
});
1661+
if (isJSXToken(parent)) {
1662+
var jsxMemberExpression = {
1663+
type: "MemberExpression",
1664+
object: convertChild(node.expression),
1665+
property: convertChild(node.name)
1666+
};
1667+
var isNestedMemberExpression = (node.expression.kind === SyntaxKind.PropertyAccessExpression);
1668+
jsxMemberExpression.object.type = (isNestedMemberExpression) ? "MemberExpression" : "JSXIdentifier";
1669+
jsxMemberExpression.property.type = "JSXIdentifier";
1670+
assign(result, jsxMemberExpression);
1671+
} else {
1672+
assign(result, {
1673+
type: "MemberExpression",
1674+
object: convertChild(node.expression),
1675+
property: convertChild(node.name),
1676+
computed: false
1677+
});
1678+
}
16351679
break;
16361680

16371681
case SyntaxKind.ElementAccessExpression:

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@
5454
"object-assign": "^4.0.1"
5555
},
5656
"peerDependencies": {
57-
"typescript": "^1.7.3"
57+
"typescript": "^2.0.3"
5858
}
5959
}

0 commit comments

Comments
 (0)