perf: reduce large array concatenation (#1627)

diff --git a/npm/private/npm_import.bzl b/npm/private/npm_import.bzl
index 907bdc9..2bc16a9 100644
--- a/npm/private/npm_import.bzl
+++ b/npm/private/npm_import.bzl
@@ -541,12 +541,13 @@
 
     bins = _get_bin_entries(pkg_json, rctx.attr.package)
 
-    generated_by_lines = _make_generated_by_lines(rctx.attr.package, rctx.attr.version)
+    generated_by_prefix = _make_generated_by_prefix(rctx.attr.package, rctx.attr.version)
 
     bazel_name = utils.bazel_name(rctx.attr.package, rctx.attr.version)
 
     rctx_files = {
-        "BUILD.bazel": generated_by_lines + [
+        "BUILD.bazel": [
+            generated_by_prefix,
             """load("@aspect_rules_js//npm/private:npm_package_internal.bzl", _npm_package_internal = "npm_package_internal")""",
         ],
     }
@@ -565,7 +566,8 @@
         package_name_no_scope = rctx.attr.package.rsplit("/", 1)[-1]
 
         for link_package in rctx.attr.link_packages.keys():
-            bin_bzl = generated_by_lines + [
+            bin_bzl = [
+                generated_by_prefix,
                 """load("@aspect_bazel_lib//lib:directory_path.bzl", _directory_path = "directory_path")""",
                 """load("@aspect_rules_js//js:defs.bzl", _js_binary = "js_binary", _js_run_binary = "js_run_binary", _js_test = "js_test")""",
             ]
@@ -616,7 +618,7 @@
 
             build_file = paths.join(link_package, "BUILD.bazel")
             if build_file not in rctx_files:
-                rctx_files[build_file] = generated_by_lines[:]
+                rctx_files[build_file] = [generated_by_prefix]
             if rctx.attr.generate_bzl_library_targets:
                 rctx_files[build_file].append("""load("@bazel_skylib//:bzl_library.bzl", "bzl_library")""")
                 rctx_files[build_file].append(_BZL_LIBRARY_TMPL.format(
@@ -810,9 +812,9 @@
         if tmpl
     ]
 
-    generated_by_lines = _make_generated_by_lines(rctx.attr.package, rctx.attr.version)
+    generated_by_prefix = _make_generated_by_prefix(rctx.attr.package, rctx.attr.version)
 
-    rctx.file(_DEFS_BZL_FILENAME, "\n".join(generated_by_lines + npm_link_package_bzl))
+    rctx.file(_DEFS_BZL_FILENAME, generated_by_prefix + "\n" + "\n".join(npm_link_package_bzl))
 
     rctx.file("BUILD.bazel", "exports_files(%s)" % starlark_codegen_utils.to_list_attr([_DEFS_BZL_FILENAME]))
 
@@ -861,14 +863,12 @@
         bin = {paths.basename(package): bin}
     return bin
 
-def _make_generated_by_lines(package, version):
-    return [
-        "\"@generated by @aspect_rules_js//npm/private:npm_import.bzl for npm package {package}@{version}\"".format(
-            package = package,
-            version = version,
-        ),
-        "",  # empty line after bzl docstring since buildifier expects this if this file is vendored in
-    ]
+def _make_generated_by_prefix(package, version):
+    # empty line after bzl docstring since buildifier expects this if this file is vendored in
+    return "\"@generated by @aspect_rules_js//npm/private:npm_import.bzl for npm package {package}@{version}\"\n".format(
+        package = package,
+        version = version,
+    )
 
 npm_import_links_lib = struct(
     implementation = _npm_import_links_rule_impl,
diff --git a/npm/private/npm_translate_lock_generate.bzl b/npm/private/npm_translate_lock_generate.bzl
index b383460..9df0d6f 100644
--- a/npm/private/npm_translate_lock_generate.bzl
+++ b/npm/private/npm_translate_lock_generate.bzl
@@ -89,10 +89,8 @@
 
 # buildifier: disable=function-docstring
 def generate_repository_files(rctx, pnpm_lock_label, importers, packages, patched_dependencies, root_package, default_registry, npm_registries, npm_auth, link_workspace):
-    generated_by_lines = [
-        "\"\"\"@generated by npm_translate_lock(name = \"{}\", pnpm_lock = \"{}\")\"\"\"".format(helpers.to_apparent_repo_name(rctx.name), utils.consistent_label_str(pnpm_lock_label)),
-        "",  # empty line after bzl docstring since buildifier expects this if this file is vendored in
-    ]
+    # empty line after bzl docstring since buildifier expects this if this file is vendored in
+    generated_by_prefix = "\"\"\"@generated by npm_translate_lock(name = \"{}\", pnpm_lock = \"{}\")\"\"\"\n".format(helpers.to_apparent_repo_name(rctx.name), utils.consistent_label_str(pnpm_lock_label))
 
     npm_imports = helpers.get_npm_imports(importers, packages, patched_dependencies, root_package, rctx.name, rctx.attr, rctx.attr.lifecycle_hooks, rctx.attr.lifecycle_hooks_execution_requirements, rctx.attr.lifecycle_hooks_use_default_shell_env, npm_registries, default_registry, npm_auth)
 
@@ -414,11 +412,12 @@
                     link_package = link_package,
                     package_json_bzl = _PACKAGE_JSON_BZL_FILENAME,
                 )
-                rctx.file(package_json_bzl_file_path, "\n".join([
+                rctx.file(
+                    package_json_bzl_file_path,
                     _BIN_TMPL.format(
                         repo_package_json_bzl = repo_package_json_bzl,
                     ),
-                ]))
+                )
 
     if len(stores_bzl) > 0:
         npm_link_all_packages_bzl.append("""    if is_root:""")
@@ -516,8 +515,15 @@
 
     npm_link_targets_bzl.append("""    return link_targets""")
 
-    rctx_files[rctx.attr.defs_bzl_filename] = ["\n".join(defs_bzl_header + [""] + npm_link_all_packages_bzl + [""] + npm_link_targets_bzl + [""])]
-    rctx_files[rctx.attr.repositories_bzl_filename] = ["\n".join(repositories_bzl)]
+    rctx_files[rctx.attr.defs_bzl_filename] = [
+        "\n".join(defs_bzl_header),
+        "",
+        "\n".join(npm_link_all_packages_bzl),
+        "",
+        "\n".join(npm_link_targets_bzl),
+        "",
+    ]
+    rctx_files[rctx.attr.repositories_bzl_filename] = repositories_bzl
 
     for filename, contents in rctx.attr.additional_file_contents.items():
         if not filename in rctx_files.keys():
@@ -536,4 +542,4 @@
             rctx_files[filename].extend(contents)
 
     for filename, contents in rctx_files.items():
-        rctx.file(filename, "\n".join(generated_by_lines + contents))
+        rctx.file(filename, generated_by_prefix + "\n" + "\n".join(contents))