Description
Elsewhere I've mentioned I think the goal of strict: true
should be that you can write a well-behaved script just by calling parseArgs
with your options configured, with no further validation required (except validation of the values of value-taking options, which is out of scope). Here by "well-behaved" I mean it will surface an error to the user if they try to use the script in a way the author did not intend.
Right now, if I'm writing a script which does not expect positional arguments, and I do the obvious thing of
let { values } = util.parseArgs({ options });
but the user passes a positional argument, I'm never going to notice, and the user's input is going to be silently dropped. And it's very likely that I'll end up shipping this, because it's probably not going to occur to me to try passing a positional argument and so I will never notice this problem.
That seems contrary to the goal above. So I'd like to suggest having a positionals
configuration option, which must be explicitly opted into (when strict: true
). For people who want positionals, this ought to be a small hiccup: they'll notice right away that passing a positional argument doesn't work. And for people who don't, they'll get the right behavior. So neither group is at risk of shipping a script which is not well-behaved.
(Good errors help here: e.g., "this script has not been configured to take positional arguments" is clear to users that they're misusing the script, and to authors who want to take positional arguments that they need to configure it to take positional arguments.)
Another advantage of having this piece of information is that it lets you improve error messages. If the parser encounters an unknown flag --foo
, and the script author has explicitly opted in to positionals, the error message can suggest that if the user intended to pass --foo
as a positional argument they can do so by putting -- --foo
at the end of the command invocation. But you wouldn't want to suggest this in a script which isn't using positionals.