-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
// This is an example of adding support for an option with an optional value, | ||
// which can be used like a boolean-type or a string-type. | ||
|
||
import { parseArgs } from 'node:util'; | ||
import process from 'node:process'; | ||
|
||
const options = { | ||
'host': { type: 'string', preset: 'localhost', short: 'h', default: 'default.com' }, | ||
Check failure on line 8 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 8 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
'debug': { type: 'boolean', short:'d' }, | ||
Check failure on line 9 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 9 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
}; | ||
|
||
let args = process.argv.slice(2); | ||
Check failure on line 12 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 12 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
|
||
do { | ||
const { tokens } = parseArgs({ args, options, strict:false, tokens: true }); | ||
Check failure on line 15 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 15 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
// Insert preset if: | ||
// - missing value, like: --host | ||
// - value came from following argument we want to process as option, like: --host --debug | ||
Check failure on line 18 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 18 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
// An empty string is a valid value for a string-type option. | ||
const needsPreset = tokens.find((token) => | ||
token.kind === 'option' | ||
&& options[token.name] | ||
Check failure on line 22 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 22 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
&& options[token.name].type === 'string' | ||
Check failure on line 23 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 23 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
&& options[token.name].preset !== undefined | ||
Check failure on line 24 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 24 in examples/optional-value.mjs GitHub Actions / test (16)
|
||
&& (token.value === undefined || (token.value.startsWith('-') && !token.inlineValue))); | ||
Check failure on line 25 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 25 in examples/optional-value.mjs GitHub Actions / windows
Check failure on line 25 in examples/optional-value.mjs GitHub Actions / test (16)
Check failure on line 25 in examples/optional-value.mjs GitHub Actions / test (16)
Check failure on line 25 in examples/optional-value.mjs GitHub Actions / test (18)
|
||
|
||
if (!needsPreset) break; | ||
|
||
// Add preset value as an inline value to the original argument. | ||
const joiner = args[needsPreset.index].startsWith('--') ? '=' : ''; | ||
args[needsPreset.index] = `${args[needsPreset.index]}${joiner}${options[needsPreset.name].preset}`; | ||
|
||
} while (true); | ||
|
||
|
||
const { values } = parseArgs({args, options, allowPositionals: true }); | ||
console.log(values); | ||
|
||
// Try the following: | ||
// node optional-value.mjs | ||
// node optional-value.mjs -h | ||
// node optional-value.mjs --host | ||
// node optional-value.mjs -hHOSTNAME | ||
// node optional-value.mjs --host=HOSTNAME | ||
// node optional-value.mjs --host= | ||
// node optional-value.mjs -h -d | ||
// node optional-value.mjs -dh | ||
// node optional-value.mjs --host --debug | ||
// node optional-value.mjs --host -- POSITIONAL |