Codemod to safely convert JavaScript and TypeScript function declarations into equivalent const arrow-function expressions.
// before
export function getUser<
// user id type
ID extends string | number,
>(id: ID): Promise<User> {
return db.users.find(id)
}
// after (auto-generated)
export const getUser = <
// user id type
ID extends string | number,
>(id: ID): Promise<User> => {
return db.users.find(id)
}Works with .ts, .tsx, .js, and .jsx files. The default scan targets TypeScript files (**/*.{ts,tsx}) because that is the most common codemod target, but JavaScript is fully supported when you pass a JS-inclusive glob. See the node tests for documented conversion and skip examples.
run in the root of your repo - converts TypeScript files in the current directory and subdirectories:
npx convert-to-arrowor specify a sub-folder / glob. Directory inputs default to **/*.{ts,tsx} and always exclude node_modules:
npx convert-to-arrow srcMore path options see advanced usage
- Commit/stash your work first – revert is instant.
- Run the codemod
- Review the diff
- Run test suite / type-checking
- Check the files for identation changes – the codemod tries to preserve the original formatting, but it may not always succeed.
The CLI currently exposes one optional path argument. It can be either a directory or an explicit glob:
node_modules is always excluded from conversion, including when you pass a broad glob.
# convert only files under ./src
npx -y convert-to-arrow src
# convert two workspaces
npx -y convert-to-arrow "packages/*/src"
# full glob (quotes required for zsh)
npx -y convert-to-arrow "**/*.tsx"
# include JavaScript and TypeScript explicitly
npx -y convert-to-arrow "**/*.{js,jsx,ts,tsx}"Pass --report to append a compact list of skipped functions to the normal conversion output:
npx -y convert-to-arrow --report src
# the flag can also come after the path/glob
npx -y convert-to-arrow src --reportExample report output:
🗂 Report: 2 skipped functions:
• trackLog... - /absolute/path/to/src/log.ts:12 - referenced before declaration
• collectA... - /absolute/path/to/src/runtime.ts:34 - uses arguments
Skipped functions are left unchanged when converting them would change runtime behavior or produce invalid output.
git clone https://github.com/richard-unterberg/convert-to-arrow
cd convert-to-arrow
npm i # install dependencies
npm run lefthook # git hooks
npm run test # builds the codemod and runs the node:test suite against dist/cli.js
npm run build # build the codemod - see dist
npm run verify # run repository checksPull requests & issues are welcome!