Skip to content

Commit 47572e0

Browse files
committed
fix(formatting): fix an edge case where number and string childrens are not correctly merged
1 parent b50fe85 commit 47572e0

File tree

2 files changed

+29
-23
lines changed

2 files changed

+29
-23
lines changed

src/formatter/mergeSiblingPlainStringChildrenReducer.js

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,20 @@
22

33
import type { TreeNode } from './../tree';
44

5+
const areMergeable = (nodeA: TreeNode, nodeB: TreeNode): boolean =>
6+
(nodeA.type === 'string' || nodeA.type === 'number') &&
7+
(nodeB.type === 'string' || nodeB.type === 'number');
8+
59
export default (
610
previousNodes: TreeNode[],
711
currentNode: TreeNode
812
): TreeNode[] => {
913
const lastNode = previousNodes[previousNodes.length - 1];
10-
const newNode = { ...currentNode };
11-
12-
if (newNode.type === 'number') {
13-
newNode.type = 'string';
14-
newNode.value = String(newNode.value);
15-
}
1614

17-
if (
18-
lastNode &&
19-
lastNode.type === 'string' &&
20-
typeof lastNode.value === 'string' &&
21-
newNode.type === 'string'
22-
) {
23-
lastNode.value += newNode.value || '';
15+
if (lastNode && areMergeable(lastNode, currentNode)) {
16+
lastNode.value = String(lastNode.value) + String(currentNode.value);
2417
} else {
25-
previousNodes.push(newNode);
18+
previousNodes.push(currentNode);
2619
}
2720

2821
return previousNodes;

src/formatter/mergeSiblingPlainStringChildrenReducer.spec.js

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,35 @@ test('mergeSiblingPlainStringChildrenReducer should merge sibling string tree no
2424
]);
2525
});
2626

27-
test('mergeSiblingPlainStringChildrenReducer should merge consider number as string', () => {
28-
const childrens: TreeNode[] = [
29-
createScalarTreeNode('string', 'a'),
30-
createScalarTreeNode('number', 51),
31-
createScalarTreeNode('string', 'c'),
32-
];
33-
34-
expect(childrens.reduce(mergeSiblingPlainStringChildrenReducer, [])).toEqual([
27+
test('mergeSiblingPlainStringChildrenReducer should consider number as string', () => {
28+
expect(
29+
[
30+
createScalarTreeNode('string', 'a'),
31+
createScalarTreeNode('number', 51),
32+
createScalarTreeNode('string', 'c'),
33+
].reduce(mergeSiblingPlainStringChildrenReducer, [])
34+
).toEqual([
3535
{
3636
type: 'string',
3737
value: 'a51c',
3838
},
3939
]);
40+
41+
expect(
42+
[
43+
createScalarTreeNode('string', 5),
44+
createScalarTreeNode('number', 1),
45+
createScalarTreeNode('string', 'a'),
46+
].reduce(mergeSiblingPlainStringChildrenReducer, [])
47+
).toEqual([
48+
{
49+
type: 'string',
50+
value: '51a',
51+
},
52+
]);
4053
});
4154

42-
test('mergeSiblingPlainStringChildrenReducer should merge detect non string node', () => {
55+
test('mergeSiblingPlainStringChildrenReducer should detect non string node', () => {
4356
const childrens: TreeNode[] = [
4457
createReactElementTreeNode(['foo']),
4558
createScalarTreeNode('string', 'a'),

0 commit comments

Comments
 (0)