Skip to content

Commit

Permalink
fix: cloneNode(deep, withoutLoc) handles absent comments
Browse files Browse the repository at this point in the history
This fragment (maybe all fragments?) throw during cloning, as
'comments' is unset here. Handle it being unset, by returning
undefined.
  • Loading branch information
FauxFaux committed Jan 10, 2021
1 parent 4f83a09 commit f21a48b
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
14 changes: 11 additions & 3 deletions packages/babel-types/src/clone/cloneNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ export default function cloneNode<T extends t.Node>(
return newNode;
}

function cloneCommentsWithoutLoc<T extends t.Comment>(comments: T[]): T[] {
function cloneCommentsWithoutLoc<T extends t.Comment>(
comments: ReadonlyArray<T>,
): T[] {
return comments.map(
({ type, value }) =>
({
Expand All @@ -113,6 +115,12 @@ function cloneCommentsWithoutLoc<T extends t.Comment>(comments: T[]): T[] {
);
}

function maybeCloneComments(comments, deep, withoutLoc) {
return deep && withoutLoc ? cloneCommentsWithoutLoc(comments) : comments;
function maybeCloneComments<T extends t.Comment>(
comments: ReadonlyArray<T> | null,
deep: boolean,
withoutLoc: boolean,
): ReadonlyArray<T> | null {
return deep && withoutLoc && comments
? cloneCommentsWithoutLoc(comments)
: comments;
}
8 changes: 8 additions & 0 deletions packages/babel-types/test/cloning.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ describe("cloneNode", function () {
expect(t.isNodesEquivalent(node, cloned)).toBe(true);
});

it("should handle deep cloning without loc of fragments", function () {
const program = "foo();";
const node = parse(program);
const cloned = t.cloneNode(node, /* deep */ true, /* withoutLoc */ true);
expect(node).not.toBe(cloned);
expect(t.isNodesEquivalent(node, cloned)).toBe(true);
});

it("should handle missing array element", function () {
const node = parse("[,0]");
const cloned = t.cloneNode(node);
Expand Down

0 comments on commit f21a48b

Please sign in to comment.