Skip to content

Commit fb5d205

Browse files
committed
Release 0.7.1
1 parent 55863ed commit fb5d205

5 files changed

Lines changed: 25 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## 0.7.1
4+
5+
### Fixed
6+
7+
- Fix `parse/2` hitting serde_json recursion limit on deeply nested ASTs (e.g. large bundled output from Vue + reka-ui). Uses streaming deserializer with unbounded depth.
8+
39
## 0.7.0
410

511
### Breaking changes

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule OXC.MixProject do
22
use Mix.Project
33

4-
@version "0.7.0"
4+
@version "0.7.1"
55
@source_url "https://github.com/elixir-volt/oxc_ex"
66

77
def project do

native/oxc_ex_nif/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ oxc_resolver = "=11.10.0"
2727
rolldown = "=0.1.0"
2828
rolldown_common = "=0.1.0"
2929
serde = { version = "1", features = ["derive"] }
30-
serde_json = "1"
30+
serde_json = { version = "1", features = ["unbounded_depth"] }
3131
tempfile = "3"
3232
tokio = { version = "1", features = ["rt", "time"] }

native/oxc_ex_nif/src/parse.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,14 @@ pub fn parse<'a>(env: Env<'a>, source: &str, filename: &str) -> NifResult<Term<'
7777
// OXC's ESTree serializer outputs JSON strings via a custom compact serializer
7878
// (not standard serde::Serialize). Parsing back to Value is unavoidable without
7979
// writing a custom OXC-to-BEAM-term serializer.
80-
let json = serde_json::from_str::<Value>(&ret.program.to_estree_ts_json(false)).unwrap();
80+
let json_str = ret.program.to_estree_ts_json(false);
81+
let mut deserializer = serde_json::Deserializer::from_str(&json_str);
82+
deserializer.disable_recursion_limit();
83+
let json: Value = match deserializer.into_iter().next() {
84+
Some(Ok(v)) => v,
85+
Some(Err(e)) => return error_to_term(env, &[format!("Failed to deserialize ESTree JSON: {e}")]),
86+
None => return error_to_term(env, &["Empty ESTree JSON output".to_string()]),
87+
};
8188
encode_ok(env, json)
8289
}
8390

test/oxc_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,15 @@ defmodule OXCTest do
707707
end
708708
end
709709

710+
711+
describe "parse/2 recursion depth" do
712+
test "handles deeply nested expressions without recursion limit" do
713+
depth = 200
714+
code = "const x = " <> String.duplicate("(", depth) <> "42" <> String.duplicate(")", depth) <> ";"
715+
assert {:ok, %{"type" => "Program"}} = OXC.parse(code, "deep.js")
716+
end
717+
end
718+
710719
defp collect_messages(tag) do
711720
collect_messages(tag, [])
712721
end

0 commit comments

Comments
 (0)