Skip to content

Commit

Permalink
fix transform-flow-comments for import types
Browse files Browse the repository at this point in the history
  • Loading branch information
tanhauhau committed Apr 26, 2019
1 parent d7757f6 commit 64870e6
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 5 deletions.
4 changes: 3 additions & 1 deletion packages/babel-plugin-transform-flow-comments/package.json
Expand Up @@ -16,10 +16,12 @@
"@babel/plugin-syntax-flow": "^7.2.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
"@babel/core": "^7.0.0-0",
"@babel/generator": "^7.0.0-0"
},
"devDependencies": {
"@babel/core": "^7.4.0",
"@babel/generator": "^7.4.0",
"@babel/helper-plugin-test-runner": "^7.0.0"
}
}
40 changes: 36 additions & 4 deletions packages/babel-plugin-transform-flow-comments/src/index.js
@@ -1,21 +1,26 @@
import { declare } from "@babel/helper-plugin-utils";
import syntaxFlow from "@babel/plugin-syntax-flow";
import { types as t } from "@babel/core";
import generateCode from "@babel/generator";

export default declare(api => {
api.assertVersion(7);

function wrapInFlowComment(path, parent) {
function attachComment(path, comment) {
let attach = path.getPrevSibling();
let where = "trailing";
if (!attach.node) {
attach = path.parentPath;
where = "inner";
}
attach.addComment(where, generateComment(path, parent));
attach.addComment(where, comment);
path.remove();
}

function wrapInFlowComment(path, parent) {
attachComment(path, generateComment(path, parent));
}

function generateComment(path, parent) {
let comment = path
.getSource()
Expand All @@ -26,6 +31,10 @@ export default declare(api => {
return comment;
}

function isTypeImport(importKind) {
return importKind === "type" || importKind === "typeof";
}

return {
name: "transform-flow-comments",
inherits: syntaxFlow,
Expand Down Expand Up @@ -122,10 +131,33 @@ export default declare(api => {
// support `import type A` and `import typeof A` #10
ImportDeclaration(path) {
const { node, parent } = path;
if (node.importKind !== "type" && node.importKind !== "typeof") {
if (isTypeImport(node.importKind)) {
wrapInFlowComment(path, parent);
return;
}
wrapInFlowComment(path, parent);

const typeSpecifiers = node.specifiers.filter(specifier =>
isTypeImport(specifier.importKind),
);

const nonTypeSpecifiers = node.specifiers.filter(
specifier => !isTypeImport(specifier.importKind),
);
node.specifiers = nonTypeSpecifiers;

if (typeSpecifiers.length > 0) {
const typeImportNode = t.cloneNode(node);
typeImportNode.specifiers = typeSpecifiers;

if (nonTypeSpecifiers.length > 0) {
path.addComment(
"trailing",
`:: ${generateCode(typeImportNode).code}`,
);
} else {
attachComment(path, `:: ${generateCode(typeImportNode).code}`);
}
}
},

Flow(path) {
Expand Down
@@ -0,0 +1,5 @@
import A, { B, type C, type D, E } from './types';
import F, { typeof G, H, type I } from './types';
import { type J } from './types';
import K, { L, M } from './types';
import './types';
@@ -0,0 +1,10 @@
import A, { B, E } from './types';
/*:: import { type C, type D } from './types';*/

import F, { H } from './types';
/*:: import { typeof G, type I } from './types';*/

/*:: import { type J } from './types';*/

import K, { L, M } from './types';
import './types';

0 comments on commit 64870e6

Please sign in to comment.