Skip to content

Conversation

aweebit
Copy link
Contributor

@aweebit aweebit commented Aug 4, 2023

Problem

const { Command } = require('commander');

try {
  new Command('parent')
    .command('sub')
    .passThroughOptions(); // not allowed without enablePositionalOptions for parent
} catch (err) {
  console.error(err);
}

try {
  const parent = new Command('parent');
  const sub = new Command('sub')
    .passThroughOptions();
  parent.addCommand(sub); // allowed without enablePositionalOptions for parent
} catch (err) {
  console.error(err);
}
A check for this case is considered unnecessary, see comment
try {
  const parent = new Command('parent')
    .enablePositionalOptions();
  parent.command('sub')
    .passThroughOptions();
  parent.enablePositionalOptions(false); // allowed despite passThroughOptions for sub
} catch (err) {
  console.error(err);
}

Solution

Throw errors in all demonstrated cases. Additionally make the error message more meaningful by including the command name (similar to #1923 and #1924).

ChangeLog

Changed

  • Breaking: throw when a subcommand with passThroughOptions is added to a command without enablePositionalOptions

@shadowspawn
Copy link
Collaborator

I like catching the misconfiguration when using addCommand().

@shadowspawn
Copy link
Collaborator

This is the example case that convinced me this is worth doing, bypassed the check:

const parent = new Command('parent');
const sub = new Command('sub')
    .passThroughOptions();
parent.addCommand(sub); // allowed without enablePositionalOptions for parent

@aweebit aweebit changed the title Add missing checks for illegal passThroughOptions Add missing check for broken passThrough Aug 5, 2023
@shadowspawn shadowspawn added the semver: major Releasing requires a major version bump, not backwards compatible label Aug 5, 2023
@shadowspawn shadowspawn changed the base branch from develop to release/12.x August 5, 2023 00:40
@shadowspawn
Copy link
Collaborator

(Introduces a throw so better go in a major version.)

Copy link
Collaborator

@shadowspawn shadowspawn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am adding this review as a confirmation that requested changes will make it likely that merge accepted.

@aweebit
Copy link
Contributor Author

aweebit commented Aug 5, 2023

I am adding this review as a confirmation that requested changes will make it likely that merge accepted.

All the requested changes have been made now.

@shadowspawn
Copy link
Collaborator

(Thanks for all the tweaks.)

Copy link
Collaborator

@abetomo abetomo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

@abetomo abetomo merged commit ac8db3a into tj:release/12.x Aug 5, 2023
@aweebit
Copy link
Contributor Author

aweebit commented Aug 5, 2023

Thanks for the merge!

(Introduces a throw so better go in a major version.)

Should I set base to the next release branch when there is a breaking change? Or always to develop?

@aweebit aweebit deleted the feature/illegal-passThroughOptions branch August 5, 2023 07:08
@shadowspawn
Copy link
Collaborator

Using next release branch for base is appropriate when know PR contains breaking changes.

@shadowspawn shadowspawn added the pending release Merged into a branch for a future release, but not released yet label Aug 8, 2023
@shadowspawn shadowspawn removed the pending release Merged into a branch for a future release, but not released yet label Feb 3, 2024
Vylpes pushed a commit to Vylpes/random-bunny that referenced this pull request Apr 10, 2024
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [commander](https://github.com/tj/commander.js) | dependencies | major | [`^11.1.0` -> `^12.0.0`](https://renovatebot.com/diffs/npm/commander/11.1.0/12.0.0) |

---

### Release Notes

<details>
<summary>tj/commander.js (commander)</summary>

### [`v12.0.0`](https://github.com/tj/commander.js/blob/HEAD/CHANGELOG.md#1200-2024-02-03)

[Compare Source](tj/commander.js@v11.1.0...v12.0.0)

##### Added

-   `.addHelpOption()` as another way of configuring built-in help option (\[[#&#8203;2006](tj/commander.js#2006)])
-   `.helpCommand()` for configuring built-in help command (\[[#&#8203;2087](tj/commander.js#2087)])

##### Fixed

-   *Breaking:* use non-zero exit code when spawned executable subcommand terminates due to a signal (\[[#&#8203;2023](tj/commander.js#2023)])
-   *Breaking:* check `passThroughOptions` constraints when using `.addCommand` and throw if parent command does not have `.enablePositionalOptions()` enabled (\[[#&#8203;1937](tj/commander.js#1937)])

##### Changed

-   *Breaking:* Commander 12 requires Node.js v18 or higher (\[[#&#8203;2027](tj/commander.js#2027)])
-   *Breaking:* throw an error if add an option with a flag which is already in use (\[[#&#8203;2055](tj/commander.js#2055)])
-   *Breaking:* throw an error if add a command with name or alias which is already in use (\[[#&#8203;2059](tj/commander.js#2059)])
-   *Breaking:* throw error when calling `.storeOptionsAsProperties()` after setting an option value (\[[#&#8203;1928](tj/commander.js#1928)])
-   replace non-standard JSDoc of `@api private` with documented `@private` (\[[#&#8203;1949](tj/commander.js#1949)])
-   `.addHelpCommand()` now takes a Command (passing string or boolean still works as before but deprecated) (\[[#&#8203;2087](tj/commander.js#2087)])
-   refactor internal implementation of built-in help option (\[[#&#8203;2006](tj/commander.js#2006)])
-   refactor internal implementation of built-in help command (\[[#&#8203;2087](tj/commander.js#2087)])

##### Deprecated

-   `.addHelpCommand()` passing string or boolean (use `.helpCommand()` or pass a Command) (\[[#&#8203;2087](tj/commander.js#2087)])

##### Removed

-   *Breaking:* removed default export of a global Command instance from CommonJS (use the named `program` export instead) (\[[#&#8203;2017](tj/commander.js#2017)])

##### Migration Tips

**global program**

If you are using the [deprecated](./docs/deprecated.md#default-import-of-global-command-object) default import of the global Command object, you need to switch to using a named import (or create a new `Command`).

```js
// const program = require('commander');
const { program } = require('commander');
```

**option and command clashes**

A couple of configuration problems now throw an error, which will pick up issues in existing programs:

-   adding an option which uses the same flag as a previous option
-   adding a command which uses the same name or alias as a previous command

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4wLjAiLCJ1cGRhdGVkSW5WZXIiOiIzNy4wLjAiLCJ0YXJnZXRCcmFuY2giOiJkZXZlbG9wIn0=-->

Reviewed-on: https://gitea.vylpes.xyz/RabbitLabs/random-bunny/pulls/145
Reviewed-by: Vylpes <[email protected]>
Co-authored-by: Renovate Bot <[email protected]>
Co-committed-by: Renovate Bot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
semver: major Releasing requires a major version bump, not backwards compatible
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants