Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit a19c80c

Browse files
committed
feat(parsing): Add ability to parse babeled files (#121)
If there are missing information during the default parsing, then try to match against already babeled sources to get that information.
1 parent 3182fa0 commit a19c80c

File tree

4 files changed

+97
-4
lines changed

4 files changed

+97
-4
lines changed

Diff for: index.ts

+18-2
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,28 @@ function parseAst(ast: any, instanceOfResolver: InstanceOfResolver): IParsingRes
154154
'ExpressionStatement': (expressionNode: any): void => {
155155
if (expressionNode.expression.type == 'AssignmentExpression'
156156
&& expressionNode.expression.left.type == 'MemberExpression'
157-
&& expressionNode.expression.left.object.name == classname
158157
&& expressionNode.expression.left.property.name == 'propTypes') {
159-
propTypes = parsePropTypes(expressionNode.expression.right, instanceOfResolver);
158+
if (classname === undefined) {
159+
classname = expressionNode.expression.left.object.name;
160+
}
161+
if (expressionNode.expression.left.object.name == classname) {
162+
propTypes = parsePropTypes(expressionNode.expression.right, instanceOfResolver);
163+
}
160164
}
161165
}
162166
});
167+
if (exportType === undefined) {
168+
walk(ast.program, {
169+
'ExpressionStatement': (expressionNode: any): void => {
170+
if (expressionNode.expression.type == 'AssignmentExpression'
171+
&& expressionNode.expression.left.type == 'MemberExpression'
172+
&& expressionNode.expression.left.object.name == 'exports'
173+
&& expressionNode.expression.left.property.name == 'default') {
174+
exportType = ExportType.default;
175+
}
176+
}
177+
});
178+
}
163179
return {
164180
exportType,
165181
classname,

Diff for: package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
],
1515
"scripts": {
1616
"start": "npm test",
17-
"clean": "rm -f index.js index.js.map tests/*.js tests/*.js.map",
17+
"clean": "rm -f index.js index.js.map tests/*-test.js tests/*-test.js.map",
1818
"prebuild": "npm run clean",
1919
"build": "tsc --sourceMap",
2020
"build:inline": "tsc --inlineSourceMap",
2121
"pretest": "npm run clean && npm run build:inline",
22-
"test": "nyc --reporter lcov ./node_modules/.bin/mocha --recursive tests --all",
22+
"test": "nyc --all --reporter lcov ./node_modules/.bin/mocha --recursive tests/*-test.js",
2323
"coverage": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls",
2424
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -w",
2525
"prerelease": "npm test && npm run build",

Diff for: tests/es7-class-babeled.js

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
'use strict';
2+
3+
Object.defineProperty(exports, "__esModule", {
4+
value: true
5+
});
6+
7+
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8+
9+
var _react = require('react');
10+
11+
var React = _interopRequireWildcard(_react);
12+
13+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
14+
15+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
16+
17+
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
18+
19+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
20+
21+
var Component = function (_React$Component) {
22+
_inherits(Component, _React$Component);
23+
24+
function Component() {
25+
_classCallCheck(this, Component);
26+
27+
return _possibleConstructorReturn(this, Object.getPrototypeOf(Component).apply(this, arguments));
28+
}
29+
30+
_createClass(Component, [{
31+
key: 'render',
32+
value: function render() {
33+
return React.createElement('div', null);
34+
}
35+
}]);
36+
37+
return Component;
38+
}(React.Component);
39+
40+
Component.propTypes = {
41+
/**
42+
* This is a jsdoc comment for optionalAny.
43+
*/
44+
optionalAny: React.PropTypes.any,
45+
optionalArray: React.PropTypes.array,
46+
optionalBool: React.PropTypes.bool,
47+
optionalFunc: React.PropTypes.func,
48+
optionalNumber: React.PropTypes.number,
49+
optionalObject: React.PropTypes.object,
50+
optionalString: React.PropTypes.string,
51+
optionalNode: React.PropTypes.node,
52+
optionalElement: React.PropTypes.element,
53+
optionalMessage: React.PropTypes.instanceOf(Message),
54+
//optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
55+
optionalUnion: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]),
56+
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
57+
//optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
58+
//optionalObjectWithShape: React.PropTypes.shape({
59+
// color: React.PropTypes.string,
60+
// fontSize: React.PropTypes.number
61+
//}),
62+
requiredFunc: React.PropTypes.func.isRequired,
63+
requiredAny: React.PropTypes.any.isRequired,
64+
requiredUnion: React.PropTypes.oneOfType([React.PropTypes.array, React.PropTypes.bool]).isRequired,
65+
requiredArrayOf: React.PropTypes.arrayOf(React.PropTypes.string).isRequired
66+
};
67+
exports.default = Component;
68+

Diff for: tests/parsing-test.ts

+9
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,13 @@ describe('Parsing', () => {
3232
fs.readFileSync(path.join(__dirname, 'es7-class-top-level-module.d.ts')).toString()
3333
);
3434
});
35+
it('should create definition from babeled es7 class component', () => {
36+
const opts: react2dts.IOptions = {
37+
instanceOfResolver: (name: string): string => './path/to/Message'
38+
};
39+
assert.equal(
40+
react2dts.generateFromFile('component', path.join(__dirname, 'es7-class-babeled.js'), opts),
41+
fs.readFileSync(path.join(__dirname, 'es7-class.d.ts')).toString()
42+
);
43+
});
3544
});

0 commit comments

Comments
 (0)