Skip to content

Commit a493a8b

Browse files
committed
update napi and fix more get_named_property calls
1 parent bdf4a77 commit a493a8b

File tree

5 files changed

+31
-40
lines changed

5 files changed

+31
-40
lines changed

Cargo.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

napi/src/lib.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ mod at_rule_parser;
2424
mod threadsafe_function;
2525
#[cfg(feature = "visitor")]
2626
mod transformer;
27+
mod utils;
2728

2829
#[cfg(feature = "visitor")]
2930
use transformer::JsVisitor;
@@ -34,6 +35,8 @@ struct JsVisitor;
3435
#[cfg(feature = "visitor")]
3536
use lightningcss::visitor::Visit;
3637

38+
use utils::get_named_property;
39+
3740
#[derive(Serialize)]
3841
#[serde(rename_all = "camelCase")]
3942
struct TransformResult<'i> {
@@ -73,7 +76,7 @@ impl<'i> TransformResult<'i> {
7376

7477
#[cfg(feature = "visitor")]
7578
fn get_visitor(env: Env, opts: &JsObject) -> Option<JsVisitor> {
76-
if let Ok(visitor) = opts.get_named_property::<JsObject>("visitor") {
79+
if let Ok(visitor) = get_named_property::<JsObject>(opts, "visitor") {
7780
Some(JsVisitor::new(env, visitor))
7881
} else {
7982
None
@@ -243,7 +246,7 @@ mod bundle {
243246
// Otherwise, send the result immediately.
244247
if result.is_promise()? {
245248
let result: JsObject = result.try_into()?;
246-
let then: JsFunction = result.get_named_property("then")?;
249+
let then: JsFunction = get_named_property(&result, "then")?;
247250
let tx2 = tx.clone();
248251
let cb = env.create_function_from_closure("callback", move |ctx| {
249252
let res = ctx.get::<JsString>(0)?.into_utf8()?;
@@ -306,9 +309,9 @@ mod bundle {
306309

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

309-
if let Ok(resolver) = opts.get_named_property::<JsObject>("resolver") {
312+
if let Ok(resolver) = get_named_property::<JsObject>(&opts, "resolver") {
310313
let read = if resolver.has_named_property("read")? {
311-
let read = resolver.get_named_property::<JsFunction>("read")?;
314+
let read = get_named_property::<JsFunction>(&resolver, "read")?;
312315
Some(ThreadsafeFunction::create(
313316
ctx.env.raw(),
314317
unsafe { read.raw() },
@@ -320,7 +323,7 @@ mod bundle {
320323
};
321324

322325
let resolve = if resolver.has_named_property("resolve")? {
323-
let resolve = resolver.get_named_property::<JsFunction>("resolve")?;
326+
let resolve = get_named_property::<JsFunction>(&resolver, "resolve")?;
324327
Some(ThreadsafeFunction::create(
325328
ctx.env.raw(),
326329
unsafe { resolve.raw() },
@@ -427,10 +430,10 @@ mod bundle {
427430
let opts = ctx.get::<JsObject>(0)?;
428431
let mut visitor = get_visitor(*ctx.env, &opts);
429432

430-
let resolver = opts.get_named_property::<JsObject>("resolver")?;
431-
let read = resolver.get_named_property::<JsFunction>("read")?;
433+
let resolver = get_named_property::<JsObject>(opts, "resolver")?;
434+
let read = get_named_property::<JsFunction>(resolver, "read")?;
432435
let resolve = if resolver.has_named_property("resolve")? {
433-
let resolve = resolver.get_named_property::<JsFunction>("resolve")?;
436+
let resolve = get_named_property::<JsFunction>(resolver, "resolve")?;
434437
Some(ctx.env.create_reference(resolve)?)
435438
} else {
436439
None

napi/src/transformer.rs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use napi::{Env, JsFunction, JsObject, JsUnknown, Ref, ValueType};
2424
use serde::{Deserialize, Serialize};
2525
use smallvec::SmallVec;
2626

27-
use crate::at_rule_parser::AtRule;
27+
use crate::{at_rule_parser::AtRule, utils::get_named_property};
2828

2929
pub struct JsVisitor {
3030
env: Env,
@@ -99,14 +99,7 @@ impl Visitors<JsObject> {
9999
fn named(&self, stage: VisitStage, name: &str) -> Option<JsFunction> {
100100
self
101101
.for_stage(stage)
102-
.and_then(|m| m.get_named_property::<JsUnknown>(name).ok())
103-
.and_then(|v| {
104-
if let Ok(ValueType::Function) = v.get_type() {
105-
v.try_into().ok()
106-
} else {
107-
None
108-
}
109-
})
102+
.and_then(|m| get_named_property::<JsFunction>(m, name).ok())
110103
}
111104

112105
fn custom(&self, stage: VisitStage, obj: &str, name: &str) -> Option<JsFunction> {
@@ -119,7 +112,7 @@ impl Visitors<JsObject> {
119112
Ok(ValueType::Object) => {
120113
let o: napi::Result<JsObject> = v.try_into();
121114
if let Ok(o) = o {
122-
return o.get_named_property::<JsFunction>(name).ok();
115+
return get_named_property::<JsFunction>(&o, name).ok();
123116
}
124117
}
125118
_ => {}
@@ -184,13 +177,7 @@ impl JsVisitor {
184177
let mut types = VisitTypes::empty();
185178
macro_rules! get {
186179
($name: literal, $( $t: ident )|+) => {{
187-
let res: Option<JsFunction> = visitor.get_named_property::<JsUnknown>($name).ok().and_then(|v| {
188-
if let Ok(ValueType::Function) = v.get_type() {
189-
v.try_into().ok()
190-
} else {
191-
None
192-
}
193-
});
180+
let res: Option<JsFunction> = get_named_property(&visitor, $name).ok();
194181

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

205192
macro_rules! map {
206193
($name: literal, $( $t: ident )|+) => {{
207-
let obj: Option<JsObject> = visitor.get_named_property::<JsUnknown>($name).ok().and_then(|v| {
208-
if let Ok(ValueType::Object) = v.get_type() {
209-
v.try_into().ok()
210-
} else {
211-
None
212-
}
213-
});
194+
let obj: Option<JsObject> = get_named_property(&visitor, $name).ok();
214195

215196
if obj.is_some() {
216197
types |= $( VisitTypes::$t )|+;

napi/src/utils.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
use napi::{Error, JsObject, JsUnknown, Result};
2+
3+
// Workaround for https://github.com/napi-rs/napi-rs/issues/1641
4+
pub fn get_named_property<T: TryFrom<JsUnknown, Error = Error>>(obj: &JsObject, property: &str) -> Result<T> {
5+
let unknown = obj.get_named_property::<JsUnknown>(property)?;
6+
T::try_from(unknown)
7+
}

node/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ crate-type = ["cdylib"]
1010

1111
[dependencies]
1212
lightningcss-napi = { version = "0.1.0", path = "../napi", features = ["bundler", "visitor"] }
13-
napi = {version = "=2.10.3", default-features = false, features = ["compat-mode"]}
13+
napi = {version = "2.15.4", default-features = false, features = ["compat-mode"]}
1414
napi-derive = "2"
1515

1616
[target.'cfg(target_os = "macos")'.dependencies]

0 commit comments

Comments
 (0)