Compare commits
2 Commits
9fd770999b
...
dda13b7e2a
| Author | SHA1 | Date | |
|---|---|---|---|
| dda13b7e2a | |||
| 5265e5300c |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@slawek/sk-az-tools",
|
"name": "@slawek/sk-az-tools",
|
||||||
"version": "0.7.0",
|
"version": "0.7.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"files": [
|
"files": [
|
||||||
"dist",
|
"dist",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
import { Command, Option } from "commander";
|
import { Command, Option } from "commander";
|
||||||
import { renderCliOutput} from "@slawek/sk-tools";
|
import { renderCliOutput } from "@slawek/sk-tools";
|
||||||
|
|
||||||
// Commands
|
// Commands
|
||||||
import { runGetTokenCommand } from "./cli/commands/get-token.ts";
|
import { runGetTokenCommand } from "./cli/commands/get-token.ts";
|
||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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;
|
|
||||||
};
|
|
||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user