balena-cli/lib/app.ts

87 lines
2.4 KiB
TypeScript
Raw Normal View History

/**
* @license
* Copyright 2019 Balena Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Simple command-line pre-parsing to choose between oclif or Capitano.
* @param argv process.argv
*/
function routeCliFramework(argv: string[]): void {
if (process.env.DEBUG) {
console.log(
`Debug: original argv0="${process.argv0}" argv=[${argv}] length=${
argv.length
}`,
);
}
const cmdSlice = argv.slice(2);
let isOclif = false;
if (cmdSlice.length > 1) {
// convert e.g. 'balena help env add' to 'balena env add --help'
if (cmdSlice[0] === 'help') {
cmdSlice.shift();
cmdSlice.push('--help');
}
// Look for commands that have been transitioned to oclif
isOclif = isOclifCommand(cmdSlice);
if (isOclif) {
// convert space-separated commands to oclif's topic:command syntax
argv = [
argv[0],
argv[1],
cmdSlice[0] + ':' + cmdSlice[1],
...cmdSlice.slice(2),
];
}
}
if (isOclif) {
if (process.env.DEBUG) {
console.log(`Debug: oclif new argv=[${argv}] length=${argv.length}`);
}
require('./app-oclif').run(argv);
} else {
require('./app-capitano');
}
}
/**
* Determine whether the CLI command has been converted from Capitano to ocif.
* @param argvSlice process.argv.slice(2)
*/
function isOclifCommand(argvSlice: string[]): boolean {
// Look for commands that have been transitioned to oclif
if (argvSlice.length > 1) {
// balena env add
if (argvSlice[0] === 'env' && argvSlice[1] === 'add') {
return true;
}
}
return false;
}
/**
* CLI entrypoint, but see also `bin/balena` and `bin/balena-dev` which
* call this function.
*/
export function run(): void {
// globalInit() must be called very early on (before other imports) because
// it sets up Sentry error reporting, global HTTP proxy settings, balena-sdk
// shared options, and performs node version requirement checks.
require('./app-common').globalInit();
routeCliFramework(process.argv);
}