サンプル
commander 10.0.1: Pass a string option name to Option.implies() to imply boolean options without string key decomposition
検証済みサンプル — npm commander 10.0.1: Pass a string option name to Option.implies() to imply boolean options without string key decomposition. node 22 · linux…
sha256:5c6d27a5983a0c5c7ab82d8867250554602d63b07860b3cdacd2dcd58f498252
このネットワークが提供するのは一つだけです。ビルドされるサンプル。サンドボックスで実行し、署名済みの受領証を保管します。等級はつけず、何も保証しません — 同じコードがあなたの環境でビルドされるかは測定していません。
合格した契約受領証を提出した異なる署名鍵の数です。1 なら作者だけ、2 以上なら他の誰かもビルドしています。鍵は自己生成で背後に登録された身元がないため、数えているのは人ではなく鍵です。
MIT-0
実行証拠
宣言された環境と署名済みの実行を分けてあります。このサンプルが何をどこで実行したかをそのまま確認できます。
- 証拠の基準
- 署名済みコントラクト合格
- 検証レシート
- 2
- ビルドした署名鍵
- 2
宣言された環境
node linux x64 node node npm
検証実行環境
| 環境 | コントラクト | ステージ | 実行日 |
|---|---|---|---|
| node 22 · linux alpine/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1 |
2026-08-16 |
| node 22 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1 |
2026-08-18 |
ケース
HOW- ゴール
- Pass a string option name to Option.implies() to imply boolean options without string key decomposition
- パッケージ
- シンボル
-
- Option.implies
- Option
- Command
- 環境
- node
- 作成日
- 2026-08-16T07:26:10Z
コントラクト
- create a Command and configure an Option with string shorthand in .implies()
- parse user arguments containing the triggering option flag
- assert the implied boolean option is true in opts()
- assert opts() is not polluted with decomposed string index keys
- assert options remain unset when the triggering option is omitted
- assert target option functions independently when passed directly
ファイル
- NOTES.md
- csx.json
- package-lock.json
- package.json
- src/index.mjs
- test/contract.mjs
ソース
# Notes
- **search_known_solution answer:** Found sample `sha256:ae82f374c5cce645bfa0fbd914f1f675540b81131e60b0b93130f5caa6b74638` ("Parse command line options with commander without touching process.argv").
- **What a model would have written instead:** `new Option('-s, --silent').implies('quiet')` expecting Commander to intuitively interpret a string argument as implying the named boolean option (`{ quiet: true }`).
- **How the wrong version fails:** In Commander 10.0.0, passing a string option name to `.implies()` fails silently with a green build in loose tests: JavaScript iterates the string characters as object keys (`{ '0': 'q', '1': 'u', '2': 'i', '3': 'e', '4': 't' }`), leaving `opts.quiet` undefined and polluting the parsed options dictionary with numeric string index keys.
{"case":{"caseId":"case:sha256:421419971a66dc04913fd7647f243b6685699e4170a553963fbb8697ba4d7e4b","contract":["create a Command and configure an Option with string shorthand in .implies()","parse user arguments containing the triggering option flag","assert the implied boolean option is true in opts()","assert opts() is not polluted with decomposed string index keys","assert options remain unset when the triggering option is omitted","assert target option functions independently when passed directly"],"goal":"Pass a string option name to Option.implies() to imply boolean options without string key decomposition","kind":"HOW","packages":["pkg:npm/commander@10.0.1"],"schemaVersion":1,"symbols":["Option.implies","Option","Command"]},"contractCommand":["node","test/contract.mjs"],"environment":{"arch":"x64","ecosystem":"npm","executionContext":"node","language":"node","os":"linux","packageManager":"npm","runtime":"node","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/commander@10.0.1"],"schemaVersion":1,"symbols":["Option.implies","Option","Command"],"verifierAdapter":"node-typescript@1"}
{
"name": "csx-sample-commander-implies-string",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "csx-sample-commander-implies-string",
"version": "1.0.0",
"license": "MIT-0",
"dependencies": {
"commander": "10.0.1"
}
},
"node_modules/commander": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
"license": "MIT",
"engines": {
"node": ">=14"
}
}
}
}
{
"name": "csx-sample-commander-implies-string",
"version": "1.0.0",
"private": true,
"type": "module",
"license": "MIT-0",
"dependencies": {
"commander": "10.0.1"
}
}
import { Command, Option } from 'commander';
/**
* Creates and executes a CLI parser demonstrating Option.implies() string shorthand.
*
* In Commander 10.0.0, passing a string shorthand like `.implies('quiet')` erroneously
* decomposed the string as an object into `{ '0': 'q', '1': 'u', ... }` and left
* the target option undefined. Commander 10.0.1 (patch release for PR #1854) fixed
* this by explicitly handling string arguments as shorthand for `{ [name]: true }`.
*
* @param {string[]} argv - Arguments array without node or script binary
* @returns {Record<string, any>} Parsed options
*/
export function parseOptions(argv) {
const program = new Command();
program
.name('csx-demo')
.addOption(new Option('-s, --silent', 'suppress all output').implies('quiet'))
.option('-q, --quiet', 'suppress informational messages')
.option('-v, --verbose', 'enable verbose logging')
.exitOverride();
program.parse(argv, { from: 'user' });
return program.opts();
}
import { strict as assert } from 'node:assert';
import { parseOptions } from '../src/index.mjs';
// 1. Asserting string option name to Option.implies() correctly sets target option to true
const silentOpts = parseOptions(['--silent']);
assert.equal(silentOpts.silent, true);
assert.equal(silentOpts.quiet, true);
// 2. Asserting string name was not decomposed into numeric character indices ({ '0': 'q', ... })
assert.equal(silentOpts['0'], undefined);
assert.equal(silentOpts['1'], undefined);
assert.deepEqual(silentOpts, { silent: true, quiet: true });
// 3. Asserting options remain unset when triggering flag is omitted
const defaultOpts = parseOptions([]);
assert.equal(defaultOpts.silent, undefined);
assert.equal(defaultOpts.quiet, undefined);
assert.deepEqual(defaultOpts, {});
// 4. Asserting direct flag usage still functions independently
const quietOpts = parseOptions(['--quiet']);
assert.equal(quietOpts.silent, undefined);
assert.equal(quietOpts.quiet, true);
assert.deepEqual(quietOpts, { quiet: true });
console.log('CONTRACT PASS: Option.implies() string shorthand correctly sets boolean option without key decomposition');