codeshift-transform-declared-arrow-to-func-dec

jscodeshift transform to convert arrow function expressions, assigned to variables at the point of declaration, into traditional function declarations

GPL-3.0 License

Stars
2
Committers
2

Codeshift Declared Arrow Expression to Function Declaration Transform

jscodeshift transform to convert arrow function expressions, assigned to variable declarations, into traditional function declarations

Before:

const foo = 1;
const bar = 2;

const add = (a: number, b: number) => {
  return a + b;
};

add(foo, bar);

After:

const foo = 1;
const bar = 2;

function add(a: number, b: number) {
  return a + b;
}

add(foo, bar);

This transform applies to any arrow expression that is assigned to a variable (var/let/const) at the point of declaration.

Usage

$ npm i -DE codeshift-transform-declared-arrow-to-func-dec
$ jscodeshift -t node_modules/codeshift-transform-declared-arrow-to-func-dec/dist/index.js some-source-file.js

Examples

Implied/implicit return

Before:

const f = () => 1;

After:

function f() {
  return 1;
}

Async functions

Before:

const get = async () => {
  const res = await fetch('/foo');
  return res.json();
};

After:

async function get() {
  const res = await fetch('/foo');
  return res.json();
}

Exported functions

Before:

export const f = () => Promise.resolve('Yay!');

After:

export function f() {
  return Promise.resolve('Yay!');
}

Complex functions

Before:

const f = () => {
  const a = 1;
  const b = 2;
  const c = 3;
  const sum = (seed: number) => [a, b, c].reduce((total, n) => total + n, seed);

  return sum(0);
};

After:

function f() {
  const a = 1;
  const b = 2;
  const c = 3;

  function sum(seed: number) {
    return [a, b, c].reduce((total, n) => total + n, seed);
  }

  return sum(0);
}

Unsupported functionality

The following examples are not supported by the transform (but might be introduced in the next major version).

Deferred function assignments

type F = (x: number) => number;

let f: F;

f = x => x + 1; // will not be transformed!

Rebinding this

function f() {
  const g = () => { // Will be transformed into a function declaration...
    console.log(this); // ...but `this` will no longer refer to f's context!
  };
  
  g();
}

f.call('Hello!');