Skip to content

Commit 364bddc

Browse files
wcjordanfkling
authored andcommitted
Support for create-react-class package (#179)
* Support for create-react-class package * Support for create-react-class package (take 2)
1 parent 196e181 commit 364bddc

File tree

4 files changed

+164
-1
lines changed

4 files changed

+164
-1
lines changed

src/__tests__/__snapshots__/main-test.js.snap

+8
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,11 @@ Object {
162162
},
163163
}
164164
`;
165+
166+
exports[`main fixtures processes component "component_7.js" without errors 1`] = `
167+
Object {
168+
"description": "The is a component to test the document generation",
169+
"displayName": "Component",
170+
"methods": Array [],
171+
}
172+
`;

src/__tests__/fixtures/component_7.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (c) 2015, Facebook, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*
9+
*/
10+
11+
var Component, createReactClass;
12+
13+
createReactClass = require('create-react-class');
14+
15+
/**
16+
* The is a component to test the document generation
17+
*/
18+
Component = createReactClass({
19+
displayName: 'Component',
20+
});
21+
22+
module.exports = Component;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* Copyright (c) 2015, Facebook, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree. An additional grant
7+
* of patent rights can be found in the PATENTS file in the same directory.
8+
*
9+
*/
10+
11+
/*global jest, describe, beforeEach, it, expect*/
12+
13+
14+
jest.disableAutomock();
15+
16+
describe('isReactCreateClassCall', () => {
17+
var isReactCreateClassCall;
18+
var utils;
19+
20+
function parse(src) {
21+
var root = utils.parse(src);
22+
return root.get('body', root.node.body.length - 1, 'expression');
23+
}
24+
25+
beforeEach(() => {
26+
isReactCreateClassCall = require('../isReactCreateClassCall').default;
27+
utils = require('../../../tests/utils');
28+
});
29+
30+
describe('built in React.createClass', () => {
31+
it('accepts createClass called on React', () => {
32+
var def = parse(`
33+
var React = require("React");
34+
React.createClass({
35+
render() {}
36+
});
37+
`);
38+
expect(isReactCreateClassCall(def)).toBe(true);
39+
});
40+
41+
it('accepts createClass called on aliased React', () => {
42+
var def = parse(`
43+
var other = require("React");
44+
other.createClass({
45+
render() {}
46+
});
47+
`);
48+
expect(isReactCreateClassCall(def)).toBe(true);
49+
});
50+
51+
it('ignores other React calls', () => {
52+
var def = parse(`
53+
var React = require("React");
54+
React.isValidElement({});
55+
`);
56+
expect(isReactCreateClassCall(def)).toBe(false);
57+
});
58+
59+
it('ignores non React calls to createClass', () => {
60+
var def = parse(`
61+
var React = require("bob");
62+
React.createClass({
63+
render() {}
64+
});
65+
`);
66+
expect(isReactCreateClassCall(def)).toBe(false);
67+
});
68+
});
69+
70+
describe('modular in create-react-class', () => {
71+
it('accepts create-react-class', () => {
72+
var def = parse(`
73+
var createReactClass = require("create-react-class");
74+
createReactClass({
75+
render() {}
76+
});
77+
`);
78+
expect(isReactCreateClassCall(def)).toBe(true);
79+
});
80+
81+
it('accepts create-react-class calls on another name', () => {
82+
var def = parse(`
83+
var makeClass = require("create-react-class");
84+
makeClass({
85+
render() {}
86+
});
87+
`);
88+
expect(isReactCreateClassCall(def)).toBe(true);
89+
});
90+
91+
it('ignores non create-react-class calls to createReactClass', () => {
92+
var def = parse(`
93+
var createReactClass = require("bob");
94+
createReactClass({
95+
render() {}
96+
});
97+
`);
98+
expect(isReactCreateClassCall(def)).toBe(false);
99+
});
100+
});
101+
});

src/utils/isReactCreateClassCall.js

+33-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var {types: {namedTypes: types}} = recast;
2121
* Returns true if the expression is a function call of the form
2222
* `React.createClass(...)`.
2323
*/
24-
export default function isReactCreateClassCall(path: NodePath): boolean {
24+
function isReactCreateClassCallBuiltIn(path: NodePath): boolean {
2525
if (types.ExpressionStatement.check(path.node)) {
2626
path = path.get('expression');
2727
}
@@ -32,3 +32,35 @@ export default function isReactCreateClassCall(path: NodePath): boolean {
3232
var module = resolveToModule(path.get('callee', 'object'));
3333
return Boolean(module && isReactModuleName(module));
3434
}
35+
36+
37+
/**
38+
* Returns true if the expression is a function call of the form
39+
* ```
40+
* import createReactClass from 'create-react-class';
41+
* createReactClass(...);
42+
* ```
43+
*/
44+
function isReactCreateClassCallModular(path: NodePath): boolean {
45+
if (types.ExpressionStatement.check(path.node)) {
46+
path = path.get('expression');
47+
}
48+
49+
if (!match(path.node, {type: 'CallExpression'})) {
50+
return false;
51+
}
52+
var module = resolveToModule(path);
53+
return Boolean(module && module === 'create-react-class');
54+
}
55+
56+
/**
57+
* Returns true if the expression is a function call of the form
58+
* `React.createClass(...)` or
59+
* ```
60+
* import createReactClass from 'create-react-class';
61+
* createReactClass(...);
62+
* ```
63+
*/
64+
export default function isReactCreateClassCall(path: NodePath): boolean {
65+
return isReactCreateClassCallBuiltIn(path) || isReactCreateClassCallModular(path)
66+
}

0 commit comments

Comments
 (0)