In December 2019, optional chaining went to TC39 stage 4. Here is a regular expression to replace most instances of foo && foo.bar
and baz && baz()
with optional chaining.
Find: (\s)([.a-zA-Z]+) &&[\n\s]*(\2).?([^\s])
Replace: $1$3?.$4
Before:
const t1 = callback && callback(result);
const t2 = filename && filename.lenght;
const t3 =
error &&
error.innerError &&
error.innerError.code === 'invalid_token';
After:
const t1 = callback?.(result);
const t2 = filename?.lenght;
const t3 =
error?.innerError &&
error.innerError.code === 'invalid_token';
Isn't that nicer? Thank you TC39 and VS Code!

A further challenge is to find a regex that will cause the following replacement:
Before:
const t3 =
error?.innerError &&
error.innerError.code === 'invalid_token';
After:
const t3 = error?.innerError?.code === 'invalid_token';
Maybe someday.