Skip to content

ts-morph incorrectly transforms nodes which begin with whitespace #1591

@ofersadgat

Description

@ofersadgat

if you have a node such as:

<Text><Text>Foo</Text> is great</Text>

and you do a transform:

node.transform((traversal) => {
    if (ts.isJsxText(traversal.currentNode) && traversal.currentNode.text != 'Foo'){
        return traversal.factory.createJsxText(' is NOT great', false);
    } else {
        return traversal.visitChildren();
    }
});

the result should be:

<Text><Text>Foo</Text> is NOT great</Text>

but it is:

<Text><Text>Foo</Text>  is NOT great</Text>

instead. Notice how an extra space was added. This is due to the following error in the code:

        function handleTransformation(oldNode, newNode) {
            if (oldNode === newNode && newNode.emitNode == null)
                return;
            const start = oldNode.getStart(compilerSourceFile, true); //This is the error: start should be oldNode.pos which correctly accounts for whitespace
            const end = oldNode.end;
            let lastTransformation;
            while ((lastTransformation = transformations[transformations.length - 1]) && lastTransformation.start > start)
                transformations.pop();
            const wrappedNode = compilerFactory.getExistingNodeFromCompilerNode(oldNode);
            transformations.push({
                start,
                end,
                compilerNode: newNode,
            });
            if (wrappedNode != null) {
                if (oldNode.kind !== newNode.kind)
                    wrappedNode.forget();
                else
                    wrappedNode.forgetDescendants();
            }
        }

As I noted in the comment, it is using an incorrect way of getting the start of the node and should be using .pos.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions