@@ -142,26 +142,31 @@ def _to_execroot_path(ctx, file):
142142
143143def _nodejs_binary_impl (ctx ):
144144 node_modules_manifest = write_node_modules_manifest (ctx )
145- node_modules = depset (ctx .files .node_modules )
145+ node_modules_depsets = []
146+ node_modules_depsets .append (depset (ctx .files .node_modules ))
146147
147148 # Also include files from npm fine grained deps as inputs.
148149 # These deps are identified by the NpmPackageInfo provider.
149150 for d in ctx .attr .data :
150151 if NpmPackageInfo in d :
151- node_modules = depset ( transitive = [ node_modules , d [NpmPackageInfo ].sources ] )
152+ node_modules_depsets . append ( d [NpmPackageInfo ].sources )
152153
153- # Using a depset will allow us to avoid flattening files and sources
154+ node_modules = depset (transitive = node_modules_depsets )
155+
156+ # Using an array of depsets will allow us to avoid flattening files and sources
154157 # inside this loop. This should reduce the performances hits,
155158 # since we don't need to call .to_list()
156- sources_sets = []
159+ # Also avoid deap transitive depset()s by creating single array of
160+ # transitive depset()s
161+ sources_depsets = []
157162
158163 for d in ctx .attr .data :
159164 # TODO: switch to JSModuleInfo when it is available
160165 if JSNamedModuleInfo in d :
161- sources_sets .append (d [JSNamedModuleInfo ].sources )
166+ sources_depsets .append (d [JSNamedModuleInfo ].sources )
162167 if hasattr (d , "files" ):
163- sources_sets .append (d .files )
164- sources = depset (transitive = sources_sets )
168+ sources_depsets .append (d .files )
169+ sources = depset (transitive = sources_depsets )
165170
166171 _write_loader_script (ctx )
167172
@@ -248,23 +253,27 @@ def _nodejs_binary_impl(ctx):
248253 is_executable = True ,
249254 )
250255
251- runfiles = depset (node_tool_files + ctx .files ._bash_runfile_helpers + [ctx .outputs .loader , ctx .file ._repository_args ], transitive = [sources , node_modules ])
256+ runfiles = []
257+ runfiles .extend (node_tool_files )
258+ runfiles .extend (ctx .files ._bash_runfile_helpers )
259+ runfiles .append (ctx .outputs .loader )
260+ runfiles .append (ctx .file ._repository_args )
252261
253262 if is_windows (ctx ):
254- runfiles = depset ([ ctx .outputs .script ], transitive = [ runfiles ] )
263+ runfiles . append ( ctx .outputs .script )
255264 executable = create_windows_native_launcher_script (ctx , ctx .outputs .script )
256265 else :
257266 executable = ctx .outputs .script
258267
259268 # entry point is only needed in runfiles if it is a .js file
260269 if ctx .file .entry_point .extension == "js" :
261- runfiles = depset ([ ctx .file .entry_point ], transitive = [ runfiles ] )
270+ runfiles . append ( ctx .file .entry_point )
262271
263272 return [
264273 DefaultInfo (
265274 executable = executable ,
266275 runfiles = ctx .runfiles (
267- transitive_files = runfiles ,
276+ transitive_files = depset ( runfiles ) ,
268277 files = node_tool_files + [
269278 ctx .outputs .loader ,
270279 ] + ctx .files ._source_map_support_files +
0 commit comments