Skip to content

Commit db3d339

Browse files
authored
Fix TypeScript support for update-react-imports (#275)
* Add TypeScript tests for update-react-imports * Fix update-react-imports for TS * Add more tests
1 parent 892d139 commit db3d339

30 files changed

+148
-10
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React, { createElement, useState } from "react";
2+
3+
React.createElement('div', {});
4+
5+
<div>Hi</div>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { createElement, useState } from "react";
2+
import * as React from "react";
3+
4+
React.createElement('div', {});
5+
6+
<div>Hi</div>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import React, { createElement, useState } from "react";
2+
3+
<div>Hi</div>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { createElement, useState } from "react";
2+
3+
<div>Hi</div>;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as React from "react";
2+
3+
<div>Hi</div>;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div>Hi</div>;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as React from "react";
2+
3+
<></>;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<></>;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* Hello world.
3+
*/
4+
5+
import * as React from "react";
6+
7+
<div></div>;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/**
2+
* Hello world.
3+
*/
4+
5+
<div></div>;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from 'react';
2+
3+
const App: React.FunctionComponent<{ message: string }> = ({ message }) => (
4+
<div>{message}</div>
5+
);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as React from 'react';
2+
3+
const App: React.FunctionComponent<{ message: string }> = ({ message }) => (
4+
<div>{message}</div>
5+
);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import * as React from 'react';
2+
3+
const App: React.FunctionComponent<{ message: string }> = ({ message }) => (
4+
<div>{message}</div>
5+
);

transforms/__testfixtures__/update-react-imports/typescript/preserve-types-namespace.tsx.output.js

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as React from 'react';
2+
3+
React.useState(false);

transforms/__testfixtures__/update-react-imports/typescript/react-already-used-named-export.tsx.output.js

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import React from "react";
2+
3+
React.createElement('div', {});
4+
5+
<div></div>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { createElement } from "react";
2+
3+
createElement('div', {});
4+
5+
<div></div>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import React from "react";
2+
3+
<div></div>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div></div>;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import React from "react";
2+
3+
React.createElement('div', 'la');
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { createElement } from "react";
2+
3+
createElement('div', 'la');
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import React, { useState } from 'react';
2+
3+
<React.Fragment />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { Fragment, useState } from 'react';
2+
3+
<Fragment />
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React from "react";
2+
3+
React.createElement('div', {});
4+
5+
Promise.resolve(React);
6+
7+
<div>Hi</div>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as React from "react";
2+
3+
React.createElement('div', {});
4+
5+
Promise.resolve(React);
6+
7+
<div>Hi</div>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as React from "react";
2+
3+
React.createElement('div', {});
4+
5+
createElement('someFunction');
6+
7+
<div>Hi</div>;

transforms/__testfixtures__/update-react-imports/typescript/variable-already-used.tsx.output.js

Whitespace-only changes.

transforms/__tests__/update-react-imports-test.js

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,28 @@
88

99
'use strict';
1010

11+
const flowOnlyTests = [
12+
'flow-default-and-type-specifier-import-react-variable',
13+
'flow-default-and-type-specifier-import',
14+
'react-type-not-removed',
15+
'react-type-default-export',
16+
];
17+
18+
const tsOnlyTests = [
19+
'preserve-types-namespace',
20+
'preserve-types-default',
21+
];
22+
1123
const tests = [
1224
'default-and-multiple-specifiers-import-react-variable',
1325
'default-and-multiple-specifiers-import',
14-
'flow-default-and-type-specifier-import-react-variable',
15-
'flow-default-and-type-specifier-import',
1626
'jsx-element',
1727
'jsx-fragment',
1828
'leading-comment',
1929
'react-basic-default-export-jsx-element-react-variable',
2030
'react-basic-default-export-jsx-element',
2131
'react-basic-default-export',
22-
'react-type-default-export',
2332
'react-not-removed',
24-
'react-type-not-removed',
2533
'variable-already-used',
2634
'react-jsx-member-expression',
2735
'react-already-used-named-export',
@@ -35,11 +43,37 @@ jest.mock('../update-react-imports', () => {
3543

3644
const defineTest = require('jscodeshift/dist/testUtils').defineTest;
3745

38-
tests.forEach((test) => {
46+
[...tests, ...flowOnlyTests].forEach((test) => {
3947
defineTest(
4048
__dirname,
4149
'update-react-imports',
4250
null,
4351
`update-react-imports/${test}`
4452
);
4553
});
54+
55+
describe('typescript', () => {
56+
beforeEach(() => {
57+
jest.mock('../update-react-imports', () => {
58+
return Object.assign(
59+
require.requireActual('../update-react-imports'),
60+
{
61+
parser: 'tsx'
62+
}
63+
);
64+
});
65+
});
66+
67+
afterEach(() => {
68+
jest.resetModules();
69+
});
70+
71+
[...tests, ...tsOnlyTests].forEach((test) => {
72+
defineTest(
73+
__dirname,
74+
'update-react-imports',
75+
null,
76+
`update-react-imports/typescript/${test}.tsx`
77+
);
78+
});
79+
});

transforms/update-react-imports.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,16 @@ module.exports = function(file, api, options) {
4040
const reactImportPaths = root
4141
.find(j.ImportDeclaration, {
4242
type: 'ImportDeclaration',
43-
source: {
44-
type: 'Literal',
45-
},
4643
})
4744
.filter(path => {
4845
return (
49-
path.value.source.value === 'React' ||
50-
path.value.source.value === 'react'
46+
(
47+
path.value.source.type === 'Literal' ||
48+
path.value.source.type === 'StringLiteral'
49+
) && (
50+
path.value.source.value === 'React' ||
51+
path.value.source.value === 'react'
52+
)
5153
);
5254
});
5355

0 commit comments

Comments
 (0)