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

Commit 3ab7758

Browse files
vincentbelmohsen1
authored andcommitted
remove prop types import (#29)
1 parent e2bfbc0 commit 3ab7758

File tree

10 files changed

+116
-1
lines changed

10 files changed

+116
-1
lines changed

Diff for: src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { reactMovePropTypesToClassTransformFactoryFactory } from './transforms/r
77
import { collapseIntersectionInterfacesTransformFactoryFactory } from './transforms/collapse-intersection-interfaces-transform';
88
import { reactRemoveStaticPropTypesMemberTransformFactoryFactory } from './transforms/react-remove-static-prop-types-member-transform';
99
import { reactStatelessFunctionMakePropsTransformFactoryFactory } from './transforms/react-stateless-function-make-props-transform';
10+
import { reactRemovePropTypesImportTransformFactoryFactory } from './transforms/react-remove-prop-types-import';
1011

1112
export {
1213
reactMovePropTypesToClassTransformFactoryFactory,
@@ -15,6 +16,7 @@ export {
1516
collapseIntersectionInterfacesTransformFactoryFactory,
1617
reactRemovePropTypesAssignmentTransformFactoryFactory,
1718
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
19+
reactRemovePropTypesImportTransformFactoryFactory,
1820
compile,
1921
};
2022

@@ -25,6 +27,7 @@ export const allTransforms = [
2527
collapseIntersectionInterfacesTransformFactoryFactory,
2628
reactRemovePropTypesAssignmentTransformFactoryFactory,
2729
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
30+
reactRemovePropTypesImportTransformFactoryFactory,
2831
];
2932

3033
export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory<ts.SourceFile>;

Diff for: src/transforms/react-remove-prop-types-import.ts

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import * as ts from 'typescript';
2+
import * as _ from 'lodash';
3+
4+
import * as helpers from '../helpers';
5+
6+
export type Factory = ts.TransformerFactory<ts.SourceFile>;
7+
8+
/**
9+
* Remove `import PropTypes from 'prop-types'` or
10+
* `import { PropTypes } from 'react'`
11+
*
12+
* @example
13+
* Before:
14+
* import PropTypes from 'prop-types'
15+
* import React, { PropTypes } from 'rect'
16+
*
17+
* After:
18+
* import React from 'rect'
19+
*/
20+
export function reactRemovePropTypesImportTransformFactoryFactory(typeChecker: ts.TypeChecker): Factory {
21+
return function reactRemovePropTypesImportTransformFactory(context: ts.TransformationContext) {
22+
return function reactRemovePropTypesImportTransform(sourceFile: ts.SourceFile) {
23+
return ts.updateSourceFileNode(
24+
sourceFile,
25+
sourceFile.statements
26+
.filter(s => {
27+
return !(
28+
ts.isImportDeclaration(s) &&
29+
ts.isStringLiteral(s.moduleSpecifier) &&
30+
s.moduleSpecifier.text === 'prop-types'
31+
);
32+
})
33+
.map(updateReactImportIfNeeded),
34+
);
35+
};
36+
};
37+
}
38+
39+
function updateReactImportIfNeeded(statement: ts.Statement) {
40+
if (
41+
!ts.isImportDeclaration(statement) ||
42+
!ts.isStringLiteral(statement.moduleSpecifier) ||
43+
statement.moduleSpecifier.text !== 'react' ||
44+
!statement.importClause ||
45+
!statement.importClause.namedBindings ||
46+
!ts.isNamedImports(statement.importClause.namedBindings)
47+
) {
48+
return statement;
49+
}
50+
51+
const namedBindings = statement.importClause.namedBindings;
52+
const newNamedBindingElements = namedBindings.elements.filter(elm => elm.name.text !== 'PropTypes');
53+
54+
if (newNamedBindingElements.length === namedBindings.elements.length) {
55+
// Means it has no 'PropTypes' named import
56+
return statement;
57+
}
58+
59+
const newImportClause = ts.updateImportClause(
60+
statement.importClause,
61+
statement.importClause.name,
62+
newNamedBindingElements.length === 0
63+
? undefined
64+
: ts.updateNamedImports(namedBindings, newNamedBindingElements),
65+
);
66+
67+
return ts.updateImportDeclaration(
68+
statement,
69+
statement.decorators,
70+
statement.modifiers,
71+
newImportClause,
72+
statement.moduleSpecifier,
73+
);
74+
}

Diff for: test/end-to-end/basic/input.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import PropTypes from 'prop-types';
12
import * as React from 'react';
23

34
export default class MyComponent extends React.Component {
45
render() {
56
return <div />;
67
}
7-
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import PropTypes from 'prop-types'
2+
import React from 'react'
3+
4+
export const Hello = ({ message }) => {
5+
return <div>hello {message}</div>
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from 'react';
2+
3+
export const Hello = ({ message }) => {
4+
return <div>hello {message}</div>;
5+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React, { PropTypes, Component } from 'react';
2+
3+
export class MyComponent extends Component {
4+
render() {
5+
return <div>hello</div>;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React, { Component } from 'react';
2+
3+
export class MyComponent extends Component {
4+
render() {
5+
return <div>hello</div>;
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React, { PropTypes } from 'react'
2+
3+
export const Hello = ({ message }) => {
4+
return <div>hello {message}</div>
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from 'react';
2+
3+
export const Hello = ({ message }) => {
4+
return <div>hello {message}</div>;
5+
};

Diff for: test/runner.ts

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
reactRemovePropTypesAssignmentTransformFactoryFactory,
1515
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
1616
collapseIntersectionInterfacesTransformFactoryFactory,
17+
reactRemovePropTypesImportTransformFactoryFactory,
1718
allTransforms,
1819
compile,
1920
TransformFactoryFactory
@@ -28,6 +29,7 @@ const transformToFolderMap: [string, TransformFactoryFactory[]][] = [
2829
['react-remove-prop-types-assignment-transform', [reactRemovePropTypesAssignmentTransformFactoryFactory]],
2930
['collapse-intersection-interfaces-transform', [collapseIntersectionInterfacesTransformFactoryFactory]],
3031
['react-move-prop-types-to-class-transform', [reactMovePropTypesToClassTransformFactoryFactory]],
32+
['react-remove-prop-types-import', [reactRemovePropTypesImportTransformFactoryFactory]],
3133
['end-to-end', allTransforms],
3234
];
3335

0 commit comments

Comments
 (0)