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

[wip] Break down default export with variable assignment #41

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 12 additions & 18 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,22 @@
"version": "0.2.0",
"configurations": [
{
"args": [],
"cwd": "${workspaceRoot}",
"env": {
"NODE_ENV": "test"
},
"console": "internalConsole",
"name": "Run Tests",
"outFiles": ["${workspaceRoot}/dist"],
"preLaunchTask": "tsc",
"program": "${workspaceRoot}/node_modules/.bin/jest",
"type": "node",
"request": "launch",
"runtimeArgs": [],
"runtimeExecutable": null,
"sourceMaps": true,
"stopOnEntry": false,
"type": "node"
"name": "Test All",
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
"args": ["--runInBand"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"name": "Attach",
"type": "node",
"request": "attach",
"port": 5858
"request": "launch",
"name": "Test A single case (edit 'args' config first)",
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
"args": ["-t", "end-to-end initial-state-and-proprypes-and-set-state"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,15 @@ Pass `-t` with transform name and case name space separated to `npm test`
```
npm test -- -t "react-js-make-props-and-state-transform propless-stateless"
```

#### Using Visual Studio Code to debug tests

To run all test run "Test All" from debug panel.

##### Run a single test

Edit `.vscode/launch.json` to add the same argument you pass to jest for your specific test.

##### Breakpoints work with test 🎉

Throw a breakpoint anywhere in code to stop the test there and inspect issue.
3 changes: 3 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { collapseIntersectionInterfacesTransformFactoryFactory } from './transfo
import { reactRemoveStaticPropTypesMemberTransformFactoryFactory } from './transforms/react-remove-static-prop-types-member-transform';
import { reactStatelessFunctionMakePropsTransformFactoryFactory } from './transforms/react-stateless-function-make-props-transform';
import { reactRemovePropTypesImportTransformFactoryFactory } from './transforms/react-remove-prop-types-import';
import { removeDefaultExportVariableAssignmentTransformFactoryFactory } from './transforms/remove-default-export-variable-assignment-transform';

export {
reactMovePropTypesToClassTransformFactoryFactory,
Expand All @@ -18,13 +19,15 @@ export {
reactRemovePropTypesAssignmentTransformFactoryFactory,
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
reactRemovePropTypesImportTransformFactoryFactory,
removeDefaultExportVariableAssignmentTransformFactoryFactory,
compile,
};

export const allTransforms = [
reactMovePropTypesToClassTransformFactoryFactory,
reactJSMakePropsAndStateInterfaceTransformFactoryFactory,
reactStatelessFunctionMakePropsTransformFactoryFactory,
removeDefaultExportVariableAssignmentTransformFactoryFactory,
collapseIntersectionInterfacesTransformFactoryFactory,
reactRemovePropTypesAssignmentTransformFactoryFactory,
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import * as ts from 'typescript';
import * as _ from 'lodash';

import * as helpers from '../helpers';

/**
* Remove default export variable assignment
*
* @example
* Before:
* export default const foo: string = 'str';
*
* After
* const foo: string = 'str';
* export default foo;
*/
export function removeDefaultExportVariableAssignmentTransformFactoryFactory(
typeChecker: ts.TypeChecker,
): ts.TransformerFactory<ts.SourceFile> {
return function removeDefaultExportVariableAssignmentTransformFactory(context: ts.TransformationContext) {
return function removeDefaultExportVariableAssignmentTransform(sourceFile: ts.SourceFile) {
const visited = visitSourceFile(sourceFile, typeChecker);
ts.addEmitHelpers(visited, context.readEmitHelpers());
return visited;
};
};
}

function visitSourceFile(sourceFile: ts.SourceFile, typeChecker: ts.TypeChecker) {
let statements = _.toArray(sourceFile.statements);
const newStatements = [];

let index = 0;
while (index < statements.length) {
const statement = statements[index];
const nextStatement = statements[index + 1];
let statementText;
try {
statementText = statement.getText();
} catch {}

if (
nextStatement &&
ts.isExportAssignment(statement) &&
statementText === 'export default' &&
ts.isVariableStatement(nextStatement)
) {
// push variable declaration
newStatements.push(nextStatement);

// push export default for variable declaration
const identifer = ts.createIdentifier(
nextStatement.declarationList.declarations[0] &&
nextStatement.declarationList.declarations[0].name.getText(),
);
const defaultExport = ts.createExportDefault(identifer);
newStatements.push(defaultExport);

// skip next statement because we pushed nextStatement already
index++;
} else {
newStatements.push(statement);
}
index++;
}
return ts.updateSourceFileNode(sourceFile, newStatements);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
type A = {
foo: string,
};

type B = {
foo: string | number,
bar: number,
};

type C = {
foo: string | number,
bar: number,
Expand Down
7 changes: 7 additions & 0 deletions test/end-to-end/stateless-function-exported-default/input.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default function Hello({ message }) {
return <div>hello {message}</div>
}

Hello.propTypes = {
message: React.PropTypes.string,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
type HelloProps = {
message?: string,
};
const Hello: React.SFC<HelloProps> = ({ message }) => {
return <div>hello {message}</div>;
};

export default Hello;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default const foo: string = 'str';
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
const foo: string = 'str';
export default foo;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import bar from 'bar';
export default const foo: string = 'str';

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import bar from 'bar';
const foo: string = 'str';
export default foo;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const bar = 1;
export default const foo: string = 'str';
let baz = 1;
export {baz};
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const bar = 1;
const foo: string = 'str';
export default foo;
let baz = 1;
export { baz };
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export default const foo: string = 'str';
var baz = 42;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const foo: string = 'str';
export default foo;
var baz = 42;
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
const bar = 1;
export default const foo: string = 'str';
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const bar = 1;
const foo: string = 'str';
export default foo;
2 changes: 2 additions & 0 deletions test/transformers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
reactRemoveStaticPropTypesMemberTransformFactoryFactory,
collapseIntersectionInterfacesTransformFactoryFactory,
reactRemovePropTypesImportTransformFactoryFactory,
removeDefaultExportVariableAssignmentTransformFactoryFactory,
allTransforms,
compile,
TransformFactoryFactory
Expand All @@ -32,6 +33,7 @@ const transformToFolderMap: [string, TransformFactoryFactory[]][] = [
['collapse-intersection-interfaces-transform', [collapseIntersectionInterfacesTransformFactoryFactory]],
['react-move-prop-types-to-class-transform', [reactMovePropTypesToClassTransformFactoryFactory]],
['react-remove-prop-types-import', [reactRemovePropTypesImportTransformFactoryFactory]],
['remove-default-export-variable-assignment-transform', [removeDefaultExportVariableAssignmentTransformFactoryFactory]],
['end-to-end', allTransforms],
];

Expand Down