* 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>
77 lines
2.4 KiB
JavaScript
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}");
|
|
});
|
|
});
|
|
});
|