If you've spent any amount of time using your computer's terminal, chances are you've been asked to confirm an action by typing y or n and pressing Enter.
Are you sure you want to continue? [y/n]Implementing this functionality takes some careful consideration in order to get it right.
For starters, your boolean question must understand both y/n and yes/no answers. The easiest way to handle this would be a regular expression for each answer, such as (y|yes) and (n|no).
Additionally, you want to invalidate user input that doesn't match the expected answers. For example, if the user types yess or nope, that is not a valid answer and the result should use the default value specified. Adding positional anchors to the regular expressions, such as ^(y|yes)$ and ^(n|no)$, will ensure that the entire string is matched.
Finally, you want the check to be case-insensitive, so that Y and y are treated the same. You can do this by adding the i flag to your regular expressions, such as /^(y|yes)$/i and /^(n|no)$/i.
Putting it all together, you can use RegExp.prototype.test() and the ternary operator (?) to check if the string matches the expected answers and return the appropriate boolean value.
const yesNo = (val, def = false) =>
  /^(y|yes)$/i.test(val) ? true : /^(n|no)$/i.test(val) ? false : def;
yesNo('Y'); // true
yesNo('yes'); // true
yesNo('No'); // false
yesNo('Foo', true); // true