Skip to content

Conversation

@shadowspawn
Copy link
Collaborator

@shadowspawn shadowspawn commented Feb 24, 2025

Problem

People would like to be able to group options and commands in the help, and a number of other libraries have support for this.

Requests:

Other libraries:

Previous exploration by me: #1908 #1910 #2176 #2248

Solution

Add low-level .helpGroup() on Option and Command, and higher-level .optionsGroup() and .commandsGroup() which can be used in chaining way to specify group title for following options/commands.

See the example file to see them in use.

ChangeLog

@shadowspawn shadowspawn marked this pull request as draft February 24, 2025 10:07
@shadowspawn shadowspawn changed the base branch from master to develop February 24, 2025 10:08
@shadowspawn shadowspawn changed the title Add support groups of options and commands in the help Add support for groups of options and commands in the help Feb 27, 2025
@shadowspawn shadowspawn changed the base branch from develop to release/14.x March 26, 2025 05:20
@shadowspawn shadowspawn changed the base branch from release/14.x to develop March 26, 2025 05:22
@shadowspawn
Copy link
Collaborator Author

If we decide to land this, might wait for the major version when we drop Node.js 18.

@shadowspawn shadowspawn marked this pull request as ready for review May 8, 2025 23:12
@shadowspawn
Copy link
Collaborator Author

This has had some small support with likes on the issue and the PR. Help groups are a common feature in full-featured CLI parsing libraries.

I am leaning towards including it in Commander, but happy to leave it out if you have concerns @abetomo .

@shadowspawn shadowspawn changed the base branch from develop to release/14.x May 8, 2025 23:21
@abetomo
Copy link
Collaborator

abetomo commented May 8, 2025

Sorry for the delay in reviewing!

@shadowspawn
Copy link
Collaborator Author

Sorry for the delay in reviewing!

No problem, I left it is draft for months. Only just marked it for review. 😄

@shadowspawn shadowspawn merged commit c324ea3 into tj:release/14.x May 8, 2025
11 checks passed
@shadowspawn shadowspawn deleted the feature/help-group-4 branch May 8, 2025 23:43
@shadowspawn
Copy link
Collaborator Author

Oops, I didn't add typings for the new methods. I will open a PR for those.

