From 5287e138176bc7ea18cb12f6e6e2aa821e1eefb7 Mon Sep 17 00:00:00 2001 From: MrSpider Date: Fri, 10 Mar 2017 20:41:03 +0100 Subject: [PATCH] Fix replacing function declaration in export default (fixes #4468) (#5444) --- .../babel-traverse/src/path/replacement.js | 3 +- packages/babel-traverse/test/replacement.js | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/babel-traverse/test/replacement.js diff --git a/packages/babel-traverse/src/path/replacement.js b/packages/babel-traverse/src/path/replacement.js index a2028e6d8b..e82bba5b39 100644 --- a/packages/babel-traverse/src/path/replacement.js +++ b/packages/babel-traverse/src/path/replacement.js @@ -125,7 +125,8 @@ export function replaceWith(replacement) { if (this.isNodeType("Statement") && t.isExpression(replacement)) { if ( !this.canHaveVariableDeclarationOrExpression() && - !this.canSwapBetweenExpressionAndStatement(replacement) + !this.canSwapBetweenExpressionAndStatement(replacement) && + !this.parentPath.isExportDefaultDeclaration() ) { // replacing a statement with an expression so wrap it in an expression statement replacement = t.expressionStatement(replacement); diff --git a/packages/babel-traverse/test/replacement.js b/packages/babel-traverse/test/replacement.js new file mode 100644 index 0000000000..eb29364f2f --- /dev/null +++ b/packages/babel-traverse/test/replacement.js @@ -0,0 +1,28 @@ +import traverse from "../lib"; +import assert from "assert"; +import { parse } from "babylon"; +import * as t from "babel-types"; + +describe("path/replacement", function () { + describe("replaceWith", function () { + const ast = parse("export default function() {};", { sourceType: "module" }); + + it("replaces declaration in ExportDefaultDeclaration node", function() { + traverse(ast, { + FunctionDeclaration(path) { + path.replaceWith(t.arrayExpression([ + t.functionExpression( + path.node.id, + path.node.params, + path.node.body, + path.node.generator, + path.node.async + ), + ])); + }, + }); + + assert(ast.program.body[0].declaration.type == "ArrayExpression"); + }); + }); +});