Huáng Jùnliàng eea3065039
Update pathCache in NodePath#_replaceWith (#12391)
* add tests on regression 12386

* fix: update cache on _replaceWith

* fix: pathCache in replaceWithMultiple could be nullish

* Update packages/babel-traverse/src/path/replacement.js

Co-authored-by: Nicolò Ribaudo <nicolo.ribaudo@gmail.com>

* test: add replaceWith test to traverse

Co-authored-by: Brian Ng <bng412@gmail.com>
Co-authored-by: Nicolò Ribaudo <nicolo.ribaudo@gmail.com>
2020-11-24 15:07:20 -05:00

77 lines
2.4 KiB
JavaScript

import traverse from "../lib";
import { parse } from "@babel/parser";
import generate from "@babel/generator";
import * as t from "@babel/types";
function getPath(code) {
const ast = parse(code);
let path;
traverse(ast, {
Program: function (_path) {
path = _path.get("body.0");
_path.stop();
},
});
return path;
}
function generateCode(path) {
return generate(path.parentPath.node).code;
}
describe("conversion", function () {
describe("ensureBlock", function () {
it("throws converting node without body to block", function () {
const rootPath = getPath("true;");
expect(() => {
rootPath.ensureBlock();
}).toThrow();
});
it("throws converting already block array", function () {
const rootPath = getPath("function test() { true; }").get("body");
expect(() => {
rootPath.ensureBlock();
}).toThrow();
});
it("converts arrow function with expression body to block", function () {
const rootPath = getPath("() => true").get("expression");
rootPath.ensureBlock();
expect(generateCode(rootPath)).toBe("() => {\n return true;\n};");
});
it("preserves arrow function body's context", function () {
const rootPath = getPath("() => true").get("expression");
const body = rootPath.get("body");
rootPath.ensureBlock();
body.replaceWith(t.booleanLiteral(false));
expect(generateCode(rootPath)).toBe("() => {\n return false;\n};");
});
it("preserves arrow function body's context", function () {
const rootPath = getPath("() => true").get("expression");
const body = rootPath.get("body");
rootPath.ensureBlock();
body.replaceWithMultiple([t.booleanLiteral(false), t.emptyStatement()]);
expect(generateCode(rootPath)).toBe("() => {\n return false;\n};");
});
it("converts for loop with statement body to block", function () {
const rootPath = getPath("for (;;) true;");
rootPath.ensureBlock();
expect(generateCode(rootPath)).toBe("for (;;) {\n true;\n}");
});
it("preserves for loop body's context", function () {
const rootPath = getPath("for (;;) true;");
const body = rootPath.get("body");
rootPath.ensureBlock();
body.replaceWith(t.booleanLiteral(false));
expect(generateCode(rootPath)).toBe("for (;;) {\n false;\n}");
});
});
});