From b4e25c010435f87f559066f025d1bba9826eed7c Mon Sep 17 00:00:00 2001 From: John Gee Date: Sun, 18 Aug 2024 14:58:04 +1200 Subject: [PATCH 1/3] docs: add example of implementing optional-value --- examples/optional-value.mjs | 49 +++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 examples/optional-value.mjs diff --git a/examples/optional-value.mjs b/examples/optional-value.mjs new file mode 100644 index 0000000..61128c1 --- /dev/null +++ b/examples/optional-value.mjs @@ -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' }, + 'debug': { type: 'boolean', short:'d' }, +}; + +let args = process.argv.slice(2); + +do { + const { tokens } = parseArgs({ args, options, strict:false, tokens: true }); + // Insert preset if: + // - missing value, like: --host + // - value came from following argument we want to process as option, like: --host --debug + // An empty string is a valid value for a string-type option. + const needsPreset = tokens.find((token) => + token.kind === 'option' + && options[token.name] + && options[token.name].type === 'string' + && options[token.name].preset !== undefined + && (token.value === undefined || (token.value.startsWith('-') && !token.inlineValue))); + + 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 From e511d78a890d974c779414bf1d4e288ddf5c4844 Mon Sep 17 00:00:00 2001 From: John Gee Date: Sun, 18 Aug 2024 15:16:07 +1200 Subject: [PATCH 2/3] Lint fixes --- examples/optional-value.mjs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/examples/optional-value.mjs b/examples/optional-value.mjs index 61128c1..45c619d 100644 --- a/examples/optional-value.mjs +++ b/examples/optional-value.mjs @@ -5,24 +5,30 @@ import { parseArgs } from 'node:util'; import process from 'node:process'; const options = { - 'host': { type: 'string', preset: 'localhost', short: 'h', default: 'default.com' }, - 'debug': { type: 'boolean', short:'d' }, + 'host': { + type: 'string', short: 'h', default: 'default.com', + preset: 'localhost' + }, + 'debug': { type: 'boolean', short: 'd' }, }; -let args = process.argv.slice(2); +const args = process.argv.slice(2); do { - const { tokens } = parseArgs({ args, options, strict:false, tokens: true }); + const { tokens } = parseArgs({ args, options, strict: false, tokens: true }); // Insert preset if: // - missing value, like: --host - // - value came from following argument we want to process as option, like: --host --debug + // - value came from following option argument, like: --host --debug // An empty string is a valid value for a string-type option. const needsPreset = tokens.find((token) => - token.kind === 'option' - && options[token.name] - && options[token.name].type === 'string' - && options[token.name].preset !== undefined - && (token.value === undefined || (token.value.startsWith('-') && !token.inlineValue))); + token.kind === 'option' && + options[token.name] && + options[token.name].type === 'string' && + options[token.name].preset !== undefined && + ( + token.value === undefined || + (token.value.startsWith('-') && !token.inlineValue) + )); if (!needsPreset) break; @@ -33,7 +39,7 @@ do { } while (true); -const { values } = parseArgs({args, options, allowPositionals: true }); +const { values } = parseArgs({ args, options }); console.log(values); // Try the following: From 98ebc860216dead30973ef4a227e50880b74c555 Mon Sep 17 00:00:00 2001 From: John Gee Date: Mon, 19 Aug 2024 19:23:28 +1200 Subject: [PATCH 3/3] Lint Co-authored-by: Jordan Harband --- examples/optional-value.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/optional-value.mjs b/examples/optional-value.mjs index 45c619d..439985b 100644 --- a/examples/optional-value.mjs +++ b/examples/optional-value.mjs @@ -6,7 +6,9 @@ import process from 'node:process'; const options = { 'host': { - type: 'string', short: 'h', default: 'default.com', + type: 'string', + short: 'h', + default: 'default.com', preset: 'localhost' }, 'debug': { type: 'boolean', short: 'd' },