Skip to content

Commit

Permalink
update napi and fix more get_named_property calls
Browse files Browse the repository at this point in the history
  • Loading branch information
devongovett committed Feb 28, 2024
1 parent bdf4a77 commit a493a8b
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 40 deletions.
14 changes: 7 additions & 7 deletions Cargo.lock

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

19 changes: 11 additions & 8 deletions napi/src/lib.rs
Expand Up @@ -24,6 +24,7 @@ mod at_rule_parser;
mod threadsafe_function;
#[cfg(feature = "visitor")]
mod transformer;
mod utils;

#[cfg(feature = "visitor")]
use transformer::JsVisitor;
Expand All @@ -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> {
Expand Down Expand Up @@ -73,7 +76,7 @@ impl<'i> TransformResult<'i> {

#[cfg(feature = "visitor")]
fn get_visitor(env: Env, opts: &JsObject) -> Option<JsVisitor> {
if let Ok(visitor) = opts.get_named_property::<JsObject>("visitor") {
if let Ok(visitor) = get_named_property::<JsObject>(opts, "visitor") {
Some(JsVisitor::new(env, visitor))
} else {
None
Expand Down Expand Up @@ -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::<JsString>(0)?.into_utf8()?;
Expand Down Expand Up @@ -306,9 +309,9 @@ mod bundle {

let config: BundleConfig = ctx.env.from_js_value(&opts)?;

if let Ok(resolver) = opts.get_named_property::<JsObject>("resolver") {
if let Ok(resolver) = get_named_property::<JsObject>(&opts, "resolver") {
let read = if resolver.has_named_property("read")? {
let read = resolver.get_named_property::<JsFunction>("read")?;
let read = get_named_property::<JsFunction>(&resolver, "read")?;
Some(ThreadsafeFunction::create(
ctx.env.raw(),
unsafe { read.raw() },
Expand All @@ -320,7 +323,7 @@ mod bundle {
};

let resolve = if resolver.has_named_property("resolve")? {
let resolve = resolver.get_named_property::<JsFunction>("resolve")?;
let resolve = get_named_property::<JsFunction>(&resolver, "resolve")?;
Some(ThreadsafeFunction::create(
ctx.env.raw(),
unsafe { resolve.raw() },
Expand Down Expand Up @@ -427,10 +430,10 @@ mod bundle {
let opts = ctx.get::<JsObject>(0)?;
let mut visitor = get_visitor(*ctx.env, &opts);

let resolver = opts.get_named_property::<JsObject>("resolver")?;
let read = resolver.get_named_property::<JsFunction>("read")?;
let resolver = get_named_property::<JsObject>(opts, "resolver")?;
let read = get_named_property::<JsFunction>(resolver, "read")?;
let resolve = if resolver.has_named_property("resolve")? {
let resolve = resolver.get_named_property::<JsFunction>("resolve")?;
let resolve = get_named_property::<JsFunction>(resolver, "resolve")?;
Some(ctx.env.create_reference(resolve)?)
} else {
None
Expand Down
29 changes: 5 additions & 24 deletions napi/src/transformer.rs
Expand Up @@ -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,
Expand Down Expand Up @@ -99,14 +99,7 @@ impl Visitors<JsObject> {
fn named(&self, stage: VisitStage, name: &str) -> Option<JsFunction> {
self
.for_stage(stage)
.and_then(|m| m.get_named_property::<JsUnknown>(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::<JsFunction>(m, name).ok())
}

fn custom(&self, stage: VisitStage, obj: &str, name: &str) -> Option<JsFunction> {
Expand All @@ -119,7 +112,7 @@ impl Visitors<JsObject> {
Ok(ValueType::Object) => {
let o: napi::Result<JsObject> = v.try_into();
if let Ok(o) = o {
return o.get_named_property::<JsFunction>(name).ok();
return get_named_property::<JsFunction>(&o, name).ok();
}
}
_ => {}
Expand Down Expand Up @@ -184,13 +177,7 @@ impl JsVisitor {
let mut types = VisitTypes::empty();
macro_rules! get {
($name: literal, $( $t: ident )|+) => {{
let res: Option<JsFunction> = visitor.get_named_property::<JsUnknown>($name).ok().and_then(|v| {
if let Ok(ValueType::Function) = v.get_type() {
v.try_into().ok()
} else {
None
}
});
let res: Option<JsFunction> = get_named_property(&visitor, $name).ok();

if res.is_some() {
types |= $( VisitTypes::$t )|+;
Expand All @@ -204,13 +191,7 @@ impl JsVisitor {

macro_rules! map {
($name: literal, $( $t: ident )|+) => {{
let obj: Option<JsObject> = visitor.get_named_property::<JsUnknown>($name).ok().and_then(|v| {
if let Ok(ValueType::Object) = v.get_type() {
v.try_into().ok()
} else {
None
}
});
let obj: Option<JsObject> = get_named_property(&visitor, $name).ok();

if obj.is_some() {
types |= $( VisitTypes::$t )|+;
Expand Down
7 changes: 7 additions & 0 deletions 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<T: TryFrom<JsUnknown, Error = Error>>(obj: &JsObject, property: &str) -> Result<T> {
let unknown = obj.get_named_property::<JsUnknown>(property)?;
T::try_from(unknown)
}
2 changes: 1 addition & 1 deletion node/Cargo.toml
Expand Up @@ -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]
Expand Down

0 comments on commit a493a8b

Please sign in to comment.