From a806ee99481710939d91b42e0021b57fe4f612cc Mon Sep 17 00:00:00 2001 From: Google JSIR Bot Date: Thu, 7 May 2026 16:55:32 -0700 Subject: [PATCH] No public description PiperOrigin-RevId: 912225855 --- maldoca/js/babel/babel.h | 3 +++ maldoca/js/babel/babel.proto | 3 +++ maldoca/js/babel/babel_internal.cc | 1 + maldoca/js/babel/babel_internal.proto | 5 +++++ maldoca/js/babel/babel_test.cc | 23 +++++++++++++++++++++++ maldoca/js/quickjs_babel/native.js | 16 ++++++++++++---- maldoca/js/quickjs_babel/quickjs_babel.cc | 6 ++++++ 7 files changed, 53 insertions(+), 4 deletions(-) diff --git a/maldoca/js/babel/babel.h b/maldoca/js/babel/babel.h index 8947d78..c2590f4 100644 --- a/maldoca/js/babel/babel.h +++ b/maldoca/js/babel/babel.h @@ -41,6 +41,9 @@ struct BabelGenerateResult { // TODO: Determine if source_code and error can co-exist, or they should be in // a std::variant. std::optional error; + + // The generated source map, if requested. + std::optional source_map; }; class Babel { diff --git a/maldoca/js/babel/babel.proto b/maldoca/js/babel/babel.proto index 14c6140..d7ba825 100644 --- a/maldoca/js/babel/babel.proto +++ b/maldoca/js/babel/babel.proto @@ -161,6 +161,9 @@ message BabelGenerateOptions { // Whether to minify the generated source. optional bool compact = 2 [default = false]; + + // Whether to generate source maps. + optional bool source_maps = 3 [default = false]; } message PositionPb { diff --git a/maldoca/js/babel/babel_internal.cc b/maldoca/js/babel/babel_internal.cc index 3c9c290..50ab2a5 100644 --- a/maldoca/js/babel/babel_internal.cc +++ b/maldoca/js/babel/babel_internal.cc @@ -75,6 +75,7 @@ nlohmann::json BabelGenerateOptionsToJson(const BabelGenerateOptions &options, {"comments", options.include_comments()}, {"compact", options.compact()}, {"base64DecodeStringLiterals", string_literals_base64_encoded}, + {"sourceMaps", options.source_maps()}, }; return json; diff --git a/maldoca/js/babel/babel_internal.proto b/maldoca/js/babel/babel_internal.proto index 0590756..8fc2cdf 100644 --- a/maldoca/js/babel/babel_internal.proto +++ b/maldoca/js/babel/babel_internal.proto @@ -38,6 +38,9 @@ message BabelGenerateRequest { // Whether to minify the generated source. optional bool compact = 3 [default = false]; + + // Whether to generate source maps. + optional bool source_maps = 4 [default = false]; } message BabelResponse { @@ -62,4 +65,6 @@ message BabelParseResponse { message BabelGenerateResponse { // Babel throws exceptions if the provided AST is invalid. optional BabelError error = 1; + + optional string source_map = 2; } diff --git a/maldoca/js/babel/babel_test.cc b/maldoca/js/babel/babel_test.cc index f7a5370..ac3fc47 100644 --- a/maldoca/js/babel/babel_test.cc +++ b/maldoca/js/babel/babel_test.cc @@ -337,6 +337,29 @@ TEST_P(BabelTest, GenerateCompact) { } } +TEST_P(BabelTest, GenerateSourceMap) { + static const char kSourceMap[] = + R"({"version":3,"names":["console","log"],"sources":["source.js"],"sourcesContent":[null],"mappings":"AAAAA,OAAO,CAACC,GAAG,CAAC,eAAe,CAAC","ignoreList":[]})"; + + std::unique_ptr babel = GetParam().babel_factory(); + BabelParseRequest request; + MALDOCA_ASSERT_OK_AND_ASSIGN( + BabelParseResult parse_result, + babel->Parse(kSource, request, absl::InfiniteDuration())); + + BabelGenerateOptions options; + options.set_source_maps(true); + + MALDOCA_ASSERT_OK_AND_ASSIGN(BabelGenerateResult generate_result, + babel->Generate(parse_result.ast_string, options, + absl::InfiniteDuration())); + + EXPECT_EQ(generate_result.source_code, kSource); + EXPECT_EQ(generate_result.error, std::nullopt); + EXPECT_TRUE(generate_result.source_map.has_value()); + EXPECT_THAT(*generate_result.source_map, StrEq(kSourceMap)); +} + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(BabelTest); } // namespace maldoca diff --git a/maldoca/js/quickjs_babel/native.js b/maldoca/js/quickjs_babel/native.js index 916a983..2f7a88a 100644 --- a/maldoca/js/quickjs_babel/native.js +++ b/maldoca/js/quickjs_babel/native.js @@ -379,8 +379,12 @@ function generateInternal(ast, options) { convertCommentUidsToComments(ast); - const {code} = Babel.packages.generator.default(ast, options); - return code; + if (options.sourceMaps) { + options.sourceFileName = 'source.js'; + } + + const {code, map} = Babel.packages.generator.default(ast, options); + return {code, map}; } exports.generateInternal = generateInternal; @@ -523,8 +527,12 @@ exports.generate = function(astString, optionsSerialized) { options = JSON.parse(optionsSerialized); } - const source = generateInternal(ast, options); - return {source, response: '{}'}; + const {code, map} = generateInternal(ast, options); + const response = {}; + if (map) { + response.sourceMap = JSON.stringify(map); + } + return {source: code, response: JSON.stringify(response)}; } catch (error) { const response = {}; diff --git a/maldoca/js/quickjs_babel/quickjs_babel.cc b/maldoca/js/quickjs_babel/quickjs_babel.cc index c58518f..44b4b6f 100644 --- a/maldoca/js/quickjs_babel/quickjs_babel.cc +++ b/maldoca/js/quickjs_babel/quickjs_babel.cc @@ -229,9 +229,15 @@ absl::StatusOr QuickJsBabel::Generate( error = response.error(); } + std::optional source_map; + if (response.has_source_map()) { + source_map = response.source_map(); + } + return BabelGenerateResult{ .source_code = std::move(*source_code), .error = error, + .source_map = source_map, }; }