Skip to content

Commit

Permalink
fix: parser doesn't validate against options parameter if the value i…
Browse files Browse the repository at this point in the history
…s provided through a env var (#474)
  • Loading branch information
rafaelmotaalves committed Aug 16, 2022
1 parent 2fe27bd commit fe6dfea
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/parser/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,7 @@ export class Parser<T extends ParserInput, TFlags extends OutputFlags<T['flags']
flags[token.flag] = await flag.parse(flags[token.flag], this.context)
} else {
const input = token.input
if (flag.options && !flag.options.includes(input)) {
throw new m.errors.FlagInvalidOptionError(flag, input)
}
this._validateOptions(flag, input)

// eslint-disable-next-line no-await-in-loop
const value = flag.parse ? await flag.parse(input, this.context) : input
Expand All @@ -201,8 +199,12 @@ export class Parser<T extends ParserInput, TFlags extends OutputFlags<T['flags']
if (flags[k]) continue
if (flag.type === 'option' && flag.env) {
const input = process.env[flag.env]
// eslint-disable-next-line no-await-in-loop
if (input) flags[k] = await flag.parse(input, this.context)
if (input) {
this._validateOptions(flag, input)

// eslint-disable-next-line no-await-in-loop
flags[k] = await flag.parse(input, this.context)
}
}

if (!(k in flags) && flag.default !== undefined) {
Expand All @@ -216,6 +218,11 @@ export class Parser<T extends ParserInput, TFlags extends OutputFlags<T['flags']
return flags
}

private _validateOptions(flag: OptionFlag<any>, input: string) {
if (flag.options && !flag.options.includes(input))
throw new m.errors.FlagInvalidOptionError(flag, input)
}

private async _argv(): Promise<any[]> {
const args: any[] = []
const tokens = this._argTokens
Expand Down
22 changes: 22 additions & 0 deletions test/parser/parse.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -790,6 +790,28 @@ See more help with --help`)

expect(message).to.equal('Expected --foo=invalidopt to be one of: myopt, myotheropt\nSee more help with --help')
})
it('fails when invalid env var', async () => {
let message = ''
process.env.TEST_FOO = 'invalidopt'
try {
await parse([], {
flags: {foo: flags.string({options: ['myopt', 'myotheropt'], env: 'TEST_FOO'})},
})
} catch (error: any) {
message = error.message
}

expect(message).to.equal('Expected --foo=invalidopt to be one of: myopt, myotheropt\nSee more help with --help')
})

it('accepts valid option env var', async () => {
process.env.TEST_FOO = 'myopt'

const out = await parse([], {
flags: {foo: flags.string({options: ['myopt', 'myotheropt'], env: 'TEST_FOO'})},
})
expect(out.flags.foo).to.equal('myopt')
})
})

describe('url flag', () => {
Expand Down

0 comments on commit fe6dfea

Please sign in to comment.