retain-first-comment.md 1.7 KB

Retain comment on first line

Problem

When removing or replacing the first statement in a file, it is possible for leading comments at the top of the file to be removed.

Solution

To retain the leading comments during a transformation, the comments array on the statement's node must be copied to the next statement's node that will be at the top of the file.

Examples

Bad

Transform
|> click here to run codeexport default function transformer(file, api) {
  const j = api.jscodeshift;

  return j(file.source)
    .find(j.VariableDeclaration)
    .replaceWith(
        j.expressionStatement(j.callExpression(
                j.identifier('foo'), []
            )
        )
    )
    .toSource();
};
In
|> click here to run code// Comment on first line
const firstStatement = require('some-module');
Out
|> click here to run codefoo();

Good

Transform
|> click here to run codeexport default function transformer(file, api) {
  const j = api.jscodeshift;
  const root = j(file.source);

  const getFirstNode = () => root.find(j.Program).get('body', 0).node;

  // Save the comments attached to the first node
  const firstNode = getFirstNode();
  const { comments } = firstNode;

  root.find(j.VariableDeclaration).replaceWith(
    j.expressionStatement(j.callExpression(
        j.identifier('foo'),
        []
    ))
  );

  // If the first node has been modified or deleted, reattach the comments
  const firstNode2 = getFirstNode();
  if (firstNode2 !== firstNode) {
    firstNode2.comments = comments;
  }

  return root.toSource();
};
In
|> click here to run code// Comment on first line
const firstStatement = require('some-module');
Out
|> click here to run code// Comment on first line
foo();