Blankll added a commit to geek-fun/serverlessinsight that referenced this pull request Oct 9, 2025
![snyk-top-banner](https://res.cloudinary.com/snyk/image/upload/r-d/scm-platform/snyk-pull-requests/pr-banner-default.svg)


<h3>Snyk has created this PR to upgrade commander from 14.0.0 to
14.0.1.</h3>

:information_source: Keep your dependencies up-to-date. This makes it
easier to fix existing vulnerabilities and to more quickly identify and
fix newly disclosed vulnerabilities when they affect your project.

<hr/>


- The recommended version is **1 version** ahead of your current
version.

- The recommended version was released **24 days ago**.




<details>
<summary><b>Release notes</b></summary>
<br/>
  <details>
    <summary>Package name: <b>commander</b></summary>
    <ul>
      <li>
<b>14.0.1</b> - <a
href="https://github.com/tj/commander.js/releases/tag/v14.0.1">2025-09-12</a></br><h3>Fixed</h3>
<ul>
<li>broken markdown link in README (<a class="issue-link js-issue-link"
data-error-text="Failed to load title" data-id="3085867003"
data-permission-text="Title is private"
data-url="tj/commander.js#2369"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2369/hovercard"
href="https://github.com/tj/commander.js/pull/2369">#2369</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li>improve code readability by using optional chaining (<a
class="issue-link js-issue-link" data-error-text="Failed to load title"
data-id="3203289052" data-permission-text="Title is private"
data-url="tj/commander.js#2394"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2394/hovercard"
href="https://github.com/tj/commander.js/pull/2394">#2394</a>)</li>
<li>use more idiomatic code with object spread instead of
<code>Object.assign()</code> (<a class="issue-link js-issue-link"
data-error-text="Failed to load title" data-id="3204494758"
data-permission-text="Title is private"
data-url="tj/commander.js#2395"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2395/hovercard"
href="https://github.com/tj/commander.js/pull/2395">#2395</a>)</li>
<li>improve code readability using <code>string.endsWith()</code>
instead of <code>string.slice()</code> (<a class="issue-link
js-issue-link" data-error-text="Failed to load title"
data-id="3209103795" data-permission-text="Title is private"
data-url="tj/commander.js#2396"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2396/hovercard"
href="https://github.com/tj/commander.js/pull/2396">#2396</a>)</li>
<li>refactor <code>.parseOptions()</code> to process args array in-place
(<a class="issue-link js-issue-link" data-error-text="Failed to load
title" data-id="3324072148" data-permission-text="Title is private"
data-url="tj/commander.js#2409"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2409/hovercard"
href="https://github.com/tj/commander.js/pull/2409">#2409</a>)</li>
<li>change private variadic support routines from
<code>._concatValue()</code> to <code>._collectValue()</code> (change
code from <code>array.concat()</code> to <code>array.push()</code>) (<a
class="issue-link js-issue-link" data-error-text="Failed to load title"
data-id="3327764465" data-permission-text="Title is private"
data-url="tj/commander.js#2410"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2410/hovercard"
href="https://github.com/tj/commander.js/pull/2410">#2410</a>)</li>
<li>update (dev) dependencies</li>
</ul>
      </li>
      <li>
<b>14.0.0</b> - <a
href="https://github.com/tj/commander.js/releases/tag/v14.0.0">2025-05-18</a></br><h3>Added</h3>
<ul>
<li>support for groups of options and commands in the help using
low-level <code>.helpGroup()</code> on <code>Option</code> and
<code>Command</code>, and higher<br>
-level <code>.optionsGroup()</code> and <code>.commandsGroup()</code>
which can be used in chaining way to specify group title for following
option<br>
s/commands (<a class="issue-link js-issue-link" data-error-text="Failed
to load title" data-id="2874409705" data-permission-text="Title is
private" data-url="tj/commander.js#2328"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2328/hovercard"
href="https://github.com/tj/commander.js/pull/2328">#2328</a>)</li>
<li>support for unescaped negative numbers as option-arguments and
command-arguments (<a class="issue-link js-issue-link"
data-error-text="Failed to load title" data-id="2921957024"
data-permission-text="Title is private"
data-url="tj/commander.js#2339"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2339/hovercard"
href="https://github.com/tj/commander.js/pull/2339">#2339</a>)</li>
<li>TypeScript: add <code>parseArg</code> property to
<code>Argument</code> class (<a class="issue-link js-issue-link"
data-error-text="Failed to load title" data-id="3022955668"
data-permission-text="Title is private"
data-url="tj/commander.js#2359"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2359/hovercard"
href="https://github.com/tj/commander.js/pull/2359">#2359</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>remove bogus leading space in help when option has default value but
not a description (<a class="issue-link js-issue-link"
data-error-text="Failed to load title" data-id="2944505658"
data-permission-text="Title is private"
data-url="tj/commander.js#2348"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2348/hovercard"
href="https://github.com/tj/commander.js/pull/2348">#2348</a>)</li>
<li><code>.configureOutput()</code> now makes copy of settings instead
of modifying in-place, fixing side-effects (<a class="issue-link
js-issue-link" data-error-text="Failed to load title"
data-id="2948403186" data-permission-text="Title is private"
data-url="tj/commander.js#2350"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2350/hovercard"
href="https://github.com/tj/commander.js/pull/2350">#2350</a>)</li>
</ul>
<h3>Changed</h3>
<ul>
<li><em>Breaking:</em> Commander 14 requires Node.js v20 or higher</li>
<li>internal refactor of <code>Help</code> class adding
<code>.formatItemList()</code> and <code>.groupItems()</code> methods
(<a class="issue-link js-issue-link" data-error-text="Failed to load
title" data-id="2874409705" data-permission-text="Title is private"
data-url="tj/commander.js#2328"
data-hovercard-type="pull_request"
data-hovercard-url="/tj/commander.js/pull/2328/hovercard"
href="https://github.com/tj/commander.js/pull/2328">#2328</a>)</li>
</ul>
      </li>
    </ul>
from <a
href="https://github.com/tj/commander.js/releases">commander
GitHub release notes</a>
  </details>
</details>

---

> [!IMPORTANT]
>
> - Check the changes in this PR to ensure they won't cause issues with
your project.
> - This PR was automatically created by Snyk using the credentials of a
real user.

---

**Note:** _You are seeing this because you or someone else with access
to this repository has authorized Snyk to open upgrade PRs._

**For more information:** <img
src="https://api.segment.io/v1/pixel/track?data=eyJ3cml0ZUtleSI6InJyWmxZcEdHY2RyTHZsb0lYd0dUcVg4WkFRTnNCOUEwIiwiYW5vbnltb3VzSWQiOiJkMjZkNjUyZS01MGMyLTQ0NzEtOTcyNC04NTA2ODZiNGI0MTMiLCJldmVudCI6IlBSIHZpZXdlZCIsInByb3BlcnRpZXMiOnsicHJJZCI6ImQyNmQ2NTJlLTUwYzItNDQ3MS05NzI0LTg1MDY4NmI0YjQxMyJ9fQ=="
width="0" height="0"/>

> - 🧐 [View latest project
report](https://app.snyk.io/org/blankll/project/9c72c875-e7a2-4e68-85a9-7b26a5bc5b32?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)
> - 📜 [Customise PR
templates](https://docs.snyk.io/scan-using-snyk/pull-requests/snyk-fix-pull-or-merge-requests/customize-pr-templates?utm_source=&utm_content=fix-pr-template)
> - 🛠 [Adjust upgrade PR
settings](https://app.snyk.io/org/blankll/project/9c72c875-e7a2-4e68-85a9-7b26a5bc5b32/settings/integration?utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr)
> - 🔕 [Ignore this dependency or unsubscribe from future upgrade
PRs](https://app.snyk.io/org/blankll/project/9c72c875-e7a2-4e68-85a9-7b26a5bc5b32/settings/integration?pkg&#x3D;commander&amp;utm_source&#x3D;github&amp;utm_medium&#x3D;referral&amp;page&#x3D;upgrade-pr#auto-dep-upgrades)

[//]: #
'snyk:metadata:{"breakingChangeRiskLevel":null,"FF_showPullRequestBreakingChanges":null,"FF_showPullRequestBreakingChangesWebSearch":null,"customTemplate":{"variablesUsed":[],"fieldsUsed":[]},"dependencies":[{"name":"commander","from":"14.0.0","to":"14.0.1"}],"env":"prod","hasFixes":false,"isBreakingChange":false,"isMajorUpgrade":false,"issuesToFix":[],"prId":"d26d652e-50c2-4471-9724-850686b4b413","prPublicId":"d26d652e-50c2-4471-9724-850686b4b413","packageManager":"npm","priorityScoreList":[],"projectPublicId":"9c72c875-e7a2-4e68-85a9-7b26a5bc5b32","projectUrl":"https://app.snyk.io/org/blankll/project/9c72c875-e7a2-4e68-85a9-7b26a5bc5b32?utm_source=github&utm_medium=referral&page=upgrade-pr","prType":"upgrade","templateFieldSources":{"branchName":"default","commitMessage":"default","description":"default","title":"default"},"templateVariants":[],"type":"auto","upgrade":[],"upgradeInfo":{"versionsDiff":1,"publishedDate":"2025-09-12T07:27:06.725Z"},"vulns":[]}'

Co-authored-by: snyk-bot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants