@robinmordasiewicz/f5xc-xcsh 6.23.0 → 6.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/completions/_xcsh +5 -5
- package/completions/xcsh.bash +1 -1
- package/completions/xcsh.fish +5 -4
- package/dist/index.js +758 -222
- package/package.json +4 -2
package/dist/index.js
CHANGED
|
@@ -38391,11 +38391,11 @@ var require_react_jsx_runtime_development = __commonJS({
|
|
|
38391
38391
|
return jsxWithValidation(type, props, key, false);
|
|
38392
38392
|
}
|
|
38393
38393
|
}
|
|
38394
|
-
var
|
|
38395
|
-
var
|
|
38394
|
+
var jsx6 = jsxWithValidationDynamic;
|
|
38395
|
+
var jsxs5 = jsxWithValidationStatic;
|
|
38396
38396
|
exports.Fragment = REACT_FRAGMENT_TYPE;
|
|
38397
|
-
exports.jsx =
|
|
38398
|
-
exports.jsxs =
|
|
38397
|
+
exports.jsx = jsx6;
|
|
38398
|
+
exports.jsxs = jsxs5;
|
|
38399
38399
|
})();
|
|
38400
38400
|
}
|
|
38401
38401
|
}
|
|
@@ -44256,9 +44256,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44256
44256
|
["cdn", {
|
|
44257
44257
|
name: "cdn",
|
|
44258
44258
|
displayName: "Cdn",
|
|
44259
|
-
description: "
|
|
44260
|
-
descriptionShort: "
|
|
44261
|
-
descriptionMedium: "
|
|
44259
|
+
description: "Create cache rules with expression-based matching for paths, headers, cookies, and query parameters. Deploy load balancers optimized for content distribution with configurable TTL settings and cache eligibility options. Monitor access logs and metrics for delivery performance. Purge cached content on demand and track service operation status across namespaces.",
|
|
44260
|
+
descriptionShort: "Configure content delivery and caching rules",
|
|
44261
|
+
descriptionMedium: "Define cache rules and load balancers for content distribution. Set TTL policies, path matching, and header-based caching decisions.",
|
|
44262
44262
|
aliases: ["cache", "content"],
|
|
44263
44263
|
complexity: "advanced",
|
|
44264
44264
|
isPreview: false,
|
|
@@ -44368,9 +44368,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44368
44368
|
["dns", {
|
|
44369
44369
|
name: "dns",
|
|
44370
44370
|
displayName: "Dns",
|
|
44371
|
-
description: "
|
|
44372
|
-
descriptionShort: "
|
|
44373
|
-
descriptionMedium: "
|
|
44371
|
+
description: "Create and manage authoritative zones with support for standard record types including A, AAAA, CNAME, CAA, CERT, and AFSDB. Import existing configurations through BIND file uploads or zone transfers. Define health check policies that monitor backend availability and automatically adjust record responses. Export zone files for backup or migration. Access request logs and performance metrics to analyze query patterns and troubleshoot resolution issues across namespaces.",
|
|
44372
|
+
descriptionShort: "Manage zones, records, and resolution policies",
|
|
44373
|
+
descriptionMedium: "Configure zone imports from BIND files or AXFR transfers. Set up health checks for load-balanced records and monitor query metrics.",
|
|
44374
44374
|
aliases: ["dns-zone", "zones"],
|
|
44375
44375
|
complexity: "advanced",
|
|
44376
44376
|
isPreview: false,
|
|
@@ -44750,9 +44750,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44750
44750
|
["virtual", {
|
|
44751
44751
|
name: "virtual",
|
|
44752
44752
|
displayName: "Virtual",
|
|
44753
|
-
description: "
|
|
44754
|
-
descriptionShort: "HTTP
|
|
44755
|
-
descriptionMedium: "
|
|
44753
|
+
description: "Set up load balancing for HTTP, TCP, and UDP protocols with origin pool configuration and weighted routing. Create service policies to control access patterns and enforce rate limits on incoming requests. Deploy geo-location routing for region-aware traffic steering. Configure health checks to monitor backend availability and trigger automatic failover. Manage proxy forwarding rules and threat protection including malware scanning and campaign blocking.",
|
|
44754
|
+
descriptionShort: "Configure HTTP and TCP load balancers",
|
|
44755
|
+
descriptionMedium: "Manage origin pools and routing rules. Define rate limiting, service policies, and health checks for traffic distribution.",
|
|
44756
44756
|
aliases: ["lb", "loadbalancer", "vhost"],
|
|
44757
44757
|
complexity: "advanced",
|
|
44758
44758
|
isPreview: false,
|
|
@@ -44830,9 +44830,9 @@ var generatedDomains = /* @__PURE__ */ new Map([
|
|
|
44830
44830
|
["waf", {
|
|
44831
44831
|
name: "waf",
|
|
44832
44832
|
displayName: "Waf",
|
|
44833
|
-
description: "
|
|
44834
|
-
descriptionShort: "
|
|
44835
|
-
descriptionMedium: "
|
|
44833
|
+
description: "Deploy protection against common web attacks including injection, cross-site scripting, and protocol violations. Set up bot detection with configurable actions for automated traffic handling. Create exclusion policies to whitelist trusted requests and reduce false positives. Monitor security events and rule hits through metrics collection to analyze threat patterns and refine defensive configurations for virtual hosts.",
|
|
44834
|
+
descriptionShort: "Configure web application firewall rules and policies",
|
|
44835
|
+
descriptionMedium: "Manage application security through attack detection and blocking settings. Define custom response codes and signature-based threat mitigation.",
|
|
44836
44836
|
aliases: ["firewall", "appfw"],
|
|
44837
44837
|
complexity: "advanced",
|
|
44838
44838
|
isPreview: false,
|
|
@@ -45166,12 +45166,151 @@ var HistoryManager = class _HistoryManager {
|
|
|
45166
45166
|
}
|
|
45167
45167
|
};
|
|
45168
45168
|
|
|
45169
|
+
// src/branding/terminal.ts
|
|
45170
|
+
function detectTerminalCapabilities() {
|
|
45171
|
+
const termProgram = process.env.TERM_PROGRAM ?? "";
|
|
45172
|
+
const lcTerminal = process.env.LC_TERMINAL ?? "";
|
|
45173
|
+
const term = process.env.TERM ?? "";
|
|
45174
|
+
const isITerm2 = termProgram === "iTerm.app" || lcTerminal === "iTerm2" || !!process.env.ITERM_SESSION_ID;
|
|
45175
|
+
const isKitty = termProgram === "kitty" || term.includes("kitty");
|
|
45176
|
+
const isWezTerm = termProgram === "WezTerm" || !!process.env.WEZTERM_PANE;
|
|
45177
|
+
const isMintty = !!process.env.MINTTY;
|
|
45178
|
+
const supportsInlineImages = isITerm2 || isKitty || isWezTerm || isMintty;
|
|
45179
|
+
return {
|
|
45180
|
+
supportsInlineImages,
|
|
45181
|
+
terminalProgram: termProgram || lcTerminal || null,
|
|
45182
|
+
isITerm2,
|
|
45183
|
+
isKitty,
|
|
45184
|
+
isWezTerm,
|
|
45185
|
+
isMintty
|
|
45186
|
+
};
|
|
45187
|
+
}
|
|
45188
|
+
function generateITerm2ImageSequence(base64Data, options = {}) {
|
|
45189
|
+
const args = [];
|
|
45190
|
+
if (options.width !== void 0) {
|
|
45191
|
+
args.push(`width=${options.width}`);
|
|
45192
|
+
}
|
|
45193
|
+
if (options.height !== void 0) {
|
|
45194
|
+
args.push(`height=${options.height}`);
|
|
45195
|
+
}
|
|
45196
|
+
if (options.preserveAspectRatio !== void 0) {
|
|
45197
|
+
args.push(`preserveAspectRatio=${options.preserveAspectRatio ? 1 : 0}`);
|
|
45198
|
+
}
|
|
45199
|
+
if (options.name) {
|
|
45200
|
+
const nameBase64 = Buffer.from(options.name, "utf-8").toString(
|
|
45201
|
+
"base64"
|
|
45202
|
+
);
|
|
45203
|
+
args.push(`name=${nameBase64}`);
|
|
45204
|
+
}
|
|
45205
|
+
args.push(`inline=${options.inline !== false ? 1 : 0}`);
|
|
45206
|
+
const argsString = args.join(";");
|
|
45207
|
+
return `\x1B]1337;File=${argsString}:${base64Data}\x07`;
|
|
45208
|
+
}
|
|
45209
|
+
function generateKittyImageSequence(base64Data) {
|
|
45210
|
+
return `\x1B_Ga=T,f=100,t=d;${base64Data}\x1B\\`;
|
|
45211
|
+
}
|
|
45212
|
+
function getTerminalImageSequence(base64Data, capabilities, options = {}) {
|
|
45213
|
+
if (!capabilities.supportsInlineImages) {
|
|
45214
|
+
return null;
|
|
45215
|
+
}
|
|
45216
|
+
if (capabilities.isKitty) {
|
|
45217
|
+
return generateKittyImageSequence(base64Data);
|
|
45218
|
+
}
|
|
45219
|
+
return generateITerm2ImageSequence(base64Data, options);
|
|
45220
|
+
}
|
|
45221
|
+
|
|
45222
|
+
// src/branding/logo-image.ts
|
|
45223
|
+
var F5_LOGO_PNG_BASE64 = "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";
|
|
45224
|
+
var F5_LOGO_DISPLAY_WIDTH = 45;
|
|
45225
|
+
var F5_LOGO_DISPLAY_HEIGHT = 18;
|
|
45226
|
+
|
|
45227
|
+
// src/branding/logo-renderer.ts
|
|
45228
|
+
function resolveLogoMode(options) {
|
|
45229
|
+
if (options.cliMode) {
|
|
45230
|
+
return options.cliMode;
|
|
45231
|
+
}
|
|
45232
|
+
if (options.envMode) {
|
|
45233
|
+
return options.envMode;
|
|
45234
|
+
}
|
|
45235
|
+
if (options.configMode) {
|
|
45236
|
+
return options.configMode;
|
|
45237
|
+
}
|
|
45238
|
+
return "image";
|
|
45239
|
+
}
|
|
45240
|
+
function hasImageData() {
|
|
45241
|
+
return F5_LOGO_PNG_BASE64.length > 0;
|
|
45242
|
+
}
|
|
45243
|
+
function renderLogo(mode) {
|
|
45244
|
+
const capabilities = detectTerminalCapabilities();
|
|
45245
|
+
const logoLines = F5_LOGO.split("\n");
|
|
45246
|
+
const asciiLineCount = logoLines.length;
|
|
45247
|
+
let effectiveMode;
|
|
45248
|
+
if (mode === "none") {
|
|
45249
|
+
effectiveMode = "none";
|
|
45250
|
+
} else if (mode === "image") {
|
|
45251
|
+
if (capabilities.supportsInlineImages && hasImageData()) {
|
|
45252
|
+
effectiveMode = "image";
|
|
45253
|
+
} else {
|
|
45254
|
+
effectiveMode = "ascii";
|
|
45255
|
+
}
|
|
45256
|
+
} else {
|
|
45257
|
+
effectiveMode = "ascii";
|
|
45258
|
+
}
|
|
45259
|
+
switch (effectiveMode) {
|
|
45260
|
+
case "image": {
|
|
45261
|
+
const imageSeq = getTerminalImageSequence(
|
|
45262
|
+
F5_LOGO_PNG_BASE64,
|
|
45263
|
+
capabilities,
|
|
45264
|
+
{
|
|
45265
|
+
width: F5_LOGO_DISPLAY_WIDTH,
|
|
45266
|
+
height: "auto",
|
|
45267
|
+
preserveAspectRatio: true
|
|
45268
|
+
}
|
|
45269
|
+
);
|
|
45270
|
+
return {
|
|
45271
|
+
content: imageSeq ?? "",
|
|
45272
|
+
lineCount: F5_LOGO_DISPLAY_HEIGHT,
|
|
45273
|
+
usedImage: true,
|
|
45274
|
+
capabilities,
|
|
45275
|
+
effectiveMode
|
|
45276
|
+
};
|
|
45277
|
+
}
|
|
45278
|
+
case "none":
|
|
45279
|
+
return {
|
|
45280
|
+
content: "",
|
|
45281
|
+
lineCount: 0,
|
|
45282
|
+
usedImage: false,
|
|
45283
|
+
capabilities,
|
|
45284
|
+
effectiveMode
|
|
45285
|
+
};
|
|
45286
|
+
case "ascii":
|
|
45287
|
+
default:
|
|
45288
|
+
return {
|
|
45289
|
+
content: F5_LOGO,
|
|
45290
|
+
lineCount: asciiLineCount,
|
|
45291
|
+
usedImage: false,
|
|
45292
|
+
capabilities,
|
|
45293
|
+
effectiveMode
|
|
45294
|
+
};
|
|
45295
|
+
}
|
|
45296
|
+
}
|
|
45297
|
+
function getLogoModeFromEnv(envPrefix) {
|
|
45298
|
+
const value = process.env[`${envPrefix}_LOGO`];
|
|
45299
|
+
if (!value) return void 0;
|
|
45300
|
+
const normalized = value.toLowerCase().trim();
|
|
45301
|
+
const validModes = ["image", "ascii", "none"];
|
|
45302
|
+
if (validModes.includes(normalized)) {
|
|
45303
|
+
return normalized;
|
|
45304
|
+
}
|
|
45305
|
+
return void 0;
|
|
45306
|
+
}
|
|
45307
|
+
|
|
45169
45308
|
// src/branding/index.ts
|
|
45170
45309
|
var CLI_NAME = "xcsh";
|
|
45171
45310
|
var CLI_FULL_NAME = "F5 Distributed Cloud Shell";
|
|
45172
45311
|
function getVersion() {
|
|
45173
|
-
if ("6.
|
|
45174
|
-
return "6.
|
|
45312
|
+
if ("6.24.0") {
|
|
45313
|
+
return "6.24.0";
|
|
45175
45314
|
}
|
|
45176
45315
|
if (process.env.XCSH_VERSION) {
|
|
45177
45316
|
return process.env.XCSH_VERSION;
|
|
@@ -45201,9 +45340,10 @@ var F5_LOGO = ` ________
|
|
|
45201
45340
|
(\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592)
|
|
45202
45341
|
(\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592)`;
|
|
45203
45342
|
var colors = {
|
|
45204
|
-
// F5 Brand colors
|
|
45205
|
-
|
|
45206
|
-
|
|
45343
|
+
// F5 Brand colors - brightness-adjusted for terminal rendering
|
|
45344
|
+
// PNG uses #E4002B but ANSI needs higher values to match visually
|
|
45345
|
+
red: "\x1B[38;2;202;38;10m",
|
|
45346
|
+
// F5 Brand Red (adjusted for ANSI)
|
|
45207
45347
|
boldWhite: "\x1B[1;97m",
|
|
45208
45348
|
// Bold bright white
|
|
45209
45349
|
reset: "\x1B[0m",
|
|
@@ -46783,7 +46923,7 @@ var build_default = TextInput;
|
|
|
46783
46923
|
var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
|
|
46784
46924
|
function HorizontalRule({ width }) {
|
|
46785
46925
|
const rule = "\u2500".repeat(Math.max(width, 1));
|
|
46786
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, { color: "#
|
|
46926
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Text, { color: "#CA260A", children: rule });
|
|
46787
46927
|
}
|
|
46788
46928
|
function InputBox({
|
|
46789
46929
|
prompt,
|
|
@@ -46942,33 +47082,9 @@ function getGitInfo() {
|
|
|
46942
47082
|
}
|
|
46943
47083
|
}
|
|
46944
47084
|
|
|
46945
|
-
// src/domains/login/whoami/types.ts
|
|
46946
|
-
function toDisplayTier(tier) {
|
|
46947
|
-
const normalized = tier.toUpperCase();
|
|
46948
|
-
switch (normalized) {
|
|
46949
|
-
case "STANDARD":
|
|
46950
|
-
case "BASIC":
|
|
46951
|
-
return "Standard";
|
|
46952
|
-
case "ADVANCED":
|
|
46953
|
-
case "PREMIUM":
|
|
46954
|
-
// Legacy mapping
|
|
46955
|
-
case "ENTERPRISE":
|
|
46956
|
-
return "Advanced";
|
|
46957
|
-
default:
|
|
46958
|
-
return void 0;
|
|
46959
|
-
}
|
|
46960
|
-
}
|
|
46961
|
-
|
|
46962
|
-
// src/repl/components/Banner.tsx
|
|
46963
|
-
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
|
|
46964
|
-
var TOTAL_WIDTH = 80;
|
|
46965
|
-
var INNER_WIDTH = TOTAL_WIDTH - 2;
|
|
46966
|
-
var logoLines = F5_LOGO.split("\n");
|
|
46967
|
-
var LOGO_WIDTH = Math.max(...logoLines.map((l) => stringWidth(l)));
|
|
46968
|
-
|
|
46969
47085
|
// src/repl/components/Suggestions.tsx
|
|
46970
47086
|
var import_react24 = __toESM(require_react(), 1);
|
|
46971
|
-
var
|
|
47087
|
+
var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
|
|
46972
47088
|
function getCategoryColor(category) {
|
|
46973
47089
|
switch (category) {
|
|
46974
47090
|
case "domain":
|
|
@@ -46993,10 +47109,10 @@ function SuggestionItem({
|
|
|
46993
47109
|
maxLabelWidth
|
|
46994
47110
|
}) {
|
|
46995
47111
|
const categoryColor = getCategoryColor(suggestion.category);
|
|
46996
|
-
return /* @__PURE__ */ (0,
|
|
46997
|
-
/* @__PURE__ */ (0,
|
|
46998
|
-
/* @__PURE__ */ (0,
|
|
46999
|
-
suggestion.description && /* @__PURE__ */ (0,
|
|
47112
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box_default, { children: [
|
|
47113
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: isSelected ? "#CA260A" : "#333333", children: isSelected ? "\u25B6 " : " " }),
|
|
47114
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: categoryColor, bold: isSelected, inverse: isSelected, children: suggestion.label.padEnd(maxLabelWidth) }),
|
|
47115
|
+
suggestion.description && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#666666", children: [
|
|
47000
47116
|
" - ",
|
|
47001
47117
|
suggestion.description
|
|
47002
47118
|
] })
|
|
@@ -47056,21 +47172,21 @@ function Suggestions({
|
|
|
47056
47172
|
const maxLabelWidth = Math.max(
|
|
47057
47173
|
...visibleSuggestions.map((s) => s.label.length)
|
|
47058
47174
|
);
|
|
47059
|
-
return /* @__PURE__ */ (0,
|
|
47175
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
47060
47176
|
Box_default,
|
|
47061
47177
|
{
|
|
47062
47178
|
flexDirection: "column",
|
|
47063
47179
|
borderStyle: "round",
|
|
47064
|
-
borderColor: "#
|
|
47180
|
+
borderColor: "#CA260A",
|
|
47065
47181
|
paddingX: 1,
|
|
47066
47182
|
children: [
|
|
47067
|
-
showScrollUp && /* @__PURE__ */ (0,
|
|
47183
|
+
showScrollUp && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#666666", dimColor: true, children: [
|
|
47068
47184
|
"\u25B2",
|
|
47069
47185
|
" (",
|
|
47070
47186
|
startIndex,
|
|
47071
47187
|
" more above)"
|
|
47072
47188
|
] }),
|
|
47073
|
-
visibleSuggestions.map((suggestion, index) => /* @__PURE__ */ (0,
|
|
47189
|
+
visibleSuggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
47074
47190
|
SuggestionItem,
|
|
47075
47191
|
{
|
|
47076
47192
|
suggestion,
|
|
@@ -47080,13 +47196,13 @@ function Suggestions({
|
|
|
47080
47196
|
},
|
|
47081
47197
|
suggestion.value
|
|
47082
47198
|
)),
|
|
47083
|
-
showScrollDown && /* @__PURE__ */ (0,
|
|
47199
|
+
showScrollDown && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#666666", dimColor: true, children: [
|
|
47084
47200
|
"\u25BC",
|
|
47085
47201
|
" (",
|
|
47086
47202
|
totalCount - startIndex - maxVisible,
|
|
47087
47203
|
" more below)"
|
|
47088
47204
|
] }),
|
|
47089
|
-
/* @__PURE__ */ (0,
|
|
47205
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Box_default, { marginTop: 1, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#666666", dimColor: true, children: "Tab: select | Up/Down: navigate | Esc: cancel" }) })
|
|
47090
47206
|
]
|
|
47091
47207
|
}
|
|
47092
47208
|
);
|
|
@@ -47250,6 +47366,9 @@ var DomainRegistry = class {
|
|
|
47250
47366
|
return this.showSubcommandHelp(domain, subgroup);
|
|
47251
47367
|
}
|
|
47252
47368
|
const cmdName = restArgs[0]?.toLowerCase() ?? "";
|
|
47369
|
+
if (cmdName === "--help" || cmdName === "-h" || cmdName === "help") {
|
|
47370
|
+
return this.showSubcommandHelp(domain, subgroup);
|
|
47371
|
+
}
|
|
47253
47372
|
const cmdArgs = restArgs.slice(1);
|
|
47254
47373
|
const cmd2 = subgroup.commands.get(cmdName);
|
|
47255
47374
|
if (cmd2) {
|
|
@@ -47419,6 +47538,16 @@ function errorResult(message) {
|
|
|
47419
47538
|
error: message
|
|
47420
47539
|
};
|
|
47421
47540
|
}
|
|
47541
|
+
function rawStdoutResult(content) {
|
|
47542
|
+
return {
|
|
47543
|
+
output: [],
|
|
47544
|
+
// No regular output - rawStdout is used instead
|
|
47545
|
+
shouldExit: false,
|
|
47546
|
+
shouldClear: false,
|
|
47547
|
+
contextChanged: false,
|
|
47548
|
+
rawStdout: content
|
|
47549
|
+
};
|
|
47550
|
+
}
|
|
47422
47551
|
|
|
47423
47552
|
// src/domains/login/profile/list.ts
|
|
47424
47553
|
var listCommand = {
|
|
@@ -47804,6 +47933,498 @@ var contextSubcommands = {
|
|
|
47804
47933
|
])
|
|
47805
47934
|
};
|
|
47806
47935
|
|
|
47936
|
+
// src/config/envvars.ts
|
|
47937
|
+
var EnvVarRegistry = [
|
|
47938
|
+
{
|
|
47939
|
+
name: `${ENV_PREFIX}_API_URL`,
|
|
47940
|
+
description: "API endpoint URL",
|
|
47941
|
+
relatedFlag: "",
|
|
47942
|
+
required: true
|
|
47943
|
+
},
|
|
47944
|
+
{
|
|
47945
|
+
name: `${ENV_PREFIX}_API_TOKEN`,
|
|
47946
|
+
description: "API authentication token",
|
|
47947
|
+
relatedFlag: "",
|
|
47948
|
+
required: true
|
|
47949
|
+
},
|
|
47950
|
+
{
|
|
47951
|
+
name: `${ENV_PREFIX}_NAMESPACE`,
|
|
47952
|
+
description: "Default namespace",
|
|
47953
|
+
relatedFlag: "-ns"
|
|
47954
|
+
},
|
|
47955
|
+
{
|
|
47956
|
+
name: `${ENV_PREFIX}_OUTPUT_FORMAT`,
|
|
47957
|
+
description: "Output format (json, yaml, table)",
|
|
47958
|
+
relatedFlag: "-o"
|
|
47959
|
+
},
|
|
47960
|
+
{
|
|
47961
|
+
name: `${ENV_PREFIX}_SUBSCRIPTION_TIER`,
|
|
47962
|
+
description: "Subscription tier for feature validation",
|
|
47963
|
+
relatedFlag: ""
|
|
47964
|
+
},
|
|
47965
|
+
{
|
|
47966
|
+
name: `${ENV_PREFIX}_LOGO`,
|
|
47967
|
+
description: "Logo display mode (auto, image, ascii, both, none)",
|
|
47968
|
+
relatedFlag: "--logo"
|
|
47969
|
+
},
|
|
47970
|
+
{
|
|
47971
|
+
name: "NO_COLOR",
|
|
47972
|
+
description: "Disable color output",
|
|
47973
|
+
relatedFlag: "--no-color"
|
|
47974
|
+
}
|
|
47975
|
+
];
|
|
47976
|
+
function formatEnvVarsSection() {
|
|
47977
|
+
const maxLen = Math.max(...EnvVarRegistry.map((e) => e.name.length));
|
|
47978
|
+
const lines = ["ENVIRONMENT VARIABLES"];
|
|
47979
|
+
for (const env3 of EnvVarRegistry) {
|
|
47980
|
+
const padding = " ".repeat(maxLen - env3.name.length + 3);
|
|
47981
|
+
const flagNote = env3.relatedFlag ? ` [${env3.relatedFlag}]` : "";
|
|
47982
|
+
lines.push(` ${env3.name}${padding}${env3.description}${flagNote}`);
|
|
47983
|
+
}
|
|
47984
|
+
return lines;
|
|
47985
|
+
}
|
|
47986
|
+
function formatConfigSection() {
|
|
47987
|
+
return [
|
|
47988
|
+
"CONFIGURATION",
|
|
47989
|
+
` Config file: ~/${CONFIG_FILE_NAME}`,
|
|
47990
|
+
" Priority: CLI flags > environment variables > config file > defaults",
|
|
47991
|
+
"",
|
|
47992
|
+
"DOCUMENTATION",
|
|
47993
|
+
` ${DOCS_URL}`
|
|
47994
|
+
];
|
|
47995
|
+
}
|
|
47996
|
+
|
|
47997
|
+
// src/config/settings.ts
|
|
47998
|
+
var import_yaml2 = __toESM(require_dist(), 1);
|
|
47999
|
+
import { homedir as homedir3 } from "os";
|
|
48000
|
+
import { join as join3 } from "path";
|
|
48001
|
+
var LOGO_MODES = [
|
|
48002
|
+
{
|
|
48003
|
+
mode: "image",
|
|
48004
|
+
description: "Image if terminal supports, else ASCII (default)"
|
|
48005
|
+
},
|
|
48006
|
+
{ mode: "ascii", description: "ASCII art only" },
|
|
48007
|
+
{ mode: "none", description: "No logo" }
|
|
48008
|
+
];
|
|
48009
|
+
var DEFAULT_SETTINGS = {
|
|
48010
|
+
logo: "image"
|
|
48011
|
+
};
|
|
48012
|
+
function isValidLogoMode(mode) {
|
|
48013
|
+
return LOGO_MODES.some((m) => m.mode === mode);
|
|
48014
|
+
}
|
|
48015
|
+
function validateSettings(settings) {
|
|
48016
|
+
const validated = {};
|
|
48017
|
+
if (settings.logo && isValidLogoMode(settings.logo)) {
|
|
48018
|
+
validated.logo = settings.logo;
|
|
48019
|
+
}
|
|
48020
|
+
return validated;
|
|
48021
|
+
}
|
|
48022
|
+
function loadSettingsSync() {
|
|
48023
|
+
const configPath = join3(homedir3(), CONFIG_FILE_NAME);
|
|
48024
|
+
try {
|
|
48025
|
+
const content = __require("fs").readFileSync(
|
|
48026
|
+
configPath,
|
|
48027
|
+
"utf-8"
|
|
48028
|
+
);
|
|
48029
|
+
const parsed = import_yaml2.default.parse(content);
|
|
48030
|
+
return {
|
|
48031
|
+
...DEFAULT_SETTINGS,
|
|
48032
|
+
...validateSettings(parsed)
|
|
48033
|
+
};
|
|
48034
|
+
} catch {
|
|
48035
|
+
return DEFAULT_SETTINGS;
|
|
48036
|
+
}
|
|
48037
|
+
}
|
|
48038
|
+
|
|
48039
|
+
// src/domains/login/banner/display.ts
|
|
48040
|
+
function colorizeLogoLine(line) {
|
|
48041
|
+
let result = "";
|
|
48042
|
+
let currentColor = "none";
|
|
48043
|
+
for (const char of line) {
|
|
48044
|
+
let newColor;
|
|
48045
|
+
switch (char) {
|
|
48046
|
+
case "\u2593":
|
|
48047
|
+
// Dark shade - red (rendered as solid block)
|
|
48048
|
+
case "\u2592":
|
|
48049
|
+
// Medium shade - red
|
|
48050
|
+
case "(":
|
|
48051
|
+
case ")":
|
|
48052
|
+
case "|":
|
|
48053
|
+
case "_":
|
|
48054
|
+
newColor = "red";
|
|
48055
|
+
break;
|
|
48056
|
+
case "\u2588":
|
|
48057
|
+
newColor = "white";
|
|
48058
|
+
break;
|
|
48059
|
+
default:
|
|
48060
|
+
newColor = "none";
|
|
48061
|
+
}
|
|
48062
|
+
if (newColor !== currentColor) {
|
|
48063
|
+
if (currentColor !== "none") {
|
|
48064
|
+
result += colors.reset;
|
|
48065
|
+
}
|
|
48066
|
+
if (newColor === "red") {
|
|
48067
|
+
result += colors.red;
|
|
48068
|
+
} else if (newColor === "white") {
|
|
48069
|
+
result += colors.boldWhite;
|
|
48070
|
+
}
|
|
48071
|
+
currentColor = newColor;
|
|
48072
|
+
}
|
|
48073
|
+
result += char === "\u2593" ? "\u2588" : char;
|
|
48074
|
+
}
|
|
48075
|
+
if (currentColor !== "none") {
|
|
48076
|
+
result += colors.reset;
|
|
48077
|
+
}
|
|
48078
|
+
return result;
|
|
48079
|
+
}
|
|
48080
|
+
function printImageBanner(imageSeq, imageHeight, imageWidth) {
|
|
48081
|
+
const BOX = {
|
|
48082
|
+
topLeft: "\u256D",
|
|
48083
|
+
topRight: "\u256E",
|
|
48084
|
+
bottomLeft: "\u2570",
|
|
48085
|
+
bottomRight: "\u256F",
|
|
48086
|
+
horizontal: "\u2500",
|
|
48087
|
+
vertical: "\u2502"
|
|
48088
|
+
};
|
|
48089
|
+
const TOTAL_WIDTH = 80;
|
|
48090
|
+
const INNER_WIDTH = TOTAL_WIDTH - 2;
|
|
48091
|
+
const IMAGE_COL_WIDTH = 1 + imageWidth + 1;
|
|
48092
|
+
const TEXT_COL_WIDTH = INNER_WIDTH - IMAGE_COL_WIDTH;
|
|
48093
|
+
const HELP_LINES = [
|
|
48094
|
+
"Type 'help' for commands",
|
|
48095
|
+
"Run 'namespace <ns>' to set",
|
|
48096
|
+
"Press Ctrl+C twice to exit"
|
|
48097
|
+
];
|
|
48098
|
+
const helpStartRow = Math.floor((imageHeight - HELP_LINES.length) / 2);
|
|
48099
|
+
const title = ` ${CLI_FULL_NAME} v${CLI_VERSION} `;
|
|
48100
|
+
const leftDashes = 3;
|
|
48101
|
+
const rightDashes = TOTAL_WIDTH - 1 - leftDashes - title.length - 1;
|
|
48102
|
+
process.stdout.write("\n");
|
|
48103
|
+
process.stdout.write(
|
|
48104
|
+
colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
|
|
48105
|
+
BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
|
|
48106
|
+
) + "\n"
|
|
48107
|
+
);
|
|
48108
|
+
process.stdout.write(
|
|
48109
|
+
colorRed(BOX.vertical) + " ".repeat(INNER_WIDTH) + colorRed(BOX.vertical) + "\n"
|
|
48110
|
+
);
|
|
48111
|
+
for (let row = 0; row < imageHeight; row++) {
|
|
48112
|
+
const helpIndex = row - helpStartRow;
|
|
48113
|
+
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
|
|
48114
|
+
const imageSpace = " ".repeat(IMAGE_COL_WIDTH);
|
|
48115
|
+
const paddedHelp = helpText.padEnd(TEXT_COL_WIDTH);
|
|
48116
|
+
process.stdout.write(
|
|
48117
|
+
colorRed(BOX.vertical) + imageSpace + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical) + "\n"
|
|
48118
|
+
);
|
|
48119
|
+
}
|
|
48120
|
+
process.stdout.write(
|
|
48121
|
+
colorRed(
|
|
48122
|
+
BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH) + BOX.bottomRight
|
|
48123
|
+
) + "\n"
|
|
48124
|
+
);
|
|
48125
|
+
const rowsUp = imageHeight + 1;
|
|
48126
|
+
process.stdout.write(`\x1B[${rowsUp}A`);
|
|
48127
|
+
process.stdout.write(`\x1B[2C`);
|
|
48128
|
+
process.stdout.write(imageSeq);
|
|
48129
|
+
const rowsDown = imageHeight + 1;
|
|
48130
|
+
process.stdout.write(`\x1B[${rowsDown}B`);
|
|
48131
|
+
process.stdout.write(`\x1B[1G`);
|
|
48132
|
+
process.stdout.write("\n");
|
|
48133
|
+
}
|
|
48134
|
+
function printAsciiBanner() {
|
|
48135
|
+
const BOX = {
|
|
48136
|
+
topLeft: "\u256D",
|
|
48137
|
+
topRight: "\u256E",
|
|
48138
|
+
bottomLeft: "\u2570",
|
|
48139
|
+
bottomRight: "\u256F",
|
|
48140
|
+
horizontal: "\u2500",
|
|
48141
|
+
vertical: "\u2502"
|
|
48142
|
+
};
|
|
48143
|
+
const logoLines = F5_LOGO.split("\n");
|
|
48144
|
+
const logoWidth = Math.max(...logoLines.map((l) => [...l].length));
|
|
48145
|
+
const TOTAL_WIDTH = Math.max(80, logoWidth + 4);
|
|
48146
|
+
const INNER_WIDTH = TOTAL_WIDTH - 2;
|
|
48147
|
+
const HELP_LINES = [
|
|
48148
|
+
"Type 'help' for commands",
|
|
48149
|
+
"Run 'namespace <ns>' to set",
|
|
48150
|
+
"Press Ctrl+C twice to exit"
|
|
48151
|
+
];
|
|
48152
|
+
const HELP_START_ROW = 8;
|
|
48153
|
+
const title = ` ${CLI_FULL_NAME} v${CLI_VERSION} `;
|
|
48154
|
+
const leftDashes = 3;
|
|
48155
|
+
const rightDashes = TOTAL_WIDTH - 1 - leftDashes - title.length - 1;
|
|
48156
|
+
const output = [];
|
|
48157
|
+
output.push(
|
|
48158
|
+
colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
|
|
48159
|
+
BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
|
|
48160
|
+
)
|
|
48161
|
+
);
|
|
48162
|
+
for (let i = 0; i < logoLines.length; i++) {
|
|
48163
|
+
const logoLine = logoLines[i] ?? "";
|
|
48164
|
+
const helpIndex = i - HELP_START_ROW;
|
|
48165
|
+
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
|
|
48166
|
+
const paddedLogo = logoLine.padEnd(logoWidth);
|
|
48167
|
+
const coloredLogo = colorizeLogoLine(paddedLogo);
|
|
48168
|
+
const helpColumnWidth = INNER_WIDTH - logoWidth - 1;
|
|
48169
|
+
const paddedHelp = helpText.padEnd(helpColumnWidth);
|
|
48170
|
+
output.push(
|
|
48171
|
+
colorRed(BOX.vertical) + coloredLogo + " " + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical)
|
|
48172
|
+
);
|
|
48173
|
+
}
|
|
48174
|
+
output.push(
|
|
48175
|
+
colorRed(
|
|
48176
|
+
BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH) + BOX.bottomRight
|
|
48177
|
+
)
|
|
48178
|
+
);
|
|
48179
|
+
output.push("");
|
|
48180
|
+
process.stdout.write("\n");
|
|
48181
|
+
process.stdout.write(output.join("\n") + "\n");
|
|
48182
|
+
}
|
|
48183
|
+
function getBannerLines(logoMode, useImage) {
|
|
48184
|
+
if (logoMode === "none") {
|
|
48185
|
+
return [];
|
|
48186
|
+
}
|
|
48187
|
+
const BOX = {
|
|
48188
|
+
topLeft: "\u256D",
|
|
48189
|
+
topRight: "\u256E",
|
|
48190
|
+
bottomLeft: "\u2570",
|
|
48191
|
+
bottomRight: "\u256F",
|
|
48192
|
+
horizontal: "\u2500",
|
|
48193
|
+
vertical: "\u2502"
|
|
48194
|
+
};
|
|
48195
|
+
const logoLines = F5_LOGO.split("\n");
|
|
48196
|
+
const logoWidth = Math.max(...logoLines.map((l) => [...l].length));
|
|
48197
|
+
const TOTAL_WIDTH = Math.max(80, logoWidth + 4);
|
|
48198
|
+
const INNER_WIDTH = TOTAL_WIDTH - 2;
|
|
48199
|
+
const HELP_LINES = [
|
|
48200
|
+
"Type 'help' for commands",
|
|
48201
|
+
"Run 'namespace <ns>' to set",
|
|
48202
|
+
"Press Ctrl+C twice to exit"
|
|
48203
|
+
];
|
|
48204
|
+
const title = ` ${CLI_FULL_NAME} v${CLI_VERSION} `;
|
|
48205
|
+
const leftDashes = 3;
|
|
48206
|
+
const rightDashes = TOTAL_WIDTH - 1 - leftDashes - title.length - 1;
|
|
48207
|
+
const output = [];
|
|
48208
|
+
if (useImage) {
|
|
48209
|
+
const capabilities = detectTerminalCapabilities();
|
|
48210
|
+
const imageSeq = getTerminalImageSequence(
|
|
48211
|
+
F5_LOGO_PNG_BASE64,
|
|
48212
|
+
capabilities,
|
|
48213
|
+
{
|
|
48214
|
+
width: F5_LOGO_DISPLAY_WIDTH,
|
|
48215
|
+
height: F5_LOGO_DISPLAY_HEIGHT,
|
|
48216
|
+
preserveAspectRatio: true
|
|
48217
|
+
}
|
|
48218
|
+
);
|
|
48219
|
+
if (imageSeq) {
|
|
48220
|
+
const imageHeight = F5_LOGO_DISPLAY_HEIGHT;
|
|
48221
|
+
const imageWidth = F5_LOGO_DISPLAY_WIDTH;
|
|
48222
|
+
const IMAGE_COL_WIDTH = 1 + imageWidth + 1;
|
|
48223
|
+
const TEXT_COL_WIDTH = INNER_WIDTH - IMAGE_COL_WIDTH;
|
|
48224
|
+
const helpStartRow = Math.floor(
|
|
48225
|
+
(imageHeight - HELP_LINES.length) / 2
|
|
48226
|
+
);
|
|
48227
|
+
let bannerStr = "";
|
|
48228
|
+
bannerStr += "\n";
|
|
48229
|
+
bannerStr += colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
|
|
48230
|
+
BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
|
|
48231
|
+
) + "\n";
|
|
48232
|
+
bannerStr += colorRed(BOX.vertical) + " ".repeat(INNER_WIDTH) + colorRed(BOX.vertical) + "\n";
|
|
48233
|
+
for (let row = 0; row < imageHeight; row++) {
|
|
48234
|
+
const helpIndex = row - helpStartRow;
|
|
48235
|
+
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
|
|
48236
|
+
const imageSpace = " ".repeat(IMAGE_COL_WIDTH);
|
|
48237
|
+
const paddedHelp = helpText.padEnd(TEXT_COL_WIDTH);
|
|
48238
|
+
bannerStr += colorRed(BOX.vertical) + imageSpace + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical) + "\n";
|
|
48239
|
+
}
|
|
48240
|
+
bannerStr += colorRed(
|
|
48241
|
+
BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH) + BOX.bottomRight
|
|
48242
|
+
) + "\n";
|
|
48243
|
+
const rowsUp = imageHeight + 1;
|
|
48244
|
+
bannerStr += `\x1B[${rowsUp}A`;
|
|
48245
|
+
bannerStr += `\x1B[2C`;
|
|
48246
|
+
bannerStr += imageSeq;
|
|
48247
|
+
const rowsDown = imageHeight + 1;
|
|
48248
|
+
bannerStr += `\x1B[${rowsDown}B`;
|
|
48249
|
+
bannerStr += `\x1B[1G`;
|
|
48250
|
+
return [bannerStr];
|
|
48251
|
+
}
|
|
48252
|
+
}
|
|
48253
|
+
const HELP_START_ROW = 8;
|
|
48254
|
+
output.push("");
|
|
48255
|
+
output.push(
|
|
48256
|
+
colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
|
|
48257
|
+
BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
|
|
48258
|
+
)
|
|
48259
|
+
);
|
|
48260
|
+
for (let i = 0; i < logoLines.length; i++) {
|
|
48261
|
+
const logoLine = logoLines[i] ?? "";
|
|
48262
|
+
const helpIndex = i - HELP_START_ROW;
|
|
48263
|
+
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
|
|
48264
|
+
const paddedLogo = logoLine.padEnd(logoWidth);
|
|
48265
|
+
const coloredLogo = colorizeLogoLine(paddedLogo);
|
|
48266
|
+
const helpColumnWidth = INNER_WIDTH - logoWidth - 1;
|
|
48267
|
+
const paddedHelp = helpText.padEnd(helpColumnWidth);
|
|
48268
|
+
output.push(
|
|
48269
|
+
colorRed(BOX.vertical) + coloredLogo + " " + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical)
|
|
48270
|
+
);
|
|
48271
|
+
}
|
|
48272
|
+
output.push(
|
|
48273
|
+
colorRed(
|
|
48274
|
+
BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH) + BOX.bottomRight
|
|
48275
|
+
)
|
|
48276
|
+
);
|
|
48277
|
+
output.push("");
|
|
48278
|
+
return output;
|
|
48279
|
+
}
|
|
48280
|
+
function renderBanner(logoMode, context = "startup") {
|
|
48281
|
+
const settings = loadSettingsSync();
|
|
48282
|
+
const envMode = getLogoModeFromEnv(ENV_PREFIX);
|
|
48283
|
+
const effectiveMode = resolveLogoMode({
|
|
48284
|
+
cliMode: logoMode,
|
|
48285
|
+
envMode,
|
|
48286
|
+
configMode: settings.logo
|
|
48287
|
+
});
|
|
48288
|
+
if (effectiveMode === "none") {
|
|
48289
|
+
return context === "repl" ? [] : void 0;
|
|
48290
|
+
}
|
|
48291
|
+
if (context === "repl") {
|
|
48292
|
+
const rendered2 = renderLogo(effectiveMode);
|
|
48293
|
+
const useImage = rendered2.effectiveMode === "image";
|
|
48294
|
+
return getBannerLines(rendered2.effectiveMode, useImage);
|
|
48295
|
+
}
|
|
48296
|
+
const rendered = renderLogo(effectiveMode);
|
|
48297
|
+
if (rendered.usedImage && rendered.effectiveMode === "image") {
|
|
48298
|
+
const capabilities = detectTerminalCapabilities();
|
|
48299
|
+
const imageSeq = getTerminalImageSequence(
|
|
48300
|
+
F5_LOGO_PNG_BASE64,
|
|
48301
|
+
capabilities,
|
|
48302
|
+
{
|
|
48303
|
+
width: F5_LOGO_DISPLAY_WIDTH,
|
|
48304
|
+
height: F5_LOGO_DISPLAY_HEIGHT,
|
|
48305
|
+
preserveAspectRatio: true
|
|
48306
|
+
}
|
|
48307
|
+
);
|
|
48308
|
+
if (imageSeq) {
|
|
48309
|
+
printImageBanner(
|
|
48310
|
+
imageSeq,
|
|
48311
|
+
F5_LOGO_DISPLAY_HEIGHT,
|
|
48312
|
+
F5_LOGO_DISPLAY_WIDTH
|
|
48313
|
+
);
|
|
48314
|
+
}
|
|
48315
|
+
return;
|
|
48316
|
+
}
|
|
48317
|
+
printAsciiBanner();
|
|
48318
|
+
}
|
|
48319
|
+
function parseLogoArg(args) {
|
|
48320
|
+
for (let i = 0; i < args.length; i++) {
|
|
48321
|
+
const arg = args[i];
|
|
48322
|
+
if (arg === "--logo" && args[i + 1]) {
|
|
48323
|
+
const mode = args[i + 1];
|
|
48324
|
+
if (mode && isValidLogoMode(mode)) {
|
|
48325
|
+
return mode;
|
|
48326
|
+
}
|
|
48327
|
+
} else if (arg?.startsWith("--logo=")) {
|
|
48328
|
+
const mode = arg.slice("--logo=".length);
|
|
48329
|
+
if (isValidLogoMode(mode)) {
|
|
48330
|
+
return mode;
|
|
48331
|
+
}
|
|
48332
|
+
}
|
|
48333
|
+
}
|
|
48334
|
+
return void 0;
|
|
48335
|
+
}
|
|
48336
|
+
var bannerCommand = {
|
|
48337
|
+
name: "banner",
|
|
48338
|
+
description: "Display the xcsh banner with optional logo mode",
|
|
48339
|
+
usage: "[--logo <mode>]",
|
|
48340
|
+
async execute(args, _session) {
|
|
48341
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
48342
|
+
const helpLines = [
|
|
48343
|
+
"login banner - Display the xcsh banner",
|
|
48344
|
+
"",
|
|
48345
|
+
"Usage: login banner [--logo <mode>]",
|
|
48346
|
+
"",
|
|
48347
|
+
"Options:",
|
|
48348
|
+
" --logo <mode> Logo display mode:",
|
|
48349
|
+
// Generate mode list dynamically from LOGO_MODES
|
|
48350
|
+
...LOGO_MODES.map(
|
|
48351
|
+
(m) => ` - ${m.mode.padEnd(6)} ${m.description}`
|
|
48352
|
+
),
|
|
48353
|
+
" --help, -h Show this help message",
|
|
48354
|
+
"",
|
|
48355
|
+
"Priority Resolution:",
|
|
48356
|
+
" 1. CLI flag --logo (highest)",
|
|
48357
|
+
" 2. Environment variable F5XC_LOGO",
|
|
48358
|
+
" 3. Config file ~/.xcshconfig \u2192 logo: <mode>",
|
|
48359
|
+
" 4. Auto-detect based on terminal capabilities (fallback)",
|
|
48360
|
+
"",
|
|
48361
|
+
"Examples:",
|
|
48362
|
+
" login banner # Use default/auto mode",
|
|
48363
|
+
" login banner --logo image # Force image mode",
|
|
48364
|
+
" login banner --logo ascii # Force ASCII mode"
|
|
48365
|
+
];
|
|
48366
|
+
return successResult(helpLines);
|
|
48367
|
+
}
|
|
48368
|
+
const logoMode = parseLogoArg(args);
|
|
48369
|
+
if (args.some((a) => a === "--logo" || a.startsWith("--logo=")) && !logoMode) {
|
|
48370
|
+
return errorResult("Invalid logo mode. Use: image, ascii, or none");
|
|
48371
|
+
}
|
|
48372
|
+
try {
|
|
48373
|
+
const settings = loadSettingsSync();
|
|
48374
|
+
const envMode = getLogoModeFromEnv(ENV_PREFIX);
|
|
48375
|
+
const resolvedMode = resolveLogoMode({
|
|
48376
|
+
cliMode: logoMode,
|
|
48377
|
+
envMode,
|
|
48378
|
+
configMode: settings.logo
|
|
48379
|
+
});
|
|
48380
|
+
if (resolvedMode === "none") {
|
|
48381
|
+
return successResult([]);
|
|
48382
|
+
}
|
|
48383
|
+
const rendered = renderLogo(resolvedMode);
|
|
48384
|
+
if (rendered.effectiveMode === "image") {
|
|
48385
|
+
const bannerLines = getBannerLines("image", true);
|
|
48386
|
+
if (bannerLines.length > 0 && bannerLines[0]) {
|
|
48387
|
+
return rawStdoutResult(bannerLines[0]);
|
|
48388
|
+
}
|
|
48389
|
+
}
|
|
48390
|
+
const lines = getBannerLines("ascii", false);
|
|
48391
|
+
return successResult(lines);
|
|
48392
|
+
} catch (error) {
|
|
48393
|
+
return errorResult(
|
|
48394
|
+
`Failed to display banner: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
48395
|
+
);
|
|
48396
|
+
}
|
|
48397
|
+
},
|
|
48398
|
+
async completion(partial, args, _session) {
|
|
48399
|
+
const lastArg = args[args.length - 1];
|
|
48400
|
+
if (lastArg === "--logo") {
|
|
48401
|
+
const modes = LOGO_MODES.map((m) => m.mode);
|
|
48402
|
+
return modes.filter((m) => m.startsWith(partial.toLowerCase()));
|
|
48403
|
+
}
|
|
48404
|
+
if (!args.includes("--logo") && "--logo".startsWith(partial)) {
|
|
48405
|
+
return ["--logo"];
|
|
48406
|
+
}
|
|
48407
|
+
return [];
|
|
48408
|
+
}
|
|
48409
|
+
};
|
|
48410
|
+
|
|
48411
|
+
// src/domains/login/whoami/types.ts
|
|
48412
|
+
function toDisplayTier(tier) {
|
|
48413
|
+
const normalized = tier.toUpperCase();
|
|
48414
|
+
switch (normalized) {
|
|
48415
|
+
case "STANDARD":
|
|
48416
|
+
case "BASIC":
|
|
48417
|
+
return "Standard";
|
|
48418
|
+
case "ADVANCED":
|
|
48419
|
+
case "PREMIUM":
|
|
48420
|
+
// Legacy mapping
|
|
48421
|
+
case "ENTERPRISE":
|
|
48422
|
+
return "Advanced";
|
|
48423
|
+
default:
|
|
48424
|
+
return void 0;
|
|
48425
|
+
}
|
|
48426
|
+
}
|
|
48427
|
+
|
|
47807
48428
|
// src/domains/login/whoami/service.ts
|
|
47808
48429
|
async function getWhoamiInfo(session, options = {}) {
|
|
47809
48430
|
const info = {
|
|
@@ -48045,7 +48666,10 @@ var loginDomain = {
|
|
|
48045
48666
|
description: "Authentication, identity, and session management for F5 XC. Manage connection profiles to save and switch between tenants, handle context for namespace targeting, and verify current authentication status with whoami.",
|
|
48046
48667
|
descriptionShort: "Authentication and session management",
|
|
48047
48668
|
descriptionMedium: "Manage connection profiles, authentication contexts, and session identity for F5 Distributed Cloud.",
|
|
48048
|
-
commands: /* @__PURE__ */ new Map([
|
|
48669
|
+
commands: /* @__PURE__ */ new Map([
|
|
48670
|
+
["show", whoamiCommand],
|
|
48671
|
+
["banner", bannerCommand]
|
|
48672
|
+
]),
|
|
48049
48673
|
subcommands: /* @__PURE__ */ new Map([
|
|
48050
48674
|
["profile", profileSubcommands],
|
|
48051
48675
|
["context", contextSubcommands]
|
|
@@ -50054,6 +50678,23 @@ var Completer = class {
|
|
|
50054
50678
|
}
|
|
50055
50679
|
}
|
|
50056
50680
|
}
|
|
50681
|
+
const directCmdName = args[0]?.toLowerCase() ?? "";
|
|
50682
|
+
const directCmd = domain.commands.get(directCmdName);
|
|
50683
|
+
if (directCmd?.completion) {
|
|
50684
|
+
try {
|
|
50685
|
+
const completions = await directCmd.completion(
|
|
50686
|
+
currentWord,
|
|
50687
|
+
args.slice(1),
|
|
50688
|
+
this.session
|
|
50689
|
+
);
|
|
50690
|
+
return completions.map((text) => ({
|
|
50691
|
+
text,
|
|
50692
|
+
description: "",
|
|
50693
|
+
category: "argument"
|
|
50694
|
+
}));
|
|
50695
|
+
} catch {
|
|
50696
|
+
}
|
|
50697
|
+
}
|
|
50057
50698
|
return suggestions;
|
|
50058
50699
|
}
|
|
50059
50700
|
/**
|
|
@@ -50646,7 +51287,7 @@ function useCompletion(options) {
|
|
|
50646
51287
|
}
|
|
50647
51288
|
|
|
50648
51289
|
// src/output/formatter.ts
|
|
50649
|
-
var
|
|
51290
|
+
var import_yaml3 = __toESM(require_dist(), 1);
|
|
50650
51291
|
function formatOutput(data, format = "yaml") {
|
|
50651
51292
|
if (format === "none") {
|
|
50652
51293
|
return "";
|
|
@@ -50669,7 +51310,7 @@ function formatJSON(data) {
|
|
|
50669
51310
|
return JSON.stringify(data, null, 2);
|
|
50670
51311
|
}
|
|
50671
51312
|
function formatYAML(data) {
|
|
50672
|
-
return
|
|
51313
|
+
return import_yaml3.default.stringify(data, { indent: 2 });
|
|
50673
51314
|
}
|
|
50674
51315
|
function extractItems(data) {
|
|
50675
51316
|
if (data && typeof data === "object" && "items" in data) {
|
|
@@ -50858,62 +51499,6 @@ function formatAPIError(statusCode, body, operation) {
|
|
|
50858
51499
|
return lines.join("\n");
|
|
50859
51500
|
}
|
|
50860
51501
|
|
|
50861
|
-
// src/config/envvars.ts
|
|
50862
|
-
var EnvVarRegistry = [
|
|
50863
|
-
{
|
|
50864
|
-
name: `${ENV_PREFIX}_API_URL`,
|
|
50865
|
-
description: "API endpoint URL",
|
|
50866
|
-
relatedFlag: "",
|
|
50867
|
-
required: true
|
|
50868
|
-
},
|
|
50869
|
-
{
|
|
50870
|
-
name: `${ENV_PREFIX}_API_TOKEN`,
|
|
50871
|
-
description: "API authentication token",
|
|
50872
|
-
relatedFlag: "",
|
|
50873
|
-
required: true
|
|
50874
|
-
},
|
|
50875
|
-
{
|
|
50876
|
-
name: `${ENV_PREFIX}_NAMESPACE`,
|
|
50877
|
-
description: "Default namespace",
|
|
50878
|
-
relatedFlag: "-ns"
|
|
50879
|
-
},
|
|
50880
|
-
{
|
|
50881
|
-
name: `${ENV_PREFIX}_OUTPUT_FORMAT`,
|
|
50882
|
-
description: "Output format (json, yaml, table)",
|
|
50883
|
-
relatedFlag: "-o"
|
|
50884
|
-
},
|
|
50885
|
-
{
|
|
50886
|
-
name: `${ENV_PREFIX}_SUBSCRIPTION_TIER`,
|
|
50887
|
-
description: "Subscription tier for feature validation",
|
|
50888
|
-
relatedFlag: ""
|
|
50889
|
-
},
|
|
50890
|
-
{
|
|
50891
|
-
name: "NO_COLOR",
|
|
50892
|
-
description: "Disable color output",
|
|
50893
|
-
relatedFlag: "--no-color"
|
|
50894
|
-
}
|
|
50895
|
-
];
|
|
50896
|
-
function formatEnvVarsSection() {
|
|
50897
|
-
const maxLen = Math.max(...EnvVarRegistry.map((e) => e.name.length));
|
|
50898
|
-
const lines = ["ENVIRONMENT VARIABLES"];
|
|
50899
|
-
for (const env3 of EnvVarRegistry) {
|
|
50900
|
-
const padding = " ".repeat(maxLen - env3.name.length + 3);
|
|
50901
|
-
const flagNote = env3.relatedFlag ? ` [${env3.relatedFlag}]` : "";
|
|
50902
|
-
lines.push(` ${env3.name}${padding}${env3.description}${flagNote}`);
|
|
50903
|
-
}
|
|
50904
|
-
return lines;
|
|
50905
|
-
}
|
|
50906
|
-
function formatConfigSection() {
|
|
50907
|
-
return [
|
|
50908
|
-
"CONFIGURATION",
|
|
50909
|
-
` Config file: ~/${CONFIG_FILE_NAME}`,
|
|
50910
|
-
" Priority: CLI flags > environment variables > config file > defaults",
|
|
50911
|
-
"",
|
|
50912
|
-
"DOCUMENTATION",
|
|
50913
|
-
` ${DOCS_URL}`
|
|
50914
|
-
];
|
|
50915
|
-
}
|
|
50916
|
-
|
|
50917
51502
|
// src/repl/help.ts
|
|
50918
51503
|
function formatRootHelp() {
|
|
50919
51504
|
return [
|
|
@@ -51742,6 +52327,7 @@ async function executeCommand(input, session) {
|
|
|
51742
52327
|
contextChanged: false
|
|
51743
52328
|
};
|
|
51744
52329
|
}
|
|
52330
|
+
session.addToHistory(input);
|
|
51745
52331
|
if (cmd.isDirectNavigation) {
|
|
51746
52332
|
return handleDirectNavigation(cmd, ctx, session);
|
|
51747
52333
|
}
|
|
@@ -51768,7 +52354,6 @@ async function executeCommand(input, session) {
|
|
|
51768
52354
|
};
|
|
51769
52355
|
}
|
|
51770
52356
|
}
|
|
51771
|
-
session.addToHistory(cmd.raw);
|
|
51772
52357
|
return await executeAPICommand(session, ctx, cmd);
|
|
51773
52358
|
}
|
|
51774
52359
|
function domainToResourcePath(domain) {
|
|
@@ -51976,7 +52561,14 @@ async function executeAPICommand(session, ctx, cmd) {
|
|
|
51976
52561
|
}
|
|
51977
52562
|
|
|
51978
52563
|
// src/repl/App.tsx
|
|
51979
|
-
var
|
|
52564
|
+
var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
|
|
52565
|
+
function isValidDomain2(word) {
|
|
52566
|
+
const lowerWord = word.toLowerCase();
|
|
52567
|
+
if (isCustomDomain(lowerWord)) return true;
|
|
52568
|
+
if (domainRegistry.has(lowerWord)) return true;
|
|
52569
|
+
if (extensionRegistry.getExtension(lowerWord)) return true;
|
|
52570
|
+
return false;
|
|
52571
|
+
}
|
|
51980
52572
|
function toUISuggestions(suggestions) {
|
|
51981
52573
|
return suggestions.map((s) => ({
|
|
51982
52574
|
label: s.text,
|
|
@@ -52011,12 +52603,27 @@ function App2() {
|
|
|
52011
52603
|
const [statusHint, setStatusHint] = (0, import_react28.useState)("Ctrl+C twice to exit");
|
|
52012
52604
|
const [historyArray, setHistoryArray] = (0, import_react28.useState)([]);
|
|
52013
52605
|
const [inputKey, setInputKey] = (0, import_react28.useState)(0);
|
|
52606
|
+
const [hideStatusBar, setHideStatusBar] = (0, import_react28.useState)(false);
|
|
52607
|
+
const [pendingRawStdout, setPendingRawStdout] = (0, import_react28.useState)(
|
|
52608
|
+
null
|
|
52609
|
+
);
|
|
52610
|
+
(0, import_react28.useEffect)(() => {
|
|
52611
|
+
if (hideStatusBar && pendingRawStdout) {
|
|
52612
|
+
process.stdout.write(pendingRawStdout);
|
|
52613
|
+
process.stdout.write("\n\n\n");
|
|
52614
|
+
setPendingRawStdout(null);
|
|
52615
|
+
setHideStatusBar(false);
|
|
52616
|
+
}
|
|
52617
|
+
}, [hideStatusBar, pendingRawStdout]);
|
|
52014
52618
|
const completion = useCompletion({
|
|
52015
52619
|
session: isInitialized ? session : null
|
|
52016
52620
|
});
|
|
52017
52621
|
const history = useHistory({
|
|
52018
52622
|
history: historyArray,
|
|
52019
|
-
onSelect: (cmd) =>
|
|
52623
|
+
onSelect: (cmd) => {
|
|
52624
|
+
setInput(cmd);
|
|
52625
|
+
setInputKey((k) => k + 1);
|
|
52626
|
+
}
|
|
52020
52627
|
});
|
|
52021
52628
|
const ctrlC = useDoubleCtrlC({
|
|
52022
52629
|
windowMs: 500,
|
|
@@ -52106,7 +52713,10 @@ function App2() {
|
|
|
52106
52713
|
if (!trimmed) return;
|
|
52107
52714
|
addOutput(prompt + trimmed);
|
|
52108
52715
|
const result = await executeCommand(trimmed, session);
|
|
52109
|
-
if (result.
|
|
52716
|
+
if (result.rawStdout) {
|
|
52717
|
+
setHideStatusBar(true);
|
|
52718
|
+
setPendingRawStdout(result.rawStdout);
|
|
52719
|
+
} else if (result.shouldClear) {
|
|
52110
52720
|
setOutputItems([]);
|
|
52111
52721
|
} else {
|
|
52112
52722
|
result.output.forEach((line) => addOutput(line));
|
|
@@ -52129,11 +52739,23 @@ function App2() {
|
|
|
52129
52739
|
setInput(newValue);
|
|
52130
52740
|
if (completion.isShowing) {
|
|
52131
52741
|
completion.filterSuggestions(newValue);
|
|
52742
|
+
return;
|
|
52132
52743
|
}
|
|
52133
52744
|
if (newValue !== oldValue && newValue.endsWith("/")) {
|
|
52134
52745
|
const beforeSlash = newValue.slice(0, -1);
|
|
52135
52746
|
if (beforeSlash === "" || beforeSlash.endsWith(" ")) {
|
|
52136
52747
|
completion.triggerCompletion(newValue);
|
|
52748
|
+
return;
|
|
52749
|
+
}
|
|
52750
|
+
}
|
|
52751
|
+
if (newValue !== oldValue && newValue.endsWith(" ") && !oldValue.endsWith(" ")) {
|
|
52752
|
+
const trimmed = newValue.trimEnd();
|
|
52753
|
+
const words = trimmed.split(/\s+/);
|
|
52754
|
+
if (words.length > 0 && words[0]) {
|
|
52755
|
+
const firstWord = words[0].startsWith("/") ? words[0].slice(1) : words[0];
|
|
52756
|
+
if (isValidDomain2(firstWord)) {
|
|
52757
|
+
completion.triggerCompletion(newValue);
|
|
52758
|
+
}
|
|
52137
52759
|
}
|
|
52138
52760
|
}
|
|
52139
52761
|
},
|
|
@@ -52248,10 +52870,10 @@ function App2() {
|
|
|
52248
52870
|
},
|
|
52249
52871
|
[applyCompletion, completion]
|
|
52250
52872
|
);
|
|
52251
|
-
return /* @__PURE__ */ (0,
|
|
52252
|
-
/* @__PURE__ */ (0,
|
|
52253
|
-
isInitialized ? /* @__PURE__ */ (0,
|
|
52254
|
-
/* @__PURE__ */ (0,
|
|
52873
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Box_default, { flexDirection: "column", width, children: [
|
|
52874
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Static, { items: outputItems, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Text, { children: item.content }, item.id) }),
|
|
52875
|
+
isInitialized ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
|
|
52876
|
+
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
52255
52877
|
InputBox,
|
|
52256
52878
|
{
|
|
52257
52879
|
prompt,
|
|
@@ -52263,7 +52885,7 @@ function App2() {
|
|
|
52263
52885
|
inputKey
|
|
52264
52886
|
}
|
|
52265
52887
|
),
|
|
52266
|
-
completion.isShowing && completion.suggestions.length > 0 ? /* @__PURE__ */ (0,
|
|
52888
|
+
!hideStatusBar && (completion.isShowing && completion.suggestions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
52267
52889
|
Suggestions,
|
|
52268
52890
|
{
|
|
52269
52891
|
suggestions: toUISuggestions(
|
|
@@ -52276,115 +52898,25 @@ function App2() {
|
|
|
52276
52898
|
maxVisible: 20,
|
|
52277
52899
|
isActive: false
|
|
52278
52900
|
}
|
|
52279
|
-
) : /* @__PURE__ */ (0,
|
|
52901
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
52280
52902
|
StatusBar,
|
|
52281
52903
|
{
|
|
52282
52904
|
gitInfo,
|
|
52283
52905
|
width,
|
|
52284
52906
|
hint: statusHint
|
|
52285
52907
|
}
|
|
52286
|
-
)
|
|
52287
|
-
] }) : /* @__PURE__ */ (0,
|
|
52908
|
+
))
|
|
52909
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Text, { children: "Initializing..." })
|
|
52288
52910
|
] });
|
|
52289
52911
|
}
|
|
52290
52912
|
|
|
52291
52913
|
// src/index.tsx
|
|
52292
|
-
var
|
|
52293
|
-
function colorizeLogoLine(line) {
|
|
52294
|
-
let result = "";
|
|
52295
|
-
let currentColor = "none";
|
|
52296
|
-
for (const char of line) {
|
|
52297
|
-
let newColor;
|
|
52298
|
-
switch (char) {
|
|
52299
|
-
case "\u2593":
|
|
52300
|
-
// Dark shade - red (rendered as solid block)
|
|
52301
|
-
case "\u2592":
|
|
52302
|
-
// Medium shade - red
|
|
52303
|
-
case "(":
|
|
52304
|
-
case ")":
|
|
52305
|
-
case "|":
|
|
52306
|
-
case "_":
|
|
52307
|
-
newColor = "red";
|
|
52308
|
-
break;
|
|
52309
|
-
case "\u2588":
|
|
52310
|
-
newColor = "white";
|
|
52311
|
-
break;
|
|
52312
|
-
default:
|
|
52313
|
-
newColor = "none";
|
|
52314
|
-
}
|
|
52315
|
-
if (newColor !== currentColor) {
|
|
52316
|
-
if (currentColor !== "none") {
|
|
52317
|
-
result += colors.reset;
|
|
52318
|
-
}
|
|
52319
|
-
if (newColor === "red") {
|
|
52320
|
-
result += colors.red;
|
|
52321
|
-
} else if (newColor === "white") {
|
|
52322
|
-
result += colors.boldWhite;
|
|
52323
|
-
}
|
|
52324
|
-
currentColor = newColor;
|
|
52325
|
-
}
|
|
52326
|
-
result += char === "\u2593" ? "\u2588" : char;
|
|
52327
|
-
}
|
|
52328
|
-
if (currentColor !== "none") {
|
|
52329
|
-
result += colors.reset;
|
|
52330
|
-
}
|
|
52331
|
-
return result;
|
|
52332
|
-
}
|
|
52333
|
-
function printBannerToScrollback() {
|
|
52334
|
-
const BOX = {
|
|
52335
|
-
topLeft: "\u256D",
|
|
52336
|
-
topRight: "\u256E",
|
|
52337
|
-
bottomLeft: "\u2570",
|
|
52338
|
-
bottomRight: "\u256F",
|
|
52339
|
-
horizontal: "\u2500",
|
|
52340
|
-
vertical: "\u2502",
|
|
52341
|
-
leftT: "\u251C",
|
|
52342
|
-
rightT: "\u2524"
|
|
52343
|
-
};
|
|
52344
|
-
const logoLines2 = F5_LOGO.split("\n");
|
|
52345
|
-
const logoWidth = Math.max(...logoLines2.map((l) => [...l].length));
|
|
52346
|
-
const TOTAL_WIDTH2 = Math.max(80, logoWidth + 4);
|
|
52347
|
-
const INNER_WIDTH2 = TOTAL_WIDTH2 - 2;
|
|
52348
|
-
const HELP_LINES = [
|
|
52349
|
-
"Type 'help' for commands",
|
|
52350
|
-
"Run 'namespace <ns>' to set",
|
|
52351
|
-
"Press Ctrl+C twice to exit"
|
|
52352
|
-
];
|
|
52353
|
-
const HELP_START_ROW = 8;
|
|
52354
|
-
const title = ` ${CLI_FULL_NAME} v${CLI_VERSION} `;
|
|
52355
|
-
const leftDashes = 3;
|
|
52356
|
-
const rightDashes = TOTAL_WIDTH2 - 1 - leftDashes - title.length - 1;
|
|
52357
|
-
const output = [];
|
|
52358
|
-
output.push(
|
|
52359
|
-
colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
|
|
52360
|
-
BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
|
|
52361
|
-
)
|
|
52362
|
-
);
|
|
52363
|
-
for (let i = 0; i < logoLines2.length; i++) {
|
|
52364
|
-
const logoLine = logoLines2[i] ?? "";
|
|
52365
|
-
const helpIndex = i - HELP_START_ROW;
|
|
52366
|
-
const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
|
|
52367
|
-
const paddedLogo = logoLine.padEnd(logoWidth);
|
|
52368
|
-
const coloredLogo = colorizeLogoLine(paddedLogo);
|
|
52369
|
-
const helpColumnWidth = INNER_WIDTH2 - logoWidth - 1;
|
|
52370
|
-
const paddedHelp = helpText.padEnd(helpColumnWidth);
|
|
52371
|
-
output.push(
|
|
52372
|
-
colorRed(BOX.vertical) + coloredLogo + " " + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical)
|
|
52373
|
-
);
|
|
52374
|
-
}
|
|
52375
|
-
output.push(
|
|
52376
|
-
colorRed(
|
|
52377
|
-
BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH2) + BOX.bottomRight
|
|
52378
|
-
)
|
|
52379
|
-
);
|
|
52380
|
-
output.push("");
|
|
52381
|
-
process.stdout.write(output.join("\n") + "\n");
|
|
52382
|
-
}
|
|
52914
|
+
var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
|
|
52383
52915
|
var program2 = new Command();
|
|
52384
52916
|
program2.configureHelp({
|
|
52385
52917
|
formatHelp: () => formatRootHelp().join("\n")
|
|
52386
52918
|
});
|
|
52387
|
-
program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("-i, --interactive", "Force interactive mode").option("--no-color", "Disable color output").option("-h, --help", "Show help").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).helpOption(false).action(
|
|
52919
|
+
program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("-i, --interactive", "Force interactive mode").option("--no-color", "Disable color output").option("--logo <mode>", "Logo display mode: image, ascii, none").option("-h, --help", "Show help").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).helpOption(false).action(
|
|
52388
52920
|
async (commandArgs, options) => {
|
|
52389
52921
|
if (options.help && commandArgs.length === 0) {
|
|
52390
52922
|
formatRootHelp().forEach((line) => console.log(line));
|
|
@@ -52393,6 +52925,9 @@ program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CL
|
|
|
52393
52925
|
if (options.help && commandArgs.length > 0) {
|
|
52394
52926
|
commandArgs.push("--help");
|
|
52395
52927
|
}
|
|
52928
|
+
if (options.logo && commandArgs.length > 0) {
|
|
52929
|
+
commandArgs.push("--logo", options.logo);
|
|
52930
|
+
}
|
|
52396
52931
|
if (commandArgs.length === 0 || options.interactive) {
|
|
52397
52932
|
if (!process.stdin.isTTY && !options.interactive) {
|
|
52398
52933
|
console.error(
|
|
@@ -52403,9 +52938,10 @@ program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CL
|
|
|
52403
52938
|
);
|
|
52404
52939
|
process.exit(1);
|
|
52405
52940
|
}
|
|
52406
|
-
|
|
52941
|
+
const cliLogoMode = options.logo && isValidLogoMode(options.logo) ? options.logo : void 0;
|
|
52942
|
+
renderBanner(cliLogoMode, "startup");
|
|
52407
52943
|
process.stdin.resume();
|
|
52408
|
-
render_default(/* @__PURE__ */ (0,
|
|
52944
|
+
render_default(/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(App2, {}));
|
|
52409
52945
|
return;
|
|
52410
52946
|
}
|
|
52411
52947
|
await executeNonInteractive(commandArgs);
|