Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 49 additions & 23 deletions engine/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions engine/language_client_typescript/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,15 @@ futures.workspace = true
indexmap.workspace = true
internal-baml-codegen.workspace = true
log.workspace = true
napi = { version = "2", features = [
napi = { version = "3.1.3", features = [
"anyhow",
"async",
"napi5",
"serde-json",
"tokio_rt",
"compat-mode",
] }
napi-derive = "2"
napi-derive = "3.1.1"
serde.workspace = true
serde_json.workspace = true
tokio = { version = "1", features = ["full"] }
Expand All @@ -48,4 +49,4 @@ tracing-subscriber = { version = "0.3.18", features = [
] }

[build-dependencies]
napi-build = "2.1.3"
napi-build = "2.2.3"
2 changes: 1 addition & 1 deletion engine/language_client_typescript/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
},
"devDependencies": {
"@biomejs/biome": "^1.7.3",
"@napi-rs/cli": "3.0.0-alpha.62",
"@napi-rs/cli": "3.0.4",
"@types/jest": "^29.5.14",
"@types/node": "^20.12.11",
"jest": "^29.7.0",
Expand Down
2 changes: 1 addition & 1 deletion engine/language_client_typescript/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ pub fn set_log_max_chunk_length(length: u32) {
let _ = baml_log::set_max_message_length(length as usize);
}

#[napi::module_init]
#[napi_derive::module_init]
fn module_init() {
match baml_log::init() {
Ok(_) => (),
Expand Down
43 changes: 30 additions & 13 deletions engine/language_client_typescript/src/parse_ts_types.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use baml_types::{BamlMap, BamlValue};
use napi::{
bindgen_prelude::*, JsBoolean, JsDate, JsExternal, JsNumber, JsObject, JsString, JsUnknown,
NapiRaw,
bindgen_prelude::*, JsBoolean, JsDate, JsExternal, JsNumber, JsObject, JsString, NapiRaw,
Unknown,
};

use crate::types::{audio::BamlAudio, image::BamlImage, pdf::BamlPdf, video::BamlVideo};
Expand Down Expand Up @@ -46,6 +46,7 @@ impl From<Errors> for napi::Error {

// use the FromNapiValue implementation for serde_json::Number here
// https://github.com/napi-rs/napi-rs/blob/b2239fd880fa40fa98d206d8f31aec1bb8a0ce12/crates/napi/src/bindgen_runtime/js_values/serde.rs#L147
#[allow(dead_code)]
fn from_napi_number(env: Env, napi_val: JsNumber) -> Result<BamlValue> {
let n = unsafe { f64::from_napi_value(env.raw(), napi_val.raw())? };
// Try to auto-convert to integers
Expand Down Expand Up @@ -96,7 +97,8 @@ pub fn js_object_to_baml_value(env: Env, kwargs: JsObject) -> napi::Result<BamlV
}
Ok(BamlValue::List(args))
} else if kwargs.is_date()? {
let date: JsDate = unsafe { kwargs.into_unknown().cast() };
let date: JsDate =
unsafe { JsDate::from_napi_value(env.raw(), kwargs.into_unknown().raw())? };
let timestamp = date.value_of()?;
// TODO: Convert timestamp to a DateTime
Ok(BamlValue::Float(timestamp))
Expand All @@ -118,7 +120,7 @@ pub fn js_object_to_baml_value(env: Env, kwargs: JsObject) -> napi::Result<BamlV
log::trace!("Processing object with {num_keys} keys");
for i in 0..num_keys {
let key = keys.get_element::<JsString>(i)?;
let param: JsUnknown = kwargs.get_property(key)?;
let param: Unknown = kwargs.get_property(key)?;
let key_as_string = key.into_utf8()?.as_str()?.to_string();

log::trace!("Processing key: {key_as_string}");
Expand All @@ -144,26 +146,41 @@ pub fn js_object_to_baml_value(env: Env, kwargs: JsObject) -> napi::Result<BamlV

pub fn jsunknown_to_baml_value(
env: Env,
item: JsUnknown,
item: Unknown,
skip_unsupported: bool,
) -> napi::Result<Option<BamlValue>> {
let item_type = item.get_type()?;
log::trace!("Processing item of type: {item_type:?}");
Ok(Some(match item_type {
ValueType::Boolean => {
let b: JsBoolean = unsafe { item.cast() };
BamlValue::Bool(b.get_value()?)
let b: bool = unsafe { bool::from_napi_value(env.raw(), item.raw())? };
BamlValue::Bool(b)
}
ValueType::Number => {
let n: JsNumber = unsafe { item.cast() };
from_napi_number(env, n)?
let n: f64 = unsafe { f64::from_napi_value(env.raw(), item.raw())? };
// Try to auto-convert to integers
let n = if n.trunc() == n {
if n >= 0.0f64 && n <= u32::MAX as f64 {
// This can be represented as u32
BamlValue::Int(n as i64)
} else if n < 0.0f64 && n >= i32::MIN as f64 {
BamlValue::Int(n as i64)
} else {
// must be a float
BamlValue::Float(n)
}
} else {
// must be a float
BamlValue::Float(n)
};
n
}
ValueType::String => {
let s: JsString = unsafe { item.cast() };
BamlValue::String(s.into_utf8()?.as_str()?.to_string())
let s: String = unsafe { String::from_napi_value(env.raw(), item.raw())? };
BamlValue::String(s)
}
ValueType::Object => {
let obj: JsObject = unsafe { item.cast() };
let obj: JsObject = unsafe { JsObject::from_napi_value(env.raw(), item.raw())? };
js_object_to_baml_value(env, obj)?
}
ValueType::Undefined | ValueType::Null => BamlValue::Null,
Expand All @@ -184,7 +201,7 @@ pub fn jsunknown_to_baml_value(
));
}
ValueType::External => {
let external = unsafe { item.cast::<JsExternal>() };
let external = unsafe { JsExternal::from_napi_value(env.raw(), item.raw())? };
if let Ok(img) = env.get_value_external::<BamlImage>(&external) {
BamlValue::Media(img.inner.clone())
} else if let Ok(audio) = env.get_value_external::<BamlAudio>(&external) {
Expand Down
Loading