UNPKG

@heroku-cli/command

Version:
64 lines (63 loc) 2.99 kB
import { Command as Base } from '@oclif/core'; import parser from 'yargs-parser'; import unparser from 'yargs-unparser'; import { APIClient } from './api-client.js'; export class Command extends Base { allowArbitraryFlags = false; _heroku; get heroku() { if (this._heroku) return this._heroku; const options = { debug: process.env.HEROKU_DEBUG === '1' || process.env.HEROKU_DEBUG?.toUpperCase() === 'TRUE', debugHeaders: process.env.HEROKU_DEBUG_HEADERS === '1' || process.env.HEROKU_DEBUG_HEADERS?.toUpperCase() === 'TRUE', }; this._heroku = new APIClient(this.config, options); return this._heroku; } async parse(options, argv) { if (this.allowArbitraryFlags) { try { return await super.parse(options, argv); } catch (error) { const { flags: nonExistentFlags } = error; const parsed = parser(this.argv); const nonExistentFlagsWithValues = { ...parsed }; if (nonExistentFlags && nonExistentFlags.length > 0) { this.warn(`You're using a deprecated syntax with the [${nonExistentFlags}] flag.\nAdd a '--' (end of options) separator before the flags you're passing through.`); for (const flag of nonExistentFlags) { const key = flag.replace('--', ''); delete parsed[key]; } } for (const key in parsed) { if (Reflect.has(parsed, key)) { delete nonExistentFlagsWithValues[key]; } } this.argv = unparser(parsed); const result = await super.parse(options, argv); result.nonExistentFlags = unparser(nonExistentFlagsWithValues); for (let index = 0; index < result.nonExistentFlags.length; index++) { const positionalValue = result.nonExistentFlags[index]; const doubleHyphenRegex = /^--/; const positionalValueIsFlag = doubleHyphenRegex.test(positionalValue); if (positionalValueIsFlag) { const nextElement = result.nonExistentFlags[index + 1] ?? ''; const nextElementIsFlag = doubleHyphenRegex.test(nextElement); // eslint-disable-next-line max-depth if (nextElement && !nextElementIsFlag) { result.argv.push(`${positionalValue}=${nextElement}`); } else if (!nextElement || nextElementIsFlag) { result.argv.push(`${positionalValue}=${true}`); } } } return result; } } return super.parse(options, argv); } }