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

Commit

Permalink
feat(parsing): Add ability to parse babeled files (#121)
Browse files Browse the repository at this point in the history
If there are missing information during the default parsing, then try to match against already
babeled sources to get that information.
  • Loading branch information
KnisterPeter committed May 28, 2016
1 parent 3182fa0 commit a19c80c
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 4 deletions.
20 changes: 18 additions & 2 deletions index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,12 +154,28 @@ function parseAst(ast: any, instanceOfResolver: InstanceOfResolver): IParsingRes
'ExpressionStatement': (expressionNode: any): void => {
if (expressionNode.expression.type == 'AssignmentExpression'
&& expressionNode.expression.left.type == 'MemberExpression'
&& expressionNode.expression.left.object.name == classname
&& expressionNode.expression.left.property.name == 'propTypes') {
propTypes = parsePropTypes(expressionNode.expression.right, instanceOfResolver);
if (classname === undefined) {
classname = expressionNode.expression.left.object.name;
}
if (expressionNode.expression.left.object.name == classname) {
propTypes = parsePropTypes(expressionNode.expression.right, instanceOfResolver);
}
}
}
});
if (exportType === undefined) {
walk(ast.program, {
'ExpressionStatement': (expressionNode: any): void => {
if (expressionNode.expression.type == 'AssignmentExpression'
&& expressionNode.expression.left.type == 'MemberExpression'
&& expressionNode.expression.left.object.name == 'exports'
&& expressionNode.expression.left.property.name == 'default') {
exportType = ExportType.default;
}
}
});
}
return {
exportType,
classname,
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
],
"scripts": {
"start": "npm test",
"clean": "rm -f index.js index.js.map tests/*.js tests/*.js.map",
"clean": "rm -f index.js index.js.map tests/*-test.js tests/*-test.js.map",
"prebuild": "npm run clean",
"build": "tsc --sourceMap",
"build:inline": "tsc --inlineSourceMap",
"pretest": "npm run clean && npm run build:inline",
"test": "nyc --reporter lcov ./node_modules/.bin/mocha --recursive tests --all",
"test": "nyc --all --reporter lcov ./node_modules/.bin/mocha --recursive tests/*-test.js",
"coverage": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -w",
"prerelease": "npm test && npm run build",
Expand Down
68 changes: 68 additions & 0 deletions tests/es7-class-babeled.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

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; }; }();

var _react = require('react');

var React = _interopRequireWildcard(_react);

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; } }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

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; }

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; }

var Component = function (_React$Component) {
_inherits(Component, _React$Component);

function Component() {
_classCallCheck(this, Component);

return _possibleConstructorReturn(this, Object.getPrototypeOf(Component).apply(this, arguments));
}

_createClass(Component, [{
key: 'render',
value: function render() {
return React.createElement('div', null);
}
}]);

return Component;
}(React.Component);

Component.propTypes = {
/**
* This is a jsdoc comment for optionalAny.
*/
optionalAny: React.PropTypes.any,
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
optionalNode: React.PropTypes.node,
optionalElement: React.PropTypes.element,
optionalMessage: React.PropTypes.instanceOf(Message),
//optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),
optionalUnion: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.number]),
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
//optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),
//optionalObjectWithShape: React.PropTypes.shape({
// color: React.PropTypes.string,
// fontSize: React.PropTypes.number
//}),
requiredFunc: React.PropTypes.func.isRequired,
requiredAny: React.PropTypes.any.isRequired,
requiredUnion: React.PropTypes.oneOfType([React.PropTypes.array, React.PropTypes.bool]).isRequired,
requiredArrayOf: React.PropTypes.arrayOf(React.PropTypes.string).isRequired
};
exports.default = Component;

9 changes: 9 additions & 0 deletions tests/parsing-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,13 @@ describe('Parsing', () => {
fs.readFileSync(path.join(__dirname, 'es7-class-top-level-module.d.ts')).toString()
);
});
it('should create definition from babeled es7 class component', () => {
const opts: react2dts.IOptions = {
instanceOfResolver: (name: string): string => './path/to/Message'
};
assert.equal(
react2dts.generateFromFile('component', path.join(__dirname, 'es7-class-babeled.js'), opts),
fs.readFileSync(path.join(__dirname, 'es7-class.d.ts')).toString()
);
});
});

0 comments on commit a19c80c

Please sign in to comment.