codemods/babel-plugin-codemod-object-assign-to-object-spread/src/index.js

Summary

Maintainability
A
1 hr
Test Coverage
import syntaxObjectRestSpread from "@babel/plugin-syntax-object-rest-spread";

export default function ({ types: t }) {
  return {
    inherits: syntaxObjectRestSpread,

    visitor: {
      CallExpression(path) {
        if (!path.get("callee").matchesPattern("Object.assign")) return;

        const args = path.get("arguments");
        if (args.length === 0) return;

        const [objPath] = args;
        if (!objPath.isObjectExpression()) return;

        const obj = objPath.node;
        const { properties } = obj;

        for (let i = 1; i < args.length; i++) {
          const arg = args[i];
          const { node } = arg;

          if (arg.isObjectExpression()) {
            properties.push(...node.properties);
          } else {
            properties.push(t.spreadElement(node));
          }
        }

        path.replaceWith(obj);
      },
    },
  };
}