refactor: remove unused usage functions and migrate argument parsing to commander.js

This commit is contained in:
2026-03-10 19:48:02 +01:00
parent 9fd770999b
commit 5265e5300c
9 changed files with 12 additions and 119 deletions

View File

@@ -119,15 +119,11 @@ Authorization is added automatically for:
const output = await runListResourcePermissionsCommand(options); const output = await runListResourcePermissionsCommand(options);
renderCliOutput(output, skAzTools.opts().output, skAzTools.opts().query, skAzTools.opts().columns); renderCliOutput(output, skAzTools.opts().output, skAzTools.opts().query, skAzTools.opts().columns);
}); });
// Parse arguments
await skAzTools.parseAsync(); await skAzTools.parseAsync();
} }
main().catch((err: unknown) => { main().catch((err: unknown) => {
const error = err as Error; const error = err as Error;
console.error(`Error: ${error.message}`); console.error(`Error: ${error.message}`);
//console.error(usage());
process.exit(1); process.exit(1);
}); });

View File

@@ -8,13 +8,6 @@ type GetTokenOptions = {
type?: string; type?: string;
}; };
export function usageGetToken(): string {
return `Usage: sk-az-tools get-token --type|-t <azurerm|devops> [global options]
Options:
--type, -t <value> Token type: azurerm|devops`;
}
export async function runGetTokenCommand( export async function runGetTokenCommand(
options: GetTokenOptions, options: GetTokenOptions,
): Promise<unknown> { ): Promise<unknown> {

View File

@@ -7,13 +7,6 @@ type ListAppGrantsOptions = {
appId?: string; appId?: string;
}; };
export function usageListAppGrants(): string {
return `Usage: sk-az-tools list-app-grants --app-id|-i <appId> [global options]
Options:
--app-id, -i <appId> Application (client) ID (required)`;
}
export async function runListAppGrantsCommand(options: ListAppGrantsOptions): Promise<unknown> { export async function runListAppGrantsCommand(options: ListAppGrantsOptions): Promise<unknown> {
if (!options.appId) { if (!options.appId) {
throw new Error("--app-id is required for list-app-grants"); throw new Error("--app-id is required for list-app-grants");

View File

@@ -29,16 +29,6 @@ function omitColumns(input: unknown, names: string[]): unknown {
); );
} }
export function usageListAppPermissions(): string {
return `Usage: sk-az-tools list-app-permissions --app-id|-i <appId> [--resolve|-r] [--short|-s] [--filter|-f <glob>] [global options]
Options:
--app-id, -i <appId> Application (client) ID (required)
--resolve, -r Resolve permission GUIDs to human-readable values
--short, -s Makes output more compact
--filter, -f <glob> Filter by permission name glob`;
}
export async function runListAppPermissionsCommand(options: ListAppPermissionsOptions): Promise<unknown> { export async function runListAppPermissionsCommand(options: ListAppPermissionsOptions): Promise<unknown> {
if (!options.appId) { if (!options.appId) {
throw new Error("--app-id is required for list-app-permissions"); throw new Error("--app-id is required for list-app-permissions");

View File

@@ -10,15 +10,6 @@ type ListResourcePermissionsOptions = {
filter?: string; filter?: string;
}; };
export function usageListResourcePermissions(): string {
return `Usage: sk-az-tools list-resource-permissions [--app-id|-i <appId> | --display-name|-n <name>] [--filter|-f <glob>] [global options]
Options:
--app-id, -i <appId> Resource app ID
--display-name, -n <name> Resource app display name
--filter, -f <glob> Filter by permission name glob`;
}
export async function runListResourcePermissionsCommand(options: ListResourcePermissionsOptions): Promise<unknown> { export async function runListResourcePermissionsCommand(options: ListResourcePermissionsOptions): Promise<unknown> {
if (!options.appId && !options.displayName) { if (!options.appId && !options.displayName) {
throw new Error("--app-id or --display-name is required for list-resource-permissions"); throw new Error("--app-id or --display-name is required for list-resource-permissions");

View File

@@ -11,17 +11,6 @@ type LoginOptions = {
browserProfile?: string; browserProfile?: string;
}; };
export function usageLogin(): string {
return `Usage: sk-az-tools login [--resources <csv>] [--use-device-code] [--no-browser] [--browser <name>] [--browser-profile <profile>] [global options]
Options:
--resources <csv> Comma-separated resources: graph,devops,arm (default: all)
--use-device-code Use device code flow instead of interactive flow
--no-browser Do not launch browser; print interactive URL to stderr
--browser <name> Browser keyword: brave|browser|browserPrivate|chrome|edge|firefox
--browser-profile <name> Chromium profile name (e.g. Default, "Profile 1")`;
}
export async function runLoginCommand(options: LoginOptions): Promise<unknown> { export async function runLoginCommand(options: LoginOptions): Promise<unknown> {
const config = await loadAuthConfig("public-config"); const config = await loadAuthConfig("public-config");
return login( return login(

View File

@@ -7,13 +7,6 @@ type LogoutOptions = {
all?: boolean; all?: boolean;
}; };
export function usageLogout(): string {
return `Usage: sk-az-tools logout [--all] [global options]
Options:
--all Clear login state and remove all cached accounts`;
}
export async function runLogoutCommand(options: LogoutOptions): Promise<unknown> { export async function runLogoutCommand(options: LogoutOptions): Promise<unknown> {
const config = await loadAuthConfig("public-config"); const config = await loadAuthConfig("public-config");
return logout(config.tenantId, config.clientId, Boolean(options.all)); return logout(config.tenantId, config.clientId, Boolean(options.all));

View File

@@ -1,19 +0,0 @@
// SPDX-License-Identifier: MIT
export type CommandValues = {
[key: string]: string | boolean | undefined;
type?: string;
method?: string;
url?: string;
header?: string;
resources?: string;
"use-device-code"?: boolean;
"no-browser"?: boolean;
browser?: string;
"browser-profile"?: string;
all?: boolean;
"display-name"?: string;
"app-id"?: string;
filter?: string;
resolve?: boolean;
};

View File

@@ -6,7 +6,7 @@ import os from "node:os";
import path from "node:path"; import path from "node:path";
import readline from "node:readline"; import readline from "node:readline";
import { spawnSync } from "node:child_process"; import { spawnSync } from "node:child_process";
import { parseArgs } from "node:util"; import { Command } from "commander";
type RunAzResult = { type RunAzResult = {
status: number; status: number;
@@ -40,50 +40,17 @@ function runAz(args: string[], quiet = false, allowFailure = false): RunAzResult
} }
async function main(): Promise<void> { async function main(): Promise<void> {
const usageText = `Usage: ${path.basename(process.argv[1])} [options] <app-name> const program = new Command(path.basename(process.argv[1]));
Options: program
-c, --config <path> Write JSON config to file (optional) .description("Create or update public client app and print config template")
-h, --help Show this help message and exit`; .argument("<app-name>", "Application name")
.option("-c, --config <path>", "Write JSON config to file (optional)")
.allowExcessArguments(false)
.parse(process.argv);
let values: Record<string, string | boolean | undefined>; const appName = program.args[0] as string;
let positionals: string[]; const options = program.opts<{ config?: string }>();
try { const configPath = options.config ?? "";
({ values, positionals } = parseArgs({
args: process.argv.slice(2),
options: {
help: { type: "boolean", short: "h" },
config: { type: "string", short: "c" },
},
strict: true,
allowPositionals: true,
}));
} catch (err) {
console.error(`Error: ${(err as Error).message}`);
console.error(usageText);
process.exit(1);
}
if (values.help) {
console.log(usageText);
process.exit(0);
}
if (positionals.length > 1) {
console.error(
"Error: Too many positional arguments. Only one app name positional argument is allowed.",
);
console.error(usageText);
process.exit(1);
}
const appName = positionals[0] || "";
const configPath = typeof values.config === "string" ? values.config : "";
if (!appName) {
console.error("Error: Application name is required.");
console.error(usageText);
process.exit(1);
}
let appId = runAz([ let appId = runAz([
"ad", "ad",