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

Commit 49ba17c

Browse files
authored
Merge pull request #482 from ingdir/stateless-comp
Generate named type instead of function
2 parents 92fd683 + e3a9414 commit 49ba17c

21 files changed

+57
-86
lines changed

Diff for: src/typings.ts

+8-40
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,7 @@ export function createTypings(moduleName: string|null, programAst: any, options:
4747
const tripleSlashDirectives: dom.TripleSlashDirective[] = [];
4848
const m = dom.create.module(moduleName || 'moduleName');
4949

50-
if (hasReactClass(ast, reactComponentName)) {
51-
m.members.push(dom.create.importNamed(reactComponentName || 'Component', reactImport));
52-
} else {
53-
tripleSlashDirectives.push(dom.create.tripleSlashReferenceTypesDirective('react'));
54-
}
50+
m.members.push(dom.create.importAll('React', reactImport));
5551

5652
if (importStatements.length > 0) {
5753
importStatements.forEach(importStatement => {
@@ -104,18 +100,20 @@ function createExportedTypes(m: dom.ModuleDeclaration, ast: AstQuery, componentN
104100
function createExportedClassComponent(m: dom.ModuleDeclaration, componentName: string,
105101
reactComponentName: string|undefined, exportType: dom.DeclarationFlags, interf: dom.InterfaceDeclaration): void {
106102
const classDecl = dom.create.class(componentName);
107-
classDecl.baseType = dom.create.interface(`${reactComponentName || 'Component'}<${interf.name}, any>`);
103+
classDecl.baseType = dom.create.interface(`React.${reactComponentName || 'Component'}<${interf.name}, any>`);
108104
classDecl.flags = exportType;
109105
classDecl.members.push(dom.create.method('render', [], dom.create.namedTypeReference('JSX.Element')));
110106
m.members.push(classDecl);
111107
}
112108

113109
function createExportedFunctionalComponent(m: dom.ModuleDeclaration, componentName: string, propTypes: any,
114110
exportType: dom.DeclarationFlags, interf: dom.InterfaceDeclaration): void {
115-
const funcDelc = dom.create.function(componentName, propTypes ? [dom.create.parameter('props', interf)] : [],
116-
dom.create.namedTypeReference('JSX.Element'));
117-
funcDelc.flags = exportType;
118-
m.members.push(funcDelc);
111+
112+
const typeDecl = dom.create.alias(
113+
componentName,
114+
dom.create.namedTypeReference(`React.SFC${ propTypes ? `<${interf.name}>` : '' }`));
115+
typeDecl.flags = exportType;
116+
m.members.push(typeDecl);
119117
}
120118

121119
function createPropTypeTypings(interf: dom.InterfaceDeclaration, ast: AstQuery, propTypes: any,
@@ -269,36 +267,6 @@ function getImportedPropTypes(ast: AstQuery): ImportedPropType[] {
269267
}));
270268
}
271269

272-
function hasReactClass(ast: AstQuery, reactComponentName: string|undefined): boolean {
273-
const res = ast.query(`
274-
// ClassDeclaration[
275-
'${reactComponentName}' == 'undefined'
276-
?
277-
/:superClass MemberExpression[
278-
/:object Identifier[@name == 'React'] &&
279-
/:property Identifier[@name == 'Component']
280-
]
281-
:
282-
/:superClass Identifier[@name == '${reactComponentName}']
283-
]
284-
,
285-
// VariableDeclaration
286-
/ VariableDeclarator[
287-
/:init CallExpression[
288-
'${reactComponentName}' == 'undefined'
289-
?
290-
/:arguments MemberExpression[
291-
/:object Identifier[@name == 'React'] &&
292-
/:property Identifier[@name == 'Component']
293-
]
294-
:
295-
/:arguments Identifier[@name == '${reactComponentName}']
296-
]
297-
]
298-
`);
299-
return res.length > 0;
300-
}
301-
302270
function getInstanceOfPropTypes(ast: AstQuery, importedPropTypes: ImportedPropTypes): string[] {
303271
const {propTypesName, propTypes} = importedPropTypes;
304272
const instanceOfPropType = propTypes.find(({importedName}) => importedName === 'instanceOf');

Diff for: tests/component-without-proptyes.d.ts

-12
This file was deleted.

Diff for: tests/component-without-proptypes.d.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
declare module 'component' {
2+
import * as React from 'react';
3+
4+
export interface TestProps {
5+
}
6+
7+
export default class Test extends React.Component<TestProps, any> {
8+
render(): JSX.Element;
9+
}
10+
11+
export type test = React.SFC;
12+
}
File renamed without changes.

Diff for: tests/es6-class.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
import Message from './path/to/Message';
55

@@ -52,7 +52,7 @@ declare module 'component' {
5252
requiredSymbol: Symbol;
5353
}
5454

55-
export class Component extends Component<ComponentProps, any> {
55+
export class Component extends React.Component<ComponentProps, any> {
5656
render(): JSX.Element;
5757
}
5858
}

Diff for: tests/es7-class-babeled-to-es6.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
import Message from './path/to/Message';
55

@@ -52,7 +52,7 @@ declare module 'component' {
5252
requiredSymbol: Symbol;
5353
}
5454

55-
export class MyComponent extends Component<MyComponentProps, any> {
55+
export class MyComponent extends React.Component<MyComponentProps, any> {
5656
render(): JSX.Element;
5757
}
5858
}

Diff for: tests/es7-class-separate-export.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
export interface ComponentProps {
55
optionalAny?: any;
66
}
77

8-
export default class Component extends Component<ComponentProps, any> {
8+
export default class Component extends React.Component<ComponentProps, any> {
99
render(): JSX.Element;
1010
}
1111
}

Diff for: tests/es7-class-top-level-module.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {Component} from 'react';
1+
import * as React from 'react';
22
import Message from './path/to/Message';
33

44
export type ComponentOptionalUnion = string | number;
@@ -27,6 +27,6 @@ export interface ComponentProps {
2727
requiredArrayOf: string[];
2828
}
2929

30-
export default class Component extends Component<ComponentProps, any> {
30+
export default class Component extends React.Component<ComponentProps, any> {
3131
render(): JSX.Element;
3232
}

Diff for: tests/es7-class.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33
import Message from './path/to/Message';
44

55
export type ComponentOptionalUnion = string | number;
@@ -28,7 +28,7 @@ declare module 'component' {
2828
requiredArrayOf: string[];
2929
}
3030

31-
export default class Component extends Component<ComponentProps, any> {
31+
export default class Component extends React.Component<ComponentProps, any> {
3232
render(): JSX.Element;
3333
}
3434
}

Diff for: tests/import-react-component.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33
}

Diff for: tests/instance-of-proptype-names.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33
import Member from './member';
44

55
export interface TestProps {
66
test?: Member;
77
}
88

9-
export class Test extends Component<TestProps, any> {
9+
export class Test extends React.Component<TestProps, any> {
1010
render(): JSX.Element;
1111
}
1212
}

Diff for: tests/named-export-specifiers.d.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
/// <reference types="react" />
21
declare module 'component' {
2+
import * as React from 'react';
3+
34
export interface ComponentProps {
45
optionalAny?: any;
56
}
67

7-
export function Component(props: ComponentProps): JSX.Element;
8+
export type Component = React.SFC<ComponentProps>;
89

9-
export function Component2(): JSX.Element;
10+
export type Component2 = React.SFC;
1011
}

Diff for: tests/parsing-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ test('Parsing should create definition from class import PropTypes and instanceO
8585
compare(t, 'component', 'instance-of-proptype-names.jsx', 'instance-of-proptype-names.d.ts');
8686
});
8787
test('Parsing should create definition from file without propTypes', t => {
88-
compare(t, 'component', 'component-without-proptyes.jsx', 'component-without-proptyes.d.ts');
88+
compare(t, 'component', 'component-without-proptypes.jsx', 'component-without-proptypes.d.ts');
8989
});
9090
test('Parsing should create definition from file with references in propTypes', t => {
9191
compare(t, 'component', 'references-in-proptypes.jsx', 'references-in-proptypes.d.ts');

Diff for: tests/preact-definition.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
declare module 'path' {
2-
import {Component} from 'preact';
2+
import * as React from 'preact';
33

44
export interface SomeComponentProps {
55
onClick?: (...args: any[]) => any;
66
}
77

8-
export class SomeComponent extends Component<SomeComponentProps, any> {
8+
export class SomeComponent extends React.Component<SomeComponentProps, any> {
99
render(): JSX.Element;
1010
}
1111
}

Diff for: tests/prop-types.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
declare module 'path' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
export interface Props {
55
optionalString?: string;
66
}
77

8-
export default class extends Component<Props, any> {
8+
export default class extends React.Component<Props, any> {
99
render(): JSX.Element;
1010
}
1111
}

Diff for: tests/pure-component.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
declare module 'component' {
2-
import {PureComponent} from 'react';
2+
import * as React from 'react';
33

44
export interface Props {
55
optionalString?: string;
66
}
77

8-
export default class extends PureComponent<Props, any> {
8+
export default class extends React.PureComponent<Props, any> {
99
render(): JSX.Element;
1010
}
1111
}

Diff for: tests/reference-as-proptypes.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
export interface SomeComponentProps {
55
someString?: string;
66
}
77

8-
export default class SomeComponent extends Component<SomeComponentProps, any> {
8+
export default class SomeComponent extends React.Component<SomeComponentProps, any> {
99
render(): JSX.Element;
1010
}
1111
}

Diff for: tests/references-in-proptypes.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
declare module 'component' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
export type SomeComponentSomeOneOf = "foo" | "bar";
55
export type SomeComponentAnotherOneOf = "foo" | "bar";
@@ -14,7 +14,7 @@ declare module 'component' {
1414
someShape?: SomeComponentSomeShape;
1515
}
1616

17-
export default class SomeComponent extends Component<SomeComponentProps, any> {
17+
export default class SomeComponent extends React.Component<SomeComponentProps, any> {
1818
render(): JSX.Element;
1919
}
2020
}

Diff for: tests/stateless-export-as-default.d.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
/// <reference types="react" />
21
declare module 'component' {
2+
import * as React from 'react';
3+
34
export interface ComponentProps {
45
text: string;
56
className?: string;
67
}
78

8-
export default function Component(props: ComponentProps): JSX.Element;
9+
export default type Component = React.SFC<ComponentProps>;
910
}

Diff for: tests/stateless.d.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
/// <reference types="react" />
21
declare module 'component' {
2+
import * as React from 'react';
3+
34
export interface ComponentProps {
45
optionalAny?: any;
56
}
67

7-
export function Component(props: ComponentProps): JSX.Element;
8+
export type Component = React.SFC<ComponentProps>;
89

9-
export function Component2(): JSX.Element;
10+
export type Component2 = React.SFC;
1011
}

Diff for: tests/unnamed-default-export.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
declare module 'path' {
2-
import {Component} from 'react';
2+
import * as React from 'react';
33

44
export interface Props {
55
onClick?: (...args: any[]) => any;
66
}
77

8-
export default class extends Component<Props, any> {
8+
export default class extends React.Component<Props, any> {
99
render(): JSX.Element;
1010
}
1111
}

0 commit comments

Comments
 (0)