Skip to content

Commit

Permalink
docs: add example of implementing optional-value
Browse files Browse the repository at this point in the history
  • Loading branch information
shadowspawn committed Aug 18, 2024
1 parent 6774908 commit b4e25c0
Showing 1 changed file with 49 additions and 0 deletions.
49 changes: 49 additions & 0 deletions examples/optional-value.mjs
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

View workflow job for this annotation

GitHub Actions / windows

This line has a length of 86. Maximum allowed is 80

Check failure on line 8 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

This line has a length of 86. Maximum allowed is 80

Check failure on line 8 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

This line has a length of 86. Maximum allowed is 80
'debug': { type: 'boolean', short:'d' },

Check failure on line 9 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

Missing space before value for key 'short'

Check failure on line 9 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

Missing space before value for key 'short'

Check failure on line 9 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

Missing space before value for key 'short'
};

let args = process.argv.slice(2);

Check failure on line 12 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

'args' is never reassigned. Use 'const' instead

Check failure on line 12 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

'args' is never reassigned. Use 'const' instead

Check failure on line 12 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

'args' is never reassigned. Use 'const' instead

do {
const { tokens } = parseArgs({ args, options, strict:false, tokens: true });

Check failure on line 15 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

Missing space before value for key 'strict'

Check failure on line 15 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

Missing space before value for key 'strict'

Check failure on line 15 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

Missing space before value for key 'strict'
// 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

View workflow job for this annotation

GitHub Actions / windows

This line has a length of 92. Maximum allowed is 80

Check failure on line 18 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

This line has a length of 92. Maximum allowed is 80

Check failure on line 18 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

This line has a length of 92. Maximum allowed is 80
// 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

View workflow job for this annotation

GitHub Actions / windows

'&&' should be placed at the end of the line

Check failure on line 22 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

'&&' should be placed at the end of the line

Check failure on line 22 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

'&&' should be placed at the end of the line
&& options[token.name].type === 'string'

Check failure on line 23 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

'&&' should be placed at the end of the line

Check failure on line 23 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

'&&' should be placed at the end of the line

Check failure on line 23 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

'&&' should be placed at the end of the line
&& options[token.name].preset !== undefined

Check failure on line 24 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

'&&' should be placed at the end of the line

Check failure on line 24 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

'&&' should be placed at the end of the line

Check failure on line 24 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

'&&' should be placed at the end of the line
&& (token.value === undefined || (token.value.startsWith('-') && !token.inlineValue)));

Check failure on line 25 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

This line has a length of 91. Maximum allowed is 80

Check failure on line 25 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / windows

'&&' should be placed at the end of the line

Check failure on line 25 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

This line has a length of 91. Maximum allowed is 80

Check failure on line 25 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (16)

'&&' should be placed at the end of the line

Check failure on line 25 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

This line has a length of 91. Maximum allowed is 80

Check failure on line 25 in examples/optional-value.mjs

View workflow job for this annotation

GitHub Actions / test (18)

'&&' should be placed at the end of the line

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

0 comments on commit b4e25c0

Please sign in to comment.