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:
a && a.b
becomesa?.b
_.get(foo, 'a.b')
and_.get(foo, ['a', 'b'])
becomesfoo?.a?.b
_.get(foo, 'a.b', defaultValue)
becomesfoo?.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.
$ yarn global add optional-chaining-codemod
or
$ npm install -g optional-chaining-codemod
$ optional-chaining-codemod ./**/*.js --ignore-pattern="**/node_modules/**"
with flow parser:
$ optional-chaining-codemod ./**/*.js --ignore-pattern="**/node_modules/**" --parser=flow
with typescript parser:
$ optional-chaining-codemod ./**/*.ts --ignore-pattern="**/node_modules/**" --parser=ts
with typescript+react parser:
$ 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:
$ 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:
--skipVariables
to skip variables passed to lodashget
--skipTemplateStrings
to skip template strings passed to lodashget
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.