@@ -79,6 +79,9 @@ def parse_rel_dependencies(self, rel_name, rel_ver, rel_dependencies):
79
79
_version = 'version'
80
80
81
81
for rel_dep_name in rel_dependencies .keys ():
82
+ # Optional, non-installed dependencies are listed as empty objects
83
+ if rel_dependencies [rel_dep_name ] == {}:
84
+ continue
82
85
if f'{ rel_name } ({ rel_ver } )' not in self .relation_tree :
83
86
self .relation_tree [f'{ rel_name } ({ rel_ver } )' ] = []
84
87
self .relation_tree [f'{ rel_name } ({ rel_ver } )' ].append (f'{ rel_dep_name } ({ rel_dependencies [rel_dep_name ][_version ]} )' )
@@ -91,13 +94,17 @@ def parse_transitive_relationship(self):
91
94
_version = 'version'
92
95
_name = 'name'
93
96
94
- cmd = 'npm ls -a --prod --json'
95
- rel_tree = subprocess .check_output (cmd , shell = True , encoding = 'utf8' )
97
+ cmd = 'npm ls -a --prod --json -s'
98
+ result = subprocess .run (cmd , shell = True , capture_output = True , text = True )
99
+ rel_tree = result .stdout
96
100
if rel_tree is None :
97
101
logger .error (f"It returns the error: { cmd } " )
98
- logger .error (f"Fail to run { cmd } " )
102
+ logger .error (f"No output for { cmd } " )
99
103
return False
100
104
105
+ if result .returncode == 1 :
106
+ logger .warning (f'npm ls returns an error code: { result .stderr } ' )
107
+
101
108
try :
102
109
rel_json = json .loads (rel_tree )
103
110
self .package_name = f'{ rel_json [_name ]} ({ rel_json [_version ]} )'
@@ -110,6 +117,7 @@ def parse_direct_dependencies(self):
110
117
self .parse_transitive_relationship ()
111
118
except Exception as e :
112
119
logger .warning (f'Cannot print direct/transitive dependency: { e } ' )
120
+ self .direct_dep = False
113
121
114
122
def parse_oss_information (self , f_name ):
115
123
with open (f_name , 'r' , encoding = 'utf8' ) as json_file :
0 commit comments