Skip to content

Commit c97e501

Browse files
author
Mohsen Azimi
committed
wip
1 parent abbbb57 commit c97e501

File tree

10 files changed

+104
-19
lines changed

10 files changed

+104
-19
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ node_modules
22
dist
33
.DS_Store
44
coverage/
5-
.log
5+
*.log

.vscode/launch.json

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,22 @@
22
"version": "0.2.0",
33
"configurations": [
44
{
5-
"args": [],
6-
"cwd": "${workspaceRoot}",
7-
"env": {
8-
"NODE_ENV": "test"
9-
},
10-
"console": "internalConsole",
11-
"name": "Run Tests",
12-
"outFiles": ["${workspaceRoot}/dist"],
13-
"preLaunchTask": "tsc",
14-
"program": "${workspaceRoot}/node_modules/.bin/jest",
5+
"type": "node",
156
"request": "launch",
16-
"runtimeArgs": [],
17-
"runtimeExecutable": null,
18-
"sourceMaps": true,
19-
"stopOnEntry": false,
20-
"type": "node"
7+
"name": "Jest All",
8+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
9+
"args": ["--runInBand"],
10+
"console": "integratedTerminal",
11+
"internalConsoleOptions": "neverOpen"
2112
},
2213
{
23-
"name": "Attach",
2414
"type": "node",
25-
"request": "attach",
26-
"port": 5858
15+
"request": "launch",
16+
"name": "Jest A single case (edit config)",
17+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
18+
"args": ["-t", "remove-default-export-variable-assignment-transform basic"],
19+
"console": "integratedTerminal",
20+
"internalConsoleOptions": "neverOpen"
2721
}
2822
]
2923
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
Transforms React code written in JavaScript to TypeScript.
66

77
[**🖥 Download the VSCode Extension**](https://marketplace.visualstudio.com/items?itemName=mohsen1.react-javascript-to-typescript-transform-vscode)
8+
89
## Features:
910

1011
* Proxies `PropTypes` to `React.Component` generic type and removes PropTypes

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { collapseIntersectionInterfacesTransformFactoryFactory } from './transfo
99
import { reactRemoveStaticPropTypesMemberTransformFactoryFactory } from './transforms/react-remove-static-prop-types-member-transform';
1010
import { reactStatelessFunctionMakePropsTransformFactoryFactory } from './transforms/react-stateless-function-make-props-transform';
1111
import { reactRemovePropTypesImportTransformFactoryFactory } from './transforms/react-remove-prop-types-import';
12+
import { removeDefaultExportVariableAssignmentTransformFactoryFactory } from './transforms/remove-default-export-variable-assignment-transform';
1213

1314
export {
1415
reactMovePropTypesToClassTransformFactoryFactory,
@@ -18,6 +19,7 @@ export {
1819
reactRemovePropTypesAssignmentTransformFactoryFactory,
1920
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
2021
reactRemovePropTypesImportTransformFactoryFactory,
22+
removeDefaultExportVariableAssignmentTransformFactoryFactory,
2123
compile,
2224
};
2325

@@ -29,6 +31,7 @@ export const allTransforms = [
2931
reactRemovePropTypesAssignmentTransformFactoryFactory,
3032
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
3133
reactRemovePropTypesImportTransformFactoryFactory,
34+
removeDefaultExportVariableAssignmentTransformFactoryFactory,
3235
];
3336

3437
export type TransformFactoryFactory = (typeChecker: ts.TypeChecker) => ts.TransformerFactory<ts.SourceFile>;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import * as ts from 'typescript';
2+
import * as _ from 'lodash';
3+
4+
import * as helpers from '../helpers';
5+
6+
/**
7+
* Remove default export variable assignment
8+
*
9+
* @example
10+
* Before:
11+
* export default const foo: string = 'str';
12+
*
13+
* After
14+
* const foo: string = 'str';
15+
* export default foo;
16+
*/
17+
export function removeDefaultExportVariableAssignmentTransformFactoryFactory(
18+
typeChecker: ts.TypeChecker,
19+
): ts.TransformerFactory<ts.SourceFile> {
20+
return function removeDefaultExportVariableAssignmentTransformFactory(context: ts.TransformationContext) {
21+
return function removeDefaultExportVariableAssignmentTransform(sourceFile: ts.SourceFile) {
22+
const visited = visitSourceFile(sourceFile, typeChecker);
23+
ts.addEmitHelpers(visited, context.readEmitHelpers());
24+
return visited;
25+
};
26+
};
27+
}
28+
29+
function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) {
30+
let statements = _.toArray(sourceFile.statements);
31+
const newStatements = [];
32+
33+
let index = 0;
34+
while (index < statements.length) {
35+
const statement = statements[index];
36+
const nextStatement = statements[index + 1];
37+
let statementText;
38+
try {
39+
statementText = statement.getText();
40+
} catch {}
41+
42+
if (
43+
nextStatement &&
44+
ts.isExportAssignment(statement) &&
45+
statementText === 'export default' &&
46+
ts.isVariableStatement(nextStatement)
47+
) {
48+
// push variable declaration
49+
newStatements.push(nextStatement);
50+
51+
// push export default for variable declaration
52+
const identifer = ts.createIdentifier(
53+
nextStatement.declarationList.declarations[0] &&
54+
nextStatement.declarationList.declarations[0].name.getText(),
55+
);
56+
const defaultExport = ts.createExportDefault(identifer);
57+
newStatements.push(defaultExport);
58+
59+
// skip next statement because we pushed nextStatement already
60+
index++;
61+
} else {
62+
newStatements.push(statement);
63+
}
64+
index++;
65+
}
66+
return ts.updateSourceFileNode(sourceFile, newStatements);
67+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export default function Hello({ message }) {
2+
return <div>hello {message}</div>
3+
}
4+
5+
Hello.propTypes = {
6+
message: React.PropTypes.string,
7+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
type HelloProps = {
2+
message?: string,
3+
};
4+
const Hello: React.SFC<HelloProps> = ({ message }) => {
5+
return <div>hello {message}</div>;
6+
};
7+
8+
export default Hello;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default const foo: string = 'str';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const foo: string = 'str';
2+
export default foo;

test/transformers.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
1818
collapseIntersectionInterfacesTransformFactoryFactory,
1919
reactRemovePropTypesImportTransformFactoryFactory,
20+
removeDefaultExportVariableAssignmentTransformFactoryFactory,
2021
allTransforms,
2122
compile,
2223
TransformFactoryFactory
@@ -32,6 +33,7 @@ const transformToFolderMap: [string, TransformFactoryFactory[]][] = [
3233
['collapse-intersection-interfaces-transform', [collapseIntersectionInterfacesTransformFactoryFactory]],
3334
['react-move-prop-types-to-class-transform', [reactMovePropTypesToClassTransformFactoryFactory]],
3435
['react-remove-prop-types-import', [reactRemovePropTypesImportTransformFactoryFactory]],
36+
['remove-default-export-variable-assignment-transform', [removeDefaultExportVariableAssignmentTransformFactoryFactory]],
3537
['end-to-end', allTransforms],
3638
];
3739

0 commit comments

Comments
 (0)