@@ -24,6 +24,7 @@ import {IllegalArgumentError, SoloError} from '../core/errors.js';
24
24
import { ListrEnquirerPromptAdapter } from '@listr2/prompt-adapter-enquirer' ;
25
25
import * as helpers from '../core/helpers.js' ;
26
26
import validator from 'validator' ;
27
+ import type { AnyObject } from '../types/aliases.js' ;
27
28
28
29
export class Flags {
29
30
private static async prompt (
@@ -475,7 +476,7 @@ export class Flags {
475
476
476
477
static readonly nodeAliasesUnparsed : CommandFlag = {
477
478
constName : 'nodeAliasesUnparsed' ,
478
- name : 'node-aliases-unparsed ' ,
479
+ name : 'node-aliases' ,
479
480
definition : {
480
481
describe : 'Comma separated node aliases (empty means all nodes)' ,
481
482
alias : 'i' ,
@@ -621,6 +622,7 @@ export class Flags {
621
622
describe : 'Operator Key' ,
622
623
defaultValue : undefined ,
623
624
type : 'string' ,
625
+ dataMask : constants . STANDARD_DATAMASK ,
624
626
} ,
625
627
prompt : async function promptOperatorKey ( task : ListrTaskWrapper < any , any , any > , input : any ) {
626
628
return await Flags . promptText (
@@ -641,6 +643,7 @@ export class Flags {
641
643
describe : 'Show private key information' ,
642
644
defaultValue : false ,
643
645
type : 'boolean' ,
646
+ dataMask : constants . STANDARD_DATAMASK ,
644
647
} ,
645
648
prompt : async function promptPrivateKey ( task : ListrTaskWrapper < any , any , any > , input : any ) {
646
649
return await Flags . promptText (
@@ -989,6 +992,7 @@ export class Flags {
989
992
describe : 'path and file name of the private key for signing gossip in PEM key format to be used' ,
990
993
defaultValue : '' ,
991
994
type : 'string' ,
995
+ dataMask : constants . STANDARD_DATAMASK ,
992
996
} ,
993
997
prompt : undefined ,
994
998
} ;
@@ -1011,6 +1015,7 @@ export class Flags {
1011
1015
describe : 'path and file name of the private TLS key to be used' ,
1012
1016
defaultValue : '' ,
1013
1017
type : 'string' ,
1018
+ dataMask : constants . STANDARD_DATAMASK ,
1014
1019
} ,
1015
1020
prompt : undefined ,
1016
1021
} ;
@@ -1054,6 +1059,7 @@ export class Flags {
1054
1059
describe : 'ED25519 private key for the Hedera account' ,
1055
1060
defaultValue : '' ,
1056
1061
type : 'string' ,
1062
+ dataMask : constants . STANDARD_DATAMASK ,
1057
1063
} ,
1058
1064
prompt : async function promptPrivateKey ( task : ListrTaskWrapper < any , any , any > , input : any ) {
1059
1065
return await Flags . promptText (
@@ -1085,6 +1091,7 @@ export class Flags {
1085
1091
describe : 'ECDSA private key for the Hedera account' ,
1086
1092
defaultValue : '' ,
1087
1093
type : 'string' ,
1094
+ dataMask : constants . STANDARD_DATAMASK ,
1088
1095
} ,
1089
1096
prompt : async function promptPrivateKey ( task : ListrTaskWrapper < any , any , any > , input : any ) {
1090
1097
return await Flags . promptText (
@@ -1326,6 +1333,7 @@ export class Flags {
1326
1333
describe : 'Admin key' ,
1327
1334
defaultValue : constants . GENESIS_KEY ,
1328
1335
type : 'string' ,
1336
+ dataMask : constants . STANDARD_DATAMASK ,
1329
1337
} ,
1330
1338
prompt : undefined ,
1331
1339
} ;
@@ -1528,6 +1536,7 @@ export class Flags {
1528
1536
'with multiple nodes comma seperated)' ,
1529
1537
defaultValue : '' ,
1530
1538
type : 'string' ,
1539
+ dataMask : constants . STANDARD_DATAMASK ,
1531
1540
} ,
1532
1541
prompt : async function promptGrpcTlsKeyPath ( task : ListrTaskWrapper < any , any , any > , input : any ) {
1533
1542
return await Flags . promptText (
@@ -1551,6 +1560,7 @@ export class Flags {
1551
1560
'with multiple nodes comma seperated)' ,
1552
1561
defaultValue : '' ,
1553
1562
type : 'string' ,
1563
+ dataMask : constants . STANDARD_DATAMASK ,
1554
1564
} ,
1555
1565
prompt : async function promptGrpcWebTlsKeyPath ( task : ListrTaskWrapper < any , any , any > , input : any ) {
1556
1566
return await Flags . promptText (
@@ -1619,6 +1629,7 @@ export class Flags {
1619
1629
defaultValue : '' ,
1620
1630
describe : 'storage access key' ,
1621
1631
type : 'string' ,
1632
+ dataMask : constants . STANDARD_DATAMASK ,
1622
1633
} ,
1623
1634
prompt : undefined ,
1624
1635
} ;
@@ -1630,6 +1641,7 @@ export class Flags {
1630
1641
defaultValue : '' ,
1631
1642
describe : 'storage secret key' ,
1632
1643
type : 'string' ,
1644
+ dataMask : constants . STANDARD_DATAMASK ,
1633
1645
} ,
1634
1646
prompt : undefined ,
1635
1647
} ;
@@ -1641,6 +1653,7 @@ export class Flags {
1641
1653
defaultValue : '' ,
1642
1654
describe : 'storage endpoint URL' ,
1643
1655
type : 'string' ,
1656
+ dataMask : constants . STANDARD_DATAMASK ,
1644
1657
} ,
1645
1658
prompt : undefined ,
1646
1659
} ;
@@ -1652,6 +1665,7 @@ export class Flags {
1652
1665
defaultValue : '' ,
1653
1666
describe : 'name of storage bucket' ,
1654
1667
type : 'string' ,
1668
+ dataMask : constants . STANDARD_DATAMASK ,
1655
1669
} ,
1656
1670
prompt : undefined ,
1657
1671
} ;
@@ -1663,6 +1677,7 @@ export class Flags {
1663
1677
defaultValue : '' ,
1664
1678
describe : 'name of bucket for backing up state files' ,
1665
1679
type : 'string' ,
1680
+ dataMask : constants . STANDARD_DATAMASK ,
1666
1681
} ,
1667
1682
prompt : undefined ,
1668
1683
} ;
@@ -1674,6 +1689,7 @@ export class Flags {
1674
1689
defaultValue : '' ,
1675
1690
describe : 'path of google credential file in json format' ,
1676
1691
type : 'string' ,
1692
+ dataMask : constants . STANDARD_DATAMASK ,
1677
1693
} ,
1678
1694
prompt : undefined ,
1679
1695
} ;
@@ -1811,4 +1827,47 @@ export class Flags {
1811
1827
requiredFlagsWithDisabledPrompt : [ Flags . namespace , Flags . cacheDir , Flags . releaseTag ] ,
1812
1828
optionalFlags : [ Flags . devMode , Flags . quiet ] ,
1813
1829
} ;
1830
+
1831
+ /**
1832
+ * Processes the Argv arguments and returns them as string, all with full flag names.
1833
+ * - removes flags that match the default value.
1834
+ * - removes flags with undefined and null values.
1835
+ * - removes boolean flags that are false.
1836
+ * - masks all sensitive flags with their dataMask property.
1837
+ */
1838
+ public static stringifyArgv ( argv : AnyObject ) : string {
1839
+ const processedFlags : string [ ] = [ ] ;
1840
+
1841
+ for ( const [ name , value ] of Object . entries ( argv ) ) {
1842
+ // Remove non-flag data and boolean presence based flags that are false
1843
+ if ( name === '_' || name === '$0' || value === '' || value === false || value === undefined || value === null ) {
1844
+ continue ;
1845
+ }
1846
+
1847
+ // remove flags that use the default value
1848
+ const flag = Flags . allFlags . find ( flag => flag . name === name ) ;
1849
+ if ( ! flag || ( flag . definition . defaultValue && flag . definition . defaultValue === value ) ) {
1850
+ continue ;
1851
+ }
1852
+
1853
+ const flagName = flag . name ;
1854
+
1855
+ // if the flag is boolean based, render it without value
1856
+ if ( value === true ) {
1857
+ processedFlags . push ( `--${ flagName } ` ) ;
1858
+ }
1859
+
1860
+ // if the flag's data is masked, display it without the value
1861
+ else if ( flag . definition . dataMask ) {
1862
+ processedFlags . push ( `--${ flagName } ${ flag . definition . dataMask } ` ) ;
1863
+ }
1864
+
1865
+ // else display the full flag data
1866
+ else {
1867
+ processedFlags . push ( `--${ flagName } ${ value } ` ) ;
1868
+ }
1869
+ }
1870
+
1871
+ return processedFlags . join ( ' ' ) ;
1872
+ }
1814
1873
}
0 commit comments