Codemod to migrate from Lodash get and logical and expressions to optional chaining
npm install optional-chaining-codemod


This is a codemod to migrate different types of lodash get calls and a && a.b kind of
expressions to use optional chaining
and nullish coalescing instead.
Following babel plugins are required to transpile optional chaining and nullish
coalescing:
- babel-plugin-proposal-optional-chaining
- babel-plugin-proposal-nullish-coalescing-operator
- a && a.b becomes a?.b
- _.get(foo, 'a.b') and _.get(foo, ['a', 'b']) becomes foo?.a?.b
- _.get(foo, 'a.b', defaultValue) becomes foo?.a?.b ?? defaultValue
You can check out the __textfixtures__ folder to see full list of supported transformations.
- When using static type checkers like Flow or Typescript,
optional chaining provides much better type safety than lodash get. Optional chaining is standard Javascript
feature.
- It also has a neater syntax than chaining && expressions one after another.
``bash`
$ yarn global add optional-chaining-codemod
or
`bash`
$ npm install -g optional-chaining-codemod
`bash`
$ optional-chaining-codemod .//.js --ignore-pattern="/node_modules/*"
with flow parser:
`bash`
$ optional-chaining-codemod .//.js --ignore-pattern="/node_modules/*" --parser=flow
with typescript parser:
`bash`
$ optional-chaining-codemod .//.ts --ignore-pattern="/node_modules/*" --parser=ts
with typescript+react parser:
`bash`
$ optional-chaining-codemod ./*/.tsx --parser=tsx
The CLI is the same as in jscodeshift
except you can omit the transform file.
Alternatively, you can run the codemod using jscodeshift as follows:
`bash`
$ yarn global add jscodeshift
$ yarn add optional-chaining-codemod
$ jscodeshift -t node_modules/optional-chaining-codemod/transform.js --ignore-pattern="/node_modules/" ./*/.js
This codemod has two flags:
1. --skipVariables to skip variables passed to lodash get--skipTemplateStrings
2. to skip template strings passed to lodash get
Especially the first case is risky as the variable might actually be something
like var bar = "a.b.c" and produce from _.get(foo, bar) following: foo?[bar] although lodash would treat it like foo?.a?.b?.c"`.
Contributions are more than welcome! One area of improvement could be e.g
better CLI or finding out new areas to migrate to use optional chaining.