From c47e19d18780fcb958a54b6856e5c8d9ddf2f97b Mon Sep 17 00:00:00 2001 From: Long Ho Date: Fri, 18 Sep 2026 16:35:55 -0400 Subject: [PATCH] fix: use source lists for extraction on Windows --- .github/workflows/ci.yaml | 4 ++++ formatjs/extract.bzl | 9 +++++++-- tests/arguments/BUILD.bazel | 19 +++++++++++++++++++ tests/arguments/large_sources.bzl | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 tests/arguments/large_sources.bzl diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c021fc9..8dfebf1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -90,3 +90,7 @@ jobs: working-directory: examples/simple shell: bash run: bazel run "@rules_formatjs//cli" -- --version + + - name: Extract messages from a large source list + shell: bash + run: bazel test //tests/arguments:large_source_list_test diff --git a/formatjs/extract.bzl b/formatjs/extract.bzl index 0e76612..766a612 100644 --- a/formatjs/extract.bzl +++ b/formatjs/extract.bzl @@ -46,7 +46,6 @@ def _formatjs_extract_impl(ctx): # Build arguments for formatjs CLI args = ctx.actions.args() args.add("extract") - args.add_all(ctx.files.srcs) args.add("--out-file", out_file) if ctx.attr.format: @@ -79,10 +78,16 @@ def _formatjs_extract_impl(ctx): if ctx.attr.flatten: args.add("--flatten") + # Keep source lists below Windows command-line limits. + sources = ctx.actions.args() + sources.add_all(ctx.files.srcs) + sources.set_param_file_format("multiline") + sources.use_param_file("--in-file=%s", use_always = True) + # Run formatjs extract (v0.1.1+ sorts keys by default) ctx.actions.run( executable = formatjs_cli_info.cli, - arguments = [args], + arguments = [args, sources], inputs = depset(ctx.files.srcs), outputs = [out_file], mnemonic = "FormatjsExtract", diff --git a/tests/arguments/BUILD.bazel b/tests/arguments/BUILD.bazel index 2e27b07..bcecb96 100644 --- a/tests/arguments/BUILD.bazel +++ b/tests/arguments/BUILD.bazel @@ -1,6 +1,8 @@ +load("@bazel_lib//lib:diff_test.bzl", "diff_test") load("@bazel_lib//lib:write_source_files.bzl", "write_source_files") load("@rules_formatjs//formatjs:compile.bzl", "formatjs_compile") load("@rules_formatjs//formatjs:extract.bzl", "formatjs_extract") +load(":large_sources.bzl", "large_sources") # Test basic extraction with default settings formatjs_extract( @@ -126,3 +128,20 @@ write_source_files( "fixtures/compiled_multiple.json": ":compiled_multiple", }, ) + +large_sources( + name = "large_sources", + src = "test.tsx", +) + +formatjs_extract( + name = "messages_large_source_list", + srcs = [":large_sources"], + id_interpolation_pattern = "[sha512:contenthash:base64:6]", +) + +diff_test( + name = "large_source_list_test", + file1 = "fixtures/messages_default.json", + file2 = ":messages_large_source_list", +) diff --git a/tests/arguments/large_sources.bzl b/tests/arguments/large_sources.bzl new file mode 100644 index 0000000..aa4506a --- /dev/null +++ b/tests/arguments/large_sources.bzl @@ -0,0 +1,18 @@ +"""Source inputs large enough to exceed Windows command-line limits.""" + +def _large_sources_impl(ctx): + outputs = [] + for index in range(512): + output = ctx.actions.declare_file("sources with spaces/source_{}.tsx".format(index)) + ctx.actions.expand_template( + template = ctx.file.src, + output = output, + substitutions = {}, + ) + outputs.append(output) + return [DefaultInfo(files = depset(outputs))] + +large_sources = rule( + implementation = _large_sources_impl, + attrs = {"src": attr.label(allow_single_file = True, mandatory = True)}, +)