From 2dafb745f73fbe1980791686a8a67aaa321f669c Mon Sep 17 00:00:00 2001 From: Todd Bluhm Date: Sun, 5 May 2019 22:27:37 -0500 Subject: [PATCH] Fix bug where command flags were stolen by commander --- CHANGELOG.md | 5 ++++- dist/parse-args.d.ts | 2 ++ dist/parse-args.js | 32 +++++++++++++++++++------------- package-lock.json | 2 +- src/parse-args.ts | 34 ++++++++++++++++++++-------------- test/parse-args.spec.ts | 12 +++++++++++- 6 files changed, 57 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4251272..664d19f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog -## 9.0.1 - Unreleased +## 9.0.1 +- **BREAKING**: Fixed major bug that required passing `--` inorder to pass flags to the command. +Normally I release major breaking changes as major versions, but this was a bug and no documentation +anywhere states using `--` as intended or official behavior. - **Change**: Fixed some documentation issues - **Change**: `npm run lint` command now includes calling `tsc` to check for typescript errors diff --git a/dist/parse-args.d.ts b/dist/parse-args.d.ts index fdad8c0..02aa6d1 100644 --- a/dist/parse-args.d.ts +++ b/dist/parse-args.d.ts @@ -1,5 +1,7 @@ +import { Command } from 'commander'; import { EnvCmdOptions } from './types'; /** * Parses the arguments passed into the cli */ export declare function parseArgs(args: string[]): EnvCmdOptions; +export declare function parseArgsUsingCommander(args: string[]): Command; diff --git a/dist/parse-args.js b/dist/parse-args.js index 8112cdb..7419174 100644 --- a/dist/parse-args.js +++ b/dist/parse-args.js @@ -6,20 +6,12 @@ const utils_1 = require("./utils"); * Parses the arguments passed into the cli */ function parseArgs(args) { - const program = new commander_1.Command(); - program - .version('9.0.0', '-v, --version') - .usage('[options] [...args]') - .option('-f, --file [path]', 'Custom env file path (default path: ./.env)') - .option('-r, --rc-file [path]', 'Custom rc file path (default path: ./.env-cmdrc(|.js|.json)') - .option('-e, --environments [env1,env2,...]', 'The rc file environment(s) to use', utils_1.parseArgList) - .option('--fallback', 'Fallback to default env file path, if custom env file path not found') - .option('--no-override', 'Do not override existing environment variables') - .option('--use-shell', 'Execute the command in a new shell with the given environment') - .parse(['_', '_', ...args]); - // get the command and command args + // Get the command and command args + let program = parseArgsUsingCommander(args); const command = program.args[0]; - const commandArgs = program.args.slice(1); + const commandArgs = args.splice(args.indexOf(command) + 1); + // Reprocess the args with the command and command args removed + program = parseArgsUsingCommander(args.slice(0, args.indexOf(command))); const noOverride = !program.override; const useShell = !!program.useShell; let rc; @@ -46,3 +38,17 @@ function parseArgs(args) { }; } exports.parseArgs = parseArgs; +function parseArgsUsingCommander(args) { + const program = new commander_1.Command(); + return program + .version('9.0.1', '-v, --version') + .usage('[options] [...args]') + .option('-f, --file [path]', 'Custom env file path (default path: ./.env)') + .option('-r, --rc-file [path]', 'Custom rc file path (default path: ./.env-cmdrc(|.js|.json)') + .option('-e, --environments [env1,env2,...]', 'The rc file environment(s) to use', utils_1.parseArgList) + .option('--fallback', 'Fallback to default env file path, if custom env file path not found') + .option('--no-override', 'Do not override existing environment variables') + .option('--use-shell', 'Execute the command in a new shell with the given environment') + .parse(['_', '_', ...args]); +} +exports.parseArgsUsingCommander = parseArgsUsingCommander; diff --git a/package-lock.json b/package-lock.json index a6fc911..47469fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "env-cmd", - "version": "9.0.0", + "version": "9.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/parse-args.ts b/src/parse-args.ts index c120819..b8a0e16 100644 --- a/src/parse-args.ts +++ b/src/parse-args.ts @@ -6,21 +6,13 @@ import { parseArgList } from './utils' * Parses the arguments passed into the cli */ export function parseArgs (args: string[]): EnvCmdOptions { - const program = new Command() - program - .version('9.0.0', '-v, --version') - .usage('[options] [...args]') - .option('-f, --file [path]', 'Custom env file path (default path: ./.env)') - .option('-r, --rc-file [path]', 'Custom rc file path (default path: ./.env-cmdrc(|.js|.json)') - .option('-e, --environments [env1,env2,...]', 'The rc file environment(s) to use', parseArgList) - .option('--fallback', 'Fallback to default env file path, if custom env file path not found') - .option('--no-override', 'Do not override existing environment variables') - .option('--use-shell', 'Execute the command in a new shell with the given environment') - .parse(['_', '_', ...args]) - - // get the command and command args + // Get the command and command args + let program = parseArgsUsingCommander(args) const command = program.args[0] - const commandArgs = program.args.slice(1) + const commandArgs = args.splice(args.indexOf(command) + 1) + + // Reprocess the args with the command and command args removed + program = parseArgsUsingCommander(args.slice(0, args.indexOf(command))) const noOverride = !program.override const useShell = !!program.useShell @@ -49,3 +41,17 @@ export function parseArgs (args: string[]): EnvCmdOptions { } } } + +export function parseArgsUsingCommander (args: string[]): Command { + const program = new Command() + return program + .version('9.0.1', '-v, --version') + .usage('[options] [...args]') + .option('-f, --file [path]', 'Custom env file path (default path: ./.env)') + .option('-r, --rc-file [path]', 'Custom rc file path (default path: ./.env-cmdrc(|.js|.json)') + .option('-e, --environments [env1,env2,...]', 'The rc file environment(s) to use', parseArgList) + .option('--fallback', 'Fallback to default env file path, if custom env file path not found') + .option('--no-override', 'Do not override existing environment variables') + .option('--use-shell', 'Execute the command in a new shell with the given environment') + .parse(['_', '_', ...args]) +} diff --git a/test/parse-args.spec.ts b/test/parse-args.spec.ts index 54aa526..a67c267 100644 --- a/test/parse-args.spec.ts +++ b/test/parse-args.spec.ts @@ -4,7 +4,7 @@ import { parseArgs } from '../src/parse-args' describe('parseArgs', (): void => { const command = 'command' - const commandArgs = ['cmda1', 'cmda2'] + const commandArgs = ['cmda1', 'cmda2', '--cmda3', '-4', 'cmda4'] const environments = ['development', 'production'] const rcFilePath = './.env-cmdrc' const envFilePath = './.env' @@ -30,6 +30,16 @@ describe('parseArgs', (): void => { assert.sameOrderedMembers(res.commandArgs, commandArgs) }) + it('should parse multiple command arguments even if they use the same options flags as env-cmd', + (): void => { + const commandFlags = ['-f', './other-file', '--use-shell', '-r'] + const res = parseArgs(['-e', environments[0], command, ...commandFlags]) + assert.sameOrderedMembers(res.commandArgs, commandFlags) + assert.notOk(res.options!.useShell) + assert.notOk(res.envFile) + } + ) + it('should parse override option', (): void => { const res = parseArgs(['-e', environments[0], '--no-override', command, ...commandArgs]) assert.exists(res.options)