Files
2026-07-12 15:11:38 +02:00

137 lines
5.8 KiB
JavaScript

/*!
* Copyright (C) Microsoft Corporation. All rights reserved.
*/
import { ArgumentProvider } from './ArgumentProvider.js';
import { PacCliAuthenticationProvider } from './Authentication/PacCliAuthenticationProvider.js';
import { initializeCliSettings, setCliLogger } from './CliSettings.js';
import { CliError } from './Errors/CliError.js';
import { CliHttpClient } from './HttpClient/CliHttpClient.js';
import { CliLogger } from './Logger/CliLogger.js';
import { addDataSourceAsync, addDataverseApiAsync, addFlowAsync, createConnectionVerbAsync, deleteDataSourceAsync, findDataverseApiAsync, getCodeAppsAsync, initAsync, listConnectionReferences, listConnectionsAsync, listDatasetsAsync, listSqlStoredProceduresAsync, listTablesAsync, logoutAsync, pushAsync, refreshDataSourceAsync, removeFlowAsync, runAsync, } from './Verbs/index.js';
import { listAllEnvironmentVariablesAsync } from './Verbs/ListEnvironmentVariables.js';
import { listFlowsAsync } from './Verbs/ListFlows.js';
import { modifyTelemetrySettings } from './Verbs/TelemetrySettings.js';
let logger;
let exitCode = 0;
export async function boot() {
try {
if (process.argv.includes('--no-color')) {
process.env.NO_COLOR = '1';
}
const isPacCli = process.env.IS_PAC_CLI === 'true';
const isTestRun = process.env.CI === 'true';
const hasNonInteractiveFlag = process.argv.includes('--non-interactive');
const source = isPacCli ? 'pac-cli' : 'standalone';
const interactive = !isPacCli && !isTestRun && !hasNonInteractiveFlag && process.stdin.isTTY === true;
const cliSettings = await initializeCliSettings({ source, interactive });
let authenticationProvider;
if (isPacCli) {
authenticationProvider = new PacCliAuthenticationProvider();
}
else if (isTestRun) {
const { ServicePrincipalAuthenticationProvider } = await import('./Authentication/ServicePrincipalAuthenticationProvider.js');
authenticationProvider = new ServicePrincipalAuthenticationProvider();
}
else {
// Dynamically import NodeMsalAuthenticationProvider only when needed
const { NodeMsalAuthenticationProvider } = await import('./Authentication/NodeMsalAuthenticationProvider.js');
authenticationProvider = new NodeMsalAuthenticationProvider();
}
const httpClient = new CliHttpClient(authenticationProvider);
// The CLI logger might need to use httpClient and environment info during its initialization
// So we create it after the httpClient and authenticationProvider are ready
logger = await CliLogger.create(cliSettings, httpClient);
setCliLogger(logger);
const argumentProvider = new ArgumentProvider(httpClient, logger, authenticationProvider);
argumentProvider.handleGlobalHelpOrFlagsAndExit();
const verb = argumentProvider.getVerb();
await executeVerb({ verb, argumentProvider });
}
catch (err) {
const message = err instanceof Error ? err.message : String(err);
console.error(message);
exitCode = err instanceof CliError ? err.exitCode : 1;
}
finally {
// Ensure logger flush on exit
if (logger) {
await logger.flush();
}
process.exit(exitCode);
}
}
async function executeVerb(config) {
const { verb, argumentProvider } = config;
switch (verb) {
case 'init':
await initAsync(argumentProvider);
break;
case 'list-codeapps':
await getCodeAppsAsync(argumentProvider);
break;
case 'add-data-source':
await addDataSourceAsync(argumentProvider);
break;
case 'list-datasets':
await listDatasetsAsync(argumentProvider);
break;
case 'list-tables':
await listTablesAsync(argumentProvider);
break;
case 'list-sqlStoredProcedures':
await listSqlStoredProceduresAsync(argumentProvider);
break;
case 'delete-data-source':
await deleteDataSourceAsync(argumentProvider);
break;
case 'refresh-data-source':
await refreshDataSourceAsync(argumentProvider);
break;
case 'logout':
await logoutAsync(argumentProvider);
break;
case 'list-environment-variables':
await listAllEnvironmentVariablesAsync(argumentProvider);
break;
case 'list-connection-references':
await listConnectionReferences(argumentProvider);
break;
case 'list-connections':
await listConnectionsAsync(argumentProvider);
break;
case 'list-flows':
await listFlowsAsync(argumentProvider);
break;
case 'add-dataverse-api':
await addDataverseApiAsync(argumentProvider);
break;
case 'add-flow':
await addFlowAsync(argumentProvider);
break;
case 'create-connection':
await createConnectionVerbAsync(argumentProvider);
break;
case 'remove-flow':
await removeFlowAsync(argumentProvider);
break;
case 'find-dataverse-api':
await findDataverseApiAsync(argumentProvider);
break;
case 'push':
await pushAsync(argumentProvider);
break;
case 'run':
await runAsync(argumentProvider);
break;
case 'telemetry':
await modifyTelemetrySettings(argumentProvider);
break;
default:
unsupportedVerb(verb);
}
}
// Helper function ensures compile time checking for exhaustive verb handling
function unsupportedVerb(verb) {
throw new Error(`The verb "${verb}" is not supported.`);
}
//# sourceMappingURL=Cli.js.map