From a493a8b5b92b9ca11473581cb6be115b02b367cf Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Tue, 27 Feb 2024 20:58:20 -0500 Subject: [PATCH] update napi and fix more get_named_property calls --- Cargo.lock | 14 +++++++------- napi/src/lib.rs | 19 +++++++++++-------- napi/src/transformer.rs | 29 +++++------------------------ napi/src/utils.rs | 7 +++++++ node/Cargo.toml | 2 +- 5 files changed, 31 insertions(+), 40 deletions(-) create mode 100644 napi/src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index 97cbc6b1..a4e19974 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -408,12 +408,12 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.26" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +checksum = "ad291aa74992b9b7a7e88c38acbbf6ad7e107f1d90ee8775b7bc1fc3394f485c" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.39", ] [[package]] @@ -890,17 +890,17 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "napi" -version = "2.10.3" +version = "2.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a967e17e9ba4e015a7bf9b92f90aa8dc321c6d913f6a6d2afd5b66a8ab36fc81" +checksum = "72e0dc78e0524286630914db66e31bad70160e379705a9ce92e0161ce2389d89" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "ctor", + "napi-derive", "napi-sys", "once_cell", "serde", "serde_json", - "thread_local", ] [[package]] diff --git a/napi/src/lib.rs b/napi/src/lib.rs index 8127b18e..e756f591 100644 --- a/napi/src/lib.rs +++ b/napi/src/lib.rs @@ -24,6 +24,7 @@ mod at_rule_parser; mod threadsafe_function; #[cfg(feature = "visitor")] mod transformer; +mod utils; #[cfg(feature = "visitor")] use transformer::JsVisitor; @@ -34,6 +35,8 @@ struct JsVisitor; #[cfg(feature = "visitor")] use lightningcss::visitor::Visit; +use utils::get_named_property; + #[derive(Serialize)] #[serde(rename_all = "camelCase")] struct TransformResult<'i> { @@ -73,7 +76,7 @@ impl<'i> TransformResult<'i> { #[cfg(feature = "visitor")] fn get_visitor(env: Env, opts: &JsObject) -> Option { - if let Ok(visitor) = opts.get_named_property::("visitor") { + if let Ok(visitor) = get_named_property::(opts, "visitor") { Some(JsVisitor::new(env, visitor)) } else { None @@ -243,7 +246,7 @@ mod bundle { // Otherwise, send the result immediately. if result.is_promise()? { let result: JsObject = result.try_into()?; - let then: JsFunction = result.get_named_property("then")?; + let then: JsFunction = get_named_property(&result, "then")?; let tx2 = tx.clone(); let cb = env.create_function_from_closure("callback", move |ctx| { let res = ctx.get::(0)?.into_utf8()?; @@ -306,9 +309,9 @@ mod bundle { let config: BundleConfig = ctx.env.from_js_value(&opts)?; - if let Ok(resolver) = opts.get_named_property::("resolver") { + if let Ok(resolver) = get_named_property::(&opts, "resolver") { let read = if resolver.has_named_property("read")? { - let read = resolver.get_named_property::("read")?; + let read = get_named_property::(&resolver, "read")?; Some(ThreadsafeFunction::create( ctx.env.raw(), unsafe { read.raw() }, @@ -320,7 +323,7 @@ mod bundle { }; let resolve = if resolver.has_named_property("resolve")? { - let resolve = resolver.get_named_property::("resolve")?; + let resolve = get_named_property::(&resolver, "resolve")?; Some(ThreadsafeFunction::create( ctx.env.raw(), unsafe { resolve.raw() }, @@ -427,10 +430,10 @@ mod bundle { let opts = ctx.get::(0)?; let mut visitor = get_visitor(*ctx.env, &opts); - let resolver = opts.get_named_property::("resolver")?; - let read = resolver.get_named_property::("read")?; + let resolver = get_named_property::(opts, "resolver")?; + let read = get_named_property::(resolver, "read")?; let resolve = if resolver.has_named_property("resolve")? { - let resolve = resolver.get_named_property::("resolve")?; + let resolve = get_named_property::(resolver, "resolve")?; Some(ctx.env.create_reference(resolve)?) } else { None diff --git a/napi/src/transformer.rs b/napi/src/transformer.rs index 044daf5d..ad20c611 100644 --- a/napi/src/transformer.rs +++ b/napi/src/transformer.rs @@ -24,7 +24,7 @@ use napi::{Env, JsFunction, JsObject, JsUnknown, Ref, ValueType}; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; -use crate::at_rule_parser::AtRule; +use crate::{at_rule_parser::AtRule, utils::get_named_property}; pub struct JsVisitor { env: Env, @@ -99,14 +99,7 @@ impl Visitors { fn named(&self, stage: VisitStage, name: &str) -> Option { self .for_stage(stage) - .and_then(|m| m.get_named_property::(name).ok()) - .and_then(|v| { - if let Ok(ValueType::Function) = v.get_type() { - v.try_into().ok() - } else { - None - } - }) + .and_then(|m| get_named_property::(m, name).ok()) } fn custom(&self, stage: VisitStage, obj: &str, name: &str) -> Option { @@ -119,7 +112,7 @@ impl Visitors { Ok(ValueType::Object) => { let o: napi::Result = v.try_into(); if let Ok(o) = o { - return o.get_named_property::(name).ok(); + return get_named_property::(&o, name).ok(); } } _ => {} @@ -184,13 +177,7 @@ impl JsVisitor { let mut types = VisitTypes::empty(); macro_rules! get { ($name: literal, $( $t: ident )|+) => {{ - let res: Option = visitor.get_named_property::($name).ok().and_then(|v| { - if let Ok(ValueType::Function) = v.get_type() { - v.try_into().ok() - } else { - None - } - }); + let res: Option = get_named_property(&visitor, $name).ok(); if res.is_some() { types |= $( VisitTypes::$t )|+; @@ -204,13 +191,7 @@ impl JsVisitor { macro_rules! map { ($name: literal, $( $t: ident )|+) => {{ - let obj: Option = visitor.get_named_property::($name).ok().and_then(|v| { - if let Ok(ValueType::Object) = v.get_type() { - v.try_into().ok() - } else { - None - } - }); + let obj: Option = get_named_property(&visitor, $name).ok(); if obj.is_some() { types |= $( VisitTypes::$t )|+; diff --git a/napi/src/utils.rs b/napi/src/utils.rs new file mode 100644 index 00000000..90ac1495 --- /dev/null +++ b/napi/src/utils.rs @@ -0,0 +1,7 @@ +use napi::{Error, JsObject, JsUnknown, Result}; + +// Workaround for https://github.com/napi-rs/napi-rs/issues/1641 +pub fn get_named_property>(obj: &JsObject, property: &str) -> Result { + let unknown = obj.get_named_property::(property)?; + T::try_from(unknown) +} diff --git a/node/Cargo.toml b/node/Cargo.toml index b85a64a9..4f9e8b75 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["cdylib"] [dependencies] lightningcss-napi = { version = "0.1.0", path = "../napi", features = ["bundler", "visitor"] } -napi = {version = "=2.10.3", default-features = false, features = ["compat-mode"]} +napi = {version = "2.15.4", default-features = false, features = ["compat-mode"]} napi-derive = "2" [target.'cfg(target_os = "macos")'.dependencies]